]> Shamusworld >> Repos - virtualjaguar/blob - src/jagdasm.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / jagdasm.cpp
1 #include "include/jaguar.h"\r
2 \r
3 #define ROPCODE(a) jaguar_word_read(a)\r
4 \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
7 \r
8 char *condition[32] =\r
9 {\r
10         "",\r
11         "nz,",\r
12         "z,",\r
13         "???,",\r
14         "nc,",\r
15         "nc nz,",\r
16         "nc z,",\r
17         "???,",\r
18         "c,",\r
19         "c nz,",\r
20         "c z,",\r
21         "???,",\r
22         "???,",\r
23         "???,",\r
24         "???,",\r
25         "???,",\r
26 \r
27         "???,",\r
28         "???,",\r
29         "???,",\r
30         "???,",\r
31         "nn,",\r
32         "nn nz,",\r
33         "nn z,",\r
34         "???,",\r
35         "n,",\r
36         "n nz,",\r
37         "n z,",\r
38         "???,",\r
39         "???,",\r
40         "???,",\r
41         "???,",\r
42         "never,"\r
43 };\r
44         \r
45 \r
46 \r
47 char *signed_16bit(INT16 val)\r
48 {\r
49         static char temp[10];\r
50         if (val < 0)\r
51                 sprintf(temp, "-$%x", -val);\r
52         else\r
53                 sprintf(temp, "$%x", val);\r
54         return temp;\r
55 }\r
56 \r
57 unsigned dasmjag(int dsp_type, char *buffer, unsigned pc)\r
58 {\r
59         int op = ROPCODE(pc);\r
60         int reg1 = (op >> 5) & 31;\r
61         int reg2 = op & 31;\r
62         int size = 2;\r
63         \r
64         pc += 2;\r
65         switch (op >> 10)\r
66         {\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
101                                         else\r
102                                         sprintf(buffer, "subqmod $%x,r%d", convert_zero[reg1], reg2);\r
103                                         break;\r
104                 case 33:        if (dsp_type == JAGUAR_GPU)\r
105                                         sprintf(buffer, "sat16   r%d", reg2);\r
106                                         else\r
107                                         sprintf(buffer, "sat16s  r%d", reg2);\r
108                                         break;\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
119                                         else\r
120                                         sprintf(buffer, "sat32s  r%d", reg2);\r
121                                         break;\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
129                                         else\r
130                                         sprintf(buffer, "mirror  r%d", reg2);\r
131                                         break;\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
147                                         else\r
148                                         sprintf(buffer, "illegal");\r
149                                         break;\r
150                 case 63:        if (dsp_type == JAGUAR_GPU)\r
151                                         sprintf(buffer, reg1 ? \r
152                                                         "unpack  r%d" : \r
153                                                         "pack    r%d", reg2);\r
154                                         else\r
155                                         sprintf(buffer, "addqmod $%x,r%d", convert_zero[reg1], reg2);\r
156                                         break;\r
157         }\r
158         sprintf(buffer,"%s (0x%.4x)",buffer,op);\r
159         return size;\r
160 }\r