const int uoptable[256][16] = {12// case 0x00: return op_nop();3// void SMPcore::op_nop() {4{51, // op_io();62, // //!!NEXT7},8// case 0x01: return op_jst();9// void SMPcore::op_jst() {10{113, // dp = 0xffde - ((opcode >> 4) << 1);124, // rd.l = op_read(dp++);135, // rd.h = op_read(dp++);141, // op_io();151, // op_io();161, // op_io();176, // op_writesp(regs.pc.h);187, // op_writesp(regs.pc.l);198, // regs.pc = rd;202, // //!!NEXT21},22// case 0x02: return op_set_bit();23// void SMPcore::op_set_bit() {24{259, // dp = op_readpc();2610, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));2711, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));282, // //!!NEXT29},30// case 0x03: return op_branch_bit();31// void SMPcore::op_branch_bit() {32{339, // dp = op_readpc();3412, // sp = op_readdp(dp);3513, // rd = op_readpc();361, // op_io();3714, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;381, // op_io();391, // op_io();4015, // regs.pc += (int8)rd;412, // //!!NEXT42},43// case 0x04: return op_read_dp<&SMPcore::op_or>(regs.a);44// void SMPcore::op_read_dp(uint8 &r) {45{469, // dp = op_readpc();4716, // rd = op_readdp(dp);4817, // regs.a = op_or(regs.a, rd);492, // //!!NEXT50},51// case 0x05: return op_read_addr<&SMPcore::op_or>(regs.a);52// void SMPcore::op_read_addr(uint8 &r) {53{5418, // dp.l = op_readpc();5519, // dp.h = op_readpc();5620, // rd = op_read(dp);5717, // regs.a = op_or(regs.a, rd);582, // //!!NEXT59},60// case 0x06: return op_read_ix<&SMPcore::op_or>();61// void SMPcore::op_read_ix() {62{631, // op_io();6421, // rd = op_readdp(regs.x);6517, // regs.a = op_or(regs.a, rd);662, // //!!NEXT67},68// case 0x07: return op_read_idpx<&SMPcore::op_or>();69// void SMPcore::op_read_idpx() {70{7122, // dp = op_readpc() + regs.x;721, // op_io();7323, // sp.l = op_readdp(dp++);7424, // sp.h = op_readdp(dp++);7525, // rd = op_read(sp);7617, // regs.a = op_or(regs.a, rd);772, // //!!NEXT78},79// case 0x08: return op_read_const<&SMPcore::op_or>(regs.a);80// void SMPcore::op_read_const(uint8 &r) {81{8213, // rd = op_readpc();8317, // regs.a = op_or(regs.a, rd);842, // //!!NEXT85},86// case 0x09: return op_write_dp_dp<&SMPcore::op_or>();87// void SMPcore::op_write_dp_dp() {88{8926, // sp = op_readpc();9027, // rd = op_readdp(sp);919, // dp = op_readpc();9228, // wr = op_readdp(dp);9329, // wr = op_or(wr, rd);9430, // op_writedp(dp, wr);952, // //!!NEXT96},97// case 0x0a: return op_set_addr_bit();98// void SMPcore::op_set_addr_bit() {99{10018, // dp.l = op_readpc();10119, // dp.h = op_readpc();10231, // bit = dp >> 13;10332, // dp &= 0x1fff;10420, // rd = op_read(dp);1051, // op_io();10633, // regs.p.c |= (rd & (1 << bit)) ^ 0;1072, // //!!NEXT108},109// case 0x0b: return op_adjust_dp<&SMPcore::op_asl>();110// void SMPcore::op_adjust_dp() {111{1129, // dp = op_readpc();11316, // rd = op_readdp(dp);11434, // rd = op_asl(rd);11535, // op_writedp(dp, rd);1162, // //!!NEXT117},118// case 0x0c: return op_adjust_addr<&SMPcore::op_asl>();119// void SMPcore::op_adjust_addr() {120{12118, // dp.l = op_readpc();12219, // dp.h = op_readpc();12320, // rd = op_read(dp);12434, // rd = op_asl(rd);12536, // op_write(dp, rd);1262, // //!!NEXT127},128// case 0x0d: return op_push(regs.p);129// void SMPcore::op_push(uint8 r) {130{1311, // op_io();1321, // op_io();13337, // op_writesp(regs.p);1342, // //!!NEXT135},136// case 0x0e: return op_test_addr(1);137// void SMPcore::op_test_addr(bool set) {138{13918, // dp.l = op_readpc();14019, // dp.h = op_readpc();14120, // rd = op_read(dp);14238, // regs.p.n = (regs.a - rd) & 0x80;14339, // regs.p.z = (regs.a - rd) == 0;14440, // op_read(dp);14541, // op_write(dp, rd | regs.a);1462, // //!!NEXT147},148// case 0x0f: return op_brk();149// void SMPcore::op_brk() {150{15142, // rd.l = op_read(0xffde);15243, // rd.h = op_read(0xffdf);1531, // op_io();1541, // op_io();1556, // op_writesp(regs.pc.h);1567, // op_writesp(regs.pc.l);15737, // op_writesp(regs.p);1588, // regs.pc = rd;15944, // regs.p.b = 1;16045, // regs.p.i = 0;1612, // //!!NEXT162},163// case 0x10: return op_branch(regs.p.n == 0);164// void SMPcore::op_branch(bool condition) {165{16613, // rd = op_readpc();16746, // if(regs.p.n != 0) return;1681, // op_io();1691, // op_io();17015, // regs.pc += (int8)rd;1712, // //!!NEXT172},173// case 0x11: return op_jst();174// void SMPcore::op_jst() {175{1763, // dp = 0xffde - ((opcode >> 4) << 1);1774, // rd.l = op_read(dp++);1785, // rd.h = op_read(dp++);1791, // op_io();1801, // op_io();1811, // op_io();1826, // op_writesp(regs.pc.h);1837, // op_writesp(regs.pc.l);1848, // regs.pc = rd;1852, // //!!NEXT186},187// case 0x12: return op_set_bit();188// void SMPcore::op_set_bit() {189{1909, // dp = op_readpc();19110, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));19211, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));1932, // //!!NEXT194},195// case 0x13: return op_branch_bit();196// void SMPcore::op_branch_bit() {197{1989, // dp = op_readpc();19912, // sp = op_readdp(dp);20013, // rd = op_readpc();2011, // op_io();20214, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;2031, // op_io();2041, // op_io();20515, // regs.pc += (int8)rd;2062, // //!!NEXT207},208// case 0x14: return op_read_dpi<&SMPcore::op_or>(regs.a, regs.x);209// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {210{2119, // dp = op_readpc();2121, // op_io();21347, // rd = op_readdp(dp + regs.x);21417, // regs.a = op_or(regs.a, rd);2152, // //!!NEXT216},217// case 0x15: return op_read_addri<&SMPcore::op_or>(regs.x);218// void SMPcore::op_read_addri(uint8 &r) {219{22018, // dp.l = op_readpc();22119, // dp.h = op_readpc();2221, // op_io();22348, // rd = op_read(dp + regs.x);22417, // regs.a = op_or(regs.a, rd);2252, // //!!NEXT226},227// case 0x16: return op_read_addri<&SMPcore::op_or>(regs.y);228// void SMPcore::op_read_addri(uint8 &r) {229{23018, // dp.l = op_readpc();23119, // dp.h = op_readpc();2321, // op_io();23349, // rd = op_read(dp + regs.y);23417, // regs.a = op_or(regs.a, rd);2352, // //!!NEXT236},237// case 0x17: return op_read_idpy<&SMPcore::op_or>();238// void SMPcore::op_read_idpy() {239{2409, // dp = op_readpc();2411, // op_io();24223, // sp.l = op_readdp(dp++);24324, // sp.h = op_readdp(dp++);24450, // rd = op_read(sp + regs.y);24517, // regs.a = op_or(regs.a, rd);2462, // //!!NEXT247},248// case 0x18: return op_write_dp_const<&SMPcore::op_or>();249// void SMPcore::op_write_dp_const() {250{25113, // rd = op_readpc();2529, // dp = op_readpc();25328, // wr = op_readdp(dp);25429, // wr = op_or(wr, rd);25530, // op_writedp(dp, wr);2562, // //!!NEXT257},258// case 0x19: return op_write_ix_iy<&SMPcore::op_or>();259// void SMPcore::op_write_ix_iy() {260{2611, // op_io();26251, // rd = op_readdp(regs.y);26352, // wr = op_readdp(regs.x);26429, // wr = op_or(wr, rd);26553, // op_writedp(regs.x, wr);2662, // //!!NEXT267},268// case 0x1a: return op_adjust_dpw(-1);269// void SMPcore::op_adjust_dpw(signed n) {270{2719, // dp = op_readpc();27254, // rd.w = op_readdp(dp) - 1;27355, // op_writedp(dp++, rd.l);27456, // rd.h += op_readdp(dp);27557, // op_writedp(dp++, rd.h);27658, // regs.p.n = rd & 0x8000;27759, // regs.p.z = rd == 0;2782, // //!!NEXT279},280// case 0x1b: return op_adjust_dpx<&SMPcore::op_asl>();281// void SMPcore::op_adjust_dpx() {282{2839, // dp = op_readpc();2841, // op_io();28547, // rd = op_readdp(dp + regs.x);28634, // rd = op_asl(rd);28760, // op_writedp(dp + regs.x, rd);2882, // //!!NEXT289},290// case 0x1c: return op_adjust<&SMPcore::op_asl>(regs.a);291// void SMPcore::op_adjust(uint8 &r) {292{2931, // op_io();29461, // regs.a = op_asl(regs.a);2952, // //!!NEXT296},297// case 0x1d: return op_adjust<&SMPcore::op_dec>(regs.x);298// void SMPcore::op_adjust(uint8 &r) {299{3001, // op_io();30162, // regs.x = op_dec(regs.x);3022, // //!!NEXT303},304// case 0x1e: return op_read_addr<&SMPcore::op_cmp>(regs.x);305// void SMPcore::op_read_addr(uint8 &r) {306{30718, // dp.l = op_readpc();30819, // dp.h = op_readpc();30920, // rd = op_read(dp);31063, // regs.x = op_cmp(regs.x, rd);3112, // //!!NEXT312},313// case 0x1f: return op_jmp_iaddrx();314// void SMPcore::op_jmp_iaddrx() {315{31618, // dp.l = op_readpc();31719, // dp.h = op_readpc();3181, // op_io();31964, // dp += regs.x;3204, // rd.l = op_read(dp++);3215, // rd.h = op_read(dp++);3228, // regs.pc = rd;3232, // //!!NEXT324},325// case 0x20: return op_set_flag(regs.p.p, 0);326// void SMPcore::op_set_flag(bool &flag, bool data) {327{3281, // op_io();32965, // regs.p.p = 0;3302, // //!!NEXT331},332// case 0x21: return op_jst();333// void SMPcore::op_jst() {334{3353, // dp = 0xffde - ((opcode >> 4) << 1);3364, // rd.l = op_read(dp++);3375, // rd.h = op_read(dp++);3381, // op_io();3391, // op_io();3401, // op_io();3416, // op_writesp(regs.pc.h);3427, // op_writesp(regs.pc.l);3438, // regs.pc = rd;3442, // //!!NEXT345},346// case 0x22: return op_set_bit();347// void SMPcore::op_set_bit() {348{3499, // dp = op_readpc();35010, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));35111, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));3522, // //!!NEXT353},354// case 0x23: return op_branch_bit();355// void SMPcore::op_branch_bit() {356{3579, // dp = op_readpc();35812, // sp = op_readdp(dp);35913, // rd = op_readpc();3601, // op_io();36114, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;3621, // op_io();3631, // op_io();36415, // regs.pc += (int8)rd;3652, // //!!NEXT366},367// case 0x24: return op_read_dp<&SMPcore::op_and>(regs.a);368// void SMPcore::op_read_dp(uint8 &r) {369{3709, // dp = op_readpc();37116, // rd = op_readdp(dp);37266, // regs.a = op_and(regs.a, rd);3732, // //!!NEXT374},375// case 0x25: return op_read_addr<&SMPcore::op_and>(regs.a);376// void SMPcore::op_read_addr(uint8 &r) {377{37818, // dp.l = op_readpc();37919, // dp.h = op_readpc();38020, // rd = op_read(dp);38166, // regs.a = op_and(regs.a, rd);3822, // //!!NEXT383},384// case 0x26: return op_read_ix<&SMPcore::op_and>();385// void SMPcore::op_read_ix() {386{3871, // op_io();38821, // rd = op_readdp(regs.x);38966, // regs.a = op_and(regs.a, rd);3902, // //!!NEXT391},392// case 0x27: return op_read_idpx<&SMPcore::op_and>();393// void SMPcore::op_read_idpx() {394{39522, // dp = op_readpc() + regs.x;3961, // op_io();39723, // sp.l = op_readdp(dp++);39824, // sp.h = op_readdp(dp++);39925, // rd = op_read(sp);40066, // regs.a = op_and(regs.a, rd);4012, // //!!NEXT402},403// case 0x28: return op_read_const<&SMPcore::op_and>(regs.a);404// void SMPcore::op_read_const(uint8 &r) {405{40613, // rd = op_readpc();40766, // regs.a = op_and(regs.a, rd);4082, // //!!NEXT409},410// case 0x29: return op_write_dp_dp<&SMPcore::op_and>();411// void SMPcore::op_write_dp_dp() {412{41326, // sp = op_readpc();41427, // rd = op_readdp(sp);4159, // dp = op_readpc();41628, // wr = op_readdp(dp);41767, // wr = op_and(wr, rd);41830, // op_writedp(dp, wr);4192, // //!!NEXT420},421// case 0x2a: return op_set_addr_bit();422// void SMPcore::op_set_addr_bit() {423{42418, // dp.l = op_readpc();42519, // dp.h = op_readpc();42631, // bit = dp >> 13;42732, // dp &= 0x1fff;42820, // rd = op_read(dp);4291, // op_io();43068, // regs.p.c |= (rd & (1 << bit)) ^ 1;4312, // //!!NEXT432},433// case 0x2b: return op_adjust_dp<&SMPcore::op_rol>();434// void SMPcore::op_adjust_dp() {435{4369, // dp = op_readpc();43716, // rd = op_readdp(dp);43869, // rd = op_rol(rd);43935, // op_writedp(dp, rd);4402, // //!!NEXT441},442// case 0x2c: return op_adjust_addr<&SMPcore::op_rol>();443// void SMPcore::op_adjust_addr() {444{44518, // dp.l = op_readpc();44619, // dp.h = op_readpc();44720, // rd = op_read(dp);44869, // rd = op_rol(rd);44936, // op_write(dp, rd);4502, // //!!NEXT451},452// case 0x2d: return op_push(regs.a);453// void SMPcore::op_push(uint8 r) {454{4551, // op_io();4561, // op_io();45770, // op_writesp(regs.a);4582, // //!!NEXT459},460// case 0x2e: return op_bne_dp();461// void SMPcore::op_bne_dp() {462{4639, // dp = op_readpc();46412, // sp = op_readdp(dp);46513, // rd = op_readpc();4661, // op_io();46771, // if(regs.a == sp) return;4681, // op_io();4691, // op_io();47015, // regs.pc += (int8)rd;4712, // //!!NEXT472},473// case 0x2f: return op_branch(true);474// void SMPcore::op_branch(bool condition) {475{47613, // rd = op_readpc();4771, // op_io();4781, // op_io();47915, // regs.pc += (int8)rd;4802, // //!!NEXT481},482// case 0x30: return op_branch(regs.p.n == 1);483// void SMPcore::op_branch(bool condition) {484{48513, // rd = op_readpc();48672, // if(regs.p.n != 1) return;4871, // op_io();4881, // op_io();48915, // regs.pc += (int8)rd;4902, // //!!NEXT491},492// case 0x31: return op_jst();493// void SMPcore::op_jst() {494{4953, // dp = 0xffde - ((opcode >> 4) << 1);4964, // rd.l = op_read(dp++);4975, // rd.h = op_read(dp++);4981, // op_io();4991, // op_io();5001, // op_io();5016, // op_writesp(regs.pc.h);5027, // op_writesp(regs.pc.l);5038, // regs.pc = rd;5042, // //!!NEXT505},506// case 0x32: return op_set_bit();507// void SMPcore::op_set_bit() {508{5099, // dp = op_readpc();51010, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));51111, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));5122, // //!!NEXT513},514// case 0x33: return op_branch_bit();515// void SMPcore::op_branch_bit() {516{5179, // dp = op_readpc();51812, // sp = op_readdp(dp);51913, // rd = op_readpc();5201, // op_io();52114, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;5221, // op_io();5231, // op_io();52415, // regs.pc += (int8)rd;5252, // //!!NEXT526},527// case 0x34: return op_read_dpi<&SMPcore::op_and>(regs.a, regs.x);528// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {529{5309, // dp = op_readpc();5311, // op_io();53247, // rd = op_readdp(dp + regs.x);53366, // regs.a = op_and(regs.a, rd);5342, // //!!NEXT535},536// case 0x35: return op_read_addri<&SMPcore::op_and>(regs.x);537// void SMPcore::op_read_addri(uint8 &r) {538{53918, // dp.l = op_readpc();54019, // dp.h = op_readpc();5411, // op_io();54248, // rd = op_read(dp + regs.x);54366, // regs.a = op_and(regs.a, rd);5442, // //!!NEXT545},546// case 0x36: return op_read_addri<&SMPcore::op_and>(regs.y);547// void SMPcore::op_read_addri(uint8 &r) {548{54918, // dp.l = op_readpc();55019, // dp.h = op_readpc();5511, // op_io();55249, // rd = op_read(dp + regs.y);55366, // regs.a = op_and(regs.a, rd);5542, // //!!NEXT555},556// case 0x37: return op_read_idpy<&SMPcore::op_and>();557// void SMPcore::op_read_idpy() {558{5599, // dp = op_readpc();5601, // op_io();56123, // sp.l = op_readdp(dp++);56224, // sp.h = op_readdp(dp++);56350, // rd = op_read(sp + regs.y);56466, // regs.a = op_and(regs.a, rd);5652, // //!!NEXT566},567// case 0x38: return op_write_dp_const<&SMPcore::op_and>();568// void SMPcore::op_write_dp_const() {569{57013, // rd = op_readpc();5719, // dp = op_readpc();57228, // wr = op_readdp(dp);57367, // wr = op_and(wr, rd);57430, // op_writedp(dp, wr);5752, // //!!NEXT576},577// case 0x39: return op_write_ix_iy<&SMPcore::op_and>();578// void SMPcore::op_write_ix_iy() {579{5801, // op_io();58151, // rd = op_readdp(regs.y);58252, // wr = op_readdp(regs.x);58367, // wr = op_and(wr, rd);58453, // op_writedp(regs.x, wr);5852, // //!!NEXT586},587// case 0x3a: return op_adjust_dpw(+1);588// void SMPcore::op_adjust_dpw(signed n) {589{5909, // dp = op_readpc();59173, // rd.w = op_readdp(dp) + 1;59255, // op_writedp(dp++, rd.l);59356, // rd.h += op_readdp(dp);59457, // op_writedp(dp++, rd.h);59558, // regs.p.n = rd & 0x8000;59659, // regs.p.z = rd == 0;5972, // //!!NEXT598},599// case 0x3b: return op_adjust_dpx<&SMPcore::op_rol>();600// void SMPcore::op_adjust_dpx() {601{6029, // dp = op_readpc();6031, // op_io();60447, // rd = op_readdp(dp + regs.x);60569, // rd = op_rol(rd);60660, // op_writedp(dp + regs.x, rd);6072, // //!!NEXT608},609// case 0x3c: return op_adjust<&SMPcore::op_rol>(regs.a);610// void SMPcore::op_adjust(uint8 &r) {611{6121, // op_io();61374, // regs.a = op_rol(regs.a);6142, // //!!NEXT615},616// case 0x3d: return op_adjust<&SMPcore::op_inc>(regs.x);617// void SMPcore::op_adjust(uint8 &r) {618{6191, // op_io();62075, // regs.x = op_inc(regs.x);6212, // //!!NEXT622},623// case 0x3e: return op_read_dp<&SMPcore::op_cmp>(regs.x);624// void SMPcore::op_read_dp(uint8 &r) {625{6269, // dp = op_readpc();62716, // rd = op_readdp(dp);62863, // regs.x = op_cmp(regs.x, rd);6292, // //!!NEXT630},631// case 0x3f: return op_jsr_addr();632// void SMPcore::op_jsr_addr() {633{63476, // rd.l = op_readpc();63577, // rd.h = op_readpc();6361, // op_io();6371, // op_io();6381, // op_io();6396, // op_writesp(regs.pc.h);6407, // op_writesp(regs.pc.l);6418, // regs.pc = rd;6422, // //!!NEXT643},644// case 0x40: return op_set_flag(regs.p.p, 1);645// void SMPcore::op_set_flag(bool &flag, bool data) {646{6471, // op_io();64878, // regs.p.p = 1;6492, // //!!NEXT650},651// case 0x41: return op_jst();652// void SMPcore::op_jst() {653{6543, // dp = 0xffde - ((opcode >> 4) << 1);6554, // rd.l = op_read(dp++);6565, // rd.h = op_read(dp++);6571, // op_io();6581, // op_io();6591, // op_io();6606, // op_writesp(regs.pc.h);6617, // op_writesp(regs.pc.l);6628, // regs.pc = rd;6632, // //!!NEXT664},665// case 0x42: return op_set_bit();666// void SMPcore::op_set_bit() {667{6689, // dp = op_readpc();66910, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));67011, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));6712, // //!!NEXT672},673// case 0x43: return op_branch_bit();674// void SMPcore::op_branch_bit() {675{6769, // dp = op_readpc();67712, // sp = op_readdp(dp);67813, // rd = op_readpc();6791, // op_io();68014, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;6811, // op_io();6821, // op_io();68315, // regs.pc += (int8)rd;6842, // //!!NEXT685},686// case 0x44: return op_read_dp<&SMPcore::op_eor>(regs.a);687// void SMPcore::op_read_dp(uint8 &r) {688{6899, // dp = op_readpc();69016, // rd = op_readdp(dp);69179, // regs.a = op_eor(regs.a, rd);6922, // //!!NEXT693},694// case 0x45: return op_read_addr<&SMPcore::op_eor>(regs.a);695// void SMPcore::op_read_addr(uint8 &r) {696{69718, // dp.l = op_readpc();69819, // dp.h = op_readpc();69920, // rd = op_read(dp);70079, // regs.a = op_eor(regs.a, rd);7012, // //!!NEXT702},703// case 0x46: return op_read_ix<&SMPcore::op_eor>();704// void SMPcore::op_read_ix() {705{7061, // op_io();70721, // rd = op_readdp(regs.x);70879, // regs.a = op_eor(regs.a, rd);7092, // //!!NEXT710},711// case 0x47: return op_read_idpx<&SMPcore::op_eor>();712// void SMPcore::op_read_idpx() {713{71422, // dp = op_readpc() + regs.x;7151, // op_io();71623, // sp.l = op_readdp(dp++);71724, // sp.h = op_readdp(dp++);71825, // rd = op_read(sp);71979, // regs.a = op_eor(regs.a, rd);7202, // //!!NEXT721},722// case 0x48: return op_read_const<&SMPcore::op_eor>(regs.a);723// void SMPcore::op_read_const(uint8 &r) {724{72513, // rd = op_readpc();72679, // regs.a = op_eor(regs.a, rd);7272, // //!!NEXT728},729// case 0x49: return op_write_dp_dp<&SMPcore::op_eor>();730// void SMPcore::op_write_dp_dp() {731{73226, // sp = op_readpc();73327, // rd = op_readdp(sp);7349, // dp = op_readpc();73528, // wr = op_readdp(dp);73680, // wr = op_eor(wr, rd);73730, // op_writedp(dp, wr);7382, // //!!NEXT739},740// case 0x4a: return op_set_addr_bit();741// void SMPcore::op_set_addr_bit() {742{74318, // dp.l = op_readpc();74419, // dp.h = op_readpc();74531, // bit = dp >> 13;74632, // dp &= 0x1fff;74720, // rd = op_read(dp);74881, // regs.p.c &= (rd & (1 << bit)) ^ 0;7492, // //!!NEXT750},751// case 0x4b: return op_adjust_dp<&SMPcore::op_lsr>();752// void SMPcore::op_adjust_dp() {753{7549, // dp = op_readpc();75516, // rd = op_readdp(dp);75682, // rd = op_lsr(rd);75735, // op_writedp(dp, rd);7582, // //!!NEXT759},760// case 0x4c: return op_adjust_addr<&SMPcore::op_lsr>();761// void SMPcore::op_adjust_addr() {762{76318, // dp.l = op_readpc();76419, // dp.h = op_readpc();76520, // rd = op_read(dp);76682, // rd = op_lsr(rd);76736, // op_write(dp, rd);7682, // //!!NEXT769},770// case 0x4d: return op_push(regs.x);771// void SMPcore::op_push(uint8 r) {772{7731, // op_io();7741, // op_io();77583, // op_writesp(regs.x);7762, // //!!NEXT777},778// case 0x4e: return op_test_addr(0);779// void SMPcore::op_test_addr(bool set) {780{78118, // dp.l = op_readpc();78219, // dp.h = op_readpc();78320, // rd = op_read(dp);78438, // regs.p.n = (regs.a - rd) & 0x80;78539, // regs.p.z = (regs.a - rd) == 0;78640, // op_read(dp);78784, // op_write(dp, rd & ~regs.a);7882, // //!!NEXT789},790// case 0x4f: return op_jsp_dp();791// void SMPcore::op_jsp_dp() {792{79313, // rd = op_readpc();7941, // op_io();7951, // op_io();7966, // op_writesp(regs.pc.h);7977, // op_writesp(regs.pc.l);79885, // regs.pc = 0xff00 | rd;7992, // //!!NEXT800},801// case 0x50: return op_branch(regs.p.v == 0);802// void SMPcore::op_branch(bool condition) {803{80413, // rd = op_readpc();80586, // if(regs.p.v != 0) return;8061, // op_io();8071, // op_io();80815, // regs.pc += (int8)rd;8092, // //!!NEXT810},811// case 0x51: return op_jst();812// void SMPcore::op_jst() {813{8143, // dp = 0xffde - ((opcode >> 4) << 1);8154, // rd.l = op_read(dp++);8165, // rd.h = op_read(dp++);8171, // op_io();8181, // op_io();8191, // op_io();8206, // op_writesp(regs.pc.h);8217, // op_writesp(regs.pc.l);8228, // regs.pc = rd;8232, // //!!NEXT824},825// case 0x52: return op_set_bit();826// void SMPcore::op_set_bit() {827{8289, // dp = op_readpc();82910, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));83011, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));8312, // //!!NEXT832},833// case 0x53: return op_branch_bit();834// void SMPcore::op_branch_bit() {835{8369, // dp = op_readpc();83712, // sp = op_readdp(dp);83813, // rd = op_readpc();8391, // op_io();84014, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;8411, // op_io();8421, // op_io();84315, // regs.pc += (int8)rd;8442, // //!!NEXT845},846// case 0x54: return op_read_dpi<&SMPcore::op_eor>(regs.a, regs.x);847// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {848{8499, // dp = op_readpc();8501, // op_io();85147, // rd = op_readdp(dp + regs.x);85279, // regs.a = op_eor(regs.a, rd);8532, // //!!NEXT854},855// case 0x55: return op_read_addri<&SMPcore::op_eor>(regs.x);856// void SMPcore::op_read_addri(uint8 &r) {857{85818, // dp.l = op_readpc();85919, // dp.h = op_readpc();8601, // op_io();86148, // rd = op_read(dp + regs.x);86279, // regs.a = op_eor(regs.a, rd);8632, // //!!NEXT864},865// case 0x56: return op_read_addri<&SMPcore::op_eor>(regs.y);866// void SMPcore::op_read_addri(uint8 &r) {867{86818, // dp.l = op_readpc();86919, // dp.h = op_readpc();8701, // op_io();87149, // rd = op_read(dp + regs.y);87279, // regs.a = op_eor(regs.a, rd);8732, // //!!NEXT874},875// case 0x57: return op_read_idpy<&SMPcore::op_eor>();876// void SMPcore::op_read_idpy() {877{8789, // dp = op_readpc();8791, // op_io();88023, // sp.l = op_readdp(dp++);88124, // sp.h = op_readdp(dp++);88250, // rd = op_read(sp + regs.y);88379, // regs.a = op_eor(regs.a, rd);8842, // //!!NEXT885},886// case 0x58: return op_write_dp_const<&SMPcore::op_eor>();887// void SMPcore::op_write_dp_const() {888{88913, // rd = op_readpc();8909, // dp = op_readpc();89128, // wr = op_readdp(dp);89280, // wr = op_eor(wr, rd);89330, // op_writedp(dp, wr);8942, // //!!NEXT895},896// case 0x59: return op_write_ix_iy<&SMPcore::op_eor>();897// void SMPcore::op_write_ix_iy() {898{8991, // op_io();90051, // rd = op_readdp(regs.y);90152, // wr = op_readdp(regs.x);90280, // wr = op_eor(wr, rd);90353, // op_writedp(regs.x, wr);9042, // //!!NEXT905},906// case 0x5a: return op_read_dpw<&SMPcore::op_cpw>();907// void SMPcore::op_read_dpw() {908{9099, // dp = op_readpc();91087, // rd.l = op_readdp(dp++);91188, // rd.h = op_readdp(dp++);91289, // regs.ya = op_cpw(regs.ya, rd);9132, // //!!NEXT914},915// case 0x5b: return op_adjust_dpx<&SMPcore::op_lsr>();916// void SMPcore::op_adjust_dpx() {917{9189, // dp = op_readpc();9191, // op_io();92047, // rd = op_readdp(dp + regs.x);92182, // rd = op_lsr(rd);92260, // op_writedp(dp + regs.x, rd);9232, // //!!NEXT924},925// case 0x5c: return op_adjust<&SMPcore::op_lsr>(regs.a);926// void SMPcore::op_adjust(uint8 &r) {927{9281, // op_io();92990, // regs.a = op_lsr(regs.a);9302, // //!!NEXT931},932// case 0x5d: return op_transfer(regs.a, regs.x);933// void SMPcore::op_transfer(uint8 &from, uint8 &to) {934{9351, // op_io();93691, // regs.x = regs.a;93792, // regs.p.n = (regs.x & 0x80);93893, // regs.p.z = (regs.x == 0);9392, // //!!NEXT940},941// case 0x5e: return op_read_addr<&SMPcore::op_cmp>(regs.y);942// void SMPcore::op_read_addr(uint8 &r) {943{94418, // dp.l = op_readpc();94519, // dp.h = op_readpc();94620, // rd = op_read(dp);94794, // regs.y = op_cmp(regs.y, rd);9482, // //!!NEXT949},950// case 0x5f: return op_jmp_addr();951// void SMPcore::op_jmp_addr() {952{95376, // rd.l = op_readpc();95477, // rd.h = op_readpc();9558, // regs.pc = rd;9562, // //!!NEXT957},958// case 0x60: return op_set_flag(regs.p.c, 0);959// void SMPcore::op_set_flag(bool &flag, bool data) {960{9611, // op_io();96295, // regs.p.c = 0;9632, // //!!NEXT964},965// case 0x61: return op_jst();966// void SMPcore::op_jst() {967{9683, // dp = 0xffde - ((opcode >> 4) << 1);9694, // rd.l = op_read(dp++);9705, // rd.h = op_read(dp++);9711, // op_io();9721, // op_io();9731, // op_io();9746, // op_writesp(regs.pc.h);9757, // op_writesp(regs.pc.l);9768, // regs.pc = rd;9772, // //!!NEXT978},979// case 0x62: return op_set_bit();980// void SMPcore::op_set_bit() {981{9829, // dp = op_readpc();98310, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));98411, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));9852, // //!!NEXT986},987// case 0x63: return op_branch_bit();988// void SMPcore::op_branch_bit() {989{9909, // dp = op_readpc();99112, // sp = op_readdp(dp);99213, // rd = op_readpc();9931, // op_io();99414, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;9951, // op_io();9961, // op_io();99715, // regs.pc += (int8)rd;9982, // //!!NEXT999},1000// case 0x64: return op_read_dp<&SMPcore::op_cmp>(regs.a);1001// void SMPcore::op_read_dp(uint8 &r) {1002{10039, // dp = op_readpc();100416, // rd = op_readdp(dp);100596, // regs.a = op_cmp(regs.a, rd);10062, // //!!NEXT1007},1008// case 0x65: return op_read_addr<&SMPcore::op_cmp>(regs.a);1009// void SMPcore::op_read_addr(uint8 &r) {1010{101118, // dp.l = op_readpc();101219, // dp.h = op_readpc();101320, // rd = op_read(dp);101496, // regs.a = op_cmp(regs.a, rd);10152, // //!!NEXT1016},1017// case 0x66: return op_read_ix<&SMPcore::op_cmp>();1018// void SMPcore::op_read_ix() {1019{10201, // op_io();102121, // rd = op_readdp(regs.x);102296, // regs.a = op_cmp(regs.a, rd);10232, // //!!NEXT1024},1025// case 0x67: return op_read_idpx<&SMPcore::op_cmp>();1026// void SMPcore::op_read_idpx() {1027{102822, // dp = op_readpc() + regs.x;10291, // op_io();103023, // sp.l = op_readdp(dp++);103124, // sp.h = op_readdp(dp++);103225, // rd = op_read(sp);103396, // regs.a = op_cmp(regs.a, rd);10342, // //!!NEXT1035},1036// case 0x68: return op_read_const<&SMPcore::op_cmp>(regs.a);1037// void SMPcore::op_read_const(uint8 &r) {1038{103913, // rd = op_readpc();104096, // regs.a = op_cmp(regs.a, rd);10412, // //!!NEXT1042},1043// case 0x69: return op_write_dp_dp<&SMPcore::op_cmp>();1044// void SMPcore::op_write_dp_dp() {1045{104626, // sp = op_readpc();104727, // rd = op_readdp(sp);10489, // dp = op_readpc();104928, // wr = op_readdp(dp);105097, // wr = op_cmp(wr, rd);10511, // op_io();10522, // //!!NEXT1053},1054// case 0x6a: return op_set_addr_bit();1055// void SMPcore::op_set_addr_bit() {1056{105718, // dp.l = op_readpc();105819, // dp.h = op_readpc();105931, // bit = dp >> 13;106032, // dp &= 0x1fff;106120, // rd = op_read(dp);106298, // regs.p.c &= (rd & (1 << bit)) ^ 1;10632, // //!!NEXT1064},1065// case 0x6b: return op_adjust_dp<&SMPcore::op_ror>();1066// void SMPcore::op_adjust_dp() {1067{10689, // dp = op_readpc();106916, // rd = op_readdp(dp);107099, // rd = op_ror(rd);107135, // op_writedp(dp, rd);10722, // //!!NEXT1073},1074// case 0x6c: return op_adjust_addr<&SMPcore::op_ror>();1075// void SMPcore::op_adjust_addr() {1076{107718, // dp.l = op_readpc();107819, // dp.h = op_readpc();107920, // rd = op_read(dp);108099, // rd = op_ror(rd);108136, // op_write(dp, rd);10822, // //!!NEXT1083},1084// case 0x6d: return op_push(regs.y);1085// void SMPcore::op_push(uint8 r) {1086{10871, // op_io();10881, // op_io();1089100, // op_writesp(regs.y);10902, // //!!NEXT1091},1092// case 0x6e: return op_bne_dpdec();1093// void SMPcore::op_bne_dpdec() {1094{10959, // dp = op_readpc();109628, // wr = op_readdp(dp);1097101, // op_writedp(dp, --wr);109813, // rd = op_readpc();1099102, // if(wr == 0) return;11001, // op_io();11011, // op_io();110215, // regs.pc += (int8)rd;11032, // //!!NEXT1104},1105// case 0x6f: return op_rts();1106// void SMPcore::op_rts() {1107{1108103, // rd.l = op_readsp();1109104, // rd.h = op_readsp();11101, // op_io();11111, // op_io();11128, // regs.pc = rd;11132, // //!!NEXT1114},1115// case 0x70: return op_branch(regs.p.v == 1);1116// void SMPcore::op_branch(bool condition) {1117{111813, // rd = op_readpc();1119105, // if(regs.p.v != 1) return;11201, // op_io();11211, // op_io();112215, // regs.pc += (int8)rd;11232, // //!!NEXT1124},1125// case 0x71: return op_jst();1126// void SMPcore::op_jst() {1127{11283, // dp = 0xffde - ((opcode >> 4) << 1);11294, // rd.l = op_read(dp++);11305, // rd.h = op_read(dp++);11311, // op_io();11321, // op_io();11331, // op_io();11346, // op_writesp(regs.pc.h);11357, // op_writesp(regs.pc.l);11368, // regs.pc = rd;11372, // //!!NEXT1138},1139// case 0x72: return op_set_bit();1140// void SMPcore::op_set_bit() {1141{11429, // dp = op_readpc();114310, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));114411, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));11452, // //!!NEXT1146},1147// case 0x73: return op_branch_bit();1148// void SMPcore::op_branch_bit() {1149{11509, // dp = op_readpc();115112, // sp = op_readdp(dp);115213, // rd = op_readpc();11531, // op_io();115414, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;11551, // op_io();11561, // op_io();115715, // regs.pc += (int8)rd;11582, // //!!NEXT1159},1160// case 0x74: return op_read_dpi<&SMPcore::op_cmp>(regs.a, regs.x);1161// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {1162{11639, // dp = op_readpc();11641, // op_io();116547, // rd = op_readdp(dp + regs.x);116696, // regs.a = op_cmp(regs.a, rd);11672, // //!!NEXT1168},1169// case 0x75: return op_read_addri<&SMPcore::op_cmp>(regs.x);1170// void SMPcore::op_read_addri(uint8 &r) {1171{117218, // dp.l = op_readpc();117319, // dp.h = op_readpc();11741, // op_io();117548, // rd = op_read(dp + regs.x);117696, // regs.a = op_cmp(regs.a, rd);11772, // //!!NEXT1178},1179// case 0x76: return op_read_addri<&SMPcore::op_cmp>(regs.y);1180// void SMPcore::op_read_addri(uint8 &r) {1181{118218, // dp.l = op_readpc();118319, // dp.h = op_readpc();11841, // op_io();118549, // rd = op_read(dp + regs.y);118696, // regs.a = op_cmp(regs.a, rd);11872, // //!!NEXT1188},1189// case 0x77: return op_read_idpy<&SMPcore::op_cmp>();1190// void SMPcore::op_read_idpy() {1191{11929, // dp = op_readpc();11931, // op_io();119423, // sp.l = op_readdp(dp++);119524, // sp.h = op_readdp(dp++);119650, // rd = op_read(sp + regs.y);119796, // regs.a = op_cmp(regs.a, rd);11982, // //!!NEXT1199},1200// case 0x78: return op_write_dp_const<&SMPcore::op_cmp>();1201// void SMPcore::op_write_dp_const() {1202{120313, // rd = op_readpc();12049, // dp = op_readpc();120528, // wr = op_readdp(dp);120697, // wr = op_cmp(wr, rd);12071, // op_io();12082, // //!!NEXT1209},1210// case 0x79: return op_write_ix_iy<&SMPcore::op_cmp>();1211// void SMPcore::op_write_ix_iy() {1212{12131, // op_io();121451, // rd = op_readdp(regs.y);121552, // wr = op_readdp(regs.x);121697, // wr = op_cmp(wr, rd);12171, // op_io();12182, // //!!NEXT1219},1220// case 0x7a: return op_read_dpw<&SMPcore::op_adw>();1221// void SMPcore::op_read_dpw() {1222{12239, // dp = op_readpc();122487, // rd.l = op_readdp(dp++);12251, // op_io();122688, // rd.h = op_readdp(dp++);1227106, // regs.ya = op_adw(regs.ya, rd);12282, // //!!NEXT1229},1230// case 0x7b: return op_adjust_dpx<&SMPcore::op_ror>();1231// void SMPcore::op_adjust_dpx() {1232{12339, // dp = op_readpc();12341, // op_io();123547, // rd = op_readdp(dp + regs.x);123699, // rd = op_ror(rd);123760, // op_writedp(dp + regs.x, rd);12382, // //!!NEXT1239},1240// case 0x7c: return op_adjust<&SMPcore::op_ror>(regs.a);1241// void SMPcore::op_adjust(uint8 &r) {1242{12431, // op_io();1244107, // regs.a = op_ror(regs.a);12452, // //!!NEXT1246},1247// case 0x7d: return op_transfer(regs.x, regs.a);1248// void SMPcore::op_transfer(uint8 &from, uint8 &to) {1249{12501, // op_io();1251108, // regs.a = regs.x;1252109, // regs.p.n = (regs.a & 0x80);1253110, // regs.p.z = (regs.a == 0);12542, // //!!NEXT1255},1256// case 0x7e: return op_read_dp<&SMPcore::op_cmp>(regs.y);1257// void SMPcore::op_read_dp(uint8 &r) {1258{12599, // dp = op_readpc();126016, // rd = op_readdp(dp);126194, // regs.y = op_cmp(regs.y, rd);12622, // //!!NEXT1263},1264// case 0x7f: return op_rti();1265// void SMPcore::op_rti() {1266{1267111, // regs.p = op_readsp();1268103, // rd.l = op_readsp();1269104, // rd.h = op_readsp();12701, // op_io();12711, // op_io();12728, // regs.pc = rd;12732, // //!!NEXT1274},1275// case 0x80: return op_set_flag(regs.p.c, 1);1276// void SMPcore::op_set_flag(bool &flag, bool data) {1277{12781, // op_io();1279112, // regs.p.c = 1;12802, // //!!NEXT1281},1282// case 0x81: return op_jst();1283// void SMPcore::op_jst() {1284{12853, // dp = 0xffde - ((opcode >> 4) << 1);12864, // rd.l = op_read(dp++);12875, // rd.h = op_read(dp++);12881, // op_io();12891, // op_io();12901, // op_io();12916, // op_writesp(regs.pc.h);12927, // op_writesp(regs.pc.l);12938, // regs.pc = rd;12942, // //!!NEXT1295},1296// case 0x82: return op_set_bit();1297// void SMPcore::op_set_bit() {1298{12999, // dp = op_readpc();130010, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));130111, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));13022, // //!!NEXT1303},1304// case 0x83: return op_branch_bit();1305// void SMPcore::op_branch_bit() {1306{13079, // dp = op_readpc();130812, // sp = op_readdp(dp);130913, // rd = op_readpc();13101, // op_io();131114, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;13121, // op_io();13131, // op_io();131415, // regs.pc += (int8)rd;13152, // //!!NEXT1316},1317// case 0x84: return op_read_dp<&SMPcore::op_adc>(regs.a);1318// void SMPcore::op_read_dp(uint8 &r) {1319{13209, // dp = op_readpc();132116, // rd = op_readdp(dp);1322113, // regs.a = op_adc(regs.a, rd);13232, // //!!NEXT1324},1325// case 0x85: return op_read_addr<&SMPcore::op_adc>(regs.a);1326// void SMPcore::op_read_addr(uint8 &r) {1327{132818, // dp.l = op_readpc();132919, // dp.h = op_readpc();133020, // rd = op_read(dp);1331113, // regs.a = op_adc(regs.a, rd);13322, // //!!NEXT1333},1334// case 0x86: return op_read_ix<&SMPcore::op_adc>();1335// void SMPcore::op_read_ix() {1336{13371, // op_io();133821, // rd = op_readdp(regs.x);1339113, // regs.a = op_adc(regs.a, rd);13402, // //!!NEXT1341},1342// case 0x87: return op_read_idpx<&SMPcore::op_adc>();1343// void SMPcore::op_read_idpx() {1344{134522, // dp = op_readpc() + regs.x;13461, // op_io();134723, // sp.l = op_readdp(dp++);134824, // sp.h = op_readdp(dp++);134925, // rd = op_read(sp);1350113, // regs.a = op_adc(regs.a, rd);13512, // //!!NEXT1352},1353// case 0x88: return op_read_const<&SMPcore::op_adc>(regs.a);1354// void SMPcore::op_read_const(uint8 &r) {1355{135613, // rd = op_readpc();1357113, // regs.a = op_adc(regs.a, rd);13582, // //!!NEXT1359},1360// case 0x89: return op_write_dp_dp<&SMPcore::op_adc>();1361// void SMPcore::op_write_dp_dp() {1362{136326, // sp = op_readpc();136427, // rd = op_readdp(sp);13659, // dp = op_readpc();136628, // wr = op_readdp(dp);1367114, // wr = op_adc(wr, rd);136830, // op_writedp(dp, wr);13692, // //!!NEXT1370},1371// case 0x8a: return op_set_addr_bit();1372// void SMPcore::op_set_addr_bit() {1373{137418, // dp.l = op_readpc();137519, // dp.h = op_readpc();137631, // bit = dp >> 13;137732, // dp &= 0x1fff;137820, // rd = op_read(dp);13791, // op_io();1380115, // regs.p.c ^= (bool)(rd & (1 << bit));13812, // //!!NEXT1382},1383// case 0x8b: return op_adjust_dp<&SMPcore::op_dec>();1384// void SMPcore::op_adjust_dp() {1385{13869, // dp = op_readpc();138716, // rd = op_readdp(dp);1388116, // rd = op_dec(rd);138935, // op_writedp(dp, rd);13902, // //!!NEXT1391},1392// case 0x8c: return op_adjust_addr<&SMPcore::op_dec>();1393// void SMPcore::op_adjust_addr() {1394{139518, // dp.l = op_readpc();139619, // dp.h = op_readpc();139720, // rd = op_read(dp);1398116, // rd = op_dec(rd);139936, // op_write(dp, rd);14002, // //!!NEXT1401},1402// case 0x8d: return op_read_const<&SMPcore::op_ld>(regs.y);1403// void SMPcore::op_read_const(uint8 &r) {1404{140513, // rd = op_readpc();1406117, // regs.y = op_ld(regs.y, rd);14072, // //!!NEXT1408},1409// case 0x8e: return op_plp();1410// void SMPcore::op_plp() {1411{14121, // op_io();14131, // op_io();1414111, // regs.p = op_readsp();14152, // //!!NEXT1416},1417// case 0x8f: return op_write_dp_const<&SMPcore::op_st>();1418// void SMPcore::op_write_dp_const() {1419{142013, // rd = op_readpc();14219, // dp = op_readpc();142228, // wr = op_readdp(dp);1423118, // wr = op_st(wr, rd);142430, // op_writedp(dp, wr);14252, // //!!NEXT1426},1427// case 0x90: return op_branch(regs.p.c == 0);1428// void SMPcore::op_branch(bool condition) {1429{143013, // rd = op_readpc();1431119, // if(regs.p.c != 0) return;14321, // op_io();14331, // op_io();143415, // regs.pc += (int8)rd;14352, // //!!NEXT1436},1437// case 0x91: return op_jst();1438// void SMPcore::op_jst() {1439{14403, // dp = 0xffde - ((opcode >> 4) << 1);14414, // rd.l = op_read(dp++);14425, // rd.h = op_read(dp++);14431, // op_io();14441, // op_io();14451, // op_io();14466, // op_writesp(regs.pc.h);14477, // op_writesp(regs.pc.l);14488, // regs.pc = rd;14492, // //!!NEXT1450},1451// case 0x92: return op_set_bit();1452// void SMPcore::op_set_bit() {1453{14549, // dp = op_readpc();145510, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));145611, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));14572, // //!!NEXT1458},1459// case 0x93: return op_branch_bit();1460// void SMPcore::op_branch_bit() {1461{14629, // dp = op_readpc();146312, // sp = op_readdp(dp);146413, // rd = op_readpc();14651, // op_io();146614, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;14671, // op_io();14681, // op_io();146915, // regs.pc += (int8)rd;14702, // //!!NEXT1471},1472// case 0x94: return op_read_dpi<&SMPcore::op_adc>(regs.a, regs.x);1473// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {1474{14759, // dp = op_readpc();14761, // op_io();147747, // rd = op_readdp(dp + regs.x);1478113, // regs.a = op_adc(regs.a, rd);14792, // //!!NEXT1480},1481// case 0x95: return op_read_addri<&SMPcore::op_adc>(regs.x);1482// void SMPcore::op_read_addri(uint8 &r) {1483{148418, // dp.l = op_readpc();148519, // dp.h = op_readpc();14861, // op_io();148748, // rd = op_read(dp + regs.x);1488113, // regs.a = op_adc(regs.a, rd);14892, // //!!NEXT1490},1491// case 0x96: return op_read_addri<&SMPcore::op_adc>(regs.y);1492// void SMPcore::op_read_addri(uint8 &r) {1493{149418, // dp.l = op_readpc();149519, // dp.h = op_readpc();14961, // op_io();149749, // rd = op_read(dp + regs.y);1498113, // regs.a = op_adc(regs.a, rd);14992, // //!!NEXT1500},1501// case 0x97: return op_read_idpy<&SMPcore::op_adc>();1502// void SMPcore::op_read_idpy() {1503{15049, // dp = op_readpc();15051, // op_io();150623, // sp.l = op_readdp(dp++);150724, // sp.h = op_readdp(dp++);150850, // rd = op_read(sp + regs.y);1509113, // regs.a = op_adc(regs.a, rd);15102, // //!!NEXT1511},1512// case 0x98: return op_write_dp_const<&SMPcore::op_adc>();1513// void SMPcore::op_write_dp_const() {1514{151513, // rd = op_readpc();15169, // dp = op_readpc();151728, // wr = op_readdp(dp);1518114, // wr = op_adc(wr, rd);151930, // op_writedp(dp, wr);15202, // //!!NEXT1521},1522// case 0x99: return op_write_ix_iy<&SMPcore::op_adc>();1523// void SMPcore::op_write_ix_iy() {1524{15251, // op_io();152651, // rd = op_readdp(regs.y);152752, // wr = op_readdp(regs.x);1528114, // wr = op_adc(wr, rd);152953, // op_writedp(regs.x, wr);15302, // //!!NEXT1531},1532// case 0x9a: return op_read_dpw<&SMPcore::op_sbw>();1533// void SMPcore::op_read_dpw() {1534{15359, // dp = op_readpc();153687, // rd.l = op_readdp(dp++);15371, // op_io();153888, // rd.h = op_readdp(dp++);1539120, // regs.ya = op_sbw(regs.ya, rd);15402, // //!!NEXT1541},1542// case 0x9b: return op_adjust_dpx<&SMPcore::op_dec>();1543// void SMPcore::op_adjust_dpx() {1544{15459, // dp = op_readpc();15461, // op_io();154747, // rd = op_readdp(dp + regs.x);1548116, // rd = op_dec(rd);154960, // op_writedp(dp + regs.x, rd);15502, // //!!NEXT1551},1552// case 0x9c: return op_adjust<&SMPcore::op_dec>(regs.a);1553// void SMPcore::op_adjust(uint8 &r) {1554{15551, // op_io();1556121, // regs.a = op_dec(regs.a);15572, // //!!NEXT1558},1559// case 0x9d: return op_transfer(regs.s, regs.x);1560// void SMPcore::op_transfer(uint8 &from, uint8 &to) {1561{15621, // op_io();1563122, // regs.x = regs.s;156492, // regs.p.n = (regs.x & 0x80);156593, // regs.p.z = (regs.x == 0);15662, // //!!NEXT1567},1568// case 0x9e: return op_div_ya_x();1569// void SMPcore::op_div_ya_x() {1570{15711, // op_io();15721, // op_io();15731, // op_io();15741, // op_io();15751, // op_io();15761, // op_io();15771, // op_io();15781, // op_io();15791, // op_io();15801, // op_io();15811, // op_io();1582//ya = regs.ya;1583////overflow set if quotient >= 2561584//regs.p.v = (regs.y >= regs.x);1585//regs.p.h = ((regs.y & 15) >= (regs.x & 15));1586//if(regs.y < (regs.x << 1)) {1587////if quotient is <= 511 (will fit into 9-bit result)1588//regs.a = ya / regs.x;1589//regs.y = ya % regs.x;1590//} else {1591////otherwise, the quotient won't fit into regs.p.v + regs.a1592////this emulates the odd behavior of the S-SMP in this case1593//regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x);1594//regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x);1595//}1596////result is set based on a (quotient) only1597//regs.p.n = (regs.a & 0x80);1598//regs.p.z = (regs.a == 0);1599123, // //!!MULTI016002, // //!!NEXT1601},1602// case 0x9f: return op_xcn();1603// void SMPcore::op_xcn() {1604{16051, // op_io();16061, // op_io();16071, // op_io();16081, // op_io();1609124, // regs.a = (regs.a >> 4) | (regs.a << 4);1610125, // regs.p.n = regs.a & 0x80;1611126, // regs.p.z = regs.a == 0;16122, // //!!NEXT1613},1614// case 0xa0: return op_set_flag(regs.p.i, 1);1615// void SMPcore::op_set_flag(bool &flag, bool data) {1616{16171, // op_io();16181, // op_io();1619127, // regs.p.i = 1;16202, // //!!NEXT1621},1622// case 0xa1: return op_jst();1623// void SMPcore::op_jst() {1624{16253, // dp = 0xffde - ((opcode >> 4) << 1);16264, // rd.l = op_read(dp++);16275, // rd.h = op_read(dp++);16281, // op_io();16291, // op_io();16301, // op_io();16316, // op_writesp(regs.pc.h);16327, // op_writesp(regs.pc.l);16338, // regs.pc = rd;16342, // //!!NEXT1635},1636// case 0xa2: return op_set_bit();1637// void SMPcore::op_set_bit() {1638{16399, // dp = op_readpc();164010, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));164111, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));16422, // //!!NEXT1643},1644// case 0xa3: return op_branch_bit();1645// void SMPcore::op_branch_bit() {1646{16479, // dp = op_readpc();164812, // sp = op_readdp(dp);164913, // rd = op_readpc();16501, // op_io();165114, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;16521, // op_io();16531, // op_io();165415, // regs.pc += (int8)rd;16552, // //!!NEXT1656},1657// case 0xa4: return op_read_dp<&SMPcore::op_sbc>(regs.a);1658// void SMPcore::op_read_dp(uint8 &r) {1659{16609, // dp = op_readpc();166116, // rd = op_readdp(dp);1662128, // regs.a = op_sbc(regs.a, rd);16632, // //!!NEXT1664},1665// case 0xa5: return op_read_addr<&SMPcore::op_sbc>(regs.a);1666// void SMPcore::op_read_addr(uint8 &r) {1667{166818, // dp.l = op_readpc();166919, // dp.h = op_readpc();167020, // rd = op_read(dp);1671128, // regs.a = op_sbc(regs.a, rd);16722, // //!!NEXT1673},1674// case 0xa6: return op_read_ix<&SMPcore::op_sbc>();1675// void SMPcore::op_read_ix() {1676{16771, // op_io();167821, // rd = op_readdp(regs.x);1679128, // regs.a = op_sbc(regs.a, rd);16802, // //!!NEXT1681},1682// case 0xa7: return op_read_idpx<&SMPcore::op_sbc>();1683// void SMPcore::op_read_idpx() {1684{168522, // dp = op_readpc() + regs.x;16861, // op_io();168723, // sp.l = op_readdp(dp++);168824, // sp.h = op_readdp(dp++);168925, // rd = op_read(sp);1690128, // regs.a = op_sbc(regs.a, rd);16912, // //!!NEXT1692},1693// case 0xa8: return op_read_const<&SMPcore::op_sbc>(regs.a);1694// void SMPcore::op_read_const(uint8 &r) {1695{169613, // rd = op_readpc();1697128, // regs.a = op_sbc(regs.a, rd);16982, // //!!NEXT1699},1700// case 0xa9: return op_write_dp_dp<&SMPcore::op_sbc>();1701// void SMPcore::op_write_dp_dp() {1702{170326, // sp = op_readpc();170427, // rd = op_readdp(sp);17059, // dp = op_readpc();170628, // wr = op_readdp(dp);1707129, // wr = op_sbc(wr, rd);170830, // op_writedp(dp, wr);17092, // //!!NEXT1710},1711// case 0xaa: return op_set_addr_bit();1712// void SMPcore::op_set_addr_bit() {1713{171418, // dp.l = op_readpc();171519, // dp.h = op_readpc();171631, // bit = dp >> 13;171732, // dp &= 0x1fff;171820, // rd = op_read(dp);1719130, // regs.p.c = (rd & (1 << bit));17202, // //!!NEXT1721},1722// case 0xab: return op_adjust_dp<&SMPcore::op_inc>();1723// void SMPcore::op_adjust_dp() {1724{17259, // dp = op_readpc();172616, // rd = op_readdp(dp);1727131, // rd = op_inc(rd);172835, // op_writedp(dp, rd);17292, // //!!NEXT1730},1731// case 0xac: return op_adjust_addr<&SMPcore::op_inc>();1732// void SMPcore::op_adjust_addr() {1733{173418, // dp.l = op_readpc();173519, // dp.h = op_readpc();173620, // rd = op_read(dp);1737131, // rd = op_inc(rd);173836, // op_write(dp, rd);17392, // //!!NEXT1740},1741// case 0xad: return op_read_const<&SMPcore::op_cmp>(regs.y);1742// void SMPcore::op_read_const(uint8 &r) {1743{174413, // rd = op_readpc();174594, // regs.y = op_cmp(regs.y, rd);17462, // //!!NEXT1747},1748// case 0xae: return op_pull(regs.a);1749// void SMPcore::op_pull(uint8 &r) {1750{17511, // op_io();17521, // op_io();1753132, // regs.a = op_readsp();17542, // //!!NEXT1755},1756// case 0xaf: return op_sta_ixinc();1757// void SMPcore::op_sta_ixinc() {1758{17591, // op_io();17601, // op_io();1761133, // op_writedp(regs.x++, regs.a);17622, // //!!NEXT1763},1764// case 0xb0: return op_branch(regs.p.c == 1);1765// void SMPcore::op_branch(bool condition) {1766{176713, // rd = op_readpc();1768134, // if(regs.p.c != 1) return;17691, // op_io();17701, // op_io();177115, // regs.pc += (int8)rd;17722, // //!!NEXT1773},1774// case 0xb1: return op_jst();1775// void SMPcore::op_jst() {1776{17773, // dp = 0xffde - ((opcode >> 4) << 1);17784, // rd.l = op_read(dp++);17795, // rd.h = op_read(dp++);17801, // op_io();17811, // op_io();17821, // op_io();17836, // op_writesp(regs.pc.h);17847, // op_writesp(regs.pc.l);17858, // regs.pc = rd;17862, // //!!NEXT1787},1788// case 0xb2: return op_set_bit();1789// void SMPcore::op_set_bit() {1790{17919, // dp = op_readpc();179210, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));179311, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));17942, // //!!NEXT1795},1796// case 0xb3: return op_branch_bit();1797// void SMPcore::op_branch_bit() {1798{17999, // dp = op_readpc();180012, // sp = op_readdp(dp);180113, // rd = op_readpc();18021, // op_io();180314, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;18041, // op_io();18051, // op_io();180615, // regs.pc += (int8)rd;18072, // //!!NEXT1808},1809// case 0xb4: return op_read_dpi<&SMPcore::op_sbc>(regs.a, regs.x);1810// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {1811{18129, // dp = op_readpc();18131, // op_io();181447, // rd = op_readdp(dp + regs.x);1815128, // regs.a = op_sbc(regs.a, rd);18162, // //!!NEXT1817},1818// case 0xb5: return op_read_addri<&SMPcore::op_sbc>(regs.x);1819// void SMPcore::op_read_addri(uint8 &r) {1820{182118, // dp.l = op_readpc();182219, // dp.h = op_readpc();18231, // op_io();182448, // rd = op_read(dp + regs.x);1825128, // regs.a = op_sbc(regs.a, rd);18262, // //!!NEXT1827},1828// case 0xb6: return op_read_addri<&SMPcore::op_sbc>(regs.y);1829// void SMPcore::op_read_addri(uint8 &r) {1830{183118, // dp.l = op_readpc();183219, // dp.h = op_readpc();18331, // op_io();183449, // rd = op_read(dp + regs.y);1835128, // regs.a = op_sbc(regs.a, rd);18362, // //!!NEXT1837},1838// case 0xb7: return op_read_idpy<&SMPcore::op_sbc>();1839// void SMPcore::op_read_idpy() {1840{18419, // dp = op_readpc();18421, // op_io();184323, // sp.l = op_readdp(dp++);184424, // sp.h = op_readdp(dp++);184550, // rd = op_read(sp + regs.y);1846128, // regs.a = op_sbc(regs.a, rd);18472, // //!!NEXT1848},1849// case 0xb8: return op_write_dp_const<&SMPcore::op_sbc>();1850// void SMPcore::op_write_dp_const() {1851{185213, // rd = op_readpc();18539, // dp = op_readpc();185428, // wr = op_readdp(dp);1855129, // wr = op_sbc(wr, rd);185630, // op_writedp(dp, wr);18572, // //!!NEXT1858},1859// case 0xb9: return op_write_ix_iy<&SMPcore::op_sbc>();1860// void SMPcore::op_write_ix_iy() {1861{18621, // op_io();186351, // rd = op_readdp(regs.y);186452, // wr = op_readdp(regs.x);1865129, // wr = op_sbc(wr, rd);186653, // op_writedp(regs.x, wr);18672, // //!!NEXT1868},1869// case 0xba: return op_read_dpw<&SMPcore::op_ldw>();1870// void SMPcore::op_read_dpw() {1871{18729, // dp = op_readpc();187387, // rd.l = op_readdp(dp++);18741, // op_io();187588, // rd.h = op_readdp(dp++);1876135, // regs.ya = op_ldw(regs.ya, rd);18772, // //!!NEXT1878},1879// case 0xbb: return op_adjust_dpx<&SMPcore::op_inc>();1880// void SMPcore::op_adjust_dpx() {1881{18829, // dp = op_readpc();18831, // op_io();188447, // rd = op_readdp(dp + regs.x);1885131, // rd = op_inc(rd);188660, // op_writedp(dp + regs.x, rd);18872, // //!!NEXT1888},1889// case 0xbc: return op_adjust<&SMPcore::op_inc>(regs.a);1890// void SMPcore::op_adjust(uint8 &r) {1891{18921, // op_io();1893136, // regs.a = op_inc(regs.a);18942, // //!!NEXT1895},1896// case 0xbd: return op_transfer(regs.x, regs.s);1897// void SMPcore::op_transfer(uint8 &from, uint8 &to) {1898{18991, // op_io();1900137, // regs.s = regs.x;19012, // //!!NEXT1902},1903// case 0xbe: return op_das();1904// void SMPcore::op_das() {1905{19061, // op_io();19071, // op_io();1908//if(!regs.p.c || (regs.a) > 0x99) {1909//regs.a -= 0x60;1910//regs.p.c = 0;1911//}1912//if(!regs.p.h || (regs.a & 15) > 0x09) {1913//regs.a -= 0x06;1914//}1915//regs.p.n = (regs.a & 0x80);1916//regs.p.z = (regs.a == 0);1917138, // //!!MULTI119182, // //!!NEXT1919},1920// case 0xbf: return op_lda_ixinc();1921// void SMPcore::op_lda_ixinc() {1922{19231, // op_io();1924139, // regs.a = op_readdp(regs.x++);19251, // op_io();1926125, // regs.p.n = regs.a & 0x80;1927126, // regs.p.z = regs.a == 0;19282, // //!!NEXT1929},1930// case 0xc0: return op_set_flag(regs.p.i, 0);1931// void SMPcore::op_set_flag(bool &flag, bool data) {1932{19331, // op_io();19341, // op_io();193545, // regs.p.i = 0;19362, // //!!NEXT1937},1938// case 0xc1: return op_jst();1939// void SMPcore::op_jst() {1940{19413, // dp = 0xffde - ((opcode >> 4) << 1);19424, // rd.l = op_read(dp++);19435, // rd.h = op_read(dp++);19441, // op_io();19451, // op_io();19461, // op_io();19476, // op_writesp(regs.pc.h);19487, // op_writesp(regs.pc.l);19498, // regs.pc = rd;19502, // //!!NEXT1951},1952// case 0xc2: return op_set_bit();1953// void SMPcore::op_set_bit() {1954{19559, // dp = op_readpc();195610, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));195711, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));19582, // //!!NEXT1959},1960// case 0xc3: return op_branch_bit();1961// void SMPcore::op_branch_bit() {1962{19639, // dp = op_readpc();196412, // sp = op_readdp(dp);196513, // rd = op_readpc();19661, // op_io();196714, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;19681, // op_io();19691, // op_io();197015, // regs.pc += (int8)rd;19712, // //!!NEXT1972},1973// case 0xc4: return op_write_dp(regs.a);1974// void SMPcore::op_write_dp(uint8 &r) {1975{19769, // dp = op_readpc();1977140, // op_readdp(dp);1978141, // op_writedp(dp, regs.a);19792, // //!!NEXT1980},1981// case 0xc5: return op_write_addr(regs.a);1982// void SMPcore::op_write_addr(uint8 &r) {1983{198418, // dp.l = op_readpc();198519, // dp.h = op_readpc();198640, // op_read(dp);1987142, // op_write(dp, regs.a);19882, // //!!NEXT1989},1990// case 0xc6: return op_sta_ix();1991// void SMPcore::op_sta_ix() {1992{19931, // op_io();1994143, // op_readdp(regs.x);1995144, // op_writedp(regs.x, regs.a);19962, // //!!NEXT1997},1998// case 0xc7: return op_sta_idpx();1999// void SMPcore::op_sta_idpx() {2000{2001145, // sp = op_readpc() + regs.x;20021, // op_io();2003146, // dp.l = op_readdp(sp++);2004147, // dp.h = op_readdp(sp++);200540, // op_read(dp);2006142, // op_write(dp, regs.a);20072, // //!!NEXT2008},2009// case 0xc8: return op_read_const<&SMPcore::op_cmp>(regs.x);2010// void SMPcore::op_read_const(uint8 &r) {2011{201213, // rd = op_readpc();201363, // regs.x = op_cmp(regs.x, rd);20142, // //!!NEXT2015},2016// case 0xc9: return op_write_addr(regs.x);2017// void SMPcore::op_write_addr(uint8 &r) {2018{201918, // dp.l = op_readpc();202019, // dp.h = op_readpc();202140, // op_read(dp);2022148, // op_write(dp, regs.x);20232, // //!!NEXT2024},2025// case 0xca: return op_set_addr_bit();2026// void SMPcore::op_set_addr_bit() {2027{202818, // dp.l = op_readpc();202919, // dp.h = op_readpc();203031, // bit = dp >> 13;203132, // dp &= 0x1fff;203220, // rd = op_read(dp);20331, // op_io();2034149, // rd = (rd & ~(1 << bit)) | (regs.p.c << bit);203536, // op_write(dp, rd);20362, // //!!NEXT2037},2038// case 0xcb: return op_write_dp(regs.y);2039// void SMPcore::op_write_dp(uint8 &r) {2040{20419, // dp = op_readpc();2042140, // op_readdp(dp);2043150, // op_writedp(dp, regs.y);20442, // //!!NEXT2045},2046// case 0xcc: return op_write_addr(regs.y);2047// void SMPcore::op_write_addr(uint8 &r) {2048{204918, // dp.l = op_readpc();205019, // dp.h = op_readpc();205140, // op_read(dp);2052151, // op_write(dp, regs.y);20532, // //!!NEXT2054},2055// case 0xcd: return op_read_const<&SMPcore::op_ld>(regs.x);2056// void SMPcore::op_read_const(uint8 &r) {2057{205813, // rd = op_readpc();2059152, // regs.x = op_ld(regs.x, rd);20602, // //!!NEXT2061},2062// case 0xce: return op_pull(regs.x);2063// void SMPcore::op_pull(uint8 &r) {2064{20651, // op_io();20661, // op_io();2067153, // regs.x = op_readsp();20682, // //!!NEXT2069},2070// case 0xcf: return op_mul_ya();2071// void SMPcore::op_mul_ya() {2072{20731, // op_io();20741, // op_io();20751, // op_io();20761, // op_io();20771, // op_io();20781, // op_io();20791, // op_io();20801, // op_io();2081//ya = regs.y * regs.a;2082//regs.a = ya;2083//regs.y = ya >> 8;2084////result is set based on y (high-byte) only2085//regs.p.n = (regs.y & 0x80);2086//regs.p.z = (regs.y == 0);2087154, // //!!MULTI220882, // //!!NEXT2089},2090// case 0xd0: return op_branch(regs.p.z == 0);2091// void SMPcore::op_branch(bool condition) {2092{209313, // rd = op_readpc();2094155, // if(regs.p.z != 0) return;20951, // op_io();20961, // op_io();209715, // regs.pc += (int8)rd;20982, // //!!NEXT2099},2100// case 0xd1: return op_jst();2101// void SMPcore::op_jst() {2102{21033, // dp = 0xffde - ((opcode >> 4) << 1);21044, // rd.l = op_read(dp++);21055, // rd.h = op_read(dp++);21061, // op_io();21071, // op_io();21081, // op_io();21096, // op_writesp(regs.pc.h);21107, // op_writesp(regs.pc.l);21118, // regs.pc = rd;21122, // //!!NEXT2113},2114// case 0xd2: return op_set_bit();2115// void SMPcore::op_set_bit() {2116{21179, // dp = op_readpc();211810, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));211911, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));21202, // //!!NEXT2121},2122// case 0xd3: return op_branch_bit();2123// void SMPcore::op_branch_bit() {2124{21259, // dp = op_readpc();212612, // sp = op_readdp(dp);212713, // rd = op_readpc();21281, // op_io();212914, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;21301, // op_io();21311, // op_io();213215, // regs.pc += (int8)rd;21332, // //!!NEXT2134},2135// case 0xd4: return op_write_dpi(regs.a, regs.x);2136// void SMPcore::op_write_dpi(uint8 &r, uint8 &i) {2137{213822, // dp = op_readpc() + regs.x;21391, // op_io();2140140, // op_readdp(dp);2141141, // op_writedp(dp, regs.a);21422, // //!!NEXT2143},2144// case 0xd5: return op_write_addri(regs.x);2145// void SMPcore::op_write_addri(uint8 &i) {2146{214718, // dp.l = op_readpc();214819, // dp.h = op_readpc();21491, // op_io();215064, // dp += regs.x;215140, // op_read(dp);2152142, // op_write(dp, regs.a);21532, // //!!NEXT2154},2155// case 0xd6: return op_write_addri(regs.y);2156// void SMPcore::op_write_addri(uint8 &i) {2157{215818, // dp.l = op_readpc();215919, // dp.h = op_readpc();21601, // op_io();2161156, // dp += regs.y;216240, // op_read(dp);2163142, // op_write(dp, regs.a);21642, // //!!NEXT2165},2166// case 0xd7: return op_sta_idpy();2167// void SMPcore::op_sta_idpy() {2168{216926, // sp = op_readpc();2170146, // dp.l = op_readdp(sp++);2171147, // dp.h = op_readdp(sp++);21721, // op_io();2173156, // dp += regs.y;217440, // op_read(dp);2175142, // op_write(dp, regs.a);21762, // //!!NEXT2177},2178// case 0xd8: return op_write_dp(regs.x);2179// void SMPcore::op_write_dp(uint8 &r) {2180{21819, // dp = op_readpc();2182140, // op_readdp(dp);2183157, // op_writedp(dp, regs.x);21842, // //!!NEXT2185},2186// case 0xd9: return op_write_dpi(regs.x, regs.y);2187// void SMPcore::op_write_dpi(uint8 &r, uint8 &i) {2188{2189158, // dp = op_readpc() + regs.y;21901, // op_io();2191140, // op_readdp(dp);2192157, // op_writedp(dp, regs.x);21932, // //!!NEXT2194},2195// case 0xda: return op_stw_dp();2196// void SMPcore::op_stw_dp() {2197{21989, // dp = op_readpc();2199140, // op_readdp(dp);2200159, // op_writedp(dp++, regs.a);2201160, // op_writedp(dp++, regs.y);22022, // //!!NEXT2203},2204// case 0xdb: return op_write_dpi(regs.y, regs.x);2205// void SMPcore::op_write_dpi(uint8 &r, uint8 &i) {2206{220722, // dp = op_readpc() + regs.x;22081, // op_io();2209140, // op_readdp(dp);2210150, // op_writedp(dp, regs.y);22112, // //!!NEXT2212},2213// case 0xdc: return op_adjust<&SMPcore::op_dec>(regs.y);2214// void SMPcore::op_adjust(uint8 &r) {2215{22161, // op_io();2217161, // regs.y = op_dec(regs.y);22182, // //!!NEXT2219},2220// case 0xdd: return op_transfer(regs.y, regs.a);2221// void SMPcore::op_transfer(uint8 &from, uint8 &to) {2222{22231, // op_io();2224162, // regs.a = regs.y;2225109, // regs.p.n = (regs.a & 0x80);2226110, // regs.p.z = (regs.a == 0);22272, // //!!NEXT2228},2229// case 0xde: return op_bne_dpx();2230// void SMPcore::op_bne_dpx() {2231{22329, // dp = op_readpc();22331, // op_io();2234163, // sp = op_readdp(dp + regs.x);223513, // rd = op_readpc();22361, // op_io();223771, // if(regs.a == sp) return;22381, // op_io();22391, // op_io();224015, // regs.pc += (int8)rd;22412, // //!!NEXT2242},2243// case 0xdf: return op_daa();2244// void SMPcore::op_daa() {2245{22461, // op_io();22471, // op_io();2248//if(regs.p.c || (regs.a) > 0x99) {2249//regs.a += 0x60;2250//regs.p.c = 1;2251//}2252//if(regs.p.h || (regs.a & 15) > 0x09) {2253//regs.a += 0x06;2254//}2255//regs.p.n = (regs.a & 0x80);2256//regs.p.z = (regs.a == 0);2257164, // //!!MULTI322582, // //!!NEXT2259},2260// case 0xe0: return op_clv();2261// void SMPcore::op_clv() {2262{22631, // op_io();2264165, // regs.p.v = 0;2265166, // regs.p.h = 0;22662, // //!!NEXT2267},2268// case 0xe1: return op_jst();2269// void SMPcore::op_jst() {2270{22713, // dp = 0xffde - ((opcode >> 4) << 1);22724, // rd.l = op_read(dp++);22735, // rd.h = op_read(dp++);22741, // op_io();22751, // op_io();22761, // op_io();22776, // op_writesp(regs.pc.h);22787, // op_writesp(regs.pc.l);22798, // regs.pc = rd;22802, // //!!NEXT2281},2282// case 0xe2: return op_set_bit();2283// void SMPcore::op_set_bit() {2284{22859, // dp = op_readpc();228610, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));228711, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));22882, // //!!NEXT2289},2290// case 0xe3: return op_branch_bit();2291// void SMPcore::op_branch_bit() {2292{22939, // dp = op_readpc();229412, // sp = op_readdp(dp);229513, // rd = op_readpc();22961, // op_io();229714, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;22981, // op_io();22991, // op_io();230015, // regs.pc += (int8)rd;23012, // //!!NEXT2302},2303// case 0xe4: return op_read_dp<&SMPcore::op_ld>(regs.a);2304// void SMPcore::op_read_dp(uint8 &r) {2305{23069, // dp = op_readpc();230716, // rd = op_readdp(dp);2308167, // regs.a = op_ld(regs.a, rd);23092, // //!!NEXT2310},2311// case 0xe5: return op_read_addr<&SMPcore::op_ld>(regs.a);2312// void SMPcore::op_read_addr(uint8 &r) {2313{231418, // dp.l = op_readpc();231519, // dp.h = op_readpc();231620, // rd = op_read(dp);2317167, // regs.a = op_ld(regs.a, rd);23182, // //!!NEXT2319},2320// case 0xe6: return op_read_ix<&SMPcore::op_ld>();2321// void SMPcore::op_read_ix() {2322{23231, // op_io();232421, // rd = op_readdp(regs.x);2325167, // regs.a = op_ld(regs.a, rd);23262, // //!!NEXT2327},2328// case 0xe7: return op_read_idpx<&SMPcore::op_ld>();2329// void SMPcore::op_read_idpx() {2330{233122, // dp = op_readpc() + regs.x;23321, // op_io();233323, // sp.l = op_readdp(dp++);233424, // sp.h = op_readdp(dp++);233525, // rd = op_read(sp);2336167, // regs.a = op_ld(regs.a, rd);23372, // //!!NEXT2338},2339// case 0xe8: return op_read_const<&SMPcore::op_ld>(regs.a);2340// void SMPcore::op_read_const(uint8 &r) {2341{234213, // rd = op_readpc();2343167, // regs.a = op_ld(regs.a, rd);23442, // //!!NEXT2345},2346// case 0xe9: return op_read_addr<&SMPcore::op_ld>(regs.x);2347// void SMPcore::op_read_addr(uint8 &r) {2348{234918, // dp.l = op_readpc();235019, // dp.h = op_readpc();235120, // rd = op_read(dp);2352152, // regs.x = op_ld(regs.x, rd);23532, // //!!NEXT2354},2355// case 0xea: return op_set_addr_bit();2356// void SMPcore::op_set_addr_bit() {2357{235818, // dp.l = op_readpc();235919, // dp.h = op_readpc();236031, // bit = dp >> 13;236132, // dp &= 0x1fff;236220, // rd = op_read(dp);2363168, // rd ^= 1 << bit;236436, // op_write(dp, rd);23652, // //!!NEXT2366},2367// case 0xeb: return op_read_dp<&SMPcore::op_ld>(regs.y);2368// void SMPcore::op_read_dp(uint8 &r) {2369{23709, // dp = op_readpc();237116, // rd = op_readdp(dp);2372117, // regs.y = op_ld(regs.y, rd);23732, // //!!NEXT2374},2375// case 0xec: return op_read_addr<&SMPcore::op_ld>(regs.y);2376// void SMPcore::op_read_addr(uint8 &r) {2377{237818, // dp.l = op_readpc();237919, // dp.h = op_readpc();238020, // rd = op_read(dp);2381117, // regs.y = op_ld(regs.y, rd);23822, // //!!NEXT2383},2384// case 0xed: return op_cmc();2385// void SMPcore::op_cmc() {2386{23871, // op_io();23881, // op_io();2389169, // regs.p.c = !regs.p.c;23902, // //!!NEXT2391},2392// case 0xee: return op_pull(regs.y);2393// void SMPcore::op_pull(uint8 &r) {2394{23951, // op_io();23961, // op_io();2397170, // regs.y = op_readsp();23982, // //!!NEXT2399},2400// case 0xef: return op_wait();2401// void SMPcore::op_wait() {2402{24031, // op_io();24041, // op_io();2405171, // //!!REPEAT2406},2407// case 0xf0: return op_branch(regs.p.z == 1);2408// void SMPcore::op_branch(bool condition) {2409{241013, // rd = op_readpc();2411172, // if(regs.p.z != 1) return;24121, // op_io();24131, // op_io();241415, // regs.pc += (int8)rd;24152, // //!!NEXT2416},2417// case 0xf1: return op_jst();2418// void SMPcore::op_jst() {2419{24203, // dp = 0xffde - ((opcode >> 4) << 1);24214, // rd.l = op_read(dp++);24225, // rd.h = op_read(dp++);24231, // op_io();24241, // op_io();24251, // op_io();24266, // op_writesp(regs.pc.h);24277, // op_writesp(regs.pc.l);24288, // regs.pc = rd;24292, // //!!NEXT2430},2431// case 0xf2: return op_set_bit();2432// void SMPcore::op_set_bit() {2433{24349, // dp = op_readpc();243510, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));243611, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));24372, // //!!NEXT2438},2439// case 0xf3: return op_branch_bit();2440// void SMPcore::op_branch_bit() {2441{24429, // dp = op_readpc();244312, // sp = op_readdp(dp);244413, // rd = op_readpc();24451, // op_io();244614, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;24471, // op_io();24481, // op_io();244915, // regs.pc += (int8)rd;24502, // //!!NEXT2451},2452// case 0xf4: return op_read_dpi<&SMPcore::op_ld>(regs.a, regs.x);2453// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {2454{24559, // dp = op_readpc();24561, // op_io();245747, // rd = op_readdp(dp + regs.x);2458167, // regs.a = op_ld(regs.a, rd);24592, // //!!NEXT2460},2461// case 0xf5: return op_read_addri<&SMPcore::op_ld>(regs.x);2462// void SMPcore::op_read_addri(uint8 &r) {2463{246418, // dp.l = op_readpc();246519, // dp.h = op_readpc();24661, // op_io();246748, // rd = op_read(dp + regs.x);2468167, // regs.a = op_ld(regs.a, rd);24692, // //!!NEXT2470},2471// case 0xf6: return op_read_addri<&SMPcore::op_ld>(regs.y);2472// void SMPcore::op_read_addri(uint8 &r) {2473{247418, // dp.l = op_readpc();247519, // dp.h = op_readpc();24761, // op_io();247749, // rd = op_read(dp + regs.y);2478167, // regs.a = op_ld(regs.a, rd);24792, // //!!NEXT2480},2481// case 0xf7: return op_read_idpy<&SMPcore::op_ld>();2482// void SMPcore::op_read_idpy() {2483{24849, // dp = op_readpc();24851, // op_io();248623, // sp.l = op_readdp(dp++);248724, // sp.h = op_readdp(dp++);248850, // rd = op_read(sp + regs.y);2489167, // regs.a = op_ld(regs.a, rd);24902, // //!!NEXT2491},2492// case 0xf8: return op_read_dp<&SMPcore::op_ld>(regs.x);2493// void SMPcore::op_read_dp(uint8 &r) {2494{24959, // dp = op_readpc();249616, // rd = op_readdp(dp);2497152, // regs.x = op_ld(regs.x, rd);24982, // //!!NEXT2499},2500// case 0xf9: return op_read_dpi<&SMPcore::op_ld>(regs.x, regs.y);2501// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {2502{25039, // dp = op_readpc();25041, // op_io();2505173, // rd = op_readdp(dp + regs.y);2506152, // regs.x = op_ld(regs.x, rd);25072, // //!!NEXT2508},2509// case 0xfa: return op_write_dp_dp<&SMPcore::op_st>();2510// void SMPcore::op_write_dp_dp() {2511{251226, // sp = op_readpc();251327, // rd = op_readdp(sp);25149, // dp = op_readpc();2515118, // wr = op_st(wr, rd);251630, // op_writedp(dp, wr);25172, // //!!NEXT2518},2519// case 0xfb: return op_read_dpi<&SMPcore::op_ld>(regs.y, regs.x);2520// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {2521{25229, // dp = op_readpc();25231, // op_io();252447, // rd = op_readdp(dp + regs.x);2525117, // regs.y = op_ld(regs.y, rd);25262, // //!!NEXT2527},2528// case 0xfc: return op_adjust<&SMPcore::op_inc>(regs.y);2529// void SMPcore::op_adjust(uint8 &r) {2530{25311, // op_io();2532174, // regs.y = op_inc(regs.y);25332, // //!!NEXT2534},2535// case 0xfd: return op_transfer(regs.a, regs.y);2536// void SMPcore::op_transfer(uint8 &from, uint8 &to) {2537{25381, // op_io();2539175, // regs.y = regs.a;2540176, // regs.p.n = (regs.y & 0x80);2541177, // regs.p.z = (regs.y == 0);25422, // //!!NEXT2543},2544// case 0xfe: return op_bne_ydec();2545// void SMPcore::op_bne_ydec() {2546{254713, // rd = op_readpc();25481, // op_io();25491, // op_io();2550178, // if(--regs.y == 0) return;25511, // op_io();25521, // op_io();255315, // regs.pc += (int8)rd;25542, // //!!NEXT2555},2556// case 0xff: return op_wait();2557// void SMPcore::op_wait() {2558{25591, // op_io();25601, // op_io();2561171, // //!!REPEAT2562},25632564}; // const int uoptable[][] = {25652566256725682569void SMPcore::op_step()2570{2571switch (uoptable[opcode][uindex])2572{2573case 1:2574op_io();2575break;2576case 2:2577op_next();//!!NEXT2578break;2579case 3:2580dp = 0xffde - ((opcode >> 4) << 1);2581break;2582case 4:2583rd.l = op_read(dp++);2584break;2585case 5:2586rd.h = op_read(dp++);2587break;2588case 6:2589op_writesp(regs.pc.h);2590break;2591case 7:2592op_writesp(regs.pc.l);2593break;2594case 8:2595regs.pc = rd;2596break;2597case 9:2598dp = op_readpc();2599break;2600case 10:2601rd = op_readdp(dp) & ~(1 << (opcode >> 5));2602break;2603case 11:2604op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));2605break;2606case 12:2607sp = op_readdp(dp);2608break;2609case 13:2610rd = op_readpc();2611break;2612case 14:2613if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) op_next();2614break;2615case 15:2616regs.pc += (int8)rd;2617break;2618case 16:2619rd = op_readdp(dp);2620break;2621case 17:2622regs.a = op_or(regs.a, rd);2623break;2624case 18:2625dp.l = op_readpc();2626break;2627case 19:2628dp.h = op_readpc();2629break;2630case 20:2631rd = op_read(dp);2632break;2633case 21:2634rd = op_readdp(regs.x);2635break;2636case 22:2637dp = op_readpc() + regs.x;2638break;2639case 23:2640sp.l = op_readdp(dp++);2641break;2642case 24:2643sp.h = op_readdp(dp++);2644break;2645case 25:2646rd = op_read(sp);2647break;2648case 26:2649sp = op_readpc();2650break;2651case 27:2652rd = op_readdp(sp);2653break;2654case 28:2655wr = op_readdp(dp);2656break;2657case 29:2658wr = op_or(wr, rd);2659break;2660case 30:2661op_writedp(dp, wr);2662break;2663case 31:2664bit = dp >> 13;2665break;2666case 32:2667dp &= 0x1fff;2668break;2669case 33:2670regs.p.c |= (rd & (1 << bit)) ^ 0;2671break;2672case 34:2673rd = op_asl(rd);2674break;2675case 35:2676op_writedp(dp, rd);2677break;2678case 36:2679op_write(dp, rd);2680break;2681case 37:2682op_writesp(regs.p);2683break;2684case 38:2685regs.p.n = (regs.a - rd) & 0x80;2686break;2687case 39:2688regs.p.z = (regs.a - rd) == 0;2689break;2690case 40:2691op_read(dp);2692break;2693case 41:2694op_write(dp, rd | regs.a);2695break;2696case 42:2697rd.l = op_read(0xffde);2698break;2699case 43:2700rd.h = op_read(0xffdf);2701break;2702case 44:2703regs.p.b = 1;2704break;2705case 45:2706regs.p.i = 0;2707break;2708case 46:2709if(regs.p.n != 0) op_next();2710break;2711case 47:2712rd = op_readdp(dp + regs.x);2713break;2714case 48:2715rd = op_read(dp + regs.x);2716break;2717case 49:2718rd = op_read(dp + regs.y);2719break;2720case 50:2721rd = op_read(sp + regs.y);2722break;2723case 51:2724rd = op_readdp(regs.y);2725break;2726case 52:2727wr = op_readdp(regs.x);2728break;2729case 53:2730op_writedp(regs.x, wr);2731break;2732case 54:2733rd.w = op_readdp(dp) - 1;2734break;2735case 55:2736op_writedp(dp++, rd.l);2737break;2738case 56:2739rd.h += op_readdp(dp);2740break;2741case 57:2742op_writedp(dp++, rd.h);2743break;2744case 58:2745regs.p.n = rd & 0x8000;2746break;2747case 59:2748regs.p.z = rd == 0;2749break;2750case 60:2751op_writedp(dp + regs.x, rd);2752break;2753case 61:2754regs.a = op_asl(regs.a);2755break;2756case 62:2757regs.x = op_dec(regs.x);2758break;2759case 63:2760regs.x = op_cmp(regs.x, rd);2761break;2762case 64:2763dp += regs.x;2764break;2765case 65:2766regs.p.p = 0;2767break;2768case 66:2769regs.a = op_and(regs.a, rd);2770break;2771case 67:2772wr = op_and(wr, rd);2773break;2774case 68:2775regs.p.c |= (rd & (1 << bit)) ^ 1;2776break;2777case 69:2778rd = op_rol(rd);2779break;2780case 70:2781op_writesp(regs.a);2782break;2783case 71:2784if(regs.a == sp) op_next();2785break;2786case 72:2787if(regs.p.n != 1) op_next();2788break;2789case 73:2790rd.w = op_readdp(dp) + 1;2791break;2792case 74:2793regs.a = op_rol(regs.a);2794break;2795case 75:2796regs.x = op_inc(regs.x);2797break;2798case 76:2799rd.l = op_readpc();2800break;2801case 77:2802rd.h = op_readpc();2803break;2804case 78:2805regs.p.p = 1;2806break;2807case 79:2808regs.a = op_eor(regs.a, rd);2809break;2810case 80:2811wr = op_eor(wr, rd);2812break;2813case 81:2814regs.p.c &= (rd & (1 << bit)) ^ 0;2815break;2816case 82:2817rd = op_lsr(rd);2818break;2819case 83:2820op_writesp(regs.x);2821break;2822case 84:2823op_write(dp, rd & ~regs.a);2824break;2825case 85:2826regs.pc = 0xff00 | rd;2827break;2828case 86:2829if(regs.p.v != 0) op_next();2830break;2831case 87:2832rd.l = op_readdp(dp++);2833break;2834case 88:2835rd.h = op_readdp(dp++);2836break;2837case 89:2838regs.ya = op_cpw(regs.ya, rd);2839break;2840case 90:2841regs.a = op_lsr(regs.a);2842break;2843case 91:2844regs.x = regs.a;2845break;2846case 92:2847regs.p.n = (regs.x & 0x80);2848break;2849case 93:2850regs.p.z = (regs.x == 0);2851break;2852case 94:2853regs.y = op_cmp(regs.y, rd);2854break;2855case 95:2856regs.p.c = 0;2857break;2858case 96:2859regs.a = op_cmp(regs.a, rd);2860break;2861case 97:2862wr = op_cmp(wr, rd);2863break;2864case 98:2865regs.p.c &= (rd & (1 << bit)) ^ 1;2866break;2867case 99:2868rd = op_ror(rd);2869break;2870case 100:2871op_writesp(regs.y);2872break;2873case 101:2874op_writedp(dp, --wr);2875break;2876case 102:2877if(wr == 0) op_next();2878break;2879case 103:2880rd.l = op_readsp();2881break;2882case 104:2883rd.h = op_readsp();2884break;2885case 105:2886if(regs.p.v != 1) op_next();2887break;2888case 106:2889regs.ya = op_adw(regs.ya, rd);2890break;2891case 107:2892regs.a = op_ror(regs.a);2893break;2894case 108:2895regs.a = regs.x;2896break;2897case 109:2898regs.p.n = (regs.a & 0x80);2899break;2900case 110:2901regs.p.z = (regs.a == 0);2902break;2903case 111:2904regs.p = op_readsp();2905break;2906case 112:2907regs.p.c = 1;2908break;2909case 113:2910regs.a = op_adc(regs.a, rd);2911break;2912case 114:2913wr = op_adc(wr, rd);2914break;2915case 115:2916regs.p.c ^= (bool)(rd & (1 << bit));2917break;2918case 116:2919rd = op_dec(rd);2920break;2921case 117:2922regs.y = op_ld(regs.y, rd);2923break;2924case 118:2925wr = op_st(wr, rd);2926break;2927case 119:2928if(regs.p.c != 0) op_next();2929break;2930case 120:2931regs.ya = op_sbw(regs.ya, rd);2932break;2933case 121:2934regs.a = op_dec(regs.a);2935break;2936case 122:2937regs.x = regs.s;2938break;2939case 123:2940//!!MULTI02941ya = regs.ya;2942//overflow set if quotient >= 2562943regs.p.v = (regs.y >= regs.x);2944regs.p.h = ((regs.y & 15) >= (regs.x & 15));2945if(regs.y < (regs.x << 1)) {2946//if quotient is <= 511 (will fit into 9-bit result)2947regs.a = ya / regs.x;2948regs.y = ya % regs.x;2949} else {2950//otherwise, the quotient won't fit into regs.p.v + regs.a2951//this emulates the odd behavior of the S-SMP in this case2952regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x);2953regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x);2954}2955//result is set based on a (quotient) only2956regs.p.n = (regs.a & 0x80);2957regs.p.z = (regs.a == 0);2958break;2959case 124:2960regs.a = (regs.a >> 4) | (regs.a << 4);2961break;2962case 125:2963regs.p.n = regs.a & 0x80;2964break;2965case 126:2966regs.p.z = regs.a == 0;2967break;2968case 127:2969regs.p.i = 1;2970break;2971case 128:2972regs.a = op_sbc(regs.a, rd);2973break;2974case 129:2975wr = op_sbc(wr, rd);2976break;2977case 130:2978regs.p.c = (rd & (1 << bit));2979break;2980case 131:2981rd = op_inc(rd);2982break;2983case 132:2984regs.a = op_readsp();2985break;2986case 133:2987op_writedp(regs.x++, regs.a);2988break;2989case 134:2990if(regs.p.c != 1) op_next();2991break;2992case 135:2993regs.ya = op_ldw(regs.ya, rd);2994break;2995case 136:2996regs.a = op_inc(regs.a);2997break;2998case 137:2999regs.s = regs.x;3000break;3001case 138:3002//!!MULTI13003if(!regs.p.c || (regs.a) > 0x99) {3004regs.a -= 0x60;3005regs.p.c = 0;3006}3007if(!regs.p.h || (regs.a & 15) > 0x09) {3008regs.a -= 0x06;3009}3010regs.p.n = (regs.a & 0x80);3011regs.p.z = (regs.a == 0);3012break;3013case 139:3014regs.a = op_readdp(regs.x++);3015break;3016case 140:3017op_readdp(dp);3018break;3019case 141:3020op_writedp(dp, regs.a);3021break;3022case 142:3023op_write(dp, regs.a);3024break;3025case 143:3026op_readdp(regs.x);3027break;3028case 144:3029op_writedp(regs.x, regs.a);3030break;3031case 145:3032sp = op_readpc() + regs.x;3033break;3034case 146:3035dp.l = op_readdp(sp++);3036break;3037case 147:3038dp.h = op_readdp(sp++);3039break;3040case 148:3041op_write(dp, regs.x);3042break;3043case 149:3044rd = (rd & ~(1 << bit)) | (regs.p.c << bit);3045break;3046case 150:3047op_writedp(dp, regs.y);3048break;3049case 151:3050op_write(dp, regs.y);3051break;3052case 152:3053regs.x = op_ld(regs.x, rd);3054break;3055case 153:3056regs.x = op_readsp();3057break;3058case 154:3059//!!MULTI23060ya = regs.y * regs.a;3061regs.a = ya;3062regs.y = ya >> 8;3063//result is set based on y (high-byte) only3064regs.p.n = (regs.y & 0x80);3065regs.p.z = (regs.y == 0);3066break;3067case 155:3068if(regs.p.z != 0) op_next();3069break;3070case 156:3071dp += regs.y;3072break;3073case 157:3074op_writedp(dp, regs.x);3075break;3076case 158:3077dp = op_readpc() + regs.y;3078break;3079case 159:3080op_writedp(dp++, regs.a);3081break;3082case 160:3083op_writedp(dp++, regs.y);3084break;3085case 161:3086regs.y = op_dec(regs.y);3087break;3088case 162:3089regs.a = regs.y;3090break;3091case 163:3092sp = op_readdp(dp + regs.x);3093break;3094case 164:3095//!!MULTI33096if(regs.p.c || (regs.a) > 0x99) {3097regs.a += 0x60;3098regs.p.c = 1;3099}3100if(regs.p.h || (regs.a & 15) > 0x09) {3101regs.a += 0x06;3102}3103regs.p.n = (regs.a & 0x80);3104regs.p.z = (regs.a == 0);3105break;3106case 165:3107regs.p.v = 0;3108break;3109case 166:3110regs.p.h = 0;3111break;3112case 167:3113regs.a = op_ld(regs.a, rd);3114break;3115case 168:3116rd ^= 1 << bit;3117break;3118case 169:3119regs.p.c = !regs.p.c;3120break;3121case 170:3122regs.y = op_readsp();3123break;3124case 171:3125uindex = -1; //!!REPEAT3126break;3127case 172:3128if(regs.p.z != 1) op_next();3129break;3130case 173:3131rd = op_readdp(dp + regs.y);3132break;3133case 174:3134regs.y = op_inc(regs.y);3135break;3136case 175:3137regs.y = regs.a;3138break;3139case 176:3140regs.p.n = (regs.y & 0x80);3141break;3142case 177:3143regs.p.z = (regs.y == 0);3144break;3145case 178:3146if(--regs.y == 0) op_next();3147break;3148}3149uindex++;3150}315131523153