1 #include "include/jaguar.h"
\r
3 #define ROPCODE(a) jaguar_word_read(a)
\r
5 uint8 convert_zero[32] =
\r
6 { 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 };
\r
8 char *condition[32] =
\r
47 char *signed_16bit(INT16 val)
\r
49 static char temp[10];
\r
51 sprintf(temp, "-$%x", -val);
\r
53 sprintf(temp, "$%x", val);
\r
57 unsigned dasmjag(int dsp_type, char *buffer, unsigned pc)
\r
59 int op = ROPCODE(pc);
\r
60 int reg1 = (op >> 5) & 31;
\r
67 case 0: sprintf(buffer, "add r%d,r%d", reg1, reg2); break;
\r
68 case 1: sprintf(buffer, "addc r%d,r%d", reg1, reg2); break;
\r
69 case 2: sprintf(buffer, "addq $%x,r%d", convert_zero[reg1], reg2); break;
\r
70 case 3: sprintf(buffer, "addqt $%x,r%d", convert_zero[reg1], reg2); break;
\r
71 case 4: sprintf(buffer, "sub r%d,r%d", reg1, reg2); break;
\r
72 case 5: sprintf(buffer, "subc r%d,r%d", reg1, reg2); break;
\r
73 case 6: sprintf(buffer, "subq $%x,r%d", convert_zero[reg1], reg2); break;
\r
74 case 7: sprintf(buffer, "subqt $%x,r%d", convert_zero[reg1], reg2); break;
\r
75 case 8: sprintf(buffer, "neg r%d", reg2); break;
\r
76 case 9: sprintf(buffer, "and r%d,r%d", reg1, reg2); break;
\r
77 case 10: sprintf(buffer, "or r%d,r%d", reg1, reg2); break;
\r
78 case 11: sprintf(buffer, "xor r%d,r%d", reg1, reg2); break;
\r
79 case 12: sprintf(buffer, "not r%d", reg2); break;
\r
80 case 13: sprintf(buffer, "btst $%x,r%d", reg1, reg2); break;
\r
81 case 14: sprintf(buffer, "bset $%x,r%d", reg1, reg2); break;
\r
82 case 15: sprintf(buffer, "bclr $%x,r%d", reg1, reg2); break;
\r
83 case 16: sprintf(buffer, "mult r%d,r%d", reg1, reg2); break;
\r
84 case 17: sprintf(buffer, "imult r%d,r%d", reg1, reg2); break;
\r
85 case 18: sprintf(buffer, "imultn r%d,r%d", reg1, reg2); break;
\r
86 case 19: sprintf(buffer, "resmac r%d", reg2); break;
\r
87 case 20: sprintf(buffer, "imacn r%d,r%d", reg1, reg2); break;
\r
88 case 21: sprintf(buffer, "div r%d,r%d", reg1, reg2); break;
\r
89 case 22: sprintf(buffer, "abs r%d", reg2); break;
\r
90 case 23: sprintf(buffer, "sh r%d,r%d", reg1, reg2); break;
\r
91 case 24: sprintf(buffer, "shlq $%x,r%d", 32 - convert_zero[reg1], reg2); break;
\r
92 case 25: sprintf(buffer, "shrq $%x,r%d", convert_zero[reg1], reg2); break;
\r
93 case 26: sprintf(buffer, "sha r%d,r%d", reg1, reg2); break;
\r
94 case 27: sprintf(buffer, "sharq $%x,r%d", convert_zero[reg1], reg2); break;
\r
95 case 28: sprintf(buffer, "ror r%d,r%d", reg1, reg2); break;
\r
96 case 29: sprintf(buffer, "rorq $%x,r%d", convert_zero[reg1], reg2); break;
\r
97 case 30: sprintf(buffer, "cmp r%d,r%d", reg1, reg2); break;
\r
98 case 31: sprintf(buffer, "cmpq %s,r%d", signed_16bit((INT16)(reg1 << 11) >> 11), reg2);break;
\r
99 case 32: if (dsp_type == JAGUAR_GPU)
\r
100 sprintf(buffer, "sat8 r%d", reg2);
\r
102 sprintf(buffer, "subqmod $%x,r%d", convert_zero[reg1], reg2);
\r
104 case 33: if (dsp_type == JAGUAR_GPU)
\r
105 sprintf(buffer, "sat16 r%d", reg2);
\r
107 sprintf(buffer, "sat16s r%d", reg2);
\r
109 case 34: sprintf(buffer, "move r%d,r%d", reg1, reg2); break;
\r
110 case 35: sprintf(buffer, "moveq %d,r%d", reg1, reg2); break;
\r
111 case 36: sprintf(buffer, "moveta r%d,r%d", reg1, reg2); break;
\r
112 case 37: sprintf(buffer, "movefa r%d,r%d", reg1, reg2); break;
\r
113 case 38: sprintf(buffer, "movei $%x,r%d", ROPCODE(pc) | (ROPCODE(pc+2)<<16), reg2); size = 6; break;
\r
114 case 39: sprintf(buffer, "loadb (r%d),r%d", reg1, reg2); break;
\r
115 case 40: sprintf(buffer, "loadw (r%d),r%d", reg1, reg2); break;
\r
116 case 41: sprintf(buffer, "load (r%d),r%d", reg1, reg2); break;
\r
117 case 42: if (dsp_type == JAGUAR_GPU)
\r
118 sprintf(buffer, "loadp (r%d),r%d", reg1, reg2);
\r
120 sprintf(buffer, "sat32s r%d", reg2);
\r
122 case 43: sprintf(buffer, "load (r14+$%x),r%d", convert_zero[reg1]*4, reg2);break;
\r
123 case 44: sprintf(buffer, "load (r15+$%x),r%d", convert_zero[reg1]*4, reg2);break;
\r
124 case 45: sprintf(buffer, "storeb r%d,(r%d)", reg2, reg1); break;
\r
125 case 46: sprintf(buffer, "storew r%d,(r%d)", reg2, reg1); break;
\r
126 case 47: sprintf(buffer, "store r%d,(r%d)", reg2, reg1); break;
\r
127 case 48: if (dsp_type == JAGUAR_GPU)
\r
128 sprintf(buffer, "storep r%d,(r%d)", reg2, reg1);
\r
130 sprintf(buffer, "mirror r%d", reg2);
\r
132 case 49: sprintf(buffer, "store r%d,(r14+$%x)", reg2, convert_zero[reg1]*4);break;
\r
133 case 50: sprintf(buffer, "store r%d,(r15+$%x)", reg2, convert_zero[reg1]*4);break;
\r
134 case 51: sprintf(buffer, "move pc,r%d", reg2); break;
\r
135 case 52: sprintf(buffer, "jump %s(r%d)", condition[reg2], reg1); break;
\r
136 case 53: sprintf(buffer, "jr %s%08X", condition[reg2], pc + ((INT8)(reg1 << 3) >> 2)); break;
\r
137 case 54: sprintf(buffer, "mmult r%d,r%d", reg1, reg2); break;
\r
138 case 55: sprintf(buffer, "mtoi r%d,r%d", reg1, reg2); break;
\r
139 case 56: sprintf(buffer, "normi r%d,r%d", reg1, reg2); break;
\r
140 case 57: sprintf(buffer, "nop"); break;
\r
141 case 58: sprintf(buffer, "load (r14+r%d),r%d", reg1, reg2); break;
\r
142 case 59: sprintf(buffer, "load (r15+r%d),r%d", reg1, reg2); break;
\r
143 case 60: sprintf(buffer, "store r%d,(r14+r%d)", reg2, reg1); break;
\r
144 case 61: sprintf(buffer, "store r%d,(r15+r%d)", reg2, reg1); break;
\r
145 case 62: if (dsp_type == JAGUAR_GPU)
\r
146 sprintf(buffer, "sat24 r%d", reg2);
\r
148 sprintf(buffer, "illegal");
\r
150 case 63: if (dsp_type == JAGUAR_GPU)
\r
151 sprintf(buffer, reg1 ?
\r
155 sprintf(buffer, "addqmod $%x,r%d", convert_zero[reg1], reg2);
\r
158 sprintf(buffer,"%s (0x%.4x)",buffer,op);
\r