mirror of
https://github.com/Azimer/Apollo.git
synced 2024-05-21 13:28:09 -04:00
4b081bc1c9
One of the last source codes before I went on hiatus.
285 lines
8.7 KiB
C++
285 lines
8.7 KiB
C++
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include "WinMain.h"
|
|
|
|
extern u8 *idmem;
|
|
extern u8 *rdram;
|
|
|
|
//#define rdram (char *)AudioInfo.RDRAM
|
|
#define dmem idmem
|
|
#define imem (u8 *)(idmem + 0x1000)
|
|
|
|
char *rspreg[0x20] = {
|
|
"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", "S8", "RA"
|
|
};
|
|
|
|
int multi[0xC] = {
|
|
0, 1, 2, 3, 4, 4, 3, 3, 4, 4, 4, 4
|
|
};
|
|
|
|
char *StoreVec[0xC] = {
|
|
"SBV", "SSV", "SLV", "SDV", "SQV", "SRV", "SPV", "SUV", "SHV", "SFV", "SWV", "STV"
|
|
};
|
|
|
|
char *LoadVec[0xC] = {
|
|
"LBV", "LSV", "LLV", "LDV", "LQV", "LRV", "LPV", "LUV", "LHV", "LFV", "LWV", "LTV"
|
|
};
|
|
|
|
char *Cop0Name[0x20] = {
|
|
"SP memory address", "SP DRAM DMA address", "SP read DMA length", "SP write DMA length",
|
|
"SP status", "SP DMA full", "SP DMA busy", "SP semaphore",
|
|
"DP CMD DMA start", "DP CMD DMA end", "DP CMD DMA current", "DP CMD status",
|
|
"DP clock counter", "DP buffer busy counter", "DP pipe busy counter", "DP TMEM load counter",
|
|
"Unknown CPR0", "Unknown CPR0", "Unknown CPR0", "Unknown CPR0",
|
|
"Unknown CPR0", "Unknown CPR0", "Unknown CPR0", "Unknown CPR0",
|
|
"Unknown CPR0", "Unknown CPR0", "Unknown CPR0", "Unknown CPR0",
|
|
"Unknown CPR0", "Unknown CPR0", "Unknown CPR0", "Unknown CPR0"
|
|
};
|
|
|
|
#define _RS ((opcode >> 21) & 0x1f)
|
|
#define _RT ((opcode >> 16) & 0x1f)
|
|
#define _RD ((opcode >> 11) & 0x1f)
|
|
#define _SA ((opcode >> 06) & 0x1f)
|
|
#define _IMM ((opcode & 0xFFFF))
|
|
#define _FUNC ((opcode & 0x3F))
|
|
|
|
char *LoadStoreOp [0xC] = {
|
|
"LB", "LH", "??", "LW", "LBU", "LHU", "??", "??",
|
|
"SB", "SH", "??", "SW"
|
|
};
|
|
|
|
char *Space (char *word) {
|
|
static char retVal [9];
|
|
int cnt;
|
|
memset (retVal, 32, 8);
|
|
retVal[8] = '\0';
|
|
cnt = 0;
|
|
while ((cnt < 8) && (word[cnt] != '\0')) {
|
|
retVal[cnt] = word[cnt];
|
|
cnt++;
|
|
}
|
|
return retVal;
|
|
}
|
|
|
|
char *VectOp [0x40] = {
|
|
"VMULF", "VMULU", "VRNDP", "VMULQ", "VMUDL", "VMUDM", "VMUDN", "VMUDH",
|
|
"VMACF", "VMACU", "VRNDN", "VMACQ", "VMADL", "VMADM", "VMADN", "VMADH",
|
|
"VADD ", "VSUB ", "?????", "VABS ", "VADDC", "VSUBC", "?????", "?????",
|
|
"?????", "?????", "?????", "?????", "?????", "VSAW ", "?????", "?????",
|
|
"VLT ", "VEQ ", "VNE ", "VGE ", "VCL ", "VCH ", "VCR ", "VMRG ",
|
|
"VAND ", "VNAND", "VOR ", "VNOR ", "VXOR ", "VNXOR", "?????", "?????",
|
|
"VRCP ", "VRCPL", "VRCPH", "VMOV ", "VRSQ ", "VRSQL", "VRSQH", "VNOOP",
|
|
"?????", "?????", "?????", "?????", "?????", "?????", "?????", "?????",
|
|
};
|
|
|
|
char *SHIFTS[0x8] = {
|
|
"SLL", "", "SRL", "SRA", "SLLV", "SRLV", "SRLV", "SRAV"
|
|
};
|
|
|
|
char *LOGICS[0xC] = {
|
|
"ADD", "ADDU", "SUB", "SUBU", "AND", "OR", "XOR", "NOR",
|
|
"", "", "SLT", "SLTU"
|
|
};
|
|
|
|
char *ElemSpec[0x10] = {
|
|
"", "", "[0q]", "[1q]", "[0h]", "[1h]", "[2h]", "[3h]",
|
|
"[0]", "[1]", "[2]", "[3]", "[4]", "[5]", "[6]", "[7]"
|
|
};
|
|
|
|
void DumpRSPLine(char *buffer, DWORD sppc) {
|
|
DWORD opcode;
|
|
buffer[0] = '\0';
|
|
opcode = *(DWORD *)(imem+(sppc&0xFFF));
|
|
sprintf (buffer, "0x%04X %08X", sppc&0xFFFF, opcode);
|
|
buffer += 8;
|
|
switch ((opcode >> 26)) {
|
|
case 0x0: // NOOP
|
|
switch (_FUNC) {
|
|
|
|
case 0x0: // SLL/NOP
|
|
if (_RD == 0) {
|
|
sprintf (buffer, "NOP");
|
|
break;
|
|
}
|
|
case 0x2: // SRL
|
|
case 0x3: // SRA
|
|
case 0x4: // SLLV
|
|
case 0x6: // SRLV
|
|
case 0x7: // SRAV
|
|
sprintf (buffer, "%s %s, %s, 0x%02X", Space (SHIFTS[_FUNC]), rspreg[_RD], rspreg[_RT], _SA);
|
|
break;
|
|
case 0x8: // JR
|
|
sprintf (buffer, "%s %s", Space ("JR"), rspreg[_RS]);
|
|
break;
|
|
case 0x9: // JALR
|
|
sprintf (buffer, "%s %s, %s", Space ("JALR"), rspreg[_RD], rspreg[_RS]);
|
|
break;
|
|
case 0xD: // BREAK
|
|
sprintf (buffer, "%s", Space ("BREAK"));
|
|
break;
|
|
case 0x20: // ADD
|
|
if (_RS == 0)
|
|
sprintf (buffer, "%s %s, %s", Space ("MOVE"), rspreg[_RD], rspreg[_RT]);
|
|
else if (_RT == 0)
|
|
sprintf (buffer, "%s %s, %s", Space ("MOVE"), rspreg[_RD], rspreg[_RS]);
|
|
else
|
|
sprintf (buffer, "%s %s, %s, %s", Space ("ADD"), rspreg[_RD], rspreg[_RS], rspreg[_RT]);
|
|
break;
|
|
case 0x21: // ADDU
|
|
case 0x22: // SUB
|
|
case 0x23: // SUBU
|
|
case 0x24: // AND
|
|
case 0x25: // OR
|
|
case 0x26: // XOR
|
|
case 0x27: // NOR
|
|
case 0x2A: // SLT
|
|
case 0x2B: // SLTU
|
|
sprintf (buffer, "%s %s, %s, %s", Space (LOGICS[_FUNC-0x20]), rspreg[_RD], rspreg[_RS], rspreg[_RT]);
|
|
break;
|
|
}
|
|
break;
|
|
case 0x1: // REG IMM
|
|
switch (_RT) {
|
|
case 0x00: // BLTZ
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BLTZ"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
break;
|
|
case 0x01: // BGEZ
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BGEZ"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
break;
|
|
case 0x10: // BLTZAL
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BLTZAL"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
break;
|
|
case 0x11: // BGEZAL
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BGEZAL"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
break;
|
|
}
|
|
break;
|
|
case 0x2: // J
|
|
sprintf (buffer, "%s 0x%04X", Space("J"), ((_IMM << 2) & 0xFFFF));
|
|
break;
|
|
case 0x3: // JAL
|
|
sprintf (buffer, "%s 0x%04X", Space("JAL"), ((_IMM << 2) & 0xFFFF));
|
|
break;
|
|
case 0x4: // BEQ
|
|
if (_RT == 0) {
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BEQZ"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
} else if (_RS == 0) {
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BEQZ"), rspreg[_RT], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
} else {
|
|
sprintf (buffer, "%s %s, %s, 0x%04X", Space ("BEQ"), rspreg[_RS], rspreg[_RT], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
}
|
|
break;
|
|
case 0x5: // BNE
|
|
if (_RT == 0) {
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BNEZ"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
} else if (_RS == 0) {
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BNEZ"), rspreg[_RT], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
} else {
|
|
sprintf (buffer, "%s %s, %s, 0x%04X", Space ("BNE"), rspreg[_RS], rspreg[_RT], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
}
|
|
break;
|
|
case 0x6: // BLEZ
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BLEZ"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
break;
|
|
break;
|
|
case 0x7: // BGTZ
|
|
sprintf (buffer, "%s %s, 0x%04X", Space ("BGTZ"), rspreg[_RS], ((_IMM << 2)+sppc+4)&0xFFFF);
|
|
break;
|
|
case 0x8: // ADDI
|
|
sprintf (buffer, "%s %s, %s, 0x%04X", Space("ADDI"), rspreg[_RT], rspreg[_RS], _IMM);
|
|
break;
|
|
case 0xC: // ANDI
|
|
sprintf (buffer, "%s %s, %s, 0x%04X", Space("ANDI"), rspreg[_RT], rspreg[_RS], _IMM);
|
|
break;
|
|
case 0xD: // ORI
|
|
sprintf (buffer, "%s %s, %s, 0x%04X", Space("ORI"), rspreg[_RT], rspreg[_RS], _IMM);
|
|
break;
|
|
case 0xF: // LUI
|
|
sprintf (buffer, "%s %s, 0x%04X", Space("LUI"), rspreg[_RT], _IMM);
|
|
break;
|
|
case 0x10: // COP0
|
|
switch (_RS) {
|
|
case 0x00: // MFC0
|
|
sprintf (buffer, "%s %s, %s", Space("MFC0"), rspreg[_RT], Cop0Name[_RD]);
|
|
break;
|
|
case 0x04: // MTC0
|
|
sprintf (buffer, "%s %s, %s", Space("MTC0"), rspreg[_RT], Cop0Name[_RD]);
|
|
break;
|
|
}
|
|
break;
|
|
case 0x12: // RSP Vector Ops
|
|
if (_RS < 0x10) {
|
|
switch (_RS) {
|
|
case 0x00: // MFC2
|
|
sprintf (buffer, "%s %s, $v%i [%i]", Space("MFC2"), rspreg[_RT], _RD, ((_SA >> 1) & 0xF));
|
|
break;
|
|
case 0x02: // CFC2
|
|
sprintf (buffer, "%s %s, %i", Space("CFC2"), rspreg[_RT], (_RD & 0x3));
|
|
break;
|
|
case 0x04: // MTC2
|
|
sprintf (buffer, "%s %s, $v%i [%i]", Space("MFC2"), rspreg[_RT], _RD, ((_SA >> 1) & 0xF));
|
|
break;
|
|
case 0x06: // CTC2
|
|
sprintf (buffer, "%s %s, %i", Space("CTC2"), rspreg[_RT], (_RD & 0x3));
|
|
break;
|
|
}
|
|
} else {
|
|
if (VectOp[_FUNC][0] != '?') {
|
|
sprintf (buffer, "%s $v%i, $v%i, $v%i %s", Space (VectOp[_FUNC]), _SA, _RD, _RT, ElemSpec[_RS&0xF]);
|
|
}
|
|
}
|
|
break;
|
|
case 0x20: // LB
|
|
case 0x21: // LH
|
|
case 0x23: // LW
|
|
case 0x24: // LBU
|
|
case 0x25: // LBH
|
|
case 0x28: // SB
|
|
case 0x29: // SH
|
|
case 0x2B: // SW
|
|
sprintf (buffer, "%s %s, 0x%04X (%s)", Space(LoadStoreOp[(opcode>>26)-0x20]), rspreg[_RT], _IMM, rspreg[_RS]);
|
|
break;
|
|
case 0x32: // LWC2
|
|
sprintf (buffer, "%s $v%i [%i], 0x%04X (%s)", Space(LoadVec[_RD]), _RT, ((_SA>>1)&0xF), (_FUNC << multi[_RD]), rspreg[_RS]);
|
|
break;
|
|
case 0x3A: // SWC2
|
|
sprintf (buffer, "%s $v%i [%i], 0x%04X (%s)", Space(StoreVec[_RD]), _RT, ((_SA>>1)&0xF), (_FUNC << multi[_RD]), rspreg[_RS]);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void RspDump () {
|
|
FILE *output;
|
|
char Buffer[256];
|
|
FILE *dfile;
|
|
int i;
|
|
u8 *dm = (u8 *)dmem;
|
|
char str[0x10];
|
|
dfile = fopen ("c:\\audio.txt", "wt");
|
|
|
|
output = fopen ("c:\\rspdump.txt", "wt");
|
|
|
|
for (DWORD sppc = 0xA4001000; sppc < 0xA4002000; sppc+=4) {
|
|
DumpRSPLine(Buffer, sppc);
|
|
strcat (Buffer, "\n");
|
|
fprintf (output, Buffer);
|
|
}
|
|
fclose (output);
|
|
|
|
for (i=0; i < 0x1000; i++) {
|
|
if ((i & 0xF) == 0x0)
|
|
fprintf (dfile, "%04X: ", i);
|
|
fprintf (dfile, "%02X ", dm[i^3]);
|
|
str[i&0xf] = dm[i^3];
|
|
if ((i & 0xF) == 0xF)
|
|
fprintf (dfile, "\n", str);
|
|
}
|
|
|
|
fclose (dfile);
|
|
Debug (0, "Dumped RSP");
|
|
//__asm int 3;
|
|
} |