snezzy/layla/layla.c

169 lines
5.3 KiB
C

#include "layla.h"
uint8_t (*ll_read)(ll_cpu* c, uint32_t addr) = NULL;
void (*ll_write)(ll_cpu* c, uint32_t addr, uint8_t b) = NULL;
int ll_init_status = 0;
void ll_reg_read(uint8_t(*rdp)(ll_cpu* c, uint32_t addr)) {
ll_read = rdp;
ll_init_status |= 2;
if(ll_init_status == 6) ll_init_status = 1;
}
void ll_reg_write(void(*wrp)(ll_cpu* c, uint32_t addr, uint8_t b)) {
ll_write = wrp;
ll_init_status |= 4;
if(ll_init_status == 6) ll_init_status = 1;
}
uint16_t ll_read16(ll_cpu* c, uint32_t addr) {
// TODO
return 0;
}
void ll_write16(ll_cpu* c, uint32_t addr, uint16_t w) {
// TODO
}
uint16_t llnop(ll_cpu* c) {}
uint16_t ll18(ll_cpu* c) {
c->P.f.C = 0;
}
uint16_t ll1b(ll_cpu* c) {
if(c->e) {
if(c->SP.D.H != 1) exit(printf("LINE %s ERR\n", __LINE__));
c->SP.D.L = c->A.D.L;
}
else c->SP.F = c->A.F;
}
uint16_t ll38(ll_cpu* c) {
c->P.f.C = 1;
}
uint16_t ll3b(ll_cpu* c) {
c->A.F = c->SP.F;
ll_setnz16(SP);
}
uint16_t ll58(ll_cpu* c) {
c->P.f.I = 0;
}
uint16_t ll5b(ll_cpu* c) {
c->D.F = c->A.F;
ll_setnz16(D);
}
uint16_t ll78(ll_cpu* c) {
c->P.f.I = 1;
}
uint16_t ll7b(ll_cpu* c) {
c->A.F = c->D.F;
ll_setnz16(A);
}
uint16_t ll98(ll_cpu* c) {
ll_trans(Y, A);
}
uint16_t ll9a(ll_cpu* c) {
// ll_trans sans status
if(c->P.f.XB) c->SP.D.L = c->X.D.L;
// TODO needed?
if(!c->e && c->P.f.XB) c->SP.D.H = 0;
else c->SP.F = c->X.F;
}
uint16_t ll9b(ll_cpu* c) {
ll_trans(X, Y);
}
uint16_t lla8(ll_cpu* c) {
ll_trans(A, Y);
}
// `llaa, you got me on my knees`
uint16_t llaa(ll_cpu* c) {
ll_trans(A, X);
}
uint16_t llb8(ll_cpu* c) {
c->P.f.V = 0;
}
uint16_t llba(ll_cpu* c) {
ll_trans(SP, X);
}
uint16_t lld8(ll_cpu* c) {
c->P.f.D = 0;
}
uint16_t lleb(ll_cpu* c) {
ll_swap(c->A.D.H, c->A.D.L);
ll_setnz8(A);
}
uint16_t llf8(ll_cpu* c) {
c->P.f.D = 1;
printf("DECIMAL UNIMPLEMENTED\n");
}
uint16_t llfb(ll_cpu* c) {
c->e = c->P.f.C;
if(c->e) {
c->P.f.M = 1;
c->P.f.XB = 1;
c->X.D.H = 0;
c->Y.D.H = 0;
c->SP.D.H = 1;
}
}
#define LL_E 0
// if negative, called opcode will return the number of cycles. else, use this
int ll_cycles[256] = {
//(YX) 0 1 2 3 4 5 6 7 8 9 a b c d e f
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 0
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 1
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 2
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 3
LL_E, LL_E, 2, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 4
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 5
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 6
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 7
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 8
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, 2, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // 9
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, LL_E, 2, LL_E, LL_E, LL_E, LL_E, LL_E, // a
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, LL_E, LL_E, LL_E, LL_E, LL_E, // b
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // c
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, // d
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, 3, LL_E, LL_E, LL_E, LL_E, // e
LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, LL_E, 2, LL_E, LL_E, 2, LL_E, LL_E, LL_E, LL_E // f
};
ll_opcode ll_opcodes[256] = {
//(YX) 0 1 2 3 4 5 6 7 8 9 a b c d e f
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 0
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &ll18, NULL, NULL, &ll1b, NULL, NULL, NULL, NULL, // 1
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 2
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &ll38, NULL, NULL, &ll3b, NULL, NULL, NULL, NULL, // 3
NULL, NULL, &llnop, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 4
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &ll58, NULL, NULL, &ll5b, NULL, NULL, NULL, NULL, // 5
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 6
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &ll78, NULL, NULL, &ll7b, NULL, NULL, NULL, NULL, // 7
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // 8
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &ll98, &ll9b, NULL, NULL, NULL, NULL, NULL, NULL, // 9
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &lla8, NULL, &llaa, NULL, NULL, NULL, NULL, NULL, // a
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &llb8, NULL, &llba, NULL, NULL, NULL, NULL, NULL, // b
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // c
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &lld8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // d
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &llnop, &lleb, NULL, NULL, NULL, NULL, // e
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &llf8, NULL, NULL, &llfb, NULL, NULL, NULL, NULL // f
};