/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2002-2003 Pcsx2 Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "Debug.h" #include "VU.h" long jumpMode; char ostr[1024]; // Names of registers char *disRNameGPR[] = { "r0", "at", "v0", "v1", "a0", "a1","a2", "a3", "t0", "t1", "t2", "t3", "t4", "t5","t6", "t7", "s0", "s1", "s2", "s3", "s4", "s5","s6", "s7", "t8", "t9", "k0", "k1", "gp", "sp","fp", "ra", "hi", "lo"}; // lo,hi used in rec char *disRNameCP0[] = { "Index" , "Random" , "EntryLo0" , "EntryLo1", "Context" , "PageMask" , "Wired" , "*RES*", "BadVAddr" , "Count" , "EntryHi" , "Compare" , "Status" , "Cause" , "ExceptPC" , "PRevID", "Config" , "LLAddr" , "WatchLo" , "WatchHi" , "*RES*" , "*RES*" , "*RES*" , "Debug", "DEPC" , "PerfCnt" , "ErrCtl" , "CacheErr", "TagLo" , "TagHi" , "ErrorEPC" , "DESAVE"}; char *disRNameCP1[] = { "FPR0" , "FPR1" , "FPR2" , "FPR3" , "FPR4" , "FPR5" , "FPR6" , "FPR7", "FPR8" , "FPR9" , "FPR10", "FPR11", "FPR12", "FPR13", "FPR14", "FPR15", "FPR16", "FPR17", "FPR18", "FPR19", "FPR20", "FPR21", "FPR22", "FPR23", "FPR24", "FPR25", "FPR26", "FPR27", "FPR28", "FPR29", "FPR30", "FPR31"}; char *disRNameCP1c[] = { "FRevID", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "*RES*", "FStatus"}; char *disRNameCP2f[] = { "VF00", "VF01", "VF02", "VF03", "VF04", "VF05", "VF06", "VF07", "VF08", "VF09", "VF10", "VF11", "VF12", "VF13", "VF14", "VF15", "VF16", "VF17", "VF18", "VF19", "VF20", "VF21", "VF22", "VF23", "VF24", "VF25", "VF26", "VF27", "VF28", "VF29", "VF30", "VF31"}; char *disRNameCP2i[] = { "VI00", "VI01", "VI02", "VI03", "VI04", "VI05", "VI06", "VI07", "VI08", "VI09", "VI10", "VI11", "VI12", "VI13", "VI14", "VI15", "Status", "MAC", "Clip", "*RES*", "R", "I", "Q", "*RES*", "*RES*", "*RES*", "TPC", "CMSAR0", "FBRST", "VPU-STAT", "*RES*", "CMSAR1"}; char *CP2VFnames[] = { "x", "y", "z", "w" }; // Type deffinition of our functions #define DisFInterface (u32 code, u32 pc) #define DisFInterfaceT (u32, u32) #define DisFInterfaceN (code, pc) typedef char* (*TdisR5900F)DisFInterface; // These macros are used to assemble the disassembler functions #define MakeDisF(fn, b) \ char* fn DisFInterface { \ sprintf (ostr, "%8.8x %8.8x:", pc, code); \ b; /*ostr[(strlen(ostr) - 1)] = 0;*/ return ostr; \ } #undef _Target_ #undef _Branch_ #undef _Funct_ #undef _Rd_ #undef _Rt_ #undef _Rs_ #undef _Sa_ #undef _Im_ #define _Funct_ ((code ) & 0x3F) // The funct part of the instruction register #define _Rd_ ((code >> 11) & 0x1F) // The rd part of the instruction register #define _Rt_ ((code >> 16) & 0x1F) // The rt part of the instruction register #define _Rs_ ((code >> 21) & 0x1F) // The rs part of the instruction register #define _Sa_ ((code >> 6) & 0x1F) // The sa part of the instruction register #define _Im_ ( code & 0xFFFF) // The immediate part of the instruction register #define _rRs_ cpuRegs.GPR.r[_Rs_].UL[1], cpuRegs.GPR.r[_Rs_].UL[0] // Rs register #define _rRt_ cpuRegs.GPR.r[_Rt_].UL[1], cpuRegs.GPR.r[_Rt_].UL[0] // Rt register #define _rRd_ cpuRegs.GPR.r[_Rd_].UL[1], cpuRegs.GPR.r[_Rd_].UL[0] // Rd register #define _rSa_ cpuRegs.GPR.r[_Sa_].UL[1], cpuRegs.GPR.r[_Sa_].UL[0] // Sa register #define _rFs_ cpuRegs.CP0.r[_Rd_] // Fs register #define _rRs32_ cpuRegs.GPR.r[_Rs_].UL[0] // Rs register #define _rRt32_ cpuRegs.GPR.r[_Rt_].UL[0] // Rt register #define _rRd32_ cpuRegs.GPR.r[_Rd_].UL[0] // Rd register #define _rSa32_ cpuRegs.GPR.r[_Sa_].UL[0] // Sa register #define _nRs_ _rRs_, disRNameGPR[_Rs_] #define _nRt_ _rRt_, disRNameGPR[_Rt_] #define _nRd_ _rRd_, disRNameGPR[_Rd_] #define _nSa_ _rSa_, disRNameGPR[_Sa_] #define _nRd0_ _rFs_, disRNameCP0[_Rd_] #define _nRs32_ _rRs32_, disRNameGPR[_Rs_] #define _nRt32_ _rRt32_, disRNameGPR[_Rt_] #define _nRd32_ _rRd32_, disRNameGPR[_Rd_] #define _nSa32_ _rSa32_, disRNameGPR[_Sa_] #define _I_ _Im_, _Im_ #define _Target_ ((pc & 0xf0000000) + ((code & 0x03ffffff) * 4)) #define _Branch_ (pc + 4 + ((short)_Im_ * 4)) #define _OfB_ _Im_, _nRs_ #define _Fsf_ ((code >> 21) & 0x03) #define _Ftf_ ((code >> 23) & 0x03) #define dName(i) sprintf(ostr, "%s %-7s,", ostr, i) #define dGPR128(i) sprintf(ostr, "%s %8.8x_%8.8x_%8.8x_%8.8x (%s),", ostr, cpuRegs.GPR.r[i].UL[3], cpuRegs.GPR.r[i].UL[2], cpuRegs.GPR.r[i].UL[1], cpuRegs.GPR.r[i].UL[0], disRNameGPR[i]) #define dGPR64(i) sprintf(ostr, "%s %8.8x_%8.8x (%s),", ostr, cpuRegs.GPR.r[i].UL[1], cpuRegs.GPR.r[i].UL[0], disRNameGPR[i]) #define dGPR64U(i) sprintf(ostr, "%s %8.8x_%8.8x (%s),", ostr, cpuRegs.GPR.r[i].UL[3], cpuRegs.GPR.r[i].UL[2], disRNameGPR[i]) #define dGPR32(i) sprintf(ostr, "%s %8.8x (%s),", ostr, cpuRegs.GPR.r[i].UL[0], disRNameGPR[i]) #define dCP032(i) sprintf(ostr, "%s %8.8x (%s),", ostr, cpuRegs.CP0.r[i], disRNameCP0[i]) #define dCP132(i) sprintf(ostr, "%s %f (%s),", ostr, fpuRegs.fpr[i].f, disRNameCP1[i]) #define dCP1c32(i) sprintf(ostr, "%s %8.8x (%s),", ostr, fpuRegs.fprc[i], disRNameCP1c[i]) #define dCP1acc() sprintf(ostr, "%s %f (ACC),", ostr, fpuRegs.ACC.f) #define dCP2128f(i) sprintf(ostr, "%s w=%f z=%f y=%f x=%f (%s),", ostr, VU0.VF[i].f.w, VU0.VF[i].f.z, VU0.VF[i].f.y, VU0.VF[i].f.x, disRNameCP2f[i]) #define dCP232x(i) sprintf(ostr, "%s x=%f (%s),", ostr, VU0.VF[i].f.x, disRNameCP2f[i]) #define dCP232y(i) sprintf(ostr, "%s y=%f (%s),", ostr, VU0.VF[i].f.y, disRNameCP2f[i]) #define dCP232z(i) sprintf(ostr, "%s z=%f (%s),", ostr, VU0.VF[i].f.z, disRNameCP2f[i]) #define dCP232w(i) sprintf(ostr, "%s w=%f (%s),", ostr, VU0.VF[i].f.w, disRNameCP2f[i]) #define dCP2ACCf() sprintf(ostr, "%s w=%f z=%f y=%f x=%f (ACC),", ostr, VU0.ACC.f.w, VU0.ACC.f.z, VU0.ACC.f.y, VU0.ACC.f.x) #define dCP232i(i) sprintf(ostr, "%s %8.8x (%s),", ostr, VU0.VI[i].UL, disRNameCP2i[i]) #define dCP232iF(i) sprintf(ostr, "%s %f (%s),", ostr, VU0.VI[i].F, disRNameCP2i[i]) #define dCP232f(i, j) sprintf(ostr, "%s Q %s=%f (%s),", ostr, CP2VFnames[j], VU0.VF[i].F[j], disRNameCP2f[i]) #define dHI64() sprintf(ostr, "%s %8.8x_%8.8x (%s),", ostr, cpuRegs.HI.UL[1], cpuRegs.HI.UL[0], "hi") #define dLO64() sprintf(ostr, "%s %8.8x_%8.8x (%s),", ostr, cpuRegs.LO.UL[1], cpuRegs.LO.UL[0], "lo") #define dImm() sprintf(ostr, "%s %4.4x (%d),", ostr, _Im_, _Im_) #define dTarget() sprintf(ostr, "%s %8.8x,", ostr, _Target_) #define dSa() sprintf(ostr, "%s %2.2x (%d),", ostr, _Sa_, _Sa_) #define dSa32() sprintf(ostr, "%s %2.2x (%d),", ostr, _Sa_+32, _Sa_+32) #define dOfB() sprintf(ostr, "%s %4.4x (%8.8x (%s)),", ostr, _Im_, cpuRegs.GPR.r[_Rs_].UL[0], disRNameGPR[_Rs_]) #define dOffset() sprintf(ostr, "%s %8.8x,", ostr, _Branch_) #define dCode() sprintf(ostr, "%s %8.8x,", ostr, (code >> 6) & 0xffffff) #define dSaR() sprintf(ostr, "%s %8.8x,", ostr, cpuRegs.sa) typedef struct { u32 addr; char name[32]; } sSymbol; static sSymbol *dSyms = NULL; static int nSyms = 0; void disR5900AddSym(u32 addr, char *name) { dSyms = (sSymbol*)realloc(dSyms, sizeof(sSymbol) * (nSyms+1)); if (dSyms == NULL) return; dSyms[nSyms].addr = addr; strncpy(dSyms[nSyms].name, name, 32); nSyms++; } void disR5900FreeSyms() { if (dSyms != NULL) { free(dSyms); dSyms = NULL; } nSyms = 0; } char *disR5900GetSym(u32 addr) { int i; if (dSyms == NULL) return NULL; for (i=0; i laddr) { laddr = dSyms[i].addr; j = i; } } if (j == -1) return NULL; return dSyms[j].name; } #define dFindSym(i) { \ char *str = disR5900GetSym(i); \ if (str != NULL) sprintf(ostr, "%s %s", ostr, str); \ } /********************************************************* * Arithmetic with immediate operand * * Format: OP rt, rs, immediate * *********************************************************/ MakeDisF(disADDI, dName("ADDI"); dGPR64(_Rt_); dGPR32(_Rs_); dImm();) MakeDisF(disADDIU, dName("ADDIU"); dGPR64(_Rt_); dGPR32(_Rs_); dImm();) MakeDisF(disANDI, dName("ANDI"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) MakeDisF(disORI, dName("ORI"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) MakeDisF(disSLTI, dName("SLTI"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) MakeDisF(disSLTIU, dName("SLTIU"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) MakeDisF(disXORI, dName("XORI"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) MakeDisF(disDADDI, dName("DADDI"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) MakeDisF(disDADDIU, dName("DADDIU"); dGPR64(_Rt_); dGPR64(_Rs_); dImm();) /********************************************************* * Register arithmetic * * Format: OP rd, rs, rt * *********************************************************/ MakeDisF(disADD, dName("ADD"); dGPR64(_Rd_); dGPR32(_Rs_); dGPR32(_Rt_);) MakeDisF(disADDU, dName("ADDU"); dGPR64(_Rd_); dGPR32(_Rs_); dGPR32(_Rt_);) MakeDisF(disDADD, dName("DADD"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disDADDU, dName("DADDU"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disSUB, dName("SUB"); dGPR64(_Rd_); dGPR32(_Rs_); dGPR32(_Rt_);) MakeDisF(disSUBU, dName("SUBU"); dGPR64(_Rd_); dGPR32(_Rs_); dGPR32(_Rt_);) MakeDisF(disDSUB, dName("DSUB"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disDSUBU, dName("DSDBU"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disAND, dName("AND"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disOR, dName("OR"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disXOR, dName("XOR"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disNOR, dName("NOR"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disSLT, dName("SLT"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disSLTU, dName("SLTU"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) /********************************************************* * Jump to target * * Format: OP target * *********************************************************/ MakeDisF(disJ, dName("J"); dTarget(); dFindSym(_Target_);) MakeDisF(disJAL, dName("JAL"); dTarget(); dGPR32(31); dFindSym(_Target_);) /********************************************************* * Register jump * * Format: OP rs, rd * *********************************************************/ MakeDisF(disJR, dName("JR"); dGPR32(_Rs_); dFindSym(cpuRegs.GPR.r[_Rs_].UL[0]);) MakeDisF(disJALR, dName("JALR"); dGPR32(_Rs_); dGPR32(_Rd_); dFindSym(cpuRegs.GPR.r[_Rs_].UL[0]);) /********************************************************* * Register mult/div & Register trap logic * * Format: OP rs, rt * *********************************************************/ MakeDisF(disDIV, dName("DIV"); dGPR32(_Rs_); dGPR32(_Rt_);) MakeDisF(disDIVU, dName("DIVU"); dGPR32(_Rs_); dGPR32(_Rt_);) MakeDisF(disMULT, dName("MULT"); dGPR32(_Rs_); dGPR32(_Rt_); dGPR32(_Rd_);) MakeDisF(disMULTU, dName("MULTU"); dGPR32(_Rs_); dGPR32(_Rt_); dGPR32(_Rd_);) /********************************************************* * Load higher 16 bits of the first word in GPR with imm * * Format: OP rt, immediate * *********************************************************/ MakeDisF(disLUI, dName("LUI"); dGPR64(_Rt_); dImm();) /********************************************************* * Move from HI/LO to GPR * * Format: OP rd * *********************************************************/ MakeDisF(disMFHI, dName("MFHI"); dGPR64(_Rd_); dHI64();) MakeDisF(disMFLO, dName("MFLO"); dGPR64(_Rd_); dLO64();) /********************************************************* * Move to GPR to HI/LO & Register jump * * Format: OP rs * *********************************************************/ MakeDisF(disMTHI, dName("MTHI"); dHI64(); dGPR64(_Rs_);) MakeDisF(disMTLO, dName("MTLO"); dLO64(); dGPR64(_Rs_);) /********************************************************* * Shift arithmetic with constant shift * * Format: OP rd, rt, sa * *********************************************************/ MakeDisF(disSLL, if (code) { dName("SLL"); dGPR64(_Rd_); dGPR32(_Rt_); dSa(); } else { dName("NOP"); }) MakeDisF(disDSLL, dName("DSLL"); dGPR64(_Rd_); dGPR64(_Rt_); dSa();) MakeDisF(disDSLL32, dName("DSLL32"); dGPR64(_Rd_); dGPR64(_Rt_); dSa32();) MakeDisF(disSRA, dName("SRA"); dGPR64(_Rd_); dGPR32(_Rt_); dSa();) MakeDisF(disDSRA, dName("DSRA"); dGPR64(_Rd_); dGPR64(_Rt_); dSa();) MakeDisF(disDSRA32, dName("DSRA32"); dGPR64(_Rd_); dGPR64(_Rt_); dSa32();) MakeDisF(disSRL, dName("SRL"); dGPR64(_Rd_); dGPR32(_Rt_); dSa();) MakeDisF(disDSRL, dName("DSRL"); dGPR64(_Rd_); dGPR64(_Rt_); dSa();) MakeDisF(disDSRL32, dName("DSRL32"); dGPR64(_Rd_); dGPR64(_Rt_); dSa32();) /********************************************************* * Shift arithmetic with variant register shift * * Format: OP rd, rt, rs * *********************************************************/ MakeDisF(disSLLV, dName("SLLV"); dGPR64(_Rd_); dGPR32(_Rt_); dGPR32(_Rs_);) MakeDisF(disDSLLV, dName("DSLLV"); dGPR64(_Rd_); dGPR64(_Rt_); dGPR32(_Rs_);) MakeDisF(disSRAV, dName("SRAV"); dGPR64(_Rd_); dGPR32(_Rt_); dGPR32(_Rs_);) MakeDisF(disDSRAV, dName("DSRAV"); dGPR64(_Rd_); dGPR64(_Rt_); dGPR32(_Rs_);) MakeDisF(disSRLV, dName("SRLV"); dGPR64(_Rd_); dGPR32(_Rt_); dGPR32(_Rs_);) MakeDisF(disDSRLV, dName("DSRLV"); dGPR64(_Rd_); dGPR64(_Rt_); dGPR32(_Rs_);) /********************************************************* * Load and store for GPR * * Format: OP rt, offset(base) * *********************************************************/ MakeDisF(disLB, dName("LB"); dGPR64(_Rt_); dOfB();) MakeDisF(disLBU, dName("LBU"); dGPR64(_Rt_); dOfB();) MakeDisF(disLH, dName("LH"); dGPR64(_Rt_); dOfB();) MakeDisF(disLHU, dName("LHU"); dGPR64(_Rt_); dOfB();) MakeDisF(disLW, dName("LW"); dGPR64(_Rt_); dOfB();) MakeDisF(disLWU, dName("LWU"); dGPR64(_Rt_); dOfB();) MakeDisF(disLWL, dName("LWL"); dGPR64(_Rt_); dOfB();) MakeDisF(disLWR, dName("LWR"); dGPR64(_Rt_); dOfB();) MakeDisF(disLD, dName("LD"); dGPR64(_Rt_); dOfB();) MakeDisF(disLDL, dName("LDL"); dGPR64(_Rt_); dOfB();) MakeDisF(disLDR, dName("LDR"); dGPR64(_Rt_); dOfB();) MakeDisF(disLQ, dName("LQ"); dGPR128(_Rt_); dOfB();) MakeDisF(disSB, dName("SB"); dGPR64(_Rt_); dOfB();) MakeDisF(disSH, dName("SH"); dGPR64(_Rt_); dOfB();) MakeDisF(disSW, dName("SW"); dGPR64(_Rt_); dOfB();) MakeDisF(disSWL, dName("SWL"); dGPR64(_Rt_); dOfB();) MakeDisF(disSWR, dName("SWR"); dGPR64(_Rt_); dOfB();) MakeDisF(disSD, dName("SD"); dGPR64(_Rt_); dOfB();) MakeDisF(disSDL, dName("SDL"); dGPR64(_Rt_); dOfB();) MakeDisF(disSDR, dName("SDR"); dGPR64(_Rt_); dOfB();) MakeDisF(disSQ, dName("SQ"); dGPR128(_Rt_); dOfB();) /********************************************************* * Register branch logic * * Format: OP rs, rt, offset * *********************************************************/ MakeDisF(disBEQ, dName("BEQ"); dGPR64(_Rs_); dGPR64(_Rt_); dOffset();) MakeDisF(disBNE, dName("BNE"); dGPR64(_Rs_); dGPR64(_Rt_); dOffset();) /********************************************************* * Moves between GPR and COPx * * Format: OP rt, rd * *********************************************************/ MakeDisF(disMFC0, dName("MFC0"); dGPR32(_Rt_); dCP032(_Rd_);) MakeDisF(disMTC0, dName("MTC0"); dCP032(_Rd_); dGPR32(_Rt_);) /********************************************************* * Register branch logic * * Format: OP rs, offset * *********************************************************/ MakeDisF(disBGEZ, dName("BGEZ"); dGPR64(_Rs_); dOffset();) MakeDisF(disBGEZAL, dName("BGEZAL"); dGPR64(_Rs_); dOffset();) MakeDisF(disBGTZ, dName("BGTZ"); dGPR64(_Rs_); dOffset();) MakeDisF(disBLEZ, dName("BLEZ"); dGPR64(_Rs_); dOffset();) MakeDisF(disBLTZ, dName("BLTZ"); dGPR64(_Rs_); dOffset();) MakeDisF(disBLTZAL, dName("BLTZAL"); dGPR64(_Rs_); dOffset();) /********************************************************* * Register branch logic Likely * * Format: OP rs, offset * *********************************************************/ MakeDisF(disBEQL, dName("BEQL"); dGPR64(_Rs_); dGPR64(_Rt_); dOffset();) MakeDisF(disBNEL, dName("BNEL"); dGPR64(_Rs_); dGPR64(_Rt_); dOffset();) MakeDisF(disBLEZL, dName("BLEZL"); dGPR64(_Rs_); dOffset();) MakeDisF(disBGTZL, dName("BGTZL"); dGPR64(_Rs_); dOffset();) MakeDisF(disBLTZL, dName("BLTZL"); dGPR64(_Rs_); dOffset();) MakeDisF(disBGEZL, dName("BGEZL"); dGPR64(_Rs_); dOffset();) MakeDisF(disBLTZALL, dName("BLTZALL"); dGPR64(_Rs_); dOffset();) MakeDisF(disBGEZALL, dName("BGEZALL"); dGPR64(_Rs_); dOffset();) /********************************************************* * COP0 opcodes * * * *********************************************************/ MakeDisF(disBC0F, dName("BC0F"); dOffset();) MakeDisF(disBC0T, dName("BC0T"); dOffset();) MakeDisF(disBC0FL, dName("BC0FL"); dOffset();) MakeDisF(disBC0TL, dName("BC0TL"); dOffset();) MakeDisF(disTLBR, dName("TLBR");) MakeDisF(disTLBWI, dName("TLBWI");) MakeDisF(disTLBWR, dName("TLBWR");) MakeDisF(disTLBP, dName("TLBP");) MakeDisF(disERET, dName("ERET");) MakeDisF(disEI, dName("EI");) MakeDisF(disDI, dName("DI");) /********************************************************* * COP1 opcodes * * * *********************************************************/ #define _Ft_ _Rt_ #define _Fs_ _Rd_ #define _Fd_ _Sa_ MakeDisF(disMFC1, dName("MFC1"); dGPR64(_Rt_); dCP132(_Fs_);) MakeDisF(disCFC1, dName("CFC1"); dGPR64(_Rt_); dCP1c32(_Fs_);) MakeDisF(disMTC1, dName("MTC1"); dCP132(_Fs_); dGPR64(_Rt_);) MakeDisF(disCTC1, dName("CTC1"); dCP1c32(_Fs_); dGPR64(_Rt_);) MakeDisF(disBC1F, dName("BC1F");) MakeDisF(disBC1T, dName("BC1T");) MakeDisF(disBC1FL, dName("BC1FL");) MakeDisF(disBC1TL, dName("BC1TL");) MakeDisF(disADDs, dName("ADDs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disSUBs, dName("SUBs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMULs, dName("MULs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disDIVs, dName("DIVs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disSQRTs, dName("SQRTs"); dCP132(_Fd_); dCP132(_Ft_);) MakeDisF(disABSs, dName("ABSs"); dCP132(_Fd_); dCP132(_Fs_);) MakeDisF(disMOVs, dName("MOVs"); dCP132(_Fd_); dCP132(_Fs_);) MakeDisF(disNEGs, dName("NEGs"); dCP132(_Fd_); dCP132(_Fs_);) MakeDisF(disRSQRTs, dName("RSQRTs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disADDAs, dName("ADDAs"); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disSUBAs, dName("SUBAs"); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMULAs, dName("MULAs"); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMADDs, dName("MADDs"); dCP132(_Fd_); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMSUBs, dName("MSUBs"); dCP132(_Fd_); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMADDAs, dName("MADDAs"); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMSUBAs, dName("MSUBAs"); dCP1acc(); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disCVTWs, dName("CVTWs"); dCP132(_Fd_); dCP132(_Fs_);) MakeDisF(disMAXs, dName("MAXs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disMINs, dName("MINs"); dCP132(_Fd_); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disCFs, dName("CFs"); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disCEQs, dName("CEQs"); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disCLTs, dName("CLTs"); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disCLEs, dName("CLEs"); dCP132(_Fs_); dCP132(_Ft_);) MakeDisF(disCVTSw, dName("CVTSw"); dCP132(_Fd_); dCP132(_Fs_);) /********************************************************* * Load and store for COP1 * * Format: OP rt, offset(base) * *********************************************************/ MakeDisF(disLWC1, dName("LWC1"); dCP132(_Rt_); dOffset();) MakeDisF(disSWC1, dName("SWC1"); dCP132(_Rt_); dOffset();) /********************************************************* * Conditional Move * * Format: OP rd, rs, rt * *********************************************************/ MakeDisF(disMOVZ, dName("MOVZ"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disMOVN, dName("MOVN"); dGPR64(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) /********************************************************* * MMI opcodes * * * *********************************************************/ MakeDisF(disMULT1, dName("MULT1");) MakeDisF(disMULTU1, dName("MULTU1");) /********************************************************* * MMI0 opcodes * * * *********************************************************/ MakeDisF(disPADDW, dName("PADDW");) MakeDisF(disPADDH, dName("PADDH");) MakeDisF(disPADDB, dName("PADDB");) MakeDisF(disPADDSW, dName("PADDSW");) MakeDisF(disPADDSH, dName("PADDSH");) MakeDisF(disPADDSB, dName("PADDSB");) MakeDisF(disPSUBW, dName("PSUBW");) MakeDisF(disPSUBH, dName("PSUBH");) MakeDisF(disPSUBB, dName("PSUBB");) MakeDisF(disPSUBSW, dName("PSUBSW");) MakeDisF(disPSUBSH, dName("PSUBSH");) MakeDisF(disPSUBSB, dName("PSUBSB");) MakeDisF(disPCGTW, dName("PCGTW");) MakeDisF(disPCGTH, dName("PCGTH");) MakeDisF(disPCGTB, dName("PCGTB");) MakeDisF(disPMAXW, dName("PMAXW");) MakeDisF(disPMAXH, dName("PMAXH");) MakeDisF(disPEXTLW, dName("PEXTLW"); dGPR128(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disPEXTLH, dName("PEXTLH"); dGPR128(_Rd_); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disPEXTLB, dName("PEXTLB");) MakeDisF(disPEXTS, dName("PEXTS");) MakeDisF(disPPACW, dName("PPACW");) MakeDisF(disPPACH, dName("PPACH");) MakeDisF(disPPACB, dName("PPACB");) MakeDisF(disPPACS, dName("PPACS");) /********************************************************* * MMI1 opcodes * * * *********************************************************/ MakeDisF(disPADSBH, dName("PADSBH");) MakeDisF(disPABSW, dName("PABSW");) MakeDisF(disPABSH, dName("PABSH");) MakeDisF(disPCEQW, dName("PCEQW");) MakeDisF(disPCEQH, dName("PCEQH");) MakeDisF(disPCEQB, dName("PCEQB");) MakeDisF(disPMINW, dName("PMINW");) MakeDisF(disPMINH, dName("PMINH");) MakeDisF(disPADDUW, dName("PADDUW");) MakeDisF(disPADDUH, dName("PADDUH");) MakeDisF(disPADDUB, dName("PADDUB");) MakeDisF(disPSUBUW, dName("PSUBUW");) MakeDisF(disPSUBUH, dName("PSUBUH");) MakeDisF(disPSUBUB, dName("PSUBUB");) MakeDisF(disPEXTUW, dName("PEXTUW"); dGPR128(_Rd_); dGPR64U(_Rs_); dGPR64U(_Rt_);) MakeDisF(disPEXTUH, dName("PEXTUH"); dGPR128(_Rd_); dGPR64U(_Rs_); dGPR64U(_Rt_);) MakeDisF(disPEXTUB, dName("PEXTUB");) MakeDisF(disQFSRV, dName("QFSRV");) /********************************************************* * MMI2 opcodes * * * *********************************************************/ MakeDisF(disPMADDW, dName("PMADDW");) MakeDisF(disPMADDH, dName("PMADDH");) MakeDisF(disPSLLVW, dName("PSLLVW");) MakeDisF(disPSRLVW, dName("PSRLVW");) MakeDisF(disPMFHI, dName("PMFHI");) MakeDisF(disPMFLO, dName("PMFLO");) MakeDisF(disPINTH, dName("PINTH");) MakeDisF(disPMULTW, dName("PMULTW");) MakeDisF(disPMULTH, dName("PMULTH");) MakeDisF(disPDIVW, dName("PDIVW");) MakeDisF(disPDIVH, dName("PDIVH");) MakeDisF(disPCPYLD, dName("PCPYLD"); dGPR128(_Rd_); dGPR128(_Rs_); dGPR128(_Rt_);) MakeDisF(disPAND, dName("PAND"); dGPR128(_Rd_); dGPR128(_Rs_); dGPR128(_Rt_);) MakeDisF(disPXOR, dName("PXOR"); dGPR128(_Rd_); dGPR128(_Rs_); dGPR128(_Rt_);) MakeDisF(disPMSUBW, dName("PMSUBW");) MakeDisF(disPMSUBH, dName("PMSUBH");) MakeDisF(disPHMADH, dName("PHMADH");) MakeDisF(disPHMSBH, dName("PHMSBH");) MakeDisF(disPEXEW, dName("PEXEW");) MakeDisF(disPEXEH, dName("PEXEH");) MakeDisF(disPREVH, dName("PREVH");) MakeDisF(disPDIVBW, dName("PDIVBW");) MakeDisF(disPROT3W, dName("PROT3W");) /********************************************************* * MMI3 opcodes * * * *********************************************************/ MakeDisF(disPMADDUW, dName("PMADDUW");) MakeDisF(disPSRAVW, dName("PSRAVW");) MakeDisF(disPMTHI, dName("PMTHI");) MakeDisF(disPMTLO, dName("PMTLO");) MakeDisF(disPINTEH, dName("PINTEH");) MakeDisF(disPMULTUW, dName("PMULTUW");) MakeDisF(disPDIVUW, dName("PDIVUW");) MakeDisF(disPCPYUD, dName("PCPYUD"); dGPR128(_Rd_); dGPR128(_Rt_); dGPR128(_Rs_);) MakeDisF(disPOR, dName("POR"); dGPR128(_Rd_); dGPR128(_Rs_); dGPR128(_Rt_);) MakeDisF(disPNOR, dName("PNOR"); dGPR128(_Rd_); dGPR128(_Rs_); dGPR128(_Rt_);) MakeDisF(disPEXCH, dName("PEXCH");) MakeDisF(disPEXCW, dName("PEXCW");) MakeDisF(disPCPYH, dName("PCPYH"); dGPR128(_Rd_); dGPR128(_Rt_);) /********************************************************* * COP2 opcodes * * * *********************************************************/ #define _Ft_ _Rt_ #define _Fs_ _Rd_ #define _Fd_ _Sa_ #define _X code>>24 #define _Y code>>23 #define _Z code>>22 #define _W code>>21 MakeDisF(disLQC2, dName("LQC2"); dCP2128f(_Rt_); dOfB();) MakeDisF(disSQC2, dName("SQC2"); dCP2128f(_Rt_); dOfB();) MakeDisF(disQMFC2, dName("QMFC2");) MakeDisF(disQMTC2, dName("QMTC2");) MakeDisF(disCFC2, dName("CFC2"); dGPR32(_Rt_); dCP232i(_Fs_);) MakeDisF(disCTC2, dName("CTC2"); dCP232i(_Fs_); dGPR32(_Rt_);) MakeDisF(disBC2F, dName("BC2F");) MakeDisF(disBC2T, dName("BC2T");) MakeDisF(disBC2FL, dName("BC2FL");) MakeDisF(disBC2TL, dName("BC2TL");) // SPEC1 MakeDisF(disVADD, dName("VADD");) MakeDisF(disVADDx, dName("VADDx"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVADDy, dName("VADDy"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVADDz, dName("VADDz"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVADDw, dName("VADDw"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVADDq, dName("VADDq"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP232iF(REG_Q);) MakeDisF(disVADDi, dName("VADDi"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP232iF(REG_I);) MakeDisF(disVSUB, dName("VSUB");) MakeDisF(disVSUBx, dName("VSUBx"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVSUBy, dName("VSUBy"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVSUBz, dName("VSUBz"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVSUBw, dName("VSUBw"); dCP2128f(_Fd_); dCP2128f(_Fs_); dCP2128f(_Ft_);) MakeDisF(disVSUBq, dName("VSUBq");) MakeDisF(disVSUBi, dName("VSUBi");) MakeDisF(disVMADD, dName("VMADD");) MakeDisF(disVMADDx, dName("VMADDx"); dCP2128f(_Fd_); dCP2ACCf(); dCP2128f(_Fs_); dCP232x(_Ft_);) MakeDisF(disVMADDy, dName("VMADDy"); dCP2128f(_Fd_); dCP2ACCf(); dCP2128f(_Fs_); dCP232y(_Ft_);) MakeDisF(disVMADDz, dName("VMADDz"); dCP2128f(_Fd_); dCP2ACCf(); dCP2128f(_Fs_); dCP232z(_Ft_);) MakeDisF(disVMADDw, dName("VMADDw"); dCP2128f(_Fd_); dCP2ACCf(); dCP2128f(_Fs_); dCP232w(_Ft_);) MakeDisF(disVMADDq, dName("VMADDq");) MakeDisF(disVMADDi, dName("VMADDi");) MakeDisF(disVMSUB, dName("VMSUB");) MakeDisF(disVMSUBx, dName("VMSUBx");) MakeDisF(disVMSUBy, dName("VMSUBy");) MakeDisF(disVMSUBz, dName("VMSUBz");) MakeDisF(disVMSUBw, dName("VMSUBw");) MakeDisF(disVMSUBq, dName("VMSUBq");) MakeDisF(disVMSUBi, dName("VMSUBi");) MakeDisF(disVMAX, dName("VMAX");) MakeDisF(disVMAXx, dName("VMAXx");) MakeDisF(disVMAXy, dName("VMAXy");) MakeDisF(disVMAXz, dName("VMAXz");) MakeDisF(disVMAXw, dName("VMAXw");) MakeDisF(disVMAXi, dName("VMAXi");) MakeDisF(disVMINI, dName("VMINI");) MakeDisF(disVMINIx, dName("VMINIx");) MakeDisF(disVMINIy, dName("VMINIy");) MakeDisF(disVMINIz, dName("VMINIz");) MakeDisF(disVMINIw, dName("VMINIw");) MakeDisF(disVMINIi, dName("VMINIi");) MakeDisF(disVMUL, dName("VMUL");) MakeDisF(disVMULx, dName("VMULx");) MakeDisF(disVMULy, dName("VMULy");) MakeDisF(disVMULz, dName("VMULz");) MakeDisF(disVMULw, dName("VMULw");) MakeDisF(disVMULq, dName("VMULq");) MakeDisF(disVMULi, dName("VMULi");) MakeDisF(disVIADD, dName("VIADD");) MakeDisF(disVIADDI, dName("VIADDI");) MakeDisF(disVISUB, dName("VISUB");) MakeDisF(disVIAND, dName("VIAND");) MakeDisF(disVIOR, dName("VIOR");) MakeDisF(disVOPMSUB, dName("VOPMSUB");) MakeDisF(disVCALLMS, dName("VCALLMS");) MakeDisF(disVCALLMSR, dName("VCALLMSR");) // SPEC2 MakeDisF(disVADDA, dName("VADDA");) MakeDisF(disVADDAx, dName("VADDAx");) MakeDisF(disVADDAy, dName("VADDAy");) MakeDisF(disVADDAz, dName("VADDAz");) MakeDisF(disVADDAw, dName("VADDAw");) MakeDisF(disVADDAq, dName("VADDAq");) MakeDisF(disVADDAi, dName("VADDAi");) MakeDisF(disVMADDA, dName("VMADDA");) MakeDisF(disVMADDAx, dName("VMADDAx"); dCP2ACCf(); dCP2128f(_Fs_); dCP232x(_Ft_);) MakeDisF(disVMADDAy, dName("VMADDAy"); dCP2ACCf(); dCP2128f(_Fs_); dCP232y(_Ft_);) MakeDisF(disVMADDAz, dName("VMADDAz"); dCP2ACCf(); dCP2128f(_Fs_); dCP232z(_Ft_);) MakeDisF(disVMADDAw, dName("VMADDAw"); dCP2ACCf(); dCP2128f(_Fs_); dCP232w(_Ft_);) MakeDisF(disVMADDAq, dName("VMADDAq");) MakeDisF(disVMADDAi, dName("VMADDAi");) MakeDisF(disVSUBAx, dName("VSUBAx");) MakeDisF(disVSUBAy, dName("VSUBAy");) MakeDisF(disVSUBAz, dName("VSUBAz");) MakeDisF(disVSUBAw, dName("VSUBAw");) MakeDisF(disVMSUBAx, dName("VMSUBAx");) MakeDisF(disVMSUBAy, dName("VMSUBAy");) MakeDisF(disVMSUBAz, dName("VMSUBAz");) MakeDisF(disVMSUBAw, dName("VMSUBAw");) MakeDisF(disVITOF0, dName("VITOF0");) MakeDisF(disVITOF4, dName("VITOF4");) MakeDisF(disVITOF12, dName("VITOF12");) MakeDisF(disVITOF15, dName("VITOF15");) MakeDisF(disVFTOI0, dName("VFTOI0");) MakeDisF(disVFTOI4, dName("VFTOI4");) MakeDisF(disVFTOI12, dName("VFTOI12");) MakeDisF(disVFTOI15, dName("VFTOI15");) MakeDisF(disVMULA, dName("VMULA");) MakeDisF(disVMULAx, dName("VMULAx"); dCP2ACCf(); dCP2128f(_Fs_); dCP232x(_Ft_);) MakeDisF(disVMULAy, dName("VMULAy");) MakeDisF(disVMULAz, dName("VMULAz");) MakeDisF(disVMULAw, dName("VMULAw");) MakeDisF(disVMOVE, dName("VMOVE"); dCP2128f(_Ft_); dCP2128f(_Fs_);) MakeDisF(disVMR32, dName("VMR32");) MakeDisF(disVDIV, dName("VDIV");) MakeDisF(disVSQRT, dName("VSQRT"); dCP232f(_Ft_, _Ftf_);) MakeDisF(disVRSQRT, dName("VRSQRT");) MakeDisF(disVRNEXT, dName("VRNEXT");) MakeDisF(disVRGET, dName("VRGET");) MakeDisF(disVRINIT, dName("VRINIT");) MakeDisF(disVRXOR, dName("VRXOR");) MakeDisF(disVWAITQ, dName("VWAITQ");) /********************************************************* * Special purpose instructions * * Format: OP * *********************************************************/ MakeDisF(disSYNC, dName("SYNC");) MakeDisF(disBREAK, dName("BREAK");) MakeDisF(disSYSCALL, dName("SYSCALL"); dCode();) MakeDisF(disCACHE, sprintf(ostr, "%s %-7s, %x,", ostr, "CACHE", _Rt_); dOfB();) MakeDisF(disPREF, dName("PREF");) MakeDisF(disMFSA, dName("MFSA"); dGPR64(_Rd_); dSaR();) MakeDisF(disMTSA, dName("MTSA"); dGPR64(_Rs_); dSaR();) MakeDisF(disMTSAB, dName("MTSAB");dGPR64(_Rs_); dImm();) MakeDisF(disMTSAH, dName("MTSAH");dGPR64(_Rs_); dImm();) MakeDisF(disTGE, dName("TGE"); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disTGEU, dName("TGEU"); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disTLT, dName("TLT"); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disTLTU, dName("TLTU"); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disTEQ, dName("TEQ"); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disTNE, dName("TNE"); dGPR64(_Rs_); dGPR64(_Rt_);) MakeDisF(disTGEI, dName("TGEI"); dGPR64(_Rs_); dImm();) MakeDisF(disTGEIU, dName("TGEIU"); dGPR64(_Rs_); dImm();) MakeDisF(disTLTI, dName("TLTI"); dGPR64(_Rs_); dImm();) MakeDisF(disTLTIU, dName("TLTIU"); dGPR64(_Rs_); dImm();) MakeDisF(disTEQI, dName("TEQI"); dGPR64(_Rs_); dImm();) MakeDisF(disTNEI, dName("TNEI"); dGPR64(_Rs_); dImm();) /********************************************************* * Unknow instruction (would generate an exception) * * Format: ? * *********************************************************/ MakeDisF(disNULL, dName("*** Bad OP ***");) TdisR5900F disR5900_MMI0[] = { // Subset of disMMI0 disPADDW, disPSUBW, disPCGTW, disPMAXW, disPADDH, disPSUBH, disPCGTH, disPMAXH, disPADDB, disPSUBB, disPCGTB, disNULL, disNULL, disNULL, disNULL, disNULL, disPADDSW, disPSUBSW, disPEXTLW, disPPACW, disPADDSH, disPSUBSH, disPEXTLH, disPPACH, disPADDSB, disPSUBSB, disPEXTLB, disPPACB, disNULL, disNULL, disPEXTS, disPPACS}; MakeDisF(disMMI0, disR5900_MMI0[_Sa_] DisFInterfaceN) TdisR5900F disR5900_MMI1[] = { // Subset of disMMI1 disNULL, disPABSW, disPCEQW, disPMINW, disPADSBH, disPABSH, disPCEQH, disPMINH, disNULL, disNULL, disPCEQB, disNULL, disNULL, disNULL, disNULL, disNULL, disPADDUW, disPSUBUW, disPEXTUW, disNULL, disPADDUH, disPSUBUH, disPEXTUH, disNULL, disPADDUB, disPSUBUB, disPEXTUB, disQFSRV, disNULL, disNULL, disNULL, disNULL}; MakeDisF(disMMI1, disR5900_MMI1[_Sa_] DisFInterfaceN) TdisR5900F disR5900_MMI2[] = { // Subset of disMMI2 disPMADDW, disNULL, disPSLLVW, disPSRLVW, disPMSUBW, disNULL, disNULL, disNULL, disPMFHI, disPMFLO, disPINTH, disNULL, disPMULTW, disPDIVW, disPCPYLD, disNULL, disPMADDH, disPHMADH, disPAND, disPXOR, disPMSUBH, disPHMSBH, disNULL, disNULL, disNULL, disNULL, disPEXEH, disPREVH, disPMULTH, disPDIVBW, disPEXEW, disPROT3W}; MakeDisF(disMMI2, disR5900_MMI2[_Sa_] DisFInterfaceN) TdisR5900F disR5900_MMI3[] = { // Subset of disMMI3 disPMADDUW, disNULL, disNULL, disPSRAVW, disNULL, disNULL, disNULL, disNULL, disPMTHI, disPMTLO, disPINTEH, disNULL, disPMULTUW, disPDIVUW, disPCPYUD, disNULL, disNULL, disNULL, disPOR, disPNOR, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disPEXCH, disPCPYH, disNULL, disNULL, disPEXCW, disNULL}; MakeDisF(disMMI3, disR5900_MMI3[_Sa_] DisFInterfaceN) TdisR5900F disR5900_MMI[] = { // Subset of disMMI disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disMMI0, disMMI2, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disMULT1, disMULTU1, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disMMI1, disMMI3, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; MakeDisF(disMMI, disR5900_MMI[_Funct_] DisFInterfaceN) TdisR5900F disR5900_COP0_BC0[] = { //subset of disCOP0 BC disBC0F, disBC0T, disBC0FL, disBC0TL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, }; MakeDisF(disCOP0_BC0, disR5900_COP0_BC0[_Rt_] DisFInterfaceN) TdisR5900F disR5900_COP0_Func[] = { //subset of disCOP0 Function disNULL, disTLBR, disTLBWI, disNULL, disNULL, disNULL, disTLBWR, disNULL, disTLBP, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disERET, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disNULL, disNULL, disNULL , disNULL, disEI , disDI , disNULL , disNULL, disNULL, disNULL, disNULL , disNULL }; MakeDisF(disCOP0_Func, disR5900_COP0_Func[_Funct_] DisFInterfaceN) TdisR5900F disR5900_COP0[] = { // Subset of disCOP0 disMFC0, disNULL, disNULL, disNULL, disMTC0, disNULL, disNULL, disNULL, disCOP0_BC0, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disCOP0_Func, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; MakeDisF(disCOP0, disR5900_COP0[_Rs_] DisFInterfaceN) TdisR5900F disR5900_COP1_S[] = { //subset of disCOP1 S disADDs, disSUBs, disMULs, disDIVs, disSQRTs, disABSs, disMOVs, disNEGs, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disRSQRTs, disNULL, disADDAs, disSUBAs, disMULAs, disNULL, disMADDs, disMSUBs, disMADDAs, disMSUBAs, disNULL, disNULL, disNULL, disNULL, disCVTWs, disNULL, disNULL, disNULL, disMINs, disMAXs, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disCFs, disNULL, disCEQs, disNULL, disCLTs, disNULL, disCLEs, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, }; MakeDisF(disCOP1_S, disR5900_COP1_S[_Funct_] DisFInterfaceN) TdisR5900F disR5900_COP1_W[] = { //subset of disCOP1 W disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disCVTSw, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, }; MakeDisF(disCOP1_W, disR5900_COP1_W[_Funct_] DisFInterfaceN) TdisR5900F disR5900_COP1_BC1[] = { //subset of disCOP1 BC disBC1F, disBC1T, disBC1FL, disBC1TL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, }; MakeDisF(disCOP1_BC1, disR5900_COP1_BC1[_Rt_] DisFInterfaceN) TdisR5900F disR5900_COP1[] = { // Subset of disCOP1 disMFC1, disNULL, disCFC1, disNULL, disMTC1, disNULL, disCTC1, disNULL, disCOP1_BC1, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disCOP1_S, disNULL, disNULL, disNULL, disCOP1_W, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; MakeDisF(disCOP1, disR5900_COP1[_Rs_] DisFInterfaceN) TdisR5900F disR5900_COP2_SPEC2[] = { //subset of disCOP2 SPEC2 disVADDAx, disVADDAy, disVADDAz, disVADDAw, disVSUBAx, disVSUBAy, disVSUBAz, disVSUBAw, disVMADDAx, disVMADDAy, disVMADDAz, disVMADDAw, disVMSUBAx, disVMSUBAy, disVMSUBAz, disVMSUBAw, disVITOF0, disVITOF4, disVITOF12, disVITOF15, disVFTOI0, disVFTOI4, disVFTOI12, disVFTOI15, disVMULAx, disVMULAy, disVMULAz, disVMULAw, disNULL, disNULL, disNULL, disNULL, disVADDAq, disVMADDAq, disVADDAi, disVMADDAi, disNULL, disNULL, disNULL, disNULL, disVADDA, disVMADDA, disVMULA, disNULL, disNULL, disNULL, disNULL, disNULL, disVMOVE, disVMR32, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disVDIV, disVSQRT, disVRSQRT, disVWAITQ, disNULL, disNULL, disNULL, disNULL, disVRNEXT, disVRGET, disVRINIT, disVRXOR, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, }; MakeDisF(disCOP2_SPEC2, disR5900_COP2_SPEC2[(code & 0x3) | ((code >> 4) & 0x7c)] DisFInterfaceN) TdisR5900F disR5900_COP2_SPEC1[] = { //subset of disCOP2 SPEC1 disVADDx, disVADDy, disVADDz, disVADDw, disVSUBx, disVSUBy, disVSUBz, disVSUBw, disVMADDx, disVMADDy, disVMADDz, disVMADDw, disVMSUBx, disVMSUBy, disVMSUBz, disVMSUBw, disVMAXx, disVMAXy, disVMAXz, disVMAXw, disVMINIx, disVMINIy, disVMINIz, disVMINIw, disVMULx, disVMULy, disVMULz, disVMULw, disVMULq, disVMAXi, disVMULi, disVMINIi, disVADDq, disVMADDq, disVADDi, disVMADDi, disVSUBq, disVMSUBq, disVSUBi, disVMSUBi, disVADD, disVMADD, disVMUL, disVMAX, disVSUB, disVMSUB, disVOPMSUB, disVMINI, disVIADD, disVISUB, disVIADDI, disNULL, disVIAND, disVIOR, disNULL, disNULL, disVCALLMS, disVCALLMSR, disNULL, disNULL, disCOP2_SPEC2, disCOP2_SPEC2, disCOP2_SPEC2, disCOP2_SPEC2, }; MakeDisF(disCOP2_SPEC1, disR5900_COP2_SPEC1[_Funct_] DisFInterfaceN) TdisR5900F disR5900_COP2_BC2[] = { //subset of disCOP2 BC disBC2F, disBC2T, disBC2FL, disBC2TL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, }; MakeDisF(disCOP2_BC2, disR5900_COP2_BC2[_Rt_] DisFInterfaceN) TdisR5900F disR5900_COP2[] = { // Subset of disCOP2 disNULL, disQMFC2, disCFC2, disNULL, disNULL, disQMTC2, disCTC2, disNULL, disCOP2_BC2, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1, disCOP2_SPEC1}; MakeDisF(disCOP2, disR5900_COP2[_Rs_] DisFInterfaceN) TdisR5900F disR5900_REGIMM[] = { // Subset of disREGIMM disBLTZ, disBGEZ, disBLTZL, disBGEZL, disNULL, disNULL, disNULL, disNULL, disTGEI, disTGEIU, disTLTI, disTLTIU, disTEQI, disNULL, disTNEI, disNULL, disBLTZAL, disBGEZAL, disBLTZALL, disBGEZALL, disNULL, disNULL, disNULL, disNULL, disMTSAB, disMTSAH , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; MakeDisF(disREGIMM, disR5900_REGIMM[_Rt_] DisFInterfaceN) TdisR5900F disR5900_SPECIAL[] = { disSLL, disNULL, disSRL, disSRA, disSLLV, disNULL, disSRLV, disSRAV, disJR, disJALR, disMOVZ, disMOVN, disSYSCALL, disBREAK,disNULL, disSYNC, disMFHI, disMTHI, disMFLO, disMTLO, disDSLLV, disNULL, disDSRLV, disDSRAV, disMULT, disMULTU,disDIV, disDIVU, disNULL, disNULL, disNULL, disNULL, disADD, disADDU, disSUB, disSUBU, disAND, disOR, disXOR, disNOR, disMFSA , disMTSA, disSLT, disSLTU, disDADD, disDADDU,disDSUB, disDSUBU, disTGE, disTGEU, disTLT, disTLTU, disTEQ, disNULL, disTNE, disNULL, disDSLL, disNULL, disDSRL, disDSRA, disDSLL32, disNULL, disDSRL32,disDSRA32 }; MakeDisF(disSPECIAL, disR5900_SPECIAL[_Funct_] DisFInterfaceN) TdisR5900F disR5900[] = { disSPECIAL, disREGIMM, disJ , disJAL , disBEQ , disBNE , disBLEZ , disBGTZ , disADDI , disADDIU , disSLTI, disSLTIU, disANDI, disORI , disXORI , disLUI , disCOP0 , disCOP1 , disCOP2, disNULL , disBEQL, disBNEL, disBLEZL, disBGTZL, disDADDI , disDADDIU, disLDL , disLDR , disMMI , disNULL, disLQ , disSQ , disLB , disLH , disLWL , disLW , disLBU , disLHU , disLWR , disLWU , disSB , disSH , disSWL , disSW , disSDL , disSDR , disSWR , disCACHE, disNULL , disLWC1 , disNULL, disPREF , disNULL, disNULL, disLQC2 , disLD , disNULL , disSWC1 , disNULL, disNULL , disNULL, disNULL, disSQC2 , disSD }; MakeDisF(disR5900F, disR5900[code >> 26] DisFInterfaceN)