Search
lxdream.org :: lxdream/src/sh4/sh4dasm.in
lxdream 0.9.1
released Jun 29
Download Now
filename src/sh4/sh4dasm.in
changeset 1065:bc1cc0c54917
prev998:1754a8c6a9cf
prev569:a1c49e1e8776
next1190:2e66e9053037
author nkeynes
date Wed Nov 10 08:37:42 2010 +1000 (13 years ago)
permissions -rw-r--r--
last change Add chain pointer to the xlat cache, so that we can maintain multiple blocks
for the same address. This prevents thrashing in cases where we would other
keep retranslating the same blocks over and over again due to varying
xlat_sh4_mode values
file annotate diff log raw
nkeynes@359
     1
/**
nkeynes@561
     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@963
    21
#include "sh4/mmu.h"
nkeynes@359
    22
#include "mem.h"
nkeynes@359
    23
nkeynes@359
    24
#define UNIMP(ir) snprintf( buf, len, "???     " )
nkeynes@359
    25
nkeynes@597
    26
uint32_t sh4_disasm_instruction( sh4vma_t pc, char *buf, int len, char *opcode )
nkeynes@359
    27
{
nkeynes@597
    28
    sh4addr_t addr = mmu_vma_to_phys_disasm(pc);
nkeynes@939
    29
    uint32_t tmp;
nkeynes@939
    30
    uint16_t ir = ext_address_space[addr>>12]->read_word(addr);
nkeynes@359
    31
nkeynes@359
    32
#define UNDEF(ir) snprintf( buf, len, "????    " );
nkeynes@359
    33
#define RN(ir) ((ir&0x0F00)>>8)
nkeynes@359
    34
#define RN_BANK(ir) ((ir&0x0070)>>4)
nkeynes@359
    35
#define RM(ir) ((ir&0x00F0)>>4)
nkeynes@359
    36
#define DISP4(ir) (ir&0x000F) /* 4-bit displacements are *not* sign extended */
nkeynes@359
    37
#define DISP8(ir) (ir&0x00FF)
nkeynes@359
    38
#define PCDISP8(ir) SIGNEXT8(ir&0x00FF)
nkeynes@359
    39
#define UIMM8(ir) (ir&0x00FF)
nkeynes@359
    40
#define IMM8(ir) SIGNEXT8(ir&0x00FF)
nkeynes@359
    41
#define DISP12(ir) SIGNEXT12(ir&0x0FFF)
nkeynes@359
    42
#define FVN(ir) ((ir&0x0C00)>>10)
nkeynes@359
    43
#define FVM(ir) ((ir&0x0300)>>8)
nkeynes@359
    44
nkeynes@359
    45
    sprintf( opcode, "%02X %02X", ir&0xFF, ir>>8 );
nkeynes@359
    46
nkeynes@359
    47
%%
nkeynes@359
    48
ADD Rm, Rn       {: snprintf( buf, len, "ADD     R%d, R%d", Rm, Rn ); :}
nkeynes@359
    49
ADD #imm, Rn     {: snprintf( buf, len, "ADD     #%d, R%d", imm, Rn ); :}
nkeynes@359
    50
ADDC Rm, Rn      {: snprintf( buf, len, "ADDC    R%d, R%d", Rm, Rn ); :}
nkeynes@359
    51
ADDV Rm, Rn      {: snprintf( buf, len, "ADDV    R%d, R%d", Rm, Rn ); :}
nkeynes@359
    52
AND Rm, Rn       {: snprintf( buf, len, "AND     R%d, R%d", Rm, Rn ); :}
nkeynes@595
    53
AND #imm, R0     {: snprintf( buf, len, "AND     #%d, R0", imm ); :}
nkeynes@359
    54
AND.B #imm, @(R0, GBR) {: snprintf( buf, len, "AND.B   #%d, @(R0, GBR)", imm ); :}
nkeynes@359
    55
BF disp          {: snprintf( buf, len, "BF      $%xh", disp+pc+4 ); :}
nkeynes@359
    56
BF/S disp        {: snprintf( buf, len, "BF/S    $%xh", disp+pc+4 ); :}
nkeynes@359
    57
BRA disp         {: snprintf( buf, len, "BRA     $%xh", disp+pc+4 ); :}
nkeynes@359
    58
BRAF Rn          {: snprintf( buf, len, "BRAF    R%d", Rn ); :}
nkeynes@359
    59
BSR disp         {: snprintf( buf, len, "BSR     $%xh", disp+pc+4 ); :}
nkeynes@359
    60
BSRF Rn          {: snprintf( buf, len, "BSRF    R%d", Rn ); :}
nkeynes@359
    61
BT disp          {: snprintf( buf, len, "BT      $%xh", disp+pc+4 ); :}
nkeynes@359
    62
BT/S disp        {: snprintf( buf, len, "BT/S    $%xh", disp+pc+4 ); :}
nkeynes@359
    63
CLRMAC           {: snprintf( buf, len, "CLRMAC  " ); :}
nkeynes@359
    64
CLRS             {: snprintf( buf, len, "CLRS    " ); :}
nkeynes@359
    65
CLRT             {: snprintf( buf, len, "CLRT    " ); :}
nkeynes@359
    66
CMP/EQ Rm, Rn    {: snprintf( buf, len, "CMP/EQ  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    67
CMP/EQ #imm, R0  {: snprintf( buf, len, "CMP/EQ  #%d, R0", imm ); :}
nkeynes@359
    68
CMP/GE Rm, Rn    {: snprintf( buf, len, "CMP/GE  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    69
CMP/GT Rm, Rn    {: snprintf( buf, len, "CMP/GT  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    70
CMP/HI Rm, Rn    {: snprintf( buf, len, "CMP/HI  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    71
CMP/HS Rm, Rn    {: snprintf( buf, len, "CMP/HS  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    72
CMP/PL Rn        {: snprintf( buf, len, "CMP/PL  R%d", Rn ); :}
nkeynes@359
    73
CMP/PZ Rn        {: snprintf( buf, len, "CMP/PZ  R%d", Rn ); :}
nkeynes@359
    74
CMP/STR Rm, Rn   {: snprintf( buf, len, "CMP/STR R%d, R%d", Rm, Rn ); :}
nkeynes@359
    75
DIV0S Rm, Rn     {: snprintf( buf, len, "DIV0S   R%d, R%d", Rm, Rn ); :}
nkeynes@359
    76
DIV0U            {: snprintf( buf, len, "DIV0U   " ); :}
nkeynes@359
    77
DIV1 Rm, Rn      {: snprintf( buf, len, "DIV1    R%d, R%d", Rm, Rn ); :}
nkeynes@359
    78
DMULS.L Rm, Rn   {: snprintf( buf, len, "DMULS.L R%d, R%d", Rm, Rn ); :}
nkeynes@359
    79
DMULU.L RM, Rn   {: snprintf( buf, len, "DMULU.L R%d, R%d", Rm, Rn ); :}
nkeynes@359
    80
DT Rn            {: snprintf( buf, len, "DT      R%d", Rn ); :}
nkeynes@359
    81
EXTS.B Rm, Rn    {: snprintf( buf, len, "EXTS.B  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    82
EXTS.W Rm, Rn    {: snprintf( buf, len, "EXTS.W  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    83
EXTU.B Rm, Rn    {: snprintf( buf, len, "EXTU.B  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    84
EXTU.W Rm, Rn    {: snprintf( buf, len, "EXTU.W  R%d, R%d", Rm, Rn ); :}
nkeynes@359
    85
FABS FRn         {: snprintf( buf, len, "FABS    FR%d", FRn ); :}
nkeynes@359
    86
FADD FRm, FRn    {: snprintf( buf, len, "FADD    FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
    87
FCMP/EQ FRm, FRn {: snprintf( buf, len, "FCMP/EQ FR%d, FR%d", FRm, FRn ); :}
nkeynes@873
    88
FCMP/GT FRm, FRn {: snprintf( buf, len, "FCMP/GT FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
    89
FCNVDS FRm, FPUL {: snprintf( buf, len, "FCNVDS  FR%d, FPUL", FRm ); :}
nkeynes@359
    90
FCNVSD FPUL, FRn {: snprintf( buf, len, "FCNVSD  FPUL, FR%d", FRn ); :}
nkeynes@359
    91
FDIV FRm, FRn    {: snprintf( buf, len, "FDIV    FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
    92
FIPR FVm, FVn    {: snprintf( buf, len, "FIPR    FV%d, FV%d", FVm, FVn ); :}
nkeynes@359
    93
FLDS FRm, FPUL   {: snprintf( buf, len, "FLDS    FR%d, FPUL", FRm ); :}
nkeynes@359
    94
FLDI0 FRn        {: snprintf( buf, len, "FLDI0   FR%d", FRn ); :}
nkeynes@359
    95
FLDI1 FRn        {: snprintf( buf, len, "FLDI1   FR%d", FRn ); :}
nkeynes@359
    96
FLOAT FPUL, FRn  {: snprintf( buf, len, "FLOAT   FPUL, FR%d", FRn ); :}
nkeynes@359
    97
FMAC FR0, FRm, FRn {: snprintf( buf, len, "FMAC    FR0, FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
    98
FMOV FRm, FRn    {: snprintf( buf, len, "FMOV    FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
    99
FMOV FRm, @Rn    {: snprintf( buf, len, "FMOV    FR%d, @R%d", FRm, Rn ); :}
nkeynes@359
   100
FMOV FRm, @-Rn   {: snprintf( buf, len, "FMOV    FR%d, @-R%d", FRm, Rn ); :}
nkeynes@359
   101
FMOV FRm, @(R0, Rn) {: snprintf( buf, len, "FMOV    FR%d, @(R0, R%d)", FRm, Rn ); :}
nkeynes@359
   102
FMOV @Rm, FRn    {: snprintf( buf, len, "FMOV    @R%d, FR%d", Rm, FRn ); :}
nkeynes@359
   103
FMOV @Rm+, FRn   {: snprintf( buf, len, "FMOV    @R%d+, FR%d", Rm, FRn ); :}
nkeynes@359
   104
FMOV @(R0, Rm), FRn {: snprintf( buf, len, "FMOV    @(R0, R%d), FR%d", Rm, FRn ); :}
nkeynes@430
   105
FMUL FRm, FRn    {: snprintf( buf, len, "FMUL    FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
   106
FNEG FRn         {: snprintf( buf, len, "FNEG    FR%d", FRn ); :}
nkeynes@359
   107
FRCHG            {: snprintf( buf, len, "FRCHG   " ); :}
nkeynes@359
   108
FSCA FPUL, FRn   {: snprintf( buf, len, "FSCA    FPUL, FR%d", FRn ); :}
nkeynes@359
   109
FSCHG            {: snprintf( buf, len, "FSCHG   " ); :}
nkeynes@359
   110
FSQRT FRn        {: snprintf( buf, len, "FSQRT   FR%d", FRn ); :}
nkeynes@359
   111
FSRRA FRn        {: snprintf( buf, len, "FSRRA   FR%d", FRn ); :}
nkeynes@359
   112
FSTS FPUL, FRn   {: snprintf( buf, len, "FSTS    FPUL, FR%d", FRn ); :}
nkeynes@430
   113
FSUB FRm, FRn    {: snprintf( buf, len, "FSUB    FR%d, FR%d", FRm, FRn ); :}
nkeynes@359
   114
FTRC FRm, FPUL   {: snprintf( buf, len, "FTRC    FR%d, FPUL", FRm ); :}
nkeynes@359
   115
FTRV XMTRX, FVn  {: snprintf( buf, len, "FTRV    XMTRX, FV%d", FVn ); :}
nkeynes@359
   116
JMP @Rn          {: snprintf( buf, len, "JMP     @R%d", Rn ); :}
nkeynes@359
   117
JSR @Rn          {: snprintf( buf, len, "JSR     @R%d", Rn ); :}
nkeynes@359
   118
LDC Rm, GBR      {: snprintf( buf, len, "LDC     R%d, GBR", Rm ); :}
nkeynes@359
   119
LDC Rm, SR       {: snprintf( buf, len, "LDC     R%d, SR", Rm ); :}
nkeynes@359
   120
LDC Rm, VBR      {: snprintf( buf, len, "LDC     R%d, VBR", Rm ); :}
nkeynes@359
   121
LDC Rm, SSR      {: snprintf( buf, len, "LDC     R%d, SSR", Rm ); :}
nkeynes@359
   122
LDC Rm, SGR      {: snprintf( buf, len, "LDC     R%d, SGR", Rm ); :}
nkeynes@359
   123
LDC Rm, SPC      {: snprintf( buf, len, "LDC     R%d, SPC", Rm ); :}
nkeynes@359
   124
LDC Rm, DBR      {: snprintf( buf, len, "LDC     R%d, DBR", Rm ); :}
nkeynes@359
   125
LDC Rm, Rn_BANK  {: snprintf( buf, len, "LDC     R%d, R%d_BANK", Rm, Rn_BANK ); :}
nkeynes@359
   126
LDS Rm, FPSCR    {: snprintf( buf, len, "LDS     R%d, FPSCR", Rm ); :}
nkeynes@359
   127
LDS Rm, FPUL     {: snprintf( buf, len, "LDS     R%d, FPUL", Rm ); :}
nkeynes@359
   128
LDS Rm, MACH     {: snprintf( buf, len, "LDS     R%d, MACH", Rm ); :}
nkeynes@359
   129
LDS Rm, MACL     {: snprintf( buf, len, "LDS     R%d, MACL", Rm ); :}
nkeynes@359
   130
LDS Rm, PR       {: snprintf( buf, len, "LDS     R%d, PR", Rm ); :}
nkeynes@359
   131
LDC.L @Rm+, GBR  {: snprintf( buf, len, "LDC.L   @R%d+, GBR", Rm ); :}
nkeynes@359
   132
LDC.L @Rm+, SR   {: snprintf( buf, len, "LDC.L   @R%d+, SR", Rm ); :}
nkeynes@359
   133
LDC.L @Rm+, VBR  {: snprintf( buf, len, "LDC.L   @R%d+, VBR", Rm ); :}
nkeynes@359
   134
LDC.L @Rm+, SSR  {: snprintf( buf, len, "LDC.L   @R%d+, SSR", Rm ); :}
nkeynes@359
   135
LDC.L @Rm+, SGR  {: snprintf( buf, len, "LDC.L   @R%d+, SGR", Rm ); :}
nkeynes@359
   136
LDC.L @Rm+, SPC  {: snprintf( buf, len, "LDC.L   @R%d+, SPC", Rm ); :}
nkeynes@359
   137
LDC.L @Rm+, DBR  {: snprintf( buf, len, "LDC.L   @R%d+, DBR", Rm ); :}
nkeynes@359
   138
LDC.L @Rm+, Rn_BANK{: snprintf( buf, len, "LDC.L   @R%d+, @R%d+_BANK", Rm, Rn_BANK ); :}
nkeynes@359
   139
LDS.L @Rm+, FPSCR{: snprintf( buf, len, "LDS.L   @R%d+, FPSCR", Rm ); :}
nkeynes@359
   140
LDS.L @Rm+, FPUL {: snprintf( buf, len, "LDS.L   @R%d+, FPUL", Rm ); :}
nkeynes@359
   141
LDS.L @Rm+, MACH {: snprintf( buf, len, "LDS.L   @R%d+, MACH", Rm ); :}
nkeynes@359
   142
LDS.L @Rm+, MACL {: snprintf( buf, len, "LDS.L   @R%d+, MACL", Rm ); :}
nkeynes@359
   143
LDS.L @Rm+, PR   {: snprintf( buf, len, "LDS.L   @R%d+, PR", Rm ); :}
nkeynes@359
   144
LDTLB            {: snprintf( buf, len, "LDTLB   " ); :}
nkeynes@359
   145
MAC.L @Rm+, @Rn+ {: snprintf( buf, len, "MAC.L   @R%d+, @R%d+", Rm, Rn ); :}
nkeynes@359
   146
MAC.W @Rm+, @Rn+ {: snprintf( buf, len, "MAC.W   @R%d+, @R%d+", Rm, Rn ); :}
nkeynes@359
   147
MOV Rm, Rn       {: snprintf( buf, len, "MOV     R%d, R%d", Rm, Rn ); :}
nkeynes@359
   148
MOV #imm, Rn     {: snprintf( buf, len, "MOV     #%d, R%d", imm, Rn ); :}
nkeynes@359
   149
MOV.B Rm, @Rn    {: snprintf( buf, len, "MOV.B   R%d, @R%d", Rm, Rn ); :}
nkeynes@359
   150
MOV.B Rm, @-Rn   {: snprintf( buf, len, "MOV.B   R%d, @-R%d", Rm, Rn ); :}
nkeynes@359
   151
MOV.B Rm, @(R0, Rn) {: snprintf( buf, len, "MOV.B   R%d, @(R0, R%d)", Rm, Rn ); :}
nkeynes@359
   152
MOV.B R0, @(disp, GBR) {: snprintf( buf, len, "MOV.B   R0, @(%d, GBR)", disp ); :}
nkeynes@359
   153
MOV.B R0, @(disp, Rn)  {: snprintf( buf, len, "MOV.B   R0, @(%d, R%d)", disp, Rn ); :}
nkeynes@359
   154
MOV.B @Rm, Rn    {: snprintf( buf, len, "MOV.B   @R%d, R%d", Rm, Rn ); :}
nkeynes@359
   155
MOV.B @Rm+, Rn   {: snprintf( buf, len, "MOV.B   @R%d+, R%d", Rm, Rn ); :}
nkeynes@359
   156
MOV.B @(R0, Rm), Rn {: snprintf( buf, len, "MOV.B   @(R0, R%d), R%d", Rm, Rn ); :}
nkeynes@359
   157
MOV.B @(disp, GBR), R0{: snprintf( buf, len, "MOV.B   @(%d, GBR), R0", disp ); :}
nkeynes@359
   158
MOV.B @(disp, Rm), R0 {: snprintf( buf, len, "MOV.B   @(%d, R%d), R0", disp, Rm ); :}
nkeynes@359
   159
MOV.L Rm, @Rn    {: snprintf( buf, len, "MOV.L   R%d, @R%d", Rm, Rn ); :}
nkeynes@359
   160
MOV.L Rm, @-Rn   {: snprintf( buf, len, "MOV.L   R%d, @-R%d", Rm, Rn ); :}
nkeynes@359
   161
MOV.L Rm, @(R0, Rn) {: snprintf( buf, len, "MOV.L   R%d, @(R0, R%d)", Rm, Rn ); :}
nkeynes@359
   162
MOV.L R0, @(disp, GBR) {: snprintf( buf, len, "MOV.L   R0, @(%d, GBR)", disp ); :}
nkeynes@359
   163
MOV.L Rm, @(disp, Rn) {: snprintf( buf, len, "MOV.L   R%d, @(%d, R%d)", Rm, disp, Rn ); :}
nkeynes@359
   164
MOV.L @Rm, Rn    {: snprintf( buf, len, "MOV.L   @R%d, R%d", Rm, Rn ); :}
nkeynes@359
   165
MOV.L @Rm+, Rn   {: snprintf( buf, len, "MOV.L   @R%d+, R%d", Rm, Rn ); :}
nkeynes@359
   166
MOV.L @(R0, Rm), Rn {: snprintf( buf, len, "MOV.L   @(R0, R%d), R%d", Rm, Rn ); :}
nkeynes@359
   167
MOV.L @(disp, GBR), R0 {: snprintf( buf, len, "MOV.L   @(%d, GBR), R0",disp ); :}
nkeynes@939
   168
MOV.L @(disp, PC), Rn  {:
nkeynes@939
   169
    tmp = mmu_vma_to_phys_disasm(disp + (pc&0xFFFFFFFC) + 4); 
nkeynes@939
   170
    snprintf( buf, len, "MOV.L   @($%xh), R%d ; <- #%08x", disp + (pc&0xFFFFFFFC)+4, Rn, ext_address_space[tmp>>12]->read_long(tmp) );
nkeynes@939
   171
:}
nkeynes@496
   172
MOV.L @(disp, Rm), Rn  {: snprintf( buf, len, "MOV.L   @(%d, R%d), R%d", disp, Rm, Rn ); :}
nkeynes@359
   173
MOV.W Rm, @Rn    {: snprintf( buf, len, "MOV.W   R%d, @R%d", Rm, Rn ); :}
nkeynes@359
   174
MOV.W Rm, @-Rn   {: snprintf( buf, len, "MOV.W   R%d, @-R%d", Rm, Rn ); :}
nkeynes@359
   175
MOV.W Rm, @(R0, Rn) {: snprintf( buf, len, "MOV.W   R%d, @(R0, R%d)", Rm, Rn ); :}
nkeynes@359
   176
MOV.W R0, @(disp, GBR) {: snprintf( buf, len, "MOV.W   R0, @(%d, GBR)", disp); :}
nkeynes@430
   177
MOV.W R0, @(disp, Rn)  {: snprintf( buf, len, "MOV.W   R0, @(%d, R%d)", disp, Rn ); :}
nkeynes@359
   178
MOV.W @Rm, Rn    {: snprintf( buf, len, "MOV.W   @R%d, R%d", Rm, Rn ); :}
nkeynes@359
   179
MOV.W @Rm+, Rn   {: snprintf( buf, len, "MOV.W   @R%d+, R%d", Rm, Rn ); :}
nkeynes@359
   180
MOV.W @(R0, Rm), Rn {: snprintf( buf, len, "MOV.W   @(R0, R%d), R%d", Rm, Rn ); :}
nkeynes@359
   181
MOV.W @(disp, GBR), R0 {: snprintf( buf, len, "MOV.W   @(%d, GBR), R0", disp ); :}
nkeynes@939
   182
MOV.W @(disp, PC), Rn  {:
nkeynes@939
   183
    tmp = mmu_vma_to_phys_disasm(disp+pc+4);
nkeynes@939
   184
    snprintf( buf, len, "MOV.W   @($%xh), R%d ; <- #%08x", disp+pc+4, Rn, ext_address_space[tmp>>12]->read_word(tmp) );
nkeynes@939
   185
:}
nkeynes@359
   186
MOV.W @(disp, Rm), R0  {: snprintf( buf, len, "MOV.W   @(%d, R%d), R0", disp, Rm ); :}
nkeynes@359
   187
MOVA @(disp, PC), R0   {: snprintf( buf, len, "MOVA    @($%xh), R0", disp + (pc&0xFFFFFFFC) + 4 ); :}
nkeynes@359
   188
MOVCA.L R0, @Rn  {: snprintf( buf, len, "MOVCA.L R0, @R%d", Rn ); :}
nkeynes@359
   189
MOVT Rn          {: snprintf( buf, len, "MOVT    R%d", Rn ); :}
nkeynes@359
   190
MUL.L Rm, Rn     {: snprintf( buf, len, "MUL.L   R%d, R%d", Rm, Rn ); :}
nkeynes@359
   191
MULS.W Rm, Rn    {: snprintf( buf, len, "MULS.W  R%d, R%d", Rm, Rn ); :}
nkeynes@359
   192
MULU.W Rm, Rn    {: snprintf( buf, len, "MULU.W  R%d, R%d", Rm, Rn ); :}
nkeynes@359
   193
NEG Rm, Rn       {: snprintf( buf, len, "NEG     R%d, R%d", Rm, Rn ); :}
nkeynes@359
   194
NEGC Rm, Rn      {: snprintf( buf, len, "NEGC    R%d, R%d", Rm, Rn ); :}
nkeynes@359
   195
NOP              {: snprintf( buf, len, "NOP     " ); :}
nkeynes@359
   196
NOT Rm, Rn       {: snprintf( buf, len, "NOT     R%d, R%d", Rm, Rn ); :}
nkeynes@359
   197
OCBI @Rn         {: snprintf( buf, len, "OCBI    @R%d", Rn ); :}
nkeynes@359
   198
OCBP @Rn         {: snprintf( buf, len, "OCBP    @R%d", Rn ); :}
nkeynes@359
   199
OCBWB @Rn        {: snprintf( buf, len, "OCBWB   @R%d", Rn ); :}
nkeynes@359
   200
OR Rm, Rn        {: snprintf( buf, len, "OR      R%d, R%d", Rm, Rn ); :}
nkeynes@359
   201
OR #imm, R0      {: snprintf( buf, len, "OR      #%d, R0", imm ); :}
nkeynes@359
   202
OR.B #imm, @(R0, GBR) {: snprintf( buf, len, "OR.B    #%d, @(R0, GBR)", imm ); :}
nkeynes@359
   203
PREF @Rn         {: snprintf( buf, len, "PREF    R%d", Rn ); :}
nkeynes@359
   204
ROTCL Rn         {: snprintf( buf, len, "ROTCL   R%d", Rn ); :}
nkeynes@359
   205
ROTCR Rn         {: snprintf( buf, len, "ROTCR   R%d", Rn ); :}
nkeynes@359
   206
ROTL Rn          {: snprintf( buf, len, "ROTL    R%d", Rn ); :}
nkeynes@359
   207
ROTR Rn          {: snprintf( buf, len, "ROTR    R%d", Rn ); :}
nkeynes@359
   208
RTE              {: snprintf( buf, len, "RTE     " ); :}
nkeynes@359
   209
RTS              {: snprintf( buf, len, "RTS     " ); :}
nkeynes@359
   210
SETS             {: snprintf( buf, len, "SETS    " ); :}
nkeynes@359
   211
SETT             {: snprintf( buf, len, "SETT    " ); :}
nkeynes@359
   212
SHAD Rm, Rn      {: snprintf( buf, len, "SHAD    R%d, R%d", Rm, Rn ); :}
nkeynes@359
   213
SHAL Rn          {: snprintf( buf, len, "SHAL    R%d", Rn ); :}
nkeynes@359
   214
SHAR Rn          {: snprintf( buf, len, "SHAR    R%d", Rn ); :}
nkeynes@359
   215
SHLD Rm, Rn      {: snprintf( buf, len, "SHLD    R%d, R%d", Rm, Rn ); :}
nkeynes@359
   216
SHLL Rn          {: snprintf( buf, len, "SHLL    R%d", Rn ); :}
nkeynes@359
   217
SHLL2 Rn         {: snprintf( buf, len, "SHLL2   R%d", Rn ); :}
nkeynes@359
   218
SHLL8 Rn         {: snprintf( buf, len, "SHLL8   R%d", Rn ); :}
nkeynes@359
   219
SHLL16 Rn        {: snprintf( buf, len, "SHLL16  R%d", Rn ); :}
nkeynes@359
   220
SHLR Rn          {: snprintf( buf, len, "SHLR    R%d", Rn ); :}
nkeynes@359
   221
SHLR2 Rn         {: snprintf( buf, len, "SHLR2   R%d", Rn ); :}
nkeynes@359
   222
SHLR8 Rn         {: snprintf( buf, len, "SHLR8   R%d", Rn ); :}
nkeynes@359
   223
SHLR16 Rn        {: snprintf( buf, len, "SHLR16  R%d", Rn ); :}
nkeynes@359
   224
SLEEP            {: snprintf( buf, len, "SLEEP   " ); :}
nkeynes@359
   225
STC SR, Rn       {: snprintf( buf, len, "STC     SR, R%d", Rn ); :}
nkeynes@359
   226
STC GBR, Rn      {: snprintf( buf, len, "STC     GBR, R%d", Rn ); :}
nkeynes@359
   227
STC VBR, Rn      {: snprintf( buf, len, "STC     VBR, R%d", Rn ); :}
nkeynes@359
   228
STC SSR, Rn      {: snprintf( buf, len, "STC     SSR, R%d", Rn ); :}
nkeynes@359
   229
STC SPC, Rn      {: snprintf( buf, len, "STC     SPC, R%d", Rn ); :}
nkeynes@359
   230
STC SGR, Rn      {: snprintf( buf, len, "STC     SGR, R%d", Rn ); :}
nkeynes@359
   231
STC DBR, Rn      {: snprintf( buf, len, "STC     DBR, R%d", Rn ); :}
nkeynes@359
   232
STC Rm_BANK, Rn  {: snprintf( buf, len, "STC     R%d_BANK, R%d", Rm_BANK, Rn ); :}
nkeynes@359
   233
STS FPSCR, Rn    {: snprintf( buf, len, "STS     FPSCR, R%d", Rn ); :}
nkeynes@359
   234
STS FPUL, Rn     {: snprintf( buf, len, "STS     FPUL, R%d", Rn ); :}
nkeynes@359
   235
STS MACH, Rn     {: snprintf( buf, len, "STS     MACH, R%d", Rn ); :}
nkeynes@359
   236
STS MACL, Rn     {: snprintf( buf, len, "STS     MACL, R%d", Rn ); :}
nkeynes@359
   237
STS PR, Rn       {: snprintf( buf, len, "STS     PR, R%d", Rn ); :}
nkeynes@359
   238
STC.L SR, @-Rn   {: snprintf( buf, len, "STC.L   SR, @-R%d", Rn ); :}
nkeynes@359
   239
STC.L GBR, @-Rn  {: snprintf( buf, len, "STC.L   GBR, @-R%d", Rn ); :}
nkeynes@359
   240
STC.L VBR, @-Rn  {: snprintf( buf, len, "STC.L   VBR, @-R%d", Rn ); :}
nkeynes@359
   241
STC.L SSR, @-Rn  {: snprintf( buf, len, "STC.L   SSR, @-R%d", Rn ); :}
nkeynes@359
   242
STC.L SPC, @-Rn  {: snprintf( buf, len, "STC.L   SPC, @-R%d", Rn ); :}
nkeynes@359
   243
STC.L SGR, @-Rn  {: snprintf( buf, len, "STC.L   SGR, @-R%d", Rn ); :}
nkeynes@359
   244
STC.L DBR, @-Rn  {: snprintf( buf, len, "STC.L    DBR, @-R%d", Rn ); :}
nkeynes@359
   245
STC.L Rm_BANK, @-Rn {: snprintf( buf, len, "STC.L   @-R%d_BANK, @-R%d", Rm_BANK, Rn ); :}
nkeynes@359
   246
STS.L FPSCR, @-Rn{: snprintf( buf, len, "STS.L   FPSCR, @-R%d", Rn ); :}
nkeynes@359
   247
STS.L FPUL, @-Rn {: snprintf( buf, len, "STS.L   FPUL, @-R%d", Rn ); :}
nkeynes@359
   248
STS.L MACH, @-Rn {: snprintf( buf, len, "STS.L   MACH, @-R%d", Rn ); :}
nkeynes@359
   249
STS.L MACL, @-Rn {: snprintf( buf, len, "STS.L   MACL, @-R%d", Rn ); :}
nkeynes@359
   250
STS.L PR, @-Rn   {: snprintf( buf, len, "STS.L   PR, @-R%d", Rn ); :}
nkeynes@359
   251
SUB Rm, Rn       {: snprintf( buf, len, "SUB     R%d, R%d", Rm, Rn ); :}
nkeynes@359
   252
SUBC Rm, Rn      {: snprintf( buf, len, "SUBC    R%d, R%d", Rm, Rn ); :}
nkeynes@359
   253
SUBV Rm, Rn      {: snprintf( buf, len, "SUBV    R%d, R%d", Rm, Rn ); :}
nkeynes@359
   254
SWAP.B Rm, Rn    {: snprintf( buf, len, "SWAP.B  R%d, R%d", Rm, Rn ); :}
nkeynes@359
   255
SWAP.W Rm, Rn    {: snprintf( buf, len, "SWAP.W  R%d, R%d", Rm, Rn ); :}
nkeynes@359
   256
TAS.B @Rn        {: snprintf( buf, len, "TAS.B   R%d", Rn ); :}
nkeynes@359
   257
TRAPA #imm       {: snprintf( buf, len, "TRAPA   #%d", imm ); :}
nkeynes@359
   258
TST Rm, Rn       {: snprintf( buf, len, "TST     R%d, R%d", Rm, Rn ); :}
nkeynes@359
   259
TST #imm, R0     {: snprintf( buf, len, "TST     #%d, R0", imm ); :}
nkeynes@359
   260
TST.B #imm, @(R0, GBR) {: snprintf( buf, len, "TST.B   #%d, @(R0, GBR)", imm ); :}
nkeynes@359
   261
XOR Rm, Rn       {: snprintf( buf, len, "XOR     R%d, R%d", Rm, Rn ); :}
nkeynes@359
   262
XOR #imm, R0     {: snprintf( buf, len, "XOR     #%d, R0", imm ); :}
nkeynes@359
   263
XOR.B #imm, @(R0, GBR) {: snprintf( buf, len, "XOR.B   #%d, @(R0, GBR)", imm ); :}
nkeynes@359
   264
XTRCT Rm, Rn     {: snprintf( buf, len, "XTRCT   R%d, R%d", Rm, Rn ); :}
nkeynes@359
   265
UNDEF            {: snprintf( buf, len, "UNDEF   " ); :}
nkeynes@359
   266
%%
nkeynes@359
   267
    return pc+2;
nkeynes@359
   268
}
nkeynes@359
   269
nkeynes@359
   270
nkeynes@569
   271
void sh4_disasm_region( FILE *f, int from, int to )
nkeynes@359
   272
{
nkeynes@359
   273
    int pc;
nkeynes@359
   274
    char buf[80];
nkeynes@359
   275
    char opcode[16];
nkeynes@359
   276
    
nkeynes@359
   277
    for( pc = from; pc < to; pc+=2 ) {
nkeynes@359
   278
        buf[0] = '\0';
nkeynes@359
   279
        sh4_disasm_instruction( pc,
nkeynes@359
   280
                                buf, sizeof(buf), opcode );
nkeynes@359
   281
        fprintf( f, "  %08x:  %s  %s\n", pc, opcode, buf );
nkeynes@359
   282
    }
nkeynes@359
   283
}
nkeynes@706
   284
nkeynes@706
   285
void sh4_dump_region( int from, int to )
nkeynes@706
   286
{
nkeynes@706
   287
    sh4_disasm_region( stdout, from, to );
nkeynes@706
   288
}
.