cpucore: fix direct page wrapping in emulation mode; clean up some duplicate code

This commit is contained in:
Alex W. Jackson 2016-05-24 05:16:00 -04:00
parent f01326eb8f
commit 98308203b2
7 changed files with 174 additions and 274 deletions

View file

@ -149,69 +149,61 @@ public:
void op_jmp_iaddrx();
void op_jmp_iladdr();
void op_jsr_addr();
void op_jsr_long_e();
void op_jsr_long_n();
void op_jsr_iaddrx_e();
void op_jsr_iaddrx_n();
void op_rti_e();
void op_rti_n();
void op_jsr_long();
void op_jsr_iaddrx();
void op_rti();
void op_rts();
void op_rtl_e();
void op_rtl_n();
void op_rtl();
void op_nop();
void op_wdm();
void op_xba();
template<int> void op_move_b();
template<int> void op_move_w();
template<int, int> void op_interrupt_e();
template<int, int> void op_interrupt_n();
template<int, int> void op_interrupt();
void op_stp();
void op_wai();
void op_xce();
template<int, int> void op_flag();
template<int> void op_pflag_e();
template<int> void op_pflag_n();
void op_clc();
void op_sec();
void op_cli();
void op_sei();
void op_clv();
void op_cld();
void op_sed();
void op_rep();
void op_sep();
template<int, int> void op_transfer_b();
template<int, int> void op_transfer_w();
void op_tcs_e();
void op_tcs_n();
void op_tcs();
void op_tsx_b();
void op_tsx_w();
void op_txs_e();
void op_txs_n();
void op_txs();
template<int> void op_push_b();
template<int> void op_push_w();
void op_phd_e();
void op_phd_n();
void op_phd();
void op_phb();
void op_phk();
void op_php();
template<int> void op_pull_b();
template<int> void op_pull_w();
void op_pld_e();
void op_pld_n();
void op_pld();
void op_plb();
void op_plp_e();
void op_plp_n();
void op_pea_e();
void op_pea_n();
void op_pei_e();
void op_pei_n();
void op_per_e();
void op_per_n();
void op_plp();
void op_pea();
void op_pei();
void op_per();
void (CPUcore::**opcode_table)();
void (CPUcore::*op_table[256 * 5])();
void (CPUcore::*op_table[256 * 4])();
void initialize_opcode_table();
void update_table();
enum {
table_EM = 0, // 8-bit accumulator, 8-bit index (emulation mode)
table_MX = 256, // 8-bit accumulator, 8-bit index
table_Mx = 512, // 8-bit accumulator, 16-bit index
table_mX = 768, //16-bit accumulator, 8-bit index
table_mx = 1024, //16-bit accumulator, 16-bit index
table_MX = 0, // 8-bit accumulator, 8-bit index
table_Mx = 256, // 8-bit accumulator, 16-bit index
table_mX = 512, //16-bit accumulator, 8-bit index
table_mx = 768, //16-bit accumulator, 16-bit index
};
void core_serialize(serializer&);

View file

@ -29,14 +29,18 @@ alwaysinline uint8_t op_readpbr(uint32_t addr) {
alwaysinline uint8_t op_readdp(uint32_t addr) {
if(regs.e && regs.d.l == 0x00) {
return op_read((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff));
return op_read(regs.d + (addr & 0xff));
} else {
return op_read((regs.d + (addr & 0xffff)) & 0xffff);
return op_read((regs.d + addr) & 0xffff);
}
}
alwaysinline uint8_t op_readdpn(uint32_t addr) {
return op_read((regs.d + addr) & 0xffff);
}
alwaysinline uint8_t op_readsp(uint32_t addr) {
return op_read((regs.s + (addr & 0xffff)) & 0xffff);
return op_read((regs.s + addr) & 0xffff);
}
alwaysinline void op_writestack(uint8_t data) {
@ -66,12 +70,12 @@ alwaysinline void op_writepbr(uint32_t addr, uint8_t data) {
alwaysinline void op_writedp(uint32_t addr, uint8_t data) {
if(regs.e && regs.d.l == 0x00) {
op_write((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff), data);
op_write(regs.d + (addr & 0xff), data);
} else {
op_write((regs.d + (addr & 0xffff)) & 0xffff, data);
op_write((regs.d + addr) & 0xffff, data);
}
}
alwaysinline void op_writesp(uint32_t addr, uint8_t data) {
op_write((regs.s + (addr & 0xffff)) & 0xffff, data);
op_write((regs.s + addr) & 0xffff, data);
}

View file

@ -11,9 +11,7 @@ L op_readpc();
void CPUcore::op_xba() {
op_io();
L op_io();
regs.a.l ^= regs.a.h;
regs.a.h ^= regs.a.l;
regs.a.l ^= regs.a.h;
std::swap(regs.a.l, regs.a.h);
regs.p.n = (regs.a.l & 0x80);
regs.p.z = (regs.a.l == 0);
}
@ -44,30 +42,18 @@ L op_io();
if(regs.a.w--) regs.pc.w -= 3;
}
template<int vectorE, int vectorN> void CPUcore::op_interrupt_e() {
template<int vectorE, int vectorN> void CPUcore::op_interrupt() {
int vector = regs.e ? vectorE : vectorN;
op_readpc();
if(!regs.e) op_writestack(regs.pc.b);
op_writestack(regs.pc.h);
op_writestack(regs.pc.l);
op_writestack(regs.p);
rd.l = op_readlong(vectorE + 0);
rd.l = op_readlong(vector + 0);
regs.pc.b = 0;
regs.p.i = 1;
regs.p.d = 0;
L rd.h = op_readlong(vectorE + 1);
regs.pc.w = rd.w;
}
template<int vectorE, int vectorN> void CPUcore::op_interrupt_n() {
op_readpc();
op_writestack(regs.pc.b);
op_writestack(regs.pc.h);
op_writestack(regs.pc.l);
op_writestack(regs.p);
rd.l = op_readlong(vectorN + 0);
regs.pc.b = 0x00;
regs.p.i = 1;
regs.p.d = 0;
L rd.h = op_readlong(vectorN + 1);
L rd.h = op_readlong(vector + 1);
regs.pc.w = rd.w;
}
@ -93,35 +79,59 @@ L op_io_irq();
if(regs.e) {
regs.p |= 0x30;
regs.s.h = 0x01;
}
if(regs.p.x) {
regs.x.h = 0x00;
regs.y.h = 0x00;
}
update_table();
}
template<int mask, int value> void CPUcore::op_flag() {
void CPUcore::op_clc() {
L op_io_irq();
regs.p = (regs.p & ~mask) | value;
regs.p.c = 0;
}
template<int mode> void CPUcore::op_pflag_e() {
rd.l = op_readpc();
void CPUcore::op_sec() {
L op_io_irq();
regs.p.c = 1;
}
void CPUcore::op_cli() {
L op_io_irq();
regs.p.i = 0;
}
void CPUcore::op_sei() {
L op_io_irq();
regs.p.i = 1;
}
void CPUcore::op_clv() {
L op_io_irq();
regs.p.v = 0;
}
void CPUcore::op_cld() {
L op_io_irq();
regs.p.d = 0;
}
void CPUcore::op_sed() {
L op_io_irq();
regs.p.d = 1;
}
void CPUcore::op_rep() {
rd.l = ~op_readpc();
if(regs.e) rd.l |= 0x30;
L op_io();
regs.p = (mode ? regs.p | rd.l : regs.p & ~rd.l);
regs.p |= 0x30;
if(regs.p.x) {
regs.x.h = 0x00;
regs.y.h = 0x00;
}
regs.p &= rd.l;
update_table();
}
template<int mode> void CPUcore::op_pflag_n() {
void CPUcore::op_sep() {
rd.l = op_readpc();
L op_io();
regs.p = (mode ? regs.p | rd.l : regs.p & ~rd.l);
regs.p |= rd.l;
if(regs.p.x) {
regs.x.h = 0x00;
regs.y.h = 0x00;
@ -143,14 +153,10 @@ L op_io_irq();
regs.p.z = (regs.r[to].w == 0);
}
void CPUcore::op_tcs_e() {
L op_io_irq();
regs.s.l = regs.a.l;
}
void CPUcore::op_tcs_n() {
void CPUcore::op_tcs() {
L op_io_irq();
regs.s.w = regs.a.w;
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_tsx_b() {
@ -167,14 +173,10 @@ L op_io_irq();
regs.p.z = (regs.x.w == 0);
}
void CPUcore::op_txs_e() {
L op_io_irq();
regs.s.l = regs.x.l;
}
void CPUcore::op_txs_n() {
void CPUcore::op_txs() {
L op_io_irq();
regs.s.w = regs.x.w;
if(regs.e) regs.s.h = 0x01;
}
template<int n> void CPUcore::op_push_b() {
@ -188,17 +190,11 @@ template<int n> void CPUcore::op_push_w() {
L op_writestack(regs.r[n].l);
}
void CPUcore::op_phd_e() {
op_io();
op_writestackn(regs.d.h);
L op_writestackn(regs.d.l);
regs.s.h = 0x01;
}
void CPUcore::op_phd_n() {
void CPUcore::op_phd() {
op_io();
op_writestackn(regs.d.h);
L op_writestackn(regs.d.l);
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_phb() {
@ -233,23 +229,14 @@ L regs.r[n].h = op_readstack();
regs.p.z = (regs.r[n].w == 0);
}
void CPUcore::op_pld_e() {
op_io();
op_io();
regs.d.l = op_readstackn();
L regs.d.h = op_readstackn();
regs.p.n = (regs.d.w & 0x8000);
regs.p.z = (regs.d.w == 0);
regs.s.h = 0x01;
}
void CPUcore::op_pld_n() {
void CPUcore::op_pld() {
op_io();
op_io();
regs.d.l = op_readstackn();
L regs.d.h = op_readstackn();
regs.p.n = (regs.d.w & 0x8000);
regs.p.z = (regs.d.w == 0);
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_plb() {
@ -260,10 +247,10 @@ L regs.db = op_readstack();
regs.p.z = (regs.db == 0);
}
void CPUcore::op_plp_e() {
void CPUcore::op_plp() {
op_io();
op_io();
L regs.p = op_readstack() | 0x30;
L regs.p = op_readstack() | (regs.e ? 0x30 : 0);
if(regs.p.x) {
regs.x.h = 0x00;
regs.y.h = 0x00;
@ -271,68 +258,32 @@ L regs.p = op_readstack() | 0x30;
update_table();
}
void CPUcore::op_plp_n() {
op_io();
op_io();
L regs.p = op_readstack();
if(regs.p.x) {
regs.x.h = 0x00;
regs.y.h = 0x00;
}
update_table();
}
void CPUcore::op_pea_e() {
void CPUcore::op_pea() {
aa.l = op_readpc();
aa.h = op_readpc();
op_writestackn(aa.h);
L op_writestackn(aa.l);
regs.s.h = 0x01;
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_pea_n() {
aa.l = op_readpc();
aa.h = op_readpc();
op_writestackn(aa.h);
L op_writestackn(aa.l);
}
void CPUcore::op_pei_e() {
void CPUcore::op_pei() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
op_writestackn(aa.h);
L op_writestackn(aa.l);
regs.s.h = 0x01;
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_pei_n() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
op_writestackn(aa.h);
L op_writestackn(aa.l);
}
void CPUcore::op_per_e() {
aa.l = op_readpc();
aa.h = op_readpc();
op_io();
rd.w = regs.pc.d + (int16)aa.w;
op_writestackn(rd.h);
L op_writestackn(rd.l);
regs.s.h = 0x01;
}
void CPUcore::op_per_n() {
void CPUcore::op_per() {
aa.l = op_readpc();
aa.h = op_readpc();
op_io();
rd.w = regs.pc.d + (int16)aa.w;
op_writestackn(rd.h);
L op_writestackn(rd.l);
if(regs.e) regs.s.h = 0x01;
}
#endif

View file

@ -76,7 +76,7 @@ L op_writestack(regs.pc.l);
regs.pc.w = aa.w;
}
void CPUcore::op_jsr_long_e() {
void CPUcore::op_jsr_long() {
aa.l = op_readpc();
aa.h = op_readpc();
op_writestackn(regs.pc.b);
@ -86,22 +86,10 @@ void CPUcore::op_jsr_long_e() {
op_writestackn(regs.pc.h);
L op_writestackn(regs.pc.l);
regs.pc.d = aa.d & 0xffffff;
regs.s.h = 0x01;
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_jsr_long_n() {
aa.l = op_readpc();
aa.h = op_readpc();
op_writestackn(regs.pc.b);
op_io();
aa.b = op_readpc();
regs.pc.w--;
op_writestackn(regs.pc.h);
L op_writestackn(regs.pc.l);
regs.pc.d = aa.d & 0xffffff;
}
void CPUcore::op_jsr_iaddrx_e() {
void CPUcore::op_jsr_iaddrx() {
aa.l = op_readpc();
op_writestackn(regs.pc.h);
op_writestackn(regs.pc.l);
@ -110,41 +98,24 @@ void CPUcore::op_jsr_iaddrx_e() {
rd.l = op_readpbr(aa.w + regs.x.w + 0);
L rd.h = op_readpbr(aa.w + regs.x.w + 1);
regs.pc.w = rd.w;
regs.s.h = 0x01;
if(regs.e) regs.s.h = 0x01;
}
void CPUcore::op_jsr_iaddrx_n() {
aa.l = op_readpc();
op_writestackn(regs.pc.h);
op_writestackn(regs.pc.l);
aa.h = op_readpc();
op_io();
rd.l = op_readpbr(aa.w + regs.x.w + 0);
L rd.h = op_readpbr(aa.w + regs.x.w + 1);
regs.pc.w = rd.w;
}
void CPUcore::op_rti_e() {
void CPUcore::op_rti() {
op_io();
op_io();
regs.p = op_readstack() | 0x30;
rd.l = op_readstack();
L rd.h = op_readstack();
regs.pc.w = rd.w;
}
void CPUcore::op_rti_n() {
op_io();
op_io();
regs.p = op_readstack();
regs.p = op_readstack() | (regs.e ? 0x30 : 0);
if(regs.p.x) {
regs.x.h = 0x00;
regs.y.h = 0x00;
}
rd.l = op_readstack();
rd.h = op_readstack();
L rd.b = op_readstack();
regs.pc.d = rd.d & 0xffffff;
regs.pc.l = op_readstack();
if(regs.e) {
L regs.pc.h = op_readstack();
} else {
regs.pc.h = op_readstack();
L regs.pc.b = op_readstack();
}
update_table();
}
@ -157,18 +128,7 @@ L op_io();
regs.pc.w = ++rd.w;
}
void CPUcore::op_rtl_e() {
op_io();
op_io();
rd.l = op_readstackn();
rd.h = op_readstackn();
L rd.b = op_readstackn();
regs.pc.b = rd.b;
regs.pc.w = ++rd.w;
regs.s.h = 0x01;
}
void CPUcore::op_rtl_n() {
void CPUcore::op_rtl() {
op_io();
op_io();
rd.l = op_readstackn();
@ -176,6 +136,7 @@ void CPUcore::op_rtl_n() {
L rd.b = op_readstackn();
regs.pc.b = rd.b;
regs.pc.w = ++rd.w;
if(regs.e) regs.s.h = 0x01;
}
#endif

View file

@ -201,9 +201,9 @@ L rd.h = op_readdbr(aa.w + regs.y.w + 1);
template<void (CPUcore::*op)()> void CPUcore::op_read_ildp_b() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
L rd.l = op_readlong(aa.d);
call(op);
}
@ -211,9 +211,9 @@ L rd.l = op_readlong(aa.d);
template<void (CPUcore::*op)()> void CPUcore::op_read_ildp_w() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
rd.l = op_readlong(aa.d + 0);
L rd.h = op_readlong(aa.d + 1);
call(op);
@ -222,9 +222,9 @@ L rd.h = op_readlong(aa.d + 1);
template<void (CPUcore::*op)()> void CPUcore::op_read_ildpy_b() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
L rd.l = op_readlong(aa.d + regs.y.w);
call(op);
}
@ -232,9 +232,9 @@ L rd.l = op_readlong(aa.d + regs.y.w);
template<void (CPUcore::*op)()> void CPUcore::op_read_ildpy_w() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
rd.l = op_readlong(aa.d + regs.y.w + 0);
L rd.h = op_readlong(aa.d + regs.y.w + 1);
call(op);

View file

@ -91,18 +91,18 @@ L op_writedbr(aa.w + 1, regs.a.h);
void CPUcore::op_sta_ildp_b() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
L op_writelong(aa.d, regs.a.l);
}
void CPUcore::op_sta_ildp_w() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
op_writelong(aa.d + 0, regs.a.l);
L op_writelong(aa.d + 1, regs.a.h);
}
@ -148,18 +148,18 @@ L op_writedbr(aa.w + regs.y.w + 1, regs.a.h);
void CPUcore::op_sta_ildpy_b() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
L op_writelong(aa.d + regs.y.w, regs.a.l);
}
void CPUcore::op_sta_ildpy_w() {
dp = op_readpc();
op_io_cond2();
aa.l = op_readdp(dp + 0);
aa.h = op_readdp(dp + 1);
aa.b = op_readdp(dp + 2);
aa.l = op_readdpn(dp + 0);
aa.h = op_readdpn(dp + 1);
aa.b = op_readdpn(dp + 2);
op_writelong(aa.d + regs.y.w + 0, regs.a.l);
L op_writelong(aa.d + regs.y.w + 1, regs.a.h);
}

View file

@ -1,25 +1,22 @@
#ifdef CPUCORE_CPP
void CPUcore::initialize_opcode_table() {
#define opA( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name;
#define opAII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name<x, y>;
#define opE( id, name ) op_table[table_EM + id] = &CPUcore::op_##name##_e; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n;
#define opEI( id, name, x ) op_table[table_EM + id] = &CPUcore::op_##name##_e<x>; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n<x>;
#define opEII(id, name, x, y ) op_table[table_EM + id] = &CPUcore::op_##name##_e<x, y>; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n<x, y>;
#define opM( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w;
#define opMI( id, name, x ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x>;
#define opMII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<x, y>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x, y>;
#define opMF( id, name, fn ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>;
#define opMFI(id, name, fn, x) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>;
#define opX( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w;
#define opXI( id, name, x ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x>;
#define opXII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<x, y>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x, y>;
#define opXF( id, name, fn ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>;
#define opXFI(id, name, fn, x) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>;
#define opA( id, name ) op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name;
#define opAII(id, name, x, y ) op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name<x, y>;
#define opM( id, name ) op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w;
#define opMI( id, name, x ) op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x>;
#define opMII(id, name, x, y ) op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<x, y>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x, y>;
#define opMF( id, name, fn ) op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>;
#define opMFI(id, name, fn, x) op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>;
#define opX( id, name ) op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w;
#define opXI( id, name, x ) op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x>;
#define opXII(id, name, x, y ) op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<x, y>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x, y>;
#define opXF( id, name, fn ) op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>;
#define opXFI(id, name, fn, x) op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>;
opEII(0x00, interrupt, 0xfffe, 0xffe6)
opAII(0x00, interrupt, 0xfffe, 0xffe6)
opMF (0x01, read_idpx, ora)
opEII(0x02, interrupt, 0xfff4, 0xffe4)
opAII(0x02, interrupt, 0xfff4, 0xffe4)
opMF (0x03, read_sr, ora)
opMF (0x04, adjust_dp, tsb)
opMF (0x05, read_dp, ora)
@ -28,7 +25,7 @@ void CPUcore::initialize_opcode_table() {
opA (0x08, php)
opMF (0x09, read_const, ora)
opM (0x0a, asl_imm)
opE (0x0b, phd)
opA (0x0b, phd)
opMF (0x0c, adjust_addr, tsb)
opMF (0x0d, read_addr, ora)
opMF (0x0e, adjust_addr, asl)
@ -41,26 +38,26 @@ void CPUcore::initialize_opcode_table() {
opMFI(0x15, read_dpr, ora, X)
opMF (0x16, adjust_dpx, asl)
opMF (0x17, read_ildpy, ora)
opAII(0x18, flag, 0x01, 0x00)
opA (0x18, clc)
opMF (0x19, read_addry, ora)
opMII(0x1a, adjust_imm, A, +1)
opE (0x1b, tcs)
opA (0x1b, tcs)
opMF (0x1c, adjust_addr, trb)
opMF (0x1d, read_addrx, ora)
opMF (0x1e, adjust_addrx, asl)
opMF (0x1f, read_longx, ora)
opA (0x20, jsr_addr)
opMF (0x21, read_idpx, and)
opE (0x22, jsr_long)
opA (0x22, jsr_long)
opMF (0x23, read_sr, and)
opMF (0x24, read_dp, bit)
opMF (0x25, read_dp, and)
opMF (0x26, adjust_dp, rol)
opMF (0x27, read_ildp, and)
opE (0x28, plp)
opA (0x28, plp)
opMF (0x29, read_const, and)
opM (0x2a, rol_imm)
opE (0x2b, pld)
opA (0x2b, pld)
opMF (0x2c, read_addr, bit)
opMF (0x2d, read_addr, and)
opMF (0x2e, adjust_addr, rol)
@ -73,7 +70,7 @@ void CPUcore::initialize_opcode_table() {
opMFI(0x35, read_dpr, and, X)
opMF (0x36, adjust_dpx, rol)
opMF (0x37, read_ildpy, and)
opAII(0x38, flag, 0x01, 0x01)
opA (0x38, sec)
opMF (0x39, read_addry, and)
opMII(0x3a, adjust_imm, A, -1)
opAII(0x3b, transfer_w, S, A)
@ -81,7 +78,7 @@ void CPUcore::initialize_opcode_table() {
opMF (0x3d, read_addrx, and)
opMF (0x3e, adjust_addrx, rol)
opMF (0x3f, read_longx, and)
opE (0x40, rti)
opA (0x40, rti)
opMF (0x41, read_idpx, eor)
opA (0x42, wdm)
opMF (0x43, read_sr, eor)
@ -105,7 +102,7 @@ void CPUcore::initialize_opcode_table() {
opMFI(0x55, read_dpr, eor, X)
opMF (0x56, adjust_dpx, lsr)
opMF (0x57, read_ildpy, eor)
opAII(0x58, flag, 0x04, 0x00)
opA (0x58, cli)
opMF (0x59, read_addry, eor)
opXI (0x5a, push, Y)
opAII(0x5b, transfer_w, A, D)
@ -115,7 +112,7 @@ void CPUcore::initialize_opcode_table() {
opMF (0x5f, read_longx, eor)
opA (0x60, rts)
opMF (0x61, read_idpx, adc)
opE (0x62, per)
opA (0x62, per)
opMF (0x63, read_sr, adc)
opMI (0x64, write_dp, Z)
opMF (0x65, read_dp, adc)
@ -124,7 +121,7 @@ void CPUcore::initialize_opcode_table() {
opMI (0x68, pull, A)
opMF (0x69, read_const, adc)
opM (0x6a, ror_imm)
opE (0x6b, rtl)
opA (0x6b, rtl)
opA (0x6c, jmp_iaddr)
opMF (0x6d, read_addr, adc)
opMF (0x6e, adjust_addr, ror)
@ -137,7 +134,7 @@ void CPUcore::initialize_opcode_table() {
opMFI(0x75, read_dpr, adc, X)
opMF (0x76, adjust_dpx, ror)
opMF (0x77, read_ildpy, adc)
opAII(0x78, flag, 0x04, 0x04)
opA (0x78, sei)
opMF (0x79, read_addry, adc)
opXI (0x7a, pull, Y)
opAII(0x7b, transfer_w, D, A)
@ -171,7 +168,7 @@ void CPUcore::initialize_opcode_table() {
opM (0x97, sta_ildpy)
opMII(0x98, transfer, Y, A)
opMII(0x99, write_addrr, A, Y)
opE (0x9a, txs)
opA (0x9a, txs)
opXII(0x9b, transfer, X, Y)
opMI (0x9c, write_addr, Z)
opMII(0x9d, write_addrr, A, X)
@ -201,7 +198,7 @@ void CPUcore::initialize_opcode_table() {
opMFI(0xb5, read_dpr, lda, X)
opXFI(0xb6, read_dpr, ldx, Y)
opMF (0xb7, read_ildpy, lda)
opAII(0xb8, flag, 0x40, 0x00)
opA (0xb8, clv)
opMF (0xb9, read_addry, lda)
opX (0xba, tsx)
opXII(0xbb, transfer, Y, X)
@ -211,7 +208,7 @@ void CPUcore::initialize_opcode_table() {
opMF (0xbf, read_longx, lda)
opXF (0xc0, read_const, cpy)
opMF (0xc1, read_idpx, cmp)
opEI (0xc2, pflag, 0)
opA (0xc2, rep)
opMF (0xc3, read_sr, cmp)
opXF (0xc4, read_dp, cpy)
opMF (0xc5, read_dp, cmp)
@ -229,11 +226,11 @@ void CPUcore::initialize_opcode_table() {
opMF (0xd1, read_idpy, cmp)
opMF (0xd2, read_idp, cmp)
opMF (0xd3, read_isry, cmp)
opE (0xd4, pei)
opA (0xd4, pei)
opMFI(0xd5, read_dpr, cmp, X)
opMF (0xd6, adjust_dpx, dec)
opMF (0xd7, read_ildpy, cmp)
opAII(0xd8, flag, 0x08, 0x00)
opA (0xd8, cld)
opMF (0xd9, read_addry, cmp)
opXI (0xda, push, X)
opA (0xdb, stp)
@ -243,7 +240,7 @@ void CPUcore::initialize_opcode_table() {
opMF (0xdf, read_longx, cmp)
opXF (0xe0, read_const, cpx)
opMF (0xe1, read_idpx, sbc)
opEI (0xe2, pflag, 1)
opA (0xe2, sep)
opMF (0xe3, read_sr, sbc)
opXF (0xe4, read_dp, cpx)
opMF (0xe5, read_dp, sbc)
@ -261,24 +258,21 @@ void CPUcore::initialize_opcode_table() {
opMF (0xf1, read_idpy, sbc)
opMF (0xf2, read_idp, sbc)
opMF (0xf3, read_isry, sbc)
opE (0xf4, pea)
opA (0xf4, pea)
opMFI(0xf5, read_dpr, sbc, X)
opMF (0xf6, adjust_dpx, inc)
opMF (0xf7, read_ildpy, sbc)
opAII(0xf8, flag, 0x08, 0x08)
opA (0xf8, sed)
opMF (0xf9, read_addry, sbc)
opXI (0xfa, pull, X)
opA (0xfb, xce)
opE (0xfc, jsr_iaddrx)
opA (0xfc, jsr_iaddrx)
opMF (0xfd, read_addrx, sbc)
opMF (0xfe, adjust_addrx, inc)
opMF (0xff, read_longx, sbc)
#undef opA
#undef opAII
#undef opE
#undef opEI
#undef opEII
#undef opM
#undef opMI
#undef opMII
@ -292,9 +286,7 @@ void CPUcore::initialize_opcode_table() {
}
void CPUcore::update_table() {
if(regs.e) {
opcode_table = &op_table[table_EM];
} else if(regs.p.m) {
if(regs.p.m) {
if(regs.p.x) {
opcode_table = &op_table[table_MX];
} else {