filename | src/sh4/sh4dasm.c |
changeset | 359:c588dce7ebde |
prev | 302:96b5cc24309c |
next | 430:467519b050f4 |
author | nkeynes |
date | Thu Aug 23 12:33:27 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Commit decoder generator Translator work in progress Fix mac.l, mac.w in emu core |
file | annotate | diff | log | raw |
1.1 --- a/src/sh4/sh4dasm.c Wed Jan 17 21:27:20 2007 +00001.2 +++ b/src/sh4/sh4dasm.c Thu Aug 23 12:33:27 2007 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: sh4dasm.c,v 1.10 2007-01-17 21:27:20 nkeynes Exp $1.6 + * $Id: sh4dasm.c,v 1.11 2007-08-23 12:33:27 nkeynes Exp $1.7 *1.8 * SH4 CPU definition and disassembly functions1.9 *1.10 @@ -51,7 +51,8 @@1.11 uint32_t sh4_disasm_instruction( uint32_t pc, char *buf, int len, char *opcode )1.12 {1.13 uint16_t ir = sh4_read_word(pc);1.14 -1.15 +1.16 +#define UNDEF(ir) snprintf( buf, len, "???? " );1.17 #define RN(ir) ((ir&0x0F00)>>8)1.18 #define RN_BANK(ir) ((ir&0x0070)>>4)1.19 #define RM(ir) ((ir&0x00F0)>>4)1.20 @@ -66,316 +67,1485 @@1.22 sprintf( opcode, "%02X %02X", ir&0xFF, ir>>8 );1.24 - switch( (ir&0xF000)>>12 ) {1.25 - case 0: /* 0000nnnnmmmmxxxx */1.26 - switch( ir&0x000F ) {1.27 - case 2:1.28 - switch( (ir&0x00F0)>>4 ) {1.29 - case 0: snprintf( buf, len, "STC SR, R%d", RN(ir) ); break;1.30 - case 1: snprintf( buf, len, "STC GBR, R%d", RN(ir) ); break;1.31 - case 2: snprintf( buf, len, "STC VBR, R%d", RN(ir) ); break;1.32 - case 3: snprintf( buf, len, "STC SSR, R%d", RN(ir) ); break;1.33 - case 4: snprintf( buf, len, "STC SPC, R%d", RN(ir) ); break;1.34 - case 8: case 9: case 10: case 11: case 12: case 13: case 14:1.35 - case 15:snprintf( buf, len, "STC R%d_bank, R%d", RN_BANK(ir), RN(ir) ); break;1.36 - default: UNIMP(ir);1.37 - }1.38 - break;1.39 - case 3:1.40 - switch( (ir&0x00F0)>>4 ) {1.41 - case 0: snprintf( buf, len, "BSRF R%d", RN(ir) ); break;1.42 - case 2: snprintf( buf, len, "BRAF R%d", RN(ir) ); break;1.43 - case 8: snprintf( buf, len, "PREF [R%d]", RN(ir) ); break;1.44 - case 9: snprintf( buf, len, "OCBI [R%d]", RN(ir) ); break;1.45 - case 10:snprintf( buf, len, "OCBP [R%d]", RN(ir) ); break;1.46 - case 11:snprintf( buf, len, "OCBWB [R%d]", RN(ir) ); break;1.47 - case 12:snprintf( buf, len, "MOVCA.L R0, [R%d]", RN(ir) ); break;1.48 - default: UNIMP(ir);1.49 - }1.50 - break;1.51 - case 4: snprintf( buf, len, "MOV.B R%d, [R0+R%d]", RM(ir), RN(ir) ); break;1.52 - case 5: snprintf( buf, len, "MOV.W R%d, [R0+R%d]", RM(ir), RN(ir) ); break;1.53 - case 6: snprintf( buf, len, "MOV.L R%d, [R0+R%d]", RM(ir), RN(ir) ); break;1.54 - case 7: snprintf( buf, len, "MUL.L R%d, R%d", RM(ir), RN(ir) ); break;1.55 - case 8:1.56 - switch( (ir&0x0FF0)>>4 ) {1.57 - case 0: snprintf( buf, len, "CLRT " ); break;1.58 - case 1: snprintf( buf, len, "SETT " ); break;1.59 - case 2: snprintf( buf, len, "CLRMAC " ); break;1.60 - case 3: snprintf( buf, len, "LDTLB " ); break;1.61 - case 4: snprintf( buf, len, "CLRS " ); break;1.62 - case 5: snprintf( buf, len, "SETS " ); break;1.63 - default: UNIMP(ir);1.64 - }1.65 - break;1.66 - case 9:1.67 - if( (ir&0x00F0) == 0x20 )1.68 - snprintf( buf, len, "MOVT R%d", RN(ir) );1.69 - else if( ir == 0x0019 )1.70 - snprintf( buf, len, "DIV0U " );1.71 - else if( ir == 0x0009 )1.72 - snprintf( buf, len, "NOP " );1.73 - else UNIMP(ir);1.74 - break;1.75 - case 10:1.76 - switch( (ir&0x00F0) >> 4 ) {1.77 - case 0: snprintf( buf, len, "STS MACH, R%d", RN(ir) ); break;1.78 - case 1: snprintf( buf, len, "STS MACL, R%d", RN(ir) ); break;1.79 - case 2: snprintf( buf, len, "STS PR, R%d", RN(ir) ); break;1.80 - case 3: snprintf( buf, len, "STC SGR, R%d", RN(ir) ); break;1.81 - case 5: snprintf( buf, len, "STS FPUL, R%d", RN(ir) ); break;1.82 - case 6: snprintf( buf, len, "STS FPSCR, R%d", RN(ir) ); break;1.83 - case 15:snprintf( buf, len, "STC DBR, R%d", RN(ir) ); break;1.84 - default: UNIMP(ir);1.85 - }1.86 - break;1.87 - case 11:1.88 - switch( (ir&0x0FF0)>>4 ) {1.89 - case 0: snprintf( buf, len, "RTS " ); break;1.90 - case 1: snprintf( buf, len, "SLEEP " ); break;1.91 - case 2: snprintf( buf, len, "RTE " ); break;1.92 - default:UNIMP(ir);1.93 - }1.94 - break;1.95 - case 12:snprintf( buf, len, "MOV.B [R0+R%d], R%d", RM(ir), RN(ir) ); break;1.96 - case 13:snprintf( buf, len, "MOV.W [R0+R%d], R%d", RM(ir), RN(ir) ); break;1.97 - case 14:snprintf( buf, len, "MOV.L [R0+R%d], R%d", RM(ir), RN(ir) ); break;1.98 - case 15:snprintf( buf, len, "MAC.L [R%d++], [R%d++]", RM(ir), RN(ir) ); break;1.99 - default: UNIMP(ir);1.100 - }1.101 - break;1.102 - case 1: /* 0001nnnnmmmmdddd */1.103 - snprintf( buf, len, "MOV.L R%d, [R%d%+d]", RM(ir), RN(ir), DISP4(ir)<<2 ); break;1.104 - case 2: /* 0010nnnnmmmmxxxx */1.105 - switch( ir&0x000F ) {1.106 - case 0: snprintf( buf, len, "MOV.B R%d, [R%d]", RM(ir), RN(ir) ); break;1.107 - case 1: snprintf( buf, len, "MOV.W R%d, [R%d]", RM(ir), RN(ir) ); break;1.108 - case 2: snprintf( buf, len, "MOV.L R%d, [R%d]", RM(ir), RN(ir) ); break;1.109 - case 3: UNIMP(ir); break;1.110 - case 4: snprintf( buf, len, "MOV.B R%d, [--R%d]", RM(ir), RN(ir) ); break;1.111 - case 5: snprintf( buf, len, "MOV.W R%d, [--R%d]", RM(ir), RN(ir) ); break;1.112 - case 6: snprintf( buf, len, "MOV.L R%d, [--R%d]", RM(ir), RN(ir) ); break;1.113 - case 7: snprintf( buf, len, "DIV0S R%d, R%d", RM(ir), RN(ir) ); break;1.114 - case 8: snprintf( buf, len, "TST R%d, R%d", RM(ir), RN(ir) ); break;1.115 - case 9: snprintf( buf, len, "AND R%d, R%d", RM(ir), RN(ir) ); break;1.116 - case 10:snprintf( buf, len, "XOR R%d, R%d", RM(ir), RN(ir) ); break;1.117 - case 11:snprintf( buf, len, "OR R%d, R%d", RM(ir), RN(ir) ); break;1.118 - case 12:snprintf( buf, len, "CMP/STR R%d, R%d", RM(ir), RN(ir) ); break;1.119 - case 13:snprintf( buf, len, "XTRCT R%d, R%d", RM(ir), RN(ir) ); break;1.120 - case 14:snprintf( buf, len, "MULU.W R%d, R%d", RM(ir), RN(ir) ); break;1.121 - case 15:snprintf( buf, len, "MULS.W R%d, R%d", RM(ir), RN(ir) ); break;1.122 - }1.123 - break;1.124 - case 3: /* 0011nnnnmmmmxxxx */1.125 - switch( ir&0x000F ) {1.126 - case 0: snprintf( buf, len, "CMP/EQ R%d, R%d", RM(ir), RN(ir) ); break;1.127 - case 2: snprintf( buf, len, "CMP/HS R%d, R%d", RM(ir), RN(ir) ); break;1.128 - case 3: snprintf( buf, len, "CMP/GE R%d, R%d", RM(ir), RN(ir) ); break;1.129 - case 4: snprintf( buf, len, "DIV1 R%d, R%d", RM(ir), RN(ir) ); break;1.130 - case 5: snprintf( buf, len, "DMULU.L R%d, R%d", RM(ir), RN(ir) ); break;1.131 - case 6: snprintf( buf, len, "CMP/HI R%d, R%d", RM(ir), RN(ir) ); break;1.132 - case 7: snprintf( buf, len, "CMP/GT R%d, R%d", RM(ir), RN(ir) ); break;1.133 - case 8: snprintf( buf, len, "SUB R%d, R%d", RM(ir), RN(ir) ); break;1.134 - case 10:snprintf( buf, len, "SUBC R%d, R%d", RM(ir), RN(ir) ); break;1.135 - case 11:snprintf( buf, len, "SUBV R%d, R%d", RM(ir), RN(ir) ); break;1.136 - case 12:snprintf( buf, len, "ADD R%d, R%d", RM(ir), RN(ir) ); break;1.137 - case 13:snprintf( buf, len, "DMULS.L R%d, R%d", RM(ir), RN(ir) ); break;1.138 - case 14:snprintf( buf, len, "ADDC R%d, R%d", RM(ir), RN(ir) ); break;1.139 - case 15:snprintf( buf, len, "ADDV R%d, R%d", RM(ir), RN(ir) ); break;1.140 - default: UNIMP(ir);1.141 - }1.142 - break;1.143 - case 4: /* 0100nnnnxxxxxxxx */1.144 - switch( ir&0x00FF ) {1.145 - case 0x00: snprintf( buf, len, "SHLL R%d", RN(ir) ); break;1.146 - case 0x01: snprintf( buf, len, "SHLR R%d", RN(ir) ); break;1.147 - case 0x02: snprintf( buf, len, "STS.L MACH, [--R%d]", RN(ir) ); break;1.148 - case 0x03: snprintf( buf, len, "STC.L SR, [--R%d]", RN(ir) ); break;1.149 - case 0x04: snprintf( buf, len, "ROTL R%d", RN(ir) ); break;1.150 - case 0x05: snprintf( buf, len, "ROTR R%d", RN(ir) ); break;1.151 - case 0x06: snprintf( buf, len, "LDS.L [R%d++], MACH", RN(ir) ); break;1.152 - case 0x07: snprintf( buf, len, "LDC.L [R%d++], SR", RN(ir) ); break;1.153 - case 0x08: snprintf( buf, len, "SHLL2 R%d", RN(ir) ); break;1.154 - case 0x09: snprintf( buf, len, "SHLR2 R%d", RN(ir) ); break;1.155 - case 0x0A: snprintf( buf, len, "LDS R%d, MACH", RN(ir) ); break;1.156 - case 0x0B: snprintf( buf, len, "JSR [R%d]", RN(ir) ); break;1.157 - case 0x0E: snprintf( buf, len, "LDC R%d, SR", RN(ir) ); break;1.158 - case 0x10: snprintf( buf, len, "DT R%d", RN(ir) ); break;1.159 - case 0x11: snprintf( buf, len, "CMP/PZ R%d", RN(ir) ); break;1.160 - case 0x12: snprintf( buf, len, "STS.L MACL, [--R%d]", RN(ir) ); break;1.161 - case 0x13: snprintf( buf, len, "STC.L GBR, [--R%d]", RN(ir) ); break;1.162 - case 0x15: snprintf( buf, len, "CMP/PL R%d", RN(ir) ); break;1.163 - case 0x16: snprintf( buf, len, "LDS.L [R%d++], MACL", RN(ir) ); break;1.164 - case 0x17: snprintf( buf, len, "LDC.L [R%d++], GBR", RN(ir) ); break;1.165 - case 0x18: snprintf( buf, len, "SHLL8 R%d", RN(ir) ); break;1.166 - case 0x19: snprintf( buf, len, "SHLR8 R%d", RN(ir) ); break;1.167 - case 0x1A: snprintf( buf, len, "LDS R%d, MACL", RN(ir) ); break;1.168 - case 0x1B: snprintf( buf, len, "TAS.B [R%d]", RN(ir) ); break;1.169 - case 0x1E: snprintf( buf, len, "LDC R%d, GBR", RN(ir) ); break;1.170 - case 0x20: snprintf( buf, len, "SHAL R%d", RN(ir) ); break;1.171 - case 0x21: snprintf( buf, len, "SHAR R%d", RN(ir) ); break;1.172 - case 0x22: snprintf( buf, len, "STS.L PR, [--R%d]", RN(ir) ); break;1.173 - case 0x23: snprintf( buf, len, "STC.L VBR, [--R%d]", RN(ir) ); break;1.174 - case 0x24: snprintf( buf, len, "ROTCL R%d", RN(ir) ); break;1.175 - case 0x25: snprintf( buf, len, "ROTCR R%d", RN(ir) ); break;1.176 - case 0x26: snprintf( buf, len, "LDS.L [R%d++], PR", RN(ir) ); break;1.177 - case 0x27: snprintf( buf, len, "LDC.L [R%d++], VBR", RN(ir) ); break;1.178 - case 0x28: snprintf( buf, len, "SHLL16 R%d", RN(ir) ); break;1.179 - case 0x29: snprintf( buf, len, "SHLR16 R%d", RN(ir) ); break;1.180 - case 0x2A: snprintf( buf, len, "LDS R%d, PR", RN(ir) ); break;1.181 - case 0x2B: snprintf( buf, len, "JMP [R%d]", RN(ir) ); break;1.182 - case 0x2E: snprintf( buf, len, "LDC R%d, VBR", RN(ir) ); break;1.183 - case 0x32: snprintf( buf, len, "STC.L SGR, [--R%d]", RN(ir) ); break;1.184 - case 0x33: snprintf( buf, len, "STC.L SSR, [--R%d]", RN(ir) ); break;1.185 - case 0x37: snprintf( buf, len, "LDC.L [R%d++], SSR", RN(ir) ); break;1.186 - case 0x3E: snprintf( buf, len, "LDC R%d, SSR", RN(ir) ); break;1.187 - case 0x43: snprintf( buf, len, "STC.L SPC, [--R%d]", RN(ir) ); break;1.188 - case 0x47: snprintf( buf, len, "LDC.L [R%d++], SPC", RN(ir) ); break;1.189 - case 0x4E: snprintf( buf, len, "LDC R%d, SPC", RN(ir) ); break;1.190 - case 0x52: snprintf( buf, len, "STS.L FPUL, [--R%d]", RN(ir) ); break;1.191 - case 0x56: snprintf( buf, len, "LDS.L [R%d++], FPUL", RN(ir) ); break;1.192 - case 0x5A: snprintf( buf, len, "LDS R%d, FPUL", RN(ir) ); break;1.193 - case 0x62: snprintf( buf, len, "STS.L FPSCR, [--R%d]", RN(ir) ); break;1.194 - case 0x66: snprintf( buf, len, "LDS.L [R%d++], FPSCR", RN(ir) ); break;1.195 - case 0x6A: snprintf( buf, len, "LDS R%d, FPSCR", RN(ir) ); break;1.196 - case 0xF2: snprintf( buf, len, "STC.L DBR, [--R%d]", RN(ir) ); break;1.197 - case 0xF6: snprintf( buf, len, "LDC.L [R%d++], DBR", RN(ir) ); break;1.198 - case 0xFA: snprintf( buf, len, "LDC R%d, DBR", RN(ir) ); break;1.199 - case 0x83: case 0x93: case 0xA3: case 0xB3: case 0xC3: case 0xD3: case 0xE3:1.200 - case 0xF3: snprintf( buf, len, "STC.L R%d_BANK, [--R%d]", RN_BANK(ir), RN(ir) ); break;1.201 - case 0x87: case 0x97: case 0xA7: case 0xB7: case 0xC7: case 0xD7: case 0xE7:1.202 - case 0xF7: snprintf( buf, len, "LDC.L [R%d++], R%d_BANK", RN(ir), RN_BANK(ir) ); break;1.203 - case 0x8E: case 0x9E: case 0xAE: case 0xBE: case 0xCE: case 0xDE: case 0xEE:1.204 - case 0xFE: snprintf( buf, len, "LDC R%d, R%d_BANK", RN(ir), RN_BANK(ir) ); break;1.205 - default:1.206 - if( (ir&0x000F) == 0x0F ) {1.207 - snprintf( buf, len, "MAC.W [R%d++], [R%d++]", RM(ir), RN(ir) );1.208 - } else if( (ir&0x000F) == 0x0C ) {1.209 - snprintf( buf, len, "SHAD R%d, R%d", RM(ir), RN(ir) );1.210 - } else if( (ir&0x000F) == 0x0D ) {1.211 - snprintf( buf, len, "SHLD R%d, R%d", RM(ir), RN(ir) );1.212 - } else UNIMP(ir);1.213 - }1.214 - break;1.215 - case 5: /* 0101nnnnmmmmdddd */1.216 - snprintf( buf, len, "MOV.L [R%d%+d], R%d", RM(ir), DISP4(ir)<<2, RN(ir) ); break;1.217 - case 6: /* 0110xxxxxxxxxxxx */1.218 - switch( ir&0x000f ) {1.219 - case 0: snprintf( buf, len, "MOV.B [R%d], R%d", RM(ir), RN(ir) ); break;1.220 - case 1: snprintf( buf, len, "MOV.W [R%d], R%d", RM(ir), RN(ir) ); break;1.221 - case 2: snprintf( buf, len, "MOV.L [R%d], R%d", RM(ir), RN(ir) ); break;1.222 - case 3: snprintf( buf, len, "MOV R%d, R%d", RM(ir), RN(ir) ); break;1.223 - case 4: snprintf( buf, len, "MOV.B [R%d++], R%d", RM(ir), RN(ir) ); break;1.224 - case 5: snprintf( buf, len, "MOV.W [R%d++], R%d", RM(ir), RN(ir) ); break;1.225 - case 6: snprintf( buf, len, "MOV.L [R%d++], R%d", RM(ir), RN(ir) ); break;1.226 - case 7: snprintf( buf, len, "NOT R%d, R%d", RM(ir), RN(ir) ); break;1.227 - case 8: snprintf( buf, len, "SWAP.B R%d, R%d", RM(ir), RN(ir) ); break;1.228 - case 9: snprintf( buf, len, "SWAP.W R%d, R%d", RM(ir), RN(ir) ); break;1.229 - case 10:snprintf( buf, len, "NEGC R%d, R%d", RM(ir), RN(ir) ); break;1.230 - case 11:snprintf( buf, len, "NEG R%d, R%d", RM(ir), RN(ir) ); break;1.231 - case 12:snprintf( buf, len, "EXTU.B R%d, R%d", RM(ir), RN(ir) ); break;1.232 - case 13:snprintf( buf, len, "EXTU.W R%d, R%d", RM(ir), RN(ir) ); break;1.233 - case 14:snprintf( buf, len, "EXTS.B R%d, R%d", RM(ir), RN(ir) ); break;1.234 - case 15:snprintf( buf, len, "EXTS.W R%d, R%d", RM(ir), RN(ir) ); break;1.235 - }1.236 - break;1.237 - case 7: /* 0111nnnniiiiiiii */1.238 - snprintf( buf, len, "ADD #%d, R%d", SIGNEXT8(ir&0x00FF), RN(ir) ); break;1.239 - case 8: /* 1000xxxxxxxxxxxx */1.240 - switch( (ir&0x0F00) >> 8 ) {1.241 - case 0: snprintf( buf, len, "MOV.B R0, [R%d%+d]", RM(ir), DISP4(ir) ); break;1.242 - case 1: snprintf( buf, len, "MOV.W R0, [R%d%+d]", RM(ir), DISP4(ir)<<1 ); break;1.243 - case 4: snprintf( buf, len, "MOV.B [R%d%+d], R0", RM(ir), DISP4(ir) ); break;1.244 - case 5: snprintf( buf, len, "MOV.W [R%d%+d], R0", RM(ir), DISP4(ir)<<1 ); break;1.245 - case 8: snprintf( buf, len, "CMP/EQ #%d, R0", IMM8(ir) ); break;1.246 - case 9: snprintf( buf, len, "BT $%xh", (PCDISP8(ir)<<1)+pc+4 ); break;1.247 - case 11:snprintf( buf, len, "BF $%xh", (PCDISP8(ir)<<1)+pc+4 ); break;1.248 - case 13:snprintf( buf, len, "BT/S $%xh", (PCDISP8(ir)<<1)+pc+4 ); break;1.249 - case 15:snprintf( buf, len, "BF/S $%xh", (PCDISP8(ir)<<1)+pc+4 ); break;1.250 - default: UNIMP(ir);1.251 - }1.252 - break;1.253 - case 9: /* 1001xxxxxxxxxxxx */1.254 - snprintf( buf, len, "MOV.W [$%xh], R%-2d ; <- #%08x", (DISP8(ir)<<1)+pc+4, RN(ir),1.255 - sh4_read_word( (DISP8(ir)<<1)+pc+4 ) ); break;1.256 - case 10:/* 1010xxxxxxxxxxxx */1.257 - snprintf( buf, len, "BRA $%xh", (DISP12(ir)<<1)+pc+4 ); break;1.258 - case 11:/* 1011xxxxxxxxxxxx */1.259 - snprintf( buf, len, "BSR $%xh", (DISP12(ir)<<1)+pc+4 ); break;1.260 - case 12:/* 1100xxxxdddddddd */1.261 - switch( (ir&0x0F00)>>8 ) {1.262 - case 0: snprintf( buf, len, "MOV.B R0, [GBR%+d]", DISP8(ir) ); break;1.263 - case 1: snprintf( buf, len, "MOV.W R0, [GBR%+d]", DISP8(ir)<<1 ); break;1.264 - case 2: snprintf( buf, len, "MOV.L R0, [GBR%+d]", DISP8(ir)<<2 ); break;1.265 - case 3: snprintf( buf, len, "TRAPA #%d", UIMM8(ir) ); break;1.266 - case 4: snprintf( buf, len, "MOV.B [GBR%+d], R0", DISP8(ir) ); break;1.267 - case 5: snprintf( buf, len, "MOV.W [GBR%+d], R0", DISP8(ir)<<1 ); break;1.268 - case 6: snprintf( buf, len, "MOV.L [GBR%+d], R0", DISP8(ir)<<2 ); break;1.269 - case 7: snprintf( buf, len, "MOVA $%xh, R0", (DISP8(ir)<<2)+(pc&~3)+4 ); break;1.270 - case 8: snprintf( buf, len, "TST #%02Xh, R0", UIMM8(ir) ); break;1.271 - case 9: snprintf( buf, len, "AND #%02Xh, R0", UIMM8(ir) ); break;1.272 - case 10:snprintf( buf, len, "XOR #%02Xh, R0", UIMM8(ir) ); break;1.273 - case 11:snprintf( buf, len, "OR #%02Xh, R0", UIMM8(ir) ); break;1.274 - case 12:snprintf( buf, len, "TST.B #%02Xh, [R0+GBR]", UIMM8(ir) ); break;1.275 - case 13:snprintf( buf, len, "AND.B #%02Xh, [R0+GBR]", UIMM8(ir) ); break;1.276 - case 14:snprintf( buf, len, "XOR.B #%02Xh, [R0+GBR]", UIMM8(ir) ); break;1.277 - case 15:snprintf( buf, len, "OR.B #%02Xh, [R0+GBR]", UIMM8(ir) ); break;1.278 - }1.279 - break;1.280 - case 13:/* 1101xxxxxxxxxxxx */1.281 - snprintf( buf, len, "MOV.L [$%xh], R%-2d ; <- #%08x", (DISP8(ir)<<2)+(pc&~3)+4, RN(ir),1.282 - sh4_read_long( (DISP8(ir)<<2)+(pc&~3)+4 ) ); break;1.283 - case 14:/* 1110xxxxxxxxxxxx */1.284 - snprintf( buf, len, "MOV #%d, R%d", DISP8(ir), RN(ir)); break;1.285 - case 15:/* 1111xxxxxxxxxxxx */1.286 - switch( ir&0x000F ) {1.287 - case 0: snprintf( buf, len, "FADD FR%d, FR%d", RM(ir), RN(ir) ); break;1.288 - case 1: snprintf( buf, len, "FSUB FR%d, FR%d", RM(ir), RN(ir) ); break;1.289 - case 2: snprintf( buf, len, "FMUL FR%d, FR%d", RM(ir), RN(ir) ); break;1.290 - case 3: snprintf( buf, len, "FDIV FR%d, FR%d", RM(ir), RN(ir) ); break;1.291 - case 4: snprintf( buf, len, "FCMP/EQ FR%d, FR%d", RM(ir), RN(ir) ); break;1.292 - case 5: snprintf( buf, len, "FCMP/GT FR%d, FR%d", RM(ir), RN(ir) ); break;1.293 - case 6: snprintf( buf, len, "FMOV.S [R%d+R0], FR%d", RM(ir), RN(ir) ); break;1.294 - case 7: snprintf( buf, len, "FMOV.S FR%d, [R%d+R0]", RM(ir), RN(ir) ); break;1.295 - case 8: snprintf( buf, len, "FMOV.S [R%d], FR%d", RM(ir), RN(ir) ); break;1.296 - case 9: snprintf( buf, len, "FMOV.S [R%d++], FR%d", RM(ir), RN(ir) ); break;1.297 - case 10:snprintf( buf, len, "FMOV.S FR%d, [R%d]", RM(ir), RN(ir) ); break;1.298 - case 11:snprintf( buf, len, "FMOV.S FR%d, [--R%d]", RM(ir), RN(ir) ); break;1.299 - case 12:snprintf( buf, len, "FMOV FR%d, FR%d", RM(ir), RN(ir) ); break;1.300 - case 13:1.301 - switch( (ir&0x00F0) >> 4 ) {1.302 - case 0: snprintf( buf, len, "FSTS FPUL, FR%d", RN(ir) ); break;1.303 - case 1: snprintf( buf, len, "FLDS FR%d, FPUL", RN(ir) ); break;1.304 - case 2: snprintf( buf, len, "FLOAT FPUL, FR%d", RN(ir) ); break;1.305 - case 3: snprintf( buf, len, "FTRC FR%d, FPUL", RN(ir) ); break;1.306 - case 4: snprintf( buf, len, "FNEG FR%d", RN(ir) ); break;1.307 - case 5: snprintf( buf, len, "FABS FR%d", RN(ir) ); break;1.308 - case 6: snprintf( buf, len, "FSQRT FR%d", RN(ir) ); break;1.309 - case 7: snprintf( buf, len, "FSRRA FR%d", RN(ir) ); break;1.310 - case 8: snprintf( buf, len, "FLDI0 FR%d", RN(ir) ); break;1.311 - case 9: snprintf( buf, len, "FLDI1 FR%d", RN(ir) ); break;1.312 - case 10:snprintf( buf, len, "FCNVSD FPUL, DR%d", RN(ir)>>1 ); break;1.313 - case 11:snprintf( buf, len, "FCNVDS DR%d, FPUL", RN(ir)>>1 ); break;1.314 - case 14:snprintf( buf, len, "FIPR FV%d, FV%d", FVM(ir), FVN(ir) ); break;1.315 - case 15:1.316 - if( (ir & 0x0300) == 0x0100 )1.317 - snprintf( buf, len, "FTRV XMTRX,FV%d", FVN(ir) );1.318 - else if( (ir & 0x0100) == 0 )1.319 - snprintf( buf, len, "FSCA FPUL, DR%d", RN(ir) );1.320 - else if( ir == 0xFBFD )1.321 - snprintf( buf, len, "FRCHG " );1.322 - else if( ir == 0xF3FD )1.323 - snprintf( buf, len, "FSCHG " );1.324 - else UNIMP(ir);1.325 - break;1.326 - default: UNIMP(ir);1.327 - }1.328 - break;1.329 - case 14:snprintf( buf, len, "FMAC FR0, FR%d, FR%d", RM(ir), RN(ir) ); break;1.330 - default: UNIMP(ir);1.331 - }1.332 - break;1.333 - }1.334 + switch( (ir&0xF000) >> 12 ) {1.335 + case 0x0:1.336 + switch( ir&0xF ) {1.337 + case 0x2:1.338 + switch( (ir&0x80) >> 7 ) {1.339 + case 0x0:1.340 + switch( (ir&0x70) >> 4 ) {1.341 + case 0x0:1.342 + { /* STC SR, Rn */1.343 + uint32_t Rn = ((ir>>8)&0xF);1.344 + snprintf( buf, len, "STC SR, R%d", Rn );1.345 + }1.346 + break;1.347 + case 0x1:1.348 + { /* STC GBR, Rn */1.349 + uint32_t Rn = ((ir>>8)&0xF);1.350 + snprintf( buf, len, "STC GBR, R%d", Rn );1.351 + }1.352 + break;1.353 + case 0x2:1.354 + { /* STC VBR, Rn */1.355 + uint32_t Rn = ((ir>>8)&0xF);1.356 + snprintf( buf, len, "STC VBR, R%d", Rn );1.357 + }1.358 + break;1.359 + case 0x3:1.360 + { /* STC SSR, Rn */1.361 + uint32_t Rn = ((ir>>8)&0xF);1.362 + snprintf( buf, len, "STC SSR, R%d", Rn );1.363 + }1.364 + break;1.365 + case 0x4:1.366 + { /* STC SPC, Rn */1.367 + uint32_t Rn = ((ir>>8)&0xF);1.368 + snprintf( buf, len, "STC SPC, R%d", Rn );1.369 + }1.370 + break;1.371 + default:1.372 + UNDEF();1.373 + break;1.374 + }1.375 + break;1.376 + case 0x1:1.377 + { /* STC Rm_BANK, Rn */1.378 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);1.379 + snprintf( buf, len, "STC R%d_BANK, R%d", Rm_BANK, Rn );1.380 + }1.381 + break;1.382 + }1.383 + break;1.384 + case 0x3:1.385 + switch( (ir&0xF0) >> 4 ) {1.386 + case 0x0:1.387 + { /* BSRF Rn */1.388 + uint32_t Rn = ((ir>>8)&0xF);1.389 + snprintf( buf, len, "BSRF R%d", Rn );1.390 + }1.391 + break;1.392 + case 0x2:1.393 + { /* BRAF Rn */1.394 + uint32_t Rn = ((ir>>8)&0xF);1.395 + snprintf( buf, len, "BRAF R%d", Rn );1.396 + }1.397 + break;1.398 + case 0x8:1.399 + { /* PREF @Rn */1.400 + uint32_t Rn = ((ir>>8)&0xF);1.401 + snprintf( buf, len, "PREF R%d", Rn );1.402 + }1.403 + break;1.404 + case 0x9:1.405 + { /* OCBI @Rn */1.406 + uint32_t Rn = ((ir>>8)&0xF);1.407 + snprintf( buf, len, "OCBI @R%d", Rn );1.408 + }1.409 + break;1.410 + case 0xA:1.411 + { /* OCBP @Rn */1.412 + uint32_t Rn = ((ir>>8)&0xF);1.413 + snprintf( buf, len, "OCBP @R%d", Rn );1.414 + }1.415 + break;1.416 + case 0xB:1.417 + { /* OCBWB @Rn */1.418 + uint32_t Rn = ((ir>>8)&0xF);1.419 + snprintf( buf, len, "OCBWB @R%d", Rn );1.420 + }1.421 + break;1.422 + case 0xC:1.423 + { /* MOVCA.L R0, @Rn */1.424 + uint32_t Rn = ((ir>>8)&0xF);1.425 + snprintf( buf, len, "MOVCA.L R0, @R%d", Rn );1.426 + }1.427 + break;1.428 + default:1.429 + UNDEF();1.430 + break;1.431 + }1.432 + break;1.433 + case 0x4:1.434 + { /* MOV.B Rm, @(R0, Rn) */1.435 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.436 + snprintf( buf, len, "MOV.B R%d, @(R0, R%d)", Rm, Rn );1.437 + }1.438 + break;1.439 + case 0x5:1.440 + { /* MOV.W Rm, @(R0, Rn) */1.441 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.442 + snprintf( buf, len, "MOV.W R%d, @(R0, R%d)", Rm, Rn );1.443 + }1.444 + break;1.445 + case 0x6:1.446 + { /* MOV.L Rm, @(R0, Rn) */1.447 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.448 + snprintf( buf, len, "MOV.L R%d, @(R0, R%d)", Rm, Rn );1.449 + }1.450 + break;1.451 + case 0x7:1.452 + { /* MUL.L Rm, Rn */1.453 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.454 + snprintf( buf, len, "MUL.L R%d, R%d", Rm, Rn );1.455 + }1.456 + break;1.457 + case 0x8:1.458 + switch( (ir&0xFF0) >> 4 ) {1.459 + case 0x0:1.460 + { /* CLRT */1.461 + snprintf( buf, len, "CLRT " );1.462 + }1.463 + break;1.464 + case 0x1:1.465 + { /* SETT */1.466 + snprintf( buf, len, "SETT " );1.467 + }1.468 + break;1.469 + case 0x2:1.470 + { /* CLRMAC */1.471 + snprintf( buf, len, "CLRMAC " );1.472 + }1.473 + break;1.474 + case 0x3:1.475 + { /* LDTLB */1.476 + snprintf( buf, len, "LDTLB " );1.477 + }1.478 + break;1.479 + case 0x4:1.480 + { /* CLRS */1.481 + snprintf( buf, len, "CLRS " );1.482 + }1.483 + break;1.484 + case 0x5:1.485 + { /* SETS */1.486 + snprintf( buf, len, "SETS " );1.487 + }1.488 + break;1.489 + default:1.490 + UNDEF();1.491 + break;1.492 + }1.493 + break;1.494 + case 0x9:1.495 + switch( (ir&0xF0) >> 4 ) {1.496 + case 0x0:1.497 + { /* NOP */1.498 + snprintf( buf, len, "NOP " );1.499 + }1.500 + break;1.501 + case 0x1:1.502 + { /* DIV0U */1.503 + snprintf( buf, len, "DIV0U " );1.504 + }1.505 + break;1.506 + case 0x2:1.507 + { /* MOVT Rn */1.508 + uint32_t Rn = ((ir>>8)&0xF);1.509 + snprintf( buf, len, "MOVT R%d", Rn );1.510 + }1.511 + break;1.512 + default:1.513 + UNDEF();1.514 + break;1.515 + }1.516 + break;1.517 + case 0xA:1.518 + switch( (ir&0xF0) >> 4 ) {1.519 + case 0x0:1.520 + { /* STS MACH, Rn */1.521 + uint32_t Rn = ((ir>>8)&0xF);1.522 + snprintf( buf, len, "STS MACH, R%d", Rn );1.523 + }1.524 + break;1.525 + case 0x1:1.526 + { /* STS MACL, Rn */1.527 + uint32_t Rn = ((ir>>8)&0xF);1.528 + snprintf( buf, len, "STS MACL, R%d", Rn );1.529 + }1.530 + break;1.531 + case 0x2:1.532 + { /* STS PR, Rn */1.533 + uint32_t Rn = ((ir>>8)&0xF);1.534 + snprintf( buf, len, "STS PR, R%d", Rn );1.535 + }1.536 + break;1.537 + case 0x3:1.538 + { /* STC SGR, Rn */1.539 + uint32_t Rn = ((ir>>8)&0xF);1.540 + snprintf( buf, len, "STC SGR, R%d", Rn );1.541 + }1.542 + break;1.543 + case 0x5:1.544 + { /* STS FPUL, Rn */1.545 + uint32_t Rn = ((ir>>8)&0xF);1.546 + snprintf( buf, len, "STS FPUL, R%d", Rn );1.547 + }1.548 + break;1.549 + case 0x6:1.550 + { /* STS FPSCR, Rn */1.551 + uint32_t Rn = ((ir>>8)&0xF);1.552 + snprintf( buf, len, "STS FPSCR, R%d", Rn );1.553 + }1.554 + break;1.555 + case 0xF:1.556 + { /* STC DBR, Rn */1.557 + uint32_t Rn = ((ir>>8)&0xF);1.558 + snprintf( buf, len, "STC DBR, R%d", Rn );1.559 + }1.560 + break;1.561 + default:1.562 + UNDEF();1.563 + break;1.564 + }1.565 + break;1.566 + case 0xB:1.567 + switch( (ir&0xFF0) >> 4 ) {1.568 + case 0x0:1.569 + { /* RTS */1.570 + snprintf( buf, len, "RTS " );1.571 + }1.572 + break;1.573 + case 0x1:1.574 + { /* SLEEP */1.575 + snprintf( buf, len, "SLEEP " );1.576 + }1.577 + break;1.578 + case 0x2:1.579 + { /* RTE */1.580 + snprintf( buf, len, "RTE " );1.581 + }1.582 + break;1.583 + default:1.584 + UNDEF();1.585 + break;1.586 + }1.587 + break;1.588 + case 0xC:1.589 + { /* MOV.B @(R0, Rm), Rn */1.590 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.591 + snprintf( buf, len, "MOV.B @(R0, R%d), R%d", Rm, Rn );1.592 + }1.593 + break;1.594 + case 0xD:1.595 + { /* MOV.W @(R0, Rm), Rn */1.596 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.597 + snprintf( buf, len, "MOV.W @(R0, R%d), R%d", Rm, Rn );1.598 + }1.599 + break;1.600 + case 0xE:1.601 + { /* MOV.L @(R0, Rm), Rn */1.602 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.603 + snprintf( buf, len, "MOV.L @(R0, R%d), R%d", Rm, Rn );1.604 + }1.605 + break;1.606 + case 0xF:1.607 + { /* MAC.L @Rm+, @Rn+ */1.608 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.609 + snprintf( buf, len, "MAC.L @R%d+, @R%d+", Rm, Rn );1.610 + }1.611 + break;1.612 + default:1.613 + UNDEF();1.614 + break;1.615 + }1.616 + break;1.617 + case 0x1:1.618 + { /* MOV.L Rm, @(disp, Rn) */1.619 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;1.620 + snprintf( buf, len, "MOV.L R%d, @(%d, R%d)", Rm, disp, Rn );1.621 + }1.622 + break;1.623 + case 0x2:1.624 + switch( ir&0xF ) {1.625 + case 0x0:1.626 + { /* MOV.B Rm, @Rn */1.627 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.628 + snprintf( buf, len, "MOV.B R%d, @R%d", Rm, Rn );1.629 + }1.630 + break;1.631 + case 0x1:1.632 + { /* MOV.W Rm, @Rn */1.633 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.634 + snprintf( buf, len, "MOV.W R%d, @R%d", Rm, Rn );1.635 + }1.636 + break;1.637 + case 0x2:1.638 + { /* MOV.L Rm, @Rn */1.639 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.640 + snprintf( buf, len, "MOV.L R%d, @R%d", Rm, Rn );1.641 + }1.642 + break;1.643 + case 0x4:1.644 + { /* MOV.B Rm, @-Rn */1.645 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.646 + snprintf( buf, len, "MOV.B R%d, @-R%d", Rm, Rn );1.647 + }1.648 + break;1.649 + case 0x5:1.650 + { /* MOV.W Rm, @-Rn */1.651 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.652 + snprintf( buf, len, "MOV.W R%d, @-R%d", Rm, Rn );1.653 + }1.654 + break;1.655 + case 0x6:1.656 + { /* MOV.L Rm, @-Rn */1.657 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.658 + snprintf( buf, len, "MOV.L R%d, @-R%d", Rm, Rn );1.659 + }1.660 + break;1.661 + case 0x7:1.662 + { /* DIV0S Rm, Rn */1.663 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.664 + snprintf( buf, len, "DIV0S R%d, R%d", Rm, Rn );1.665 + }1.666 + break;1.667 + case 0x8:1.668 + { /* TST Rm, Rn */1.669 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.670 + snprintf( buf, len, "TST R%d, R%d", Rm, Rn );1.671 + }1.672 + break;1.673 + case 0x9:1.674 + { /* AND Rm, Rn */1.675 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.676 + snprintf( buf, len, "AND R%d, R%d", Rm, Rn );1.677 + }1.678 + break;1.679 + case 0xA:1.680 + { /* XOR Rm, Rn */1.681 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.682 + snprintf( buf, len, "XOR R%d, R%d", Rm, Rn );1.683 + }1.684 + break;1.685 + case 0xB:1.686 + { /* OR Rm, Rn */1.687 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.688 + snprintf( buf, len, "OR R%d, R%d", Rm, Rn );1.689 + }1.690 + break;1.691 + case 0xC:1.692 + { /* CMP/STR Rm, Rn */1.693 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.694 + snprintf( buf, len, "CMP/STR R%d, R%d", Rm, Rn );1.695 + }1.696 + break;1.697 + case 0xD:1.698 + { /* XTRCT Rm, Rn */1.699 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.700 + snprintf( buf, len, "XTRCT R%d, R%d", Rm, Rn );1.701 + }1.702 + break;1.703 + case 0xE:1.704 + { /* MULU.W Rm, Rn */1.705 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.706 + snprintf( buf, len, "MULU.W R%d, R%d", Rm, Rn );1.707 + }1.708 + break;1.709 + case 0xF:1.710 + { /* MULS.W Rm, Rn */1.711 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.712 + snprintf( buf, len, "MULS.W R%d, R%d", Rm, Rn );1.713 + }1.714 + break;1.715 + default:1.716 + UNDEF();1.717 + break;1.718 + }1.719 + break;1.720 + case 0x3:1.721 + switch( ir&0xF ) {1.722 + case 0x0:1.723 + { /* CMP/EQ Rm, Rn */1.724 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.725 + snprintf( buf, len, "CMP/EQ R%d, R%d", Rm, Rn );1.726 + }1.727 + break;1.728 + case 0x2:1.729 + { /* CMP/HS Rm, Rn */1.730 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.731 + snprintf( buf, len, "CMP/HS R%d, R%d", Rm, Rn );1.732 + }1.733 + break;1.734 + case 0x3:1.735 + { /* CMP/GE Rm, Rn */1.736 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.737 + snprintf( buf, len, "CMP/GE R%d, R%d", Rm, Rn );1.738 + }1.739 + break;1.740 + case 0x4:1.741 + { /* DIV1 Rm, Rn */1.742 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.743 + snprintf( buf, len, "DIV1 R%d, R%d", Rm, Rn );1.744 + }1.745 + break;1.746 + case 0x5:1.747 + { /* DMULU.L Rm, Rn */1.748 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.749 + snprintf( buf, len, "DMULU.L R%d, R%d", Rm, Rn );1.750 + }1.751 + break;1.752 + case 0x6:1.753 + { /* CMP/HI Rm, Rn */1.754 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.755 + snprintf( buf, len, "CMP/HI R%d, R%d", Rm, Rn );1.756 + }1.757 + break;1.758 + case 0x7:1.759 + { /* CMP/GT Rm, Rn */1.760 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.761 + snprintf( buf, len, "CMP/GT R%d, R%d", Rm, Rn );1.762 + }1.763 + break;1.764 + case 0x8:1.765 + { /* SUB Rm, Rn */1.766 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.767 + snprintf( buf, len, "SUB R%d, R%d", Rm, Rn );1.768 + }1.769 + break;1.770 + case 0xA:1.771 + { /* SUBC Rm, Rn */1.772 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.773 + snprintf( buf, len, "SUBC R%d, R%d", Rm, Rn );1.774 + }1.775 + break;1.776 + case 0xB:1.777 + { /* SUBV Rm, Rn */1.778 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.779 + snprintf( buf, len, "SUBV R%d, R%d", Rm, Rn );1.780 + }1.781 + break;1.782 + case 0xC:1.783 + { /* ADD Rm, Rn */1.784 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.785 + snprintf( buf, len, "ADD R%d, R%d", Rm, Rn );1.786 + }1.787 + break;1.788 + case 0xD:1.789 + { /* DMULS.L Rm, Rn */1.790 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.791 + snprintf( buf, len, "DMULS.L R%d, R%d", Rm, Rn );1.792 + }1.793 + break;1.794 + case 0xE:1.795 + { /* ADDC Rm, Rn */1.796 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.797 + snprintf( buf, len, "ADDC R%d, R%d", Rm, Rn );1.798 + }1.799 + break;1.800 + case 0xF:1.801 + { /* ADDV Rm, Rn */1.802 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.803 + snprintf( buf, len, "ADDV R%d, R%d", Rm, Rn );1.804 + }1.805 + break;1.806 + default:1.807 + UNDEF();1.808 + break;1.809 + }1.810 + break;1.811 + case 0x4:1.812 + switch( ir&0xF ) {1.813 + case 0x0:1.814 + switch( (ir&0xF0) >> 4 ) {1.815 + case 0x0:1.816 + { /* SHLL Rn */1.817 + uint32_t Rn = ((ir>>8)&0xF);1.818 + snprintf( buf, len, "SHLL R%d", Rn );1.819 + }1.820 + break;1.821 + case 0x1:1.822 + { /* DT Rn */1.823 + uint32_t Rn = ((ir>>8)&0xF);1.824 + snprintf( buf, len, "DT R%d", Rn );1.825 + }1.826 + break;1.827 + case 0x2:1.828 + { /* SHAL Rn */1.829 + uint32_t Rn = ((ir>>8)&0xF);1.830 + snprintf( buf, len, "SHAL R%d", Rn );1.831 + }1.832 + break;1.833 + default:1.834 + UNDEF();1.835 + break;1.836 + }1.837 + break;1.838 + case 0x1:1.839 + switch( (ir&0xF0) >> 4 ) {1.840 + case 0x0:1.841 + { /* SHLR Rn */1.842 + uint32_t Rn = ((ir>>8)&0xF);1.843 + snprintf( buf, len, "SHLR R%d", Rn );1.844 + }1.845 + break;1.846 + case 0x1:1.847 + { /* CMP/PZ Rn */1.848 + uint32_t Rn = ((ir>>8)&0xF);1.849 + snprintf( buf, len, "CMP/PZ R%d", Rn );1.850 + }1.851 + break;1.852 + case 0x2:1.853 + { /* SHAR Rn */1.854 + uint32_t Rn = ((ir>>8)&0xF);1.855 + snprintf( buf, len, "SHAR R%d", Rn );1.856 + }1.857 + break;1.858 + default:1.859 + UNDEF();1.860 + break;1.861 + }1.862 + break;1.863 + case 0x2:1.864 + switch( (ir&0xF0) >> 4 ) {1.865 + case 0x0:1.866 + { /* STS.L MACH, @-Rn */1.867 + uint32_t Rn = ((ir>>8)&0xF);1.868 + snprintf( buf, len, "STS.L MACH, @-R%d", Rn );1.869 + }1.870 + break;1.871 + case 0x1:1.872 + { /* STS.L MACL, @-Rn */1.873 + uint32_t Rn = ((ir>>8)&0xF);1.874 + snprintf( buf, len, "STS.L MACL, @-R%d", Rn );1.875 + }1.876 + break;1.877 + case 0x2:1.878 + { /* STS.L PR, @-Rn */1.879 + uint32_t Rn = ((ir>>8)&0xF);1.880 + snprintf( buf, len, "STS.L PR, @-R%d", Rn );1.881 + }1.882 + break;1.883 + case 0x3:1.884 + { /* STC.L SGR, @-Rn */1.885 + uint32_t Rn = ((ir>>8)&0xF);1.886 + snprintf( buf, len, "STC.L SGR, @-R%d", Rn );1.887 + }1.888 + break;1.889 + case 0x5:1.890 + { /* STS.L FPUL, @-Rn */1.891 + uint32_t Rn = ((ir>>8)&0xF);1.892 + snprintf( buf, len, "STS.L FPUL, @-R%d", Rn );1.893 + }1.894 + break;1.895 + case 0x6:1.896 + { /* STS.L FPSCR, @-Rn */1.897 + uint32_t Rn = ((ir>>8)&0xF);1.898 + snprintf( buf, len, "STS.L FPSCR, @-R%d", Rn );1.899 + }1.900 + break;1.901 + case 0xF:1.902 + { /* STC.L DBR, @-Rn */1.903 + uint32_t Rn = ((ir>>8)&0xF);1.904 + snprintf( buf, len, "STC.L DBR, @-R%d", Rn );1.905 + }1.906 + break;1.907 + default:1.908 + UNDEF();1.909 + break;1.910 + }1.911 + break;1.912 + case 0x3:1.913 + switch( (ir&0x80) >> 7 ) {1.914 + case 0x0:1.915 + switch( (ir&0x70) >> 4 ) {1.916 + case 0x0:1.917 + { /* STC.L SR, @-Rn */1.918 + uint32_t Rn = ((ir>>8)&0xF);1.919 + snprintf( buf, len, "STC.L SR, @-R%d", Rn );1.920 + }1.921 + break;1.922 + case 0x1:1.923 + { /* STC.L GBR, @-Rn */1.924 + uint32_t Rn = ((ir>>8)&0xF);1.925 + snprintf( buf, len, "STC.L GBR, @-R%d", Rn );1.926 + }1.927 + break;1.928 + case 0x2:1.929 + { /* STC.L VBR, @-Rn */1.930 + uint32_t Rn = ((ir>>8)&0xF);1.931 + snprintf( buf, len, "STC.L VBR, @-R%d", Rn );1.932 + }1.933 + break;1.934 + case 0x3:1.935 + { /* STC.L SSR, @-Rn */1.936 + uint32_t Rn = ((ir>>8)&0xF);1.937 + snprintf( buf, len, "STC.L SSR, @-R%d", Rn );1.938 + }1.939 + break;1.940 + case 0x4:1.941 + { /* STC.L SPC, @-Rn */1.942 + uint32_t Rn = ((ir>>8)&0xF);1.943 + snprintf( buf, len, "STC.L SPC, @-R%d", Rn );1.944 + }1.945 + break;1.946 + default:1.947 + UNDEF();1.948 + break;1.949 + }1.950 + break;1.951 + case 0x1:1.952 + { /* STC.L Rm_BANK, @-Rn */1.953 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm_BANK = ((ir>>4)&0x7);1.954 + snprintf( buf, len, "STC.L @-R%d_BANK, @-R%d", Rm_BANK, Rn );1.955 + }1.956 + break;1.957 + }1.958 + break;1.959 + case 0x4:1.960 + switch( (ir&0xF0) >> 4 ) {1.961 + case 0x0:1.962 + { /* ROTL Rn */1.963 + uint32_t Rn = ((ir>>8)&0xF);1.964 + snprintf( buf, len, "ROTL R%d", Rn );1.965 + }1.966 + break;1.967 + case 0x2:1.968 + { /* ROTCL Rn */1.969 + uint32_t Rn = ((ir>>8)&0xF);1.970 + snprintf( buf, len, "ROTCL R%d", Rn );1.971 + }1.972 + break;1.973 + default:1.974 + UNDEF();1.975 + break;1.976 + }1.977 + break;1.978 + case 0x5:1.979 + switch( (ir&0xF0) >> 4 ) {1.980 + case 0x0:1.981 + { /* ROTR Rn */1.982 + uint32_t Rn = ((ir>>8)&0xF);1.983 + snprintf( buf, len, "ROTR R%d", Rn );1.984 + }1.985 + break;1.986 + case 0x1:1.987 + { /* CMP/PL Rn */1.988 + uint32_t Rn = ((ir>>8)&0xF);1.989 + snprintf( buf, len, "CMP/PL R%d", Rn );1.990 + }1.991 + break;1.992 + case 0x2:1.993 + { /* ROTCR Rn */1.994 + uint32_t Rn = ((ir>>8)&0xF);1.995 + snprintf( buf, len, "ROTCR R%d", Rn );1.996 + }1.997 + break;1.998 + default:1.999 + UNDEF();1.1000 + break;1.1001 + }1.1002 + break;1.1003 + case 0x6:1.1004 + switch( (ir&0xF0) >> 4 ) {1.1005 + case 0x0:1.1006 + { /* LDS.L @Rm+, MACH */1.1007 + uint32_t Rm = ((ir>>8)&0xF);1.1008 + snprintf( buf, len, "LDS.L @R%d+, MACH", Rm );1.1009 + }1.1010 + break;1.1011 + case 0x1:1.1012 + { /* LDS.L @Rm+, MACL */1.1013 + uint32_t Rm = ((ir>>8)&0xF);1.1014 + snprintf( buf, len, "LDS.L @R%d+, MACL", Rm );1.1015 + }1.1016 + break;1.1017 + case 0x2:1.1018 + { /* LDS.L @Rm+, PR */1.1019 + uint32_t Rm = ((ir>>8)&0xF);1.1020 + snprintf( buf, len, "LDS.L @R%d+, PR", Rm );1.1021 + }1.1022 + break;1.1023 + case 0x3:1.1024 + { /* LDC.L @Rm+, SGR */1.1025 + uint32_t Rm = ((ir>>8)&0xF);1.1026 + snprintf( buf, len, "LDC.L @R%d+, SGR", Rm );1.1027 + }1.1028 + break;1.1029 + case 0x5:1.1030 + { /* LDS.L @Rm+, FPUL */1.1031 + uint32_t Rm = ((ir>>8)&0xF);1.1032 + snprintf( buf, len, "LDS.L @R%d+, FPUL", Rm );1.1033 + }1.1034 + break;1.1035 + case 0x6:1.1036 + { /* LDS.L @Rm+, FPSCR */1.1037 + uint32_t Rm = ((ir>>8)&0xF);1.1038 + snprintf( buf, len, "LDS.L @R%d+, FPSCR", Rm );1.1039 + }1.1040 + break;1.1041 + case 0xF:1.1042 + { /* LDC.L @Rm+, DBR */1.1043 + uint32_t Rm = ((ir>>8)&0xF);1.1044 + snprintf( buf, len, "LDC.L @R%d+, DBR", Rm );1.1045 + }1.1046 + break;1.1047 + default:1.1048 + UNDEF();1.1049 + break;1.1050 + }1.1051 + break;1.1052 + case 0x7:1.1053 + switch( (ir&0x80) >> 7 ) {1.1054 + case 0x0:1.1055 + switch( (ir&0x70) >> 4 ) {1.1056 + case 0x0:1.1057 + { /* LDC.L @Rm+, SR */1.1058 + uint32_t Rm = ((ir>>8)&0xF);1.1059 + snprintf( buf, len, "LDC.L @R%d+, SR", Rm );1.1060 + }1.1061 + break;1.1062 + case 0x1:1.1063 + { /* LDC.L @Rm+, GBR */1.1064 + uint32_t Rm = ((ir>>8)&0xF);1.1065 + snprintf( buf, len, "LDC.L @R%d+, GBR", Rm );1.1066 + }1.1067 + break;1.1068 + case 0x2:1.1069 + { /* LDC.L @Rm+, VBR */1.1070 + uint32_t Rm = ((ir>>8)&0xF);1.1071 + snprintf( buf, len, "LDC.L @R%d+, VBR", Rm );1.1072 + }1.1073 + break;1.1074 + case 0x3:1.1075 + { /* LDC.L @Rm+, SSR */1.1076 + uint32_t Rm = ((ir>>8)&0xF);1.1077 + snprintf( buf, len, "LDC.L @R%d+, SSR", Rm );1.1078 + }1.1079 + break;1.1080 + case 0x4:1.1081 + { /* LDC.L @Rm+, SPC */1.1082 + uint32_t Rm = ((ir>>8)&0xF);1.1083 + snprintf( buf, len, "LDC.L @R%d+, SPC", Rm );1.1084 + }1.1085 + break;1.1086 + default:1.1087 + UNDEF();1.1088 + break;1.1089 + }1.1090 + break;1.1091 + case 0x1:1.1092 + { /* LDC.L @Rm+, Rn_BANK */1.1093 + uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);1.1094 + snprintf( buf, len, "LDC.L @R%d+, @R%d+_BANK", Rm, Rn_BANK );1.1095 + }1.1096 + break;1.1097 + }1.1098 + break;1.1099 + case 0x8:1.1100 + switch( (ir&0xF0) >> 4 ) {1.1101 + case 0x0:1.1102 + { /* SHLL2 Rn */1.1103 + uint32_t Rn = ((ir>>8)&0xF);1.1104 + snprintf( buf, len, "SHLL2 R%d", Rn );1.1105 + }1.1106 + break;1.1107 + case 0x1:1.1108 + { /* SHLL8 Rn */1.1109 + uint32_t Rn = ((ir>>8)&0xF);1.1110 + snprintf( buf, len, "SHLL8 R%d", Rn );1.1111 + }1.1112 + break;1.1113 + case 0x2:1.1114 + { /* SHLL16 Rn */1.1115 + uint32_t Rn = ((ir>>8)&0xF);1.1116 + snprintf( buf, len, "SHLL16 R%d", Rn );1.1117 + }1.1118 + break;1.1119 + default:1.1120 + UNDEF();1.1121 + break;1.1122 + }1.1123 + break;1.1124 + case 0x9:1.1125 + switch( (ir&0xF0) >> 4 ) {1.1126 + case 0x0:1.1127 + { /* SHLR2 Rn */1.1128 + uint32_t Rn = ((ir>>8)&0xF);1.1129 + snprintf( buf, len, "SHLR2 R%d", Rn );1.1130 + }1.1131 + break;1.1132 + case 0x1:1.1133 + { /* SHLR8 Rn */1.1134 + uint32_t Rn = ((ir>>8)&0xF);1.1135 + snprintf( buf, len, "SHLR8 R%d", Rn );1.1136 + }1.1137 + break;1.1138 + case 0x2:1.1139 + { /* SHLR16 Rn */1.1140 + uint32_t Rn = ((ir>>8)&0xF);1.1141 + snprintf( buf, len, "SHLR16 R%d", Rn );1.1142 + }1.1143 + break;1.1144 + default:1.1145 + UNDEF();1.1146 + break;1.1147 + }1.1148 + break;1.1149 + case 0xA:1.1150 + switch( (ir&0xF0) >> 4 ) {1.1151 + case 0x0:1.1152 + { /* LDS Rm, MACH */1.1153 + uint32_t Rm = ((ir>>8)&0xF);1.1154 + snprintf( buf, len, "LDS R%d, MACH", Rm );1.1155 + }1.1156 + break;1.1157 + case 0x1:1.1158 + { /* LDS Rm, MACL */1.1159 + uint32_t Rm = ((ir>>8)&0xF);1.1160 + snprintf( buf, len, "LDS R%d, MACL", Rm );1.1161 + }1.1162 + break;1.1163 + case 0x2:1.1164 + { /* LDS Rm, PR */1.1165 + uint32_t Rm = ((ir>>8)&0xF);1.1166 + snprintf( buf, len, "LDS R%d, PR", Rm );1.1167 + }1.1168 + break;1.1169 + case 0x3:1.1170 + { /* LDC Rm, SGR */1.1171 + uint32_t Rm = ((ir>>8)&0xF);1.1172 + snprintf( buf, len, "LDC R%d, SGR", Rm );1.1173 + }1.1174 + break;1.1175 + case 0x5:1.1176 + { /* LDS Rm, FPUL */1.1177 + uint32_t Rm = ((ir>>8)&0xF);1.1178 + snprintf( buf, len, "LDS R%d, FPUL", Rm );1.1179 + }1.1180 + break;1.1181 + case 0x6:1.1182 + { /* LDS Rm, FPSCR */1.1183 + uint32_t Rm = ((ir>>8)&0xF);1.1184 + snprintf( buf, len, "LDS R%d, FPSCR", Rm );1.1185 + }1.1186 + break;1.1187 + case 0xF:1.1188 + { /* LDC Rm, DBR */1.1189 + uint32_t Rm = ((ir>>8)&0xF);1.1190 + snprintf( buf, len, "LDC R%d, DBR", Rm );1.1191 + }1.1192 + break;1.1193 + default:1.1194 + UNDEF();1.1195 + break;1.1196 + }1.1197 + break;1.1198 + case 0xB:1.1199 + switch( (ir&0xF0) >> 4 ) {1.1200 + case 0x0:1.1201 + { /* JSR @Rn */1.1202 + uint32_t Rn = ((ir>>8)&0xF);1.1203 + snprintf( buf, len, "JSR @R%d", Rn );1.1204 + }1.1205 + break;1.1206 + case 0x1:1.1207 + { /* TAS.B @Rn */1.1208 + uint32_t Rn = ((ir>>8)&0xF);1.1209 + snprintf( buf, len, "TAS.B R%d", Rn );1.1210 + }1.1211 + break;1.1212 + case 0x2:1.1213 + { /* JMP @Rn */1.1214 + uint32_t Rn = ((ir>>8)&0xF);1.1215 + snprintf( buf, len, "JMP @R%d", Rn );1.1216 + }1.1217 + break;1.1218 + default:1.1219 + UNDEF();1.1220 + break;1.1221 + }1.1222 + break;1.1223 + case 0xC:1.1224 + { /* SHAD Rm, Rn */1.1225 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1226 + snprintf( buf, len, "SHAD R%d, R%d", Rm, Rn );1.1227 + }1.1228 + break;1.1229 + case 0xD:1.1230 + { /* SHLD Rm, Rn */1.1231 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1232 + snprintf( buf, len, "SHLD R%d, R%d", Rm, Rn );1.1233 + }1.1234 + break;1.1235 + case 0xE:1.1236 + switch( (ir&0x80) >> 7 ) {1.1237 + case 0x0:1.1238 + switch( (ir&0x70) >> 4 ) {1.1239 + case 0x0:1.1240 + { /* LDC Rm, SR */1.1241 + uint32_t Rm = ((ir>>8)&0xF);1.1242 + snprintf( buf, len, "LDC R%d, SR", Rm );1.1243 + }1.1244 + break;1.1245 + case 0x1:1.1246 + { /* LDC Rm, GBR */1.1247 + uint32_t Rm = ((ir>>8)&0xF);1.1248 + snprintf( buf, len, "LDC R%d, GBR", Rm );1.1249 + }1.1250 + break;1.1251 + case 0x2:1.1252 + { /* LDC Rm, VBR */1.1253 + uint32_t Rm = ((ir>>8)&0xF);1.1254 + snprintf( buf, len, "LDC R%d, VBR", Rm );1.1255 + }1.1256 + break;1.1257 + case 0x3:1.1258 + { /* LDC Rm, SSR */1.1259 + uint32_t Rm = ((ir>>8)&0xF);1.1260 + snprintf( buf, len, "LDC R%d, SSR", Rm );1.1261 + }1.1262 + break;1.1263 + case 0x4:1.1264 + { /* LDC Rm, SPC */1.1265 + uint32_t Rm = ((ir>>8)&0xF);1.1266 + snprintf( buf, len, "LDC R%d, SPC", Rm );1.1267 + }1.1268 + break;1.1269 + default:1.1270 + UNDEF();1.1271 + break;1.1272 + }1.1273 + break;1.1274 + case 0x1:1.1275 + { /* LDC Rm, Rn_BANK */1.1276 + uint32_t Rm = ((ir>>8)&0xF); uint32_t Rn_BANK = ((ir>>4)&0x7);1.1277 + snprintf( buf, len, "LDC R%d, R%d_BANK", Rm, Rn_BANK );1.1278 + }1.1279 + break;1.1280 + }1.1281 + break;1.1282 + case 0xF:1.1283 + { /* MAC.W @Rm+, @Rn+ */1.1284 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1285 + snprintf( buf, len, "MAC.W @R%d+, @R%d+", Rm, Rn );1.1286 + }1.1287 + break;1.1288 + }1.1289 + break;1.1290 + case 0x5:1.1291 + { /* MOV.L @(disp, Rm), Rn */1.1292 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<2;1.1293 + snprintf( buf, len, "MOV.L @(%d, R%d), @R%d", disp, Rm, Rn );1.1294 + }1.1295 + break;1.1296 + case 0x6:1.1297 + switch( ir&0xF ) {1.1298 + case 0x0:1.1299 + { /* MOV.B @Rm, Rn */1.1300 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1301 + snprintf( buf, len, "MOV.B @R%d, R%d", Rm, Rn );1.1302 + }1.1303 + break;1.1304 + case 0x1:1.1305 + { /* MOV.W @Rm, Rn */1.1306 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1307 + snprintf( buf, len, "MOV.W @R%d, R%d", Rm, Rn );1.1308 + }1.1309 + break;1.1310 + case 0x2:1.1311 + { /* MOV.L @Rm, Rn */1.1312 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1313 + snprintf( buf, len, "MOV.L @R%d, R%d", Rm, Rn );1.1314 + }1.1315 + break;1.1316 + case 0x3:1.1317 + { /* MOV Rm, Rn */1.1318 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1319 + snprintf( buf, len, "MOV R%d, R%d", Rm, Rn );1.1320 + }1.1321 + break;1.1322 + case 0x4:1.1323 + { /* MOV.B @Rm+, Rn */1.1324 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1325 + snprintf( buf, len, "MOV.B @R%d+, R%d", Rm, Rn );1.1326 + }1.1327 + break;1.1328 + case 0x5:1.1329 + { /* MOV.W @Rm+, Rn */1.1330 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1331 + snprintf( buf, len, "MOV.W @R%d+, R%d", Rm, Rn );1.1332 + }1.1333 + break;1.1334 + case 0x6:1.1335 + { /* MOV.L @Rm+, Rn */1.1336 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1337 + snprintf( buf, len, "MOV.L @R%d+, R%d", Rm, Rn );1.1338 + }1.1339 + break;1.1340 + case 0x7:1.1341 + { /* NOT Rm, Rn */1.1342 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1343 + snprintf( buf, len, "NOT R%d, R%d", Rm, Rn );1.1344 + }1.1345 + break;1.1346 + case 0x8:1.1347 + { /* SWAP.B Rm, Rn */1.1348 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1349 + snprintf( buf, len, "SWAP.B R%d, R%d", Rm, Rn );1.1350 + }1.1351 + break;1.1352 + case 0x9:1.1353 + { /* SWAP.W Rm, Rn */1.1354 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1355 + snprintf( buf, len, "SWAP.W R%d, R%d", Rm, Rn );1.1356 + }1.1357 + break;1.1358 + case 0xA:1.1359 + { /* NEGC Rm, Rn */1.1360 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1361 + snprintf( buf, len, "NEGC R%d, R%d", Rm, Rn );1.1362 + }1.1363 + break;1.1364 + case 0xB:1.1365 + { /* NEG Rm, Rn */1.1366 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1367 + snprintf( buf, len, "NEG R%d, R%d", Rm, Rn );1.1368 + }1.1369 + break;1.1370 + case 0xC:1.1371 + { /* EXTU.B Rm, Rn */1.1372 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1373 + snprintf( buf, len, "EXTU.B R%d, R%d", Rm, Rn );1.1374 + }1.1375 + break;1.1376 + case 0xD:1.1377 + { /* EXTU.W Rm, Rn */1.1378 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1379 + snprintf( buf, len, "EXTU.W R%d, R%d", Rm, Rn );1.1380 + }1.1381 + break;1.1382 + case 0xE:1.1383 + { /* EXTS.B Rm, Rn */1.1384 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1385 + snprintf( buf, len, "EXTS.B R%d, R%d", Rm, Rn );1.1386 + }1.1387 + break;1.1388 + case 0xF:1.1389 + { /* EXTS.W Rm, Rn */1.1390 + uint32_t Rn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1391 + snprintf( buf, len, "EXTS.W R%d, R%d", Rm, Rn );1.1392 + }1.1393 + break;1.1394 + }1.1395 + break;1.1396 + case 0x7:1.1397 + { /* ADD #imm, Rn */1.1398 + uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);1.1399 + snprintf( buf, len, "ADD #%d, R%d", imm, Rn );1.1400 + }1.1401 + break;1.1402 + case 0x8:1.1403 + switch( (ir&0xF00) >> 8 ) {1.1404 + case 0x0:1.1405 + { /* MOV.B R0, @(disp, Rn) */1.1406 + uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);1.1407 + snprintf( buf, len, "MOV.B R0, @(%d, R%d)", disp, Rn );1.1408 + }1.1409 + break;1.1410 + case 0x1:1.1411 + { /* MOV.W R0, @(disp, Rn) */1.1412 + uint32_t Rn = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;1.1413 + snprintf( buf, len, "MOV.W R0, @(%d, Rn)", disp, Rn );1.1414 + }1.1415 + break;1.1416 + case 0x4:1.1417 + { /* MOV.B @(disp, Rm), R0 */1.1418 + uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF);1.1419 + snprintf( buf, len, "MOV.B @(%d, R%d), R0", disp, Rm );1.1420 + }1.1421 + break;1.1422 + case 0x5:1.1423 + { /* MOV.W @(disp, Rm), R0 */1.1424 + uint32_t Rm = ((ir>>4)&0xF); uint32_t disp = (ir&0xF)<<1;1.1425 + snprintf( buf, len, "MOV.W @(%d, R%d), R0", disp, Rm );1.1426 + }1.1427 + break;1.1428 + case 0x8:1.1429 + { /* CMP/EQ #imm, R0 */1.1430 + int32_t imm = SIGNEXT8(ir&0xFF);1.1431 + snprintf( buf, len, "CMP/EQ #%d, R0", imm );1.1432 + }1.1433 + break;1.1434 + case 0x9:1.1435 + { /* BT disp */1.1436 + int32_t disp = SIGNEXT8(ir&0xFF)<<1;1.1437 + snprintf( buf, len, "BT $%xh", disp+pc+4 );1.1438 + }1.1439 + break;1.1440 + case 0xB:1.1441 + { /* BF disp */1.1442 + int32_t disp = SIGNEXT8(ir&0xFF)<<1;1.1443 + snprintf( buf, len, "BF $%xh", disp+pc+4 );1.1444 + }1.1445 + break;1.1446 + case 0xD:1.1447 + { /* BT/S disp */1.1448 + int32_t disp = SIGNEXT8(ir&0xFF)<<1;1.1449 + snprintf( buf, len, "BT/S $%xh", disp+pc+4 );1.1450 + }1.1451 + break;1.1452 + case 0xF:1.1453 + { /* BF/S disp */1.1454 + int32_t disp = SIGNEXT8(ir&0xFF)<<1;1.1455 + snprintf( buf, len, "BF/S $%xh", disp+pc+4 );1.1456 + }1.1457 + break;1.1458 + default:1.1459 + UNDEF();1.1460 + break;1.1461 + }1.1462 + break;1.1463 + case 0x9:1.1464 + { /* MOV.W @(disp, PC), Rn */1.1465 + uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1;1.1466 + snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+pc+4) );1.1467 + }1.1468 + break;1.1469 + case 0xA:1.1470 + { /* BRA disp */1.1471 + int32_t disp = SIGNEXT12(ir&0xFFF)<<1;1.1472 + snprintf( buf, len, "BRA $%xh", disp+pc+4 );1.1473 + }1.1474 + break;1.1475 + case 0xB:1.1476 + { /* BSR disp */1.1477 + int32_t disp = SIGNEXT12(ir&0xFFF)<<1;1.1478 + snprintf( buf, len, "BSR $%xh", disp+pc+4 );1.1479 + }1.1480 + break;1.1481 + case 0xC:1.1482 + switch( (ir&0xF00) >> 8 ) {1.1483 + case 0x0:1.1484 + { /* MOV.B R0, @(disp, GBR) */1.1485 + uint32_t disp = (ir&0xFF);1.1486 + snprintf( buf, len, "MOV.B R0, @(%d, GBR)", disp );1.1487 + }1.1488 + break;1.1489 + case 0x1:1.1490 + { /* MOV.W R0, @(disp, GBR) */1.1491 + uint32_t disp = (ir&0xFF)<<1;1.1492 + snprintf( buf, len, "MOV.W R0, @(%d, GBR)", disp);1.1493 + }1.1494 + break;1.1495 + case 0x2:1.1496 + { /* MOV.L R0, @(disp, GBR) */1.1497 + uint32_t disp = (ir&0xFF)<<2;1.1498 + snprintf( buf, len, "MOV.L R0, @(%d, GBR)", disp );1.1499 + }1.1500 + break;1.1501 + case 0x3:1.1502 + { /* TRAPA #imm */1.1503 + uint32_t imm = (ir&0xFF);1.1504 + snprintf( buf, len, "TRAPA #%d", imm );1.1505 + }1.1506 + break;1.1507 + case 0x4:1.1508 + { /* MOV.B @(disp, GBR), R0 */1.1509 + uint32_t disp = (ir&0xFF);1.1510 + snprintf( buf, len, "MOV.B @(%d, GBR), R0", disp );1.1511 + }1.1512 + break;1.1513 + case 0x5:1.1514 + { /* MOV.W @(disp, GBR), R0 */1.1515 + uint32_t disp = (ir&0xFF)<<1;1.1516 + snprintf( buf, len, "MOV.W @(%d, GBR), R0", disp );1.1517 + }1.1518 + break;1.1519 + case 0x6:1.1520 + { /* MOV.L @(disp, GBR), R0 */1.1521 + uint32_t disp = (ir&0xFF)<<2;1.1522 + snprintf( buf, len, "MOV.L @(%d, GBR), R0",disp );1.1523 + }1.1524 + break;1.1525 + case 0x7:1.1526 + { /* MOVA @(disp, PC), R0 */1.1527 + uint32_t disp = (ir&0xFF)<<2;1.1528 + snprintf( buf, len, "MOVA @($%xh), R0", disp + (pc&0xFFFFFFFC) + 4 );1.1529 + }1.1530 + break;1.1531 + case 0x8:1.1532 + { /* TST #imm, R0 */1.1533 + uint32_t imm = (ir&0xFF);1.1534 + snprintf( buf, len, "TST #%d, R0", imm );1.1535 + }1.1536 + break;1.1537 + case 0x9:1.1538 + { /* AND #imm, R0 */1.1539 + uint32_t imm = (ir&0xFF);1.1540 + snprintf( buf, len, "ADD #%d, R0", imm );1.1541 + }1.1542 + break;1.1543 + case 0xA:1.1544 + { /* XOR #imm, R0 */1.1545 + uint32_t imm = (ir&0xFF);1.1546 + snprintf( buf, len, "XOR #%d, R0", imm );1.1547 + }1.1548 + break;1.1549 + case 0xB:1.1550 + { /* OR #imm, R0 */1.1551 + uint32_t imm = (ir&0xFF);1.1552 + snprintf( buf, len, "OR #%d, R0", imm );1.1553 + }1.1554 + break;1.1555 + case 0xC:1.1556 + { /* TST.B #imm, @(R0, GBR) */1.1557 + uint32_t imm = (ir&0xFF);1.1558 + snprintf( buf, len, "TST.B #%d, @(R0, GBR)", imm );1.1559 + }1.1560 + break;1.1561 + case 0xD:1.1562 + { /* AND.B #imm, @(R0, GBR) */1.1563 + uint32_t imm = (ir&0xFF);1.1564 + snprintf( buf, len, "AND.B #%d, @(R0, GBR)", imm );1.1565 + }1.1566 + break;1.1567 + case 0xE:1.1568 + { /* XOR.B #imm, @(R0, GBR) */1.1569 + uint32_t imm = (ir&0xFF);1.1570 + snprintf( buf, len, "XOR.B #%d, @(R0, GBR)", imm );1.1571 + }1.1572 + break;1.1573 + case 0xF:1.1574 + { /* OR.B #imm, @(R0, GBR) */1.1575 + uint32_t imm = (ir&0xFF);1.1576 + snprintf( buf, len, "OR.B #%d, @(R0, GBR)", imm );1.1577 + }1.1578 + break;1.1579 + }1.1580 + break;1.1581 + case 0xD:1.1582 + { /* MOV.L @(disp, PC), Rn */1.1583 + uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2;1.1584 + snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(pc&0xFFFFFFFC)+4) );1.1585 + }1.1586 + break;1.1587 + case 0xE:1.1588 + { /* MOV #imm, Rn */1.1589 + uint32_t Rn = ((ir>>8)&0xF); int32_t imm = SIGNEXT8(ir&0xFF);1.1590 + snprintf( buf, len, "MOV #%d, R%d", imm, Rn );1.1591 + }1.1592 + break;1.1593 + case 0xF:1.1594 + switch( ir&0xF ) {1.1595 + case 0x0:1.1596 + { /* FADD FRm, FRn */1.1597 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1598 + snprintf( buf, len, "FADD FR%d, FR%d", FRm, FRn );1.1599 + }1.1600 + break;1.1601 + case 0x1:1.1602 + { /* FSUB FRm, FRn */1.1603 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1604 + snprintf( buf, len, "FSUB FRm, FR%d", FRm, FRn );1.1605 + }1.1606 + break;1.1607 + case 0x2:1.1608 + { /* FMUL FRm, FRn */1.1609 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1610 + snprintf( buf, len, "FMUL FRm, FR%d", FRm, FRn );1.1611 + }1.1612 + break;1.1613 + case 0x3:1.1614 + { /* FDIV FRm, FRn */1.1615 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1616 + snprintf( buf, len, "FDIV FR%d, FR%d", FRm, FRn );1.1617 + }1.1618 + break;1.1619 + case 0x4:1.1620 + { /* FCMP/EQ FRm, FRn */1.1621 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1622 + snprintf( buf, len, "FCMP/EQ FR%d, FR%d", FRm, FRn );1.1623 + }1.1624 + break;1.1625 + case 0x5:1.1626 + { /* FCMP/GT FRm, FRn */1.1627 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1628 + snprintf( buf, len, "FCMP/QT FR%d, FR%d", FRm, FRn );1.1629 + }1.1630 + break;1.1631 + case 0x6:1.1632 + { /* FMOV @(R0, Rm), FRn */1.1633 + uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1634 + snprintf( buf, len, "FMOV @(R0, R%d), FR%d", Rm, FRn );1.1635 + }1.1636 + break;1.1637 + case 0x7:1.1638 + { /* FMOV FRm, @(R0, Rn) */1.1639 + uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1640 + snprintf( buf, len, "FMOV FR%d, @(R0, R%d)", FRm, Rn );1.1641 + }1.1642 + break;1.1643 + case 0x8:1.1644 + { /* FMOV @Rm, FRn */1.1645 + uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1646 + snprintf( buf, len, "FMOV @R%d, FR%d", Rm, FRn );1.1647 + }1.1648 + break;1.1649 + case 0x9:1.1650 + { /* FMOV @Rm+, FRn */1.1651 + uint32_t FRn = ((ir>>8)&0xF); uint32_t Rm = ((ir>>4)&0xF);1.1652 + snprintf( buf, len, "FMOV @R%d+, FR%d", Rm, FRn );1.1653 + }1.1654 + break;1.1655 + case 0xA:1.1656 + { /* FMOV FRm, @Rn */1.1657 + uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1658 + snprintf( buf, len, "FMOV FR%d, @R%d", FRm, Rn );1.1659 + }1.1660 + break;1.1661 + case 0xB:1.1662 + { /* FMOV FRm, @-Rn */1.1663 + uint32_t Rn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1664 + snprintf( buf, len, "FMOV FR%d, @-R%d", FRm, Rn );1.1665 + }1.1666 + break;1.1667 + case 0xC:1.1668 + { /* FMOV FRm, FRn */1.1669 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1670 + snprintf( buf, len, "FMOV FR%d, FR%d", FRm, FRn );1.1671 + }1.1672 + break;1.1673 + case 0xD:1.1674 + switch( (ir&0xF0) >> 4 ) {1.1675 + case 0x0:1.1676 + { /* FSTS FPUL, FRn */1.1677 + uint32_t FRn = ((ir>>8)&0xF);1.1678 + snprintf( buf, len, "FSTS FPUL, FR%d", FRn );1.1679 + }1.1680 + break;1.1681 + case 0x1:1.1682 + { /* FLDS FRm, FPUL */1.1683 + uint32_t FRm = ((ir>>8)&0xF);1.1684 + snprintf( buf, len, "FLDS FR%d, FPUL", FRm );1.1685 + }1.1686 + break;1.1687 + case 0x2:1.1688 + { /* FLOAT FPUL, FRn */1.1689 + uint32_t FRn = ((ir>>8)&0xF);1.1690 + snprintf( buf, len, "FLOAT FPUL, FR%d", FRn );1.1691 + }1.1692 + break;1.1693 + case 0x3:1.1694 + { /* FTRC FRm, FPUL */1.1695 + uint32_t FRm = ((ir>>8)&0xF);1.1696 + snprintf( buf, len, "FTRC FR%d, FPUL", FRm );1.1697 + }1.1698 + break;1.1699 + case 0x4:1.1700 + { /* FNEG FRn */1.1701 + uint32_t FRn = ((ir>>8)&0xF);1.1702 + snprintf( buf, len, "FNEG FR%d", FRn );1.1703 + }1.1704 + break;1.1705 + case 0x5:1.1706 + { /* FABS FRn */1.1707 + uint32_t FRn = ((ir>>8)&0xF);1.1708 + snprintf( buf, len, "FABS FR%d", FRn );1.1709 + }1.1710 + break;1.1711 + case 0x6:1.1712 + { /* FSQRT FRn */1.1713 + uint32_t FRn = ((ir>>8)&0xF);1.1714 + snprintf( buf, len, "FSQRT FR%d", FRn );1.1715 + }1.1716 + break;1.1717 + case 0x7:1.1718 + { /* FSRRA FRn */1.1719 + uint32_t FRn = ((ir>>8)&0xF);1.1720 + snprintf( buf, len, "FSRRA FR%d", FRn );1.1721 + }1.1722 + break;1.1723 + case 0x8:1.1724 + { /* FLDI0 FRn */1.1725 + uint32_t FRn = ((ir>>8)&0xF);1.1726 + snprintf( buf, len, "FLDI0 FR%d", FRn );1.1727 + }1.1728 + break;1.1729 + case 0x9:1.1730 + { /* FLDI1 FRn */1.1731 + uint32_t FRn = ((ir>>8)&0xF);1.1732 + snprintf( buf, len, "FLDI1 FR%d", FRn );1.1733 + }1.1734 + break;1.1735 + case 0xA:1.1736 + { /* FCNVSD FPUL, FRn */1.1737 + uint32_t FRn = ((ir>>8)&0xF);1.1738 + snprintf( buf, len, "FCNVSD FPUL, FR%d", FRn );1.1739 + }1.1740 + break;1.1741 + case 0xB:1.1742 + { /* FCNVDS FRm, FPUL */1.1743 + uint32_t FRm = ((ir>>8)&0xF);1.1744 + snprintf( buf, len, "FCNVDS FR%d, FPUL", FRm );1.1745 + }1.1746 + break;1.1747 + case 0xE:1.1748 + { /* FIPR FVm, FVn */1.1749 + uint32_t FVn = ((ir>>10)&0x3); uint32_t FVm = ((ir>>8)&0x3);1.1750 + snprintf( buf, len, "FIPR FV%d, FV%d", FVm, FVn );1.1751 + }1.1752 + break;1.1753 + case 0xF:1.1754 + switch( (ir&0x100) >> 8 ) {1.1755 + case 0x0:1.1756 + { /* FSCA FPUL, FRn */1.1757 + uint32_t FRn = ((ir>>9)&0x7)<<1;1.1758 + snprintf( buf, len, "FSCA FPUL, FR%d", FRn );1.1759 + }1.1760 + break;1.1761 + case 0x1:1.1762 + switch( (ir&0x200) >> 9 ) {1.1763 + case 0x0:1.1764 + { /* FTRV XMTRX, FVn */1.1765 + uint32_t FVn = ((ir>>10)&0x3);1.1766 + snprintf( buf, len, "FTRV XMTRX, FV%d", FVn );1.1767 + }1.1768 + break;1.1769 + case 0x1:1.1770 + switch( (ir&0xC00) >> 10 ) {1.1771 + case 0x0:1.1772 + { /* FSCHG */1.1773 + snprintf( buf, len, "FSCHG " );1.1774 + }1.1775 + break;1.1776 + case 0x2:1.1777 + { /* FRCHG */1.1778 + snprintf( buf, len, "FRCHG " );1.1779 + }1.1780 + break;1.1781 + case 0x3:1.1782 + { /* UNDEF */1.1783 + snprintf( buf, len, "UNDEF " );1.1784 + }1.1785 + break;1.1786 + default:1.1787 + UNDEF();1.1788 + break;1.1789 + }1.1790 + break;1.1791 + }1.1792 + break;1.1793 + }1.1794 + break;1.1795 + default:1.1796 + UNDEF();1.1797 + break;1.1798 + }1.1799 + break;1.1800 + case 0xE:1.1801 + { /* FMAC FR0, FRm, FRn */1.1802 + uint32_t FRn = ((ir>>8)&0xF); uint32_t FRm = ((ir>>4)&0xF);1.1803 + snprintf( buf, len, "FMAC FR0, FR%d, FR%d", FRm, FRn );1.1804 + }1.1805 + break;1.1806 + default:1.1807 + UNDEF();1.1808 + break;1.1809 + }1.1810 + break;1.1811 + }1.1812 +1.1813 return pc+2;1.1814 }
.