6 #define ROPCODE(a) JaguarReadWord(a)
8 uint8 convert_zero[32] =
9 { 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };
11 const char * condition[32] =
52 char * signed_16bit(int16 val)
57 sprintf(temp, "-$%X", -val);
59 sprintf(temp, "$%X", val);
64 unsigned dasmjag(int dsp_type, char * buffer, unsigned pc)
67 int reg1 = (op >> 5) & 31;
74 case 0: sprintf(buffer, "ADD R%02d,R%02d", reg1, reg2); break;
75 case 1: sprintf(buffer, "ADDC R%02d,R%02d", reg1, reg2); break;
76 case 2: sprintf(buffer, "ADDQ $%X,R%02d", convert_zero[reg1], reg2); break;
77 case 3: sprintf(buffer, "ADDQT $%X,R%02d", convert_zero[reg1], reg2); break;
78 case 4: sprintf(buffer, "SUB R%02d,R%02d", reg1, reg2); break;
79 case 5: sprintf(buffer, "SUBC R%02d,R%02d", reg1, reg2); break;
80 case 6: sprintf(buffer, "SUBQ $%X,R%02d", convert_zero[reg1], reg2); break;
81 case 7: sprintf(buffer, "SUBQT $%X,R%02d", convert_zero[reg1], reg2); break;
82 case 8: sprintf(buffer, "NEG R%02d", reg2); break;
83 case 9: sprintf(buffer, "AND R%02d,R%02d", reg1, reg2); break;
84 case 10: sprintf(buffer, "OR R%02d,R%02d", reg1, reg2); break;
85 case 11: sprintf(buffer, "XOR R%02d,R%02d", reg1, reg2); break;
86 case 12: sprintf(buffer, "NOT R%02d", reg2); break;
87 case 13: sprintf(buffer, "BTST $%X,R%02d", reg1, reg2); break;
88 case 14: sprintf(buffer, "BSET $%X,R%02d", reg1, reg2); break;
89 case 15: sprintf(buffer, "BCLR $%X,R%02d", reg1, reg2); break;
90 case 16: sprintf(buffer, "MULT R%02d,R%02d", reg1, reg2); break;
91 case 17: sprintf(buffer, "IMULT R%02d,R%02d", reg1, reg2); break;
92 case 18: sprintf(buffer, "IMULTN R%02d,R%02d", reg1, reg2); break;
93 case 19: sprintf(buffer, "RESMAC R%02d", reg2); break;
94 case 20: sprintf(buffer, "IMACN R%02d,R%02d", reg1, reg2); break;
95 case 21: sprintf(buffer, "DIV R%02d,R%02d", reg1, reg2); break;
96 case 22: sprintf(buffer, "ABS R%02d", reg2); break;
97 case 23: sprintf(buffer, "SH R%02d,R%02d", reg1, reg2); break;
98 case 24: sprintf(buffer, "SHLQ $%X,R%02d", 32 - convert_zero[reg1], reg2); break;
99 case 25: sprintf(buffer, "SHRQ $%X,R%02d", convert_zero[reg1], reg2); break;
100 case 26: sprintf(buffer, "SHA R%02d,R%02d", reg1, reg2); break;
101 case 27: sprintf(buffer, "SHARQ $%X,R%02d", convert_zero[reg1], reg2); break;
102 case 28: sprintf(buffer, "ROR R%02d,R%02d", reg1, reg2); break;
103 case 29: sprintf(buffer, "RORQ $%X,R%02d", convert_zero[reg1], reg2); break;
104 case 30: sprintf(buffer, "CMP R%02d,R%02d", reg1, reg2); break;
105 case 31: sprintf(buffer, "CMPQ %s,R%02d", signed_16bit((int16)(reg1 << 11) >> 11), reg2);break;
106 case 32: if (dsp_type == JAGUAR_GPU)
107 sprintf(buffer, "SAT8 R%02d", reg2);
109 sprintf(buffer, "SUBQMOD $%X,R%02d", convert_zero[reg1], reg2);
111 case 33: if (dsp_type == JAGUAR_GPU)
112 sprintf(buffer, "SAT16 R%02d", reg2);
114 sprintf(buffer, "SAT16S R%02d", reg2);
116 case 34: sprintf(buffer, "MOVE R%02d,R%02d", reg1, reg2); break;
117 case 35: sprintf(buffer, "MOVEQ %d,R%02d", reg1, reg2); break;
118 case 36: sprintf(buffer, "MOVETA R%02d,R%02d", reg1, reg2); break;
119 case 37: sprintf(buffer, "MOVEFA R%02d,R%02d", reg1, reg2); break;
120 case 38: sprintf(buffer, "MOVEI $%08X,R%02d", ROPCODE(pc) | (ROPCODE(pc+2)<<16), reg2); size = 6; break;
121 case 39: sprintf(buffer, "LOADB (R%02d),R%02d", reg1, reg2); break;
122 case 40: sprintf(buffer, "LOADW (R%02d),R%02d", reg1, reg2); break;
123 case 41: sprintf(buffer, "LOAD (R%02d),R%02d", reg1, reg2); break;
124 case 42: if (dsp_type == JAGUAR_GPU)
125 sprintf(buffer, "LOADP (R%02d),R%02d", reg1, reg2);
127 sprintf(buffer, "SAT32S R%02d", reg2);
129 case 43: sprintf(buffer, "LOAD (R14+$%X),R%02d", convert_zero[reg1]*4, reg2);break;
130 case 44: sprintf(buffer, "LOAD (R15+$%X),R%02d", convert_zero[reg1]*4, reg2);break;
131 case 45: sprintf(buffer, "STOREB R%02d,(R%02d)", reg2, reg1); break;
132 case 46: sprintf(buffer, "STOREW R%02d,(R%02d)", reg2, reg1); break;
133 case 47: sprintf(buffer, "STORE R%02d,(R%02d)", reg2, reg1); break;
134 case 48: if (dsp_type == JAGUAR_GPU)
135 sprintf(buffer, "STOREP R%02d,(R%02d)", reg2, reg1);
137 sprintf(buffer, "MIRROR R%02d", reg2);
139 case 49: sprintf(buffer, "STORE R%02d,(R14+$%X)", reg2, convert_zero[reg1]*4);break;
140 case 50: sprintf(buffer, "STORE R%02d,(R15+$%X)", reg2, convert_zero[reg1]*4);break;
141 case 51: sprintf(buffer, "MOVE PC,R%02d", reg2); break;
142 case 52: sprintf(buffer, "JUMP %s(R%02d)", condition[reg2], reg1); break;
143 case 53: sprintf(buffer, "JR %s%08X", condition[reg2], pc + ((int8)(reg1 << 3) >> 2)); break;
144 case 54: sprintf(buffer, "MMULT R%02d,R%02d", reg1, reg2); break;
145 case 55: sprintf(buffer, "MTOI R%02d,R%02d", reg1, reg2); break;
146 case 56: sprintf(buffer, "NORMI R%02d,R%02d", reg1, reg2); break;
147 case 57: sprintf(buffer, "NOP"); break;
148 case 58: sprintf(buffer, "LOAD (R14+R%02d),R%02d", reg1, reg2); break;
149 case 59: sprintf(buffer, "LOAD (R15+R%02d),R%02d", reg1, reg2); break;
150 case 60: sprintf(buffer, "STORE R%02d,(R14+R%02d)", reg2, reg1); break;
151 case 61: sprintf(buffer, "STORE R%02d,(R15+R%02d)", reg2, reg1); break;
152 case 62: if (dsp_type == JAGUAR_GPU)
153 sprintf(buffer, "SAT24 R%02d", reg2);
155 sprintf(buffer, "illegal");
157 case 63: if (dsp_type == JAGUAR_GPU)
158 sprintf(buffer, (reg1 ? "UNPACK R%02d" : "PACK R%02d"), reg2);
160 sprintf(buffer, "ADDQMOD $%X,R%02d", convert_zero[reg1], reg2);
163 sprintf(buffer,"%-24s (%04X)", buffer, op);