diff options
Diffstat (limited to 'src/devices/cpu/arcompact/arcompactdasm.cpp')
-rw-r--r-- | src/devices/cpu/arcompact/arcompactdasm.cpp | 2621 |
1 files changed, 2579 insertions, 42 deletions
diff --git a/src/devices/cpu/arcompact/arcompactdasm.cpp b/src/devices/cpu/arcompact/arcompactdasm.cpp index 7283cfd06b6..b9cf4354f80 100644 --- a/src/devices/cpu/arcompact/arcompactdasm.cpp +++ b/src/devices/cpu/arcompact/arcompactdasm.cpp @@ -1,20 +1,18 @@ // license:BSD-3-Clause // copyright-holders:David Haywood /*********************************\ - ARCompact disassembler \*********************************/ #include "emu.h" -#include "arcompactdasm.h" +#include "arcompactdasm_internal.h" u32 arcompact_disassembler::opcode_alignment() const { return 2; } - // condition codes (basic ones are the same as arc const char *const arcompact_disassembler::conditions[0x20] = { @@ -486,7 +484,7 @@ const char *const arcompact_disassembler::opcodes_04[0x40] = /* 10 */ "BCLR", /* 11 */ "BTST", /* 12 */ "BXOR", - /* 13 */ "BSMK", + /* 13 */ "BMSK", /* 14 */ "ADD1", /* 15 */ "ADD2", /* 16 */ "ADD3", @@ -535,13 +533,17 @@ const char *const arcompact_disassembler::opcodes_04[0x40] = /* 3f */ "0x3f", }; + + +/*****************************************************************************/ + offs_t arcompact_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { int size; uint32_t op = opcodes.r16(pc); - uint8_t instruction = ((op & 0xf800) >> 11); + uint8_t instruction = ((op & 0xf800) >> 11); if (instruction < 0x0c) { @@ -549,54 +551,2589 @@ offs_t arcompact_disassembler::disassemble(std::ostream &stream, offs_t pc, cons op <<= 16; op |= opcodes.r16(pc+2); - op &= ~0xf8000000; - - switch (instruction) // 32-bit instructions (with optional extra dword for immediate data) + switch (instruction & 0x3f) // 32-bit instructions (with optional extra dword for immediate data) { - case 0x00: size = handle00_dasm(stream, pc, op, opcodes); break; // Bcc - case 0x01: size = handle01_dasm(stream, pc, op, opcodes); break; // BLcc/BRcc - case 0x02: size = handle02_dasm(stream, pc, op, opcodes); break; // LD r+o - case 0x03: size = handle03_dasm(stream, pc, op, opcodes); break; // ST r+o - case 0x04: size = handle04_dasm(stream, pc, op, opcodes); break; // op a,b,c (basecase) - case 0x05: size = handle05_dasm(stream, pc, op, opcodes); break; // op a,b,c (05 ARC ext) - case 0x06: size = handle06_dasm(stream, pc, op, opcodes); break; // op a,b,c (06 ARC ext) - case 0x07: size = handle07_dasm(stream, pc, op, opcodes); break; // op a,b,c (07 User ext) - case 0x08: size = handle08_dasm(stream, pc, op, opcodes); break; // op a,b,c (08 User ext) - case 0x09: size = handle09_dasm(stream, pc, op, opcodes); break; // op a,b,c (09 Market ext) - case 0x0a: size = handle0a_dasm(stream, pc, op, opcodes); break; // op a,b,c (0a Market ext) - case 0x0b: size = handle0b_dasm(stream, pc, op, opcodes); break; // op a,b,c (0b Market ext) + default: break; // size = -1; + case 0x00: // Bcc + { + uint8_t subinstr = (op & 0x00010000) >> 16; + + switch (subinstr & 0x01) + { + default: break; // size = -1; + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// B<cc><.d> s21 0000 0sss ssss sss0 SSSS SSSS SSNQ QQQQ +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_B_cc_D_s21(stream, pc, op, opcodes); break; // Branch Conditionally + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// B<.d> s25 0000 0sss ssss sss1 SSSS SSSS SSNR tttt +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_B_D_s25(stream, pc, op, opcodes); break; // Branch Unconditionally Far + } + } + break; + } + case 0x01: // BLcc/BRcc + { + uint8_t subinstr = (op & 0x00010000) >> 16; + switch (subinstr & 0x01) + { + default: break; // size = -1; + case 0x00: // Branch & Link + { + uint8_t subinstr2 = (op & 0x00020000) >> 17; + switch (subinstr2) + { + default: break; // size = -1; + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BL<.cc><.d> s21 0000 1sss ssss ss00 SSSS SSSS SSNQ QQQQ +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BL_cc_d_s21(stream, pc, op, opcodes); break; // Branch and Link Conditionally + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BL<.d> s25 0000 1sss ssss ss10 SSSS SSSS SSNR tttt +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BL_d_s25(stream, pc, op, opcodes); break; // Branch and Link Unconditional Far + } + } + break; + } + case 0x01: // Branch on Compare + { + uint8_t subinstr2 = (op & 0x00000010) >> 4; + + switch (subinstr2) + { + default: break; // size = -1; + case 0x00: // Branch on Compare Register-Register + { + uint8_t subinstr3 = op & 0x0000000f; + switch (subinstr3) + { + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BREQ<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 0000 +// BREQ b,limm,s9 0000 1bbb ssss sss1 SBBB 1111 1000 0000 (+ Limm) +// BREQ limm,c,s9 0000 1110 ssss sss1 S111 CCCC CC00 0000 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BREQ_reg_reg(stream, pc, op, opcodes); break; // BREQ (reg-reg) + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRNE<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 0001 +// BRNE b,limm,s9 0000 1bbb ssss sss1 SBBB 1111 1000 0001 (+ Limm) +// BRNE limm,c,s9 0000 1110 ssss sss1 S111 CCCC CC00 0001 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRNE_reg_reg(stream, pc, op, opcodes); break; // BRNE (reg-reg) + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRLT<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 0010 +// BRLT b,limm,s9 0000 1bbb ssss sss1 SBBB 1111 1000 0010 (+ Limm) +// BRLT limm,c,s9 0000 1110 ssss sss1 S111 CCCC CC00 0010 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRLT_reg_reg(stream, pc, op, opcodes); break; // BRLT (reg-reg) + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRGE<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 0011 +// BRGE b,limm,s9 0000 1bbb ssss sss1 SBBB 1111 1000 0011 (+ Limm) +// BRGE limm,c,s9 0000 1110 ssss sss1 S111 CCCC CC00 0011 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRGE_reg_reg(stream, pc, op, opcodes); break; // BRGE (reg-reg) + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRLO<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 0100 +// BRLO b,limm,s9 0000 1bbb ssss sss1 SBBB 1111 1000 0100 (+ Limm) +// BRLO limm,c,s9 0000 1110 ssss sss1 S111 CCCC CC00 0100 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRLO_reg_reg(stream, pc, op, opcodes); break; // BRLO (reg-reg) + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRHS b,limm,s9 0000 1bbb ssss sss1 SBBB 1111 1000 0101 (+ Limm) +// BRHS limm,c,s9 0000 1110 ssss sss1 S111 CCCC CC00 0101 (+ Limm) +// BRHS<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 0101 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRHS_reg_reg(stream, pc, op, opcodes); break; // BRHS (reg-reg) + } + case 0x0e: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BBIT0<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 1110 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BBIT0_reg_reg(stream, pc, op, opcodes); break; // BBIT0 (reg-reg) + } + case 0x0f: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BBIT1<.d> b,c,s9 0000 1bbb ssss sss1 SBBB CCCC CCN0 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BBIT1_reg_reg(stream, pc, op, opcodes); break; // BBIT1 (reg-reg) + } + default: + { + // 0x06 - 0x0d + size = handle::dasm_reserved(stream, pc, instruction, subinstr, subinstr2, subinstr3, op, opcodes); break; // reserved + } + } + break; + } + case 0x01: // Branch on Compare/Bit Test Register-Immediate + { + uint8_t subinstr3 = op & 0x0000000f; + switch (subinstr3) + { + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BREQ<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB UUUU UUN1 0000 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BREQ_reg_imm(stream, pc, op, opcodes); break; // BREQ (reg-imm) + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRNE<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB UUUU UUN1 0001 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRNE_reg_imm(stream, pc, op, opcodes); break; // BRNE (reg-imm) + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRLT<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB UUUU UUN1 0010 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRLT_reg_imm(stream, pc, op, opcodes); break; // BRLT (reg-imm) + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRGE<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB UUUU UUN1 0011 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRGE_reg_imm(stream, pc, op, opcodes); break; // BRGE (reg-imm) + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRLO<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB UUUU UUN1 0100 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRLO_reg_imm(stream, pc, op, opcodes); break; // BRLO (reg-imm) + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BRHS<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB UUUU UUN1 0101 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRHS_reg_imm(stream, pc, op, opcodes); break; // BRHS (reg-imm) + } + case 0x0e: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BBIT0<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB uuuu uuN1 1110 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BBIT0_reg_imm(stream, pc, op, opcodes); break; // BBIT0 (reg-imm) + } + case 0x0f: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BBIT1<.d> b,u6,s9 0000 1bbb ssss sss1 SBBB uuuu uuN1 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BBIT1_reg_imm(stream, pc, op, opcodes); break; // BBIT1 (reg-imm) + } + default: + { + // 0x06 - 0x0d + size = handle::dasm_reserved(stream, pc, instruction, subinstr, subinstr2, subinstr3, op, opcodes); break; // reserved + } + } + } + } + } + } + break; + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I +// LD<zz><.x><.aa><.di> a,[b,s9] 0001 0bbb ssss ssss SBBB DaaZ ZXAA AAAA +// LD<zz><.x><.aa><.di> 0,[b,s9] 0001 0bbb ssss ssss SBBB DaaZ ZX11 1110 +// PREFETCH<.aa> [b,s9] 0001 0bbb ssss ssss SBBB 0aa0 0011 1110 +// +// LD<zz><.x><.di> a,[limm] 0001 0110 0000 0000 0111 DRRZ ZXAA AAAA (+ Limm) +// LD<zz><.x><.di> 0,[limm] 0001 0110 0000 0000 0111 DRRZ ZX11 1110 (+ Limm) +// PREFETCH [limm] 0001 0110 0000 0000 0111 0RR0 0011 1110 (+ Limm) +// +// can be used as a POP alias for higher registers +// 40020310: 1404 3410 +// LD.AB r16 <- [r28_SP, 004] 0001 0100 0000 0100 0011 0100 0001 0000 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_LD_r_o(stream, pc, op, opcodes); break; // LD r+o + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I +// ST<zz><.aa><.di> c,[b,s9] 0001 1bbb ssss ssss SBBB CCCC CCDa aZZR +// ST<zz><.di> c,[limm] 0001 1110 0000 0000 0111 CCCC CCDR RZZR (+ Limm) +// ST<zz><.aa><.di> limm,[b,s9] 0001 1bbb ssss ssss SBBB 1111 10Da aZZR (+ Limm) +// +// can be used as a PUSH alias for higher registers +// 400202A6: 1CFC B408 +// ST.AW [r28_SP, 1fc] <- r16 0001 1100 1111 1100 1011 0100 0000 1000 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ST_r_o(stream, pc, op, opcodes); break; // ST r+o + } + case 0x04: // op a,b,c (basecase) + { + uint8_t subinstr = (op & 0x003f0000) >> 16; + + switch (subinstr & 0x3f) + { + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// PP +// General Operations Reg-Reg 0010 0bbb 00ii iiii FBBB CCCC CCAA AAAA +// ADD<.f> a,b,c 0010 0bbb 0000 0000 FBBB CCCC CCAA AAAA +// ADD<.f> a,limm,c 0010 0110 0000 0000 F111 CCCC CCAA AAAA (+ Limm) +// ADD<.f> a,b,limm 0010 0bbb 0000 0000 FBBB 1111 10AA AAAA (+ Limm) +// ADD<.f> 0,b,c 0010 0bbb 0000 0000 FBBB CCCC CC11 1110 +// ADD<.f> 0,b,limm 0010 0bbb 0000 0000 FBBB 1111 1011 1110 (+ Limm) +// +// PP +// Gen Op Reg+6-bit unsigned Imm 0010 0bbb 01ii iiii FBBB UUUU UUAA AAAA +// ADD<.f> a,b,u6 0010 0bbb 0100 0000 FBBB uuuu uuAA AAAA +// ADD<.f> 0,b,u6 0010 0bbb 0100 0000 FBBB uuuu uu11 1110 +// +// PP +// Gen Op Reg+12-bit signed Imm 0010 0bbb 10ii iiii FBBB ssss ssSS SSSS +// ADD<.f> b,b,s12 0010 0bbb 1000 0000 FBBB ssss ssSS SSSS +// +// PP M +// Gen Op Conditional Register 0010 0bbb 11ii iiii FBBB CCCC CC0Q QQQQ +// ADD<.cc><.f> b,b,c 0010 0bbb 1100 0000 FBBB CCCC CC0Q QQQQ +// ADD<.cc><.f> b,b,limm 0010 0bbb 1100 0000 FBBB 1111 100Q QQQQ (+ Limm) +// ADD<.cc><.f> 0,limm,c 0010 0110 1100 0000 F111 CCCC CC0Q QQQQ (+ Limm) +// +// PP M +// Gen Op ConReg 6-bit unsign Imm 0010 0bbb 11ii iiii FBBB UUUU UU1Q QQQQ +// ADD<.cc><.f> b,b,u6 0010 0bbb 1100 0000 FBBB uuuu uu1Q QQQQ +// +// +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADD(stream, pc, op, opcodes); break; // ADD + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ADC<.f> a,b,c 0010 0bbb 0000 0001 FBBB CCCC CCAA AAAA +// ADC<.f> a,b,u6 0010 0bbb 0100 0001 FBBB uuuu uuAA AAAA +// ADC<.f> b,b,s12 0010 0bbb 1000 0001 FBBB ssss ssSS SSSS +// ADC<.cc><.f> b,b,c 0010 0bbb 1100 0001 FBBB CCCC CC0Q QQQQ +// ADC<.cc><.f> b,b,u6 0010 0bbb 1100 0001 FBBB uuuu uu1Q QQQQ +// ADC<.f> a,limm,c 0010 0110 0000 0001 F111 CCCC CCAA AAAA (+ Limm) +// ADC<.f> a,b,limm 0010 0bbb 0000 0001 FBBB 1111 10AA AAAA (+ Limm) +// ADC<.cc><.f> b,b,limm 0010 0bbb 1100 0001 FBBB 1111 100Q QQQQ (+ Limm) +// +// ADC<.f> 0,b,c 0010 0bbb 0000 0001 FBBB CCCC CC11 1110 +// ADC<.f> 0,b,u6 0010 0bbb 0100 0001 FBBB uuuu uu11 1110 +// ADC<.f> 0,b,limm 0010 0bbb 0000 0001 FBBB 1111 1011 1110 (+ Limm) +// ADC<.cc><.f> 0,limm,c 0010 0110 1100 0001 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADC(stream, pc, op, opcodes); break; // ADC + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// SUB<.f> a,b,c 0010 0bbb 0000 0010 FBBB CCCC CCAA AAAA +// SUB<.f> a,b,u6 0010 0bbb 0100 0010 FBBB uuuu uuAA AAAA +// SUB<.f> b,b,s12 0010 0bbb 1000 0010 FBBB ssss ssSS SSSS +// SUB<.cc><.f> b,b, c 0010 0bbb 1100 0010 FBBB CCCC CC0Q QQQQ +// SUB<.cc><.f> b,b,u6 0010 0bbb 1100 0010 FBBB uuuu uu1Q QQQQ +// SUB<.f> a,limm,c 0010 0110 0000 0010 F111 CCCC CCAA AAAA (+ Limm) +// SUB<.f> a,b,limm 0010 0bbb 0000 0010 FBBB 1111 10AA AAAA (+ Limm) +// SUB<.cc><.f> b,b,limm 0010 0bbb 1100 0010 FBBB 1111 100Q QQQQ (+ Limm) +// +// SUB <.f> 0,b,c 0010 0bbb 0000 0010 FBBB CCCC CC11 1110 +// SUB <.f> 0,b,u6 0010 0bbb 0100 0010 FBBB uuuu uu11 1110 +// SUB <.f> 0,b,limm 0010 0bbb 0000 0010 FBBB 1111 1011 1110 (+ Limm) +// SUB <.cc><.f> 0,limm,c 0010 0110 1100 0010 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SUB(stream, pc, op, opcodes); break; // SUB + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// SBC<.f> a,b,c 0010 0bbb 0000 0011 FBBB CCCC CCAA AAAA +// SBC<.f> a,b,u6 0010 0bbb 0100 0011 FBBB uuuu uuAA AAAA +// SBC<.f> b,b,s12 0010 0bbb 1000 0011 FBBB ssss ssSS SSSS +// SBC<.cc><.f> b,b,c 0010 0bbb 1100 0011 FBBB CCCC CC0Q QQQQ +// SBC<.cc><.f> b,b,u6 0010 0bbb 1100 0011 FBBB uuuu uu1Q QQQQ +// SBC<.f> a,limm,c 0010 0110 0000 0011 F111 CCCC CCAA AAAA (+ Limm) +// SBC<.f> a,b,limm 0010 0bbb 0000 0011 FBBB 1111 10AA AAAA (+ Limm) +// SBC<.cc><.f> b,b,limm 0010 0bbb 1100 0011 FBBB 1111 100Q QQQQ (+ Limm) +// +// SBC<.f> 0,b,c 0010 0bbb 0000 0011 FBBB CCCC CC11 1110 +// SBC<.f> 0,b,u6 0010 0bbb 0100 0011 FBBB uuuu uu11 1110 +// SBC<.f> 0,b,limm 0010 0bbb 0000 0011 FBBB 1111 1011 1110 (+ Limm) +// SBC<.cc><.f> 0,limm,c 0010 0110 1100 0011 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SBC(stream, pc, op, opcodes); break; // SBC + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// AND<.f> a,b,c 0010 0bbb 0000 0100 FBBB CCCC CCAA AAAA +// AND<.f> a,b,u6 0010 0bbb 0100 0100 FBBB uuuu uuAA AAAA +// AND<.f> b,b,s12 0010 0bbb 1000 0100 FBBB ssss ssSS SSSS +// AND<.cc><.f> b,b,c 0010 0bbb 1100 0100 FBBB CCCC CC0Q QQQQ +// AND<.cc><.f> b,b,u6 0010 0bbb 1100 0100 FBBB uuuu uu1Q QQQQ +// AND<.f> a,limm,c 0010 0110 0000 0100 F111 CCCC CCAA AAAA (+ Limm) +// AND<.f> a,b,limm 0010 0bbb 0000 0100 FBBB 1111 10AA AAAA (+ Limm) +// AND<.cc><.f> b,b,limm 0010 0bbb 1100 0100 FBBB 1111 100Q QQQQ (+ Limm) +// +// AND<.f> 0,b,c 0010 0bbb 0000 0100 FBBB CCCC CC11 1110 +// AND<.f> 0,b,u6 0010 0bbb 0100 0100 FBBB uuuu uu11 1110 +// AND<.f> 0,b,limm 0010 0bbb 0000 0100 FBBB 1111 1011 1110 (+ Limm) +// AND<.cc><.f> 0,limm,c 0010 0110 1100 0100 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_AND(stream, pc, op, opcodes); break; // AND + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// OR<.f> a,b,c 0010 0bbb 0000 0101 FBBB CCCC CCAA AAAA +// OR<.f> a,b,u6 0010 0bbb 0100 0101 FBBB uuuu uuAA AAAA +// OR<.f> b,b,s12 0010 0bbb 1000 0101 FBBB ssss ssSS SSSS +// OR<.cc><.f> b,b,c 0010 0bbb 1100 0101 FBBB CCCC CC0Q QQQQ +// OR<.cc><.f> b,b,u6 0010 0bbb 1100 0101 FBBB uuuu uu1Q QQQQ +// OR<.f> a,limm,c 0010 0110 0000 0101 F111 CCCC CCAA AAAA (+ Limm) +// OR<.f> a,b,limm 0010 0bbb 0000 0101 FBBB 1111 10AA AAAA (+ Limm) +// OR<.cc><.f> b,b,limm 0010 0bbb 1100 0101 FBBB 1111 100Q QQQQ (+ Limm) +// +// OR<.f> 0,b,c 0010 0bbb 0000 0101 FBBB CCCC CC11 1110 +// OR<.f> 0,b,u6 0010 0bbb 0100 0101 FBBB uuuu uu11 1110 +// OR<.f> 0,b,limm 0010 0bbb 0000 0101 FBBB 1111 1011 1110 (+ Limm) +// OR<.cc><.f> 0,limm,c 0010 0110 1100 010 1 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_OR(stream, pc, op, opcodes); break; // OR + } + case 0x06: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// BIC<.f> a,b,c 0010 0bbb 0000 0110 FBBB CCCC CCAA AAAA +// BIC<.f> a,b,u6 0010 0bbb 0100 0110 FBBB uuuu uuAA AAAA +// BIC<.f> b,b,s12 0010 0bbb 1000 0110 FBBB ssss ssSS SSSS +// BIC<.cc><.f> b,b,c 0010 0bbb 1100 0110 FBBB CCCC CC0Q QQQQ +// BIC<.cc><.f> b,b,u6 0010 0bbb 1100 0110 FBBB uuuu uu1Q QQQQ +// BIC<.f> a,limm,c 0010 0110 0000 0110 F111 CCCC CCAA AAAA (+ Limm) +// BIC<.f> a,b,limm 0010 0bbb 0000 0110 FBBB 1111 10AA AAAA (+ Limm) +// BIC<.cc><.f> b,b,limm 0010 0bbb 1100 0110 FBBB 1111 100Q QQQQ (+ Limm) +// +// BIC<.f> 0,b,c 0010 0bbb 0000 0110 FBBB CCCC CC11 1110 +// BIC<.f> 0,b,u6 0010 0bbb 0100 0110 FBBB uuuu uu11 1110 +// BIC<.f> 0,b,limm 0010 0bbb 0000 0110 FBBB 1111 1011 1110 (+ Limm) +// BIC<.cc><.f> 0,limm,c 0010 0110 1100 0110 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BIC(stream, pc, op, opcodes); break; // BIC + } + case 0x07: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// XOR<.f> a,b,c 0010 0bbb 0000 0111 FBBB CCCC CCAA AAAA +// XOR<.f> a,b,u6 0010 0bbb 0100 0111 FBBB uuuu uuAA AAAA +// XOR<.f> b,b,s12 0010 0bbb 1000 0111 FBBB ssss ssSS SSSS +// XOR<.cc><.f> b,b,c 0010 0bbb 1100 0111 FBBB CCCC CC0Q QQQQ +// XOR<.cc><.f> b,b,u6 0010 0bbb 1100 0111 FBBB uuuu uu1Q QQQQ +// XOR<.f> a,limm,c 0010 0110 0000 0111 F111 CCCC CCAA AAAA (+ Limm) +// XOR<.f> a,b,limm 0010 0bbb 0000 0111 FBBB 1111 10AA AAAA (+ Limm) +// XOR<.cc><.f> b,b,limm 0010 0bbb 1100 0111 FBBB 1111 100Q QQQQ (+ Limm) +// +// XOR<.f> 0,b,c 0010 0bbb 0000 0111 FBBB CCCC CC11 1110 +// XOR<.f> 0,b,u6 0010 0bbb 0100 0111 FBBB uuuu uu11 1110 +// XOR<.f> 0,b,limm 0010 0bbb 0000 0111 FBBB 1111 1011 1110 (+ Limm) +// XOR<.cc><.f> 0,limm,c 0010 0110 1100 0111 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_XOR(stream, pc, op, opcodes); break; // XOR + } + case 0x08: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// MAX<.f> a,b,c 0010 0bbb 0000 1000 FBBB CCCC CCAA AAAA +// MAX<.f> a,b,u6 0010 0bbb 0100 1000 FBBB uuuu uuAA AAAA +// MAX<.f> b,b,s12 0010 0bbb 1000 1000 FBBB ssss ssSS SSSS +// MAX<.cc><.f> b,b,c 0010 0bbb 1100 1000 FBBB CCCC CC0Q QQQQ +// MAX<.cc><.f> b,b,u6 0010 0bbb 1100 1000 FBBB uuuu uu1Q QQQQ +// MAX<.f> a,limm,c 0010 0110 0000 1000 F111 CCCC CCAA AAAA (+ Limm) +// MAX<.f> a,b,limm 0010 0bbb 0000 1000 FBBB 1111 10AA AAAA (+ Limm) +// MAX<.cc><.f> b,b,limm 0010 0bbb 1100 1000 FBBB 1111 100Q QQQQ (+ Limm) +// +// MAX<.f> 0,b,c 0010 0bbb 0000 1000 FBBB CCCC CC11 1110 +// MAX<.f> 0,b,u6 0010 0bbb 0100 1000 FBBB uuuu uu11 1110 +// MAX<.f> 0,b,limm 0010 0bbb 0000 1000 FBBB 1111 1011 1110 (+ Limm) +// MAX<.cc><.f> 0,limm,c 0010 0110 1100 1000 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MAX(stream, pc, op, opcodes); break; // MAX + } + case 0x09: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// MIN<.f> a,b,c 0010 0bbb 0000 1001 FBBB CCCC CCAA AAAA +// MIN<.f> a,b,u6 0010 0bbb 0100 1001 FBBB uuuu uuAA AAAA +// MIN<.f> b,b,s12 0010 0bbb 1000 1001 FBBB ssss ssSS SSSS +// MIN<.cc><.f> b,b,c 0010 0bbb 1100 1001 FBBB CCCC CC0Q QQQQ +// MIN<.cc><.f> b,b,u6 0010 0bbb 1100 1001 FBBB uuuu uu1Q QQQQ +// MIN<.f> a,limm,c 0010 0110 0000 1001 F111 CCCC CCAA AAAA (+ Limm) +// MIN<.f> a,b,limm 0010 0bbb 0000 1001 FBBB 1111 10AA AAAA (+ Limm) +// MIN<.cc><.f> b,b,limm 0010 0bbb 1100 1001 FBBB 1111 100Q QQQQ (+ Limm) +// +// MIN<.f> 0,b,c 0010 0bbb 0000 1001 FBBB CCCC CC11 1110 +// MIN<.f> 0,b,u6 0010 0bbb 0100 1001 FBBB uuuu uu11 1110 +// MIN<.f> 0,b,limm 0010 0bbb 0000 1001 FBBB 1111 1011 1110 (+ Limm) +// MIN<.cc><.f> 0,limm,c 0010 0110 1100 1001 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MIN(stream, pc, op, opcodes); break; // MIN + } + case 0x0a: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// MOV<.f> b,s12 0010 0bbb 1000 1010 FBBB ssss ssSS SSSS +// MOV<.f> 0,s12 0010 0110 1000 1010 F111 ssss ssSS SSSS (is b is 'Limm' there's no destination) + +// MOV<.cc><.f> b,c 0010 0bbb 1100 1010 FBBB CCCC CC0Q QQQQ +// MOV<.cc><.f> b,u6 0010 0bbb 1100 1010 FBBB uuuu uu1Q QQQQ +// MOV<.cc><.f> b,limm 0010 0bbb 1100 1010 FBBB 1111 100Q QQQQ (+ Limm) +// +// MOV<.cc><.f> 0,c 0010 0110 1100 1010 F111 CCCC CC0Q QQQQ +// MOV<.cc><.f> 0,u6 0010 0110 1100 1010 F111 uuuu uu1Q QQQQ +// MOV<.cc><.f> 0,limm 0010 0110 1100 1010 F111 1111 100Q QQQQ (+ Limm) +// +// NOP 0010 0110 0100 1010 0111 0000 0000 0000 (NOP is a custom encoded MOV where b is 'LIMM') +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MOV(stream, pc, op, opcodes); break; // MOV + } + case 0x0b: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// TST b,s12 0010 0bbb 1000 1011 1BBB ssss ssSS SSSS +// TST<.cc> b,c 0010 0bbb 1100 1011 1BBB CCCC CC0Q QQQQ +// TST<.cc> b,u6 0010 0bbb 1100 1011 1BBB uuuu uu1Q QQQQ +// TST<.cc> b,limm 0010 0bbb 1100 1011 1BBB 1111 100Q QQQQ (+ Limm) +// TST<.cc> limm,c 0010 0110 1100 1011 1111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_TST(stream, pc, op, opcodes); break; // TST + } + case 0x0c: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// CMP b,s12 0010 0bbb 1000 1100 1BBB ssss ssSS SSSS +// CMP<.cc> b,c 0010 0bbb 1100 1100 1BBB CCCC CC0Q QQQQ +// CMP<.cc> b,u6 0010 0bbb 1100 1100 1BBB uuuu uu1Q QQQQ +// CMP<.cc> b,limm 0010 0bbb 1100 1100 1BBB 1111 100Q QQQQ (+ Limm) +// CMP<.cc> limm,c 0010 0110 1100 1100 1111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_CMP(stream, pc, op, opcodes); break; // CMP + } + case 0x0d: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// RCMP b,s12 0010 0bbb 1000 1101 1BBB ssss ssSS SSSS +// RCMP<.cc> b,c 0010 0bbb 1100 1101 1BBB CCCC CC0Q QQQQ +// RCMP<.cc> b,u6 0010 0bbb 1100 1101 1BBB uuuu uu1Q QQQQ +// RCMP<.cc> b,limm 0010 0bbb 1100 1101 1BBB 1111 100Q QQQQ (+ Limm) +// RCMP<.cc> limm,c 0010 0110 1100 1101 1111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_RCMP(stream, pc, op, opcodes); break; // RCMP + } + case 0x0e: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// RSUB<.f> a,b,c 0010 0bbb 0000 1110 FBBB CCCC CCAA AAAA +// RSUB<.f> a,b,u6 0010 0bbb 0100 1110 FBBB uuuu uuAA AAAA +// NEG<.f> a,b 0010 0bbb 0100 1110 FBBB 0000 00AA AAAA (NEG is an alias) +// +// RSUB<.f> b,b,s12 0010 0bbb 1000 1110 FBBB ssss ssSS SSSS +// RSUB<.cc><.f> b,b,c 0010 0bbb 1100 1110 FBBB CCCC CC0Q QQQQ +// RSUB<.cc><.f> b,b,u6 0010 0bbb 1100 1110 FBBB uuuu uu1Q QQQQ +// NEG<.cc><.f> b,b 0010 0bbb 1100 1110 FBBB 0000 001Q QQQQ (NEG is an alias) +// +// RSUB<.f> a,limm,c 0010 0110 0000 1110 F111 CCCC CCAA AAAA (+ Limm) +// RSUB<.f> a,b,limm 0010 0bbb 0000 1110 FBBB 1111 10AA AAAA (+ Limm) +// RSUB<.cc><.f> b,b,limm 0010 0bbb 1100 1110 FBBB 1111 100Q QQQQ (+ Limm) +// +// RSUB<.f> 0,b,c 0010 0bbb 0000 1110 FBBB CCCC CC11 1110 +// RSUB<.f> 0,b,u6 0010 0bbb 0100 1110 FBBB uuuu uu11 1110 +// RSUB<.f> 0,b,limm 0010 0bbb 0000 1110 FBBB 1111 1011 1110 (+ Limm) +// RSUB<.cc><.f> 0,limm,c 0010 0110 1100 1110 F111 CCCC CC0Q QQQQ (+ Limm) +// +// IIII I SS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_RSUB(stream, pc, op, opcodes); break; // RSUB + } + case 0x0f: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BSET<.f> a,b,c 0010 0bbb 0000 1111 FBBB CCCC CCAA AAAA +// BSET<.f> a,b,u6 0010 0bbb 0100 1111 FBBB uuuu uuAA AAAA +// BSET<.cc><.f> b,b,c 0010 0bbb 1100 1111 FBBB CCCC CC0Q QQQQ +// BSET<.cc><.f> b,b,u6 0010 0bbb 1100 1111 FBBB uuuu uu1Q QQQQ +// BSET<.f> a,limm,c 0010 0110 0000 1111 F111 CCCC CCAA AAAA (+ Limm) +// +// BSET<.f> 0,b,c 0010 0bbb 0000 1111 FBBB CCCC CC11 1110 +// BSET<.f> 0,b,u6 0010 0bbb 0100 1111 FBBB uuuu uu11 1110 +// BSET<.cc><.f> 0,limm,c 0010 0110 1100 1111 F110 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BSET(stream, pc, op, opcodes); break; // BSET + } + case 0x10: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BCLR<.f> a,b,c 0010 0bbb 0001 0000 FBBB CCCC CCAA AAAA +// BCLR<.f> a,b,u6 0010 0bbb 0101 0000 FBBB uuuu uuAA AAAA +// BCLR<.cc><.f> b,b,c 0010 0bbb 1101 0000 FBBB CCCC CC0Q QQQQ +// BCLR<.cc><.f> b,b,u6 0010 0bbb 1101 0000 FBBB uuuu uu1Q QQQQ +// BCLR<.f> a,limm,c 0010 0110 0001 0000 F111 CCCC CCAA AAAA (+ Limm) +// +// BCLR<.f> 0,b,c 0010 0bbb 0001 0000 FBBB CCCC CC11 1110 +// BCLR<.f> 0,b,u6 0010 0bbb 0101 0000 FBBB uuuu uu11 1110 +// BCLR<.cc><.f> 0,limm,c 0010 0110 1101 0000 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BCLR(stream, pc, op, opcodes); break; // BCLR + } + case 0x11: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BTST<.cc> b,c 0010 0bbb 1101 0001 1BBB CCCC CC0Q QQQQ +// BTST<.cc> b,u6 0010 0bbb 1101 0001 1BBB uuuu uu1Q QQQQ +// BTST<.cc> limm,c 0010 0110 1101 0001 1111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BTST(stream, pc, op, opcodes); break; // BTST + } + case 0x12: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BXOR<.f> a,b,c 0010 0bbb 0001 0010 FBBB CCCC CCAA AAAA +// BXOR<.f> a,b,u6 0010 0bbb 0101 0010 FBBB uuuu uuAA AAAA +// BXOR<.cc><.f> b,b,c 0010 0bbb 1101 0010 FBBB CCCC CC0Q QQQQ +// BXOR<.cc><.f> b,b,u6 0010 0bbb 1101 0010 FBBB uuuu uu1Q QQQQ +// BXOR<.f> a,limm,c 0010 0110 0001 0010 F111 CCCC CCAA AAAA (+ Limm) +// +// BXOR<.f> 0,b,c 0010 0bbb 0001 0010 FBBB CCCC CC11 1110 +// BXOR<.f> 0,b,u6 0010 0bbb 0101 0010 FBBB uuuu uu11 1110 +// BXOR<.cc><.f> 0,limm,c 0010 0110 1101 0010 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BXOR(stream, pc, op, opcodes); break; // BXOR + } + case 0x13: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// BMSK<.f> a,b,c 0010 0bbb 0001 0011 FBBB CCCC CCAA AAAA +// BMSK<.f> a,b,u6 0010 0bbb 0101 0011 FBBB uuuu uuAA AAAA +// BMSK<.cc><.f> b,b,c 0010 0bbb 1101 0011 FBBB CCCC CC0Q QQQQ +// BMSK<.cc><.f> b,b,u6 0010 0bbb 1101 0011 FBBB uuuu uu1Q QQQQ +// BMSK<.f> a,limm,c 0010 0110 0001 0011 F111 CCCC CCAA AAAA (+ Limm) +// +// BMSK<.f> 0,b,c 0010 0bbb 0001 0011 FBBB CCCC CC11 1110 +// BMSK<.f> 0,b,u6 0010 0bbb 0101 0011 FBBB uuuu uu11 1110 +// BMSK<.cc><.f> 0,limm,c 0010 0110 1101 0011 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BMSK(stream, pc, op, opcodes); break; // BMSK + } + case 0x14: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// ADD1<.f> a,b,c 0010 0bbb 0001 0100 FBBB CCCC CCAA AAAA +// ADD1<.f> a,b,u6 0010 0bbb 0101 0100 FBBB uuuu uuAA AAAA +// ADD1<.f> b,b,s12 0010 0bbb 1001 0100 FBBB ssss ssSS SSSS +// ADD1<.cc><.f> b,b,c 0010 0bbb 1101 0100 FBBB CCCC CC0Q QQQQ +// ADD1<.cc><.f> b,b,u6 0010 0bbb 1101 0100 FBBB uuuu uu1Q QQQQ +// ADD1<.f> a,limm,c 0010 0110 0001 0100 F111 CCCC CCAA AAAA (+ Limm) +// ADD1<.f> a,b,limm 0010 0bbb 0001 0100 FBBB 1111 10AA AAAA (+ Limm) +// ADD1<.cc><.f> b,b,limm 0010 0bbb 1101 0100 FBBB 1111 100Q QQQQ (+ Limm) +// +// ADD1<.f> 0,b,c 0010 0bbb 0001 0100 FBBB CCCC CC11 1110 +// ADD1<.f> 0,b,u6 0010 0bbb 0101 0100 FBBB uuuu uu11 1110 +// ADD1<.f> 0,b,limm 0010 0bbb 0001 0100 FBBB 1111 1011 1110 (+ Limm) +// ADD1<.cc><.f> 0,limm,c 0010 0110 1101 0100 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADD1(stream, pc, op, opcodes); break; // ADD1 + } + case 0x15: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// ADD2<.f> a,b,c 0010 0bbb 0001 0101 FBBB CCCC CCAA AAAA +// ADD2<.f> a,b,u6 0010 0bbb 0101 0101 FBBB uuuu uuAA AAAA +// ADD2<.f> b,b,s12 0010 0bbb 1001 0101 FBBB ssss ssSS SSSS +// ADD2<.cc><.f> b,b,c 0010 0bbb 1101 0101 FBBB CCCC CC0Q QQQQ +// ADD2<.cc><.f> b,b,u6 0010 0bbb 1101 0101 FBBB uuuu uu1Q QQQQ +// ADD2<.f> a,limm,c 0010 0110 0001 0101 F111 CCCC CCAA AAAA (+ Limm) +// ADD2<.f> a,b,limm 0010 0bbb 0001 0101 FBBB 1111 10AA AAAA (+ Limm) +// ADD2<.cc><.f> b,b,limm 0010 0bbb 1101 0101 FBBB 1111 100Q QQQQ (+ Limm) +// +// ADD2<.f> 0,b,c 0010 0bbb 0001 0101 FBBB CCCC CC11 1110 +// ADD2<.f> 0,b,u6 0010 0bbb 0101 0101 FBBB uuuu uu11 1110 +// ADD2<.f> 0,b,limm 0010 0bbb 0001 0101 FBBB 1111 1011 1110 (+ Limm) +// ADD2<.cc><.f> 0,limm,c 0010 0110 1101 0101 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADD2(stream, pc, op, opcodes); break; // ADD2 + } + case 0x16: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// ADD3<.f> a,b,c 0010 0bbb 0001 0110 FBBB CCCC CCAA AAAA +// ADD3<.f> a,b,u6 0010 0bbb 0101 0110 FBBB uuuu uuAA AAAA +// ADD3<.f> b,b,s12 0010 0bbb 1001 0110 FBBB ssss ssSS SSSS +// ADD3<.cc><.f> b,b,c 0010 0bbb 1101 0110 FBBB CCCC CC0Q QQQQ +// ADD3<.cc><.f> b,b,u6 0010 0bbb 1101 0110 FBBB uuuu uu1Q QQQQ +// ADD3<.f> a,limm,c 0010 0110 0001 0110 F111 CCCC CCAA AAAA (+ Limm) +// ADD3<.f> a,b,limm 0010 0bbb 0001 0110 FBBB 1111 10AA AAAA (+ Limm) +// ADD3<.cc><.f> b,b,limm 0010 0bbb 1101 0110 FBBB 1111 100Q QQQQ (+ Limm) +// +// ADD3<.f> 0,b,c 0010 0bbb 0001 0110 FBBB CCCC CC11 1110 +// ADD3<.f> 0,b,u6 0010 0bbb 0101 0110 FBBB uuuu uu11 1110 +// ADD3<.f> 0,b,limm 0010 0bbb 0001 0110 FBBB 1111 1011 1110 (+ Limm) +// ADD3<.cc><.f> 0,limm,c 0010 0110 1101 0110 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADD3(stream, pc, op, opcodes); break; // ADD3 + } + case 0x17: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// SUB1<.f> a,b,c 0010 0bbb 0001 0111 FBBB CCCC CCAA AAAA +// SUB1<.f> a,b,u6 0010 0bbb 0101 0111 FBBB uuuu uuAA AAAA +// SUB1<.f> b,b,s12 0010 0bbb 1001 0111 FBBB ssss ssSS SSSS +// SUB1<.cc><.f> b,b,c 0010 0bbb 1101 0111 FBBB CCCC CC0Q QQQQ +// SUB1<.cc><.f> b,b,u6 0010 0bbb 1101 0111 FBBB uuuu uu1Q QQQQ +// SUB1<.f> a,limm,c 0010 0110 0001 0111 F111 CCCC CCAA AAAA (+ Limm) +// SUB1<.f> a,b,limm 0010 0bbb 0001 0111 FBBB 1111 10AA AAAA (+ Limm) +// SUB1<.cc><.f> b,b,limm 0010 0bbb 1101 0111 FBBB 1111 100Q QQQQ (+ Limm) +// +// SUB1<.f> 0,b,c 0010 0bbb 0001 0111 FBBB CCCC CC11 1110 +// SUB1<.f> 0,b,u6 0010 0bbb 0101 0111 FBBB uuuu uu11 1110 +// SUB1<.f> 0,b,limm 0010 0bbb 0001 0111 FBBB 1111 1011 1110 (+ Limm) +// SUB1<.cc><.f> 0,limm,c 0010 0110 1101 0111 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SUB1(stream, pc, op, opcodes); break; // SUB1 + } + case 0x18: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// SUB2<.f> a,b,c 0010 0bbb 0001 1000 FBBB CCCC CCAA AAAA +// SUB2<.f> a,b,u6 0010 0bbb 0101 1000 FBBB uuuu uuAA AAAA +// SUB2<.f> b,b,s12 0010 0bbb 1001 1000 FBBB ssss ssSS SSSS +// SUB2<.cc><.f> b,b,c 0010 0bbb 1101 1000 FBBB CCCC CC0Q QQQQ +// SUB2<.cc><.f> b,b,u6 0010 0bbb 1101 1000 FBBB uuuu uu1Q QQQQ +// SUB2<.f> a,limm,c 0010 0110 0001 1000 F111 CCCC CCAA AAAA (+ Limm) +// SUB2<.f> a,b,limm 0010 0bbb 0001 1000 FBBB 1111 10AA AAAA (+ Limm) +// SUB2<.cc><.f> b,b,limm 0010 0bbb 1101 1000 FBBB 1111 100Q QQQQ (+ Limm) +// +// SUB2<.f> 0,b,c 0010 0bbb 0001 1000 FBBB CCCC CC11 1110 +// SUB2<.f> 0,b,u6 0010 0bbb 0101 1000 FBBB uuuu uu11 1110 +// SUB2<.f> 0,b,limm 0010 0bbb 0001 1000 FBBB 1111 1011 1110 (+ Limm) +// SUB2<.cc><.f> 0,limm,c 0010 0110 1101 1000 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SUB2(stream, pc, op, opcodes); break; // SUB2 + } + case 0x19: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// SUB3<.f> a,b,c 0010 0bbb 0001 1001 FBBB CCCC CCAA AAAA +// SUB3<.f> a,b,u6 0010 0bbb 0101 1001 FBBB uuuu uuAA AAAA +// SUB3<.f> b,b,s12 0010 0bbb 1001 1001 FBBB ssss ssSS SSSS +// SUB3<.cc><.f> b,b,c 0010 0bbb 1101 1001 FBBB CCCC CC0Q QQQQ +// SUB3<.cc><.f> b,b,u6 0010 0bbb 1101 1001 FBBB uuuu uu1Q QQQQ +// SUB3<.f> a,limm,c 0010 0110 0001 1001 F111 CCCC CCAA AAAA (+ Limm) +// SUB3<.f> a,b,limm 0010 0bbb 0001 1001 FBBB 1111 10AA AAAA (+ Limm) +// SUB3<.cc><.f> b,b,limm 0010 0bbb 1101 1001 FBBB 1111 100Q QQQQ (+ Limm) +// +// SUB3<.f> 0,b,c 0010 0bbb 0001 1001 FBBB CCCC CC11 1110 +// SUB3<.f> 0,b,u6 0010 0bbb 0101 1001 FBBB uuuu uu11 1110 +// SUB3<.f> 0,limm,c 0010 0110 0001 1001 F111 CCCC CC11 1110 (+ Limm) +// SUB3<.cc><.f> 0,limm,c 0010 0110 1101 1001 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SUB3(stream, pc, op, opcodes); break; // SUB3 + } + case 0x1a: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// MPY<.f> a,b,c 0010 0bbb 0001 1010 FBBB CCCC CCAA AAAA +// MPY<.f> a,b,u6 0010 0bbb 0101 1010 FBBB uuuu uuAA AAAA +// MPY<.f> b,b,s12 0010 0bbb 1001 1010 FBBB ssss ssSS SSSS +// MPY<.cc><.f> b,b,c 0010 0bbb 1101 1010 FBBB CCCC CC0Q QQQQ +// MPY<.cc><.f> b,b,u6 0010 0bbb 1101 1010 FBBB uuuu uu1Q QQQQ +// MPY<.f> a,limm,c 0010 0110 0001 1010 F111 CCCC CCAA AAAA (+ Limm) +// MPY<.f> a,b,limm 0010 0bbb 0001 1010 FBBB 1111 10AA AAAA (+ Limm) +// MPY<.cc><.f> b,b,limm 0010 0bbb 1101 1010 FBBB 1111 100Q QQQQ (+ Limm) +// +// MPY<.f> 0,b,c 0010 0bbb 0001 1010 FBBB CCCC CC11 1110 +// MPY<.f> 0,b,u6 0010 0bbb 0101 1010 FBBB uuuu uu11 1110 +// MPY<.cc><.f> 0,limm,c 0010 0110 1101 1010 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MPY(stream, pc, op, opcodes); break; // MPY * + } + case 0x1b: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// MPYH<.f> a,b,c 0010 0bbb 0001 1011 FBBB CCCC CCAA AAAA +// MPYH<.f> a,b,u6 0010 0bbb 0101 1011 FBBB uuuu uuAA AAAA +// MPYH<.f> b,b,s12 0010 0bbb 1001 1011 FBBB ssss ssSS SSSS +// MPYH<.cc><.f> b,b,c 0010 0bbb 1101 1011 FBBB CCCC CC0Q QQQQ +// MPYH<.cc><.f> b,b,u6 0010 0bbb 1101 1011 FBBB uuuu uu1Q QQQQ +// MPYH<.f> a,limm,c 0010 0110 0001 1011 F111 CCCC CCAA AAAA (+ Limm) +// MPYH<.f> a,b,limm 0010 0bbb 0001 1010 FBBB 1111 10AA AAAA (+ Limm) +// MPYH<.cc><.f> b,b,limm 0010 0bbb 1101 1011 FBBB 1111 100Q QQQQ (+ Limm) +// +// MPYH<.f> 0,b,c 0010 0bbb 0001 1011 FBBB CCCC CC11 1110 +// MPYH<.f> 0,b,u6 0010 0bbb 0101 1011 FBBB uuuu uu11 1110 +// MPYH<.cc><.f> 0,limm,c 0010 0110 1101 1011 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MPYH(stream, pc, op, opcodes); break; // MPYH * + } + case 0x1c: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// MPYHU<.f> a,b,c 0010 0bbb 0001 1100 FBBB CCCC CCAA AAAA +// MPYHU<.f> a,b,u6 0010 0bbb 0101 1100 FBBB uuuu uuAA AAAA +// MPYHU<.f> b,b,s12 0010 0bbb 1001 1100 FBBB ssss ssSS SSSS +// MPYHU<.cc><.f> b,b,c 0010 0bbb 1101 1100 FBBB CCCC CC0Q QQQQ +// MPYHU<.cc><.f> b,b,u6 0010 0bbb 1101 1100 FBBB uuuu uu1Q QQQQ +// MPYHU<.f> a,limm,c 0010 0110 0001 1100 F111 CCCC CCAA AAAA (+ Limm) +// MPYHU<.f> a,b,limm 0010 0bbb 0001 1100 FBBB 1111 10AA AAAA (+ Limm) +// MPYHU<.cc><.f> b,b,limm 0010 0bbb 1101 1100 FBBB 1111 100Q QQQQ (+ Limm) +// +// MPYHU<.f> 0,b,c 0010 0bbb 0001 1100 FBBB CCCC CC11 1110 +// MPYHU<.f> 0,b,u6 0010 0bbb 0101 1100 FBBB uuuu uu11 1110 +// MPYHU<.cc><.f> 0,limm,c 0010 0110 1101 1100 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MPYHU(stream, pc, op, opcodes); break; // MPYHU * + } + case 0x1d: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// MPYU<.f> a,b,c 0010 0bbb 0001 1101 FBBB CCCC CCAA AAAA +// MPYU<.f> a,b,u6 0010 0bbb 0101 1101 FBBB uuuu uuAA AAAA +// MPYU<.f> b,b,s12 0010 0bbb 1001 1101 FBBB ssss ssSS SSSS +// MPYU<.cc><.f> b,b,c 0010 0bbb 1101 1101 FBBB CCCC CC0Q QQQQ +// MPYU<.cc><.f> b,b,u6 0010 0bbb 1101 1101 FBBB uuuu uu1Q QQQQ +// MPYU<.f> a,limm,c 0010 0110 0001 1101 F111 CCCC CCAA AAAA (+ Limm) +// MPYU<.f> a,b,limm 0010 0bbb 0001 1101 FBBB 1111 10AA AAAA (+ Limm) +// MPYU<.cc><.f> b,b,limm 0010 0bbb 1101 1101 FBBB 1111 100Q QQQQ (+ Limm) +// +// MPYU<.f> 0,b,c 0010 0bbb 0001 1101 FBBB CCCC CC11 1110 +// MPYU<.f> 0,b,u6 0010 0bbb 0101 1101 FBBB uuuu uu11 1110 +// MPYU<.cc><.f> 0,limm,c 0010 0110 1101 1101 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MPYU(stream, pc, op, opcodes); break; // MPYU * + } + case 0x20: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// Jcc [c] 0010 0RRR 1110 0000 0RRR CCCC CC0Q QQQQ +// Jcc limm 0010 0RRR 1110 0000 0RRR 1111 100Q QQQQ (+ Limm) +// Jcc u6 0010 0RRR 1110 0000 0RRR uuuu uu1Q QQQQ +// Jcc.F [ilink1] 0010 0RRR 1110 0000 1RRR 0111 010Q QQQQ +// Jcc.F [ilink2] 0010 0RRR 1110 0000 1RRR 0111 100Q QQQQ +// IIII I SS SSSS +// J [c] 0010 0RRR 0010 0000 0RRR CCCC CCRR RRRR +// J.F [ilink1] 0010 0RRR 0010 0000 1RRR 0111 01RR RRRR +// J.F [ilink2] 0010 0RRR 0010 0000 1RRR 0111 10RR RRRR +// J limm 0010 0RRR 0010 0000 0RRR 1111 10RR RRRR (+ Limm) +// J u6 0010 0RRR 0110 0000 0RRR uuuu uuRR RRRR +// J s12 0010 0RRR 1010 0000 0RRR ssss ssSS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_Jcc(stream, pc, op, opcodes); break; // Jcc + } + case 0x21: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// Jcc.D u6 0010 0RRR 1110 0001 0RRR uuuu uu1Q QQQQ +// Jcc.D [c] 0010 0RRR 1110 0001 0RRR CCCC CC0Q QQQQ +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// J.D [c] 0010 0RRR 0010 0001 0RRR CCCC CCRR RRRR +// J.D u6 0010 0RRR 0110 0001 0RRR uuuu uuRR RRRR +// J.D s12 0010 0RRR 1010 0001 0RRR ssss ssSS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + size = handle::dasm32_Jcc_D(stream, pc, op, opcodes); break; // Jcc.D + } + case 0x22: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// JLcc [c] 0010 0RRR 1110 0010 0RRR CCCC CC0Q QQQQ +// JLcc limm 0010 0RRR 1110 0010 0RRR 1111 100Q QQQQ (+ Limm) +// JLcc u6 0010 0RRR 1110 0010 0RRR uuuu uu1Q QQQQ +// JL [c] 0010 0RRR 0010 0010 0RRR CCCC CCRR RRRR +// JL limm 0010 0RRR 0010 0010 0RRR 1111 10RR RRRR (+ Limm) +// JL u6 0010 0RRR 0110 0010 0RRR uuuu uuRR RRRR +// JL s12 0010 0RRR 1010 0010 0RRR ssss ssSS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_JLcc(stream, pc, op, opcodes); break; // JLcc + } + case 0x23: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// JLcc.D u6 0010 0RRR 1110 0011 0RRR uuuu uu1Q QQQQ +// JLcc.D [c] 0010 0RRR 1110 0011 0RRR CCCC CC0Q QQQQ +// JL.D [c] 0010 0RRR 0010 0011 0RRR CCCC CCRR RRRR +// JL.D u6 0010 0RRR 0110 0011 0RRR uuuu uuRR RRRR +// JL.D s12 0010 0RRR 1010 0011 0RRR ssss ssSS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_JLcc_D(stream, pc, op, opcodes); break; // JLcc.D + } + case 0x28: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// LP<cc> u7 0010 0RRR 1110 1000 0RRR uuuu uu1Q QQQQ +// LP s13 0010 0RRR 1010 1000 0RRR ssss ssSS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_LP(stream, pc, op, opcodes); break; // LPcc + } + case 0x29: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// PP +// General Operations Reg-Reg 0010 0bbb 00ii iiii FBBB CCCC CCAA AAAA +// FLAG c 0010 0000 0010 1001 0000 0000 0100 0000 (Leapster BIOS uses this redundant encoding where A is unused?) +// +// PP +// Gen Op Reg+6-bit unsigned Imm 0010 0bbb 01ii iiii FBBB UUUU UUAA AAAA +// no listed FLAG encodings +// +// PP +// Gen Op Reg+12-bit signed Imm 0010 0bbb 10ii iiii FBBB ssss ssSS SSSS +// FLAG s12 0010 0rrr 1010 1001 0RRR ssss ssSS SSSS +// +// PP M +// Gen Op Conditional Register 0010 0bbb 11ii iiii FBBB CCCC CC0Q QQQQ +// FLAG<.cc> c 0010 0rrr 1110 1001 0RRR CCCC CC0Q QQQQ +// FLAG<.cc> limm 0010 0rrr 1110 1001 0RRR 1111 100Q QQQQ (+ Limm) +// +// PP M +// Gen Op ConReg 6-bit unsign Imm 0010 0bbb 11ii iiii FBBB UUUU UU1Q QQQQ +// FLAG<.cc> u6 0010 0rrr 1110 1001 0RRR uuuu uu1Q QQQQ +// +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_FLAG(stream, pc, op, opcodes); break; // FLAG + } + case 0x2a: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// LR b,[c] 0010 0bbb 0010 1010 0BBB CCCC CCRR RRRR +// LR b,[limm] 0010 0bbb 0010 1010 0BBB 1111 10RR RRRR (+ Limm) +// LR b,[u6] 0010 0bbb 0110 1010 0BBB uuuu uu00 0000 +// LR b,[s12] 0010 0bbb 1010 1010 0BBB ssss ssSS SSSS +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_LR(stream, pc, op, opcodes); break; // LR + } + case 0x2b: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// SR b,[c] 0010 0bbb 0010 1011 0BBB CCCC CCRR RRRR +// SR b,[limm] 0010 0bbb 0010 1011 0BBB 1111 10RR RRRR (+ Limm) +// SR b,[u6] 0010 0bbb 0110 1011 0BBB uuuu uu00 0000 +// SR b,[s12] 0010 0bbb 1010 1011 0BBB ssss ssSS SSSS +// SR limm,[c] 0010 0110 0010 1011 0111 CCCC CCRR RRRR (+ Limm) +// SR limm,[u6] 0010 0110 0110 1011 0111 uuuu uu00 0000 +// SR limm,[s12] 0010 0110 1010 1011 0111 ssss ssSS SSSS (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SR(stream, pc, op, opcodes); break; // SR + } + case 0x2f: // Sub Opcode + { + uint8_t subinstr2 = op & 0x0000003f; + switch (subinstr2 & 0x3f) + { + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// ASL<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0000 +// ASL<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0000 +// ASL<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0000 (+ Limm) +// +// ASL<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0000 +// ASL<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0000 +// ASL<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0000 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ASL_single(stream, pc, op, opcodes); break; // ASL + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// ASR<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0001 +// ASR<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0001 +// ASR<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0001 (+ Limm) +// +// ASR<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0001 +// ASR<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0001 +// ASR<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0001 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ASR_single(stream, pc, op, opcodes); break; // ASR + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// LSR<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0010 +// LSR<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0010 +// LSR<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0010 (+ Limm) +// +// LSR<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0010 +// LSR<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0010 +// LSR<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0010 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_LSR_single(stream, pc, op, opcodes); break; // LSR + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// ROR<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0011 +// ROR<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0011 +// ROR<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0011 (+ Limm) +// +// ROR<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0011 +// ROR<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0011 +// ROR<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0011 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ROR_single(stream, pc, op, opcodes); break; // ROR + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// RRC<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0100 +// RRC<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0100 +// RRC<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0100 (+ Limm) +// +// RRC<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0100 +// RRC<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0100 +// RRC<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0100 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_RRC(stream, pc, op, opcodes); break; // RCC + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// SEXB<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0101 +// SEXB<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0101 +// SEXB<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0101 (+ Limm) +// +// SEXB<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0101 +// SEXB<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0101 +// SEXB<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0101 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SEXB(stream, pc, op, opcodes); break; // SEXB + } + case 0x06: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// SEXW<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0110 +// SEXW<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0110 +// SEXW<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0110 (+ Limm) +// +// SEXW<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0110 +// SEXW<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0110 +// SEXW<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0110 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SEXW(stream, pc, op, opcodes); break; // SEXW + } + case 0x07: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// EXTB<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 0111 +// EXTB<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 0111 +// EXTB<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 0111 (+ Limm) +// +// EXTB<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 0111 +// EXTB<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 0111 +// EXTB<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 0111 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_EXTB(stream, pc, op, opcodes); break; // EXTB + } + case 0x08: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// EXTW<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 1000 +// EXTW<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 1000 +// EXTW<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 1000 (+ Limm) +// +// EXTW<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 1000 +// EXTW<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 1000 +// EXTW<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 1000 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_EXTW(stream, pc, op, opcodes); break; // EXTW + } + case 0x09: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// ABS<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 1001 +// ABS<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 1001 +// ABS<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 1001 (+ Limm) +// +// ABS<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 1001 +// ABS<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 1001 +// ABS<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 1001 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ABS(stream, pc, op, opcodes); break; // ABS + } + case 0x0a: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// NOT<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 1010 +// NOT<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 1010 +// NOT<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 1010 (+ Limm) +// +// NOT<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 1010 +// NOT<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 1010 +// NOT<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 1010 (+ Limm) +// +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_NOT(stream, pc, op, opcodes); break; // NOT + } + case 0x0b: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// RLC<.f> b,c 0010 0bbb 0010 1111 FBBB CCCC CC00 1011 +// RLC<.f> b,u6 0010 0bbb 0110 1111 FBBB uuuu uu00 1011 +// RLC<.f> b,limm 0010 0bbb 0010 1111 FBBB 1111 1000 1011 (+ Limm) +// +// RLC<.f> 0,c 0010 0110 0010 1111 F111 CCCC CC00 1011 +// RLC<.f> 0,u6 0010 0110 0110 1111 F111 uuuu uu00 1011 +// RLC<.f> 0,limm 0010 0110 0010 1111 F111 1111 1000 1011 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_RLC(stream, pc, op, opcodes); break; // RLC + } + case 0x0c: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS ss ssss +// EX<.di> b,[c] 0010 0bbb 0010 1111 DBBB CCCC CC00 1100 +// EX<.di> b,[u6] 0010 0bbb 0110 1111 DBBB uuuu uu00 1100 +// EX<.di> b,[limm] 0010 0bbb 0010 1111 DBBB 1111 1000 1100 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_EX(stream, pc, op, opcodes); break; // EX + } + case 0x3f: // ZOPs (Zero Operand Opcodes) + { + uint8_t subinstr3 = (op & 0x07000000) >> 24; + subinstr3 |= ((op & 0x00007000) >> 12) << 3; + + switch (subinstr3 & 0x3f) + { + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I$$$ SS SSSS $$$ ss ssss +// SLEEP <u6> 0010 0001 0110 1111 0000 uuuu uu11 1111 +// SLEEP c 0010 0001 0010 1111 0000 CCCC CC11 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SLEEP(stream, pc, op, opcodes); break; // SLEEP + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I$$$ SS SSSS $$$ ss ssss +// SWI/TRAP0 0010 0010 0110 1111 0000 0000 0011 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SWI(stream, pc, op, opcodes); break; // SWI / TRAP9 + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I$$$ SS SSSS $$$ ss ssss +// SYNC 0010 0011 0110 1111 0000 0000 0011 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SYNC(stream, pc, op, opcodes); break; // SYNC + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I$$$ SS SSSS $$$ ss ssss +// RTIE 0010 0100 0110 1111 0000 0000 0011 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_RTIE(stream, pc, op, opcodes); break; // RTIE + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I$$$ SS SSSS $$$ ss ssss +// BRK 0010 0101 0110 1111 0000 0000 0011 1111 +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_BRK(stream, pc, op, opcodes); break; // BRK + } + + default: + { + // 0x00, 0x06-0x3f + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, subinstr3, op, opcodes); break; // illegal + } + } + break; + } + default: + { + // 0x0d - 0x3e + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; // illegal + } + } + break; + } + +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// LD<zz><.x><.aa><.di> a,[b,c] 0010 0bbb aa11 0ZZX DBBB CCCC CCAA AAAA +// LD<zz><.x><.aa><.di> 0,[b,c] 0010 0bbb aa11 0ZZX DBBB CCCC CC11 1110 +// PREFETCH<.aa> [b,c] 0010 0bbb aa11 0000 0BBB CCCC CC11 1110 (ZZXD is 0) (prefetch is an alias) +// +// LD<zz><.x><.aa><.di> a,[b,limm] 0010 0bbb aa11 0ZZX DBBB 1111 10AA AAAA (+ Limm) (C is 62) +// LD<zz><.x><.aa><.di> 0,[b,limm] 0010 0bbb aa11 0ZZX DBBB 1111 1011 1110 (+ Limm) (C is 62) +// PREFETCH<.aa> [b,limm] 0010 0bbb aa11 0000 0BBB 1111 1011 1110 (+ Limm) (C is 62) (ZZXD is 0) (prefetch is an alias) +// +// if b is 62 (Limm) then aa becomes RR (reserved) +// LD<zz><.x><.di> a,[limm,c] 0010 0110 RR11 0ZZX D111 CCCC CCAA AAAA (+ Limm) (b is 62) +// LD<zz><.x><.di> 0,[limm,c] 0010 0110 RR11 0ZZX D111 CCCC CC11 1110 (+ Limm) (b is 62) +// PREFETCH [limm,c] 0010 0110 RR11 0000 0111 CCCC CC11 1110 (+ Limm) (b is 62) (ZZXD is 0) (prefetch is an alias) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + case 0x30: size = handle::dasm32_LD_0(stream, pc, op, opcodes); break; // LD r-r + case 0x31: size = handle::dasm32_LD_1(stream, pc, op, opcodes); break; // LD r-r + case 0x32: size = handle::dasm32_LD_2(stream, pc, op, opcodes); break; // LD r-r + case 0x33: size = handle::dasm32_LD_3(stream, pc, op, opcodes); break; // LD r-r + case 0x34: size = handle::dasm32_LD_4(stream, pc, op, opcodes); break; // LD r-r + case 0x35: size = handle::dasm32_LD_5(stream, pc, op, opcodes); break; // LD r-r + case 0x36: size = handle::dasm32_LD_6(stream, pc, op, opcodes); break; // LD r-r + case 0x37: size = handle::dasm32_LD_7(stream, pc, op, opcodes); break; // LD r-r + default: + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, op, opcodes); break; // illegal + } + } + break; + } + case 0x05: // op a,b,c (05 ARC ext) + { + uint8_t subinstr = (op & 0x003f0000) >> 16; + + switch (subinstr) + { + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// ASL<.f> a,b,c 0010 1bbb 0000 0000 FBBB CCCC CCAA AAAA +// ASL<.f> a,b,u6 0010 1bbb 0100 0000 FBBB uuuu uuAA AAAA +// ASL<.f> b,b,s12 0010 1bbb 1000 0000 FBBB ssss ssSS SSSS +// ASL<.cc><.f> b,b,c 0010 1bbb 1100 0000 FBBB CCCC CC0Q QQQQ +// ASL<.cc><.f> b,b,u6 0010 1bbb 1100 0000 FBBB uuuu uu1Q QQQQ +// ASL<.f> a,limm,c 0010 1110 0000 0000 F111 CCCC CCAA AAAA (+ Limm) +// ASL<.f> a,b,limm 0010 1bbb 0000 0000 FBBB 1111 10AA AAAA (+ Limm) +// ASL<.cc><.f> b,b,limm 0010 1bbb 1100 0000 FBBB 1111 100Q QQQQ (+ Limm) +// +// ASL<.f> 0,b,c 0010 1bbb 0000 0000 FBBB CCCC CC11 1110 +// ASL<.f> 0,b,u6 0010 1bbb 0100 0000 FBBB uuuu uu11 1110 +// ASL<.cc><.f> 0,limm,c 0010 1110 1100 0000 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ASL_multiple(stream, pc, op, opcodes); break; // ASL + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// LSR<.f> a,b,c 0010 1bbb 0000 0001 FBBB CCCC CCAA AAAA +// LSR<.f> a,b,u6 0010 1bbb 0100 0001 FBBB uuuu uuAA AAAA +// LSR<.f> b,b,s12 0010 1bbb 1000 0001 FBBB ssss ssSS SSSS +// LSR<.cc><.f> b,b,c 0010 1bbb 1100 0001 FBBB CCCC CC0Q QQQQ +// LSR<.cc><.f> b,b,u6 0010 1bbb 1100 0001 FBBB uuuu uu1Q QQQQ +// LSR<.f> a,limm,c 0010 1110 0000 0001 F111 CCCC CCAA AAAA (+ Limm) +// LSR<.f> a,b,limm 0010 1bbb 0000 0001 FBBB 1111 10AA AAAA (+ Limm) +// LSR<.cc><.f> b,b,limm 0010 1bbb 1100 0001 FBBB 1111 100Q QQQQ (+ Limm) +// +// LSR<.f> 0,b,c 0010 1bbb 0000 0001 FBBB CCCC CC11 1110 +// LSR<.f> 0,b,u6 0010 1bbb 0100 0001 FBBB uuuu uu11 1110 +// LSR<.cc><.f> 0,limm,c 0010 1110 1100 0001 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_LSR_multiple(stream, pc, op, opcodes); break; // LSR + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ASR<.f> a,b,c 0010 1bbb 0000 0010 FBBB CCCC CCAA AAAA +// ASR<.f> a,b,u6 0010 1bbb 0100 0010 FBBB uuuu uuAA AAAA +// ASR<.f> b,b,s12 0010 1bbb 1000 0010 FBBB ssss ssSS SSSS +// ASR<.cc><.f> b,b,c 0010 1bbb 1100 0010 FBBB CCCC CC0Q QQQQ +// ASR<.cc><.f> b,b,u6 0010 1bbb 1100 0010 FBBB uuuu uu1Q QQQQ +// ASR<.f> a,limm,c 0010 1110 0000 0010 F111 CCCC CCAA AAAA (+ Limm) +// ASR<.f> a,b,limm 0010 1bbb 0000 0010 FBBB 1111 10AA AAAA (+ Limm) +// ASR<.cc><.f> b,b,limm 0010 1bbb 1100 0010 FBBB 1111 100Q QQQQ (+ Limm) +// +// ASR<.f> 0,b,c 0010 1bbb 0000 0010 FBBB CCCC CC11 1110 +// ASR<.f> 0,b,u6 0010 1bbb 0100 0010 FBBB uuuu uu11 1110 +// ASR<.cc><.f> 0,limm,c 0010 1110 1100 0010 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ASR_multiple(stream, pc, op, opcodes); break; // ASR + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ROR<.f> a,b,c 0010 1bbb 0000 0011 FBBB CCCC CCAA AAAA +// ROR<.f> a,b,u6 0010 1bbb 0100 0011 FBBB uuuu uuAA AAAA +// ROR<.f> b,b,s12 0010 1bbb 1000 0011 FBBB ssss ssSS SSSS +// ROR<.cc><.f> b,b,c 0010 1bbb 1100 0011 FBBB CCCC CC0Q QQQQ +// ROR<.cc><.f> b,b,u6 0010 1bbb 1100 0011 FBBB uuuu uu1Q QQQQ +// ROR<.f> a,limm,c 0010 1110 0000 0011 F111 CCCC CCAA AAAA (+ Limm) +// ROR<.f> a,b,limm 0010 1bbb 0000 0011 FBBB 1111 10AA AAAA (+ Limm) +// ROR<.cc><.f> b,b,limm 0010 1bbb 1100 0011 FBBB 1111 100Q QQQQ (+ Limm) +// +// ROR<.f> 0,b,c 0010 1bbb 0000 0011 FBBB CCCC CC11 1110 +// ROR<.f> 0,b,u6 0010 1bbb 0100 0011 FBBB uuuu uu11 1110 +// ROR<.cc><.f> 0,limm,c 0010 1110 1100 0011 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ROR_multiple(stream, pc, op, opcodes); break; // ROR + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// MUL64 <0,>b,c 0010 1bbb 0000 0100 0BBB CCCC CC11 1110 +// MUL64 <0,>b,u6 0010 1bbb 0100 0100 0BBB uuuu uu11 1110 +// MUL64 <0,>b,s12 0010 1bbb 1000 0100 0BBB ssss ssSS SSSS +// MUL64 <0,>limm,c 0010 1110 0000 0100 0111 CCCC CC11 1110 (+ Limm) +// +// MUL64<.cc> <0,>b,c 0010 1bbb 1100 0100 0BBB CCCC CC0Q QQQQ +// MUL64<.cc> <0,>b,u6 0010 1bbb 1100 0100 0BBB uuuu uu1Q QQQQ +// MUL64<.cc> <0,>limm,c 0010 1110 1100 0100 0111 CCCC CC0Q QQQQ (+ Limm) +// MUL64<.cc> <0,>b,limm 0010 1bbb 1100 0100 0BBB 1111 100Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MUL64(stream, pc, op, opcodes); break; // MUL64 + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// MULU64 <0,>b,c 0010 1bbb 0000 0101 0BBB CCCC CC11 1110 +// MULU64 <0,>b,u6 0010 1bbb 0100 0101 0BBB uuuu uu11 1110 +// MULU64 <0,>b,s12 0010 1bbb 1000 0101 0BBB ssss ssSS SSSS +// MULU64 <0,>limm,c 0010 1110 0000 0101 0111 CCCC CC11 1110 (+ Limm) +// +// MULU64<.cc> <0,>b,c 0010 1bbb 1100 0101 0BBB CCCC CC0Q QQQQ +// MULU64<.cc> <0,>b,u6 0010 1bbb 1100 0101 0BBB uuuu uu1Q QQQQ +// MULU64<.cc> <0,>limm,c 0010 1110 1100 0101 0111 CCCC CC0Q QQQQ (+ Limm) +// MULU64<.cc> <0,>b,limm 0010 1bbb 1100 0101 0BBB 1111 100Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_MULU64(stream, pc, op, opcodes); break; // MULU64 + } + case 0x06: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ADDS<.f> a,b,c 0010 1bbb 0000 0110 FBBB CCCC CCAA AAAA +// ADDS<.f> a,b,u6 0010 1bbb 0100 0110 FBBB uuuu uuAA AAAA +// ADDS<.f> b,b,s12 0010 1bbb 1000 0110 FBBB ssss ssSS SSSS +// ADDS<.cc><.f> b,b,c 0010 1bbb 1100 0110 FBBB CCCC CC0Q QQQQ +// ADDS<.cc><.f> b,b,u6 0010 1bbb 1100 0110 FBBB uuuu uu1Q QQQQ +// ADDS<.f> a,limm,c 0010 1110 0000 0110 F111 CCCC CCAA AAAA (+ Limm) +// ADDS<.f> a,b,limm 0010 1bbb 0000 0110 FBBB 1111 10AA AAAA (+ Limm) +// ADDS<.cc><.f> b,b,limm 0010 1bbb 1100 0110 FBBB 1111 10QQ QQQQ (+ Limm) +// +// ADDS<.f> 0,b,c 0010 1bbb 0000 0110 FBBB CCCC CC11 1110 +// ADDS<.f> 0,b,u6 0010 1bbb 0100 0110 FBBB uuuu uu11 1110 +// ADDS<.f> 0,b,limm 0010 1bbb 0000 0110 FBBB 1111 1011 1110 (+ Limm) +// ADDS<.cc><.f> 0,limm,c 0010 1110 1100 0110 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADDS(stream, pc, op, opcodes); break; // ADDS + } + case 0x07: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// SUBS<.f> a,b,c 0010 1bbb 0000 0111 FBBB CCCC CCAA AAAA +// SUBS<.f> a,b,u6 0010 1bbb 0100 0111 FBBB uuuu uuAA AAAA +// SUBS<.f> b,b,s12 0010 1bbb 1000 0111 FBBB ssss ssSS SSSS +// SUBS<.cc><.f> b,b,c 0010 1bbb 1100 0111 FBBB CCCC CC0Q QQQQ +// SUBS<.cc><.f> b,b,u6 0010 1bbb 1100 0111 FBBB uuuu uu1Q QQQQ +// SUBS<.f> a,limm,c 0010 1110 0000 0111 F111 CCCC CCAA AAAA (+ Limm) +// SUBS<.f> a,b,limm 0010 1bbb 0000 0111 FBBB 1111 10AA AAAA (+ Limm) +// SUBS<.cc><.f> b,b,limm 0010 1bbb 1100 0111 FBBB 1111 10QQ QQQQ (+ Limm) +// +// SUBS<.f> 0,b,c 0010 1bbb 0000 0111 FBBB CCCC CC11 1110 +// SUBS<.f> 0,b,u6 0010 1bbb 0100 0111 FBBB uuuu uu11 1110 +// SUBS<.f> 0,b,limm 0010 1bbb 0000 0111 FBBB 1111 1011 1110 (+ Limm) +// SUBS<.cc><.f> 0,limm,c 0010 1110 1100 0111 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SUBS(stream, pc, op, opcodes); break; // SUBS + } + case 0x08: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// DIVAW a,b,c 0010 1bbb 0000 1000 0BBB CCCC CCAA AAAA +// DIVAW a,b,u6 0010 1bbb 0100 1000 0BBB uuuu uuAA AAAA +// DIVAW b,b,s12 0010 1bbb 1000 1000 0BBB ssss ssSS SSSS +// DIVAW<.cc> b,b,c 0010 1bbb 1100 1000 0BBB CCCC CC0Q QQQQ +// DIVAW<.cc> b,b,u6 0010 1bbb 1100 1000 0BBB uuuu uu1Q QQQQ +// DIVAW a,limm,c 0010 1110 0000 1000 0111 CCCC CCAA AAAA (+ Limm) +// DIVAW a,b,limm 0010 1bbb 0000 1000 0BBB 1111 10AA AAAA (+ Limm) +// DIVAW<.cc> b,b,limm 0010 1bbb 1100 1000 0BBB 1111 10QQ QQQQ (+ Limm) +// +// DIVAW 0,b,c 0010 1bbb 0000 1000 0BBB CCCC CC11 1110 +// DIVAW 0,b,u6 0010 1bbb 0100 1000 0BBB uuuu uu11 1110 +// DIVAW<.cc> 0,limm,c 0010 1110 1100 1000 0111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_DIVAW(stream, pc, op, opcodes); break; // DIVAW + } + case 0x0a: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// IIII I SS SSSS +// ASLS<.f> a,b,c 0010 1bbb 0000 1010 FBBB CCCC CCAA AAAA +// ASLS<.f> a,b,u6 0010 1bbb 0100 1010 FBBB uuuu uuAA AAAA +// ASLS<.f> b,b,s12 0010 1bbb 1000 1010 FBBB ssss ssSS SSSS +// ASLS<.cc><.f> b,b,c 0010 1bbb 1100 1010 FBBB CCCC CC0Q QQQQ +// ASLS<.cc><.f> b,b,u6 0010 1bbb 1100 1010 FBBB uuuu uu1Q QQQQ +// ASLS<.f> a,limm,c 0010 1110 0000 1010 F111 CCCC CCAA AAAA (+ Limm) +// ASLS<.f> a,b,limm 0010 1bbb 0000 1010 FBBB 1111 10AA AAAA (+ Limm) +// ASLS<.cc><.f> b,b,limm 0010 1bbb 1100 1010 FBBB 1111 10QQ QQQQ (+ Limm) +// ASLS<.f> 0,b,c 0010 1bbb 0000 1010 FBBB CCCC CC11 1110 +// ASLS<.f> 0,b,u6 0010 1bbb 0100 1010 FBBB uuuu uu11 1110 +// ASLS<.cc><.f> 0,limm,c 0010 1110 1100 1010 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ASLS(stream, pc, op, opcodes); break; // ASLS + } + case 0x0b: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ASRS<.f> a,b,c 0010 1bbb 0000 1011 FBBB CCCC CCAA AAAA +// ASRS<.f> a,b,u6 0010 1bbb 0100 1011 FBBB uuuu uuAA AAAA +// ASRS<.f> b,b,s12 0010 1bbb 1000 1011 FBBB ssss ssSS SSSS +// ASRS<.cc><.f> b,b,c 0010 1bbb 1100 1011 FBBB CCCC CC0Q QQQQ +// ASRS<.cc><.f> b,b,u6 0010 1bbb 1100 1011 FBBB uuuu uu1Q QQQQ +// ASRS<.f> a,limm,c 0010 1110 0000 1011 F111 CCCC CCAA AAAA (+ Limm) +// ASRS<.f> a,b,limm 0010 1bbb 0000 1011 FBBB 1111 10AA AAAA (+ Limm) +// ASRS<.cc><.f> b,b,limm 0010 1bbb 1100 1011 FBBB 1111 10QQ QQQQ (+ Limm) +// +// ASRS<.f> 0,b,c 0010 1bbb 0000 1011 FBBB CCCC CC11 1110 +// ASRS<.f> 0,b,u6 0010 1bbb 0100 1011 FBBB uuuu uu11 1110 +// ASRS<.cc><.f> 0,limm,c 0010 1110 1100 1011 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ASRS(stream, pc, op, opcodes); break; // ASRS + } + case 0x0c: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Unknown Extension Op +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + // Leapster BIOS uses this in loop at 400384a0 + size = handle04_helper_dasm(stream, pc, op, opcodes, "UNKNOWN 0x05-0x0c op", 0,0); + break; + } +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Unknown Extension Op +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + case 0x10: + { + // Leapster BIOS uses this in loop at 400384a0 + size = handle04_helper_dasm(stream, pc, op, opcodes, "UNKNOWN 0x05-0x10 op", 0,0); + break; + } +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Unknown Extension Op +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + case 0x14: + { + // Leapster BIOS uses this in loop at 400384a0 + size = handle04_helper_dasm(stream, pc, op, opcodes, "UNKNOWN 0x05-0x14 op", 0,0); + break; + } + case 0x28: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ADDSDW<.f> a,b,c 0010 1bbb 0010 1000 FBBB CCCC CCAA AAAA +// ADDSDW<.f> a,b,u6 0010 1bbb 0110 1000 FBBB uuuu uuAA AAAA +// ADDSDW<.f> b,b,s12 0010 1bbb 1010 1000 FBBB ssss ssSS SSSS +// ADDSDW<.cc><.f> b,b,c 0010 1bbb 1110 1000 FBBB CCCC CC0Q QQQQ +// ADDSDW<.cc><.f> b,b,u6 0010 1bbb 1110 1000 FBBB uuuu uu1Q QQQQ +// ADDSDW<.f> a,limm,c 0010 1110 0010 1000 F111 CCCC CCAA AAAA (+ Limm) +// ADDSDW<.f> a,b,limm 0010 1bbb 0010 1000 FBBB 1111 10AA AAAA (+ Limm) +// ADDSDW<.cc><.f> b,b,limm 0010 1bbb 1110 1000 FBBB 1111 10QQ QQQQ (+ Limm) +// +// ADDSDW<.f> 0,b,c 0010 1bbb 0010 1000 FBBB CCCC CC11 1110 +// ADDSDW<.f> 0,b,u6 0010 1bbb 0110 1000 FBBB uuuu uu11 1110 +// ADDSDW<.cc><.f> 0,limm,c 0010 1110 1110 1000 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ADDSDW(stream, pc, op, opcodes); break; // ADDSDW + } + case 0x29: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// SUBSDW<.f> a,b,c 0010 1bbb 0010 1001 FBBB CCCC CCAA AAAA +// SUBSDW<.f> a,b,u6 0010 1bbb 0110 1001 FBBB uuuu uuAA AAAA +// SUBSDW<.f> b,b,s12 0010 1bbb 1010 1001 FBBB ssss ssSS SSSS +// SUBSDW<.cc><.f> b,b,c 0010 1bbb 1110 1001 FBBB CCCC CC0Q QQQQ +// SUBSDW<.cc><.f> b,b,u6 0010 1bbb 1110 1001 FBBB uuuu uu1Q QQQQ +// SUBSDW<.f> a,limm,c 0010 1110 0010 1001 F111 CCCC CCAA AAAA (+ Limm) +// SUBSDW<.f> a,b,limm 0010 1bbb 0010 1001 FBBB 1111 10AA AAAA (+ Limm) +// SUBSDW<.cc><.f> b,b,limm 0010 1bbb 1110 1001 FBBB 1111 10QQ QQQQ (+ Limm) +// +// SUBSDW<.f> 0,b,c 0010 1bbb 0010 1001 FBBB CCCC CC11 1110 +// SUBSDW<.f> 0,b,u6 0010 1bbb 0110 1001 FBBB uuuu uu11 1110 +// SUBSDW<.cc><.f> 0,limm,c 0010 1110 1110 1001 F111 CCCC CC0Q QQQQ (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SUBSDW(stream, pc, op, opcodes); break; // SUBSDW + } + case 0x2f: // SOPs + { + uint8_t subinstr2 = op & 0x0000003f; + switch (subinstr2) + { + case 0x00: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// SWAP<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0000 +// SWAP<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0000 +// SWAP<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0000 (+ Limm) +// +// SWAP<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0000 +// SWAP<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0000 +// SWAP<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0000 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SWAP(stream, pc, op, opcodes); break; // SWAP + } + case 0x01: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// NORM<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0001 +// NORM<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0001 +// NORM<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0001 (+ Limm) +// +// NORM<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0001 +// NORM<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0001 +// NORM<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0001 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_NORM(stream, pc, op, opcodes); break; // NORM + } + case 0x02: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// SAT16<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0010 +// SAT16<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0010 +// SAT16<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0010 (+ Limm) +// +// SAT16<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0010 +// SAT16<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0010 +// SAT16<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0010 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_SAT16(stream, pc, op, opcodes); break; // SAT16 + } + case 0x03: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// RND16<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0011 +// RND16<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0011 +// RND16<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0011 (+ Limm) +// +// RND16<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0011 +// RND16<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0011 +// RND16<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0011 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_RND16(stream, pc, op, opcodes); break; // RND16 + } + case 0x04: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ABSSW<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0100 +// ABSSW<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0100 +// ABSSW<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0100 (+ Limm) +// +// ABSSW<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0100 +// ABSSW<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0100 +// ABSSW<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0100 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ABSSW(stream, pc, op, opcodes); break; // ABSSW + } + case 0x05: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// ABSS<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0101 +// ABSS<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0101 +// ABSS<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0101 (+ Limm) +// +// ABSS<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0101 +// ABSS<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0101 +// ABSS<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0101 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_ABSS(stream, pc, op, opcodes); break; // ABSS + } + case 0x06: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// NEGSW<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0110 +// NEGSW<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0110 +// NEGSW<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0110 (+ Limm) +// +// NEGSW<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0110 +// NEGSW<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0110 +// NEGSW<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0110 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_NEGSW(stream, pc, op, opcodes); break; // NEGSW + } + case 0x07: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// NEGS<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 0111 +// NEGS<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 0111 +// NEGS<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 0111 (+ Limm) +// +// NEGS<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 0111 +// NEGS<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 0111 +// NEGS<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 0111 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_NEGS(stream, pc, op, opcodes); break; // NEGS + } + case 0x08: + { +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// NORMW<.f> b,c 0010 1bbb 0010 1111 FBBB CCCC CC00 1000 +// NORMW<.f> b,u6 0010 1bbb 0110 1111 FBBB uuuu uu00 1000 +// NORMW<.f> b,limm 0010 1bbb 0010 1111 FBBB 1111 1000 1000 (+ Limm) +// +// NORMW<.f> 0,c 0010 1110 0010 1111 F111 CCCC CC00 1000 +// NORMW<.f> 0,u6 0010 1110 0110 1111 F111 uuuu uu00 1000 +// NORMW<.f> 0,limm 0010 1110 0010 1111 F111 1111 1000 1000 (+ Limm) +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + size = handle::dasm32_NORMW(stream, pc, op, opcodes); break; // NORMW + } + case 0x3f: // ZOPs (Zero Operand Opcodes) + { + uint8_t subinstr3 = (op & 0x07000000) >> 24; + subinstr3 |= ((op & 0x00007000) >> 12) << 3; + + switch (subinstr3) + { + default: + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, subinstr3, op, opcodes); break; // illegal + } + } + break; + } + default: + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; // illegal + } + } + break; + } + default: + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, op, opcodes); break; // illegal + } + + } + break; + } + case 0x06: size = handle::dasm32_ARC_EXT06(stream, pc, op, opcodes); break; // op a,b,c (06 ARC ext) + case 0x07: size = handle::dasm32_USER_EXT07(stream, pc, op, opcodes); break; // op a,b,c (07 User ext) + case 0x08: size = handle::dasm32_USER_EXT08(stream, pc, op, opcodes); break; // op a,b,c (08 User ext) + case 0x09: size = handle::dasm32_MARKET_EXT09(stream, pc, op, opcodes); break; // op a,b,c (09 Market ext) + case 0x0a: size = handle::dasm32_MARKET_EXT0a(stream, pc, op, opcodes); break; // op a,b,c (0a Market ext) + case 0x0b: size = handle::dasm32_MARKET_EXT0b(stream, pc, op, opcodes); break; // op a,b,c (0b Market ext) } } else { size = 2; - op &= ~0xf800; - switch (instruction) // 16-bit instructions { - case 0x0c: size = handle0c_dasm(stream, pc, op, opcodes); break; // Load/Add reg-reg - case 0x0d: size = handle0d_dasm(stream, pc, op, opcodes); break; // Add/Sub/Shft imm - case 0x0e: size = handle0e_dasm(stream, pc, op, opcodes); break; // Mov/Cmp/Add - case 0x0f: size = handle0f_dasm(stream, pc, op, opcodes); break; // op_S b,b,c (single 16-bit ops) - case 0x10: size = handle10_dasm(stream, pc, op, opcodes); break; // LD_S - case 0x11: size = handle11_dasm(stream, pc, op, opcodes); break; // LDB_S - case 0x12: size = handle12_dasm(stream, pc, op, opcodes); break; // LDW_S - case 0x13: size = handle13_dasm(stream, pc, op, opcodes); break; // LSW_S.X - case 0x14: size = handle14_dasm(stream, pc, op, opcodes); break; // ST_S - case 0x15: size = handle15_dasm(stream, pc, op, opcodes); break; // STB_S - case 0x16: size = handle16_dasm(stream, pc, op, opcodes); break; // STW_S - case 0x17: size = handle17_dasm(stream, pc, op, opcodes); break; // Shift/Sub/Bit - case 0x18: size = handle18_dasm(stream, pc, op, opcodes); break; // Stack Instr - case 0x19: size = handle19_dasm(stream, pc, op, opcodes); break; // GP Instr - case 0x1a: size = handle1a_dasm(stream, pc, op, opcodes); break; // PCL Instr - case 0x1b: size = handle1b_dasm(stream, pc, op, opcodes); break; // MOV_S - case 0x1c: size = handle1c_dasm(stream, pc, op, opcodes); break; // ADD_S/CMP_S - case 0x1d: size = handle1d_dasm(stream, pc, op, opcodes); break; // BRcc_S - case 0x1e: size = handle1e_dasm(stream, pc, op, opcodes); break; // Bcc_S - case 0x1f: size = handle1f_dasm(stream, pc, op, opcodes); break; // BL_S + default: break; // size = -1; + case 0x0c: // Load/Add reg-reg + { + uint8_t subinstr = (op & 0x0018) >> 3; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII I S S +// LD_S a,[b,c] 0110 0bbb ccc0 0aaa +// ####################################################################################################################### + size = handle::dasm_LD_S_a_b_c(stream, pc, op, opcodes); break; // LD_S a,[b,c] + } + case 0x01: + { +// ####################################################################################################################### +// IIII I S S +// LDB_S a,[b,c] 0110 0bbb ccc0 1aaa +// ####################################################################################################################### + size = handle::dasm_LDB_S_a_b_c(stream, pc, op, opcodes); break; // LDB_S a,[b,c] + } + case 0x02: + { +// ####################################################################################################################### +// IIII I S S +// LDW_S a,[b,c] 0110 0bbb ccc1 0aaa +// ####################################################################################################################### + size = handle::dasm_LDW_S_a_b_c(stream, pc, op, opcodes); break; // LDW_S a,[b,c] + } + case 0x03: + { +// ####################################################################################################################### +// IIII I S S +// ADD_S a,b,c 0110 0bbb ccc1 1aaa +// ####################################################################################################################### + size = handle::dasm_ADD_S_a_b_c(stream, pc, op, opcodes); break; // ADD_S a,b,c + } + } + break; + } + case 0x0d: // Add/Sub/Shft imm + { + uint8_t subinstr = (op & 0x0018) >> 3; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// ADD_S c,b,u3 0110 1bbb ccc0 0uuu +// ####################################################################################################################### + size = handle::dasm_ADD_S_c_b_u3(stream, pc, op, opcodes); break; // ADD_S c,b,u3 + } + case 0x01: + { +// ####################################################################################################################### +// SUB_S c,b,u3 0110 1bbb ccc0 1uuu +// ####################################################################################################################### + size = handle::dasm_SUB_S_c_b_u3(stream, pc, op, opcodes); break; // SUB_S c,b,u3 + } + case 0x02: + { +// ####################################################################################################################### +// IIII I S S +// ASL_S c,b,u3 0110 1bbb ccc1 0uuu +// ####################################################################################################################### + size = handle::dasm_ASL_S_c_b_u3(stream, pc, op, opcodes); break; // ASL_S c,b,u3 + } + case 0x03: + { +// ####################################################################################################################### +// IIII I S S +// ASR_S c,b,u3 0110 1bbb ccc1 1uuu +// ####################################################################################################################### + size = handle::dasm_ASR_S_c_b_u3(stream, pc, op, opcodes); break; // ASR_S c,b,u3 + } + } + break; + } + case 0x0e: // Mov/Cmp/Add + { + uint8_t subinstr = (op & 0x0018) >> 3; + + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII I S S +// ADD_S b,b,h 0111 0bbb hhh0 0HHH +// ADD_S b,b,limm 0111 0bbb 1100 0111 (+ Limm) +// ####################################################################################################################### + size = handle::dasm_ADD_S_b_b_h_or_limm(stream, pc, op, opcodes); break; // ADD_S b,b,h or ADD_S b,b,limm + } + case 0x01: + { +// ####################################################################################################################### +// IIII I S S +// MOV_S b,h 0111 0bbb hhh0 1HHH +// MOV_S b,limm 0111 0bbb 1100 1111 (+ Limm) +// ####################################################################################################################### + size = handle::dasm_MOV_S_b_h_or_limm(stream, pc, op, opcodes); break; // MOV_S b,h or MOV_S b,limm + } + case 0x02: + { +// ####################################################################################################################### +// IIII I S S +// CMP_S b,h 0111 0bbb hhh1 0HHH +// CMP_S b,limm 0111 0bbb 1101 0111 (+ Limm) +// ####################################################################################################################### + size = handle::dasm_CMP_S_b_h_or_limm(stream, pc, op, opcodes); break; // CMP_S b,h or CMP_S b,limm + } + case 0x03: + { +// ####################################################################################################################### +// IIII I S S +// MOV_S h,b 0111 0bbb hhh1 1HHH +// ####################################################################################################################### + size = handle::dasm_MOV_S_h_b(stream, pc, op, opcodes); break; // MOV_S h,b + } + } + break; + } + case 0x0f: // op_S b,b,c (single 16-bit ops) + { + uint8_t subinstr = op & 0x01f; + + switch (subinstr) + { + case 0x00: // SOPs + { + uint8_t subinstr2 = (op & 0x00e0) >> 5; + + switch (subinstr2) + { + case 0x00: + { +// ####################################################################################################################### +// IIII I sssS SSSS +// J_S [b] 0111 1bbb 0000 0000 +// ####################################################################################################################### + size = handle::dasm_J_S_b(stream, pc, op, opcodes); break; // J_S [b] + } + case 0x01: + { +// ####################################################################################################################### +// IIII I sssS SSSS +// J_S.D [b] 0111 1bbb 0010 0000 +// ####################################################################################################################### + size = handle::dasm_J_S_D_b(stream, pc, op, opcodes); break; // J_S.D [b] + } + case 0x02: + { +// ####################################################################################################################### +// IIII I sssS SSSS +// JL_S [b] 0111 1bbb 0100 0000 +// ####################################################################################################################### + size = handle::dasm_JL_S_b(stream, pc, op, opcodes); break; // JL_S [b] + } + case 0x03: + { +// ####################################################################################################################### +// IIII I sssS SSSS +// JL_S.D [b] 0111 1bbb 0110 0000 +// ####################################################################################################################### + size = handle::dasm_JL_S_D_b(stream, pc, op, opcodes); break; // JL_S.D [b] + } + case 0x06: + { +// ####################################################################################################################### +// SUB_S.NE b,b,b 0111 1bbb 1100 0000 +// IIII I sssS SSSS +// ####################################################################################################################### + size = handle::dasm_SUB_S_NE_b_b_b(stream, pc, op, opcodes); break; // SUB_S.NE b,b,b + } + case 0x07: // ZOPs + { + uint8_t subinstr3 = (op & 0x0700) >> 8; + + switch (subinstr3) + { + case 0x00: + { +// ####################################################################################################################### +// IIII I$$$ sssS SSSS +// NOP_S 0111 1000 1110 0000 +// ####################################################################################################################### + size = handle::dasm_NOP_S(stream, pc, op, opcodes); break; // NOP_S + } + case 0x01: + { +// ####################################################################################################################### +// IIII I$$$ sssS SSSS +// UNIMP_S 0111 1001 1110 0000 +// ####################################################################################################################### + size = handle::dasm_UNIMP_S(stream, pc, op, opcodes); break; // UNIMP_S + } + case 0x04: + { +// ####################################################################################################################### +// IIII I$$$ sssS SSSS +// JEQ_S [blink] 0111 1100 1110 0000 +// ####################################################################################################################### + size = handle::dasm_JEQ_S_blink(stream, pc, op, opcodes); break; // JEQ_S [BLINK] + } + case 0x05: + { +// ####################################################################################################################### +// IIII I$$$ sssS SSSS +// JNE_S [blink] 0111 1101 1110 0000 +// ####################################################################################################################### + size = handle::dasm_JNE_S_blink(stream, pc, op, opcodes); break; // JNE_S [BLINK] + } + case 0x06: + { +// ####################################################################################################################### +// IIII I$$$ sssS SSSS +// J_S [blink] 0111 1110 1110 0000 +// ####################################################################################################################### + size = handle::dasm_J_S_blink(stream, pc, op, opcodes); break; // J_S [BLINK] + } + case 0x07: + { +// ####################################################################################################################### +// IIII I$$$ sssS SSSS +// J_S.D [blink] 0111 1111 1110 0000 +// ####################################################################################################################### + size = handle::dasm_J_S_D_blink(stream, pc, op, opcodes); break; // J_S.D [BLINK] + } + + default: // 0x02, 0x03 + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, subinstr3, op, opcodes); break; + } + } + break; + } + default: // 0x04, 0x05 + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; + } + } + break; + } + case 0x02: + { +// ####################################################################################################################### +// IIII I S SSSS +// SUB_S b,b,c 0111 1bbb ccc0 0010 +// ####################################################################################################################### + size = handle::dasm_SUB_S_b_b_c(stream, pc, op, opcodes); break; // SUB_S b,b,c + } + case 0x04: + { +// ####################################################################################################################### +// IIII I S SSSS +// AND_S b,b,c 0111 1bbb ccc0 0100 +// ####################################################################################################################### + size = handle::dasm_AND_S_b_b_c(stream, pc, op, opcodes); break; // AND_S b,b,c + } + case 0x05: + { +// ####################################################################################################################### +// IIII I S SSSS +// OR_S b,b,c 0111 1bbb ccc0 0101 +// ####################################################################################################################### + size = handle::dasm_OR_S_b_b_c(stream, pc, op, opcodes); break; // OR_S b,b,c + } + case 0x06: + { +// ####################################################################################################################### +// IIII I S SSSS +// BIC_S b,b,c 0111 1bbb ccc0 0110 +// ####################################################################################################################### + size = handle::dasm_BIC_S_b_b_c(stream, pc, op, opcodes); break; // BIC_S b,b,c + } + case 0x07: + { +// ####################################################################################################################### +// IIII I S SSSS +// XOR_S b,b,c 0111 1bbb ccc0 0111 +// ####################################################################################################################### + size = handle::dasm_XOR_S_b_b_c(stream, pc, op, opcodes); break; // XOR_S b,b,c + } + case 0x0b: + { +// ####################################################################################################################### +// IIII I S SSSS +// TST_S b,c 0111 1bbb ccc0 1011 +// ####################################################################################################################### + size = handle::dasm_TST_S_b_c(stream, pc, op, opcodes); break; // TST_S b,c + } + case 0x0c: + { +// ####################################################################################################################### +// IIII I S SSSS +// MUL64_S <0,>b,c 0111 1bbb ccc0 1100 +// ####################################################################################################################### + size = handle::dasm_MUL64_S_0_b_c(stream, pc, op, opcodes); break; // MUL64_S <0,>b,c + } + case 0x0d: + { + +// ####################################################################################################################### +// IIII I S SSSS +// SEXB_S b,c 0111 1bbb ccc0 1101 +// ####################################################################################################################### + size = handle::dasm_SEXB_S_b_c(stream, pc, op, opcodes); break; // SEXB_S b,c + } + case 0x0e: + { +// ####################################################################################################################### +// IIII I S SSSS +// SEXW_S b,c 0111 1bbb ccc0 1110 +// ####################################################################################################################### + size = handle::dasm_SEXW_S_b_c(stream, pc, op, opcodes); break; // SEXW_S b,c + } + case 0x0f: + { +// ####################################################################################################################### +// IIII I S SSSS +// EXTB_S b,c 0111 1bbb ccc0 1111 +// ####################################################################################################################### + size = handle::dasm_EXTB_S_b_c(stream, pc, op, opcodes); break; // EXTB_S b,c + } + case 0x10: + { +// ####################################################################################################################### +// IIII I S SSSS +// EXTW_S b,c 0111 1bbb ccc1 0000 +// ####################################################################################################################### + size = handle::dasm_EXTW_S_b_c(stream, pc, op, opcodes); break; // EXTW_S b,c + } + case 0x11: + { +// ####################################################################################################################### +// IIII I S SSSS +// ABS_S b,c 0111 1bbb ccc1 0001 +// ####################################################################################################################### + size = handle::dasm_ABS_S_b_c(stream, pc, op, opcodes); break; // ABS_S b,c + } + case 0x12: + { +// ####################################################################################################################### +// IIII I S SSSS +// NOT_S b,c 0111 1bbb ccc1 0010 +// ####################################################################################################################### + size = handle::dasm_NOT_S_b_c(stream, pc, op, opcodes); break; // NOT_S b,c + } + case 0x13: + { +// ####################################################################################################################### +// IIII I S SSSS +// NEG_S b,c 0111 1bbb ccc1 0011 +// ####################################################################################################################### + size = handle::dasm_NEG_S_b_c(stream, pc, op, opcodes); break; // NEG_S b,c + } + case 0x14: + { +// ####################################################################################################################### +// IIII I S SSSS +// ADD1_S b,b,c 0111 1bbb ccc1 0100 +// ####################################################################################################################### + size = handle::dasm_ADD1_S_b_b_c(stream, pc, op, opcodes); break; // ADD1_S b,b,c + } + case 0x15: + { +// ####################################################################################################################### +// IIII I S SSSS +// ADD2_S b,b,c 0111 1bbb ccc1 0101 +// ####################################################################################################################### + size = handle::dasm_ADD2_S_b_b_c(stream, pc, op, opcodes); break; // ADD2_S b,b,c + } + case 0x16: + { +// ####################################################################################################################### +// IIII I S SSSS +// ADD3_S b,b,c 0111 1bbb ccc1 0110 +// ####################################################################################################################### + size = handle::dasm_ADD3_S_b_b_c(stream, pc, op, opcodes); break; // ADD3_S b,b,c + } + case 0x18: + { +// ####################################################################################################################### +// IIII I S SSSS +// ASL_S b,b,c 0111 1bbb ccc1 1000 +// ####################################################################################################################### + size = handle::dasm_ASL_S_b_b_c_multiple(stream, pc, op, opcodes); break; // ASL_S b,b,c (multiple) + } + case 0x19: + { +// ####################################################################################################################### +// IIII I S SSSS +// LSR_S b,b,c 0111 1bbb ccc1 1001 +// ####################################################################################################################### + size = handle::dasm_LSR_S_b_b_c_multiple(stream, pc, op, opcodes); break; // LSR_S b,b,c (multiple) + } + case 0x1a: + { +// ####################################################################################################################### +// IIII I S SSSS +// ASR_S b,b,c 0111 1bbb ccc1 1010 +// ####################################################################################################################### + size = handle::dasm_ASR_S_b_b_c_multiple(stream, pc, op, opcodes); break; // ASR_S b,b,c (multiple) + } + case 0x1b: + { +// ####################################################################################################################### +// IIII I S SSSS +// ASL_S b,c 0111 1bbb ccc1 1011 +// ####################################################################################################################### + size = handle::dasm_ASL_S_b_c_single(stream, pc, op, opcodes); break; // ASL_S b,c (single) + } + case 0x1c: + { +// ####################################################################################################################### +// IIII I S SSSS +// ASR_S b,c 0111 1bbb ccc1 1100 +// ####################################################################################################################### + size = handle::dasm_ASR_S_b_c_single(stream, pc, op, opcodes); break; // ASR_S b,c (single) + } + case 0x1d: + { +// ####################################################################################################################### +// IIII I S SSSS +// LSR_S b,c 0111 1bbb ccc1 1101 +// ####################################################################################################################### + size = handle::dasm_LSR_S_b_c_single(stream, pc, op, opcodes); break; // LSR_S b,c (single) + } + case 0x1e: + { +// ####################################################################################################################### +// IIII I S SSSS +// TRAP_S u6 0111 1uuu uuu1 1110 +// ####################################################################################################################### + size = handle::dasm_TRAP_S_u6(stream, pc, op, opcodes); break; // TRAP_S u6 (not a5?) + } + case 0x1f: + { + uint8_t subinstr2 = (op & 0x07e0) >> 5; + if (subinstr2 == 0x3f) + { +// ####################################################################################################################### +// IIII Isss sssS SSSS +// BRK_S 0111 1111 1111 1111 +// ####################################################################################################################### + size = handle::dasm_BRK_S(stream, pc, op, opcodes); break; // BRK_S ( 0x7fff only? ) // BRK_S ( 0x7fff only? ) + } + else + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; + } + } + default: // 0x01, 0x03, 0x08, 0x09, 0x0a, 0x17 + { + size = handle::dasm_illegal(stream, pc, instruction, subinstr, op, opcodes); break; + } + } + break; + } + case 0x10: + { +// ####################################################################################################################### +// IIII I +// LD_S c,[b,u7] 1000 0bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_LD_S_c_b_u7(stream, pc, op, opcodes); break; // LD_S c,[b,u7] + } + case 0x11: + { +// ####################################################################################################################### +// IIII I +// LDB_S c,[b,u5] 1000 1bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_LDB_S_c_b_u5(stream, pc, op, opcodes); break; // LDB_S c,[b,u5] + } + case 0x12: + { +// ####################################################################################################################### +// IIII I +// LDW_S c,[b,u6] 1001 0bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_LDW_S_c_b_u6(stream, pc, op, opcodes); break; // LDW_S c,[b,u6] + } + case 0x13: + { +// ####################################################################################################################### +// IIII I +// LDW_S.X c,[b,u6] 1001 1bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_LDW_S_X_c_b_u6(stream, pc, op, opcodes); break; // LDW_S.X c,[b,u6] + } + case 0x14: + { +// ####################################################################################################################### +// IIII I +// ST_S c,[b,u7] 1010 0bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_ST_S_c_b_u7(stream, pc, op, opcodes); break; // ST_S c,[b,u7] + } + case 0x15: + { +// ####################################################################################################################### +// IIII I +// STB_S c,[b,u5] 1010 1bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_STB_S_c_b_u5(stream, pc, op, opcodes); break; // STB_S + } + case 0x16: + { +// ####################################################################################################################### +// IIII I +// STW_S c,[b,u6] 1011 0bbb cccu uuuu +// ####################################################################################################################### + size = handle::dasm_STW_S_c_b_u6(stream, pc, op, opcodes); break; // STW_S + } + case 0x17: // Shift/Sub/Bit + { + uint8_t subinstr = (op & 0x00e0) >> 5; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII I SSS +// ASL_S b,b,u5 1011 1bbb 000u uuuu +// ####################################################################################################################### + size = handle::dasm_ASL_S_b_b_u5(stream, pc, op, opcodes); break; // ASL_S b,b,u5 + } + case 0x01: + { +// ####################################################################################################################### +// IIII I SSS +// LSR_S b,b,u5 1011 1bbb 001u uuuu +// ####################################################################################################################### + size = handle::dasm_LSR_S_b_b_u5(stream, pc, op, opcodes); break; // LSR_S b,b,u5 + } + case 0x02: + { +// ####################################################################################################################### +// IIII I SSS +// ASR_S b,b,u5 1011 1bbb 010u uuuu +// ####################################################################################################################### + size = handle::dasm_ASR_S_b_b_u5(stream, pc, op, opcodes); break; // ASR_S b,b,u5 + } + case 0x03: + { +// ####################################################################################################################### +// IIII I SSS +// SUB_S b,b,u5 1011 1bbb 011u uuuu +// ####################################################################################################################### + size = handle::dasm_SUB_S_b_b_u5(stream, pc, op, opcodes); break; // SUB_S b,b,u5 + } + case 0x04: + { +// ####################################################################################################################### +// IIII I SSS +// BSET_S b,b,u5 1011 1bbb 100u uuuu +// ####################################################################################################################### + size = handle::dasm_BSET_S_b_b_u5(stream, pc, op, opcodes); break; // BSET_S b,b,u5 + } + case 0x05: + { +// ####################################################################################################################### +// IIII I SSS +// BCLR_S b,b,u5 1011 1bbb 101u uuuu +// ####################################################################################################################### + size = handle::dasm_BCLR_S_b_b_u5(stream, pc, op, opcodes); break; // BCLR_S b,b,u5 + } + case 0x06: + { +// ####################################################################################################################### +// IIII I SSS +// BMSK_S b,b,u5 1011 1bbb 110u uuuu +// ####################################################################################################################### + size = handle::dasm_BMSK_S_b_b_u5(stream, pc, op, opcodes); break; // BMSK_S b,b,u5 + } + case 0x07: + { +// ####################################################################################################################### +// IIII I SSS +// BTST_S b,u5 1011 1bbb 111u uuuu +// ####################################################################################################################### + size = handle::dasm_BTST_S_b_u5(stream, pc, op, opcodes); break; // BTST_S b,u5 + } + } + break; + } + case 0x18: // Stack Instr + { + uint8_t subinstr = (op & 0x00e0) >> 5; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII I SSS +// LD_S b,[sp,u7] 1100 0bbb 000u uuuu +// ####################################################################################################################### + size = handle::dasm_LD_S_b_sp_u7(stream, pc, op, opcodes); break; // LD_S b,[sp,u7] + } + case 0x01: + { +// ####################################################################################################################### +// IIII I SSS +// LDB_S b,[sp,u7] 1100 0bbb 001u uuuu +// ####################################################################################################################### + size = handle::dasm_LDB_S_b_sp_u7(stream, pc, op, opcodes); break; // LDB_S b,[sp,u7] + } + case 0x02: + { +// ####################################################################################################################### +// IIII I SSS +// ST_S b,[sp,u7] 1100 0bbb 010u uuuu +// ####################################################################################################################### + size = handle::dasm_ST_S_b_sp_u7(stream, pc, op, opcodes); break; // ST_S b,[sp,u7] + } + case 0x03: + { +// ####################################################################################################################### +// IIII I SSS +// STB_S b,[sp,u7] 1100 0bbb 011u uuuu +// ####################################################################################################################### + size = handle::dasm_STB_S_b_sp_u7(stream, pc, op, opcodes); break; // STB_S b,[sp,u7] + } + case 0x04: + { +// ####################################################################################################################### +// IIII I SSS +// ADD_S b,sp,u7 1100 0bbb 100u uuuu +// ####################################################################################################################### + size = handle::dasm_ADD_S_b_sp_u7(stream, pc, op, opcodes); break; // ADD_S b,sp,u7 + } + + case 0x05: // subtable 18_05 + { + uint8_t subinstr2 = (op & 0x0700) >> 8; + switch (subinstr2) + { + case 0x00: + { +// ####################################################################################################################### +// IIII Isss SSS +// ADD_S sp,sp,u7 1100 0000 101u uuuu +// ####################################################################################################################### + size = handle::dasm_ADD_S_sp_sp_u7(stream, pc, op, opcodes); break; // ADD_S sp,sp,u7 + } + case 0x01: + { +// ####################################################################################################################### +// IIII Isss SSS +// SUB_S sp,sp,u7 1100 0001 101u uuuu +// ####################################################################################################################### + size = handle::dasm_SUB_S_sp_sp_u7(stream, pc, op, opcodes); break; // SUB_S sp,sp,u7 + } + default: size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; + } + break; + } + case 0x06: // subtable 18_06 + { + uint8_t subinstr2 = op & 0x001f; + switch (subinstr2) + { + case 0x01: + { +// ####################################################################################################################### +// IIII I SSSs ssss +// POP_S b 1100 0bbb 1100 0001 +// ####################################################################################################################### + size = handle::dasm_POP_S_b(stream, pc, op, opcodes); break; // POP_S b + } + case 0x11: + { +// ####################################################################################################################### +// IIII I SSSs ssss +// POP_S blink 1100 0RRR 1101 0001 +// ####################################################################################################################### + size = handle::dasm_POP_S_blink(stream, pc, op, opcodes); break; // POP_S blink + } + default: size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; + } + break; + } + case 0x07: // subtable 18_07 + { + uint8_t subinstr2 = op & 0x001f; + + switch (subinstr2) + { + case 0x01: + { +// ####################################################################################################################### +// IIII I SSSs ssss +// PUSH_S b 1100 0bbb 1110 0001 +// ####################################################################################################################### + size = handle::dasm_PUSH_S_b(stream, pc, op, opcodes); break; // PUSH_S b + } + case 0x11: + { +// ####################################################################################################################### +// IIII I SSSs ssss +// PUSH_S blink 1100 0RRR 1111 0001 +// ####################################################################################################################### + size = handle::dasm_PUSH_S_blink(stream, pc, op, opcodes); break; // PUSH_S blink + } + default: size = handle::dasm_illegal(stream, pc, instruction, subinstr, subinstr2, op, opcodes); break; + } + } + } + break; + } + case 0x19: // GP Instr + { + uint8_t subinstr = (op & 0x0600) >> 9; + + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII ISS +// LD_S r0,[gp,s11] 1100 100s ssss ssss +// ####################################################################################################################### + size = handle::dasm_LD_S_r0_gp_s11(stream, pc, op, opcodes); break; // LD_S r0,[gp,s11] + } + case 0x01: + { +// ####################################################################################################################### +// IIII ISS +// LDB_S r0,[gp,s9] 1100 101s ssss ssss +// ####################################################################################################################### + size = handle::dasm_LDB_S_r0_gp_s9(stream, pc, op, opcodes); break; // LDB_S r0,[gp,s9] + } + case 0x02: + { +// ####################################################################################################################### +// IIII ISS +// LDW_S r0,[gp,s10] 1100 110s ssss ssss +// ####################################################################################################################### + size = handle::dasm_LDW_S_r0_gp_s10(stream, pc, op, opcodes); break; // LDW_S r0,[gp,s10] + } + case 0x03: + { +// ####################################################################################################################### +// IIII ISS +// ADD_S r0,gp,s11 1100 111s ssss ssss +// ####################################################################################################################### + size = handle::dasm_ADD_S_r0_gp_s11(stream, pc, op, opcodes); break; // ADD_S r0,gp,s11 + } + } + break; + } + case 0x1a: + { +// ####################################################################################################################### +// IIII I +// LD_S b,[pcl,u10] 1101 0bbb uuuu uuuu +// ####################################################################################################################### + size = handle::dasm_LD_S_b_pcl_u10(stream, pc, op, opcodes); break; // LD_S b,[pcl,u10] + } + + case 0x1b: + { +// ####################################################################################################################### +// IIII I +// MOV_S b,u8 1101 1bbb uuuu uuuu +// ####################################################################################################################### + size = handle::dasm_MOV_S_b_u8(stream, pc, op, opcodes); break; // MOV_S b, u8 + } + + case 0x1c: // ADD_S/CMP_S + { + uint8_t subinstr = (op & 0x0080) >> 7; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII I s +// ADD_S b,b,u7 1110 0bbb 0uuu uuuu +// ####################################################################################################################### + size = handle::dasm_ADD_S_b_b_u7(stream, pc, op, opcodes); break; // ADD_S b, b, u7 + } + case 0x01: + { +// ####################################################################################################################### +// IIII I s +// CMP_S b,u7 1110 0bbb 1uuu uuuu +// ####################################################################################################################### + size = handle::dasm_CMP_S_b_u7(stream, pc, op, opcodes); break; // CMP_S b, u7 + } + } + break; + } + case 0x1d: // BRcc_S + { + uint8_t subinstr = (op & 0x0080) >> 7; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII I s +// BREQ_S b,0,s8 1110 1bbb 0sss ssss +// ####################################################################################################################### + size = handle::dasm_BREQ_S_b_0_s8(stream, pc, op, opcodes); break; // BREQ_S b,0,s8 + } + case 0x01: + { +// ####################################################################################################################### +// IIII I s +// BRNE_S b,0,s8 1110 1bbb 1sss ssss +// ####################################################################################################################### + size = handle::dasm_BRNE_S_b_0_s8(stream, pc, op, opcodes); break; // BRNE_S b,0,s8 + } + } + break; + } + case 0x1e: // Bcc_S + { + uint8_t subinstr = (op & 0x0600) >> 9; + switch (subinstr) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII ISS +// B_S s10 1111 000s ssss ssss +// ####################################################################################################################### + size = handle::dasm_B_S_s10(stream, pc, op, opcodes); break; // B_S s10 + } + case 0x01: + { +// ####################################################################################################################### +// IIII ISS +// BEQ_S s10 1111 001s ssss ssss +// ####################################################################################################################### + size = handle::dasm_BEQ_S_s10(stream, pc, op, opcodes); break; // BEQ_S s10 + } + case 0x02: + { +// ####################################################################################################################### +// IIII ISS +// BNE_S s10 1111 010s ssss ssss +// ####################################################################################################################### + size = handle::dasm_BNE_S_s10(stream, pc, op, opcodes); break; // BNE_S s10 + } + case 0x03: // Bcc_S + { + uint8_t subinstr2 = (op & 0x01c0) >> 6; + switch (subinstr2) + { + default: break; // size = -1; + case 0x00: + { +// ####################################################################################################################### +// IIII ISSs ss +// BGT_S s7 1111 0110 00ss ssss +// ####################################################################################################################### + size = handle::dasm_BGT_S_s7(stream, pc, op, opcodes); break; // BGT_S s7 + } + case 0x01: + { +// ####################################################################################################################### +// IIII ISSs ss +// BGE_S s7 1111 0110 01ss ssss +// ####################################################################################################################### + size = handle::dasm_BGE_S_s7(stream, pc, op, opcodes); break; // BGE_S s7 + } + case 0x02: + { +// ####################################################################################################################### +// IIII ISSs ss +// BLT_S s7 1111 0110 10ss ssss +// ####################################################################################################################### + size = handle::dasm_BLT_S_s7(stream, pc, op, opcodes); break; // BLT_S s7 + } + case 0x03: + { +// ####################################################################################################################### +// IIII ISSs ss +// BLE_S s7 1111 0110 11ss ssss +// ####################################################################################################################### + size = handle::dasm_BLE_S_s7(stream, pc, op, opcodes); break; // BLE_S s7 + } + case 0x04: + { +// ####################################################################################################################### +// IIII ISSs ss +// BHI_S s7 1111 0111 00ss ssss +// ####################################################################################################################### + size = handle::dasm_BHI_S_s7(stream, pc, op, opcodes); break; // BHI_S s7 + } + case 0x05: + { +// ####################################################################################################################### +// IIII ISSs ss +// BHS_S s7 1111 0111 01ss ssss +// ####################################################################################################################### + size = handle::dasm_BHS_S_s7(stream, pc, op, opcodes); break; // BHS_S s7 + } + case 0x06: + { +// ####################################################################################################################### +// IIII ISSs ss +// BLO_S s7 1111 0111 10ss ssss +// ####################################################################################################################### + size = handle::dasm_BLO_S_s7(stream, pc, op, opcodes); break; // BLO_S s7 + } + + case 0x07: + { +// ####################################################################################################################### +// IIII ISSs ss +// BLS_S s7 1111 0111 11ss ssss +// ####################################################################################################################### + size = handle::dasm_BLS_S_s7(stream, pc, op, opcodes); break; // BLS_S s7 + } + } + } + } + break; + } + case 0x1f: + { +// ####################################################################################################################### +// IIII I +// BL_S s13 1111 1sss ssss ssss +// ####################################################################################################################### + size = handle::dasm_BL_S_s13(stream, pc, op, opcodes); break; // BL_S s13 + } } } return size | SUPPORTED; } + |