UNPKG

m68kdecode

Version:

Port of deplinenoise/m68kdecode to Typescript

541 lines (403 loc) 34.4 kB
#==================================================================================================== # 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);