nkeynes@30: /** nkeynes@586: * $Id$ nkeynes@30: * nkeynes@30: * SH4 CPU definition and disassembly functions nkeynes@30: * nkeynes@30: * Copyright (c) 2005 Nathan Keynes. nkeynes@30: * nkeynes@30: * This program is free software; you can redistribute it and/or modify nkeynes@30: * it under the terms of the GNU General Public License as published by nkeynes@30: * the Free Software Foundation; either version 2 of the License, or nkeynes@30: * (at your option) any later version. nkeynes@30: * nkeynes@30: * This program is distributed in the hope that it will be useful, nkeynes@30: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@30: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@30: * GNU General Public License for more details. nkeynes@30: */ nkeynes@30: nkeynes@1: #include "sh4core.h" nkeynes@1: #include "sh4dasm.h" nkeynes@1: #include "mem.h" nkeynes@1: nkeynes@1: #define UNIMP(ir) snprintf( buf, len, "??? " ) nkeynes@1: nkeynes@9: nkeynes@11: const struct reg_desc_struct sh4_reg_map[] = nkeynes@9: { {"R0", REG_INT, &sh4r.r[0]}, {"R1", REG_INT, &sh4r.r[1]}, nkeynes@9: {"R2", REG_INT, &sh4r.r[2]}, {"R3", REG_INT, &sh4r.r[3]}, nkeynes@9: {"R4", REG_INT, &sh4r.r[4]}, {"R5", REG_INT, &sh4r.r[5]}, nkeynes@9: {"R6", REG_INT, &sh4r.r[6]}, {"R7", REG_INT, &sh4r.r[7]}, nkeynes@9: {"R8", REG_INT, &sh4r.r[8]}, {"R9", REG_INT, &sh4r.r[9]}, nkeynes@9: {"R10",REG_INT, &sh4r.r[10]}, {"R11",REG_INT, &sh4r.r[11]}, nkeynes@9: {"R12",REG_INT, &sh4r.r[12]}, {"R13",REG_INT, &sh4r.r[13]}, nkeynes@9: {"R14",REG_INT, &sh4r.r[14]}, {"R15",REG_INT, &sh4r.r[15]}, nkeynes@9: {"SR", REG_INT, &sh4r.sr}, {"GBR", REG_INT, &sh4r.gbr}, nkeynes@9: {"SSR",REG_INT, &sh4r.ssr}, {"SPC", REG_INT, &sh4r.spc}, nkeynes@9: {"SGR",REG_INT, &sh4r.sgr}, {"DBR", REG_INT, &sh4r.dbr}, nkeynes@9: {"VBR",REG_INT, &sh4r.vbr}, nkeynes@9: {"PC", REG_INT, &sh4r.pc}, {"PR", REG_INT, &sh4r.pr}, nkeynes@9: {"MACL",REG_INT, &sh4r.mac},{"MACH",REG_INT, ((uint32_t *)&sh4r.mac)+1}, nkeynes@669: {"FPUL", REG_INT, &sh4r.fpul.i}, {"FPSCR", REG_INT, &sh4r.fpscr}, nkeynes@9: {NULL, 0, NULL} }; nkeynes@9: nkeynes@10: nkeynes@14: const struct cpu_desc_struct sh4_cpu_desc = nkeynes@597: { "SH4", sh4_disasm_instruction, sh4_execute_instruction, sh4_has_page, nkeynes@43: sh4_set_breakpoint, sh4_clear_breakpoint, sh4_get_breakpoint, 2, nkeynes@14: (char *)&sh4r, sizeof(sh4r), sh4_reg_map, nkeynes@302: &sh4r.pc }; nkeynes@9: nkeynes@597: uint32_t sh4_disasm_instruction( sh4vma_t pc, char *buf, int len, char *opcode ) nkeynes@1: { nkeynes@597: sh4addr_t addr = mmu_vma_to_phys_disasm(pc); nkeynes@597: uint16_t ir = sh4_read_word(addr); nkeynes@359: nkeynes@359: #define UNDEF(ir) snprintf( buf, len, "???? " ); nkeynes@1: #define RN(ir) ((ir&0x0F00)>>8) nkeynes@1: #define RN_BANK(ir) ((ir&0x0070)>>4) nkeynes@1: #define RM(ir) ((ir&0x00F0)>>4) nkeynes@1: #define DISP4(ir) (ir&0x000F) /* 4-bit displacements are *not* sign extended */ nkeynes@1: #define DISP8(ir) (ir&0x00FF) nkeynes@1: #define PCDISP8(ir) SIGNEXT8(ir&0x00FF) nkeynes@1: #define UIMM8(ir) (ir&0x00FF) nkeynes@1: #define IMM8(ir) SIGNEXT8(ir&0x00FF) nkeynes@1: #define DISP12(ir) SIGNEXT12(ir&0x0FFF) nkeynes@1: #define FVN(ir) ((ir&0x0C00)>>10) nkeynes@1: #define FVM(ir) ((ir&0x0300)>>8) nkeynes@1: nkeynes@11: sprintf( opcode, "%02X %02X", ir&0xFF, ir>>8 ); nkeynes@11: nkeynes@359: switch( (ir&0xF000) >> 12 ) { nkeynes@359: case 0x0: nkeynes@359: switch( ir&0xF ) { nkeynes@359: case 0x2: nkeynes@359: switch( (ir&0x80) >> 7 ) { nkeynes@359: case 0x0: nkeynes@359: switch( (ir&0x70) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* STC SR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC SR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* STC GBR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC GBR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* STC VBR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC VBR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* STC SSR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC SSR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* STC SPC, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC SPC, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* STC Rm_BANK, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7); nkeynes@359: snprintf( buf, len, "STC R%d_BANK, R%d", Rm_BANK, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* BSRF Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "BSRF R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* BRAF Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "BRAF R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* PREF @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "PREF R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* OCBI @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "OCBI @R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* OCBP @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "OCBP @R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* OCBWB @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "OCBWB @R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* MOVCA.L R0, @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "MOVCA.L R0, @R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* MOV.B Rm, @(R0, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.B R%d, @(R0, R%d)", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* MOV.W Rm, @(R0, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.W R%d, @(R0, R%d)", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* MOV.L Rm, @(R0, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.L R%d, @(R0, R%d)", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* MUL.L Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MUL.L R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: switch( (ir&0xFF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* CLRT */ nkeynes@359: snprintf( buf, len, "CLRT " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* SETT */ nkeynes@359: snprintf( buf, len, "SETT " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* CLRMAC */ nkeynes@359: snprintf( buf, len, "CLRMAC " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* LDTLB */ nkeynes@359: snprintf( buf, len, "LDTLB " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* CLRS */ nkeynes@359: snprintf( buf, len, "CLRS " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* SETS */ nkeynes@359: snprintf( buf, len, "SETS " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* NOP */ nkeynes@359: snprintf( buf, len, "NOP " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* DIV0U */ nkeynes@359: snprintf( buf, len, "DIV0U " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* MOVT Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "MOVT R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* STS MACH, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS MACH, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* STS MACL, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS MACL, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* STS PR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS PR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* STC SGR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC SGR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* STS FPUL, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS FPUL, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* STS FPSCR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS FPSCR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* STC DBR, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC DBR, R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: switch( (ir&0xFF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* RTS */ nkeynes@359: snprintf( buf, len, "RTS " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* SLEEP */ nkeynes@359: snprintf( buf, len, "SLEEP " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* RTE */ nkeynes@359: snprintf( buf, len, "RTE " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* MOV.B @(R0, Rm), Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.B @(R0, R%d), R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* MOV.W @(R0, Rm), Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.W @(R0, R%d), R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* MOV.L @(R0, Rm), Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.L @(R0, R%d), R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* MAC.L @Rm+, @Rn+ */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MAC.L @R%d+, @R%d+", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* MOV.L Rm, @(disp, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2; nkeynes@359: snprintf( buf, len, "MOV.L R%d, @(%d, R%d)", Rm, disp, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: switch( ir&0xF ) { nkeynes@359: case 0x0: nkeynes@359: { /* MOV.B Rm, @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.B R%d, @R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* MOV.W Rm, @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.W R%d, @R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* MOV.L Rm, @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.L R%d, @R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* MOV.B Rm, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.B R%d, @-R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* MOV.W Rm, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.W R%d, @-R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* MOV.L Rm, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.L R%d, @-R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* DIV0S Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "DIV0S R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* TST Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "TST R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* AND Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "AND R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* XOR Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "XOR R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* OR Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "OR R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* CMP/STR Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "CMP/STR R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* XTRCT Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "XTRCT R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* MULU.W Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MULU.W R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* MULS.W Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MULS.W R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: switch( ir&0xF ) { nkeynes@359: case 0x0: nkeynes@359: { /* CMP/EQ Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "CMP/EQ R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* CMP/HS Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "CMP/HS R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* CMP/GE Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "CMP/GE R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* DIV1 Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "DIV1 R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* DMULU.L Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "DMULU.L R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* CMP/HI Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "CMP/HI R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* CMP/GT Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "CMP/GT R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* SUB Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SUB R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* SUBC Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SUBC R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* SUBV Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SUBV R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* ADD Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "ADD R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* DMULS.L Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "DMULS.L R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* ADDC Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "ADDC R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* ADDV Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "ADDV R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: switch( ir&0xF ) { nkeynes@359: case 0x0: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* SHLL Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLL R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* DT Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "DT R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* SHAL Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHAL R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* SHLR Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLR R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* CMP/PZ Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "CMP/PZ R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* SHAR Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHAR R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* STS.L MACH, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS.L MACH, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* STS.L MACL, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS.L MACL, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* STS.L PR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS.L PR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* STC.L SGR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L SGR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* STS.L FPUL, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS.L FPUL, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* STS.L FPSCR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STS.L FPSCR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* STC.L DBR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L DBR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: switch( (ir&0x80) >> 7 ) { nkeynes@359: case 0x0: nkeynes@359: switch( (ir&0x70) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* STC.L SR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L SR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* STC.L GBR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L GBR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* STC.L VBR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L VBR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* STC.L SSR, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L SSR, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* STC.L SPC, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "STC.L SPC, @-R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* STC.L Rm_BANK, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7); nkeynes@359: snprintf( buf, len, "STC.L @-R%d_BANK, @-R%d", Rm_BANK, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* ROTL Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "ROTL R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* ROTCL Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "ROTCL R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* ROTR Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "ROTR R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* CMP/PL Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "CMP/PL R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* ROTCR Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "ROTCR R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* LDS.L @Rm+, MACH */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS.L @R%d+, MACH", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* LDS.L @Rm+, MACL */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS.L @R%d+, MACL", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* LDS.L @Rm+, PR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS.L @R%d+, PR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* LDC.L @Rm+, SGR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, SGR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* LDS.L @Rm+, FPUL */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS.L @R%d+, FPUL", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* LDS.L @Rm+, FPSCR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS.L @R%d+, FPSCR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* LDC.L @Rm+, DBR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, DBR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: switch( (ir&0x80) >> 7 ) { nkeynes@359: case 0x0: nkeynes@359: switch( (ir&0x70) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* LDC.L @Rm+, SR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, SR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* LDC.L @Rm+, GBR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, GBR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* LDC.L @Rm+, VBR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, VBR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* LDC.L @Rm+, SSR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, SSR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* LDC.L @Rm+, SPC */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, SPC", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* LDC.L @Rm+, Rn_BANK */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7); nkeynes@359: snprintf( buf, len, "LDC.L @R%d+, @R%d+_BANK", Rm, Rn_BANK ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* SHLL2 Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLL2 R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* SHLL8 Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLL8 R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* SHLL16 Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLL16 R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* SHLR2 Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLR2 R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* SHLR8 Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLR8 R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* SHLR16 Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "SHLR16 R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* LDS Rm, MACH */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS R%d, MACH", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* LDS Rm, MACL */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS R%d, MACL", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* LDS Rm, PR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS R%d, PR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* LDC Rm, SGR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, SGR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* LDS Rm, FPUL */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS R%d, FPUL", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* LDS Rm, FPSCR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDS R%d, FPSCR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* LDC Rm, DBR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, DBR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* JSR @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "JSR @R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* TAS.B @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "TAS.B R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* JMP @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "JMP @R%d", Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* SHAD Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SHAD R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* SHLD Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SHLD R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: switch( (ir&0x80) >> 7 ) { nkeynes@359: case 0x0: nkeynes@359: switch( (ir&0x70) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* LDC Rm, SR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, SR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* LDC Rm, GBR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, GBR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* LDC Rm, VBR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, VBR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* LDC Rm, SSR */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, SSR", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* LDC Rm, SPC */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "LDC R%d, SPC", Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* LDC Rm, Rn_BANK */ nkeynes@359: uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7); nkeynes@359: snprintf( buf, len, "LDC R%d, R%d_BANK", Rm, Rn_BANK ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* MAC.W @Rm+, @Rn+ */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MAC.W @R%d+, @R%d+", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* MOV.L @(disp, Rm), Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2; nkeynes@496: snprintf( buf, len, "MOV.L @(%d, R%d), R%d", disp, Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: switch( ir&0xF ) { nkeynes@359: case 0x0: nkeynes@359: { /* MOV.B @Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.B @R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* MOV.W @Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.W @R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* MOV.L @Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.L @R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* MOV Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* MOV.B @Rm+, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.B @R%d+, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* MOV.W @Rm+, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.W @R%d+, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* MOV.L @Rm+, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "MOV.L @R%d+, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* NOT Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "NOT R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* SWAP.B Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SWAP.B R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* SWAP.W Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "SWAP.W R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* NEGC Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "NEGC R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* NEG Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "NEG R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* EXTU.B Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "EXTU.B R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* EXTU.W Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "EXTU.W R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* EXTS.B Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "EXTS.B R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* EXTS.W Rm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "EXTS.W R%d, R%d", Rm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* ADD #imm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF); nkeynes@359: snprintf( buf, len, "ADD #%d, R%d", imm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: switch( (ir&0xF00) >> 8 ) { nkeynes@359: case 0x0: nkeynes@359: { /* MOV.B R0, @(disp, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF); nkeynes@359: snprintf( buf, len, "MOV.B R0, @(%d, R%d)", disp, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* MOV.W R0, @(disp, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1; nkeynes@430: snprintf( buf, len, "MOV.W R0, @(%d, R%d)", disp, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* MOV.B @(disp, Rm), R0 */ nkeynes@359: uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF); nkeynes@359: snprintf( buf, len, "MOV.B @(%d, R%d), R0", disp, Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* MOV.W @(disp, Rm), R0 */ nkeynes@359: uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1; nkeynes@359: snprintf( buf, len, "MOV.W @(%d, R%d), R0", disp, Rm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* CMP/EQ #imm, R0 */ nkeynes@359: int32_t imm = SIGNEXT8(ir&0xFF); nkeynes@359: snprintf( buf, len, "CMP/EQ #%d, R0", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* BT disp */ nkeynes@359: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@359: snprintf( buf, len, "BT $%xh", disp+pc+4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* BF disp */ nkeynes@359: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@359: snprintf( buf, len, "BF $%xh", disp+pc+4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* BT/S disp */ nkeynes@359: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@359: snprintf( buf, len, "BT/S $%xh", disp+pc+4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* BF/S disp */ nkeynes@359: int32_t disp = SIGNEXT8(ir&0xFF)<<1; nkeynes@359: snprintf( buf, len, "BF/S $%xh", disp+pc+4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* MOV.W @(disp, PC), Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1; nkeynes@597: snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+addr+4) ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* BRA disp */ nkeynes@359: int32_t disp = SIGNEXT12(ir&0xFFF)<<1; nkeynes@359: snprintf( buf, len, "BRA $%xh", disp+pc+4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* BSR disp */ nkeynes@359: int32_t disp = SIGNEXT12(ir&0xFFF)<<1; nkeynes@359: snprintf( buf, len, "BSR $%xh", disp+pc+4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: switch( (ir&0xF00) >> 8 ) { nkeynes@359: case 0x0: nkeynes@359: { /* MOV.B R0, @(disp, GBR) */ nkeynes@359: uint32_t disp = (ir&0xFF); nkeynes@359: snprintf( buf, len, "MOV.B R0, @(%d, GBR)", disp ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* MOV.W R0, @(disp, GBR) */ nkeynes@359: uint32_t disp = (ir&0xFF)<<1; nkeynes@359: snprintf( buf, len, "MOV.W R0, @(%d, GBR)", disp); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* MOV.L R0, @(disp, GBR) */ nkeynes@359: uint32_t disp = (ir&0xFF)<<2; nkeynes@359: snprintf( buf, len, "MOV.L R0, @(%d, GBR)", disp ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* TRAPA #imm */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "TRAPA #%d", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* MOV.B @(disp, GBR), R0 */ nkeynes@359: uint32_t disp = (ir&0xFF); nkeynes@359: snprintf( buf, len, "MOV.B @(%d, GBR), R0", disp ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* MOV.W @(disp, GBR), R0 */ nkeynes@359: uint32_t disp = (ir&0xFF)<<1; nkeynes@359: snprintf( buf, len, "MOV.W @(%d, GBR), R0", disp ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* MOV.L @(disp, GBR), R0 */ nkeynes@359: uint32_t disp = (ir&0xFF)<<2; nkeynes@359: snprintf( buf, len, "MOV.L @(%d, GBR), R0",disp ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* MOVA @(disp, PC), R0 */ nkeynes@359: uint32_t disp = (ir&0xFF)<<2; nkeynes@359: snprintf( buf, len, "MOVA @($%xh), R0", disp + (pc&0xFFFFFFFC) + 4 ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* TST #imm, R0 */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "TST #%d, R0", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* AND #imm, R0 */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@595: snprintf( buf, len, "AND #%d, R0", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* XOR #imm, R0 */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "XOR #%d, R0", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* OR #imm, R0 */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "OR #%d, R0", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* TST.B #imm, @(R0, GBR) */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "TST.B #%d, @(R0, GBR)", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* AND.B #imm, @(R0, GBR) */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "AND.B #%d, @(R0, GBR)", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* XOR.B #imm, @(R0, GBR) */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "XOR.B #%d, @(R0, GBR)", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: { /* OR.B #imm, @(R0, GBR) */ nkeynes@359: uint32_t imm = (ir&0xFF); nkeynes@359: snprintf( buf, len, "OR.B #%d, @(R0, GBR)", imm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: { /* MOV.L @(disp, PC), Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2; nkeynes@597: snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(addr&0xFFFFFFFC)+4) ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* MOV #imm, Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF); nkeynes@359: snprintf( buf, len, "MOV #%d, R%d", imm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: switch( ir&0xF ) { nkeynes@359: case 0x0: nkeynes@359: { /* FADD FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FADD FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* FSUB FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@430: snprintf( buf, len, "FSUB FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* FMUL FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@430: snprintf( buf, len, "FMUL FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* FDIV FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FDIV FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* FCMP/EQ FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FCMP/EQ FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* FCMP/GT FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FCMP/QT FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* FMOV @(R0, Rm), FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV @(R0, R%d), FR%d", Rm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* FMOV FRm, @(R0, Rn) */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV FR%d, @(R0, R%d)", FRm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* FMOV @Rm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV @R%d, FR%d", Rm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* FMOV @Rm+, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV @R%d+, FR%d", Rm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* FMOV FRm, @Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV FR%d, @R%d", FRm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* FMOV FRm, @-Rn */ nkeynes@359: uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV FR%d, @-R%d", FRm, Rn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xC: nkeynes@359: { /* FMOV FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMOV FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xD: nkeynes@359: switch( (ir&0xF0) >> 4 ) { nkeynes@359: case 0x0: nkeynes@359: { /* FSTS FPUL, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FSTS FPUL, FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: { /* FLDS FRm, FPUL */ nkeynes@359: uint32_t FRm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FLDS FR%d, FPUL", FRm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* FLOAT FPUL, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FLOAT FPUL, FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* FTRC FRm, FPUL */ nkeynes@359: uint32_t FRm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FTRC FR%d, FPUL", FRm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x4: nkeynes@359: { /* FNEG FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FNEG FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x5: nkeynes@359: { /* FABS FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FABS FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x6: nkeynes@359: { /* FSQRT FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FSQRT FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x7: nkeynes@359: { /* FSRRA FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FSRRA FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x8: nkeynes@359: { /* FLDI0 FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FLDI0 FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x9: nkeynes@359: { /* FLDI1 FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FLDI1 FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xA: nkeynes@359: { /* FCNVSD FPUL, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FCNVSD FPUL, FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xB: nkeynes@359: { /* FCNVDS FRm, FPUL */ nkeynes@359: uint32_t FRm = ((ir>>8)&0xF); nkeynes@359: snprintf( buf, len, "FCNVDS FR%d, FPUL", FRm ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* FIPR FVm, FVn */ nkeynes@359: uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3); nkeynes@359: snprintf( buf, len, "FIPR FV%d, FV%d", FVm, FVn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xF: nkeynes@359: switch( (ir&0x100) >> 8 ) { nkeynes@359: case 0x0: nkeynes@359: { /* FSCA FPUL, FRn */ nkeynes@359: uint32_t FRn = ((ir>>9)&0x7)<<1; nkeynes@359: snprintf( buf, len, "FSCA FPUL, FR%d", FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: switch( (ir&0x200) >> 9 ) { nkeynes@359: case 0x0: nkeynes@359: { /* FTRV XMTRX, FVn */ nkeynes@359: uint32_t FVn = ((ir>>10)&0x3); nkeynes@359: snprintf( buf, len, "FTRV XMTRX, FV%d", FVn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x1: nkeynes@359: switch( (ir&0xC00) >> 10 ) { nkeynes@359: case 0x0: nkeynes@359: { /* FSCHG */ nkeynes@359: snprintf( buf, len, "FSCHG " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x2: nkeynes@359: { /* FRCHG */ nkeynes@359: snprintf( buf, len, "FRCHG " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0x3: nkeynes@359: { /* UNDEF */ nkeynes@359: snprintf( buf, len, "UNDEF " ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: case 0xE: nkeynes@359: { /* FMAC FR0, FRm, FRn */ nkeynes@359: uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF); nkeynes@359: snprintf( buf, len, "FMAC FR0, FR%d, FR%d", FRm, FRn ); nkeynes@359: } nkeynes@359: break; nkeynes@359: default: nkeynes@359: UNDEF(); nkeynes@359: break; nkeynes@359: } nkeynes@359: break; nkeynes@359: } nkeynes@359: nkeynes@1: return pc+2; nkeynes@1: } nkeynes@1: nkeynes@1: nkeynes@586: void sh4_disasm_region( FILE *f, int from, int to ) nkeynes@1: { nkeynes@1: int pc; nkeynes@1: char buf[80]; nkeynes@11: char opcode[16]; nkeynes@1: nkeynes@1: for( pc = from; pc < to; pc+=2 ) { nkeynes@1: buf[0] = '\0'; nkeynes@1: sh4_disasm_instruction( pc, nkeynes@11: buf, sizeof(buf), opcode ); nkeynes@54: fprintf( f, " %08x: %s %s\n", pc, opcode, buf ); nkeynes@1: } nkeynes@1: }