Create Xref-Html Frames Remove All Frames
file:/home/jivera/wd/pcsx/DisR3000A.c (Tue Nov 25 22:46:14 2003
)
1: /* Pcsx - Pc Psx Emulator
2: * Copyright (C) 1999-2003 Pcsx Team
3: *
4: * This program is free software; you can redistribute it and/or modify
5: * it under the terms of the GNU General Public License as published by
6: * the Free Software Foundation; either version 2 of the License, or
7: * (at your option) any later version.
8: *
9: * This program is distributed in the hope that it will be useful,
10: * but WITHOUT ANY WARRANTY; without even the implied warranty of
11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12: * GNU General Public License for more details.
13: *
14: * You should have received a copy of the GNU General Public License
15: * along with this program; if not, write to the Free Software
16: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17: */
18:
19: #include "Debug.h"
20:
21: char ostr[256];
22:
23: // Names of registers
24: static char *disRNameGPR[] = {
25: "r0", "at", "v0", "v1", "a0", "a1","a2", "a3",
26: "t0", "t1", "t2", "t3", "t4", "t5","t6", "t7",
27: "s0", "s1", "s2", "s3", "s4", "s5","s6", "s7",
28: "t8", "t9", "k0", "k1", "gp", "sp","fp", "ra"};
29:
30: char *disRNameCP0[] = {
31: "Index" , "Random" , "EntryLo0", "EntryLo1", "Context" , "PageMask" , "Wired" , "*Check me*",
32: "BadVAddr" , "Count" , "EntryHi" , "Compare" , "Status" , "Cause" , "ExceptPC" , "PRevID" ,
33: "Config" , "LLAddr" , "WatchLo" , "WatchHi" , "XContext", "*RES*" , "*RES*" , "*RES*" ,
34: "*RES*" , "*RES* " , "PErr" , "CacheErr", "TagLo" , "TagHi" , "ErrorEPC" , "*RES*" };
35:
36:
37: // Type deffinition of our functions
38:
39: typedef char* (*TdisR3000AF)(u32 code, u32 pc);
40:
41: // These macros are used to assemble the disassembler functions
42: #define MakeDisFg(fn, b) char* fn(u32 code, u32 pc) { b; return ostr; }
43: #define MakeDisF(fn, b) \
44: static char* fn(u32 code, u32 pc) { \
45: sprintf (ostr, "%8.8lx %8.8lx:", pc, code); \
46: b; /*ostr[(strlen(ostr) - 1)] = 0;*/ return ostr; \
47: }
48:
49:
50: #include "R3000A.h"
51:
52: #undef _Funct_
53: #undef _Rd_
54: #undef _Rt_
55: #undef _Rs_
56: #undef _Sa_
57: #undef _Im_
58: #undef _Target_
59:
60: #define _Funct_ ((code ) & 0x3F) // The funct part of the instruction register
61: #define _Rd_ ((code >> 11) & 0x1F) // The rd part of the instruction register
62: #define _Rt_ ((code >> 16) & 0x1F) // The rt part of the instruction register
63: #define _Rs_ ((code >> 21) & 0x1F) // The rs part of the instruction register
64: #define _Sa_ ((code >> 6) & 0x1F) // The sa part of the instruction register
65: #define _Im_ ( code & 0xFFFF) // The immediate part of the instruction register
66:
67: #define _Target_ ((pc & 0xf0000000) + ((code & 0x03ffffff) * 4))
68: #define _Branch_ (pc + 4 + ((short)_Im_ * 4))
69: #define _OfB_ _Im_, _nRs_
70:
71: #define dName(i) sprintf(ostr, "%s %-7s,", ostr, i)
72: #define dGPR(i) sprintf(ostr, "%s %8.8lx (%s),", ostr, psxRegs.GPR.r[i], disRNameGPR[i])
73: #define dCP0(i) sprintf(ostr, "%s %8.8lx (%s),", ostr, psxRegs.CP0.r[i], disRNameCP0[i])
74: #define dHI() sprintf(ostr, "%s %8.8lx (%s),", ostr, psxRegs.GPR.n.hi, "hi")
75: #define dLO() sprintf(ostr, "%s %8.8lx (%s),", ostr, psxRegs.GPR.n.lo, "lo")
76: #define dImm() sprintf(ostr, "%s %4.4lx (%ld),", ostr, _Im_, _Im_)
77: #define dTarget() sprintf(ostr, "%s %8.8lx,", ostr, _Target_)
78: #define dSa() sprintf(ostr, "%s %2.2lx (%ld),", ostr, _Sa_, _Sa_)
79: #define dOfB() sprintf(ostr, "%s %4.4lx (%8.8lx (%s)),", ostr, _Im_, psxRegs.GPR.r[_Rs_], disRNameGPR[_Rs_])
80: #define dOffset() sprintf(ostr, "%s %8.8lx,", ostr, _Branch_)
81: #define dCode() sprintf(ostr, "%s %8.8lx,", ostr, (code >> 6) & 0xffffff)
82:
83: /*********************************************************
84: * Arithmetic with immediate operand *
85: * Format: OP rt, rs, immediate *
86: *********************************************************/
87: MakeDisF(disADDI, dName("ADDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
88: MakeDisF(disADDIU, dName("ADDIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
89: MakeDisF(disANDI, dName("ANDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
90: MakeDisF(disORI, dName("ORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
91: MakeDisF(disSLTI, dName("SLTI"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
92: MakeDisF(disSLTIU, dName("SLTIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
93: MakeDisF(disXORI, dName("XORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();)
94:
95: /*********************************************************
96: * Register arithmetic *
97: * Format: OP rd, rs, rt *
98: *********************************************************/
99: MakeDisF(disADD, dName("ADD"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
100: MakeDisF(disADDU, dName("ADDU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
101: MakeDisF(disAND, dName("AND"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
102: MakeDisF(disNOR, dName("NOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
103: MakeDisF(disOR, dName("OR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
104: MakeDisF(disSLT, dName("SLT"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
105: MakeDisF(disSLTU, dName("SLTU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
106: MakeDisF(disSUB, dName("SUB"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
107: MakeDisF(disSUBU, dName("SUBU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
108: MakeDisF(disXOR, dName("XOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);)
109:
110: /*********************************************************
111: * Register arithmetic & Register trap logic *
112: * Format: OP rs, rt *
113: *********************************************************/
114: MakeDisF(disDIV, dName("DIV"); dGPR(_Rs_); dGPR(_Rt_);)
115: MakeDisF(disDIVU, dName("DIVU"); dGPR(_Rs_); dGPR(_Rt_);)
116: MakeDisF(disMULT, dName("MULT"); dGPR(_Rs_); dGPR(_Rt_);)
117: MakeDisF(disMULTU, dName("MULTU"); dGPR(_Rs_); dGPR(_Rt_);)
118:
119: /*********************************************************
120: * Register branch logic *
121: * Format: OP rs, offset *
122: *********************************************************/
123: MakeDisF(disBGEZ, dName("BGEZ"); dGPR(_Rs_); dOffset();)
124: MakeDisF(disBGEZAL, dName("BGEZAL"); dGPR(_Rs_); dOffset();)
125: MakeDisF(disBGTZ, dName("BGTZ"); dGPR(_Rs_); dOffset();)
126: MakeDisF(disBLEZ, dName("BLEZ"); dGPR(_Rs_); dOffset();)
127: MakeDisF(disBLTZ, dName("BLTZ"); dGPR(_Rs_); dOffset();)
128: MakeDisF(disBLTZAL, dName("BLTZAL"); dGPR(_Rs_); dOffset();)
129:
130: /*********************************************************
131: * Shift arithmetic with constant shift *
132: * Format: OP rd, rt, sa *
133: *********************************************************/
134: MakeDisF(disSLL, if (code) { dName("SLL"); dGPR(_Rd_); dGPR(_Rt_); dSa(); } else { dName("NOP"); })
135: MakeDisF(disSRA, dName("SRA"); dGPR(_Rd_); dGPR(_Rt_); dSa();)
136: MakeDisF(disSRL, dName("SRL"); dGPR(_Rd_); dGPR(_Rt_); dSa();)
137:
138: /*********************************************************
139: * Shift arithmetic with variant register shift *
140: * Format: OP rd, rt, rs *
141: *********************************************************/
142: MakeDisF(disSLLV, dName("SLLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);)
143: MakeDisF(disSRAV, dName("SRAV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);)
144: MakeDisF(disSRLV, dName("SRLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);)
145:
146: /*********************************************************
147: * Load higher 16 bits of the first word in GPR with imm *
148: * Format: OP rt, immediate *
149: *********************************************************/
150: MakeDisF(disLUI, dName("LUI"); dGPR(_Rt_); dImm();)
151:
152: /*********************************************************
153: * Move from HI/LO to GPR *
154: * Format: OP rd *
155: *********************************************************/
156: MakeDisF(disMFHI, dName("MFHI"); dGPR(_Rd_); dHI();)
157: MakeDisF(disMFLO, dName("MFLO"); dGPR(_Rd_); dLO();)
158:
159: /*********************************************************
160: * Move from GPR to HI/LO *
161: * Format: OP rd *
162: *********************************************************/
163: MakeDisF(disMTHI, dName("MTHI"); dHI(); dGPR(_Rs_);)
164: MakeDisF(disMTLO, dName("MTLO"); dLO(); dGPR(_Rs_);)
165:
166: /*********************************************************
167: * Special purpose instructions *
168: * Format: OP *
169: *********************************************************/
170: MakeDisF(disBREAK, dName("BREAK"))
171: MakeDisF(disRFE, dName("RFE"))
172: MakeDisF(disSYSCALL, dName("SYSCALL"))
173: MakeDisF(disHLE, dName("HLE"))
174:
175:
176: MakeDisF(disRTPS, dName("RTPS"))
177: MakeDisF(disOP , dName("OP"))
178: MakeDisF(disNCLIP, dName("NCLIP"))
179: MakeDisF(disDPCS, dName("DPCS"))
180: MakeDisF(disINTPL, dName("INTPL"))
181: MakeDisF(disMVMVA, dName("MVMVA"))
182: MakeDisF(disNCDS , dName("NCDS"))
183: MakeDisF(disCDP , dName("CDP"))
184: MakeDisF(disNCDT , dName("NCDT"))
185: MakeDisF(disNCCS , dName("NCCS"))
186: MakeDisF(disCC , dName("CC"))
187: MakeDisF(disNCS , dName("NCS"))
188: MakeDisF(disNCT , dName("NCT"))
189: MakeDisF(disSQR , dName("SQR"))
190: MakeDisF(disDCPL , dName("DCPL"))
191: MakeDisF(disDPCT , dName("DPCT"))
192: MakeDisF(disAVSZ3, dName("AVSZ3"))
193: MakeDisF(disAVSZ4, dName("AVSZ4"))
194: MakeDisF(disRTPT , dName("RTPT"))
195: MakeDisF(disGPF , dName("GPF"))
196: MakeDisF(disGPL , dName("GPL"))
197: MakeDisF(disNCCT , dName("NCCT"))
198:
199: MakeDisF(disMFC2, dName("MFC2"); dGPR(_Rt_);)
200: MakeDisF(disCFC2, dName("CFC2"); dGPR(_Rt_);)
201: MakeDisF(disMTC2, dName("MTC2"); dGPR(_Rt_);)
202: MakeDisF(disCTC2, dName("CTC2"); dGPR(_Rt_);)
203:
204: /*********************************************************
205: * Register branch logic *
206: * Format: OP rs, rt, offset *
207: *********************************************************/
208: MakeDisF(disBEQ, dName("BEQ"); dGPR(_Rs_); dGPR(_Rt_); dOffset();)
209: MakeDisF(disBNE, dName("BNE"); dGPR(_Rs_); dGPR(_Rt_); dOffset();)
210:
211: /*********************************************************
212: * Jump to target *
213: * Format: OP target *
214: *********************************************************/
215: MakeDisF(disJ, dName("J"); dTarget();)
216: MakeDisF(disJAL, dName("JAL"); dTarget(); dGPR(31);)
217:
218: /*********************************************************
219: * Register jump *
220: * Format: OP rs, rd *
221: *********************************************************/
222: MakeDisF(disJR, dName("JR"); dGPR(_Rs_);)
223: MakeDisF(disJALR, dName("JALR"); dGPR(_Rs_); dGPR(_Rd_))
224:
225: /*********************************************************
226: * Load and store for GPR *
227: * Format: OP rt, offset(base) *
228: *********************************************************/
229: MakeDisF(disLB, dName("LB"); dGPR(_Rt_); dOfB();)
230: MakeDisF(disLBU, dName("LBU"); dGPR(_Rt_); dOfB();)
231: MakeDisF(disLH, dName("LH"); dGPR(_Rt_); dOfB();)
232: MakeDisF(disLHU, dName("LHU"); dGPR(_Rt_); dOfB();)
233: MakeDisF(disLW, dName("LW"); dGPR(_Rt_); dOfB();)
234: MakeDisF(disLWL, dName("LWL"); dGPR(_Rt_); dOfB();)
235: MakeDisF(disLWR, dName("LWR"); dGPR(_Rt_); dOfB();)
236: MakeDisF(disLWC2, dName("LWC2"); dGPR(_Rt_); dOfB();)
237: MakeDisF(disSB, dName("SB"); dGPR(_Rt_); dOfB();)
238: MakeDisF(disSH, dName("SH"); dGPR(_Rt_); dOfB();)
239: MakeDisF(disSW, dName("SW"); dGPR(_Rt_); dOfB();)
240: MakeDisF(disSWL, dName("SWL"); dGPR(_Rt_); dOfB();)
241: MakeDisF(disSWR, dName("SWR"); dGPR(_Rt_); dOfB();)
242: MakeDisF(disSWC2, dName("SWC2"); dGPR(_Rt_); dOfB();)
243:
244: /*********************************************************
245: * Moves between GPR and COPx *
246: * Format: OP rt, fs *
247: *********************************************************/
248: MakeDisF(disMFC0, dName("MFC0"); dGPR(_Rt_); dCP0(_Rd_);)
249: MakeDisF(disMTC0, dName("MTC0"); dCP0(_Rd_); dGPR(_Rt_);)
250: MakeDisF(disCFC0, dName("CFC0"); dGPR(_Rt_); dCP0(_Rd_);)
251: MakeDisF(disCTC0, dName("CTC0"); dCP0(_Rd_); dGPR(_Rt_);)
252:
253: /*********************************************************
254: * Unknow instruction (would generate an exception) *
255: * Format: ? *
256: *********************************************************/
257: MakeDisF(disNULL, dName("*** Bad OP ***");)
258:
259:
260: TdisR3000AF disR3000A_SPECIAL[] = { // Subset of disSPECIAL
261: disSLL , disNULL , disSRL , disSRA , disSLLV , disNULL , disSRLV , disSRAV ,
262: disJR , disJALR , disNULL, disNULL, disSYSCALL, disBREAK , disNULL , disNULL ,
263: disMFHI, disMTHI , disMFLO, disMTLO, disNULL , disNULL , disNULL , disNULL ,
264: disMULT, disMULTU, disDIV , disDIVU, disNULL , disNULL , disNULL , disNULL ,
265: disADD , disADDU , disSUB , disSUBU, disAND , disOR , disXOR , disNOR ,
266: disNULL, disNULL , disSLT , disSLTU, disNULL , disNULL , disNULL , disNULL ,
267: disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL ,
268: disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL};
269:
270: MakeDisF(disSPECIAL, disR3000A_SPECIAL[_Funct_](code, pc))
271:
272: TdisR3000AF disR3000A_BCOND[] = { // Subset of disBCOND
273: disBLTZ , disBGEZ , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
274: disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
275: disBLTZAL, disBGEZAL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
276: disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL};
277:
278: MakeDisF(disBCOND, disR3000A_BCOND[_Rt_](code, pc))
279:
280: TdisR3000AF disR3000A_COP0[] = { // Subset of disCOP0
281: disMFC0, disNULL, disCFC0, disNULL, disMTC0, disNULL, disCTC0, disNULL,
282: disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
283: disRFE , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
284: disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL};
285:
286: MakeDisF(disCOP0, disR3000A_COP0[_Rs_](code, pc))
287:
288: TdisR3000AF disR3000A_BASIC[] = { // Subset of disBASIC (based on rs)
289: disMFC2, disNULL, disCFC2, disNULL, disMTC2, disNULL, disCTC2, disNULL,
290: disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
291: disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL,
292: disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL};
293:
294: MakeDisF(disBASIC, disR3000A_BASIC[_Rs_](code, pc))
295:
296: TdisR3000AF disR3000A_COP2[] = { // Subset of disR3000F_COP2 (based on funct)
297: disBASIC, disRTPS , disNULL , disNULL , disNULL, disNULL , disNCLIP, disNULL,
298: disNULL , disNULL , disNULL , disNULL , disOP , disNULL , disNULL , disNULL,
299: disDPCS , disINTPL, disMVMVA, disNCDS , disCDP , disNULL , disNCDT , disNULL,
300: disNULL , disNULL , disNULL , disNCCS , disCC , disNULL , disNCS , disNULL,
301: disNCT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL,
302: disSQR , disDCPL , disDPCT , disNULL , disNULL, disAVSZ3, disAVSZ4, disNULL,
303: disRTPT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL,
304: disNULL , disNULL , disNULL , disNULL , disNULL, disGPF , disGPL , disNCCT };
305:
306: MakeDisF(disCOP2, disR3000A_COP2[_Funct_](code, pc))
307:
308: TdisR3000AF disR3000A[] = {
309: disSPECIAL , disBCOND , disJ , disJAL , disBEQ , disBNE , disBLEZ , disBGTZ ,
310: disADDI , disADDIU , disSLTI , disSLTIU, disANDI, disORI , disXORI , disLUI ,
311: disCOP0 , disNULL , disCOP2 , disNULL , disNULL, disNULL, disNULL , disNULL ,
312: disNULL , disNULL , disNULL , disNULL , disNULL, disNULL, disNULL , disNULL ,
313: disLB , disLH , disLWL , disLW , disLBU , disLHU , disLWR , disNULL ,
314: disSB , disSH , disSWL , disSW , disNULL, disNULL, disSWR , disNULL ,
315: disNULL , disNULL , disLWC2 , disNULL , disNULL, disNULL, disNULL , disNULL ,
316: disNULL , disNULL , disSWC2 , disHLE , disNULL, disNULL, disNULL , disNULL };
317:
318: MakeDisFg(disR3000AF, disR3000A[code >> 26](code, pc))
319: /* arch-tag: Matthew Dempsky Wed Oct 15 10:34:13 CST 2003 (DisR3000A.c)
320: */
321:
Html form generated by Xrefactory version 1.6.4 on Fri Dec 12 20:52:56 2003
Trial version.