3152 lines
78 KiB
C++
3152 lines
78 KiB
C++
const int uoptable[256][16] = {
|
|
|
|
// case 0x00: return op_nop();
|
|
// void SMPcore::op_nop() {
|
|
{
|
|
1, // op_io();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x01: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x02: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x03: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x04: return op_read_dp<&SMPcore::op_or>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x05: return op_read_addr<&SMPcore::op_or>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x06: return op_read_ix<&SMPcore::op_or>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x07: return op_read_idpx<&SMPcore::op_or>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x08: return op_read_const<&SMPcore::op_or>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x09: return op_write_dp_dp<&SMPcore::op_or>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
29, // wr = op_or(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x0a: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
1, // op_io();
|
|
33, // regs.p.c |= (rd & (1 << bit)) ^ 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x0b: return op_adjust_dp<&SMPcore::op_asl>();
|
|
// void SMPcore::op_adjust_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
34, // rd = op_asl(rd);
|
|
35, // op_writedp(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x0c: return op_adjust_addr<&SMPcore::op_asl>();
|
|
// void SMPcore::op_adjust_addr() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
34, // rd = op_asl(rd);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x0d: return op_push(regs.p);
|
|
// void SMPcore::op_push(uint8 r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
37, // op_writesp(regs.p);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x0e: return op_test_addr(1);
|
|
// void SMPcore::op_test_addr(bool set) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
38, // regs.p.n = (regs.a - rd) & 0x80;
|
|
39, // regs.p.z = (regs.a - rd) == 0;
|
|
40, // op_read(dp);
|
|
41, // op_write(dp, rd | regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x0f: return op_brk();
|
|
// void SMPcore::op_brk() {
|
|
{
|
|
42, // rd.l = op_read(0xffde);
|
|
43, // rd.h = op_read(0xffdf);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
37, // op_writesp(regs.p);
|
|
8, // regs.pc = rd;
|
|
44, // regs.p.b = 1;
|
|
45, // regs.p.i = 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x10: return op_branch(regs.p.n == 0);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
46, // if(regs.p.n != 0) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x11: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x12: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x13: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x14: return op_read_dpi<&SMPcore::op_or>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x15: return op_read_addri<&SMPcore::op_or>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x16: return op_read_addri<&SMPcore::op_or>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x17: return op_read_idpy<&SMPcore::op_or>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
17, // regs.a = op_or(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x18: return op_write_dp_const<&SMPcore::op_or>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
29, // wr = op_or(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x19: return op_write_ix_iy<&SMPcore::op_or>();
|
|
// void SMPcore::op_write_ix_iy() {
|
|
{
|
|
1, // op_io();
|
|
51, // rd = op_readdp(regs.y);
|
|
52, // wr = op_readdp(regs.x);
|
|
29, // wr = op_or(wr, rd);
|
|
53, // op_writedp(regs.x, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x1a: return op_adjust_dpw(-1);
|
|
// void SMPcore::op_adjust_dpw(signed n) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
54, // rd.w = op_readdp(dp) - 1;
|
|
55, // op_writedp(dp++, rd.l);
|
|
56, // rd.h += op_readdp(dp);
|
|
57, // op_writedp(dp++, rd.h);
|
|
58, // regs.p.n = rd & 0x8000;
|
|
59, // regs.p.z = rd == 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x1b: return op_adjust_dpx<&SMPcore::op_asl>();
|
|
// void SMPcore::op_adjust_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
34, // rd = op_asl(rd);
|
|
60, // op_writedp(dp + regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x1c: return op_adjust<&SMPcore::op_asl>(regs.a);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
61, // regs.a = op_asl(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x1d: return op_adjust<&SMPcore::op_dec>(regs.x);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
62, // regs.x = op_dec(regs.x);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x1e: return op_read_addr<&SMPcore::op_cmp>(regs.x);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
63, // regs.x = op_cmp(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x1f: return op_jmp_iaddrx();
|
|
// void SMPcore::op_jmp_iaddrx() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
64, // dp += regs.x;
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x20: return op_set_flag(regs.p.p, 0);
|
|
// void SMPcore::op_set_flag(bool &flag, bool data) {
|
|
{
|
|
1, // op_io();
|
|
65, // regs.p.p = 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x21: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x22: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x23: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x24: return op_read_dp<&SMPcore::op_and>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x25: return op_read_addr<&SMPcore::op_and>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x26: return op_read_ix<&SMPcore::op_and>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x27: return op_read_idpx<&SMPcore::op_and>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x28: return op_read_const<&SMPcore::op_and>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x29: return op_write_dp_dp<&SMPcore::op_and>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
67, // wr = op_and(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x2a: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
1, // op_io();
|
|
68, // regs.p.c |= (rd & (1 << bit)) ^ 1;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x2b: return op_adjust_dp<&SMPcore::op_rol>();
|
|
// void SMPcore::op_adjust_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
69, // rd = op_rol(rd);
|
|
35, // op_writedp(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x2c: return op_adjust_addr<&SMPcore::op_rol>();
|
|
// void SMPcore::op_adjust_addr() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
69, // rd = op_rol(rd);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x2d: return op_push(regs.a);
|
|
// void SMPcore::op_push(uint8 r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
70, // op_writesp(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x2e: return op_bne_dp();
|
|
// void SMPcore::op_bne_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
71, // if(regs.a == sp) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x2f: return op_branch(true);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x30: return op_branch(regs.p.n == 1);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
72, // if(regs.p.n != 1) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x31: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x32: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x33: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x34: return op_read_dpi<&SMPcore::op_and>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x35: return op_read_addri<&SMPcore::op_and>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x36: return op_read_addri<&SMPcore::op_and>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x37: return op_read_idpy<&SMPcore::op_and>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
66, // regs.a = op_and(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x38: return op_write_dp_const<&SMPcore::op_and>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
67, // wr = op_and(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x39: return op_write_ix_iy<&SMPcore::op_and>();
|
|
// void SMPcore::op_write_ix_iy() {
|
|
{
|
|
1, // op_io();
|
|
51, // rd = op_readdp(regs.y);
|
|
52, // wr = op_readdp(regs.x);
|
|
67, // wr = op_and(wr, rd);
|
|
53, // op_writedp(regs.x, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x3a: return op_adjust_dpw(+1);
|
|
// void SMPcore::op_adjust_dpw(signed n) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
73, // rd.w = op_readdp(dp) + 1;
|
|
55, // op_writedp(dp++, rd.l);
|
|
56, // rd.h += op_readdp(dp);
|
|
57, // op_writedp(dp++, rd.h);
|
|
58, // regs.p.n = rd & 0x8000;
|
|
59, // regs.p.z = rd == 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x3b: return op_adjust_dpx<&SMPcore::op_rol>();
|
|
// void SMPcore::op_adjust_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
69, // rd = op_rol(rd);
|
|
60, // op_writedp(dp + regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x3c: return op_adjust<&SMPcore::op_rol>(regs.a);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
74, // regs.a = op_rol(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x3d: return op_adjust<&SMPcore::op_inc>(regs.x);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
75, // regs.x = op_inc(regs.x);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x3e: return op_read_dp<&SMPcore::op_cmp>(regs.x);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
63, // regs.x = op_cmp(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x3f: return op_jsr_addr();
|
|
// void SMPcore::op_jsr_addr() {
|
|
{
|
|
76, // rd.l = op_readpc();
|
|
77, // rd.h = op_readpc();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x40: return op_set_flag(regs.p.p, 1);
|
|
// void SMPcore::op_set_flag(bool &flag, bool data) {
|
|
{
|
|
1, // op_io();
|
|
78, // regs.p.p = 1;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x41: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x42: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x43: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x44: return op_read_dp<&SMPcore::op_eor>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x45: return op_read_addr<&SMPcore::op_eor>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x46: return op_read_ix<&SMPcore::op_eor>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x47: return op_read_idpx<&SMPcore::op_eor>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x48: return op_read_const<&SMPcore::op_eor>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x49: return op_write_dp_dp<&SMPcore::op_eor>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
80, // wr = op_eor(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x4a: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
81, // regs.p.c &= (rd & (1 << bit)) ^ 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x4b: return op_adjust_dp<&SMPcore::op_lsr>();
|
|
// void SMPcore::op_adjust_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
82, // rd = op_lsr(rd);
|
|
35, // op_writedp(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x4c: return op_adjust_addr<&SMPcore::op_lsr>();
|
|
// void SMPcore::op_adjust_addr() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
82, // rd = op_lsr(rd);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x4d: return op_push(regs.x);
|
|
// void SMPcore::op_push(uint8 r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
83, // op_writesp(regs.x);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x4e: return op_test_addr(0);
|
|
// void SMPcore::op_test_addr(bool set) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
38, // regs.p.n = (regs.a - rd) & 0x80;
|
|
39, // regs.p.z = (regs.a - rd) == 0;
|
|
40, // op_read(dp);
|
|
84, // op_write(dp, rd & ~regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x4f: return op_jsp_dp();
|
|
// void SMPcore::op_jsp_dp() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
85, // regs.pc = 0xff00 | rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x50: return op_branch(regs.p.v == 0);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
86, // if(regs.p.v != 0) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x51: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x52: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x53: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x54: return op_read_dpi<&SMPcore::op_eor>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x55: return op_read_addri<&SMPcore::op_eor>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x56: return op_read_addri<&SMPcore::op_eor>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x57: return op_read_idpy<&SMPcore::op_eor>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
79, // regs.a = op_eor(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x58: return op_write_dp_const<&SMPcore::op_eor>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
80, // wr = op_eor(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x59: return op_write_ix_iy<&SMPcore::op_eor>();
|
|
// void SMPcore::op_write_ix_iy() {
|
|
{
|
|
1, // op_io();
|
|
51, // rd = op_readdp(regs.y);
|
|
52, // wr = op_readdp(regs.x);
|
|
80, // wr = op_eor(wr, rd);
|
|
53, // op_writedp(regs.x, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x5a: return op_read_dpw<&SMPcore::op_cpw>();
|
|
// void SMPcore::op_read_dpw() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
87, // rd.l = op_readdp(dp++);
|
|
88, // rd.h = op_readdp(dp++);
|
|
89, // regs.ya = op_cpw(regs.ya, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x5b: return op_adjust_dpx<&SMPcore::op_lsr>();
|
|
// void SMPcore::op_adjust_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
82, // rd = op_lsr(rd);
|
|
60, // op_writedp(dp + regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x5c: return op_adjust<&SMPcore::op_lsr>(regs.a);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
90, // regs.a = op_lsr(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x5d: return op_transfer(regs.a, regs.x);
|
|
// void SMPcore::op_transfer(uint8 &from, uint8 &to) {
|
|
{
|
|
1, // op_io();
|
|
91, // regs.x = regs.a;
|
|
92, // regs.p.n = (regs.x & 0x80);
|
|
93, // regs.p.z = (regs.x == 0);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x5e: return op_read_addr<&SMPcore::op_cmp>(regs.y);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
94, // regs.y = op_cmp(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x5f: return op_jmp_addr();
|
|
// void SMPcore::op_jmp_addr() {
|
|
{
|
|
76, // rd.l = op_readpc();
|
|
77, // rd.h = op_readpc();
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x60: return op_set_flag(regs.p.c, 0);
|
|
// void SMPcore::op_set_flag(bool &flag, bool data) {
|
|
{
|
|
1, // op_io();
|
|
95, // regs.p.c = 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x61: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x62: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x63: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x64: return op_read_dp<&SMPcore::op_cmp>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x65: return op_read_addr<&SMPcore::op_cmp>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x66: return op_read_ix<&SMPcore::op_cmp>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x67: return op_read_idpx<&SMPcore::op_cmp>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x68: return op_read_const<&SMPcore::op_cmp>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x69: return op_write_dp_dp<&SMPcore::op_cmp>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
97, // wr = op_cmp(wr, rd);
|
|
1, // op_io();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x6a: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
98, // regs.p.c &= (rd & (1 << bit)) ^ 1;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x6b: return op_adjust_dp<&SMPcore::op_ror>();
|
|
// void SMPcore::op_adjust_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
99, // rd = op_ror(rd);
|
|
35, // op_writedp(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x6c: return op_adjust_addr<&SMPcore::op_ror>();
|
|
// void SMPcore::op_adjust_addr() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
99, // rd = op_ror(rd);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x6d: return op_push(regs.y);
|
|
// void SMPcore::op_push(uint8 r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
100, // op_writesp(regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x6e: return op_bne_dpdec();
|
|
// void SMPcore::op_bne_dpdec() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
101, // op_writedp(dp, --wr);
|
|
13, // rd = op_readpc();
|
|
102, // if(wr == 0) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x6f: return op_rts();
|
|
// void SMPcore::op_rts() {
|
|
{
|
|
103, // rd.l = op_readsp();
|
|
104, // rd.h = op_readsp();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x70: return op_branch(regs.p.v == 1);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
105, // if(regs.p.v != 1) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x71: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x72: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x73: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x74: return op_read_dpi<&SMPcore::op_cmp>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x75: return op_read_addri<&SMPcore::op_cmp>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x76: return op_read_addri<&SMPcore::op_cmp>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x77: return op_read_idpy<&SMPcore::op_cmp>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
96, // regs.a = op_cmp(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x78: return op_write_dp_const<&SMPcore::op_cmp>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
97, // wr = op_cmp(wr, rd);
|
|
1, // op_io();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x79: return op_write_ix_iy<&SMPcore::op_cmp>();
|
|
// void SMPcore::op_write_ix_iy() {
|
|
{
|
|
1, // op_io();
|
|
51, // rd = op_readdp(regs.y);
|
|
52, // wr = op_readdp(regs.x);
|
|
97, // wr = op_cmp(wr, rd);
|
|
1, // op_io();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x7a: return op_read_dpw<&SMPcore::op_adw>();
|
|
// void SMPcore::op_read_dpw() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
87, // rd.l = op_readdp(dp++);
|
|
1, // op_io();
|
|
88, // rd.h = op_readdp(dp++);
|
|
106, // regs.ya = op_adw(regs.ya, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x7b: return op_adjust_dpx<&SMPcore::op_ror>();
|
|
// void SMPcore::op_adjust_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
99, // rd = op_ror(rd);
|
|
60, // op_writedp(dp + regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x7c: return op_adjust<&SMPcore::op_ror>(regs.a);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
107, // regs.a = op_ror(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x7d: return op_transfer(regs.x, regs.a);
|
|
// void SMPcore::op_transfer(uint8 &from, uint8 &to) {
|
|
{
|
|
1, // op_io();
|
|
108, // regs.a = regs.x;
|
|
109, // regs.p.n = (regs.a & 0x80);
|
|
110, // regs.p.z = (regs.a == 0);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x7e: return op_read_dp<&SMPcore::op_cmp>(regs.y);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
94, // regs.y = op_cmp(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x7f: return op_rti();
|
|
// void SMPcore::op_rti() {
|
|
{
|
|
111, // regs.p = op_readsp();
|
|
103, // rd.l = op_readsp();
|
|
104, // rd.h = op_readsp();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x80: return op_set_flag(regs.p.c, 1);
|
|
// void SMPcore::op_set_flag(bool &flag, bool data) {
|
|
{
|
|
1, // op_io();
|
|
112, // regs.p.c = 1;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x81: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x82: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x83: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x84: return op_read_dp<&SMPcore::op_adc>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x85: return op_read_addr<&SMPcore::op_adc>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x86: return op_read_ix<&SMPcore::op_adc>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x87: return op_read_idpx<&SMPcore::op_adc>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x88: return op_read_const<&SMPcore::op_adc>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x89: return op_write_dp_dp<&SMPcore::op_adc>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
114, // wr = op_adc(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x8a: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
1, // op_io();
|
|
115, // regs.p.c ^= (bool)(rd & (1 << bit));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x8b: return op_adjust_dp<&SMPcore::op_dec>();
|
|
// void SMPcore::op_adjust_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
116, // rd = op_dec(rd);
|
|
35, // op_writedp(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x8c: return op_adjust_addr<&SMPcore::op_dec>();
|
|
// void SMPcore::op_adjust_addr() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
116, // rd = op_dec(rd);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x8d: return op_read_const<&SMPcore::op_ld>(regs.y);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
117, // regs.y = op_ld(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x8e: return op_plp();
|
|
// void SMPcore::op_plp() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
111, // regs.p = op_readsp();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x8f: return op_write_dp_const<&SMPcore::op_st>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
118, // wr = op_st(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x90: return op_branch(regs.p.c == 0);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
119, // if(regs.p.c != 0) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x91: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x92: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x93: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x94: return op_read_dpi<&SMPcore::op_adc>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x95: return op_read_addri<&SMPcore::op_adc>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x96: return op_read_addri<&SMPcore::op_adc>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x97: return op_read_idpy<&SMPcore::op_adc>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
113, // regs.a = op_adc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x98: return op_write_dp_const<&SMPcore::op_adc>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
114, // wr = op_adc(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x99: return op_write_ix_iy<&SMPcore::op_adc>();
|
|
// void SMPcore::op_write_ix_iy() {
|
|
{
|
|
1, // op_io();
|
|
51, // rd = op_readdp(regs.y);
|
|
52, // wr = op_readdp(regs.x);
|
|
114, // wr = op_adc(wr, rd);
|
|
53, // op_writedp(regs.x, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x9a: return op_read_dpw<&SMPcore::op_sbw>();
|
|
// void SMPcore::op_read_dpw() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
87, // rd.l = op_readdp(dp++);
|
|
1, // op_io();
|
|
88, // rd.h = op_readdp(dp++);
|
|
120, // regs.ya = op_sbw(regs.ya, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x9b: return op_adjust_dpx<&SMPcore::op_dec>();
|
|
// void SMPcore::op_adjust_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
116, // rd = op_dec(rd);
|
|
60, // op_writedp(dp + regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x9c: return op_adjust<&SMPcore::op_dec>(regs.a);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
121, // regs.a = op_dec(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x9d: return op_transfer(regs.s, regs.x);
|
|
// void SMPcore::op_transfer(uint8 &from, uint8 &to) {
|
|
{
|
|
1, // op_io();
|
|
122, // regs.x = regs.s;
|
|
92, // regs.p.n = (regs.x & 0x80);
|
|
93, // regs.p.z = (regs.x == 0);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x9e: return op_div_ya_x();
|
|
// void SMPcore::op_div_ya_x() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
//ya = regs.ya;
|
|
////overflow set if quotient >= 256
|
|
//regs.p.v = (regs.y >= regs.x);
|
|
//regs.p.h = ((regs.y & 15) >= (regs.x & 15));
|
|
//if(regs.y < (regs.x << 1)) {
|
|
////if quotient is <= 511 (will fit into 9-bit result)
|
|
//regs.a = ya / regs.x;
|
|
//regs.y = ya % regs.x;
|
|
//} else {
|
|
////otherwise, the quotient won't fit into regs.p.v + regs.a
|
|
////this emulates the odd behavior of the S-SMP in this case
|
|
//regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x);
|
|
//regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x);
|
|
//}
|
|
////result is set based on a (quotient) only
|
|
//regs.p.n = (regs.a & 0x80);
|
|
//regs.p.z = (regs.a == 0);
|
|
123, // //!!MULTI0
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0x9f: return op_xcn();
|
|
// void SMPcore::op_xcn() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
124, // regs.a = (regs.a >> 4) | (regs.a << 4);
|
|
125, // regs.p.n = regs.a & 0x80;
|
|
126, // regs.p.z = regs.a == 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa0: return op_set_flag(regs.p.i, 1);
|
|
// void SMPcore::op_set_flag(bool &flag, bool data) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
127, // regs.p.i = 1;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa1: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa2: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa3: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa4: return op_read_dp<&SMPcore::op_sbc>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa5: return op_read_addr<&SMPcore::op_sbc>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa6: return op_read_ix<&SMPcore::op_sbc>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa7: return op_read_idpx<&SMPcore::op_sbc>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa8: return op_read_const<&SMPcore::op_sbc>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xa9: return op_write_dp_dp<&SMPcore::op_sbc>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
129, // wr = op_sbc(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xaa: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
130, // regs.p.c = (rd & (1 << bit));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xab: return op_adjust_dp<&SMPcore::op_inc>();
|
|
// void SMPcore::op_adjust_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
131, // rd = op_inc(rd);
|
|
35, // op_writedp(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xac: return op_adjust_addr<&SMPcore::op_inc>();
|
|
// void SMPcore::op_adjust_addr() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
131, // rd = op_inc(rd);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xad: return op_read_const<&SMPcore::op_cmp>(regs.y);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
94, // regs.y = op_cmp(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xae: return op_pull(regs.a);
|
|
// void SMPcore::op_pull(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
132, // regs.a = op_readsp();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xaf: return op_sta_ixinc();
|
|
// void SMPcore::op_sta_ixinc() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
133, // op_writedp(regs.x++, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb0: return op_branch(regs.p.c == 1);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
134, // if(regs.p.c != 1) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb1: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb2: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb3: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb4: return op_read_dpi<&SMPcore::op_sbc>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb5: return op_read_addri<&SMPcore::op_sbc>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb6: return op_read_addri<&SMPcore::op_sbc>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb7: return op_read_idpy<&SMPcore::op_sbc>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
128, // regs.a = op_sbc(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb8: return op_write_dp_const<&SMPcore::op_sbc>();
|
|
// void SMPcore::op_write_dp_const() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
9, // dp = op_readpc();
|
|
28, // wr = op_readdp(dp);
|
|
129, // wr = op_sbc(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xb9: return op_write_ix_iy<&SMPcore::op_sbc>();
|
|
// void SMPcore::op_write_ix_iy() {
|
|
{
|
|
1, // op_io();
|
|
51, // rd = op_readdp(regs.y);
|
|
52, // wr = op_readdp(regs.x);
|
|
129, // wr = op_sbc(wr, rd);
|
|
53, // op_writedp(regs.x, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xba: return op_read_dpw<&SMPcore::op_ldw>();
|
|
// void SMPcore::op_read_dpw() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
87, // rd.l = op_readdp(dp++);
|
|
1, // op_io();
|
|
88, // rd.h = op_readdp(dp++);
|
|
135, // regs.ya = op_ldw(regs.ya, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xbb: return op_adjust_dpx<&SMPcore::op_inc>();
|
|
// void SMPcore::op_adjust_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
131, // rd = op_inc(rd);
|
|
60, // op_writedp(dp + regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xbc: return op_adjust<&SMPcore::op_inc>(regs.a);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
136, // regs.a = op_inc(regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xbd: return op_transfer(regs.x, regs.s);
|
|
// void SMPcore::op_transfer(uint8 &from, uint8 &to) {
|
|
{
|
|
1, // op_io();
|
|
137, // regs.s = regs.x;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xbe: return op_das();
|
|
// void SMPcore::op_das() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
//if(!regs.p.c || (regs.a) > 0x99) {
|
|
//regs.a -= 0x60;
|
|
//regs.p.c = 0;
|
|
//}
|
|
//if(!regs.p.h || (regs.a & 15) > 0x09) {
|
|
//regs.a -= 0x06;
|
|
//}
|
|
//regs.p.n = (regs.a & 0x80);
|
|
//regs.p.z = (regs.a == 0);
|
|
138, // //!!MULTI1
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xbf: return op_lda_ixinc();
|
|
// void SMPcore::op_lda_ixinc() {
|
|
{
|
|
1, // op_io();
|
|
139, // regs.a = op_readdp(regs.x++);
|
|
1, // op_io();
|
|
125, // regs.p.n = regs.a & 0x80;
|
|
126, // regs.p.z = regs.a == 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc0: return op_set_flag(regs.p.i, 0);
|
|
// void SMPcore::op_set_flag(bool &flag, bool data) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
45, // regs.p.i = 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc1: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc2: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc3: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc4: return op_write_dp(regs.a);
|
|
// void SMPcore::op_write_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
140, // op_readdp(dp);
|
|
141, // op_writedp(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc5: return op_write_addr(regs.a);
|
|
// void SMPcore::op_write_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
40, // op_read(dp);
|
|
142, // op_write(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc6: return op_sta_ix();
|
|
// void SMPcore::op_sta_ix() {
|
|
{
|
|
1, // op_io();
|
|
143, // op_readdp(regs.x);
|
|
144, // op_writedp(regs.x, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc7: return op_sta_idpx();
|
|
// void SMPcore::op_sta_idpx() {
|
|
{
|
|
145, // sp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
146, // dp.l = op_readdp(sp++);
|
|
147, // dp.h = op_readdp(sp++);
|
|
40, // op_read(dp);
|
|
142, // op_write(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc8: return op_read_const<&SMPcore::op_cmp>(regs.x);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
63, // regs.x = op_cmp(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xc9: return op_write_addr(regs.x);
|
|
// void SMPcore::op_write_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
40, // op_read(dp);
|
|
148, // op_write(dp, regs.x);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xca: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
1, // op_io();
|
|
149, // rd = (rd & ~(1 << bit)) | (regs.p.c << bit);
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xcb: return op_write_dp(regs.y);
|
|
// void SMPcore::op_write_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
140, // op_readdp(dp);
|
|
150, // op_writedp(dp, regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xcc: return op_write_addr(regs.y);
|
|
// void SMPcore::op_write_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
40, // op_read(dp);
|
|
151, // op_write(dp, regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xcd: return op_read_const<&SMPcore::op_ld>(regs.x);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
152, // regs.x = op_ld(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xce: return op_pull(regs.x);
|
|
// void SMPcore::op_pull(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
153, // regs.x = op_readsp();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xcf: return op_mul_ya();
|
|
// void SMPcore::op_mul_ya() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
//ya = regs.y * regs.a;
|
|
//regs.a = ya;
|
|
//regs.y = ya >> 8;
|
|
////result is set based on y (high-byte) only
|
|
//regs.p.n = (regs.y & 0x80);
|
|
//regs.p.z = (regs.y == 0);
|
|
154, // //!!MULTI2
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd0: return op_branch(regs.p.z == 0);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
155, // if(regs.p.z != 0) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd1: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd2: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd3: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd4: return op_write_dpi(regs.a, regs.x);
|
|
// void SMPcore::op_write_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
140, // op_readdp(dp);
|
|
141, // op_writedp(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd5: return op_write_addri(regs.x);
|
|
// void SMPcore::op_write_addri(uint8 &i) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
64, // dp += regs.x;
|
|
40, // op_read(dp);
|
|
142, // op_write(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd6: return op_write_addri(regs.y);
|
|
// void SMPcore::op_write_addri(uint8 &i) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
156, // dp += regs.y;
|
|
40, // op_read(dp);
|
|
142, // op_write(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd7: return op_sta_idpy();
|
|
// void SMPcore::op_sta_idpy() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
146, // dp.l = op_readdp(sp++);
|
|
147, // dp.h = op_readdp(sp++);
|
|
1, // op_io();
|
|
156, // dp += regs.y;
|
|
40, // op_read(dp);
|
|
142, // op_write(dp, regs.a);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd8: return op_write_dp(regs.x);
|
|
// void SMPcore::op_write_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
140, // op_readdp(dp);
|
|
157, // op_writedp(dp, regs.x);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xd9: return op_write_dpi(regs.x, regs.y);
|
|
// void SMPcore::op_write_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
158, // dp = op_readpc() + regs.y;
|
|
1, // op_io();
|
|
140, // op_readdp(dp);
|
|
157, // op_writedp(dp, regs.x);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xda: return op_stw_dp();
|
|
// void SMPcore::op_stw_dp() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
140, // op_readdp(dp);
|
|
159, // op_writedp(dp++, regs.a);
|
|
160, // op_writedp(dp++, regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xdb: return op_write_dpi(regs.y, regs.x);
|
|
// void SMPcore::op_write_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
140, // op_readdp(dp);
|
|
150, // op_writedp(dp, regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xdc: return op_adjust<&SMPcore::op_dec>(regs.y);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
161, // regs.y = op_dec(regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xdd: return op_transfer(regs.y, regs.a);
|
|
// void SMPcore::op_transfer(uint8 &from, uint8 &to) {
|
|
{
|
|
1, // op_io();
|
|
162, // regs.a = regs.y;
|
|
109, // regs.p.n = (regs.a & 0x80);
|
|
110, // regs.p.z = (regs.a == 0);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xde: return op_bne_dpx();
|
|
// void SMPcore::op_bne_dpx() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
163, // sp = op_readdp(dp + regs.x);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
71, // if(regs.a == sp) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xdf: return op_daa();
|
|
// void SMPcore::op_daa() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
//if(regs.p.c || (regs.a) > 0x99) {
|
|
//regs.a += 0x60;
|
|
//regs.p.c = 1;
|
|
//}
|
|
//if(regs.p.h || (regs.a & 15) > 0x09) {
|
|
//regs.a += 0x06;
|
|
//}
|
|
//regs.p.n = (regs.a & 0x80);
|
|
//regs.p.z = (regs.a == 0);
|
|
164, // //!!MULTI3
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe0: return op_clv();
|
|
// void SMPcore::op_clv() {
|
|
{
|
|
1, // op_io();
|
|
165, // regs.p.v = 0;
|
|
166, // regs.p.h = 0;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe1: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe2: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe3: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe4: return op_read_dp<&SMPcore::op_ld>(regs.a);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe5: return op_read_addr<&SMPcore::op_ld>(regs.a);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe6: return op_read_ix<&SMPcore::op_ld>();
|
|
// void SMPcore::op_read_ix() {
|
|
{
|
|
1, // op_io();
|
|
21, // rd = op_readdp(regs.x);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe7: return op_read_idpx<&SMPcore::op_ld>();
|
|
// void SMPcore::op_read_idpx() {
|
|
{
|
|
22, // dp = op_readpc() + regs.x;
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
25, // rd = op_read(sp);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe8: return op_read_const<&SMPcore::op_ld>(regs.a);
|
|
// void SMPcore::op_read_const(uint8 &r) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xe9: return op_read_addr<&SMPcore::op_ld>(regs.x);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
152, // regs.x = op_ld(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xea: return op_set_addr_bit();
|
|
// void SMPcore::op_set_addr_bit() {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
31, // bit = dp >> 13;
|
|
32, // dp &= 0x1fff;
|
|
20, // rd = op_read(dp);
|
|
168, // rd ^= 1 << bit;
|
|
36, // op_write(dp, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xeb: return op_read_dp<&SMPcore::op_ld>(regs.y);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
117, // regs.y = op_ld(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xec: return op_read_addr<&SMPcore::op_ld>(regs.y);
|
|
// void SMPcore::op_read_addr(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
20, // rd = op_read(dp);
|
|
117, // regs.y = op_ld(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xed: return op_cmc();
|
|
// void SMPcore::op_cmc() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
169, // regs.p.c = !regs.p.c;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xee: return op_pull(regs.y);
|
|
// void SMPcore::op_pull(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
170, // regs.y = op_readsp();
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xef: return op_wait();
|
|
// void SMPcore::op_wait() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
171, // //!!REPEAT
|
|
},
|
|
// case 0xf0: return op_branch(regs.p.z == 1);
|
|
// void SMPcore::op_branch(bool condition) {
|
|
{
|
|
13, // rd = op_readpc();
|
|
172, // if(regs.p.z != 1) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf1: return op_jst();
|
|
// void SMPcore::op_jst() {
|
|
{
|
|
3, // dp = 0xffde - ((opcode >> 4) << 1);
|
|
4, // rd.l = op_read(dp++);
|
|
5, // rd.h = op_read(dp++);
|
|
1, // op_io();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
6, // op_writesp(regs.pc.h);
|
|
7, // op_writesp(regs.pc.l);
|
|
8, // regs.pc = rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf2: return op_set_bit();
|
|
// void SMPcore::op_set_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
10, // rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
11, // op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf3: return op_branch_bit();
|
|
// void SMPcore::op_branch_bit() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
12, // sp = op_readdp(dp);
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
14, // if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf4: return op_read_dpi<&SMPcore::op_ld>(regs.a, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf5: return op_read_addri<&SMPcore::op_ld>(regs.x);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
48, // rd = op_read(dp + regs.x);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf6: return op_read_addri<&SMPcore::op_ld>(regs.y);
|
|
// void SMPcore::op_read_addri(uint8 &r) {
|
|
{
|
|
18, // dp.l = op_readpc();
|
|
19, // dp.h = op_readpc();
|
|
1, // op_io();
|
|
49, // rd = op_read(dp + regs.y);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf7: return op_read_idpy<&SMPcore::op_ld>();
|
|
// void SMPcore::op_read_idpy() {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
23, // sp.l = op_readdp(dp++);
|
|
24, // sp.h = op_readdp(dp++);
|
|
50, // rd = op_read(sp + regs.y);
|
|
167, // regs.a = op_ld(regs.a, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf8: return op_read_dp<&SMPcore::op_ld>(regs.x);
|
|
// void SMPcore::op_read_dp(uint8 &r) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
16, // rd = op_readdp(dp);
|
|
152, // regs.x = op_ld(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xf9: return op_read_dpi<&SMPcore::op_ld>(regs.x, regs.y);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
173, // rd = op_readdp(dp + regs.y);
|
|
152, // regs.x = op_ld(regs.x, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xfa: return op_write_dp_dp<&SMPcore::op_st>();
|
|
// void SMPcore::op_write_dp_dp() {
|
|
{
|
|
26, // sp = op_readpc();
|
|
27, // rd = op_readdp(sp);
|
|
9, // dp = op_readpc();
|
|
118, // wr = op_st(wr, rd);
|
|
30, // op_writedp(dp, wr);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xfb: return op_read_dpi<&SMPcore::op_ld>(regs.y, regs.x);
|
|
// void SMPcore::op_read_dpi(uint8 &r, uint8 &i) {
|
|
{
|
|
9, // dp = op_readpc();
|
|
1, // op_io();
|
|
47, // rd = op_readdp(dp + regs.x);
|
|
117, // regs.y = op_ld(regs.y, rd);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xfc: return op_adjust<&SMPcore::op_inc>(regs.y);
|
|
// void SMPcore::op_adjust(uint8 &r) {
|
|
{
|
|
1, // op_io();
|
|
174, // regs.y = op_inc(regs.y);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xfd: return op_transfer(regs.a, regs.y);
|
|
// void SMPcore::op_transfer(uint8 &from, uint8 &to) {
|
|
{
|
|
1, // op_io();
|
|
175, // regs.y = regs.a;
|
|
176, // regs.p.n = (regs.y & 0x80);
|
|
177, // regs.p.z = (regs.y == 0);
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xfe: return op_bne_ydec();
|
|
// void SMPcore::op_bne_ydec() {
|
|
{
|
|
13, // rd = op_readpc();
|
|
1, // op_io();
|
|
1, // op_io();
|
|
178, // if(--regs.y == 0) return;
|
|
1, // op_io();
|
|
1, // op_io();
|
|
15, // regs.pc += (int8)rd;
|
|
2, // //!!NEXT
|
|
},
|
|
// case 0xff: return op_wait();
|
|
// void SMPcore::op_wait() {
|
|
{
|
|
1, // op_io();
|
|
1, // op_io();
|
|
171, // //!!REPEAT
|
|
},
|
|
|
|
}; // const int uoptable[][] = {
|
|
|
|
|
|
|
|
|
|
void SMPcore::op_step()
|
|
{
|
|
switch (uoptable[opcode][uindex])
|
|
{
|
|
case 1:
|
|
op_io();
|
|
break;
|
|
case 2:
|
|
op_next();//!!NEXT
|
|
break;
|
|
case 3:
|
|
dp = 0xffde - ((opcode >> 4) << 1);
|
|
break;
|
|
case 4:
|
|
rd.l = op_read(dp++);
|
|
break;
|
|
case 5:
|
|
rd.h = op_read(dp++);
|
|
break;
|
|
case 6:
|
|
op_writesp(regs.pc.h);
|
|
break;
|
|
case 7:
|
|
op_writesp(regs.pc.l);
|
|
break;
|
|
case 8:
|
|
regs.pc = rd;
|
|
break;
|
|
case 9:
|
|
dp = op_readpc();
|
|
break;
|
|
case 10:
|
|
rd = op_readdp(dp) & ~(1 << (opcode >> 5));
|
|
break;
|
|
case 11:
|
|
op_writedp(dp, rd | (!(opcode & 0x10) << (opcode >> 5)));
|
|
break;
|
|
case 12:
|
|
sp = op_readdp(dp);
|
|
break;
|
|
case 13:
|
|
rd = op_readpc();
|
|
break;
|
|
case 14:
|
|
if((bool)(sp & (1 << (opcode >> 5))) == (bool)(opcode & 0x10)) op_next();
|
|
break;
|
|
case 15:
|
|
regs.pc += (int8)rd;
|
|
break;
|
|
case 16:
|
|
rd = op_readdp(dp);
|
|
break;
|
|
case 17:
|
|
regs.a = op_or(regs.a, rd);
|
|
break;
|
|
case 18:
|
|
dp.l = op_readpc();
|
|
break;
|
|
case 19:
|
|
dp.h = op_readpc();
|
|
break;
|
|
case 20:
|
|
rd = op_read(dp);
|
|
break;
|
|
case 21:
|
|
rd = op_readdp(regs.x);
|
|
break;
|
|
case 22:
|
|
dp = op_readpc() + regs.x;
|
|
break;
|
|
case 23:
|
|
sp.l = op_readdp(dp++);
|
|
break;
|
|
case 24:
|
|
sp.h = op_readdp(dp++);
|
|
break;
|
|
case 25:
|
|
rd = op_read(sp);
|
|
break;
|
|
case 26:
|
|
sp = op_readpc();
|
|
break;
|
|
case 27:
|
|
rd = op_readdp(sp);
|
|
break;
|
|
case 28:
|
|
wr = op_readdp(dp);
|
|
break;
|
|
case 29:
|
|
wr = op_or(wr, rd);
|
|
break;
|
|
case 30:
|
|
op_writedp(dp, wr);
|
|
break;
|
|
case 31:
|
|
bit = dp >> 13;
|
|
break;
|
|
case 32:
|
|
dp &= 0x1fff;
|
|
break;
|
|
case 33:
|
|
regs.p.c |= (rd & (1 << bit)) ^ 0;
|
|
break;
|
|
case 34:
|
|
rd = op_asl(rd);
|
|
break;
|
|
case 35:
|
|
op_writedp(dp, rd);
|
|
break;
|
|
case 36:
|
|
op_write(dp, rd);
|
|
break;
|
|
case 37:
|
|
op_writesp(regs.p);
|
|
break;
|
|
case 38:
|
|
regs.p.n = (regs.a - rd) & 0x80;
|
|
break;
|
|
case 39:
|
|
regs.p.z = (regs.a - rd) == 0;
|
|
break;
|
|
case 40:
|
|
op_read(dp);
|
|
break;
|
|
case 41:
|
|
op_write(dp, rd | regs.a);
|
|
break;
|
|
case 42:
|
|
rd.l = op_read(0xffde);
|
|
break;
|
|
case 43:
|
|
rd.h = op_read(0xffdf);
|
|
break;
|
|
case 44:
|
|
regs.p.b = 1;
|
|
break;
|
|
case 45:
|
|
regs.p.i = 0;
|
|
break;
|
|
case 46:
|
|
if(regs.p.n != 0) op_next();
|
|
break;
|
|
case 47:
|
|
rd = op_readdp(dp + regs.x);
|
|
break;
|
|
case 48:
|
|
rd = op_read(dp + regs.x);
|
|
break;
|
|
case 49:
|
|
rd = op_read(dp + regs.y);
|
|
break;
|
|
case 50:
|
|
rd = op_read(sp + regs.y);
|
|
break;
|
|
case 51:
|
|
rd = op_readdp(regs.y);
|
|
break;
|
|
case 52:
|
|
wr = op_readdp(regs.x);
|
|
break;
|
|
case 53:
|
|
op_writedp(regs.x, wr);
|
|
break;
|
|
case 54:
|
|
rd.w = op_readdp(dp) - 1;
|
|
break;
|
|
case 55:
|
|
op_writedp(dp++, rd.l);
|
|
break;
|
|
case 56:
|
|
rd.h += op_readdp(dp);
|
|
break;
|
|
case 57:
|
|
op_writedp(dp++, rd.h);
|
|
break;
|
|
case 58:
|
|
regs.p.n = rd & 0x8000;
|
|
break;
|
|
case 59:
|
|
regs.p.z = rd == 0;
|
|
break;
|
|
case 60:
|
|
op_writedp(dp + regs.x, rd);
|
|
break;
|
|
case 61:
|
|
regs.a = op_asl(regs.a);
|
|
break;
|
|
case 62:
|
|
regs.x = op_dec(regs.x);
|
|
break;
|
|
case 63:
|
|
regs.x = op_cmp(regs.x, rd);
|
|
break;
|
|
case 64:
|
|
dp += regs.x;
|
|
break;
|
|
case 65:
|
|
regs.p.p = 0;
|
|
break;
|
|
case 66:
|
|
regs.a = op_and(regs.a, rd);
|
|
break;
|
|
case 67:
|
|
wr = op_and(wr, rd);
|
|
break;
|
|
case 68:
|
|
regs.p.c |= (rd & (1 << bit)) ^ 1;
|
|
break;
|
|
case 69:
|
|
rd = op_rol(rd);
|
|
break;
|
|
case 70:
|
|
op_writesp(regs.a);
|
|
break;
|
|
case 71:
|
|
if(regs.a == sp) op_next();
|
|
break;
|
|
case 72:
|
|
if(regs.p.n != 1) op_next();
|
|
break;
|
|
case 73:
|
|
rd.w = op_readdp(dp) + 1;
|
|
break;
|
|
case 74:
|
|
regs.a = op_rol(regs.a);
|
|
break;
|
|
case 75:
|
|
regs.x = op_inc(regs.x);
|
|
break;
|
|
case 76:
|
|
rd.l = op_readpc();
|
|
break;
|
|
case 77:
|
|
rd.h = op_readpc();
|
|
break;
|
|
case 78:
|
|
regs.p.p = 1;
|
|
break;
|
|
case 79:
|
|
regs.a = op_eor(regs.a, rd);
|
|
break;
|
|
case 80:
|
|
wr = op_eor(wr, rd);
|
|
break;
|
|
case 81:
|
|
regs.p.c &= (rd & (1 << bit)) ^ 0;
|
|
break;
|
|
case 82:
|
|
rd = op_lsr(rd);
|
|
break;
|
|
case 83:
|
|
op_writesp(regs.x);
|
|
break;
|
|
case 84:
|
|
op_write(dp, rd & ~regs.a);
|
|
break;
|
|
case 85:
|
|
regs.pc = 0xff00 | rd;
|
|
break;
|
|
case 86:
|
|
if(regs.p.v != 0) op_next();
|
|
break;
|
|
case 87:
|
|
rd.l = op_readdp(dp++);
|
|
break;
|
|
case 88:
|
|
rd.h = op_readdp(dp++);
|
|
break;
|
|
case 89:
|
|
regs.ya = op_cpw(regs.ya, rd);
|
|
break;
|
|
case 90:
|
|
regs.a = op_lsr(regs.a);
|
|
break;
|
|
case 91:
|
|
regs.x = regs.a;
|
|
break;
|
|
case 92:
|
|
regs.p.n = (regs.x & 0x80);
|
|
break;
|
|
case 93:
|
|
regs.p.z = (regs.x == 0);
|
|
break;
|
|
case 94:
|
|
regs.y = op_cmp(regs.y, rd);
|
|
break;
|
|
case 95:
|
|
regs.p.c = 0;
|
|
break;
|
|
case 96:
|
|
regs.a = op_cmp(regs.a, rd);
|
|
break;
|
|
case 97:
|
|
wr = op_cmp(wr, rd);
|
|
break;
|
|
case 98:
|
|
regs.p.c &= (rd & (1 << bit)) ^ 1;
|
|
break;
|
|
case 99:
|
|
rd = op_ror(rd);
|
|
break;
|
|
case 100:
|
|
op_writesp(regs.y);
|
|
break;
|
|
case 101:
|
|
op_writedp(dp, --wr);
|
|
break;
|
|
case 102:
|
|
if(wr == 0) op_next();
|
|
break;
|
|
case 103:
|
|
rd.l = op_readsp();
|
|
break;
|
|
case 104:
|
|
rd.h = op_readsp();
|
|
break;
|
|
case 105:
|
|
if(regs.p.v != 1) op_next();
|
|
break;
|
|
case 106:
|
|
regs.ya = op_adw(regs.ya, rd);
|
|
break;
|
|
case 107:
|
|
regs.a = op_ror(regs.a);
|
|
break;
|
|
case 108:
|
|
regs.a = regs.x;
|
|
break;
|
|
case 109:
|
|
regs.p.n = (regs.a & 0x80);
|
|
break;
|
|
case 110:
|
|
regs.p.z = (regs.a == 0);
|
|
break;
|
|
case 111:
|
|
regs.p = op_readsp();
|
|
break;
|
|
case 112:
|
|
regs.p.c = 1;
|
|
break;
|
|
case 113:
|
|
regs.a = op_adc(regs.a, rd);
|
|
break;
|
|
case 114:
|
|
wr = op_adc(wr, rd);
|
|
break;
|
|
case 115:
|
|
regs.p.c ^= (bool)(rd & (1 << bit));
|
|
break;
|
|
case 116:
|
|
rd = op_dec(rd);
|
|
break;
|
|
case 117:
|
|
regs.y = op_ld(regs.y, rd);
|
|
break;
|
|
case 118:
|
|
wr = op_st(wr, rd);
|
|
break;
|
|
case 119:
|
|
if(regs.p.c != 0) op_next();
|
|
break;
|
|
case 120:
|
|
regs.ya = op_sbw(regs.ya, rd);
|
|
break;
|
|
case 121:
|
|
regs.a = op_dec(regs.a);
|
|
break;
|
|
case 122:
|
|
regs.x = regs.s;
|
|
break;
|
|
case 123:
|
|
//!!MULTI0
|
|
ya = regs.ya;
|
|
//overflow set if quotient >= 256
|
|
regs.p.v = (regs.y >= regs.x);
|
|
regs.p.h = ((regs.y & 15) >= (regs.x & 15));
|
|
if(regs.y < (regs.x << 1)) {
|
|
//if quotient is <= 511 (will fit into 9-bit result)
|
|
regs.a = ya / regs.x;
|
|
regs.y = ya % regs.x;
|
|
} else {
|
|
//otherwise, the quotient won't fit into regs.p.v + regs.a
|
|
//this emulates the odd behavior of the S-SMP in this case
|
|
regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x);
|
|
regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x);
|
|
}
|
|
//result is set based on a (quotient) only
|
|
regs.p.n = (regs.a & 0x80);
|
|
regs.p.z = (regs.a == 0);
|
|
break;
|
|
case 124:
|
|
regs.a = (regs.a >> 4) | (regs.a << 4);
|
|
break;
|
|
case 125:
|
|
regs.p.n = regs.a & 0x80;
|
|
break;
|
|
case 126:
|
|
regs.p.z = regs.a == 0;
|
|
break;
|
|
case 127:
|
|
regs.p.i = 1;
|
|
break;
|
|
case 128:
|
|
regs.a = op_sbc(regs.a, rd);
|
|
break;
|
|
case 129:
|
|
wr = op_sbc(wr, rd);
|
|
break;
|
|
case 130:
|
|
regs.p.c = (rd & (1 << bit));
|
|
break;
|
|
case 131:
|
|
rd = op_inc(rd);
|
|
break;
|
|
case 132:
|
|
regs.a = op_readsp();
|
|
break;
|
|
case 133:
|
|
op_writedp(regs.x++, regs.a);
|
|
break;
|
|
case 134:
|
|
if(regs.p.c != 1) op_next();
|
|
break;
|
|
case 135:
|
|
regs.ya = op_ldw(regs.ya, rd);
|
|
break;
|
|
case 136:
|
|
regs.a = op_inc(regs.a);
|
|
break;
|
|
case 137:
|
|
regs.s = regs.x;
|
|
break;
|
|
case 138:
|
|
//!!MULTI1
|
|
if(!regs.p.c || (regs.a) > 0x99) {
|
|
regs.a -= 0x60;
|
|
regs.p.c = 0;
|
|
}
|
|
if(!regs.p.h || (regs.a & 15) > 0x09) {
|
|
regs.a -= 0x06;
|
|
}
|
|
regs.p.n = (regs.a & 0x80);
|
|
regs.p.z = (regs.a == 0);
|
|
break;
|
|
case 139:
|
|
regs.a = op_readdp(regs.x++);
|
|
break;
|
|
case 140:
|
|
op_readdp(dp);
|
|
break;
|
|
case 141:
|
|
op_writedp(dp, regs.a);
|
|
break;
|
|
case 142:
|
|
op_write(dp, regs.a);
|
|
break;
|
|
case 143:
|
|
op_readdp(regs.x);
|
|
break;
|
|
case 144:
|
|
op_writedp(regs.x, regs.a);
|
|
break;
|
|
case 145:
|
|
sp = op_readpc() + regs.x;
|
|
break;
|
|
case 146:
|
|
dp.l = op_readdp(sp++);
|
|
break;
|
|
case 147:
|
|
dp.h = op_readdp(sp++);
|
|
break;
|
|
case 148:
|
|
op_write(dp, regs.x);
|
|
break;
|
|
case 149:
|
|
rd = (rd & ~(1 << bit)) | (regs.p.c << bit);
|
|
break;
|
|
case 150:
|
|
op_writedp(dp, regs.y);
|
|
break;
|
|
case 151:
|
|
op_write(dp, regs.y);
|
|
break;
|
|
case 152:
|
|
regs.x = op_ld(regs.x, rd);
|
|
break;
|
|
case 153:
|
|
regs.x = op_readsp();
|
|
break;
|
|
case 154:
|
|
//!!MULTI2
|
|
ya = regs.y * regs.a;
|
|
regs.a = ya;
|
|
regs.y = ya >> 8;
|
|
//result is set based on y (high-byte) only
|
|
regs.p.n = (regs.y & 0x80);
|
|
regs.p.z = (regs.y == 0);
|
|
break;
|
|
case 155:
|
|
if(regs.p.z != 0) op_next();
|
|
break;
|
|
case 156:
|
|
dp += regs.y;
|
|
break;
|
|
case 157:
|
|
op_writedp(dp, regs.x);
|
|
break;
|
|
case 158:
|
|
dp = op_readpc() + regs.y;
|
|
break;
|
|
case 159:
|
|
op_writedp(dp++, regs.a);
|
|
break;
|
|
case 160:
|
|
op_writedp(dp++, regs.y);
|
|
break;
|
|
case 161:
|
|
regs.y = op_dec(regs.y);
|
|
break;
|
|
case 162:
|
|
regs.a = regs.y;
|
|
break;
|
|
case 163:
|
|
sp = op_readdp(dp + regs.x);
|
|
break;
|
|
case 164:
|
|
//!!MULTI3
|
|
if(regs.p.c || (regs.a) > 0x99) {
|
|
regs.a += 0x60;
|
|
regs.p.c = 1;
|
|
}
|
|
if(regs.p.h || (regs.a & 15) > 0x09) {
|
|
regs.a += 0x06;
|
|
}
|
|
regs.p.n = (regs.a & 0x80);
|
|
regs.p.z = (regs.a == 0);
|
|
break;
|
|
case 165:
|
|
regs.p.v = 0;
|
|
break;
|
|
case 166:
|
|
regs.p.h = 0;
|
|
break;
|
|
case 167:
|
|
regs.a = op_ld(regs.a, rd);
|
|
break;
|
|
case 168:
|
|
rd ^= 1 << bit;
|
|
break;
|
|
case 169:
|
|
regs.p.c = !regs.p.c;
|
|
break;
|
|
case 170:
|
|
regs.y = op_readsp();
|
|
break;
|
|
case 171:
|
|
uindex = -1; //!!REPEAT
|
|
break;
|
|
case 172:
|
|
if(regs.p.z != 1) op_next();
|
|
break;
|
|
case 173:
|
|
rd = op_readdp(dp + regs.y);
|
|
break;
|
|
case 174:
|
|
regs.y = op_inc(regs.y);
|
|
break;
|
|
case 175:
|
|
regs.y = regs.a;
|
|
break;
|
|
case 176:
|
|
regs.p.n = (regs.y & 0x80);
|
|
break;
|
|
case 177:
|
|
regs.p.z = (regs.y == 0);
|
|
break;
|
|
case 178:
|
|
if(--regs.y == 0) op_next();
|
|
break;
|
|
}
|
|
uindex++;
|
|
}
|