169 lines
5.3 KiB
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
|
|
};
|