Mercurial > repos > blastem
annotate jagcpu.c @ 1093:4987fddd42a0
Initial stab at jaguar disassemler
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 30 Oct 2016 19:42:48 -0700 |
parents | |
children | 1dba006bad47 |
rev | line source |
---|---|
1093
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdint.h> |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stdio.h> |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #include "jagcpu.h" |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 char *gpu_mnemonics[] = { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 "add", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 "addc", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 "addq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 "addqt", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 "sub", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 "subc", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 "subq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 "subqt", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 "neg", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 "and", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 "or", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 "xor", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 "not", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 "btst", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 "bset", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 "bclr", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 "mult", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 "imult", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 "imultn", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 "resmac", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 "imacn", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 "div", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 "abs", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 "sh", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 "shlq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 "shrq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 "sha", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 "sharq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 "ror", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 "rorq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 "cmp", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 "cmpq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 "sat8", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 "sat16", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 "move", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 "moveq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 "moveta", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 "movefa", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 "movei", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 "loadb", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 "loadw", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 "load", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 "loadp", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 "load", //r14 relative |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 "load", //r15 relative |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 "storeb", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 "storew", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 "store", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 "storep", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 "store", //r14 relative |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 "store", //r15 relative |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 "move", //PC |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 "jump", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 "jr", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 "mmult", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 "mtoi", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 "normi", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 "nop", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 "load", //r14 indexed |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 "load", //r15 indexed |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 "store", //r14 indexed |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 "store", //r15 indexed |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 "sat24", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 "pack", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 "unpack" |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 }; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 char *dsp_mnemonics[DSP_ADDQMOD+1] = { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 [DSP_SUBQMOD] = "subqmod", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 [DSP_SAT16S] = "sat16s", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 [DSP_SAT32S] = "sat32s", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 [DSP_MIRROR] = "mirror", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 [DSP_ADDQMOD] = "addqmod" |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 }; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 void init_dsp_mnemonic_table() |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 static uint8_t init_done; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 if (init_done) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 return; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 for (int i = 0; i < DSP_ADDQMOD; i++) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 if (!dsp_mnemonics[i]) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 dsp_mnemonics[i] = gpu_mnemonics[i]; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 init_done = 1; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 uint16_t jag_opcode(uint16_t inst, uint8_t is_gpu) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 uint16_t opcode = inst >> 11; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 if (is_gpu && opcode == GPU_PACK && (inst & 0x20)) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 return GPU_UNPACK; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 return opcode; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 uint16_t jag_reg2(uint16_t inst) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 return inst & 0x1F; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 uint16_t jag_reg1(uint16_t inst) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 return inst >> 5 & 0x1F; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
113 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 //moveq and bit instructions should just use jag_reg1 instead |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 uint32_t jag_quick(uint16_t inst) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
118 uint32_t val = inst >> 5 & 0x1F; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 return val ? val : 32; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 uint8_t is_quick_1_32_opcode(uint16_t opcode, uint8_t is_gpu) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
124 return opcode == JAG_ADDQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
125 || opcode == JAG_ADDQT |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 || opcode == JAG_SUBQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 || opcode == JAG_SUBQT |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 || opcode == JAG_SHLQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 || opcode == JAG_SHRQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 || opcode == JAG_SHARQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 || opcode == JAG_RORQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 || (!is_gpu && ( |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 opcode == DSP_SUBQMOD |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 || opcode == DSP_ADDQMOD |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 )); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
136 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 uint8_t is_quick_0_31_opcode(uint16_t opcode) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 return opcode == JAG_MOVEQ |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 || opcode == JAG_BTST |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 || opcode == JAG_BSET |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 || opcode == JAG_BCLR; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
144 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
146 char * jag_cc_names[] = { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 "t", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 "ne", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 "eq", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 "cc", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 "hi", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 "eq_cc", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 "cs", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 "ne_cs", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
157 "eq_cs", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
158 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
159 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
160 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
161 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
162 "f" |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 "t_alt", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
164 "ne_alt", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 "eq_alt", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
166 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
167 "pl", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 "ne_pl", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 "eq_pl", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
170 "f", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
171 "mi", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
172 "ne_mi", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
173 "eq_mi" |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 }; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 char * jag_cc(uint16_t inst) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
177 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
178 uint16_t ccnum = jag_reg2(inst); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
179 if (ccnum >= sizeof(jag_cc_names)/sizeof(*jag_cc_names)) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
180 return jag_cc_names[3]; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
181 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
182 return jag_cc_names[ccnum]; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
184 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
185 uint32_t jag_jr_dest(uint16_t inst, uint32_t address) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
187 uint32_t rel = jag_reg1(inst); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
188 if (rel & 0x10) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 rel |= 0xFFFFFFE0; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
191 return address + 2 + rel; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
192 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
193 |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
194 int jag_cpu_disasm(uint16_t **stream, uint32_t address, char *dst, uint8_t is_gpu, uint8_t labels) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
195 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
196 uint16_t inst = **stream; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
197 *stream++; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
198 uint16_t opcode = jag_opcode(inst, is_gpu); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
199 char **mnemonics; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
200 if (is_gpu) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
201 mnemonics = gpu_mnemonics; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
202 } else { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
203 init_dsp_mnemonic_table(); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
204 mnemonics = dsp_mnemonics; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
205 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
206 switch (opcode) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
207 { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
208 case JAG_MOVEI: { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
209 uint32_t immed = **stream; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
210 *stream++; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
211 immed |= **stream << 16; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
212 *stream++; |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
213 return sprintf("%s $%X, r%d", mnemonics[opcode], immed, jag_reg2(inst)); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
215 case JAG_JR: |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
216 return sprintf( |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
217 labels ? "%s %s, ADR_%X" : "%s %s, $W%X", |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
218 mnemonics[opcode], jag_cc(inst), jag_jr_dest(inst, address) |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
219 ); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
220 case JAG_JUMP: |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
221 return sprintf("%s %s, (r%d)", mnemonics[opcode], jag_cc(inst), jag_reg1(inst)); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
222 default: |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
223 if (is_quick_1_32_opcode(opcode, is_gpu)) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
224 return sprintf("%s %d, r%d", mnemonics[opcode], jag_quick(inst), jag_reg2(inst)); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
225 } else if (is_quick_0_31_opcode(opcode)) { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
226 return sprintf("%s %d, r%d", mnemonics[opcode], jag_reg1(inst), jag_reg2(inst)); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
227 } else { |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 return sprintf("%s r%d, r%d", mnemonics[opcode], jag_reg1(inst), jag_reg2(inst)); |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
229 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
230 } |
4987fddd42a0
Initial stab at jaguar disassemler
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
231 } |