+#include <stdio.h>\r
+#include "sh2dasm.h"\r
+\r
+typedef int INT32;\r
+typedef unsigned int UINT32;\r
+typedef unsigned short UINT16;\r
+typedef unsigned char UINT8;\r
+\r
+#define DASMFLAG_STEP_OUT 0\r
+#define DASMFLAG_STEP_OVER 0\r
+#define DASMFLAG_STEP_OVER_EXTRA(x) 0\r
+\r
+#define SIGNX8(x) (((INT32)(x) << 24) >> 24)\r
+#define SIGNX12(x) (((INT32)(x) << 20) >> 20)\r
+\r
+#define Rn ((opcode >> 8) & 15)\r
+#define Rm ((opcode >> 4) & 15)\r
+\r
+static const char *const regname[16] = {\r
+ "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",\r
+ "R8", "R9", "R10","R11","R12","R13","R14","SP"\r
+};\r
+\r
+static UINT32 op0000(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ UINT32 flags = 0;\r
+ switch(opcode & 0x3f)\r
+ {\r
+ case 0x02:\r
+ sprintf(buffer,"STC SR,%s", regname[Rn]);\r
+ break;\r
+ case 0x03:\r
+ sprintf(buffer,"BSRF %s", regname[Rn]);\r
+ break;\r
+ case 0x08:\r
+ sprintf(buffer,"CLRT");\r
+ break;\r
+ case 0x09:\r
+ sprintf(buffer,"NOP");\r
+ break;\r
+ case 0x0A:\r
+ sprintf(buffer,"STS MACH,%s", regname[Rn]);\r
+ break;\r
+ case 0x0B:\r
+ sprintf(buffer,"RTS");\r
+ flags = DASMFLAG_STEP_OUT;\r
+ break;\r
+ case 0x12:\r
+ sprintf(buffer,"STS GBR,%s", regname[Rn]);\r
+ break;\r
+ case 0x18:\r
+ sprintf(buffer,"SETT");\r
+ break;\r
+ case 0x19:\r
+ sprintf(buffer,"DIV0U");\r
+ break;\r
+ case 0x1A:\r
+ sprintf(buffer,"STS MACL,%s", regname[Rn]);\r
+ break;\r
+ case 0x1B:\r
+ sprintf(buffer,"SLEEP");\r
+ break;\r
+ case 0x22:\r
+ sprintf(buffer,"STC VBR,%s", regname[Rn]);\r
+ break;\r
+ case 0x23:\r
+ sprintf(buffer,"BRAF %s", regname[Rn]);\r
+ break;\r
+ case 0x28:\r
+ sprintf(buffer,"CLRMAC");\r
+ break;\r
+ case 0x29:\r
+ sprintf(buffer,"MOVT %s", regname[Rn]);\r
+ break;\r
+ case 0x2A:\r
+ sprintf(buffer,"STS PR,%s", regname[Rn]);\r
+ break;\r
+ case 0x2B:\r
+ sprintf(buffer,"RTE");\r
+ flags = DASMFLAG_STEP_OUT;\r
+ break;\r
+ default:\r
+ switch(opcode & 15)\r
+ {\r
+ case 0:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 1:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 2:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 3:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 4:\r
+ sprintf(buffer, "MOV.B %s,@(R0,%s)", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 5:\r
+ sprintf(buffer, "MOV.W %s,@(R0,%s)", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 6:\r
+ sprintf(buffer, "MOV.L %s,@(R0,%s)", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 7:\r
+ sprintf(buffer, "MUL.L %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 8:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 9:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 10:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 11:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 12:\r
+ sprintf(buffer, "MOV.B @(R0,%s),%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 13:\r
+ sprintf(buffer, "MOV.W @(R0,%s),%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 14:\r
+ sprintf(buffer, "MOV.L @(R0,%s),%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 15:\r
+ sprintf(buffer, "MAC.L @%s+,@%s+", regname[Rn], regname[Rm]);\r
+ break;\r
+ }\r
+ }\r
+ return flags;\r
+}\r
+\r
+static UINT32 op0001(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "MOV.L %s,@($%02X,%s)", regname[Rm], (opcode & 15) * 4, regname[Rn]);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op0010(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ switch (opcode & 15)\r
+ {\r
+ case 0:\r
+ sprintf(buffer, "MOV.B %s,@%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 1:\r
+ sprintf(buffer, "MOV.W %s,@%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 2:\r
+ sprintf(buffer, "MOV.L %s,@%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 3:\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ break;\r
+ case 4:\r
+ sprintf(buffer, "MOV.B %s,@-%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 5:\r
+ sprintf(buffer, "MOV.W %s,@-%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 6:\r
+ sprintf(buffer, "MOV.L %s,@-%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 7:\r
+ sprintf(buffer, "DIV0S %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 8:\r
+ sprintf(buffer, "TST %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 9:\r
+ sprintf(buffer, "AND %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 10:\r
+ sprintf(buffer, "XOR %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 11:\r
+ sprintf(buffer, "OR %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 12:\r
+ sprintf(buffer, "CMP/STR %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 13:\r
+ sprintf(buffer, "XTRCT %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 14:\r
+ sprintf(buffer, "MULU.W %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 15:\r
+ sprintf(buffer, "MULS.W %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static UINT32 op0011(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ switch (opcode & 15)\r
+ {\r
+ case 0:\r
+ sprintf(buffer, "CMP/EQ %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 1:\r
+ sprintf(buffer, "?????? %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 2:\r
+ sprintf(buffer, "CMP/HS %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 3:\r
+ sprintf(buffer, "CMP/GE %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 4:\r
+ sprintf(buffer, "DIV1 %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 5:\r
+ sprintf(buffer, "DMULU.L %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 6:\r
+ sprintf(buffer, "CMP/HI %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 7:\r
+ sprintf(buffer, "CMP/GT %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 8:\r
+ sprintf(buffer, "SUB %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 9:\r
+ sprintf(buffer, "?????? %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 10:\r
+ sprintf(buffer, "SUBC %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 11:\r
+ sprintf(buffer, "SUBV %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 12:\r
+ sprintf(buffer, "ADD %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 13:\r
+ sprintf(buffer, "DMULS.L %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 14:\r
+ sprintf(buffer, "ADDC %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 15:\r
+ sprintf(buffer, "ADDV %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static UINT32 op0100(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ UINT32 flags = 0;\r
+ switch(opcode & 0x3F)\r
+ {\r
+ case 0x00:\r
+ sprintf(buffer, "SHLL %s", regname[Rn]);\r
+ break;\r
+ case 0x01:\r
+ sprintf(buffer, "SHLR %s", regname[Rn]);\r
+ break;\r
+ case 0x02:\r
+ sprintf(buffer, "STS.L MACH,@-%s", regname[Rn]);\r
+ break;\r
+ case 0x03:\r
+ sprintf(buffer, "STC.L SR,@-%s", regname[Rn]);\r
+ break;\r
+ case 0x04:\r
+ sprintf(buffer, "ROTL %s", regname[Rn]);\r
+ break;\r
+ case 0x05:\r
+ sprintf(buffer, "ROTR %s", regname[Rn]);\r
+ break;\r
+ case 0x06:\r
+ sprintf(buffer, "LDS.L @%s+,MACH", regname[Rn]);\r
+ break;\r
+ case 0x07:\r
+ sprintf(buffer, "LDC.L @%s+,SR", regname[Rn]);\r
+ break;\r
+ case 0x08:\r
+ sprintf(buffer, "SHLL2 %s", regname[Rn]);\r
+ break;\r
+ case 0x09:\r
+ sprintf(buffer, "SHLR2 %s", regname[Rn]);\r
+ break;\r
+ case 0x0a:\r
+ sprintf(buffer, "LDS %s,MACH", regname[Rn]);\r
+ break;\r
+ case 0x0b:\r
+ sprintf(buffer, "JSR %s", regname[Rn]);\r
+ flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1);\r
+ break;\r
+ case 0x0e:\r
+ sprintf(buffer, "LDC %s,SR", regname[Rn]);\r
+ break;\r
+ case 0x10:\r
+ sprintf(buffer, "DT %s", regname[Rn]);\r
+ break;\r
+ case 0x11:\r
+ sprintf(buffer, "CMP/PZ %s", regname[Rn]);\r
+ break;\r
+ case 0x12:\r
+ sprintf(buffer, "STS.L MACL,@-%s", regname[Rn]);\r
+ break;\r
+ case 0x13:\r
+ sprintf(buffer, "STC.L GBR,@-%s", regname[Rn]);\r
+ break;\r
+ case 0x15:\r
+ sprintf(buffer, "CMP/PL %s", regname[Rn]);\r
+ break;\r
+ case 0x16:\r
+ sprintf(buffer, "LDS.L @%s+,MACL", regname[Rn]);\r
+ break;\r
+ case 0x17:\r
+ sprintf(buffer, "LDC.L @%s+,GBR", regname[Rn]);\r
+ break;\r
+ case 0x18:\r
+ sprintf(buffer, "SHLL8 %s", regname[Rn]);\r
+ break;\r
+ case 0x19:\r
+ sprintf(buffer, "SHLR8 %s", regname[Rn]);\r
+ break;\r
+ case 0x1a:\r
+ sprintf(buffer, "LDS %s,MACL", regname[Rn]);\r
+ break;\r
+ case 0x1b:\r
+ sprintf(buffer, "TAS %s", regname[Rn]);\r
+ break;\r
+ case 0x1e:\r
+ sprintf(buffer, "LDC %s,GBR", regname[Rn]);\r
+ break;\r
+ case 0x20:\r
+ sprintf(buffer, "SHAL %s", regname[Rn]);\r
+ break;\r
+ case 0x21:\r
+ sprintf(buffer, "SHAR %s", regname[Rn]);\r
+ break;\r
+ case 0x22:\r
+ sprintf(buffer, "STS.L PR,@-%s", regname[Rn]);\r
+ break;\r
+ case 0x23:\r
+ sprintf(buffer, "STC.L VBR,@-%s", regname[Rn]);\r
+ break;\r
+ case 0x24:\r
+ sprintf(buffer, "ROTCL %s", regname[Rn]);\r
+ break;\r
+ case 0x25:\r
+ sprintf(buffer, "ROTCR %s", regname[Rn]);\r
+ break;\r
+ case 0x26:\r
+ sprintf(buffer, "LDS.L @%s+,PR", regname[Rn]);\r
+ break;\r
+ case 0x27:\r
+ sprintf(buffer, "LDC.L @%s+,VBR", regname[Rn]);\r
+ break;\r
+ case 0x28:\r
+ sprintf(buffer, "SHLL16 %s", regname[Rn]);\r
+ break;\r
+ case 0x29:\r
+ sprintf(buffer, "SHLR16 %s", regname[Rn]);\r
+ break;\r
+ case 0x2a:\r
+ sprintf(buffer, "LDS %s,PR", regname[Rn]);\r
+ break;\r
+ case 0x2b:\r
+ sprintf(buffer, "JMP %s", regname[Rn]);\r
+ break;\r
+ case 0x2e:\r
+ sprintf(buffer, "LDC %s,VBR", regname[Rn]);\r
+ break;\r
+ default:\r
+ if ((opcode & 15) == 15)\r
+ sprintf(buffer, "MAC.W @%s+,@%s+", regname[Rm], regname[Rn]);\r
+ else\r
+ sprintf(buffer, "?????? $%04X", opcode);\r
+ }\r
+ return flags;\r
+}\r
+\r
+static UINT32 op0101(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "MOV.L @($%02X,%s),%s", (opcode & 15) * 4, regname[Rm], regname[Rn]);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op0110(char *buffer, UINT32 pc, UINT16 opcode)\r
+\r
+{\r
+ switch(opcode & 0xF)\r
+ {\r
+ case 0x00:\r
+ sprintf(buffer, "MOV.B @%s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x01:\r
+ sprintf(buffer, "MOV.W @%s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x02:\r
+ sprintf(buffer, "MOV.L @%s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x03:\r
+ sprintf(buffer, "MOV %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x04:\r
+ sprintf(buffer, "MOV.B @%s+,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x05:\r
+ sprintf(buffer, "MOV.W @%s+,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x06:\r
+ sprintf(buffer, "MOV.L @%s+,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x07:\r
+ sprintf(buffer, "NOT %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x08:\r
+ sprintf(buffer, "SWAP.B %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x09:\r
+ sprintf(buffer, "SWAP.W %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x0a:\r
+ sprintf(buffer, "NEGC %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x0b:\r
+ sprintf(buffer, "NEG %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x0c:\r
+ sprintf(buffer, "EXTU.B %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x0d:\r
+ sprintf(buffer, "EXTU.W %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x0e:\r
+ sprintf(buffer, "EXTS.B %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ case 0x0f:\r
+ sprintf(buffer, "EXTS.W %s,%s", regname[Rm], regname[Rn]);\r
+ break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static UINT32 op0111(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "ADD #$%02X,%s", opcode & 0xff, regname[Rn]);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op1000(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ switch((opcode >> 8) & 15)\r
+ {\r
+ case 0:\r
+ sprintf(buffer, "MOV.B R0,@($%02X,%s)", (opcode & 15), regname[Rm]);\r
+ break;\r
+ case 1:\r
+ sprintf(buffer, "MOV.W R0,@($%02X,%s)", (opcode & 15) * 2, regname[Rm]);\r
+ break;\r
+ case 4:\r
+ sprintf(buffer, "MOV.B @($%02X,%s),R0", (opcode & 15), regname[Rm]);\r
+ break;\r
+ case 5:\r
+ sprintf(buffer, "MOV.W @($%02X,%s),R0", (opcode & 15), regname[Rm]);\r
+ break;\r
+ case 8:\r
+ sprintf(buffer, "CMP/EQ #$%02X,R0", (opcode & 0xff));\r
+ break;\r
+ case 9:\r
+ sprintf(buffer, "BT $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2);\r
+ break;\r
+ case 11:\r
+ sprintf(buffer, "BF $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2);\r
+ break;\r
+ case 13:\r
+ sprintf(buffer, "BTS $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2);\r
+ break;\r
+ case 15:\r
+ sprintf(buffer, "BFS $%08X", pc + SIGNX8(opcode & 0xff) * 2 + 2);\r
+ break;\r
+ default :\r
+ sprintf(buffer, "invalid $%04X", opcode);\r
+ }\r
+ return 0;\r
+}\r
+\r
+static UINT32 op1001(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "MOV.W @($%04X,PC),%s", (opcode & 0xff) * 2, regname[Rn]);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op1010(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "BRA $%08X", SIGNX12(opcode & 0xfff) * 2 + pc + 2);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op1011(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "BSR $%08X", SIGNX12(opcode & 0xfff) * 2 + pc + 2);\r
+ return DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1);\r
+}\r
+\r
+static UINT32 op1100(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ UINT32 flags = 0;\r
+ switch((opcode >> 8) & 15)\r
+ {\r
+ case 0:\r
+ sprintf(buffer, "MOV.B R0,@($%02X,GBR)", opcode & 0xff);\r
+ break;\r
+ case 1:\r
+ sprintf(buffer, "MOV.W R0,@($%04X,GBR)", (opcode & 0xff) * 2);\r
+ break;\r
+ case 2:\r
+ sprintf(buffer, "MOV.L R0,@($%04X,GBR)", (opcode & 0xff) * 4);\r
+ break;\r
+ case 3:\r
+ sprintf(buffer, "TRAPA #$%02X", opcode & 0xff);\r
+ flags = DASMFLAG_STEP_OVER;\r
+ break;\r
+ case 4:\r
+ sprintf(buffer, "MOV.B @($%02X,GBR),R0", opcode & 0xff);\r
+ break;\r
+ case 5:\r
+ sprintf(buffer, "MOV.W @($%04X,GBR),R0", (opcode & 0xff) * 2);\r
+ break;\r
+ case 6:\r
+ sprintf(buffer, "MOV.L @($%04X,GBR),R0", (opcode & 0xff) * 4);\r
+ break;\r
+ case 7:\r
+ sprintf(buffer, "MOVA @($%04X,PC),R0", (opcode & 0xff) * 4);\r
+ break;\r
+ case 8:\r
+ sprintf(buffer, "TST #$%02X,R0", opcode & 0xff);\r
+ break;\r
+ case 9:\r
+ sprintf(buffer, "AND #$%02X,R0", opcode & 0xff);\r
+ break;\r
+ case 10:\r
+ sprintf(buffer, "XOR #$%02X,R0", opcode & 0xff);\r
+ break;\r
+ case 11:\r
+ sprintf(buffer, "OR #$%02X,R0", opcode & 0xff);\r
+ break;\r
+ case 12:\r
+ sprintf(buffer, "TST.B #$%02X,@(R0,GBR)", opcode & 0xff);\r
+ break;\r
+ case 13:\r
+ sprintf(buffer, "AND.B #$%02X,@(R0,GBR)", opcode & 0xff);\r
+ break;\r
+ case 14:\r
+ sprintf(buffer, "XOR.B #$%02X,@(R0,GBR)", opcode & 0xff);\r
+ break;\r
+ case 15:\r
+ sprintf(buffer, "OR.B #$%02X,@(R0,GBR)", opcode & 0xff);\r
+ break;\r
+ }\r
+ return flags;\r
+}\r
+\r
+static UINT32 op1101(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "MOV.L @($%02X,PC),%s ; #$%06x", (opcode * 4) & 0x3ff, regname[Rn],\r
+ (pc + ((opcode * 4) & 0x3ff) + 2) & ~3);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op1110(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "MOV #$%02X,%s", (opcode & 0xff), regname[Rn]);\r
+ return 0;\r
+}\r
+\r
+static UINT32 op1111(char *buffer, UINT32 pc, UINT16 opcode)\r
+{\r
+ sprintf(buffer, "unknown $%04X", opcode);\r
+ return 0;\r
+}\r
+\r
+unsigned DasmSH2(char *buffer, unsigned pc, UINT16 opcode)\r
+{\r
+ UINT32 flags;\r
+\r
+ pc += 2;\r
+\r
+ switch((opcode >> 12) & 15)\r
+ {\r
+ case 0: flags = op0000(buffer,pc,opcode); break;\r
+ case 1: flags = op0001(buffer,pc,opcode); break;\r
+ case 2: flags = op0010(buffer,pc,opcode); break;\r
+ case 3: flags = op0011(buffer,pc,opcode); break;\r
+ case 4: flags = op0100(buffer,pc,opcode); break;\r
+ case 5: flags = op0101(buffer,pc,opcode); break;\r
+ case 6: flags = op0110(buffer,pc,opcode); break;\r
+ case 7: flags = op0111(buffer,pc,opcode); break;\r
+ case 8: flags = op1000(buffer,pc,opcode); break;\r
+ case 9: flags = op1001(buffer,pc,opcode); break;\r
+ case 10: flags = op1010(buffer,pc,opcode); break;\r
+ case 11: flags = op1011(buffer,pc,opcode); break;\r
+ case 12: flags = op1100(buffer,pc,opcode); break;\r
+ case 13: flags = op1101(buffer,pc,opcode); break;\r
+ case 14: flags = op1110(buffer,pc,opcode); break;\r
+ default: flags = op1111(buffer,pc,opcode); break;\r
+ }\r
+ return 0;//2 | flags | DASMFLAG_SUPPORTED;\r
+}\r
+\r
+#if 0\r
+\r
+#define swab32(x) (((x) << 24) | (((x) << 8) & 0xff0000) | (((x) >> 8) & 0xff00) | ((x) >> 24))\r
+#define swab16(x) ((((x) << 8) & 0xff00) | (((x) >> 8) & 0x00ff))\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+ unsigned short op;\r
+ char buff[256];\r
+ unsigned pc;\r
+ FILE *f;\r
+ int ret;\r
+\r
+ if (argv[1] == NULL) {\r
+ printf("usage\n%s <file>\n", argv[0]);\r
+ return 1;\r
+ }\r
+\r
+ f = fopen(argv[1], "rb");\r
+ if (f == NULL) {\r
+ fprintf(stderr, "can't open %s\n", argv[1]);\r
+ return 1;\r
+ }\r
+\r
+ for (pc = 0x140;; pc += 2)\r
+ {\r
+ fseek(f, pc, SEEK_SET);\r
+\r
+ ret = fread(&op, 1, sizeof(op), f);\r
+ if (ret != sizeof(op))\r
+ break;\r
+\r
+ DasmSH2(buff, pc, swab16(op));\r
+ printf("%06x %04x %s\n", pc, swab16(op), buff);\r
+ }\r
+\r
+ fclose(f);\r
+ return 0;\r
+}\r
+\r
+#endif\r