m68kdecode
Version:
Port of deplinenoise/m68kdecode to Typescript
541 lines (403 loc) • 34.4 kB
Plain Text
#====================================================================================================
# Group 0000: Bit manipulation, MOVEP, Immediate
#====================================================================================================
ANDITOCCR 0000_0010_0011_1100 size=1; src=cs.imm8(); dst=Implied();
ANDITOSR 0000_0010_0111_1100 size=2; src=cs.imm16(); dst=Implied();
EORITOCCR 0000_1010_0011_1100 size=1; src=cs.imm8(); dst=Implied();
EORITOSR 0000_1010_0111_1100 size=2; src=cs.imm16(); dst=Implied();
ORITOCCR 0000_0000_0011_1100 size=1; src=cs.imm8(); dst=Implied();
ORITOSR 0000_0000_0111_1100 size=2; src=cs.imm16(); dst=Implied();
# Note: bit eight being 1 here allows these to be check before all else
# Note: for movep bits 5-3, specify a mode An, which all the other
# bit 8 set commands do not, so have check first.
MOVEP 0000_ddd1_0s00_1aaa size=1<<(s+1); src=ARDISP(a, simpleDisp(i16(cs.pull16()))); dst=DR(d);
MOVEP 0000_ddd1_1s00_1aaa size=1<<(s+1); src=DR(d); dst=ARDISP(a, simpleDisp(i16(cs.pull16())));
BTST 0000_ddd1_00mm_mrrr size=m?1:4; src=DR(d); dst=cs.ea(r, m, 2);
BCHG 0000_ddd1_01mm_mrrr size=m?1:4; src=DR(d); dst=cs.ea(r, m, 4);
BCLR 0000_ddd1_10mm_mrrr size=m?1:4; src=DR(d); dst=cs.ea(r, m, 4);
BSET 0000_ddd1_11mm_mrrr size=m?1:4; src=DR(d); dst=cs.ea(r, m, 4);
BTST 0000_1000_00mm_mrrr 0000_000n_nnnn_nnnn size=m?1:4; src=IMM16(n); dst=cs.ea(r, m, 1);
BCHG 0000_1000_01mm_mrrr 0000_000n_nnnn_nnnn size=m?1:4; src=IMM16(n); dst=cs.ea(r, m, 1);
BCLR 0000_1000_10mm_mrrr 0000_000n_nnnn_nnnn size=m?1:4; src=IMM16(n); dst=cs.ea(r, m, 1);
BSET 0000_1000_11mm_mrrr 0000_000n_nnnn_nnnn size=m?1:4; src=IMM16(n); dst=cs.ea(r, m, 1);
RTM 0000_0110_1100_drrr size=0; src=cs.dar(d, r); dst=null;
CALLM 0000_0110_11mm_mrrr size=0; src=cs.imm8() ; dst=cs.ea(r, m, 0);
ADDI 0000_0110_00mm_mrrr size=1; src=cs.imm8() ; dst=cs.ea(r, m, 1);
ADDI 0000_0110_01mm_mrrr size=2; src=cs.imm16(); dst=cs.ea(r, m, 2);
ADDI 0000_0110_10mm_mrrr size=4; src=cs.imm32(); dst=cs.ea(r, m, 4);
SUBI 0000_0100_00mm_mrrr size=1; src=cs.imm8() ; dst=cs.ea(r, m, 1);
SUBI 0000_0100_01mm_mrrr size=2; src=cs.imm16(); dst=cs.ea(r, m, 2);
SUBI 0000_0100_10mm_mrrr size=4; src=cs.imm32(); dst=cs.ea(r, m, 4);
ANDI 0000_0010_00mm_mrrr size=1; src=cs.imm8() ; dst=cs.ea(r, m, 1);
ANDI 0000_0010_01mm_mrrr size=2; src=cs.imm16(); dst=cs.ea(r, m, 2);
ANDI 0000_0010_10mm_mrrr size=4; src=cs.imm32(); dst=cs.ea(r, m, 4);
ORI 0000_0000_00mm_mrrr size=1; src=cs.imm8() ; dst=cs.ea(r, m, 1);
ORI 0000_0000_01mm_mrrr size=2; src=cs.imm16(); dst=cs.ea(r, m, 2);
ORI 0000_0000_10mm_mrrr size=4; src=cs.imm32(); dst=cs.ea(r, m, 4);
CMP2 0000_0ss0_11mm_mrrr addd_0000_0000_0000 size=1 << s; src=cs.ea(r, m, size); dst=cs.dar(a, d);
CHK2 0000_0ss0_11mm_mrrr addd_1000_0000_0000 size=1 << s; src=cs.ea(r, m, size); dst=cs.dar(a, d);
EORI 0000_1010_00mm_mrrr size=1; src=cs.imm8(); dst=cs.ea(r, m, 1);
EORI 0000_1010_01mm_mrrr size=2; src=cs.imm16(); dst=cs.ea(r, m, 2);
EORI 0000_1010_10mm_mrrr size=4; src=cs.imm32(); dst=cs.ea(r, m, 4);
CMPI 0000_1100_00mm_mrrr size=1; src=cs.imm8(); dst=cs.ea(r, m, 1);
CMPI 0000_1100_01mm_mrrr size=2; src=cs.imm16(); dst=cs.ea(r, m, 2);
CMPI 0000_1100_10mm_mrrr size=4; src=cs.imm32(); dst=cs.ea(r, m, 4);
MOVES 0000_1110_00mm_mrrr addd_0000_0000_0000 size=1; dst=cs.dar(a, d); src=cs.ea(r, m, 1);
MOVES 0000_1110_01mm_mrrr addd_0000_0000_0000 size=2; dst=cs.dar(a, d); src=cs.ea(r, m, 2);
MOVES 0000_1110_10mm_mrrr addd_0000_0000_0000 size=4; dst=cs.dar(a, d); src=cs.ea(r, m, 4);
MOVES 0000_1110_00mm_mrrr addd_1000_0000_0000 size=1; src=cs.dar(a, d); dst=cs.ea(r, m, 1);
MOVES 0000_1110_01mm_mrrr addd_1000_0000_0000 size=2; src=cs.dar(a, d); dst=cs.ea(r, m, 2);
MOVES 0000_1110_10mm_mrrr addd_1000_0000_0000 size=4; src=cs.dar(a, d); dst=cs.ea(r, m, 4);
# Not handling CAS2 right now because it's a little crazy and doesn't work on an Amiga anyway due to the multiple bus transactions
#CAS2 0000_11s0_1111_1100 Aaaa_000b_bb00_0ccc Dddd_000e_ee00_0fff return special_cas2(s << 1, A, a, b, c, D, d, e, f)
RTM 0000_0110_1100_arrr size=0; src=cs.dar(a,r); dst=null;
#====================================================================================================
# Group 0001: Move byte
#====================================================================================================
MOVE 0001_RRRM_MMmm_mrrr size=1; src=cs.ea(r, m, 1); dst=cs.ea(R, M, 1);
#====================================================================================================
# Group 0010: Move word
#====================================================================================================
MOVEA 0010_RRR0_01mm_mrrr size=4; src=cs.ea(r, m, 4); dst=cs.ea(R, 0b001, 4);
MOVE 0010_RRRM_MMmm_mrrr size=4; src=cs.ea(r, m, 4); dst=cs.ea(R, M, 4);
#====================================================================================================
# Group 0011: Move Long
#====================================================================================================
MOVEA 0011_RRR0_01mm_mrrr size=2; src=cs.ea(r, m, 2); dst=cs.ea(R, 0b001, 2);
MOVE 0011_RRRM_MMmm_mrrr size=2; src=cs.ea(r, m, 2); dst=cs.ea(R, M, 2);
#====================================================================================================
# Group 0100: Miscellaneous
#====================================================================================================
BGND 0100_1010_1111_1010 size=0; src=null; dst=null;
ILLEGAL 0100_1010_1111_1100 size=0; src=null; dst=null;
NOP 0100_1110_0111_0001 size=0; src=null; dst=null;
RESET 0100_1110_0111_0000 size=0; src=null; dst=null;
RTD 0100_1110_0111_0100 size=0; src=cs.imm16(); dst=null;
RTE 0100_1110_0111_0011 size=0; src=null; dst=null;
RTR 0100_1110_0111_0111 size=0; src=null; dst=null;
RTS 0100_1110_0111_0101 size=0; src=null; dst=null;
STOP 0100_1110_0111_0010 size=0; src=cs.imm16(); dst=null;
TRAPV 0100_1110_0111_0110 size=0; src=null; dst=null;
MOVEC 0100_1110_0111_1010 arrr_cccc_cccc_cccc size=4; src=CONTROLREG(c); dst=cs.dar(a, r);
MOVEC 0100_1110_0111_1011 arrr_cccc_cccc_cccc size=4; src=cs.dar(a, r); dst=CONTROLREG(c);
SWAP 0100_1000_0100_0rrr size=0; src=DR(r); dst=null;
BKPT 0100_1000_0100_1nnn size=0; src=IMM8(u8(n)); dst=null;
EXTW 0100_1000_1000_0rrr size=2; src=DR(r); dst=null;
EXTL 0100_1000_1100_0rrr size=4; src=DR(r); dst=null;
EXTBL 0100_1001_1100_0rrr size=4; src=DR(r); dst=null;
LEA 0100_nnn1_11mm_mrrr size=4; src=cs.ea(r, m, 4); dst=AR(n);
LINK 0100_1110_0101_0rrr size=2; src=AR(r); dst=cs.imm16();
LINK 0100_1000_0000_1rrr size=4; src=AR(r); dst=cs.imm32();
UNLK 0100_1110_0101_1rrr size=0; src=AR(r); dst=null;
TRAP 0100_1110_0100_vvvv size=0; src=IMM8(u8(v)); dst=null;
DIVSL 0100_1100_01mm_mrrr 0qqq_1100_0000_0RRR ?(R != q) size=4; src=cs.ea(r, m, 4); dst=DPAIR(q, R);
DIVSL 0100_1100_01mm_mrrr 0qqq_1100_0000_0RRR size=4; src=cs.ea(r, m, 4); dst=DPAIR(q, R);
DIVSLL 0100_1100_01mm_mrrr 0qqq_1000_0000_0RRR ?(R != q) size=4; src=cs.ea(r, m, 4); dst=DPAIR(q, R);
DIVSL 0100_1100_01mm_mrrr 0qqq_1000_0000_0??? size=4; src=cs.ea(r, m, 4); dst=DR(q);
DIVUL 0100_1100_01mm_mrrr 0qqq_0100_0000_0RRR ?(R != q) size=4; src=cs.ea(r, m, 4); dst=DPAIR(q, R);
DIVUL 0100_1100_01mm_mrrr 0qqq_0100_0000_0RRR size=4; src=cs.ea(r, m, 4); dst=DPAIR(q, R);
DIVULL 0100_1100_01mm_mrrr 0qqq_0000_0000_0RRR ?(R != q) size=4; src=cs.ea(r, m, 4); dst=DPAIR(q, R);
DIVUL 0100_1100_01mm_mrrr 0qqq_0000_0000_0??? size=4; src=cs.ea(r, m, 4); dst=DR(q);
JMP 0100_1110_11mm_mrrr size=0; src=cs.ea(r, m, 0); dst=null;
JSR 0100_1110_10mm_mrrr size=0; src=cs.ea(r, m, 0); dst=null;
MULS 0100_1100_00mm_mrrr 0lll_1000_0000_0??? size=4; src=cs.ea(r, m, 4); dst=DR(l);
MULS 0100_1100_00mm_mrrr 0lll_1100_0000_0hhh size=4; src=cs.ea(r, m, 4); dst=DPAIR(l, h);
MULU 0100_1100_00mm_mrrr 0lll_0000_0000_0??? size=4; src=cs.ea(r, m, 4); dst=DR(l);
MULU 0100_1100_00mm_mrrr 0lll_0100_0000_0hhh size=4; src=cs.ea(r, m, 4); dst=DPAIR(l, h);
NBCD 0100_1000_00mm_mrrr size=1; src=cs.ea(r, m, 1); dst=null;
MOVEFROMSR 0100_0000_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, 2);
MOVETOSR 0100_0110_11mm_mrrr size=2; src=cs.ea(r, m, 2); dst=Implied();
MOVETOUSP 0100_1110_0110_0rrr size=4; src=AR(r); dst=Implied();
MOVEFROMUSP 0100_1110_0110_1rrr size=4; src=Implied(); dst=AR(r);
MOVEFROMCCR 0100_0010_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, 2);
MOVETOCCR 0100_0100_11mm_mrrr size=2; src=cs.ea(r, m, 2); dst=Implied();
PEA 0100_1000_01mm_mrrr size=4; src=cs.ea(r, m, 4); dst=Implied();
TAS 0100_1010_11mm_mrrr size=1; src=cs.ea(r, m, 1); dst=null;
MOVEM 0100_1000_1smm_mrrr size=2 << s; src=REGLIST(cs.pull16()); dst=cs.ea(r, m, size);
MOVEM 0100_1100_1smm_mrrr size=2 << s; dst=REGLIST(cs.pull16()); src=cs.ea(r, m, size);
CLR 0100_0010_00mm_mrrr size=1; src=Implied(); dst=cs.ea(r, m, size);
CLR 0100_0010_01mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
CLR 0100_0010_10mm_mrrr size=4; src=Implied(); dst=cs.ea(r, m, size);
NEG 0100_0100_00mm_mrrr size=1; src=Implied(); dst=cs.ea(r, m, size);
NEG 0100_0100_01mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
NEG 0100_0100_10mm_mrrr size=4; src=Implied(); dst=cs.ea(r, m, size);
NEGX 0100_0000_00mm_mrrr size=1; src=Implied(); dst=cs.ea(r, m, size);
NEGX 0100_0000_01mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
NEGX 0100_0000_10mm_mrrr size=4; src=Implied(); dst=cs.ea(r, m, size);
NOT 0100_0110_00mm_mrrr size=1; src=Implied(); dst=cs.ea(r, m, size);
NOT 0100_0110_01mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
NOT 0100_0110_10mm_mrrr size=4; src=Implied(); dst=cs.ea(r, m, size);
TST 0100_1010_00mm_mrrr size=1; src=Implied(); dst=cs.ea(r, m, size);
TST 0100_1010_01mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
TST 0100_1010_10mm_mrrr size=4; src=Implied(); dst=cs.ea(r, m, size);
CHK 0100_ddd1_10mm_mrrr size=2; src=cs.ea(r, m, size); dst=DR(d);
CHK 0100_ddd1_00mm_mrrr size=4; src=cs.ea(r, m, size); dst=DR(d);
#====================================================================================================
# Group 0101: ADDQ/SUBQ/Scc/DBcc/TRAPcc
#====================================================================================================
DBCC 0101_cccc_1100_1rrr size=2; src=DR(r); dst=PCDISP(2, simpleDisp(i16(cs.pull16()))); extra=cs.cc(c);
ADDQ 0101_ddd0_00mm_mrrr size=1; src=cs.quickConst(d); dst=cs.ea(r, m, size);
ADDQ 0101_ddd0_01mm_mrrr size=2; src=cs.quickConst(d); dst=cs.ea(r, m, size);
ADDQ 0101_ddd0_10mm_mrrr size=4; src=cs.quickConst(d); dst=cs.ea(r, m, size);
SUBQ 0101_ddd1_00mm_mrrr size=1; src=cs.quickConst(d); dst=cs.ea(r, m, size);
SUBQ 0101_ddd1_01mm_mrrr size=2; src=cs.quickConst(d); dst=cs.ea(r, m, size);
SUBQ 0101_ddd1_10mm_mrrr size=4; src=cs.quickConst(d); dst=cs.ea(r, m, size);
TRAPCC 0101_cccc_1111_1100 size=0; src=null; dst=null; extra=cs.cc(c);
TRAPCC 0101_cccc_1111_1010 size=2; src=cs.imm16(); dst=null; extra=cs.cc(c);
TRAPCC 0101_cccc_1111_1011 size=4; src=cs.imm32(); dst=null; extra=cs.cc(c);
SCC 0101_cccc_11mm_mrrr size=1; src=Implied(); dst=cs.ea(r, m, 1); extra=cs.cc(c);
#====================================================================================================
# Group 0110: Bcc/BSR/BRA
#====================================================================================================
BRA 0110_0000_0000_0000 size=2; src = PCDISP(2, simpleDisp(i16(cs.pull16()))); dst=null;
BRA 0110_0000_1111_1111 size=4; src = PCDISP(2, simpleDisp(cs.pull32())); dst=null;
BRA 0110_0000_dddd_dddd size=1; src = PCDISP(2, simpleDisp(i8(d))); dst=null;
BSR 0110_0001_0000_0000 size=2; src = PCDISP(2, simpleDisp(i16(cs.pull16()))); dst=null;
BSR 0110_0001_1111_1111 size=4; src = PCDISP(2, simpleDisp(cs.pull32())); dst=null;
BSR 0110_0001_dddd_dddd size=1; src = PCDISP(2, simpleDisp(i8(d))); dst=null;
BCC 0110_cccc_0000_0000 size=2; src = PCDISP(2, simpleDisp(i16(cs.pull16()))); dst=null; extra=cs.cc(c);
BCC 0110_cccc_1111_1111 size=4; src = PCDISP(2, simpleDisp(cs.pull32())); dst=null; extra=cs.cc(c);
BCC 0110_cccc_dddd_dddd size=1; src = PCDISP(2, simpleDisp(i8(d))); dst=null; extra=cs.cc(c);
#====================================================================================================
# Group 0111: MOVEQ
#====================================================================================================
MOVEQ 0111_rrr0_nnnn_nnnn size=4; src=IMM8(u8(n)); dst=DR(r);
#====================================================================================================
# Group 1000: OR/DIV/SBCD
#====================================================================================================
PACK 1000_yyy1_0100_0xxx size=0; src = DR(x); dst = DR(y); extra=PackAdjustment(cs.pull16());
PACK 1000_yyy1_0100_1xxx size=0; src = ARDEC(x); dst = ARDEC(y); extra=PackAdjustment(cs.pull16());
UNPK 1000_yyy1_1000_0xxx size=0; src = DR(x); dst = DR(y); extra=PackAdjustment(cs.pull16());
UNPK 1000_yyy1_1000_1xxx size=0; src = ARDEC(x); dst = ARDEC(y); extra=PackAdjustment(cs.pull16());
SBCD 1000_yyy1_0000_0xxx size=1; src = DR(x); dst = DR(y);
SBCD 1000_yyy1_0000_1xxx size=1; src = ARDEC(x); dst = ARDEC(y);
DIVS 1000_ddd1_11mm_mrrr size=2; src=cs.ea(r, m, 2); dst=DR(d);
DIVU 1000_ddd0_11mm_mrrr size=2; src=cs.ea(r, m, 2); dst=DR(d);
OR 1000_ddd0_00mm_mrrr size=1; src=cs.ea(r, m, size); dst=DR(d);
OR 1000_ddd0_01mm_mrrr size=2; src=cs.ea(r, m, size); dst=DR(d);
OR 1000_ddd0_10mm_mrrr size=4; src=cs.ea(r, m, size); dst=DR(d);
OR 1000_ddd1_00mm_mrrr size=1; src=DR(d); dst=cs.ea(r, m, size);
OR 1000_ddd1_01mm_mrrr size=2; src=DR(d); dst=cs.ea(r, m, size);
OR 1000_ddd1_10mm_mrrr size=4; src=DR(d); dst=cs.ea(r, m, size);
#====================================================================================================
# Group 1001: SUB/SUBX
#====================================================================================================
# data register pair
SUBX 1001_xxx1_0000_0yyy size=1; src=DR(y); dst=DR(x);
SUBX 1001_xxx1_0100_0yyy size=2; src=DR(y); dst=DR(x);
SUBX 1001_xxx1_1000_0yyy size=4; src=DR(y); dst=DR(x);
# decrementing address pair
SUBX 1001_xxx1_0000_1yyy size=1; src=ARDEC(y); dst=ARDEC(x);
SUBX 1001_xxx1_0100_1yyy size=2; src=ARDEC(y); dst=ARDEC(x);
SUBX 1001_xxx1_1000_1yyy size=4; src=ARDEC(y); dst=ARDEC(x);
# SUB <ea>,Dn
SUB 1001_ddd0_00mm_mrrr size=1; src=cs.ea(r, m, size); dst=DR(d);
SUB 1001_ddd0_01mm_mrrr size=2; src=cs.ea(r, m, size); dst=DR(d);
SUB 1001_ddd0_10mm_mrrr size=4; src=cs.ea(r, m, size); dst=DR(d);
# SUB Dn,<ea>
SUB 1001_ddd1_00mm_mrrr size=1; src=DR(d); dst=cs.ea(r, m, size);
SUB 1001_ddd1_01mm_mrrr size=2; src=DR(d); dst=cs.ea(r, m, size);
SUB 1001_ddd1_10mm_mrrr size=4; src=DR(d); dst=cs.ea(r, m, size);
# SUBA <ea>,Dn
SUBA 1001_ddd0_11mm_mrrr size=2; src=cs.ea(r, m, size); dst=AR(d);
SUBA 1001_ddd1_11mm_mrrr size=4; src=cs.ea(r, m, size); dst=AR(d);
#====================================================================================================
# Group 1010: Reserved/Unassigned
#====================================================================================================
#====================================================================================================
# Group 1011: CMP/EOR
#====================================================================================================
CMPA 1011_aaa0_11mm_mrrr size=2; src=cs.ea(r, m, size); dst=AR(a);
CMPA 1011_aaa1_11mm_mrrr size=4; src=cs.ea(r, m, size); dst=AR(a);
CMPM 1011_xxx1_0000_1yyy size=1; src=ARINC(y); dst=ARINC(x);
CMPM 1011_xxx1_0100_1yyy size=2; src=ARINC(y); dst=ARINC(x);
CMPM 1011_xxx1_1000_1yyy size=4; src=ARINC(y); dst=ARINC(x);
CMP 1011_ddd0_00mm_mrrr size=1; src=cs.ea(r, m, size); dst=DR(d);
CMP 1011_ddd0_01mm_mrrr size=2; src=cs.ea(r, m, size); dst=DR(d);
CMP 1011_ddd0_10mm_mrrr size=4; src=cs.ea(r, m, size); dst=DR(d);
EOR 1011_ddd1_00mm_mrrr size=1; src=DR(d); dst=cs.ea(r, m, size);
EOR 1011_ddd1_01mm_mrrr size=2; src=DR(d); dst=cs.ea(r, m, size);
EOR 1011_ddd1_10mm_mrrr size=4; src=DR(d); dst=cs.ea(r, m, size);
#====================================================================================================
# Group 1100: AND/MUL/ABCD/EXG
#====================================================================================================
ABCD 1100_yyy1_0000_0xxx size=1; src = DR(x); dst = DR(y);
ABCD 1100_yyy1_0000_1xxx size=1; src = ARDEC(x); dst = ARDEC(y);
MULU 1100_ppp0_11mm_mrrr size=2; src=cs.ea(r, m, 2); dst=DR(p);
MULS 1100_ppp1_11mm_mrrr size=2; src=cs.ea(r, m, 2); dst=DR(p);
EXG 1100_xxx1_0100_0yyy size=4; src=DR(x); dst=DR(y);
EXG 1100_xxx1_0100_1yyy size=4; src=AR(x); dst=AR(y);
EXG 1100_xxx1_1000_1yyy size=4; src=DR(x); dst=AR(y);
AND 1100_ddd0_00mm_mrrr size=1; src=cs.ea(r, m, size); dst=DR(d);
AND 1100_ddd0_01mm_mrrr size=2; src=cs.ea(r, m, size); dst=DR(d);
AND 1100_ddd0_10mm_mrrr size=4; src=cs.ea(r, m, size); dst=DR(d);
AND 1100_ddd1_00mm_mrrr size=1; src=DR(d); dst=cs.ea(r, m, size);
AND 1100_ddd1_01mm_mrrr size=2; src=DR(d); dst=cs.ea(r, m, size);
AND 1100_ddd1_10mm_mrrr size=4; src=DR(d); dst=cs.ea(r, m, size);
#====================================================================================================
# Group 1101: ADD/ADDX
#====================================================================================================
# data register pair
ADDX 1101_xxx1_0000_0yyy size=1; src=DR(y); dst=DR(x);
ADDX 1101_xxx1_0100_0yyy size=2; src=DR(y); dst=DR(x);
ADDX 1101_xxx1_1000_0yyy size=4; src=DR(y); dst=DR(x);
# decrementing address pair
ADDX 1101_xxx1_0000_1yyy size=1; src=ARDEC(y); dst=ARDEC(x);
ADDX 1101_xxx1_0100_1yyy size=2; src=ARDEC(y); dst=ARDEC(x);
ADDX 1101_xxx1_1000_1yyy size=4; src=ARDEC(y); dst=ARDEC(x);
# ADD <ea>,Dn
ADD 1101_ddd0_00mm_mrrr size=1; src=cs.ea(r, m, size); dst=DR(d);
ADD 1101_ddd0_01mm_mrrr size=2; src=cs.ea(r, m, size); dst=DR(d);
ADD 1101_ddd0_10mm_mrrr size=4; src=cs.ea(r, m, size); dst=DR(d);
# ADD Dn,<ea>
ADD 1101_ddd1_00mm_mrrr size=1; src=DR(d); dst=cs.ea(r, m, size);
ADD 1101_ddd1_01mm_mrrr size=2; src=DR(d); dst=cs.ea(r, m, size);
ADD 1101_ddd1_10mm_mrrr size=4; src=DR(d); dst=cs.ea(r, m, size);
# ADDA <ea>,Dn
ADDA 1101_aaa0_11mm_mrrr size=2; src=cs.ea(r, m, size); dst=AR(a);
ADDA 1101_aaa1_11mm_mrrr size=4; src=cs.ea(r, m, size); dst=AR(a);
#====================================================================================================
# Group 1110: Shift, Rotate, Bitfield
#====================================================================================================
BFCHG 1110_1010_11mm_mrrr 0000_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=null; dst=cs.ea(r, m, 0);
BFCLR 1110_1100_11mm_mrrr 0000_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=null; dst=cs.ea(r, m, 0);
BFEXTS 1110_1011_11mm_mrrr 0ddd_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=cs.ea(r, m, 0); dst=DR(d);
BFEXTU 1110_1001_11mm_mrrr 0ddd_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=cs.ea(r, m, 0); dst=DR(d);
BFFFO 1110_1101_11mm_mrrr 0ddd_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=cs.ea(r, m, 0); dst=DR(d);
BFINS 1110_1111_11mm_mrrr 0ddd_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=DR(d); dst=cs.ea(r, m, 0);
BFSET 1110_1110_11mm_mrrr 0000_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=null; dst=cs.ea(r, m, 0);
BFTST 1110_1000_11mm_mrrr 0000_Oooo_ooWw_wwww extra = cs.bitfield(O, o, W, w); size=0; src=null; dst=cs.ea(r, m, 0);
ASL 1110_ccc1_0000_0rrr size=1; src=IMM8(u8(c)); dst=DR(r);
ASL 1110_ccc1_0100_0rrr size=2; src=IMM8(u8(c)); dst=DR(r);
ASL 1110_ccc1_1000_0rrr size=4; src=IMM8(u8(c)); dst=DR(r);
ASR 1110_ccc0_0000_0rrr size=1; src=IMM8(u8(c)); dst=DR(r);
ASR 1110_ccc0_0100_0rrr size=2; src=IMM8(u8(c)); dst=DR(r);
ASR 1110_ccc0_1000_0rrr size=4; src=IMM8(u8(c)); dst=DR(r);
ASL 1110_ccc1_0010_0rrr size=1; src=DR(c); dst=DR(r);
ASL 1110_ccc1_0110_0rrr size=2; src=DR(c); dst=DR(r);
ASL 1110_ccc1_1010_0rrr size=4; src=DR(c); dst=DR(r);
ASR 1110_ccc0_0010_0rrr size=1; src=DR(c); dst=DR(r);
ASR 1110_ccc0_0110_0rrr size=2; src=DR(c); dst=DR(r);
ASR 1110_ccc0_1010_0rrr size=4; src=DR(c); dst=DR(r);
LSL 1110_ccc1_0000_1rrr size=1; src=IMM8(u8(c)); dst=DR(r);
LSL 1110_ccc1_0100_1rrr size=2; src=IMM8(u8(c)); dst=DR(r);
LSL 1110_ccc1_1000_1rrr size=4; src=IMM8(u8(c)); dst=DR(r);
LSR 1110_ccc0_0000_1rrr size=1; src=IMM8(u8(c)); dst=DR(r);
LSR 1110_ccc0_0100_1rrr size=2; src=IMM8(u8(c)); dst=DR(r);
LSR 1110_ccc0_1000_1rrr size=4; src=IMM8(u8(c)); dst=DR(r);
LSL 1110_ccc1_0010_1rrr size=1; src=DR(c); dst=DR(r);
LSL 1110_ccc1_0110_1rrr size=2; src=DR(c); dst=DR(r);
LSL 1110_ccc1_1010_1rrr size=4; src=DR(c); dst=DR(r);
LSR 1110_ccc0_0010_1rrr size=1; src=DR(c); dst=DR(r);
LSR 1110_ccc0_0110_1rrr size=2; src=DR(c); dst=DR(r);
LSR 1110_ccc0_1010_1rrr size=4; src=DR(c); dst=DR(r);
ROXL 1110_ccc1_0001_0rrr size=1; src=IMM8(u8(c)); dst=DR(r);
ROXL 1110_ccc1_0101_0rrr size=2; src=IMM8(u8(c)); dst=DR(r);
ROXL 1110_ccc1_1001_0rrr size=4; src=IMM8(u8(c)); dst=DR(r);
ROXR 1110_ccc0_0001_0rrr size=1; src=IMM8(u8(c)); dst=DR(r);
ROXR 1110_ccc0_0101_0rrr size=2; src=IMM8(u8(c)); dst=DR(r);
ROXR 1110_ccc0_1001_0rrr size=4; src=IMM8(u8(c)); dst=DR(r);
ROXL 1110_ccc1_0011_0rrr size=1; src=DR(c); dst=DR(r);
ROXL 1110_ccc1_0111_0rrr size=2; src=DR(c); dst=DR(r);
ROXL 1110_ccc1_1011_0rrr size=4; src=DR(c); dst=DR(r);
ROXR 1110_ccc0_0011_0rrr size=1; src=DR(c); dst=DR(r);
ROXR 1110_ccc0_0111_0rrr size=2; src=DR(c); dst=DR(r);
ROXR 1110_ccc0_1011_0rrr size=4; src=DR(c); dst=DR(r);
ROL 1110_ccc1_0001_1rrr size=1; src=IMM8(u8(c)); dst=DR(r);
ROL 1110_ccc1_0101_1rrr size=2; src=IMM8(u8(c)); dst=DR(r);
ROL 1110_ccc1_1001_1rrr size=4; src=IMM8(u8(c)); dst=DR(r);
ROR 1110_ccc0_0001_1rrr size=1; src=IMM8(u8(c)); dst=DR(r);
ROR 1110_ccc0_0101_1rrr size=2; src=IMM8(u8(c)); dst=DR(r);
ROR 1110_ccc0_1001_1rrr size=4; src=IMM8(u8(c)); dst=DR(r);
ROL 1110_ccc1_0011_1rrr size=1; src=DR(c); dst=DR(r);
ROL 1110_ccc1_0111_1rrr size=2; src=DR(c); dst=DR(r);
ROL 1110_ccc1_1011_1rrr size=4; src=DR(c); dst=DR(r);
ROR 1110_ccc0_0011_1rrr size=1; src=DR(c); dst=DR(r);
ROR 1110_ccc0_0111_1rrr size=2; src=DR(c); dst=DR(r);
ROR 1110_ccc0_1011_1rrr size=4; src=DR(c); dst=DR(r);
ASL 1110_0001_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
ASR 1110_0000_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
LSL 1110_0011_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
LSR 1110_0010_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
ROXL 1110_0101_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
ROXR 1110_0100_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
ROL 1110_0111_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
ROR 1110_0110_11mm_mrrr size=2; src=Implied(); dst=cs.ea(r, m, size);
#====================================================================================================
# Group 1111: Coprocessor interface, MC68040 and CPU32 extensions
#====================================================================================================
FMOVECR 1111_0010_0000_0000 0101_11dd_dooo_oooo size=10; src=IMM8(u8(o)); dst=FR(d);
FABS 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSABS 1111_0010_00mm_mrrr 0R0s_ssdd_d101_1000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDABS 1111_0010_00mm_mrrr 0R0s_ssdd_d101_1100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FACOS 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FADD 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSADD 1111_0010_00mm_mrrr 0R0s_ssdd_d110_0010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDADD 1111_0010_00mm_mrrr 0R0s_ssdd_d110_0110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FASIN 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FATAN 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FATANH 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1101 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FNOP 1111_0010_1000_0000 0000_0000_0000_0000 size=0; src=null; dst=null; extra=null;
FBCC 1111_0010_10cc_cccc size=2; src = PCDISP(2, simpleDisp(i16(cs.pull16()))); dst=null; extra=cs.fpcc(c);
FBCC 1111_0010_11cc_cccc size=4; src = PCDISP(2, simpleDisp(cs.pull32())); dst=null; extra=cs.fpcc(c);
FCMP 1111_0010_00mm_mrrr 0R0s_ssdd_d011_1000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FCOS 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1101 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FCOSH 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1001 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDBCC 1111_0010_0100_1rrr 0000_0000_000c_cccc size=2; src=DR(r); dst=PCDISP(4, simpleDisp(i16(cs.pull16()))); extra=cs.fpcc(c);
FDIV 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSDIV 1111_0010_00mm_mrrr 0R0s_ssdd_d110_0000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDDIV 1111_0010_00mm_mrrr 0R0s_ssdd_d110_0100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FETOX 1111_0010_00mm_mrrr 0R0s_ssdd_d001_0000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FETOXM1 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FGETEXP 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FGETMAN 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1111 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FGETMAN 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1111 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FINT 1111_0010_00mm_mrrr 0R0s_ssdd_d000_0001 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FINTRZ 1111_0010_00mm_mrrr 0R0s_ssdd_d000_0011 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FLOG10 1111_0010_00mm_mrrr 0R0s_ssdd_d001_0101 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FLOG2 1111_0010_00mm_mrrr 0R0s_ssdd_d001_0110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FLOGN 1111_0010_00mm_mrrr 0R0s_ssdd_d001_0100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FLOGNP1 1111_0010_00mm_mrrr 0R0s_ssdd_d000_0110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FMOD 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0001 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
# fmove: register to EA encoding; note swapped src/dst
FMOVE 1111_0010_00mm_mrrr 011s_ssdd_dkkk_kkkk const [size, dst, src, extra] = cs.decodeFp(r, m, 1, s, d, k);
# fmove: EA to register encoding
FMOVE 1111_0010_00mm_mrrr 0R0s_ssdd_d000_0000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSMOVE 1111_0010_00mm_mrrr 0R0s_ssdd_d100_0000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDMOVE 1111_0010_00mm_mrrr 0R0s_ssdd_d100_0100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
# 00 — Static register list, predecrement addressing mode.
# 01 — Dynamic register list, predecrement addressing mode.
# 10 — Static register list, postincrement or control addressing mode.
# 11 — Dynamic register list, postincrement or control addressing mode.
FMOVEM 1111_0010_00mm_mrrr 11Do_o000_MMMM_MMMM const [size, src, dst, extra] = cs.decodeFpMovem(r, m, D, M, o);
FMUL 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0011 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSMUL 1111_0010_00mm_mrrr 0R0s_ssdd_d110_0011 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDMUL 1111_0010_00mm_mrrr 0R0s_ssdd_d110_0111 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FNEG 1111_0010_00mm_mrrr 0R0s_ssdd_d001_1010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSNEG 1111_0010_00mm_mrrr 0R0s_ssdd_d101_1010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDNEG 1111_0010_00mm_mrrr 0R0s_ssdd_d101_1110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FREM 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0101 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSCALE 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
# 010 — The instruction is followed by a word operand.
FTRAPCC 1111_0010_0111_1010 0000_0000_00cc_cccc size=2; src=Implied(); dst=cs.imm16(); extra=cs.fpcc(c);
# 011 — The instruction is followed by a long-word operand.
FTRAPCC 1111_0010_0111_1011 0000_0000_00cc_cccc size=4; src=Implied(); dst=cs.imm32(); extra=cs.fpcc(c);
# 100 — The instruction has no operand.
FTRAPCC 1111_0010_0111_1100 0000_0000_00cc_cccc size=0; src=Implied(); dst=null; extra=cs.fpcc(c);
FSCC 1111_0010_01mm_mrrr 0000_0000_00cc_cccc size=1; src=Implied(); dst=cs.ea(r, m, 1); extra=cs.fpcc(c);
FSGLDIV 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSGLMUL 1111_0010_00mm_mrrr 0R0s_ssdd_d010_0111 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSIN 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1110 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSINCOS 1111_0010_00mm_mrrr 0R0s_ssSS_S011_0CCC const [size, src, _dst, extra] = cs.decodeFp(r, m, R, s, S, 0); const dst = FPAIR(S, C)
FSINH 1111_0010_00mm_mrrr 0R0s_ssdd_d000_0010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSQRT 1111_0010_00mm_mrrr 0R0s_ssdd_d000_0100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSSQRT 1111_0010_00mm_mrrr 0R0s_ssdd_d100_0001 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDSQRT 1111_0010_00mm_mrrr 0R0s_ssdd_d100_0101 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSUB 1111_0010_00mm_mrrr 0R0s_ssdd_d010_1000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FSSUB 1111_0010_00mm_mrrr 0R0s_ssdd_d110_1000 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FDSUB 1111_0010_00mm_mrrr 0R0s_ssdd_d110_1100 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FTAN 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1111 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FTANH 1111_0010_00mm_mrrr 0R0s_ssdd_d000_1001 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FTENTOX 1111_0010_00mm_mrrr 0R0s_ssdd_d001_0010 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);
FTST 1111_0010_00mm_mrrr 0R0s_ssdd_d011_1010 const [size, src, _dst, extra] = cs.decodeFp(r, m, R, s, d, 0); dst=null;
FTWOTOX 1111_0010_00mm_mrrr 0R0s_ssdd_d001_0001 const [size, src, dst, extra] = cs.decodeFp(r, m, R, s, d, 0);