filename | src/sh4/sh4dasm.in |
changeset | 873:cb3a8c502727 |
prev | 730:a0f02e769c2e |
next | 939:6f2302afeb89 |
author | nkeynes |
date | Sat Dec 27 02:59:35 2008 +0000 (15 years ago) |
branch | lxdream-mem |
permissions | -rw-r--r-- |
last change | Replace fpscr_mask/fpscr flags in xlat_cache_block with a single xlat_sh4_mode, which tracks the field of the same name in sh4r - actually a little faster this way. Now depends on SR.MD, FPSCR.PR and FPSCR.SZ (although it doesn't benefit from the SR flag yet). Also fixed the failure to check the flags in the common case (code address returned by previous block) which took away the performance benefits, but oh well. |
file | annotate | diff | log | raw |
nkeynes@359 | 1 | /** |
nkeynes@586 | 2 | * $Id$ |
nkeynes@359 | 3 | * |
nkeynes@359 | 4 | * SH4 CPU definition and disassembly functions |
nkeynes@359 | 5 | * |
nkeynes@359 | 6 | * Copyright (c) 2005 Nathan Keynes. |
nkeynes@359 | 7 | * |
nkeynes@359 | 8 | * This program is free software; you can redistribute it and/or modify |
nkeynes@359 | 9 | * it under the terms of the GNU General Public License as published by |
nkeynes@359 | 10 | * the Free Software Foundation; either version 2 of the License, or |
nkeynes@359 | 11 | * (at your option) any later version. |
nkeynes@359 | 12 | * |
nkeynes@359 | 13 | * This program is distributed in the hope that it will be useful, |
nkeynes@359 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nkeynes@359 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nkeynes@359 | 16 | * GNU General Public License for more details. |
nkeynes@359 | 17 | */ |
nkeynes@359 | 18 | |
nkeynes@730 | 19 | #include "sh4/sh4core.h" |
nkeynes@730 | 20 | #include "sh4/sh4dasm.h" |
nkeynes@359 | 21 | #include "mem.h" |
nkeynes@359 | 22 | |
nkeynes@359 | 23 | #define UNIMP(ir) snprintf( buf, len, "??? " ) |
nkeynes@359 | 24 | |
nkeynes@359 | 25 | |
nkeynes@359 | 26 | const struct reg_desc_struct sh4_reg_map[] = |
nkeynes@359 | 27 | { {"R0", REG_INT, &sh4r.r[0]}, {"R1", REG_INT, &sh4r.r[1]}, |
nkeynes@359 | 28 | {"R2", REG_INT, &sh4r.r[2]}, {"R3", REG_INT, &sh4r.r[3]}, |
nkeynes@359 | 29 | {"R4", REG_INT, &sh4r.r[4]}, {"R5", REG_INT, &sh4r.r[5]}, |
nkeynes@359 | 30 | {"R6", REG_INT, &sh4r.r[6]}, {"R7", REG_INT, &sh4r.r[7]}, |
nkeynes@359 | 31 | {"R8", REG_INT, &sh4r.r[8]}, {"R9", REG_INT, &sh4r.r[9]}, |
nkeynes@359 | 32 | {"R10",REG_INT, &sh4r.r[10]}, {"R11",REG_INT, &sh4r.r[11]}, |
nkeynes@359 | 33 | {"R12",REG_INT, &sh4r.r[12]}, {"R13",REG_INT, &sh4r.r[13]}, |
nkeynes@359 | 34 | {"R14",REG_INT, &sh4r.r[14]}, {"R15",REG_INT, &sh4r.r[15]}, |
nkeynes@359 | 35 | {"SR", REG_INT, &sh4r.sr}, {"GBR", REG_INT, &sh4r.gbr}, |
nkeynes@359 | 36 | {"SSR",REG_INT, &sh4r.ssr}, {"SPC", REG_INT, &sh4r.spc}, |
nkeynes@359 | 37 | {"SGR",REG_INT, &sh4r.sgr}, {"DBR", REG_INT, &sh4r.dbr}, |
nkeynes@359 | 38 | {"VBR",REG_INT, &sh4r.vbr}, |
nkeynes@359 | 39 | {"PC", REG_INT, &sh4r.pc}, {"PR", REG_INT, &sh4r.pr}, |
nkeynes@359 | 40 | {"MACL",REG_INT, &sh4r.mac},{"MACH",REG_INT, ((uint32_t *)&sh4r.mac)+1}, |
nkeynes@669 | 41 | {"FPUL", REG_INT, &sh4r.fpul.i}, {"FPSCR", REG_INT, &sh4r.fpscr}, |
nkeynes@359 | 42 | {NULL, 0, NULL} }; |
nkeynes@359 | 43 | |
nkeynes@359 | 44 | |
nkeynes@359 | 45 | const struct cpu_desc_struct sh4_cpu_desc = |
nkeynes@597 | 46 | { "SH4", sh4_disasm_instruction, sh4_execute_instruction, sh4_has_page, |
nkeynes@359 | 47 | sh4_set_breakpoint, sh4_clear_breakpoint, sh4_get_breakpoint, 2, |
nkeynes@359 | 48 | (char *)&sh4r, sizeof(sh4r), sh4_reg_map, |
nkeynes@359 | 49 | &sh4r.pc }; |
nkeynes@359 | 50 | |
nkeynes@597 | 51 | uint32_t sh4_disasm_instruction( sh4vma_t pc, char *buf, int len, char *opcode ) |
nkeynes@359 | 52 | { |
nkeynes@597 | 53 | sh4addr_t addr = mmu_vma_to_phys_disasm(pc); |
nkeynes@597 | 54 | uint16_t ir = sh4_read_word(addr); |
nkeynes@359 | 55 | |
nkeynes@359 | 56 | #define UNDEF(ir) snprintf( buf, len, "???? " ); |
nkeynes@359 | 57 | #define RN(ir) ((ir&0x0F00)>>8) |
nkeynes@359 | 58 | #define RN_BANK(ir) ((ir&0x0070)>>4) |
nkeynes@359 | 59 | #define RM(ir) ((ir&0x00F0)>>4) |
nkeynes@359 | 60 | #define DISP4(ir) (ir&0x000F) /* 4-bit displacements are *not* sign extended */ |
nkeynes@359 | 61 | #define DISP8(ir) (ir&0x00FF) |
nkeynes@359 | 62 | #define PCDISP8(ir) SIGNEXT8(ir&0x00FF) |
nkeynes@359 | 63 | #define UIMM8(ir) (ir&0x00FF) |
nkeynes@359 | 64 | #define IMM8(ir) SIGNEXT8(ir&0x00FF) |
nkeynes@359 | 65 | #define DISP12(ir) SIGNEXT12(ir&0x0FFF) |
nkeynes@359 | 66 | #define FVN(ir) ((ir&0x0C00)>>10) |
nkeynes@359 | 67 | #define FVM(ir) ((ir&0x0300)>>8) |
nkeynes@359 | 68 | |
nkeynes@359 | 69 | sprintf( opcode, "%02X %02X", ir&0xFF, ir>>8 ); |
nkeynes@359 | 70 | |
nkeynes@359 | 71 | %% |
nkeynes@359 | 72 | ADD Rm, Rn {: snprintf( buf, len, "ADD R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 73 | ADD #imm, Rn {: snprintf( buf, len, "ADD #%d, R%d", imm, Rn ); :} |
nkeynes@359 | 74 | ADDC Rm, Rn {: snprintf( buf, len, "ADDC R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 75 | ADDV Rm, Rn {: snprintf( buf, len, "ADDV R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 76 | AND Rm, Rn {: snprintf( buf, len, "AND R%d, R%d", Rm, Rn ); :} |
nkeynes@595 | 77 | AND #imm, R0 {: snprintf( buf, len, "AND #%d, R0", imm ); :} |
nkeynes@359 | 78 | AND.B #imm, @(R0, GBR) {: snprintf( buf, len, "AND.B #%d, @(R0, GBR)", imm ); :} |
nkeynes@359 | 79 | BF disp {: snprintf( buf, len, "BF $%xh", disp+pc+4 ); :} |
nkeynes@359 | 80 | BF/S disp {: snprintf( buf, len, "BF/S $%xh", disp+pc+4 ); :} |
nkeynes@359 | 81 | BRA disp {: snprintf( buf, len, "BRA $%xh", disp+pc+4 ); :} |
nkeynes@359 | 82 | BRAF Rn {: snprintf( buf, len, "BRAF R%d", Rn ); :} |
nkeynes@359 | 83 | BSR disp {: snprintf( buf, len, "BSR $%xh", disp+pc+4 ); :} |
nkeynes@359 | 84 | BSRF Rn {: snprintf( buf, len, "BSRF R%d", Rn ); :} |
nkeynes@359 | 85 | BT disp {: snprintf( buf, len, "BT $%xh", disp+pc+4 ); :} |
nkeynes@359 | 86 | BT/S disp {: snprintf( buf, len, "BT/S $%xh", disp+pc+4 ); :} |
nkeynes@359 | 87 | CLRMAC {: snprintf( buf, len, "CLRMAC " ); :} |
nkeynes@359 | 88 | CLRS {: snprintf( buf, len, "CLRS " ); :} |
nkeynes@359 | 89 | CLRT {: snprintf( buf, len, "CLRT " ); :} |
nkeynes@359 | 90 | CMP/EQ Rm, Rn {: snprintf( buf, len, "CMP/EQ R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 91 | CMP/EQ #imm, R0 {: snprintf( buf, len, "CMP/EQ #%d, R0", imm ); :} |
nkeynes@359 | 92 | CMP/GE Rm, Rn {: snprintf( buf, len, "CMP/GE R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 93 | CMP/GT Rm, Rn {: snprintf( buf, len, "CMP/GT R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 94 | CMP/HI Rm, Rn {: snprintf( buf, len, "CMP/HI R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 95 | CMP/HS Rm, Rn {: snprintf( buf, len, "CMP/HS R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 96 | CMP/PL Rn {: snprintf( buf, len, "CMP/PL R%d", Rn ); :} |
nkeynes@359 | 97 | CMP/PZ Rn {: snprintf( buf, len, "CMP/PZ R%d", Rn ); :} |
nkeynes@359 | 98 | CMP/STR Rm, Rn {: snprintf( buf, len, "CMP/STR R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 99 | DIV0S Rm, Rn {: snprintf( buf, len, "DIV0S R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 100 | DIV0U {: snprintf( buf, len, "DIV0U " ); :} |
nkeynes@359 | 101 | DIV1 Rm, Rn {: snprintf( buf, len, "DIV1 R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 102 | DMULS.L Rm, Rn {: snprintf( buf, len, "DMULS.L R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 103 | DMULU.L RM, Rn {: snprintf( buf, len, "DMULU.L R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 104 | DT Rn {: snprintf( buf, len, "DT R%d", Rn ); :} |
nkeynes@359 | 105 | EXTS.B Rm, Rn {: snprintf( buf, len, "EXTS.B R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 106 | EXTS.W Rm, Rn {: snprintf( buf, len, "EXTS.W R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 107 | EXTU.B Rm, Rn {: snprintf( buf, len, "EXTU.B R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 108 | EXTU.W Rm, Rn {: snprintf( buf, len, "EXTU.W R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 109 | FABS FRn {: snprintf( buf, len, "FABS FR%d", FRn ); :} |
nkeynes@359 | 110 | FADD FRm, FRn {: snprintf( buf, len, "FADD FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 111 | FCMP/EQ FRm, FRn {: snprintf( buf, len, "FCMP/EQ FR%d, FR%d", FRm, FRn ); :} |
nkeynes@873 | 112 | FCMP/GT FRm, FRn {: snprintf( buf, len, "FCMP/GT FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 113 | FCNVDS FRm, FPUL {: snprintf( buf, len, "FCNVDS FR%d, FPUL", FRm ); :} |
nkeynes@359 | 114 | FCNVSD FPUL, FRn {: snprintf( buf, len, "FCNVSD FPUL, FR%d", FRn ); :} |
nkeynes@359 | 115 | FDIV FRm, FRn {: snprintf( buf, len, "FDIV FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 116 | FIPR FVm, FVn {: snprintf( buf, len, "FIPR FV%d, FV%d", FVm, FVn ); :} |
nkeynes@359 | 117 | FLDS FRm, FPUL {: snprintf( buf, len, "FLDS FR%d, FPUL", FRm ); :} |
nkeynes@359 | 118 | FLDI0 FRn {: snprintf( buf, len, "FLDI0 FR%d", FRn ); :} |
nkeynes@359 | 119 | FLDI1 FRn {: snprintf( buf, len, "FLDI1 FR%d", FRn ); :} |
nkeynes@359 | 120 | FLOAT FPUL, FRn {: snprintf( buf, len, "FLOAT FPUL, FR%d", FRn ); :} |
nkeynes@359 | 121 | FMAC FR0, FRm, FRn {: snprintf( buf, len, "FMAC FR0, FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 122 | FMOV FRm, FRn {: snprintf( buf, len, "FMOV FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 123 | FMOV FRm, @Rn {: snprintf( buf, len, "FMOV FR%d, @R%d", FRm, Rn ); :} |
nkeynes@359 | 124 | FMOV FRm, @-Rn {: snprintf( buf, len, "FMOV FR%d, @-R%d", FRm, Rn ); :} |
nkeynes@359 | 125 | FMOV FRm, @(R0, Rn) {: snprintf( buf, len, "FMOV FR%d, @(R0, R%d)", FRm, Rn ); :} |
nkeynes@359 | 126 | FMOV @Rm, FRn {: snprintf( buf, len, "FMOV @R%d, FR%d", Rm, FRn ); :} |
nkeynes@359 | 127 | FMOV @Rm+, FRn {: snprintf( buf, len, "FMOV @R%d+, FR%d", Rm, FRn ); :} |
nkeynes@359 | 128 | FMOV @(R0, Rm), FRn {: snprintf( buf, len, "FMOV @(R0, R%d), FR%d", Rm, FRn ); :} |
nkeynes@430 | 129 | FMUL FRm, FRn {: snprintf( buf, len, "FMUL FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 130 | FNEG FRn {: snprintf( buf, len, "FNEG FR%d", FRn ); :} |
nkeynes@359 | 131 | FRCHG {: snprintf( buf, len, "FRCHG " ); :} |
nkeynes@359 | 132 | FSCA FPUL, FRn {: snprintf( buf, len, "FSCA FPUL, FR%d", FRn ); :} |
nkeynes@359 | 133 | FSCHG {: snprintf( buf, len, "FSCHG " ); :} |
nkeynes@359 | 134 | FSQRT FRn {: snprintf( buf, len, "FSQRT FR%d", FRn ); :} |
nkeynes@359 | 135 | FSRRA FRn {: snprintf( buf, len, "FSRRA FR%d", FRn ); :} |
nkeynes@359 | 136 | FSTS FPUL, FRn {: snprintf( buf, len, "FSTS FPUL, FR%d", FRn ); :} |
nkeynes@430 | 137 | FSUB FRm, FRn {: snprintf( buf, len, "FSUB FR%d, FR%d", FRm, FRn ); :} |
nkeynes@359 | 138 | FTRC FRm, FPUL {: snprintf( buf, len, "FTRC FR%d, FPUL", FRm ); :} |
nkeynes@359 | 139 | FTRV XMTRX, FVn {: snprintf( buf, len, "FTRV XMTRX, FV%d", FVn ); :} |
nkeynes@359 | 140 | JMP @Rn {: snprintf( buf, len, "JMP @R%d", Rn ); :} |
nkeynes@359 | 141 | JSR @Rn {: snprintf( buf, len, "JSR @R%d", Rn ); :} |
nkeynes@359 | 142 | LDC Rm, GBR {: snprintf( buf, len, "LDC R%d, GBR", Rm ); :} |
nkeynes@359 | 143 | LDC Rm, SR {: snprintf( buf, len, "LDC R%d, SR", Rm ); :} |
nkeynes@359 | 144 | LDC Rm, VBR {: snprintf( buf, len, "LDC R%d, VBR", Rm ); :} |
nkeynes@359 | 145 | LDC Rm, SSR {: snprintf( buf, len, "LDC R%d, SSR", Rm ); :} |
nkeynes@359 | 146 | LDC Rm, SGR {: snprintf( buf, len, "LDC R%d, SGR", Rm ); :} |
nkeynes@359 | 147 | LDC Rm, SPC {: snprintf( buf, len, "LDC R%d, SPC", Rm ); :} |
nkeynes@359 | 148 | LDC Rm, DBR {: snprintf( buf, len, "LDC R%d, DBR", Rm ); :} |
nkeynes@359 | 149 | LDC Rm, Rn_BANK {: snprintf( buf, len, "LDC R%d, R%d_BANK", Rm, Rn_BANK ); :} |
nkeynes@359 | 150 | LDS Rm, FPSCR {: snprintf( buf, len, "LDS R%d, FPSCR", Rm ); :} |
nkeynes@359 | 151 | LDS Rm, FPUL {: snprintf( buf, len, "LDS R%d, FPUL", Rm ); :} |
nkeynes@359 | 152 | LDS Rm, MACH {: snprintf( buf, len, "LDS R%d, MACH", Rm ); :} |
nkeynes@359 | 153 | LDS Rm, MACL {: snprintf( buf, len, "LDS R%d, MACL", Rm ); :} |
nkeynes@359 | 154 | LDS Rm, PR {: snprintf( buf, len, "LDS R%d, PR", Rm ); :} |
nkeynes@359 | 155 | LDC.L @Rm+, GBR {: snprintf( buf, len, "LDC.L @R%d+, GBR", Rm ); :} |
nkeynes@359 | 156 | LDC.L @Rm+, SR {: snprintf( buf, len, "LDC.L @R%d+, SR", Rm ); :} |
nkeynes@359 | 157 | LDC.L @Rm+, VBR {: snprintf( buf, len, "LDC.L @R%d+, VBR", Rm ); :} |
nkeynes@359 | 158 | LDC.L @Rm+, SSR {: snprintf( buf, len, "LDC.L @R%d+, SSR", Rm ); :} |
nkeynes@359 | 159 | LDC.L @Rm+, SGR {: snprintf( buf, len, "LDC.L @R%d+, SGR", Rm ); :} |
nkeynes@359 | 160 | LDC.L @Rm+, SPC {: snprintf( buf, len, "LDC.L @R%d+, SPC", Rm ); :} |
nkeynes@359 | 161 | LDC.L @Rm+, DBR {: snprintf( buf, len, "LDC.L @R%d+, DBR", Rm ); :} |
nkeynes@359 | 162 | LDC.L @Rm+, Rn_BANK{: snprintf( buf, len, "LDC.L @R%d+, @R%d+_BANK", Rm, Rn_BANK ); :} |
nkeynes@359 | 163 | LDS.L @Rm+, FPSCR{: snprintf( buf, len, "LDS.L @R%d+, FPSCR", Rm ); :} |
nkeynes@359 | 164 | LDS.L @Rm+, FPUL {: snprintf( buf, len, "LDS.L @R%d+, FPUL", Rm ); :} |
nkeynes@359 | 165 | LDS.L @Rm+, MACH {: snprintf( buf, len, "LDS.L @R%d+, MACH", Rm ); :} |
nkeynes@359 | 166 | LDS.L @Rm+, MACL {: snprintf( buf, len, "LDS.L @R%d+, MACL", Rm ); :} |
nkeynes@359 | 167 | LDS.L @Rm+, PR {: snprintf( buf, len, "LDS.L @R%d+, PR", Rm ); :} |
nkeynes@359 | 168 | LDTLB {: snprintf( buf, len, "LDTLB " ); :} |
nkeynes@359 | 169 | MAC.L @Rm+, @Rn+ {: snprintf( buf, len, "MAC.L @R%d+, @R%d+", Rm, Rn ); :} |
nkeynes@359 | 170 | MAC.W @Rm+, @Rn+ {: snprintf( buf, len, "MAC.W @R%d+, @R%d+", Rm, Rn ); :} |
nkeynes@359 | 171 | MOV Rm, Rn {: snprintf( buf, len, "MOV R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 172 | MOV #imm, Rn {: snprintf( buf, len, "MOV #%d, R%d", imm, Rn ); :} |
nkeynes@359 | 173 | MOV.B Rm, @Rn {: snprintf( buf, len, "MOV.B R%d, @R%d", Rm, Rn ); :} |
nkeynes@359 | 174 | MOV.B Rm, @-Rn {: snprintf( buf, len, "MOV.B R%d, @-R%d", Rm, Rn ); :} |
nkeynes@359 | 175 | MOV.B Rm, @(R0, Rn) {: snprintf( buf, len, "MOV.B R%d, @(R0, R%d)", Rm, Rn ); :} |
nkeynes@359 | 176 | MOV.B R0, @(disp, GBR) {: snprintf( buf, len, "MOV.B R0, @(%d, GBR)", disp ); :} |
nkeynes@359 | 177 | MOV.B R0, @(disp, Rn) {: snprintf( buf, len, "MOV.B R0, @(%d, R%d)", disp, Rn ); :} |
nkeynes@359 | 178 | MOV.B @Rm, Rn {: snprintf( buf, len, "MOV.B @R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 179 | MOV.B @Rm+, Rn {: snprintf( buf, len, "MOV.B @R%d+, R%d", Rm, Rn ); :} |
nkeynes@359 | 180 | MOV.B @(R0, Rm), Rn {: snprintf( buf, len, "MOV.B @(R0, R%d), R%d", Rm, Rn ); :} |
nkeynes@359 | 181 | MOV.B @(disp, GBR), R0{: snprintf( buf, len, "MOV.B @(%d, GBR), R0", disp ); :} |
nkeynes@359 | 182 | MOV.B @(disp, Rm), R0 {: snprintf( buf, len, "MOV.B @(%d, R%d), R0", disp, Rm ); :} |
nkeynes@359 | 183 | MOV.L Rm, @Rn {: snprintf( buf, len, "MOV.L R%d, @R%d", Rm, Rn ); :} |
nkeynes@359 | 184 | MOV.L Rm, @-Rn {: snprintf( buf, len, "MOV.L R%d, @-R%d", Rm, Rn ); :} |
nkeynes@359 | 185 | MOV.L Rm, @(R0, Rn) {: snprintf( buf, len, "MOV.L R%d, @(R0, R%d)", Rm, Rn ); :} |
nkeynes@359 | 186 | MOV.L R0, @(disp, GBR) {: snprintf( buf, len, "MOV.L R0, @(%d, GBR)", disp ); :} |
nkeynes@359 | 187 | MOV.L Rm, @(disp, Rn) {: snprintf( buf, len, "MOV.L R%d, @(%d, R%d)", Rm, disp, Rn ); :} |
nkeynes@359 | 188 | MOV.L @Rm, Rn {: snprintf( buf, len, "MOV.L @R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 189 | MOV.L @Rm+, Rn {: snprintf( buf, len, "MOV.L @R%d+, R%d", Rm, Rn ); :} |
nkeynes@359 | 190 | MOV.L @(R0, Rm), Rn {: snprintf( buf, len, "MOV.L @(R0, R%d), R%d", Rm, Rn ); :} |
nkeynes@359 | 191 | MOV.L @(disp, GBR), R0 {: snprintf( buf, len, "MOV.L @(%d, GBR), R0",disp ); :} |
nkeynes@597 | 192 | MOV.L @(disp, PC), Rn {: snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(addr&0xFFFFFFFC)+4) ); :} |
nkeynes@496 | 193 | MOV.L @(disp, Rm), Rn {: snprintf( buf, len, "MOV.L @(%d, R%d), R%d", disp, Rm, Rn ); :} |
nkeynes@359 | 194 | MOV.W Rm, @Rn {: snprintf( buf, len, "MOV.W R%d, @R%d", Rm, Rn ); :} |
nkeynes@359 | 195 | MOV.W Rm, @-Rn {: snprintf( buf, len, "MOV.W R%d, @-R%d", Rm, Rn ); :} |
nkeynes@359 | 196 | MOV.W Rm, @(R0, Rn) {: snprintf( buf, len, "MOV.W R%d, @(R0, R%d)", Rm, Rn ); :} |
nkeynes@359 | 197 | MOV.W R0, @(disp, GBR) {: snprintf( buf, len, "MOV.W R0, @(%d, GBR)", disp); :} |
nkeynes@430 | 198 | MOV.W R0, @(disp, Rn) {: snprintf( buf, len, "MOV.W R0, @(%d, R%d)", disp, Rn ); :} |
nkeynes@359 | 199 | MOV.W @Rm, Rn {: snprintf( buf, len, "MOV.W @R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 200 | MOV.W @Rm+, Rn {: snprintf( buf, len, "MOV.W @R%d+, R%d", Rm, Rn ); :} |
nkeynes@359 | 201 | MOV.W @(R0, Rm), Rn {: snprintf( buf, len, "MOV.W @(R0, R%d), R%d", Rm, Rn ); :} |
nkeynes@359 | 202 | MOV.W @(disp, GBR), R0 {: snprintf( buf, len, "MOV.W @(%d, GBR), R0", disp ); :} |
nkeynes@597 | 203 | MOV.W @(disp, PC), Rn {: snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+addr+4) ); :} |
nkeynes@359 | 204 | MOV.W @(disp, Rm), R0 {: snprintf( buf, len, "MOV.W @(%d, R%d), R0", disp, Rm ); :} |
nkeynes@359 | 205 | MOVA @(disp, PC), R0 {: snprintf( buf, len, "MOVA @($%xh), R0", disp + (pc&0xFFFFFFFC) + 4 ); :} |
nkeynes@359 | 206 | MOVCA.L R0, @Rn {: snprintf( buf, len, "MOVCA.L R0, @R%d", Rn ); :} |
nkeynes@359 | 207 | MOVT Rn {: snprintf( buf, len, "MOVT R%d", Rn ); :} |
nkeynes@359 | 208 | MUL.L Rm, Rn {: snprintf( buf, len, "MUL.L R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 209 | MULS.W Rm, Rn {: snprintf( buf, len, "MULS.W R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 210 | MULU.W Rm, Rn {: snprintf( buf, len, "MULU.W R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 211 | NEG Rm, Rn {: snprintf( buf, len, "NEG R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 212 | NEGC Rm, Rn {: snprintf( buf, len, "NEGC R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 213 | NOP {: snprintf( buf, len, "NOP " ); :} |
nkeynes@359 | 214 | NOT Rm, Rn {: snprintf( buf, len, "NOT R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 215 | OCBI @Rn {: snprintf( buf, len, "OCBI @R%d", Rn ); :} |
nkeynes@359 | 216 | OCBP @Rn {: snprintf( buf, len, "OCBP @R%d", Rn ); :} |
nkeynes@359 | 217 | OCBWB @Rn {: snprintf( buf, len, "OCBWB @R%d", Rn ); :} |
nkeynes@359 | 218 | OR Rm, Rn {: snprintf( buf, len, "OR R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 219 | OR #imm, R0 {: snprintf( buf, len, "OR #%d, R0", imm ); :} |
nkeynes@359 | 220 | OR.B #imm, @(R0, GBR) {: snprintf( buf, len, "OR.B #%d, @(R0, GBR)", imm ); :} |
nkeynes@359 | 221 | PREF @Rn {: snprintf( buf, len, "PREF R%d", Rn ); :} |
nkeynes@359 | 222 | ROTCL Rn {: snprintf( buf, len, "ROTCL R%d", Rn ); :} |
nkeynes@359 | 223 | ROTCR Rn {: snprintf( buf, len, "ROTCR R%d", Rn ); :} |
nkeynes@359 | 224 | ROTL Rn {: snprintf( buf, len, "ROTL R%d", Rn ); :} |
nkeynes@359 | 225 | ROTR Rn {: snprintf( buf, len, "ROTR R%d", Rn ); :} |
nkeynes@359 | 226 | RTE {: snprintf( buf, len, "RTE " ); :} |
nkeynes@359 | 227 | RTS {: snprintf( buf, len, "RTS " ); :} |
nkeynes@359 | 228 | SETS {: snprintf( buf, len, "SETS " ); :} |
nkeynes@359 | 229 | SETT {: snprintf( buf, len, "SETT " ); :} |
nkeynes@359 | 230 | SHAD Rm, Rn {: snprintf( buf, len, "SHAD R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 231 | SHAL Rn {: snprintf( buf, len, "SHAL R%d", Rn ); :} |
nkeynes@359 | 232 | SHAR Rn {: snprintf( buf, len, "SHAR R%d", Rn ); :} |
nkeynes@359 | 233 | SHLD Rm, Rn {: snprintf( buf, len, "SHLD R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 234 | SHLL Rn {: snprintf( buf, len, "SHLL R%d", Rn ); :} |
nkeynes@359 | 235 | SHLL2 Rn {: snprintf( buf, len, "SHLL2 R%d", Rn ); :} |
nkeynes@359 | 236 | SHLL8 Rn {: snprintf( buf, len, "SHLL8 R%d", Rn ); :} |
nkeynes@359 | 237 | SHLL16 Rn {: snprintf( buf, len, "SHLL16 R%d", Rn ); :} |
nkeynes@359 | 238 | SHLR Rn {: snprintf( buf, len, "SHLR R%d", Rn ); :} |
nkeynes@359 | 239 | SHLR2 Rn {: snprintf( buf, len, "SHLR2 R%d", Rn ); :} |
nkeynes@359 | 240 | SHLR8 Rn {: snprintf( buf, len, "SHLR8 R%d", Rn ); :} |
nkeynes@359 | 241 | SHLR16 Rn {: snprintf( buf, len, "SHLR16 R%d", Rn ); :} |
nkeynes@359 | 242 | SLEEP {: snprintf( buf, len, "SLEEP " ); :} |
nkeynes@359 | 243 | STC SR, Rn {: snprintf( buf, len, "STC SR, R%d", Rn ); :} |
nkeynes@359 | 244 | STC GBR, Rn {: snprintf( buf, len, "STC GBR, R%d", Rn ); :} |
nkeynes@359 | 245 | STC VBR, Rn {: snprintf( buf, len, "STC VBR, R%d", Rn ); :} |
nkeynes@359 | 246 | STC SSR, Rn {: snprintf( buf, len, "STC SSR, R%d", Rn ); :} |
nkeynes@359 | 247 | STC SPC, Rn {: snprintf( buf, len, "STC SPC, R%d", Rn ); :} |
nkeynes@359 | 248 | STC SGR, Rn {: snprintf( buf, len, "STC SGR, R%d", Rn ); :} |
nkeynes@359 | 249 | STC DBR, Rn {: snprintf( buf, len, "STC DBR, R%d", Rn ); :} |
nkeynes@359 | 250 | STC Rm_BANK, Rn {: snprintf( buf, len, "STC R%d_BANK, R%d", Rm_BANK, Rn ); :} |
nkeynes@359 | 251 | STS FPSCR, Rn {: snprintf( buf, len, "STS FPSCR, R%d", Rn ); :} |
nkeynes@359 | 252 | STS FPUL, Rn {: snprintf( buf, len, "STS FPUL, R%d", Rn ); :} |
nkeynes@359 | 253 | STS MACH, Rn {: snprintf( buf, len, "STS MACH, R%d", Rn ); :} |
nkeynes@359 | 254 | STS MACL, Rn {: snprintf( buf, len, "STS MACL, R%d", Rn ); :} |
nkeynes@359 | 255 | STS PR, Rn {: snprintf( buf, len, "STS PR, R%d", Rn ); :} |
nkeynes@359 | 256 | STC.L SR, @-Rn {: snprintf( buf, len, "STC.L SR, @-R%d", Rn ); :} |
nkeynes@359 | 257 | STC.L GBR, @-Rn {: snprintf( buf, len, "STC.L GBR, @-R%d", Rn ); :} |
nkeynes@359 | 258 | STC.L VBR, @-Rn {: snprintf( buf, len, "STC.L VBR, @-R%d", Rn ); :} |
nkeynes@359 | 259 | STC.L SSR, @-Rn {: snprintf( buf, len, "STC.L SSR, @-R%d", Rn ); :} |
nkeynes@359 | 260 | STC.L SPC, @-Rn {: snprintf( buf, len, "STC.L SPC, @-R%d", Rn ); :} |
nkeynes@359 | 261 | STC.L SGR, @-Rn {: snprintf( buf, len, "STC.L SGR, @-R%d", Rn ); :} |
nkeynes@359 | 262 | STC.L DBR, @-Rn {: snprintf( buf, len, "STC.L DBR, @-R%d", Rn ); :} |
nkeynes@359 | 263 | STC.L Rm_BANK, @-Rn {: snprintf( buf, len, "STC.L @-R%d_BANK, @-R%d", Rm_BANK, Rn ); :} |
nkeynes@359 | 264 | STS.L FPSCR, @-Rn{: snprintf( buf, len, "STS.L FPSCR, @-R%d", Rn ); :} |
nkeynes@359 | 265 | STS.L FPUL, @-Rn {: snprintf( buf, len, "STS.L FPUL, @-R%d", Rn ); :} |
nkeynes@359 | 266 | STS.L MACH, @-Rn {: snprintf( buf, len, "STS.L MACH, @-R%d", Rn ); :} |
nkeynes@359 | 267 | STS.L MACL, @-Rn {: snprintf( buf, len, "STS.L MACL, @-R%d", Rn ); :} |
nkeynes@359 | 268 | STS.L PR, @-Rn {: snprintf( buf, len, "STS.L PR, @-R%d", Rn ); :} |
nkeynes@359 | 269 | SUB Rm, Rn {: snprintf( buf, len, "SUB R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 270 | SUBC Rm, Rn {: snprintf( buf, len, "SUBC R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 271 | SUBV Rm, Rn {: snprintf( buf, len, "SUBV R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 272 | SWAP.B Rm, Rn {: snprintf( buf, len, "SWAP.B R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 273 | SWAP.W Rm, Rn {: snprintf( buf, len, "SWAP.W R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 274 | TAS.B @Rn {: snprintf( buf, len, "TAS.B R%d", Rn ); :} |
nkeynes@359 | 275 | TRAPA #imm {: snprintf( buf, len, "TRAPA #%d", imm ); :} |
nkeynes@359 | 276 | TST Rm, Rn {: snprintf( buf, len, "TST R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 277 | TST #imm, R0 {: snprintf( buf, len, "TST #%d, R0", imm ); :} |
nkeynes@359 | 278 | TST.B #imm, @(R0, GBR) {: snprintf( buf, len, "TST.B #%d, @(R0, GBR)", imm ); :} |
nkeynes@359 | 279 | XOR Rm, Rn {: snprintf( buf, len, "XOR R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 280 | XOR #imm, R0 {: snprintf( buf, len, "XOR #%d, R0", imm ); :} |
nkeynes@359 | 281 | XOR.B #imm, @(R0, GBR) {: snprintf( buf, len, "XOR.B #%d, @(R0, GBR)", imm ); :} |
nkeynes@359 | 282 | XTRCT Rm, Rn {: snprintf( buf, len, "XTRCT R%d, R%d", Rm, Rn ); :} |
nkeynes@359 | 283 | UNDEF {: snprintf( buf, len, "UNDEF " ); :} |
nkeynes@359 | 284 | %% |
nkeynes@359 | 285 | return pc+2; |
nkeynes@359 | 286 | } |
nkeynes@359 | 287 | |
nkeynes@359 | 288 | |
nkeynes@586 | 289 | void sh4_disasm_region( FILE *f, int from, int to ) |
nkeynes@359 | 290 | { |
nkeynes@359 | 291 | int pc; |
nkeynes@359 | 292 | char buf[80]; |
nkeynes@359 | 293 | char opcode[16]; |
nkeynes@359 | 294 | |
nkeynes@359 | 295 | for( pc = from; pc < to; pc+=2 ) { |
nkeynes@359 | 296 | buf[0] = '\0'; |
nkeynes@359 | 297 | sh4_disasm_instruction( pc, |
nkeynes@359 | 298 | buf, sizeof(buf), opcode ); |
nkeynes@359 | 299 | fprintf( f, " %08x: %s %s\n", pc, opcode, buf ); |
nkeynes@359 | 300 | } |
nkeynes@359 | 301 | } |
nkeynes@706 | 302 | |
nkeynes@706 | 303 | void sh4_dump_region( int from, int to ) |
nkeynes@706 | 304 | { |
nkeynes@706 | 305 | sh4_disasm_region( stdout, from, to ); |
nkeynes@706 | 306 | } |
.