BITCH I'M BACK OUT MY COMA

This commit is contained in:
CocoSimone
2023-02-12 23:58:26 +01:00
parent a81587ec21
commit eb10687837
8 changed files with 199 additions and 117 deletions

View File

@@ -73,79 +73,117 @@ void ProcessPIFCommands(u8* pifRam, Controller& controller, Mem& mem) {
void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
u32 cicType = cartInfo.cicType;
bool pal = cartInfo.isPAL;
mem.Write32(regs, 0x1FC007E4, cicSeeds[cicType]);
mem.Write32(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]);
switch(cicType) {
case UNKNOWN_CIC_TYPE:
Util::warn("Unknown CIC type!\n");
break;
case CIC_NUS_6101:
mem.Write32(regs, 0x318, RDRAM_SIZE);
regs.gpr[2] = (s64)0xFFFFFFFFDF6445CC;
regs.gpr[3] = (s64)0xFFFFFFFFDF6445CC;
regs.gpr[4] = 0x45CC;
regs.gpr[5] = 0x73EE317A;
regs.gpr[6] = (s64)0xFFFFFFFFA4001F0C;
regs.gpr[7] = (s64)0xFFFFFFFFA4001F08;
regs.gpr[8] = 0xC0;
regs.gpr[10] = 0x40;
regs.gpr[11] = (s64)0xFFFFFFFFA4000040;
regs.gpr[12] = (s64)0xFFFFFFFFC7601FAC;
regs.gpr[13] = (s64)0xFFFFFFFFC7601FAC;
regs.gpr[14] = (s64)0xFFFFFFFFB48E2ED6;
regs.gpr[15] = (s64)0xFFFFFFFFBA1A7D4B;
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000000;
regs.gpr[2] = 0xFFFFFFFFDF6445CC;
regs.gpr[3] = 0xFFFFFFFFDF6445CC;
regs.gpr[4] = 0x00000000000045CC;
regs.gpr[5] = 0x0000000073EE317A;
regs.gpr[6] = 0xFFFFFFFFA4001F0C;
regs.gpr[7] = 0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[10] = 0x0000000000000040;
regs.gpr[11] = 0xFFFFFFFFA4000040;
regs.gpr[12] = 0xFFFFFFFFC7601FAC;
regs.gpr[13] = 0xFFFFFFFFC7601FAC;
regs.gpr[14] = 0xFFFFFFFFB48E2ED6;
regs.gpr[15] = 0xFFFFFFFFBA1A7D4B;
regs.gpr[16] = 0x0000000000000000;
regs.gpr[17] = 0x0000000000000000;
regs.gpr[18] = 0x0000000000000000;
regs.gpr[19] = 0x0000000000000000;
regs.gpr[20] = 0x0000000000000001;
regs.gpr[22] = 0x000000000000003F;
regs.gpr[21] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000001;
regs.gpr[24] = 0x0000000000000002;
regs.gpr[25] = (s64)0xFFFFFFFF905F4718;
regs.gpr[29] = (s64)0xFFFFFFFFA4001FF0;
regs.gpr[31] = (s64)0xFFFFFFFFA4001550;
regs.lo = (s64)0xFFFFFFFFBA1A7D4B;
regs.hi = (s64)0xFFFFFFFF997EC317;
regs.gpr[25] = 0xFFFFFFFF905F4718;
regs.gpr[26] = 0x0000000000000000;
regs.gpr[27] = 0x0000000000000000;
regs.gpr[28] = 0x0000000000000000;
regs.gpr[29] = 0xFFFFFFFFA4001FF0;
regs.gpr[30] = 0x0000000000000000;
regs.gpr[31] = 0xFFFFFFFFA4001550;
regs.lo = 0xFFFFFFFFBA1A7D4B;
regs.hi = 0xFFFFFFFF997EC317;
break;
case CIC_NUS_7102:
mem.Write32(regs, 0x318, RDRAM_SIZE);
regs.gpr[1] = 0x0000000000000001;
regs.gpr[2] = 0x000000001E324416;
regs.gpr[3] = 0x000000001E324416;
regs.gpr[4] = 0x0000000000004416;
regs.gpr[5] = 0x000000000EC5D9AF;
regs.gpr[6] = (s64)0xFFFFFFFFA4001F0C;
regs.gpr[7] = (s64)0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000001;
regs.gpr[2] = 0x000000001E324416;
regs.gpr[3] = 0x000000001E324416;
regs.gpr[4] = 0x0000000000004416;
regs.gpr[5] = 0x000000000EC5D9AF;
regs.gpr[6] = 0xFFFFFFFFA4001F0C;
regs.gpr[7] = 0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[10] = 0x0000000000000040;
regs.gpr[11] = (s64)0xFFFFFFFFA4000040;
regs.gpr[11] = 0xFFFFFFFFA4000040;
regs.gpr[12] = 0x00000000495D3D7B;
regs.gpr[13] = (s64)0xFFFFFFFF8B3DFA1E;
regs.gpr[13] = 0xFFFFFFFF8B3DFA1E;
regs.gpr[14] = 0x000000004798E4D4;
regs.gpr[15] = (s64)0xFFFFFFFFF1D30682;
regs.gpr[15] = 0xFFFFFFFFF1D30682;
regs.gpr[16] = 0x0000000000000000;
regs.gpr[17] = 0x0000000000000000;
regs.gpr[18] = 0x0000000000000000;
regs.gpr[19] = 0x0000000000000000;
regs.gpr[20] = 0x0000000000000000;
regs.gpr[21] = 0x0000000000000000;
regs.gpr[22] = 0x000000000000003F;
regs.gpr[23] = 0x0000000000000007;
regs.gpr[24] = 0x0000000000000000;
regs.gpr[25] = 0x0000000013D05CAB;
regs.gpr[29] = (s64)0xFFFFFFFFA4001FF0;
regs.gpr[31] = (s64)0xFFFFFFFFA4001554;
regs.gpr[26] = 0x0000000000000000;
regs.gpr[27] = 0x0000000000000000;
regs.gpr[28] = 0x0000000000000000;
regs.gpr[29] = 0xFFFFFFFFA4001FF0;
regs.gpr[30] = 0x0000000000000000;
regs.gpr[31] = 0xFFFFFFFFA4001554;
regs.lo = (s64)0xFFFFFFFFF1D30682;
regs.lo = 0xFFFFFFFFF1D30682;
regs.hi = 0x0000000010054A98;
break;
case CIC_NUS_6102_7101:
mem.Write32(regs, 0x318, RDRAM_SIZE);
regs.gpr[1] = 0x0000000000000001;
regs.gpr[2] = 0x000000000EBDA536;
regs.gpr[3] = 0x000000000EBDA536;
regs.gpr[4] = 0x000000000000A536;
regs.gpr[5] = (s64)0xFFFFFFFFC0F1D859;
regs.gpr[6] = (s64)0xFFFFFFFFA4001F0C;
regs.gpr[7] = (s64)0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000001;
regs.gpr[2] = 0x000000000EBDA536;
regs.gpr[3] = 0x000000000EBDA536;
regs.gpr[4] = 0x000000000000A536;
regs.gpr[5] = 0xFFFFFFFFC0F1D859;
regs.gpr[6] = 0xFFFFFFFFA4001F0C;
regs.gpr[7] = 0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[10] = 0x0000000000000040;
regs.gpr[11] = (s64)0xFFFFFFFFA4000040;
regs.gpr[12] = (s64)0xFFFFFFFFED10D0B3;
regs.gpr[11] = 0xFFFFFFFFA4000040;
regs.gpr[12] = 0xFFFFFFFFED10D0B3;
regs.gpr[13] = 0x000000001402A4CC;
regs.gpr[14] = 0x000000002DE108EA;
regs.gpr[15] = 0x000000003103E121;
regs.gpr[16] = 0x0000000000000000;
regs.gpr[17] = 0x0000000000000000;
regs.gpr[18] = 0x0000000000000000;
regs.gpr[19] = 0x0000000000000000;
regs.gpr[20] = 0x0000000000000001;
regs.gpr[25] = (s64)0xFFFFFFFF9DEBB54F;
regs.gpr[29] = (s64)0xFFFFFFFFA4001FF0;
regs.gpr[31] = (s64)0xFFFFFFFFA4001550;
regs.gpr[21] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000000;
regs.gpr[24] = 0x0000000000000000;
regs.gpr[25] = 0xFFFFFFFF9DEBB54F;
regs.gpr[26] = 0x0000000000000000;
regs.gpr[27] = 0x0000000000000000;
regs.gpr[28] = 0x0000000000000000;
regs.gpr[29] = 0xFFFFFFFFA4001FF0;
regs.gpr[30] = 0x0000000000000000;
regs.gpr[31] = 0xFFFFFFFFA4001550;
regs.hi = 0x000000003FC18657;
regs.lo = 0x000000003103E121;
@@ -153,25 +191,24 @@ void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
if (pal) {
regs.gpr[20] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000006;
regs.gpr[31] = (s64)0xFFFFFFFFA4001554;
regs.gpr[31] = 0xFFFFFFFFA4001554;
}
break;
case CIC_NUS_6103_7103:
mem.Write32(regs, 0x318, RDRAM_SIZE);
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000001;
regs.gpr[2] = 0x0000000049A5EE96;
regs.gpr[3] = 0x0000000049A5EE96;
regs.gpr[4] = 0x000000000000EE96;
regs.gpr[5] = (s64)0xFFFFFFFFD4646273;
regs.gpr[6] = (s64)0xFFFFFFFFA4001F0C;
regs.gpr[7] = (s64)0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000001;
regs.gpr[2] = 0x0000000049A5EE96;
regs.gpr[3] = 0x0000000049A5EE96;
regs.gpr[4] = 0x000000000000EE96;
regs.gpr[5] = 0xFFFFFFFFD4646273;
regs.gpr[6] = 0xFFFFFFFFA4001F0C;
regs.gpr[7] = 0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[10] = 0x0000000000000040;
regs.gpr[11] = (s64)0xFFFFFFFFA4000040;
regs.gpr[12] = (s64)0xFFFFFFFFCE9DFBF7;
regs.gpr[13] = (s64)0xFFFFFFFFCE9DFBF7;
regs.gpr[11] = 0xFFFFFFFFA4000040;
regs.gpr[12] = 0xFFFFFFFFCE9DFBF7;
regs.gpr[13] = 0xFFFFFFFFCE9DFBF7;
regs.gpr[14] = 0x000000001AF99984;
regs.gpr[15] = 0x0000000018B63D28;
regs.gpr[16] = 0x0000000000000000;
@@ -182,13 +219,13 @@ void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
regs.gpr[21] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000000;
regs.gpr[24] = 0x0000000000000000;
regs.gpr[25] = (s64)0xFFFFFFFF825B21C9;
regs.gpr[25] = 0xFFFFFFFF825B21C9;
regs.gpr[26] = 0x0000000000000000;
regs.gpr[27] = 0x0000000000000000;
regs.gpr[28] = 0x0000000000000000;
regs.gpr[29] = (s64)0xFFFFFFFFA4001FF0;
regs.gpr[29] = 0xFFFFFFFFA4001FF0;
regs.gpr[30] = 0x0000000000000000;
regs.gpr[31] = (s64)0xFFFFFFFFA4001550;
regs.gpr[31] = 0xFFFFFFFFA4001550;
regs.lo = 0x0000000018B63D28;
regs.hi = 0x00000000625C2BBE;
@@ -196,29 +233,41 @@ void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
if (pal) {
regs.gpr[20] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000006;
regs.gpr[31] = (s64)0xFFFFFFFFA4001554;
regs.gpr[31] = 0xFFFFFFFFA4001554;
}
break;
case CIC_NUS_6105_7105:
mem.Write32(regs, 0x3F0, RDRAM_SIZE);
regs.gpr[2] = (s64)0xFFFFFFFFF58B0FBF;
regs.gpr[3] = (s64)0xFFFFFFFFF58B0FBF;
regs.gpr[4] = 0x0000000000000FBF;
regs.gpr[5] = (s64)0xFFFFFFFFDECAAAD1;
regs.gpr[6] = (s64)0xFFFFFFFFA4001F0C;
regs.gpr[7] = (s64)0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000000;
regs.gpr[2] = 0xFFFFFFFFF58B0FBF;
regs.gpr[3] = 0xFFFFFFFFF58B0FBF;
regs.gpr[4] = 0x0000000000000FBF;
regs.gpr[5] = 0xFFFFFFFFDECAAAD1;
regs.gpr[6] = 0xFFFFFFFFA4001F0C;
regs.gpr[7] = 0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[10] = 0x0000000000000040;
regs.gpr[11] = (s64)0xFFFFFFFFA4000040;
regs.gpr[12] = (s64)0xFFFFFFFF9651F81E;
regs.gpr[11] = 0xFFFFFFFFA4000040;
regs.gpr[12] = 0xFFFFFFFF9651F81E;
regs.gpr[13] = 0x000000002D42AAC5;
regs.gpr[14] = 0x00000000489B52CF;
regs.gpr[15] = 0x0000000056584D60;
regs.gpr[16] = 0x0000000000000000;
regs.gpr[17] = 0x0000000000000000;
regs.gpr[18] = 0x0000000000000000;
regs.gpr[19] = 0x0000000000000000;
regs.gpr[20] = 0x0000000000000001;
regs.gpr[21] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000000;
regs.gpr[24] = 0x0000000000000002;
regs.gpr[25] = (s64)0xFFFFFFFFCDCE565F;
regs.gpr[29] = (s64)0xFFFFFFFFA4001FF0;
regs.gpr[31] = (s64)0xFFFFFFFFA4001550;
regs.gpr[25] = 0xFFFFFFFFCDCE565F;
regs.gpr[26] = 0x0000000000000000;
regs.gpr[27] = 0x0000000000000000;
regs.gpr[28] = 0x0000000000000000;
regs.gpr[29] = 0xFFFFFFFFA4001FF0;
regs.gpr[30] = 0x0000000000000000;
regs.gpr[31] = 0xFFFFFFFFA4001550;
regs.lo = 0x0000000056584D60;
regs.hi = 0x000000004BE35D1F;
@@ -226,52 +275,84 @@ void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo) {
if (pal) {
regs.gpr[20] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000006;
regs.gpr[31] = (s64)0xFFFFFFFFA4001554;
regs.gpr[31] = 0xFFFFFFFFA4001554;
}
mem.Write32(regs, 0x04001000, 0x3C0DBFC0);
mem.Write32(regs, 0x04001004, 0x8DA807FC);
mem.Write32(regs, 0x04001008, 0x25AD07C0);
mem.Write32(regs, 0x0400100C, 0x31080080);
mem.Write32(regs, 0x04001000, 0x5500FFFC);
mem.Write32(regs, 0x04001004, 0x3C0DBFC0);
mem.Write32(regs, 0x04001008, 0x8DA80024);
mem.Write32(regs, 0x0400100C, 0x3C0BB000);
mem.Write32(regs, IMEM_REGION_START + 0x00, 0x3C0DBFC0);
mem.Write32(regs, IMEM_REGION_START + 0x04, 0x8DA807FC);
mem.Write32(regs, IMEM_REGION_START + 0x08, 0x25AD07C0);
mem.Write32(regs, IMEM_REGION_START + 0x0C, 0x31080080);
mem.Write32(regs, IMEM_REGION_START + 0x10, 0x5500FFFC);
mem.Write32(regs, IMEM_REGION_START + 0x14, 0x3C0DBFC0);
mem.Write32(regs, IMEM_REGION_START + 0x18, 0x8DA80024);
mem.Write32(regs, IMEM_REGION_START + 0x1C, 0x3C0BB000);
break;
case CIC_NUS_6106_7106:
regs.gpr[2] = (s64)0xFFFFFFFFA95930A4;
regs.gpr[3] = (s64)0xFFFFFFFFA95930A4;
regs.gpr[0] = 0x0000000000000000;
regs.gpr[1] = 0x0000000000000000;
regs.gpr[2] = 0xFFFFFFFFA95930A4;
regs.gpr[3] = 0xFFFFFFFFA95930A4;
regs.gpr[4] = 0x00000000000030A4;
regs.gpr[5] = (s64)0xFFFFFFFFB04DC903;
regs.gpr[6] = (s64)0xFFFFFFFFA4001F0C;
regs.gpr[7] = (s64)0xFFFFFFFFA4001F08;
regs.gpr[5] = 0xFFFFFFFFB04DC903;
regs.gpr[6] = 0xFFFFFFFFA4001F0C;
regs.gpr[7] = 0xFFFFFFFFA4001F08;
regs.gpr[8] = 0x00000000000000C0;
regs.gpr[9] = 0x0000000000000000;
regs.gpr[10] = 0x0000000000000040;
regs.gpr[11] = (s64)0xFFFFFFFFA4000040;
regs.gpr[12] = (s64)0xFFFFFFFFBCB59510;
regs.gpr[13] = (s64)0xFFFFFFFFBCB59510;
regs.gpr[11] = 0xFFFFFFFFA4000040;
regs.gpr[12] = 0xFFFFFFFFBCB59510;
regs.gpr[13] = 0xFFFFFFFFBCB59510;
regs.gpr[14] = 0x000000000CF85C13;
regs.gpr[15] = 0x000000007A3C07F4;
regs.gpr[16] = 0x0000000000000000;
regs.gpr[17] = 0x0000000000000000;
regs.gpr[18] = 0x0000000000000000;
regs.gpr[19] = 0x0000000000000000;
regs.gpr[20] = 0x0000000000000001;
regs.gpr[21] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000000;
regs.gpr[24] = 0x0000000000000002;
regs.gpr[25] = 0x00000000465E3F72;
regs.gpr[29] = (s64)0xFFFFFFFFA4001FF0;
regs.gpr[26] = 0x0000000000000000;
regs.gpr[27] = 0x0000000000000000;
regs.gpr[28] = 0x0000000000000000;
regs.gpr[29] = 0xFFFFFFFFA4001FF0;
regs.gpr[30] = 0x0000000000000000;
regs.gpr[31] = (s64)0xFFFFFFFFA4001550;
regs.gpr[31] = 0xFFFFFFFFA4001550;
regs.lo = 0x000000007A3C07F4;
regs.hi = 0x0000000023953898;
if (pal) {
regs.gpr[20] = 0x0000000000000000;
regs.gpr[23] = 0x0000000000000006;
regs.gpr[31] = (s64)0xFFFFFFFFA4001554;
regs.gpr[31] = 0xFFFFFFFFA4001554;
}
break;
}
regs.gpr[22] = (cicSeeds[cicType] >> 8) & 0xFF;
regs.cop0.Reset();
mem.Write32(regs, 0x04300004, 0x01010101);
}
void ExecutePIF(Mem& mem, Registers& regs, CartInfo cartInfo) {
u32 cicType = cartInfo.cicType;
bool pal = cartInfo.isPAL;
mem.Write32(regs, PIF_RAM_REGION_START + 0x24, cicSeeds[cicType]);
switch(cicType) {
case UNKNOWN_CIC_TYPE:
Util::warn("Unknown CIC type!\n");
break;
case CIC_NUS_6101 ... CIC_NUS_6103_7103:
mem.Write32(regs, 0x318, RDRAM_SIZE);
break;
case CIC_NUS_6105_7105:
mem.Write32(regs, 0x3F0, RDRAM_SIZE);
break;
case CIC_NUS_6106_7106:
break;
}
DoPIFHLE(mem, regs, cartInfo);
}
}

View File

@@ -39,7 +39,7 @@ static_assert(sizeof(Controller) == 4);
struct Mem;
struct Registers;
const u32 cicSeeds[] = {
constexpr u32 cicSeeds[] = {
0x0,
0x00043F3F, // CIC_NUS_6101
0x00043F3F, // CIC_NUS_7102
@@ -62,5 +62,5 @@ enum CICType {
struct CartInfo;
void ProcessPIFCommands(u8*, Controller&, Mem&);
void DoPIFHLE(Mem& mem, Registers& regs, CartInfo cartInfo);
void ExecutePIF(Mem& mem, Registers& regs, CartInfo cartInfo);
}