Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Simulated PIF ROM bootcode adapted from DaedalusX64 emulator
- void simulate_pif_boot(u32 cic_chip)
- {
- u32 ix;
- vu32 *src, *dst;
- u32 country = ((*(vu32 *)0xB000003C) >> 8) & 0xFF;
- vu64 *gGPR = (vu64 *)0xA0300000;
- /* Clear XBUS/Flush/Freeze */
- ((vu32 *)0xA4100000)[3] = 0x15;
- // clear some OS globals for cleaner boot
- *(vu32*)0xA000030C = 0; // cold boot
- memset((void*)0xA000031C, 0, 64); // clear app nmi buffer
- // copy the memsize for different boot loaders
- if ((cic_chip == CIC_6105) && (gBootCic != CIC_6105))
- *(vu32 *)0xA00003F0 = *(vu32 *)0xA0000318;
- else if ((cic_chip != CIC_6105) && (gBootCic == CIC_6105))
- *(vu32 *)0xA0000318 = *(vu32 *)0xA00003F0;
- // Copy low 0x1000 bytes to DMEM
- src = (vu32 *)0xB0000000;
- dst = (vu32 *)0xA4000000;
- for (ix=0; ix<(0x1000>>2); ix++)
- dst[ix] = src[ix];
- // Need to copy crap to IMEM for CIC-6105 boot.
- dst = (vu32 *)0xA4001000;
- // register values due to pif boot for CiC chip and country code, and IMEM crap
- gGPR[0]=0x0000000000000000LL;
- gGPR[6]=0xFFFFFFFFA4001F0CLL;
- gGPR[7]=0xFFFFFFFFA4001F08LL;
- gGPR[8]=0x00000000000000C0LL;
- gGPR[9]=0x0000000000000000LL;
- gGPR[10]=0x0000000000000040LL;
- gGPR[11]=0xFFFFFFFFA4000040LL;
- gGPR[16]=0x0000000000000000LL;
- gGPR[17]=0x0000000000000000LL;
- gGPR[18]=0x0000000000000000LL;
- gGPR[19]=0x0000000000000000LL;
- gGPR[21]=0x0000000000000000LL;
- gGPR[26]=0x0000000000000000LL;
- gGPR[27]=0x0000000000000000LL;
- gGPR[28]=0x0000000000000000LL;
- gGPR[29]=0xFFFFFFFFA4001FF0LL;
- gGPR[30]=0x0000000000000000LL;
- switch (country) {
- case 0x44: //Germany
- case 0x46: //french
- case 0x49: //Italian
- case 0x50: //Europe
- case 0x53: //Spanish
- case 0x55: //Australia
- case 0x58: // ????
- case 0x59: // X (PAL)
- switch (cic_chip) {
- case CIC_6102:
- gGPR[5]=0xFFFFFFFFC0F1D859LL;
- gGPR[14]=0x000000002DE108EALL;
- gGPR[24]=0x0000000000000000LL;
- break;
- case CIC_6103:
- gGPR[5]=0xFFFFFFFFD4646273LL;
- gGPR[14]=0x000000001AF99984LL;
- gGPR[24]=0x0000000000000000LL;
- break;
- case CIC_6105:
- dst[0x04>>2] = 0xBDA807FC;
- gGPR[5]=0xFFFFFFFFDECAAAD1LL;
- gGPR[14]=0x000000000CF85C13LL;
- gGPR[24]=0x0000000000000002LL;
- break;
- case CIC_6106:
- gGPR[5]=0xFFFFFFFFB04DC903LL;
- gGPR[14]=0x000000001AF99984LL;
- gGPR[24]=0x0000000000000002LL;
- break;
- }
- gGPR[20]=0x0000000000000000LL;
- gGPR[23]=0x0000000000000006LL;
- gGPR[31]=0xFFFFFFFFA4001554LL;
- break;
- case 0x37: // 7 (Beta)
- case 0x41: // ????
- case 0x45: //USA
- case 0x4A: //Japan
- default:
- switch (cic_chip) {
- case CIC_6102:
- gGPR[5]=0xFFFFFFFFC95973D5LL;
- gGPR[14]=0x000000002449A366LL;
- break;
- case CIC_6103:
- gGPR[5]=0xFFFFFFFF95315A28LL;
- gGPR[14]=0x000000005BACA1DFLL;
- break;
- case CIC_6105:
- dst[0x04>>2] = 0x8DA807FC;
- gGPR[5]=0x000000005493FB9ALL;
- gGPR[14]=0xFFFFFFFFC2C20384LL;
- break;
- case CIC_6106:
- gGPR[5]=0xFFFFFFFFE067221FLL;
- gGPR[14]=0x000000005CD2B70FLL;
- break;
- }
- gGPR[20]=0x0000000000000001LL;
- gGPR[23]=0x0000000000000000LL;
- gGPR[24]=0x0000000000000003LL;
- gGPR[31]=0xFFFFFFFFA4001550LL;
- }
- switch (cic_chip) {
- case CIC_6101:
- gGPR[22]=0x000000000000003FLL;
- break;
- case CIC_6102:
- gGPR[1]=0x0000000000000001LL;
- gGPR[2]=0x000000000EBDA536LL;
- gGPR[3]=0x000000000EBDA536LL;
- gGPR[4]=0x000000000000A536LL;
- gGPR[12]=0xFFFFFFFFED10D0B3LL;
- gGPR[13]=0x000000001402A4CCLL;
- gGPR[15]=0x000000003103E121LL;
- gGPR[22]=0x000000000000003FLL;
- gGPR[25]=0xFFFFFFFF9DEBB54FLL;
- break;
- case CIC_6103:
- gGPR[1]=0x0000000000000001LL;
- gGPR[2]=0x0000000049A5EE96LL;
- gGPR[3]=0x0000000049A5EE96LL;
- gGPR[4]=0x000000000000EE96LL;
- gGPR[12]=0xFFFFFFFFCE9DFBF7LL;
- gGPR[13]=0xFFFFFFFFCE9DFBF7LL;
- gGPR[15]=0x0000000018B63D28LL;
- gGPR[22]=0x0000000000000078LL;
- gGPR[25]=0xFFFFFFFF825B21C9LL;
- break;
- case CIC_6105:
- dst[0x00>>2] = 0x3C0DBFC0;
- dst[0x08>>2] = 0x25AD07C0;
- dst[0x0C>>2] = 0x31080080;
- dst[0x10>>2] = 0x5500FFFC;
- dst[0x14>>2] = 0x3C0DBFC0;
- dst[0x18>>2] = 0x8DA80024;
- dst[0x1C>>2] = 0x3C0BB000;
- gGPR[1]=0x0000000000000000LL;
- gGPR[2]=0xFFFFFFFFF58B0FBFLL;
- gGPR[3]=0xFFFFFFFFF58B0FBFLL;
- gGPR[4]=0x0000000000000FBFLL;
- gGPR[12]=0xFFFFFFFF9651F81ELL;
- gGPR[13]=0x000000002D42AAC5LL;
- gGPR[15]=0x0000000056584D60LL;
- gGPR[22]=0x0000000000000091LL;
- gGPR[25]=0xFFFFFFFFCDCE565FLL;
- break;
- case CIC_6106:
- gGPR[1]=0x0000000000000000LL;
- gGPR[2]=0xFFFFFFFFA95930A4LL;
- gGPR[3]=0xFFFFFFFFA95930A4LL;
- gGPR[4]=0x00000000000030A4LL;
- gGPR[12]=0xFFFFFFFFBCB59510LL;
- gGPR[13]=0xFFFFFFFFBCB59510LL;
- gGPR[15]=0x000000007A3C07F4LL;
- gGPR[22]=0x0000000000000085LL;
- gGPR[25]=0x00000000465E3F72LL;
- break;
- }
- // set HW registers - PI_BSD_DOM1 regs, etc
- // now set MIPS registers - set CP0, and then GPRs, then jump thru gpr11 (which is 0xA400040)
- asm(".set noat\n\t"
- ".set noreorder\n\t"
- "li $8,0x34000000\n\t"
- "mtc0 $8,$12\n\t"
- "nop\n\t"
- "li $9,0x0006E463\n\t"
- "mtc0 $9,$16\n\t"
- "nop\n\t"
- "li $8,0x00005000\n\t"
- "mtc0 $8,$9\n\t"
- "nop\n\t"
- "li $9,0x0000005C\n\t"
- "mtc0 $9,$13\n\t"
- "nop\n\t"
- "li $8,0x007FFFF0\n\t"
- "mtc0 $8,$4\n\t"
- "nop\n\t"
- "li $9,0xFFFFFFFF\n\t"
- "mtc0 $9,$14\n\t"
- "nop\n\t"
- "mtc0 $9,$8\n\t"
- "nop\n\t"
- "mtc0 $9,$30\n\t"
- "nop\n\t"
- "lui $31,0xA030\n\t"
- "ld $1,0x08($31)\n\t"
- "ld $2,0x10($31)\n\t"
- "ld $3,0x18($31)\n\t"
- "ld $4,0x20($31)\n\t"
- "ld $5,0x28($31)\n\t"
- "ld $6,0x30($31)\n\t"
- "ld $7,0x38($31)\n\t"
- "ld $8,0x40($31)\n\t"
- "ld $9,0x48($31)\n\t"
- "ld $10,0x50($31)\n\t"
- "ld $11,0x58($31)\n\t"
- "ld $12,0x60($31)\n\t"
- "ld $13,0x68($31)\n\t"
- "ld $14,0x70($31)\n\t"
- "ld $15,0x78($31)\n\t"
- "ld $16,0x80($31)\n\t"
- "ld $17,0x88($31)\n\t"
- "ld $18,0x90($31)\n\t"
- "ld $19,0x98($31)\n\t"
- "ld $20,0xA0($31)\n\t"
- "ld $21,0xA8($31)\n\t"
- "ld $22,0xB0($31)\n\t"
- "ld $23,0xB8($31)\n\t"
- "ld $24,0xC0($31)\n\t"
- "ld $25,0xC8($31)\n\t"
- "ld $26,0xD0($31)\n\t"
- "ld $27,0xD8($31)\n\t"
- "ld $28,0xE0($31)\n\t"
- "ld $29,0xE8($31)\n\t"
- "ld $30,0xF0($31)\n\t"
- "ld $31,0xF8($31)\n\t"
- "jr $11\n\t"
- "nop"
- ::: "$8" );
- }
Advertisement
Add Comment
Please, Sign In to add comment