UNPKG

m68kdecode

Version:

Port of deplinenoise/m68kdecode to Typescript

1,372 lines 179 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeInstruction = void 0; const codestream_1 = __importDefault(require("./codestream")); const lib_1 = require("./lib"); const types_1 = require("./types"); function decodeGroup0000(w0, cs) { if ((w0 & 0b1111111111111111) === 0b0000001000111100) { const size = 1; const src = cs.imm8(); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ANDITOCCR", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111111111) === 0b0000001001111100) { const size = 2; const src = cs.imm16(); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ANDITOSR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0000101000111100) { const size = 1; const src = cs.imm8(); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EORITOCCR", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111111111) === 0b0000101001111100) { const size = 2; const src = cs.imm16(); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EORITOSR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0000000000111100) { const size = 1; const src = cs.imm8(); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ORITOCCR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0000000001111100) { const size = 2; const src = cs.imm16(); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ORITOSR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000110111000) === 0b0000000100001000) { const d = (0, lib_1.getBits)(w0, 9, 3); const s = (0, lib_1.getBits)(w0, 6, 1); const a = (0, lib_1.getBits)(w0, 0, 3); const size = 1 << (s + 1); const src = (0, types_1.ARDISP)(a, (0, lib_1.simpleDisp)((0, lib_1.i16)(cs.pull16()))); const dst = (0, types_1.DR)(d); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000110111000) === 0b0000000110001000) { const d = (0, lib_1.getBits)(w0, 9, 3); const s = (0, lib_1.getBits)(w0, 6, 1); const a = (0, lib_1.getBits)(w0, 0, 3); const size = 1 << (s + 1); const src = (0, types_1.DR)(d); const dst = (0, types_1.ARDISP)(a, (0, lib_1.simpleDisp)((0, lib_1.i16)(cs.pull16()))); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000111000000) === 0b0000000100000000) { const d = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = m ? 1 : 4; const src = (0, types_1.DR)(d); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BTST", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000111000000) === 0b0000000101000000) { const d = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = m ? 1 : 4; const src = (0, types_1.DR)(d); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BCHG", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000111000000) === 0b0000000110000000) { const d = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = m ? 1 : 4; const src = (0, types_1.DR)(d); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BCLR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000111000000) === 0b0000000111000000) { const d = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = m ? 1 : 4; const src = (0, types_1.DR)(d); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BSET", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000100000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1111111000000000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const n = (0, lib_1.getBits)(w1, 0, 9); cs.skipWords(1); const size = m ? 1 : 4; const src = (0, types_1.IMM16)(n); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BTST", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000100001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1111111000000000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const n = (0, lib_1.getBits)(w1, 0, 9); cs.skipWords(1); const size = m ? 1 : 4; const src = (0, types_1.IMM16)(n); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BCHG", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000100010000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1111111000000000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const n = (0, lib_1.getBits)(w1, 0, 9); cs.skipWords(1); const size = m ? 1 : 4; const src = (0, types_1.IMM16)(n); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BCLR", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000100011000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1111111000000000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const n = (0, lib_1.getBits)(w1, 0, 9); cs.skipWords(1); const size = m ? 1 : 4; const src = (0, types_1.IMM16)(n); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BSET", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111110000) === 0b0000011011000000) { const d = (0, lib_1.getBits)(w0, 3, 1); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = cs.dar(d, r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RTM", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000011011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = cs.imm8(); const dst = cs.ea(r, m, 0); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "CALLM", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000011000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.imm8(); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ADDI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000011001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.imm16(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ADDI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000011010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.imm32(); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ADDI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000010000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.imm8(); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "SUBI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000010001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.imm16(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "SUBI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000010010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.imm32(); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "SUBI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000001000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.imm8(); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ANDI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000001001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.imm16(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ANDI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000001010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.imm32(); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ANDI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.imm8(); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ORI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000000001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.imm16(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ORI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000000010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.imm32(); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ORI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111100111000000) === 0b0000000011000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000000000000000) { const s = (0, lib_1.getBits)(w0, 9, 2); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 1 << s; const src = cs.ea(r, m, size); const dst = cs.dar(a, d); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "CMP2", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111100111000000) === 0b0000000011000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000100000000000) { const s = (0, lib_1.getBits)(w0, 9, 2); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 1 << s; const src = cs.ea(r, m, size); const dst = cs.dar(a, d); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "CHK2", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000101000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.imm8(); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EORI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000101001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.imm16(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EORI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000101010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.imm32(); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EORI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000110000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.imm8(); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "CMPI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000110001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.imm16(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "CMPI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000110010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.imm32(); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "CMPI", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0000111000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 1; const dst = cs.dar(a, d); const src = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVES", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000111001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 2; const dst = cs.dar(a, d); const src = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVES", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000111010000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 4; const dst = cs.dar(a, d); const src = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVES", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000111000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 1; const src = cs.dar(a, d); const dst = cs.ea(r, m, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVES", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000111001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 2; const src = cs.dar(a, d); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVES", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0000111010000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000111111111111) === 0b0000100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const a = (0, lib_1.getBits)(w1, 15, 1); const d = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 4; const src = cs.dar(a, d); const dst = cs.ea(r, m, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVES", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111110000) === 0b0000011011000000) { const a = (0, lib_1.getBits)(w0, 3, 1); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = cs.dar(a, r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RTM", operands: [src, dst], extra }, }; } throw new Error("NotImplemented"); } function decodeGroup0001(w0, cs) { if ((w0 & 0b1111000000000000) === 0b0001000000000000) { const R = (0, lib_1.getBits)(w0, 9, 3); const M = (0, lib_1.getBits)(w0, 6, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.ea(r, m, 1); const dst = cs.ea(R, M, 1); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVE", operands: [src, dst], extra }, }; } throw new Error("NotImplemented"); } function decodeGroup0010(w0, cs) { if ((w0 & 0b1111000111000000) === 0b0010000001000000) { const R = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.ea(r, m, 4); const dst = cs.ea(R, 0b001, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEA", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000000000000) === 0b0010000000000000) { const R = (0, lib_1.getBits)(w0, 9, 3); const M = (0, lib_1.getBits)(w0, 6, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.ea(r, m, 4); const dst = cs.ea(R, M, 4); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVE", operands: [src, dst], extra }, }; } throw new Error("NotImplemented"); } function decodeGroup0011(w0, cs) { if ((w0 & 0b1111000111000000) === 0b0011000001000000) { const R = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.ea(r, m, 2); const dst = cs.ea(R, 0b001, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEA", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000000000000) === 0b0011000000000000) { const R = (0, lib_1.getBits)(w0, 9, 3); const M = (0, lib_1.getBits)(w0, 6, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.ea(r, m, 2); const dst = cs.ea(R, M, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVE", operands: [src, dst], extra }, }; } throw new Error("NotImplemented"); } function decodeGroup0100(w0, cs) { if ((w0 & 0b1111111111111111) === 0b0100101011111010) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BGND", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100101011111100) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "ILLEGAL", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110001) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "NOP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110000) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RESET", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110100) { const size = 0; const src = cs.imm16(); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RTD", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110011) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RTE", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110111) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RTR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110101) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "RTS", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110010) { const size = 0; const src = cs.imm16(); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "STOP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001110110) { const size = 0; const src = null; const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "TRAPV", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111111) === 0b0100111001111010 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000000000000000) === 0b0000000000000000) { const a = (0, lib_1.getBits)(w1, 15, 1); const r = (0, lib_1.getBits)(w1, 12, 3); const c = (0, lib_1.getBits)(w1, 0, 12); cs.skipWords(1); const size = 4; const src = (0, types_1.CONTROLREG)(c); const dst = cs.dar(a, r); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEC", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111111111) === 0b0100111001111011 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b0000000000000000) === 0b0000000000000000) { const a = (0, lib_1.getBits)(w1, 15, 1); const r = (0, lib_1.getBits)(w1, 12, 3); const c = (0, lib_1.getBits)(w1, 0, 12); cs.skipWords(1); const size = 4; const src = cs.dar(a, r); const dst = (0, types_1.CONTROLREG)(c); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEC", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111111000) === 0b0100100001000000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = (0, types_1.DR)(r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "SWAP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100100001001000) { const n = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = (0, types_1.IMM8)((0, lib_1.u8)(n)); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "BKPT", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100100010000000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = (0, types_1.DR)(r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EXTW", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100100011000000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = (0, types_1.DR)(r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EXTL", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100100111000000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = (0, types_1.DR)(r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "EXTBL", operands: [src, dst], extra }, }; } if ((w0 & 0b1111000111000000) === 0b0100000111000000) { const n = (0, lib_1.getBits)(w0, 9, 3); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.AR)(n); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "LEA", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100111001010000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = (0, types_1.AR)(r); const dst = cs.imm16(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "LINK", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100100000001000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = (0, types_1.AR)(r); const dst = cs.imm32(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "LINK", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100111001011000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = (0, types_1.AR)(r); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "UNLK", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111110000) === 0b0100111001000000) { const v = (0, lib_1.getBits)(w0, 0, 4); const size = 0; const src = (0, types_1.IMM8)((0, lib_1.u8)(v)); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "TRAP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000110000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); const R = (0, lib_1.getBits)(w1, 0, 3); if (R != q) { cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(q, R); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVSL", operands: [src, dst], extra, }, }; } } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000110000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); const R = (0, lib_1.getBits)(w1, 0, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(q, R); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVSL", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); const R = (0, lib_1.getBits)(w1, 0, 3); if (R != q) { cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(q, R); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVSLL", operands: [src, dst], extra, }, }; } } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DR)(q); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVSL", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000010000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); const R = (0, lib_1.getBits)(w1, 0, 3); if (R != q) { cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(q, R); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVUL", operands: [src, dst], extra, }, }; } } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000010000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); const R = (0, lib_1.getBits)(w1, 0, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(q, R); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVUL", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); const R = (0, lib_1.getBits)(w1, 0, 3); if (R != q) { cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(q, R); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVULL", operands: [src, dst], extra, }, }; } } } if ((w0 & 0b1111111111000000) === 0b0100110001000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const q = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DR)(q); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "DIVUL", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100111011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = cs.ea(r, m, 0); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "JMP", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0100111010000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 0; const src = cs.ea(r, m, 0); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "JSR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0100110000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const l = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DR)(l); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MULS", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100110000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000110000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const l = (0, lib_1.getBits)(w1, 12, 3); const h = (0, lib_1.getBits)(w1, 0, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(l, h); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MULS", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100110000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000000000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const l = (0, lib_1.getBits)(w1, 12, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DR)(l); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MULU", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100110000000000 && cs.hasWords(1)) { const w1 = cs.peekWord(0); if ((w1 & 0b1000111111111000) === 0b0000010000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const l = (0, lib_1.getBits)(w1, 12, 3); const h = (0, lib_1.getBits)(w1, 0, 3); cs.skipWords(1); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.DPAIR)(l, h); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MULU", operands: [src, dst], extra }, }; } } if ((w0 & 0b1111111111000000) === 0b0100100000000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.ea(r, m, 1); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "NBCD", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0100000011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = (0, types_1.Implied)(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEFROMSR", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111000000) === 0b0100011011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.ea(r, m, 2); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVETOSR", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111111000) === 0b0100111001100000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = (0, types_1.AR)(r); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVETOUSP", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111111000) === 0b0100111001101000) { const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = (0, types_1.Implied)(); const dst = (0, types_1.AR)(r); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEFROMUSP", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111000000) === 0b0100001011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = (0, types_1.Implied)(); const dst = cs.ea(r, m, 2); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEFROMCCR", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111000000) === 0b0100010011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2; const src = cs.ea(r, m, 2); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVETOCCR", operands: [src, dst], extra, }, }; } if ((w0 & 0b1111111111000000) === 0b0100100001000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 4; const src = cs.ea(r, m, 4); const dst = (0, types_1.Implied)(); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "PEA", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111111000000) === 0b0100101011000000) { const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 1; const src = cs.ea(r, m, 1); const dst = null; const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "TAS", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111110000000) === 0b0100100010000000) { const s = (0, lib_1.getBits)(w0, 6, 1); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2 << s; const src = (0, types_1.REGLIST)(cs.pull16()); const dst = cs.ea(r, m, size); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEM", operands: [src, dst], extra }, }; } if ((w0 & 0b1111111110000000) === 0b0100110010000000) { const s = (0, lib_1.getBits)(w0, 6, 1); const m = (0, lib_1.getBits)(w0, 3, 3); const r = (0, lib_1.getBits)(w0, 0, 3); const size = 2 << s; const dst = (0, types_1.REGLIST)(cs.pull16()); const src = cs.ea(r, m, size); const extra = null; return { bytesUsed: cs.pos, instruction: { size, operation: "MOVEM", operands: [src, dst], extra }, }; } if ((w0 & 0b11111111