├── DMA └── Pops_B4A4_SetDMAHook.txt ├── GTE ├── cooked │ ├── GtePops.c │ ├── PopsGTE_AVSZ3.txt │ ├── PopsGTE_AVSZ4.txt │ ├── PopsGTE_CC.txt │ ├── PopsGTE_CDP.txt │ ├── PopsGTE_DPCL.txt │ ├── PopsGTE_DPCS.txt │ ├── PopsGTE_DPCT.txt │ ├── PopsGTE_GPF.txt │ ├── PopsGTE_GPL.txt │ ├── PopsGTE_INTPL.txt │ ├── PopsGTE_MVMVA.txt │ ├── PopsGTE_NCCS.txt │ ├── PopsGTE_NCCT.txt │ ├── PopsGTE_NCDS.txt │ ├── PopsGTE_NCDT.txt │ ├── PopsGTE_NCLIP.txt │ ├── PopsGTE_NCS.txt │ ├── PopsGTE_NCT.txt │ ├── PopsGTE_OP.txt │ ├── PopsGTE_RTPS.txt │ ├── PopsGTE_RTPT.txt │ ├── PopsGTE_SQR.txt │ └── README.txt ├── init │ ├── PopsGTE_Init.txt │ ├── Pops_03F8.txt │ ├── Pops_0494.txt │ ├── README.txt │ └── module_start.txt └── raw │ ├── PopsGTE_AVSZ3.txt │ ├── PopsGTE_AVSZ4.txt │ ├── PopsGTE_CC.txt │ ├── PopsGTE_CDP.txt │ ├── PopsGTE_DPCL.txt │ ├── PopsGTE_DPCS.txt │ ├── PopsGTE_DPCT.txt │ ├── PopsGTE_GPF.txt │ ├── PopsGTE_GPL.txt │ ├── PopsGTE_INTPL.txt │ ├── PopsGTE_MVMVA.txt │ ├── PopsGTE_NCCS.txt │ ├── PopsGTE_NCCT.txt │ ├── PopsGTE_NCDS.txt │ ├── PopsGTE_NCDT.txt │ ├── PopsGTE_NCLIP.txt │ ├── PopsGTE_NCS.txt │ ├── PopsGTE_NCT.txt │ ├── PopsGTE_OP.txt │ ├── PopsGTE_RTPS.txt │ ├── PopsGTE_RTPT.txt │ ├── PopsGTE_SQR.txt │ └── README.txt ├── GTECheck ├── BUILD.BAT ├── CONVERT.BAT ├── CPE2X.COM ├── CWSDPMI.EXE ├── EXEFIXUP.EXE ├── MAIN.EXE ├── gte.c ├── gte.h ├── gte2.asm ├── gte2.h ├── gteregs.h ├── main.c └── main.lnk ├── GTETest ├── BUILD.BAT ├── CONVERT.BAT ├── CPE2X.COM ├── CWSDPMI.EXE ├── Disasm.c ├── Disasm.h ├── EXEFIXUP.C ├── EXEFIXUP.EXE ├── MAIN.EXE ├── Readme.txt ├── gte.c ├── gte.h ├── gte2.asm ├── gte2.h ├── image.bin ├── image.cue ├── main.c └── main.lnk ├── GTE_Divider ├── gte_divider2.h └── main.c ├── MDEC ├── Pops_EFB4_MDECReset.txt ├── Pops_F00C_Init.txt ├── Pops_MDEC_DMA.txt └── Pops_MDEC_Decode.txt ├── PopsExecute ├── Pops_0508_CpuMainLoop .txt ├── Pops_06AC.txt ├── Pops_0BDC_ExecGTE.txt ├── Pops_0C18_Exception.txt ├── Pops_13A8_InvalidateRecompilerCacheByAddress.txt ├── Pops_1430_InvalidateRecompilerCacheAll.txt ├── Pops_1498_SetupJITC.txt ├── Pops_5B2C_CpuExecute.txt └── Pops_9630_JITCompile.txt ├── PopsInit ├── PopsInit.txt ├── Pops_03F8_PSXReset.txt ├── Pops_0494_PSXInit.txt └── module_start.txt ├── README.md ├── RootCounters ├── 00081C.txt ├── 00095C.txt ├── 00BD64.txt ├── 17d5c.txt ├── Pops_BF00_RtcInit.txt ├── Pops_C000_RtcReadCount.txt ├── Pops_RtcRead.txt └── RtcWrite.txt ├── docs └── gte.txt └── imgstore ├── whc4e032dbd75870.jpg ├── whc51a31241062f2.png └── whc51a3124a21d97.jpg /DMA/Pops_B4A4_SetDMAHook.txt: -------------------------------------------------------------------------------- 1 | 2 | B4A4: 3 | void SetDMAHandler (int chan, dma_handler) 4 | { 5 | chan = chan & 0xFF; 6 | [0x00119A88 + chan * 16] = dma_handler; 7 | InstallHardwareHooks ( 0x1F801080 + chan * 16, 16, NULL, sub_0000B984 ); 8 | } 9 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_AVSZ3.txt: -------------------------------------------------------------------------------- 1 | 2 | AVSZ3 Required cycles: 5 3 | 4 | Function: Z-averaging 5 | 6 | Calculations: 7 | 8 | (1.31.21) OOTZ = ZSF3*SZ0(1) 9 | + ZSF3*SZ1(2) 10 | + ZSF3*SZ2(3); <4> 11 | (0.16. 0) OTZ = limC(OOTZ); 12 | (1.31. 0) MAC0 = OOTZ; 13 | 14 | AVSZ3: 15 | 16 | Pcsx: 17 | gteFLAG = 0; 18 | 19 | 20 | gteMAC0 = ((gteSZ1 + gteSZ2 + gteSZ3) * (gteZSF3)) >> 12; 21 | 22 | gteOTZ = FlimC(gteMAC0); 23 | 24 | 25 | SUM_FLAG 26 | 27 | Pops: 28 | gteMAC0 = (gteSZ1 + gteSZ2 + gteSZ3) * gteZSF3; 29 | gteFLAG = ((gteMAC0 >> 12) > 0xffff) << 18; 30 | gteOTZ = min (0xffff, max (0, gteMAC0 >> 12) ); 31 | 32 | 33 | a0 = gteSZ1 34 | a1 = gteSZ2 35 | a2 = gteSZ3 36 | 37 | v0 = gteZSF3 38 | 39 | a0 = gteSZ1 + gteSZ2 40 | a0 = gteSZ1 + gteSZ2 + gteSZ3 41 | 42 | Acc = (gteSZ1 + gteSZ2 + gteSZ3) * gteZSF3 43 | 44 | v0 = 0xFFFF 45 | 46 | a0 = lo 47 | 48 | gteMAC0 = a0 49 | 50 | a0 = a0 >> 12 51 | a1 = 0xFFFF < a0 52 | a0 = max (0, a0) 53 | a0 = min (0xFFFF, a0) 54 | 55 | a1 = a1 << 18 56 | VFPU.S330 = a1 57 | gteOTZ = a0 58 | 59 | 60 | 61 | 0x0000E5D0: 0x97840044 'D...' - lhu $a0, 68($gp) 62 | 0x0000E5D4: 0x97850048 'H...' - lhu $a1, 72($gp) 63 | 0x0000E5D8: 0x9786004C 'L...' - lhu $a2, 76($gp) 64 | 0x0000E5DC: 0x878200F4 '....' - lh $v0, 244($gp) 65 | 66 | 0x0000E5E0: 0x00852021 '! ..' - addu $a0, $a0, $a1 67 | 0x0000E5E4: 0x00862021 '! ..' - addu $a0, $a0, $a2 68 | 0x0000E5E8: 0x00820018 '....' - mult $a0, $v0 69 | 0x0000E5EC: 0x3402FFFF '...4' - li $v0, 0xFFFF 70 | 0x0000E5F0: 0x00002012 '. ..' - mflo $a0 71 | 72 | 0x0000E5F4: 0xAF840060 '`...' - sw $a0, 96($gp) 73 | 74 | 0x0000E5F8: 0x00042303 '.#..' - sra $a0, $a0, 12 75 | 0x0000E5FC: 0x0044282B '+(D.' - sltu $a1, $v0, $a0 76 | 0x0000E600: 0x0004202C ', ..' - max $a0, $zr, $a0 77 | 0x0000E604: 0x0044202D '- D.' - min $a0, $v0, $a0 78 | 0x0000E608: 0x00052C80 '.,..' - sll $a1, $a1, 18 79 | 0x0000E60C: 0x48E5000F '...H' - mtv $a1, S330 80 | 0x0000E610: 0x03E00008 '....' - jr $ra 81 | 0x0000E614: 0xA784001C '....' - sh $a0, 28($gp) 82 | 83 | 84 | Pops C : 85 | 86 | #define gteSZ1 ((u16*)psxRegs.CP2D.r)[17*2] 87 | #define gteSZ2 ((u16*)psxRegs.CP2D.r)[18*2] 88 | #define gteSZ3 ((u16*)psxRegs.CP2D.r)[19*2] 89 | #define gteZSF3 ((s16*)psxRegs.CP2C.r)[58] 90 | #define gteOTZ ((s16*)psxRegs.CP2D.r)[7*2] 91 | 92 | AVSZ3 93 | { 94 | u32 acc = gteSZ1 + gteSZ2 + gteSZ3; 95 | s64 mac = acc * gteZSF3; 96 | s32 prod = (s32)mac; // get lower part of 64-bit result 97 | gteMAC0 = prod; 98 | prod = prod >> 12; // keep sign while shifting 99 | gteOTZ = min (0xFFFF, max (0, prod)); 100 | FLAG[18] = (u32)prod > 0xFFFF; // since this is unsigned comparsion, all negative numbers are also checked 101 | } 102 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_AVSZ4.txt: -------------------------------------------------------------------------------- 1 | 2 | AVSZ4 Required cycles: 6 3 | 4 | Function: Z-averaging 5 | 6 | Calculations: 7 | 8 | (1.31.12) OOTZ =ZSF4*SZx(0) 9 | + ZSF4*SZ0(1) 10 | + ZSF4*SZ1(2) 11 | + ZSF4*SZ2(3); <4> 12 | (0.16. 0) OTZ = limC(OOTZ); 13 | (1.31. 0) MAC0 = OOTZ; 14 | 15 | AVSZ4: 16 | 17 | Pcsx: 18 | gteFLAG = 0; 19 | 20 | gteMAC0 = ((gteSZx + gteSZ0 + gteSZ1 + gteSZ2) * (gteZSF4))>> 12; 21 | 22 | 23 | gteOTZ = FlimC(gteMAC0); 24 | 25 | 26 | SUM_FLAG 27 | 28 | Pops: 29 | gteMAC0 = (gteSZ0 + gteSZ1 + gteSZ2 + gteSZx) * gteZSF4; 30 | gteFLAG = ((gteMAC0 >> 12) > 0xffff) << 18; 31 | gteOTZ = min (0xffff, max (0, gteMAC0 >> 12) ); 32 | 33 | 34 | a0 = (gteSZ0 + gteSZ1 + gteSZ2 + gteSZx) * gteZSF4 35 | 36 | gteMAC0 = a0; 37 | 38 | a0 >>= 12 39 | 40 | a1 = 0xffff < a0 41 | 42 | a0 = max (0, a0) 43 | a0 = min (0xffff, a0) 44 | 45 | a1 = a1 << 18 46 | 47 | VFPU.S330 = a1 48 | 49 | gteOTZ = a0; 50 | 51 | 52 | 0x0000E618: 0x97840044 'D...' - lhu $a0, 68($gp) // gteSZ0 53 | 0x0000E61C: 0x97850048 'H...' - lhu $a1, 72($gp) // gteSZ1 54 | 0x0000E620: 0x9786004C 'L...' - lhu $a2, 76($gp) // gteSZ2 55 | 0x0000E624: 0x878200F8 '....' - lh $v0, 248($gp) // gteZSF4 56 | 0x0000E628: 0x00852021 '! ..' - addu $a0, $a0, $a1 57 | 0x0000E62C: 0x97850040 '@...' - lhu $a1, 64($gp) // gteSZx 58 | 0x0000E630: 0x00862021 '! ..' - addu $a0, $a0, $a2 59 | 0x0000E634: 0x00852021 '! ..' - addu $a0, $a0, $a1 60 | 0x0000E638: 0x00820018 '....' - mult $a0, $v0 61 | 0x0000E63C: 0x3402FFFF '...4' - li $v0, 0xFFFF 62 | 0x0000E640: 0x00002012 '. ..' - mflo $a0 63 | 0x0000E644: 0xAF840060 '`...' - sw $a0, 96($gp) 64 | 0x0000E648: 0x00042303 '.#..' - sra $a0, $a0, 12 65 | 0x0000E64C: 0x0044282B '+(D.' - sltu $a1, $v0, $a0 66 | 0x0000E650: 0x0004202C ', ..' - max $a0, $zr, $a0 67 | 0x0000E654: 0x0044202D '- D.' - min $a0, $v0, $a0 68 | 0x0000E658: 0x00052C80 '.,..' - sll $a1, $a1, 18 69 | 0x0000E65C: 0x48E5000F '...H' - mtv $a1, S330 70 | 0x0000E660: 0x03E00008 '....' - jr $ra 71 | 0x0000E664: 0xA784001C '....' - sh $a0, 28($gp) 72 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_DPCT.txt: -------------------------------------------------------------------------------- 1 | DPCT: Depth cue triple 2 | 3 | DPCT Required cycles: 17 4 | 5 | Function: Depth queuing 6 | 7 | Calculations: 8 | n=0,1,2 { 9 | (1.27.16) RRn = Rn*1.0 + IR0*limA1S(RFC-R*1.0); <1> 10 | (1.27.16) GGn = Gn*1.0 + IR0*limA2S(GFC-G*1.0); <2> 11 | (1.27.16) BBn = Bn*1.0 + IR0*limA3S(BFC-B*1.0); <3> 12 | (-.8.-) CDn = CODE 13 | (0. 8. 0) Rn = limB1(RRn); 14 | (0. 8. 0) Gn = limB2(GGn); 15 | (0. 8. 0) Bn = limB3(BBn); 16 | } 17 | (1.11. 4) IR1 = limA1S(RR2); 18 | (1.11. 4) IR2 = limA2S(GG2); 19 | (1.11. 4) IR3 = limA3S(BB2); 20 | (1.27. 4) MAC1 = RR2; 21 | (1.27. 4) MAC2 = GG2; 22 | (1.27. 4) MAC3 = BB2; 23 | 24 | Pops: 25 | 26 | at = 0 // FLAG 27 | t5 = IR0 28 | t6 = 32767 29 | a1 = -32768 30 | t4 = 255 31 | v0 = RGB 32 | t2 = RFC 33 | a2 = GFC 34 | a0 = BFC 35 | 36 | loc_0000E980: 37 | 38 | t3 = RGB[n] 39 | t1 = RFC - R[n] << 4 40 | t7 = min (max (t1, -32768), 32767) // LIM_A1S 41 | t0 = (t1 != t7) << 24 // <1> 42 | t8 = R[n] << 16 + t7 * IR0 43 | t1 = t8 >> 16 44 | t0[21] = t1 >U 255 45 | v0[R] = min (255, max (0, t1)) // LIM_B1 46 | 47 | same for GGn and BBn : 48 | 49 | n = 0, 1, 2 { 50 | RRn = Rn << 16 + IR0 * LIM_A1S (RFC - Rn << 4) // FLAG[24] 51 | GGn = Gn << 16 + IR0 * LIM_A2S (BFC - Gn << 4) // FLAG[23] 52 | BBn = Bn << 16 + IR0 * LIM_A3S (GFC - Bn << 4) // FLAG[22] 53 | CDn = CODE; 54 | Rn = LIM_B1 (RRn >> 16); // FLAG[21] 55 | Gn = LIM_B2 (GGn >> 16); // FLAG[20] 56 | Bn = LIM_B3 (BBn >> 16); // FLAG[19] 57 | } 58 | 59 | FLAG |= t0 after each iteration. 60 | 61 | 62 | 0x0000E980: 0x8CEB005C '\...' - lw $t3, 92($a3) // RGB0 -> RGB1 -> RGB2 63 | 0x0000E984: 0x24E70004 '...$' - addiu $a3, $a3, 4 64 | 0x0000E988: 0x7D783800 '.8x}' - ext $t8, $t3, 0, 8 65 | 0x0000E98C: 0x0018C100 '....' - sll $t8, $t8, 4 66 | 0x0000E990: 0x01584823 '#HX.' - subu $t1, $t2, $t8 67 | 0x0000E994: 0x0125782C ',x%.' - max $t7, $t1, $a1 68 | 0x0000E998: 0x01EE782D '-x..' - min $t7, $t7, $t6 69 | 0x0000E99C: 0x012F4823 '#H/.' - subu $t1, $t1, $t7 70 | 0x0000E9A0: 0x0009402B '+@..' - sltu $t0, $zr, $t1 71 | 0x0000E9A4: 0x00084600 '.F..' - sll $t0, $t0, 24 72 | 0x0000E9A8: 0x01ED0018 '....' - mult $t7, $t5 73 | 0x0000E9AC: 0x0018C300 '....' - sll $t8, $t8, 12 74 | 0x0000E9B0: 0x00004812 '.H..' - mflo $t1 75 | 0x0000E9B4: 0x0309C021 '!...' - addu $t8, $t8, $t1 76 | 0x0000E9B8: 0x00184C03 '.L..' - sra $t1, $t8, 16 77 | 0x0000E9BC: 0x0189782B '+x..' - sltu $t7, $t4, $t1 78 | 0x0000E9C0: 0x0009482C ',H..' - max $t1, $zr, $t1 79 | 0x0000E9C4: 0x0189482D '-H..' - min $t1, $t4, $t1 80 | 0x0000E9C8: 0x7DE8AD44 'D..}' - ins $t0, $t7, 21, 1 81 | 0x0000E9CC: 0x7D223804 '.8"}' - ins $v0, $t1, 0, 8 82 | 83 | 0x0000E9D0: 0x7D633A00 '.:c}' - ext $v1, $t3, 8, 8 84 | 0x0000E9D4: 0x00031900 '....' - sll $v1, $v1, 4 85 | 0x0000E9D8: 0x00C34823 '#H..' - subu $t1, $a2, $v1 86 | 0x0000E9DC: 0x0125782C ',x%.' - max $t7, $t1, $a1 87 | 0x0000E9E0: 0x01EE782D '-x..' - min $t7, $t7, $t6 88 | 0x0000E9E4: 0x012F4823 '#H/.' - subu $t1, $t1, $t7 89 | 0x0000E9E8: 0x0009482B '+H..' - sltu $t1, $zr, $t1 90 | 0x0000E9EC: 0x7D28BDC4 '..(}' - ins $t0, $t1, 23, 1 91 | 0x0000E9F0: 0x01ED0018 '....' - mult $t7, $t5 92 | 0x0000E9F4: 0x00031B00 '....' - sll $v1, $v1, 12 93 | 0x0000E9F8: 0x00004812 '.H..' - mflo $t1 94 | 0x0000E9FC: 0x00691821 '!.i.' - addu $v1, $v1, $t1 95 | 0x0000EA00: 0x00034C03 '.L..' - sra $t1, $v1, 16 96 | 0x0000EA04: 0x0189782B '+x..' - sltu $t7, $t4, $t1 97 | 0x0000EA08: 0x0009482C ',H..' - max $t1, $zr, $t1 98 | 0x0000EA0C: 0x0189482D '-H..' - min $t1, $t4, $t1 99 | 0x0000EA10: 0x7DE8A504 '...}' - ins $t0, $t7, 20, 1 100 | 0x0000EA14: 0x7D227A04 '.z"}' - ins $v0, $t1, 8, 8 101 | 102 | 0x0000EA18: 0x7D6B3C00 '. RGB1 -> RGB2 122 | 0x0000EA64: 0x14FCFFC6 '....' - bne $a3, $gp, loc_0000E980 123 | 0x0000EA68: 0x00280825 '%.(.' - or $at, $at, $t0 124 | 125 | ---------- 126 | 127 | MAC1 = RRn >> 12 128 | MAC2 = GGn >> 12 129 | MAC3 = BBn >> 12 130 | 131 | IR1 = LIM_A1S (MAC1) // FLAG[24]; 132 | IR2 = LIM_A2S (MAC2) // FLAG[23]; 133 | IR3 = LIM_A3S (MAC3) // FLAG[22]; 134 | 135 | 0x0000EA6C: 0x0018C303 '....' - sra $t8, $t8, 12 136 | 0x0000EA70: 0xAF980064 'd...' - sw $t8, 100($gp) // MAC1 137 | 0x0000EA74: 0x0305602C ',`..' - max $t4, $t8, $a1 138 | 0x0000EA78: 0x018E602D '-`..' - min $t4, $t4, $t6 139 | 0x0000EA7C: 0x030CC023 '#...' - subu $t8, $t8, $t4 140 | 0x0000EA80: 0x0018402B '+@..' - sltu $t0, $zr, $t8 141 | 0x0000EA84: 0xAF8C0024 '$...' - sw $t4, 36($gp) // IR1 142 | 0x0000EA88: 0x00084600 '.F..' - sll $t0, $t0, 24 143 | 144 | 0x0000EA8C: 0x00031B03 '....' - sra $v1, $v1, 12 145 | 0x0000EA90: 0xAF830068 'h...' - sw $v1, 104($gp) // MAC2 146 | 0x0000EA94: 0x0065602C ',`e.' - max $t4, $v1, $a1 147 | 0x0000EA98: 0x018E602D '-`..' - min $t4, $t4, $t6 148 | 0x0000EA9C: 0x006C1823 '#.l.' - subu $v1, $v1, $t4 149 | 0x0000EAA0: 0x0003182B '+...' - sltu $v1, $zr, $v1 150 | 0x0000EAA4: 0xAF8C0028 '(...' - sw $t4, 40($gp) // IR2 151 | 0x0000EAA8: 0x7C68BDC4 '..h|' - ins $t0, $v1, 23, 1 152 | 153 | 0x0000EAAC: 0x000B5B03 '.[..' - sra $t3, $t3, 12 154 | 0x0000EAB0: 0xAF8B006C 'l...' - sw $t3, 108($gp) // MAC3 155 | 0x0000EAB4: 0x0165602C ',`e.' - max $t4, $t3, $a1 156 | 0x0000EAB8: 0x018E602D '-`..' - min $t4, $t4, $t6 157 | 0x0000EABC: 0x016C5823 '#Xl.' - subu $t3, $t3, $t4 158 | 0x0000EAC0: 0x000B582B '+X..' - sltu $t3, $zr, $t3 159 | 0x0000EAC4: 0xAF8C002C ',...' - sw $t4, 44($gp) // IR3 160 | 0x0000EAC8: 0x7D68B584 '..h}' - ins $t0, $t3, 22, 1 161 | 162 | 0x0000EACC: 0x00280825 '%.(.' - or $at, $at, $t0 163 | 0x0000EAD0: 0x03E00008 '....' - jr $ra 164 | 0x0000EAD4: 0x48E1000F '...H' - mtv $at, S330 165 | 166 | 167 | --------------------- 168 | 169 | Resulting assembly: 170 | 171 | DPCT: 172 | 173 | FLAG = 0 174 | 175 | n = 0, 1, 2 { 176 | RRn = Rn << 16 + IR0 * LIM_A1S (RFC - Rn << 4) // FLAG[24] 177 | GGn = Gn << 16 + IR0 * LIM_A2S (BFC - Gn << 4) // FLAG[23] 178 | BBn = Bn << 16 + IR0 * LIM_A3S (GFC - Bn << 4) // FLAG[22] 179 | CDn = CODE; 180 | Rn = LIM_B1 (RRn >> 16); // FLAG[21] 181 | Gn = LIM_B2 (GGn >> 16); // FLAG[20] 182 | Bn = LIM_B3 (BBn >> 16); // FLAG[19] 183 | } 184 | 185 | MAC1 = RRn >> 12 186 | MAC2 = GGn >> 12 187 | MAC3 = BBn >> 12 188 | 189 | IR1 = LIM_A1S (MAC1) // FLAG[24]; 190 | IR2 = LIM_A2S (MAC2) // FLAG[23]; 191 | IR3 = LIM_A3S (MAC3) // FLAG[22]; 192 | 193 | 194 | FLAWS: 195 | 196 | Pops has no check for "Calculation test result #1/2/3 overflow generated (2^43 or more)" 197 | (see bits 30, 29, 28 in FLAG) -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_GPF.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_GPF.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_GPL.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_GPL.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_INTPL.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_INTPL.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_MVMVA.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_MVMVA.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_NCCS.txt: -------------------------------------------------------------------------------- 1 | 2 | NCCS Required cycles: 17 3 | 4 | Function: Light source calculation 5 | 6 | Calculations: 7 | (1.19.24) LL1 = L11*VX0 + L12*VY0 + L13*VZ0; <1> 8 | (1.19.24) LL2 = L21*VX0 + L22*VY0 + L23*VZ0; <2> 9 | (1.19.24) LL3 = L31*VX0 + L32*VY0 + L33*VZ0; <3> 10 | (1. 3.12) L1 = limA(LL1); 11 | (1. 3.12) L2 = limA(LL2); 12 | (1. 3.12) L3 = limA(LL3); 13 | (1.19.24) RRLT = RBK + LR1*L1 +LR2*L2 + LR3*L3; <1> 14 | (1.19.24) GGLT = GBK + LG1*L1 +LG2*L2 + LG3*L3; <2> 15 | (1.19.24) BBLT = BBK + LB1*L1 +LB2*L2 + LB3*L3; <3> 16 | (1. 3.12) RLT = limA1U(RRLT); 17 | (1. 3.12) GLT = limA2U(GGLT); 18 | (1. 3.12) BLT = limA3U(BBLT); 19 | (1.27.16) RR0 = R*RLT; <1> 20 | (1.27.16) GG0 = G*GLT; <2> 21 | (1.27.16) BB0 = B*BLT; <3> 22 | (1.11. 4) IR1 = limA1U(RR0); 23 | (1.11. 4) IR2 = limA2U(GG0); 24 | (1.11. 4) IR3 = limA3U(BB0); 25 | (-. 8. -) CD0 <- CD1 <- CD2 <- CODE 26 | (0. 8. 0) R0 <- R1 <- R2 <- limB1(RR0); 27 | (0. 8. 0) G0 <- G1 <- G2 <- limB2(GG0); 28 | (0. 8. 0) B0 <- B1 <- B2 <- limB3(BB0); 29 | (1.27. 4) MAC1 = RR0; 30 | (1.27. 4) MAC2 = GG0; 31 | (1.27. 4) MAC3 = BB0; 32 | 33 | 34 | NCCS: 35 | 36 | 0x0000D9DC: 0xDB8800A0 '....' - lv.q C200, 160($gp) // L11L12 37 | 0x0000D9E0: 0xDB8900B0 '....' - lv.q C210, 176($gp) // L33 RBK 38 | 0x0000D9E4: 0xDB8A0000 '....' - lv.q C220, 0($gp) // VXY0 39 | 0x0000D9E8: 0xD03B0880 '..;.' - vs2i.p C000, C200 40 | 0x0000D9EC: 0xD03B4881 '.H;.' - vs2i.p C010, C202 41 | 0x0000D9F0: 0xD03B0A84 '..;.' - vs2i.p C100, C220 42 | 0x0000D9F4: 0xD29C8080 '....' - vi2f.q C000, C000, 28 43 | 0x0000D9F8: 0xD29C8181 '....' - vi2f.q C010, C010, 28 44 | 0x0000D9FC: 0xD28C0942 'B...' - vi2f.s S022, S210, 12 45 | 0x0000DA00: 0xD29C8404 '....' - vi2f.t C100, C100, 28 46 | 0x0000DA04: 0xD0004182 '.A..' - vmov.p C020, C012 47 | 0x0000DA08: 0xD0002141 'A!..' - vmov.s S012, S011 48 | 0x0000DA0C: 0xD0000121 '!...' - vmov.s S011, S010 49 | 0x0000DA10: 0xD0006001 '.`..' - vmov.s S010, S003 50 | 0x0000DA14: 0xF1048018 '....' - vtfm3.t C600, M000, C100 51 | 0x0000DA18: 0xD006800F '....' - vzero.t C330 52 | 0x0000DA1C: 0x6DB39814 '...m' - vmax.t C500, C600, R403 53 | 0x0000DA20: 0x6D139414 '...m' - vmin.t C500, C500, C430 54 | 0x0000DA24: 0x6C189405 '...l' - vcmp.t NE, C500, C600 55 | 0x0000DA28: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 56 | 0x0000DA2C: 0xDB8800C0 '....' - lv.q C200, 192($gp) 57 | 0x0000DA30: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 58 | 0x0000DA34: 0xD03B0880 '..;.' - vs2i.p C000, C200 59 | 0x0000DA38: 0xD03B4881 '.H;.' - vs2i.p C010, C202 60 | 0x0000DA3C: 0xD29C8080 '....' - vi2f.q C000, C000, 28 61 | 0x0000DA40: 0xD29C8181 '....' - vi2f.q C010, C010, 28 62 | 0x0000DA44: 0xD28C0B42 'B...' - vi2f.s S022, S230, 12 63 | 0x0000DA48: 0xD0004182 '.A..' - vmov.p C020, C012 64 | 0x0000DA4C: 0xD0002141 'A!..' - vmov.s S012, S011 65 | 0x0000DA50: 0xD0000121 '!...' - vmov.s S011, S010 66 | 0x0000DA54: 0xD0006001 '.`..' - vmov.s S010, S003 67 | 0x0000DA58: 0xD28CC923 '#...' - vi2f.t R003, C211, 12 68 | 0x0000DA5C: 0xF1948018 '....' - vhtfm4.q C600, M000, C500 69 | 0x0000DA60: 0x8F840018 '....' - lw $a0, 24($gp) 70 | 0x0000DA64: 0xBFEA0040 '@...' - cache 0xA, 64($ra) 71 | 0x0000DA68: 0x6DB39804 '...m' - vmax.t C100, C600, R403 72 | 0x0000DA6C: 0x6D138404 '...m' - vmin.t C100, C100, C430 73 | 0x0000DA70: 0x6C188405 '...l' - vcmp.t NE, C100, C600 74 | 0x0000DA74: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 75 | 0x0000DA78: 0x7C823800 '.8.|' - ext $v0, $a0, 0, 8 76 | 0x0000DA7C: 0x7C853A00 '.:.|' - ext $a1, $a0, 8, 8 77 | 0x0000DA80: 0x7C863C00 '.<.|' - ext $a2, $a0, 16, 8 78 | 0x0000DA84: 0x48E20001 '...H' - mtv $v0, S010 79 | 0x0000DA88: 0x48E50021 '!..H' - mtv $a1, S011 80 | 0x0000DA8C: 0x48E60041 'A..H' - mtv $a2, S012 81 | 0x0000DA90: 0xD2888101 '....' - vi2f.t C010, C010, 8 82 | 0x0000DA94: 0x64048108 '...d' - vmul.t C200, C010, C100 83 | 0x0000DA98: 0x00042042 'B ..' - srl $a0, $a0, 1 84 | 0x0000DA9C: 0x48E40063 'c..H' - mtv $a0, S033 85 | 0x0000DAA0: 0xDB9E0050 'P...' - lv.q C720, 80($gp) 86 | 0x0000DAA4: 0x6DB38802 '...m' - vmax.t C020, C200, R403 87 | 0x0000DAA8: 0xD20C8801 '....' - vf2in.t C010, C200, 12 88 | 0x0000DAAC: 0xD0048800 '....' - vsat0.t C000, C200 89 | 0x0000DAB0: 0x6D138202 '...m' - vmin.t C020, C020, C430 90 | 0x0000DAB4: 0xF7810066 'f...' - svr.q C010, 100($gp) 91 | 0x0000DAB8: 0x6C028805 '...l' - vcmp.t NE, C200, C020 92 | 0x0000DABC: 0xD20C8202 '....' - vf2in.t C020, C020, 12 93 | 0x0000DAC0: 0xD21F8803 '....' - vf2in.t C030, C200, 31 94 | 0x0000DAC4: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 95 | 0x0000DAC8: 0x6C008805 '...l' - vcmp.t NE, C200, C000 96 | 0x0000DACC: 0xD0468F6F 'o.F.' - vfad.t R313, C330 97 | 0x0000DAD0: 0xF7820026 '&...' - svr.q C020, 36($gp) 98 | 0x0000DAD4: 0xD006800F '....' - vzero.t C330 99 | 0x0000DAD8: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 100 | 0x0000DADC: 0xD0468F8F '..F.' - vfad.q C330, C330 101 | 0x0000DAE0: 0xD03C83FE '..<.' - vi2uc.q S723, C030 // fixed 102 | 0x0000DAE4: 0xF79E0058 'X...' - svl.q C720, 88($gp) 103 | 0x0000DAE8: 0x03E00008 '....' - jr $ra 104 | 0x0000DAEC: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 105 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_NCCT.txt: -------------------------------------------------------------------------------- 1 | 2 | NCCT Required cycles: 39 3 | 4 | Function: Light source calculation 5 | 6 | Calculations: 7 | n=0,1,2 { 8 | (1.19.24) LL1n = L11*VXn + L12*VYn + L13*VZn; <1> 9 | (1.19.24) LL2n = L21*VXn + L22*VYn + L23*VZn; <2> 10 | (1.19.24) LL3n = L31*VXn + L32*VYn + L33*VZn; <3> 11 | (1. 3.12) L1n = limA1U(LL1n); 12 | (1. 3.12) L2n = limA2U(LL2n); 13 | (1. 3.12) L3n = limA3U(LL3n); 14 | (1.19.24) RRLTn = RBK + LR1*L1n + LR2*L2n + LR3*L3n; <1> 15 | (1.19.24) GGLTn = GBK + LG1*L1n + LG2*L2n + LG3*L3n; <2> 16 | (1.19.24) BBLTn = BBK + LB1*L1n + LB2*L2n + LB3*L3n; <3> 17 | (1. 3.12) RLTn = limA1U(RRLTn); 18 | (1. 3.12) GLTn = limA2U(GGLTn); 19 | (1. 3.12) BLTn = limA3U(BBLTn); 20 | (1.27.16) RRn = R*RLTn; <1> 21 | (1.27.16) GGn = G*GLTn; <2> 22 | (1.27.16) BBn = B*BLTn; <3> 23 | (-. 8. -) CDn = CODE 24 | (0. 8. 0) Rn = limB1(RRn); 25 | (0. 8. 0) Gn = limB2(GGn); 26 | (0. 8. 0) Bn = limB3(BBn); 27 | } 28 | (1.11. 4) IR1 = limA1U(RR2); IR2 = limA2U(GG2); 29 | (1.11. 4) IR3 = limA3U(BB2); 30 | (1.27. 4) MAC1 = RR2; 31 | (1.27. 4) MAC2 = GG2; 32 | (1.27. 4) MAC3 = BB2; 33 | 34 | NCCT: 35 | 36 | 0x0000DAF0: 0xDB860010 '....' - lv.q C120, 16($gp) 37 | 0x0000DAF4: 0xDB8800A0 '....' - lv.q C200, 160($gp) 38 | 0x0000DAF8: 0xDB8900B0 '....' - lv.q C210, 176($gp) 39 | 0x0000DAFC: 0xDB8A0000 '....' - lv.q C220, 0($gp) 40 | 0x0000DB00: 0xD03B0880 '..;.' - vs2i.p C000, C200 41 | 0x0000DB04: 0xD03B4881 '.H;.' - vs2i.p C010, C202 42 | 0x0000DB08: 0xD03B0A84 '..;.' - vs2i.p C100, C220 43 | 0x0000DB0C: 0xD29C8080 '....' - vi2f.q C000, C000, 28 44 | 0x0000DB10: 0xD29C8181 '....' - vi2f.q C010, C010, 28 45 | 0x0000DB14: 0xD28C0942 'B...' - vi2f.s S022, S210, 12 46 | 0x0000DB18: 0xD29C8404 '....' - vi2f.t C100, C100, 28 47 | 0x0000DB1C: 0xD0004182 '.A..' - vmov.p C020, C012 48 | 0x0000DB20: 0xD0002141 'A!..' - vmov.s S012, S011 49 | 0x0000DB24: 0xD0000121 '!...' - vmov.s S011, S010 50 | 0x0000DB28: 0xD0006001 '.`..' - vmov.s S010, S003 51 | 0x0000DB2C: 0xD03B4A85 '.J;.' - vs2i.p C110, C222 52 | 0x0000DB30: 0xD03B0686 '..;.' - vs2i.p C120, C120 53 | 0x0000DB34: 0xD29C8505 '....' - vi2f.t C110, C110, 28 54 | 0x0000DB38: 0xD29C8606 '....' - vi2f.t C120, C120, 28 55 | 0x0000DB3C: 0xF0048018 '....' - vmmul.t M600, E000, M100 56 | 0x0000DB40: 0xD006800F '....' - vzero.t C330 57 | 0x0000DB44: 0xDB8800C0 '....' - lv.q C200, 192($gp) 58 | 0x0000DB48: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 59 | 0x0000DB4C: 0xD03B0880 '..;.' - vs2i.p C000, C200 60 | 0x0000DB50: 0xD03B4881 '.H;.' - vs2i.p C010, C202 61 | 0x0000DB54: 0xD29C8080 '....' - vi2f.q C000, C000, 28 62 | 0x0000DB58: 0xD29C8181 '....' - vi2f.q C010, C010, 28 63 | 0x0000DB5C: 0xD28C0B42 'B...' - vi2f.s S022, S230, 12 64 | 0x0000DB60: 0xD0004182 '.A..' - vmov.p C020, C012 65 | 0x0000DB64: 0xD0002141 'A!..' - vmov.s S012, S011 66 | 0x0000DB68: 0xD0000121 '!...' - vmov.s S011, S010 67 | 0x0000DB6C: 0xD0006001 '.`..' - vmov.s S010, S003 68 | 0x0000DB70: 0xD28CC923 '#...' - vi2f.t R003, C211, 12 69 | 0x0000DB74: 0xD0078037 '7...' - vone.t R503 70 | 0x0000DB78: 0x6DB39814 '...m' - vmax.t C500, C600, R403 71 | 0x0000DB7C: 0x6DB39915 '...m' - vmax.t C510, C610, R403 72 | 0x0000DB80: 0x6DB39A16 '...m' - vmax.t C520, C620, R403 73 | 0x0000DB84: 0x6D139414 '...m' - vmin.t C500, C500, C430 74 | 0x0000DB88: 0x6D139515 '...m' - vmin.t C510, C510, C430 75 | 0x0000DB8C: 0x6D139616 '...m' - vmin.t C520, C520, C430 76 | 0x0000DB90: 0x6C189405 '...l' - vcmp.t NE, C500, C600 77 | 0x0000DB94: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 78 | 0x0000DB98: 0x6C199505 '...l' - vcmp.t NE, C510, C610 79 | 0x0000DB9C: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 80 | 0x0000DBA0: 0x6C1A9605 '...l' - vcmp.t NE, C520, C620 81 | 0x0000DBA4: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 82 | 0x0000DBA8: 0xF0148098 '....' - vmmul.q M600, E000, M500 83 | 0x0000DBAC: 0x8F840018 '....' - lw $a0, 24($gp) 84 | 0x0000DBB0: 0xBFEA0040 '@...' - cache 0xA, 64($ra) 85 | 0x0000DBB4: 0x7C823800 '.8.|' - ext $v0, $a0, 0, 8 86 | 0x0000DBB8: 0x7C853A00 '.:.|' - ext $a1, $a0, 8, 8 87 | 0x0000DBBC: 0x7C863C00 '.<.|' - ext $a2, $a0, 16, 8 88 | 0x0000DBC0: 0x48E20001 '...H' - mtv $v0, S010 89 | 0x0000DBC4: 0x48E50021 '!..H' - mtv $a1, S011 90 | 0x0000DBC8: 0x48E60041 'A..H' - mtv $a2, S012 91 | 0x0000DBCC: 0xD2888101 '....' - vi2f.t C010, C010, 8 92 | 0x0000DBD0: 0x6DB39804 '...m' - vmax.t C100, C600, R403 93 | 0x0000DBD4: 0x6DB39905 '...m' - vmax.t C110, C610, R403 94 | 0x0000DBD8: 0x6DB39A06 '...m' - vmax.t C120, C620, R403 95 | 0x0000DBDC: 0x6D138404 '...m' - vmin.t C100, C100, C430 96 | 0x0000DBE0: 0x6D138505 '...m' - vmin.t C110, C110, C430 97 | 0x0000DBE4: 0x6D138606 '...m' - vmin.t C120, C120, C430 98 | 0x0000DBE8: 0x6C188405 '...l' - vcmp.t NE, C100, C600 99 | 0x0000DBEC: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 100 | 0x0000DBF0: 0x6C198505 '...l' - vcmp.t NE, C110, C610 101 | 0x0000DBF4: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 102 | 0x0000DBF8: 0x6C1A8605 '...l' - vcmp.t NE, C120, C620 103 | 0x0000DBFC: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 104 | 0x0000DC00: 0x64048108 '...d' - vmul.t C200, C010, C100 105 | 0x0000DC04: 0x64058109 '...d' - vmul.t C210, C010, C110 106 | 0x0000DC08: 0x6406810A '...d' - vmul.t C220, C010, C120 107 | 0x0000DC0C: 0x00042042 'B ..' - srl $a0, $a0, 1 108 | 0x0000DC10: 0x48E40060 '`..H' - mtv $a0, S003 109 | 0x0000DC14: 0x48E40061 'a..H' - mtv $a0, S013 110 | 0x0000DC18: 0x48E40062 'b..H' - mtv $a0, S023 111 | 0x0000DC1C: 0xD20C8A19 '....' - vf2in.t C610, C220, 12 112 | 0x0000DC20: 0x6DB38800 '...m' - vmax.t C000, C200, R403 113 | 0x0000DC24: 0x6DB38901 '...m' - vmax.t C010, C210, R403 114 | 0x0000DC28: 0x6DB38A02 '...m' - vmax.t C020, C220, R403 115 | 0x0000DC2C: 0x6D138004 '...m' - vmin.t C100, C000, C430 116 | 0x0000DC30: 0x6D138105 '...m' - vmin.t C110, C010, C430 117 | 0x0000DC34: 0xF7990066 'f...' - svr.q C610, 100($gp) 118 | 0x0000DC38: 0x6C048805 '...l' - vcmp.t NE, C200, C100 119 | 0x0000DC3C: 0x6D138206 '...m' - vmin.t C120, C020, C430 120 | 0x0000DC40: 0xD0048800 '....' - vsat0.t C000, C200 121 | 0x0000DC44: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 122 | 0x0000DC48: 0x6C058905 '...l' - vcmp.t NE, C210, C110 123 | 0x0000DC4C: 0xD0048901 '....' - vsat0.t C010, C210 124 | 0x0000DC50: 0xD0048A02 '....' - vsat0.t C020, C220 125 | 0x0000DC54: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 126 | 0x0000DC58: 0xD20C8604 '....' - vf2in.t C100, C120, 12 127 | 0x0000DC5C: 0x6C068A05 '...l' - vcmp.t NE, C220, C120 128 | 0x0000DC60: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 129 | 0x0000DC64: 0xF7840026 '&...' - svr.q C100, 36($gp) 130 | 0x0000DC68: 0xD0468F6F 'o.F.' - vfad.t R313, C330 131 | 0x0000DC6C: 0x6C008805 '...l' - vcmp.t NE, C200, C000 132 | 0x0000DC70: 0xD21F8000 '....' - vf2in.t C000, C000, 31 133 | 0x0000DC74: 0xD006800F '....' - vzero.t C330 134 | 0x0000DC78: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 135 | 0x0000DC7C: 0x6C018905 '...l' - vcmp.t NE, C210, C010 136 | 0x0000DC80: 0xD21F8101 '....' - vf2in.t C010, C010, 31 137 | 0x0000DC84: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 138 | 0x0000DC88: 0x6C028A05 '...l' - vcmp.t NE, C220, C020 139 | 0x0000DC8C: 0xD21F8202 '....' - vf2in.t C020, C020, 31 140 | 0x0000DC90: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 141 | 0x0000DC94: 0xD03C80BE '..<.' - vi2uc.q S323, C000 // fixed 142 | 0x0000DC98: 0xD03C81DE '..<.' - vi2uc.q S523, C010 // fixed 143 | 0x0000DC9C: 0xD03C82FE '..<.' - vi2uc.q S723, C020 // fixed 144 | 0x0000DCA0: 0xD0468F8F '..F.' - vfad.q C330, C330 145 | 0x0000DCA4: 0xF79E0058 'X...' - svl.q C720, 88($gp) 146 | 0x0000DCA8: 0x03E00008 '....' - jr $ra 147 | 0x0000DCAC: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 148 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_NCDS.txt: -------------------------------------------------------------------------------- 1 | 2 | NCDS Required cycles: 19 3 | 4 | Function: Light source calculation 5 | 6 | Calculations: 7 | (1.19.24) LL1 = L11*VX0 + L12*VY0 + L13*VZ0; <1> 8 | (1.19.24) LL2 = L21*VX0 + L22*VY0 + L23*VZ0; <2> 9 | (1.19.24) LL3 = L31*VX0 + L32*VY0 + L33*VZ0; <3> 10 | (1. 3.12) L1 = limA1U(LL1); 11 | (1. 3.12) L2 = limA2U(LL2); 12 | (1. 3.12) L3 = limA3U(LL3); 13 | (1.19.24) RRLT = RBK + LR1*L1 + LR2*L2 + LR3*L3; <1> 14 | (1.19.24) GGLT = GBK + LG1*L1 + LG2*L2 + LG3*L3; <2> 15 | (1.19.24) BBLT = BBK + LB1*L1 + LB2*L2 + LB3*L3; <3> 16 | (1. 3.12) RLT = limA1U(RRLT); 17 | (1. 3.12) GLT = limA2U(GGLT); 18 | (1. 3.12) BLT = limA3U(BBLT); 19 | (1.27.16) RR0 = R*RLT + IR0*limA1S(RFC - R*RLT); <1> 20 | (1.27.16) GG0 = G*GLT + IR0*limA2S(GFC - G*GLT); <2> 21 | (1.27.16) BB0 = B*BLT + IR0*limA3S(BFC - B*BLT); <3> 22 | (1.11. 4) IR1 = limA1U(RR0); 23 | (1.11. 4) IR2 = limA2U(GG0); 24 | (1.11. 4) IR3 = limA3U(BB0); 25 | (-. 8. -) CD0 <- CD1 <- CD2 <- CODE 26 | (0. 8. 0) R0 <- R1 <- R2 <- limB1(RR0); 27 | (0. 8. 0) G0 <- G1 <- G2 <- limB2(GG0); 28 | (0. 8. 0) B0 <- B1 <- B2 <- limB3(BB0); 29 | (1.27. 4) MAC1 = RR0; 30 | (1.27. 4) MAC2 = GG0; 31 | (1.27. 4) MAC3 = BB0; 32 | 33 | NCDS: Normal Color Depth Cue Single 34 | 35 | 0x0000D678: 0xDB8800A0 '....' - lv.q C200, 160($gp) 36 | 0x0000D67C: 0xDB8900B0 '....' - lv.q C210, 176($gp) 37 | 0x0000D680: 0xDB8A0000 '....' - lv.q C220, 0($gp) 38 | 0x0000D684: 0xD03B0880 '..;.' - vs2i.p C000, C200 39 | 0x0000D688: 0xD03B4881 '.H;.' - vs2i.p C010, C202 40 | 0x0000D68C: 0xD03B0A84 '..;.' - vs2i.p C100, C220 41 | 0x0000D690: 0xD29C8080 '....' - vi2f.q C000, C000, 28 42 | 0x0000D694: 0xD29C8181 '....' - vi2f.q C010, C010, 28 43 | 0x0000D698: 0xD28C0942 'B...' - vi2f.s S022, S210, 12 44 | 0x0000D69C: 0xD29C8404 '....' - vi2f.t C100, C100, 28 45 | 0x0000D6A0: 0xD0004182 '.A..' - vmov.p C020, C012 46 | 0x0000D6A4: 0xD0002141 'A!..' - vmov.s S012, S011 47 | 0x0000D6A8: 0xD0000121 '!...' - vmov.s S011, S010 48 | 0x0000D6AC: 0xD0006001 '.`..' - vmov.s S010, S003 49 | 0x0000D6B0: 0xF1048018 '....' - vtfm3.t C600, M000, C100 50 | 0x0000D6B4: 0xD006800F '....' - vzero.t C330 51 | 0x0000D6B8: 0x6DB39814 '...m' - vmax.t C500, C600, R403 52 | 0x0000D6BC: 0x6D139414 '...m' - vmin.t C500, C500, C430 53 | 0x0000D6C0: 0x6C189405 '...l' - vcmp.t NE, C500, C600 54 | 0x0000D6C4: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 55 | 0x0000D6C8: 0xDB8800C0 '....' - lv.q C200, 192($gp) 56 | 0x0000D6CC: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 57 | 0x0000D6D0: 0xD03B0880 '..;.' - vs2i.p C000, C200 58 | 0x0000D6D4: 0xD03B4881 '.H;.' - vs2i.p C010, C202 59 | 0x0000D6D8: 0xD29C8080 '....' - vi2f.q C000, C000, 28 60 | 0x0000D6DC: 0xD29C8181 '....' - vi2f.q C010, C010, 28 61 | 0x0000D6E0: 0xD28C0B42 'B...' - vi2f.s S022, S230, 12 62 | 0x0000D6E4: 0xD0004182 '.A..' - vmov.p C020, C012 63 | 0x0000D6E8: 0xD0002141 'A!..' - vmov.s S012, S011 64 | 0x0000D6EC: 0xD0000121 '!...' - vmov.s S011, S010 65 | 0x0000D6F0: 0xD0006001 '.`..' - vmov.s S010, S003 66 | 0x0000D6F4: 0xD28CC923 '#...' - vi2f.t R003, C211, 12 67 | 0x0000D6F8: 0xF1948018 '....' - vhtfm4.q C600, M000, C500 68 | 0x0000D6FC: 0x8F840018 '....' - lw $a0, 24($gp) 69 | 0x0000D700: 0xBFEA0040 '@...' - cache 0xA, 64($ra) 70 | 0x0000D704: 0x7C823800 '.8.|' - ext $v0, $a0, 0, 8 71 | 0x0000D708: 0x7C853A00 '.:.|' - ext $a1, $a0, 8, 8 72 | 0x0000D70C: 0x7C863C00 '.<.|' - ext $a2, $a0, 16, 8 73 | 0x0000D710: 0x48E20001 '...H' - mtv $v0, S010 74 | 0x0000D714: 0x48E50021 '!..H' - mtv $a1, S011 75 | 0x0000D718: 0x48E60041 'A..H' - mtv $a2, S012 76 | 0x0000D71C: 0xD2888101 '....' - vi2f.t C010, C010, 8 77 | 0x0000D720: 0x6DB39804 '...m' - vmax.t C100, C600, R403 78 | 0x0000D724: 0x6D138404 '...m' - vmin.t C100, C100, C430 79 | 0x0000D728: 0x6C188405 '...l' - vcmp.t NE, C100, C600 80 | 0x0000D72C: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 81 | 0x0000D730: 0xD28CCB00 '....' - vi2f.t C000, C231, 12 82 | 0x0000D734: 0xCB820020 ' ...' - lv.s S020, 32($gp) 83 | 0x0000D738: 0x64048108 '...d' - vmul.t C200, C010, C100 84 | 0x0000D73C: 0x60888004 '...`' - vsub.t C100, C000, C200 85 | 0x0000D740: 0xD28C0202 '....' - vi2f.s S020, S020, 12 86 | 0x0000D744: 0x6D92841C '...m' - vmax.t C700, C100, C420 87 | 0x0000D748: 0xDD0007E4 '....' - vpfxt [|x|, |y|, |z|, w] 88 | 0x0000D74C: 0x6C049303 '...l' - vcmp.t LE, C430, C100 89 | 0x0000D750: 0x6D139C1C '...m' - vmin.t C700, C700, C430 90 | 0x0000D754: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 91 | 0x0000D758: 0x65029C1C '...e' - vscl.t C700, C700, S020 92 | 0x0000D75C: 0x601C8808 '...`' - vadd.t C200, C200, C700 93 | 0x0000D760: 0x00042042 'B ..' - srl $a0, $a0, 1 94 | 0x0000D764: 0x48E40063 'c..H' - mtv $a0, S033 95 | 0x0000D768: 0xDB9E0050 'P...' - lv.q C720, 80($gp) 96 | 0x0000D76C: 0x6DB38802 '...m' - vmax.t C020, C200, R403 97 | 0x0000D770: 0xD20C8801 '....' - vf2in.t C010, C200, 12 98 | 0x0000D774: 0xD0048800 '....' - vsat0.t C000, C200 99 | 0x0000D778: 0x6D138202 '...m' - vmin.t C020, C020, C430 100 | 0x0000D77C: 0xF7810066 'f...' - svr.q C010, 100($gp) 101 | 0x0000D780: 0x6C028805 '...l' - vcmp.t NE, C200, C020 102 | 0x0000D784: 0xD20C8202 '....' - vf2in.t C020, C020, 12 103 | 0x0000D788: 0xD21F8803 '....' - vf2in.t C030, C200, 31 104 | 0x0000D78C: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 105 | 0x0000D790: 0x6C008805 '...l' - vcmp.t NE, C200, C000 106 | 0x0000D794: 0xD0468F6F 'o.F.' - vfad.t R313, C330 107 | 0x0000D798: 0xF7820026 '&...' - svr.q C020, 36($gp) 108 | 0x0000D79C: 0xD006800F '....' - vzero.t C330 109 | 0x0000D7A0: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 110 | 0x0000D7A4: 0xD0468F8F '..F.' - vfad.q C330, C330 111 | 0x0000D7A8: 0xD03C83FE '..<.' - vi2uc.q S723, C030 // fixed 112 | 0x0000D7AC: 0xF79E0058 'X...' - svl.q C720, 88($gp) 113 | 0x0000D7B0: 0x03E00008 '....' - jr $ra 114 | 0x0000D7B4: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 115 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_NCLIP.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_NCLIP.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_NCS.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_NCS.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_NCT.txt: -------------------------------------------------------------------------------- 1 | 2 | NCT Required cycles: 30 3 | 4 | Function: Light source calculation 5 | 6 | Calculations: 7 | n=0,1,2 { 8 | (1.19.24) LL1n = L11*VXn + L12*VYn + L13*VZn; <1> 9 | (1.19.24) LL2n = L21*VXn + L22*VYn + L23*VZn; <2> 10 | (1.19.24) LL3n = L31*VXn + L32*VYn + L33*VZn; <3> 11 | (1. 3.12) L1n = limA1U(LL1n); 12 | (1. 3.12) L2n = limA2U(LL2n); 13 | (1. 3.12) L3n = limA3U(LL3n); 14 | (1.19.24) RRn = RBK + LR1*L1n + LR2*L2n + LR3*L3n; <1> 15 | (1.19.24) GGn = GBK + LG1*L1n + LG2*L2n + LG3*L3n; <2> 16 | (1.19.24) BBn = BBK + LB1*L1n + LB2*L2n + LB3*L3n; <3> 17 | (-. 8. -) CDn = CODE 18 | (0. 0. 8) Rn = limB1(RRn); 19 | (0. 0. 8) Gn = limB2(GGn); 20 | (0. 0. 8) Bn = limB3(BBn); 21 | } 22 | (1. 3.12) IR1 = limA1U(RR2); 23 | (1. 3.12) IR2 = limA2U(GG2); 24 | (1. 3.12) IR3 = limA3U(BB2); 25 | (1.19.12) MAC1 = RR2; 26 | (1.19.12) MAC2 = GG2; 27 | (1.19.12) MAC3 = BB2; 28 | 29 | NCT: 30 | 31 | 0x0000DD94: 0xDB860010 '....' - lv.q C120, 16($gp) 32 | 0x0000DD98: 0xDB8800A0 '....' - lv.q C200, 160($gp) 33 | 0x0000DD9C: 0xDB8900B0 '....' - lv.q C210, 176($gp) 34 | 0x0000DDA0: 0xDB8A0000 '....' - lv.q C220, 0($gp) 35 | 0x0000DDA4: 0xD03B0880 '..;.' - vs2i.p C000, C200 36 | 0x0000DDA8: 0xD03B4881 '.H;.' - vs2i.p C010, C202 37 | 0x0000DDAC: 0xD03B0A84 '..;.' - vs2i.p C100, C220 38 | 0x0000DDB0: 0xD29C8080 '....' - vi2f.q C000, C000, 28 39 | 0x0000DDB4: 0xD29C8181 '....' - vi2f.q C010, C010, 28 40 | 0x0000DDB8: 0xD28C0942 'B...' - vi2f.s S022, S210, 12 41 | 0x0000DDBC: 0xD29C8404 '....' - vi2f.t C100, C100, 28 42 | 0x0000DDC0: 0xD0004182 '.A..' - vmov.p C020, C012 43 | 0x0000DDC4: 0xD0002141 'A!..' - vmov.s S012, S011 44 | 0x0000DDC8: 0xD0000121 '!...' - vmov.s S011, S010 45 | 0x0000DDCC: 0xD0006001 '.`..' - vmov.s S010, S003 46 | 0x0000DDD0: 0xD03B4A85 '.J;.' - vs2i.p C110, C222 47 | 0x0000DDD4: 0xD03B0686 '..;.' - vs2i.p C120, C120 48 | 0x0000DDD8: 0xD29C8505 '....' - vi2f.t C110, C110, 28 49 | 0x0000DDDC: 0xD29C8606 '....' - vi2f.t C120, C120, 28 50 | 0x0000DDE0: 0xF0048018 '....' - vmmul.t M600, E000, M100 51 | 0x0000DDE4: 0xD006800F '....' - vzero.t C330 52 | 0x0000DDE8: 0xDB8800C0 '....' - lv.q C200, 192($gp) 53 | 0x0000DDEC: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 54 | 0x0000DDF0: 0xD03B0880 '..;.' - vs2i.p C000, C200 55 | 0x0000DDF4: 0xD03B4881 '.H;.' - vs2i.p C010, C202 56 | 0x0000DDF8: 0xD29C8080 '....' - vi2f.q C000, C000, 28 57 | 0x0000DDFC: 0xD29C8181 '....' - vi2f.q C010, C010, 28 58 | 0x0000DE00: 0xD28C0B42 'B...' - vi2f.s S022, S230, 12 59 | 0x0000DE04: 0xD0004182 '.A..' - vmov.p C020, C012 60 | 0x0000DE08: 0xD0002141 'A!..' - vmov.s S012, S011 61 | 0x0000DE0C: 0xD0000121 '!...' - vmov.s S011, S010 62 | 0x0000DE10: 0xD0006001 '.`..' - vmov.s S010, S003 63 | 0x0000DE14: 0xD28CC923 '#...' - vi2f.t R003, C211, 12 64 | 0x0000DE18: 0x6DB39814 '...m' - vmax.t C500, C600, R403 65 | 0x0000DE1C: 0x6DB39915 '...m' - vmax.t C510, C610, R403 66 | 0x0000DE20: 0x6DB39A16 '...m' - vmax.t C520, C620, R403 67 | 0x0000DE24: 0x6D139414 '...m' - vmin.t C500, C500, C430 68 | 0x0000DE28: 0x6D139515 '...m' - vmin.t C510, C510, C430 69 | 0x0000DE2C: 0x6D139616 '...m' - vmin.t C520, C520, C430 70 | 0x0000DE30: 0x6C189405 '...l' - vcmp.t NE, C500, C600 71 | 0x0000DE34: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 72 | 0x0000DE38: 0x6C199505 '...l' - vcmp.t NE, C510, C610 73 | 0x0000DE3C: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 74 | 0x0000DE40: 0x6C1A9605 '...l' - vcmp.t NE, C520, C620 75 | 0x0000DE44: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 76 | 0x0000DE48: 0xD0078037 '7...' - vone.t R503 77 | 0x0000DE4C: 0xF0148088 '....' - vmmul.q M200, E000, M500 78 | 0x0000DE50: 0x8F840018 '....' - lw $a0, 24($gp) 79 | 0x0000DE54: 0xBFEA0040 '@...' - cache 0xA, 64($ra) 80 | 0x0000DE58: 0x00042042 'B ..' - srl $a0, $a0, 1 81 | 0x0000DE5C: 0x48E40060 '`..H' - mtv $a0, S003 82 | 0x0000DE60: 0x48E40061 'a..H' - mtv $a0, S013 83 | 0x0000DE64: 0x48E40062 'b..H' - mtv $a0, S023 84 | 0x0000DE68: 0xD20C8A19 '....' - vf2in.t C610, C220, 12 85 | 0x0000DE6C: 0x6DB38800 '...m' - vmax.t C000, C200, R403 86 | 0x0000DE70: 0x6DB38901 '...m' - vmax.t C010, C210, R403 87 | 0x0000DE74: 0x6DB38A02 '...m' - vmax.t C020, C220, R403 88 | 0x0000DE78: 0x6D138004 '...m' - vmin.t C100, C000, C430 89 | 0x0000DE7C: 0x6D138105 '...m' - vmin.t C110, C010, C430 90 | 0x0000DE80: 0xF7990066 'f...' - svr.q C610, 100($gp) 91 | 0x0000DE84: 0x6C048805 '...l' - vcmp.t NE, C200, C100 92 | 0x0000DE88: 0x6D138206 '...m' - vmin.t C120, C020, C430 93 | 0x0000DE8C: 0xD0048800 '....' - vsat0.t C000, C200 94 | 0x0000DE90: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 95 | 0x0000DE94: 0x6C058905 '...l' - vcmp.t NE, C210, C110 96 | 0x0000DE98: 0xD0048901 '....' - vsat0.t C010, C210 97 | 0x0000DE9C: 0xD0048A02 '....' - vsat0.t C020, C220 98 | 0x0000DEA0: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 99 | 0x0000DEA4: 0xD20C8604 '....' - vf2in.t C100, C120, 12 100 | 0x0000DEA8: 0x6C068A05 '...l' - vcmp.t NE, C220, C120 101 | 0x0000DEAC: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 102 | 0x0000DEB0: 0xF7840026 '&...' - svr.q C100, 36($gp) 103 | 0x0000DEB4: 0xD0468F6F 'o.F.' - vfad.t R313, C330 104 | 0x0000DEB8: 0x6C008805 '...l' - vcmp.t NE, C200, C000 105 | 0x0000DEBC: 0xD21F8000 '....' - vf2in.t C000, C000, 31 106 | 0x0000DEC0: 0xD006800F '....' - vzero.t C330 107 | 0x0000DEC4: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 108 | 0x0000DEC8: 0x6C018905 '...l' - vcmp.t NE, C210, C010 109 | 0x0000DECC: 0xD21F8101 '....' - vf2in.t C010, C010, 31 110 | 0x0000DED0: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 111 | 0x0000DED4: 0x6C028A05 '...l' - vcmp.t NE, C220, C020 112 | 0x0000DED8: 0xD21F8202 '....' - vf2in.t C020, C020, 31 113 | 0x0000DEDC: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 114 | 0x0000DEE0: 0xD03C80BE '..<.' - vi2uc.q S323, C000 // fixed 115 | 0x0000DEE4: 0xD03C81DE '..<.' - vi2uc.q S523, C010 // fixed 116 | 0x0000DEE8: 0xD03C82FE '..<.' - vi2uc.q S723, C020 // fixed 117 | 0x0000DEEC: 0xD0468F8F '..F.' - vfad.q C330, C330 118 | 0x0000DEF0: 0xF79E0058 'X...' - svl.q C720, 88($gp) 119 | 0x0000DEF4: 0x03E00008 '....' - jr $ra 120 | 0x0000DEF8: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 121 | -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_OP.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_OP.txt -------------------------------------------------------------------------------- /GTE/cooked/PopsGTE_SQR.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTE/cooked/PopsGTE_SQR.txt -------------------------------------------------------------------------------- /GTE/cooked/README.txt: -------------------------------------------------------------------------------- 1 | 2 | Work directory. Pseudo-code obtained during reversing is later used to reconsctruct working C code. 3 | 4 | Some comments are on russian %) -------------------------------------------------------------------------------- /GTE/init/PopsGTE_Init.txt: -------------------------------------------------------------------------------- 1 | Called once from PSXInit routine (located in module_start) 2 | 3 | 4 | 0x0002CD90 Table : 5 | 6 | FF FD FB F9 F7 F5 F3 F1 EF EE EC EA E8 E6 E4 E3 7 | E1 DF DD DC DA D8 D6 D5 D3 D1 D0 CE CD CB C9 C8 8 | C6 C5 C3 C1 C0 BE BD BB BA B8 B7 B5 B4 B2 B1 B0 9 | AE AD AB AA A9 A7 A6 A4 A3 A2 A0 9F 9E 9C 9B 9A 10 | 11 | 99 97 96 95 94 92 91 90 8F 8D 8C 8B 8A 89 87 86 12 | 85 84 83 82 81 7F 7E 7D 7C 7B 7A 79 78 77 75 74 13 | 73 72 71 70 6F 6E 6D 6C 6B 6A 69 68 67 66 65 64 14 | 63 62 61 60 5F 5E 5D 5D 5C 5B 5A 59 58 57 56 55 15 | 16 | 54 53 53 52 51 50 4F 4E 4D 4D 4C 4B 4A 49 48 48 17 | 47 46 45 44 43 43 42 41 40 3F 3F 3E 3D 3C 3C 3B 18 | 3A 39 39 38 37 36 36 35 34 33 33 32 31 31 30 2F 19 | 2E 2E 2D 2C 2C 2B 2A 2A 29 28 28 27 26 26 25 24 20 | 21 | 24 23 22 22 21 20 20 1F 1E 1E 1D 1D 1C 1B 1B 1A 22 | 19 19 18 18 17 16 16 15 15 14 14 13 12 12 11 11 23 | 10 0F 0F 0E 0E 0D 0D 0C 0C 0B 0A 0A 09 09 08 08 24 | 07 07 06 06 05 05 04 04 03 03 02 02 01 01 00 00 25 | 26 | // sub_00000E74 27 | void GteInit (void) 28 | 29 | gp = 0x00010000 30 | GteLoadVFPUConstants (); 31 | 32 | v1 = 0x0002CD90 // source data 33 | t0 = 0x000F198C // generated table (0x8000 32-bit words) 34 | 35 | a3 = 0x8000 36 | 37 | loc_00000EA4: 38 | t2 = a3 + 64 39 | t1 = t2 >> 7 40 | a0 = t1 + v1 41 | t9 = *(u8 *)(a0 - 256) 42 | t6 = t9 + 257 43 | lo = 128 44 | hi:lo -= t6 * a3 45 | a3 ++ 46 | t8 = lo 47 | t7 = (t8 >> 8) & 0x1FFFF 48 | hi:lo = t7 * t6 49 | t5 = lo 50 | t4 = t5 + 128 51 | t3 = t4 >> 8 52 | t2 = t3 << 14 53 | [t0] = t2 54 | t0 += 4 55 | if (a3 <= 0xFFFF) goto loc_00000EA4 56 | 57 | I wrote C-version of the whole stuff: 58 | 59 | static s32 getReciprocal (int n) 60 | { 61 | // UNR table. 62 | static u8 unrt[] = { 63 | 0xFF, 0xFD, 0xFB, 0xF9, 0xF7, 0xF5, 0xF3, 0xF1, 0xEF, 0xEE, 0xEC, 0xEA, 0xE8, 0xE6, 0xE4, 0xE3, 64 | 0xE1, 0xDF, 0xDD, 0xDC, 0xDA, 0xD8, 0xD6, 0xD5, 0xD3, 0xD1, 0xD0, 0xCE, 0xCD, 0xCB, 0xC9, 0xC8, 65 | 0xC6, 0xC5, 0xC3, 0xC1, 0xC0, 0xBE, 0xBD, 0xBB, 0xBA, 0xB8, 0xB7, 0xB5, 0xB4, 0xB2, 0xB1, 0xB0, 66 | 0xAE, 0xAD, 0xAB, 0xAA, 0xA9, 0xA7, 0xA6, 0xA4, 0xA3, 0xA2, 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 67 | 0x99, 0x97, 0x96, 0x95, 0x94, 0x92, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x87, 0x86, 68 | 0x85, 0x84, 0x83, 0x82, 0x81, 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x75, 0x74, 69 | 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 70 | 0x63, 0x62, 0x61, 0x60, 0x5F, 0x5E, 0x5D, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58, 0x57, 0x56, 0x55, 71 | 0x54, 0x53, 0x53, 0x52, 0x51, 0x50, 0x4F, 0x4E, 0x4D, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x48, 72 | 0x47, 0x46, 0x45, 0x44, 0x43, 0x43, 0x42, 0x41, 0x40, 0x3F, 0x3F, 0x3E, 0x3D, 0x3C, 0x3C, 0x3B, 73 | 0x3A, 0x39, 0x39, 0x38, 0x37, 0x36, 0x36, 0x35, 0x34, 0x33, 0x33, 0x32, 0x31, 0x31, 0x30, 0x2F, 74 | 0x2E, 0x2E, 0x2D, 0x2C, 0x2C, 0x2B, 0x2A, 0x2A, 0x29, 0x28, 0x28, 0x27, 0x26, 0x26, 0x25, 0x24, 75 | 0x24, 0x23, 0x22, 0x22, 0x21, 0x20, 0x20, 0x1F, 0x1E, 0x1E, 0x1D, 0x1D, 0x1C, 0x1B, 0x1B, 0x1A, 76 | 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13, 0x12, 0x12, 0x11, 0x11, 77 | 0x10, 0x0F, 0x0F, 0x0E, 0x0E, 0x0D, 0x0D, 0x0C, 0x0C, 0x0B, 0x0A, 0x0A, 0x09, 0x09, 0x08, 0x08, 78 | 0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 79 | }; 80 | 81 | // Reciprocal table (generated). 82 | static u32 reciprocalTable[0x8000]; 83 | 84 | static int tableCreated = 0; 85 | 86 | // Generate reciprocal table. 87 | if (tableCreated == 0) { 88 | int a3; 89 | u32 *ptr = reciprocalTable; 90 | 91 | for (a3=0x8000; a3<=0xFFFF; a3++) { 92 | s32 t6 = unrt[((a3 + 64) >> 7) - 256] + 257; 93 | s32 t8 = 128 - t6 * a3; 94 | s32 t7 = (t8 >> 8) & 0x1FFFF; 95 | s32 t4 = t7 * t6 + 128; 96 | s32 t3 = t4 >> 8; 97 | *ptr++ = t3 << 14; 98 | } 99 | 100 | tableCreated = 1; 101 | } 102 | 103 | return reciprocalTable[n & 0x7FFF]; 104 | } 105 | 106 | 107 | ==================================================== 108 | 109 | // sub_0000D348 110 | void GteLoadVFPUConstants (void) 111 | 112 | VFPU 4: 113 | [0x100f] [0x20f] [-8f] [7.999756f] 114 | [0x80f] [0x10f] [-8f] [7.999756f] 115 | [0x40f] [0x08f] [-8f] [7.999756f] 116 | [0] [0] [0] [0] 117 | 118 | S330 = GTE FLAG 119 | 120 | 121 | sub_0000D348: ; Refs: 0x00000E7C 122 | 0x0000D348: 0xDF500040 '@.P.' - viim.s S402, 64 123 | 0x0000D34C: 0xDF510008 '..Q.' - viim.s S412, 8 124 | 0x0000D350: 0xDF52FFF8 '..R.' - viim.s S422, -8 125 | 0x0000D354: 0x3C0840FF '.@.<' - lui $t0, 0x40FF 126 | 0x0000D358: 0x3508FE00 '...5' - ori $t0, $t0, 0xFE00 127 | 0x0000D35C: 0x48E80053 'S..H' - mtv $t0, S432 128 | 0x0000D360: 0xCB8F00FC '....' - lv.s S330, 252($gp) 129 | 0x0000D364: 0xDD00C004 '....' - vpfxt [x, y, 0, 0] 130 | 0x0000D368: 0x6032B2B1 '..2`' - vadd.q R401, R402, R402 131 | 0x0000D36C: 0xD00680B3 '....' - vzero.q R403 132 | 0x0000D370: 0xDD00C004 '....' - vpfxt [x, y, 0, 0] 133 | 0x0000D374: 0x03E00008 '....' - jr $ra 134 | 0x0000D378: 0x6031B1B0 '..1`' - vadd.q R400, R401, R401 135 | 136 | 137 | // C400 & C401 are used for FLAG calculations 138 | // C402 & C403 are used for LIMIT calculations 139 | // R430 = zero vector [ 0 0 0 0 ] 140 | -------------------------------------------------------------------------------- /GTE/init/Pops_03F8.txt: -------------------------------------------------------------------------------- 1 | // Refs: 0x000004F4 0x000007DC 2 | 3 | Called 2 times: from CpuMainLoop and from main Init sub_00000494 4 | 5 | // sub_000003F8: 6 | void PsxReset() 7 | { 8 | sub_00000A84 (); 9 | CpuReset (); 10 | sub_0000B3F4 (); 11 | sub_0000C360 (); // Ge 12 | MDECReset (); 13 | sub_00026BD0 (); // Audio 14 | sub_0000BEA8 (); 15 | sub_0000ADE4 (); 16 | sub_00010934 (); 17 | sub_0000C594 (); 18 | sub_0000A4D0 (); 19 | 20 | memclr ( 0x09800000 ... 0x09A00000 ); // Clear RAM 21 | memclr ( 0x00013000 ... 0x00013400 ); // Clear Scratchpad 22 | } -------------------------------------------------------------------------------- /GTE/init/Pops_0494.txt: -------------------------------------------------------------------------------- 1 | 2 | Called once from module_start 3 | 4 | // sub_00000494 5 | void PSXInit (void) 6 | 7 | GteInit (); 8 | InitHardwareHooks (); 9 | 10 | // Install PSX register read/write hooks 11 | sub_0000ADF8 (); // INTC 12 | sub_0000BF00 (); // ROOT COUNTERS 13 | sub_0000B474 (); // DMA INTC 14 | sub_0000C3A4 (); // GPU 15 | InstallMDECHooks (); // MDEC 16 | sub_00026C2C (); // SPU 17 | sub_00010A1C (); // CDROM 18 | sub_0000C600 (); // SIO 19 | 20 | sub_0000A4EC (); // Something related to Pops JITC 21 | 22 | sub_000003F8 (); // Second huge initialization (seems to be PSX "reset") 23 | -------------------------------------------------------------------------------- /GTE/init/README.txt: -------------------------------------------------------------------------------- 1 | 2 | This is code flow of GTE init procedure, called from Pops module_start. 3 | 4 | The purpose of GTE init: 5 | 6 | - Generate reciprocal table for RTPS/RTPT 7 | 8 | - Load some constants to VFPU registers (used later in FLAG calculations) 9 | 10 | - Load GTE FLAG value to the S330 VFPU register. S330 register is always aliased to GTE FLAG. 11 | 12 | 13 | Also I added some disassembly of Pops init calls. 14 | -------------------------------------------------------------------------------- /GTE/init/module_start.txt: -------------------------------------------------------------------------------- 1 | 2 | module_start () 3 | { 4 | SysMemUserForUser_7591C7DB ( 0x03050210 ); 5 | SysMemUserForUser_F77D77CB ( 0x00030306 ); 6 | 7 | thread = sceKernelCreateThread ( "popsmain", PopsMain, 17, 0x40000, 0x80004000, 0 ); 8 | sceKernelStartThread (thread, 0, 0); 9 | return 0; 10 | } 11 | 12 | sub_0068 13 | void PopsMain () 14 | { 15 | static char popsversion[64] = "branches/pops-352/src(r5285)"; 16 | 17 | strncpy ( 0x00013FC0, popsversion, 64 ); 18 | 19 | *(u8 *)(0x13F00) = 0xff; 20 | 21 | cb = sceKernelCreateCallback ( "exitCB", PopsExitCallback, 0, 0 ); 22 | sceKernelRegisterExitCallback ( cb ); 23 | 24 | cb = sceKernelCreateCallback ( "powerCB", sub_2308C, 0, 0 ); 25 | scePowerRegisterCallback ( "powerCB", cb ); 26 | 27 | // Initialize Pops subsystems 28 | 29 | if ( AllocPSXMemory ( -1 ) < 0 ) scePopsMan_0090B2C8 ( 0x80000004 ); 30 | 31 | if ( sub_000135D0 () < 0 ) scePopsMan_0090B2C8 ( 0x80000004 ); 32 | 33 | if (sub_0001E520 ()) scePopsMan_0090B2C8 ( 0x80000004 ); 34 | 35 | if ( sub_00012AE8 () ) scePopsMan_0090B2C8 ( 0x80000004 ); 36 | 37 | if ( sub_00015010 () < 0 ) scePopsMan_0090B2C8 ( 0x80000004 ); 38 | 39 | if ( sub_00014C1C () < 0 ) scePopsMan_0090B2C8 ( 0x80000004 ); 40 | 41 | PSXInit (); 42 | sub_0002137C (0); 43 | CpuMainLoop (); 44 | 45 | sceImpose_A9884B00 (0); 46 | sceKernelExitGame (); 47 | } 48 | 49 | sub_01CC: 50 | PopsExitCallback () 51 | { 52 | sceImpose_A9884B00 (0); 53 | sceKernelExitGame (); 54 | return 0 55 | } 56 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_AVSZ3.txt: -------------------------------------------------------------------------------- 1 | AVSZ3: 2 | 3 | 0x0000E5D0: 0x97840044 'D...' - lhu $a0, 68($gp) 4 | 0x0000E5D4: 0x97850048 'H...' - lhu $a1, 72($gp) 5 | 0x0000E5D8: 0x9786004C 'L...' - lhu $a2, 76($gp) 6 | 0x0000E5DC: 0x878200F4 '....' - lh $v0, 244($gp) 7 | 0x0000E5E0: 0x00852021 '! ..' - addu $a0, $a0, $a1 8 | 0x0000E5E4: 0x00862021 '! ..' - addu $a0, $a0, $a2 9 | 0x0000E5E8: 0x00820018 '....' - mult $a0, $v0 10 | 0x0000E5EC: 0x3402FFFF '...4' - li $v0, 0xFFFF 11 | 0x0000E5F0: 0x00002012 '. ..' - mflo $a0 12 | 0x0000E5F4: 0xAF840060 '`...' - sw $a0, 96($gp) 13 | 0x0000E5F8: 0x00042303 '.#..' - sra $a0, $a0, 12 14 | 0x0000E5FC: 0x0044282B '+(D.' - sltu $a1, $v0, $a0 15 | 0x0000E600: 0x0004202C ', ..' - max $a0, $zr, $a0 16 | 0x0000E604: 0x0044202D '- D.' - min $a0, $v0, $a0 17 | 0x0000E608: 0x00052C80 '.,..' - sll $a1, $a1, 18 18 | 0x0000E60C: 0x48E5000F '...H' - mtv $a1, S330 19 | 0x0000E610: 0x03E00008 '....' - jr $ra 20 | 0x0000E614: 0xA784001C '....' - sh $a0, 28($gp) 21 | 22 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_AVSZ4.txt: -------------------------------------------------------------------------------- 1 | AVSZ4: 2 | 3 | 4 | 0x0000E618: 0x97840044 'D...' - lhu $a0, 68($gp) 5 | 0x0000E61C: 0x97850048 'H...' - lhu $a1, 72($gp) 6 | 0x0000E620: 0x9786004C 'L...' - lhu $a2, 76($gp) 7 | 0x0000E624: 0x878200F8 '....' - lh $v0, 248($gp) 8 | 0x0000E628: 0x00852021 '! ..' - addu $a0, $a0, $a1 9 | 0x0000E62C: 0x97850040 '@...' - lhu $a1, 64($gp) 10 | 0x0000E630: 0x00862021 '! ..' - addu $a0, $a0, $a2 11 | 0x0000E634: 0x00852021 '! ..' - addu $a0, $a0, $a1 12 | 0x0000E638: 0x00820018 '....' - mult $a0, $v0 13 | 0x0000E63C: 0x3402FFFF '...4' - li $v0, 0xFFFF 14 | 0x0000E640: 0x00002012 '. ..' - mflo $a0 15 | 0x0000E644: 0xAF840060 '`...' - sw $a0, 96($gp) 16 | 0x0000E648: 0x00042303 '.#..' - sra $a0, $a0, 12 17 | 0x0000E64C: 0x0044282B '+(D.' - sltu $a1, $v0, $a0 18 | 0x0000E650: 0x0004202C ', ..' - max $a0, $zr, $a0 19 | 0x0000E654: 0x0044202D '- D.' - min $a0, $v0, $a0 20 | 0x0000E658: 0x00052C80 '.,..' - sll $a1, $a1, 18 21 | 0x0000E65C: 0x48E5000F '...H' - mtv $a1, S330 22 | 0x0000E660: 0x03E00008 '....' - jr $ra 23 | 0x0000E664: 0xA784001C '....' - sh $a0, 28($gp) 24 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_CC.txt: -------------------------------------------------------------------------------- 1 | CC: 2 | 3 | 0x0000D5A4: 0xDB9C0020 ' ...' - lv.q C700, 32($gp) 4 | 0x0000D5A8: 0xDB8900B0 '....' - lv.q C210, 176($gp) 5 | 0x0000D5AC: 0xDB8800C0 '....' - lv.q C200, 192($gp) 6 | 0x0000D5B0: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 7 | 0x0000D5B4: 0xD03B0880 '..;.' - vs2i.p C000, C200 8 | 0x0000D5B8: 0xD03B4881 '.H;.' - vs2i.p C010, C202 9 | 0x0000D5BC: 0xD29C8080 '....' - vi2f.q C000, C000, 28 10 | 0x0000D5C0: 0xD29C8181 '....' - vi2f.q C010, C010, 28 11 | 0x0000D5C4: 0xD28C0B42 'B...' - vi2f.s S022, S230, 12 12 | 0x0000D5C8: 0xD0004182 '.A..' - vmov.p C020, C012 13 | 0x0000D5CC: 0xD0002141 'A!..' - vmov.s S012, S011 14 | 0x0000D5D0: 0xD0000121 '!...' - vmov.s S011, S010 15 | 0x0000D5D4: 0xD0006001 '.`..' - vmov.s S010, S003 16 | 0x0000D5D8: 0xD28CC923 '#...' - vi2f.t R003, C211, 12 17 | 0x0000D5DC: 0xD28CDC08 '....' - vi2f.t C200, C701, 12 18 | 0x0000D5E0: 0xD006800F '....' - vzero.t C330 19 | 0x0000D5E4: 0xF1888005 '....' - vhtfm4.q C110, M000, C200 20 | 0x0000D5E8: 0x8F840018 '....' - lw $a0, 24($gp) 21 | 0x0000D5EC: 0xBFEA0040 '@...' - cache 0xA, 64($ra) 22 | 0x0000D5F0: 0x6DB38504 '...m' - vmax.t C100, C110, R403 23 | 0x0000D5F4: 0x6D138404 '...m' - vmin.t C100, C100, C430 24 | 0x0000D5F8: 0x6C058405 '...l' - vcmp.t NE, C100, C110 25 | 0x0000D5FC: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 26 | 0x0000D600: 0x7C823800 '.8.|' - ext $v0, $a0, 0, 8 27 | 0x0000D604: 0x7C853A00 '.:.|' - ext $a1, $a0, 8, 8 28 | 0x0000D608: 0x7C863C00 '.<.|' - ext $a2, $a0, 16, 8 29 | 0x0000D60C: 0x48E20001 '...H' - mtv $v0, S010 30 | 0x0000D610: 0x48E50021 '!..H' - mtv $a1, S011 31 | 0x0000D614: 0x48E60041 'A..H' - mtv $a2, S012 32 | 0x0000D618: 0xD2888101 '....' - vi2f.t C010, C010, 8 33 | 0x0000D61C: 0x64048108 '...d' - vmul.t C200, C010, C100 34 | 0x0000D620: 0x00042042 'B ..' - srl $a0, $a0, 1 35 | 0x0000D624: 0x48E40063 'c..H' - mtv $a0, S033 36 | 0x0000D628: 0xDB9E0050 'P...' - lv.q C720, 80($gp) 37 | 0x0000D62C: 0x6DB38802 '...m' - vmax.t C020, C200, R403 38 | 0x0000D630: 0xD20C8801 '....' - vf2in.t C010, C200, 12 39 | 0x0000D634: 0xD0048800 '....' - vsat0.t C000, C200 40 | 0x0000D638: 0x6D138202 '...m' - vmin.t C020, C020, C430 41 | 0x0000D63C: 0xF7810066 'f...' - svr.q C010, 100($gp) 42 | 0x0000D640: 0x6C028805 '...l' - vcmp.t NE, C200, C020 43 | 0x0000D644: 0xD20C8202 '....' - vf2in.t C020, C020, 12 44 | 0x0000D648: 0xD21F8803 '....' - vf2in.t C030, C200, 31 45 | 0x0000D64C: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 46 | 0x0000D650: 0x6C008805 '...l' - vcmp.t NE, C200, C000 47 | 0x0000D654: 0xD0468F6F 'o.F.' - vfad.t R313, C330 48 | 0x0000D658: 0xF7820026 '&...' - svr.q C020, 36($gp) 49 | 0x0000D65C: 0xD006800F '....' - vzero.t C330 50 | 0x0000D660: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 51 | 0x0000D664: 0xD0468F8F '..F.' - vfad.q C330, C330 52 | 0x0000D668: 0xD03C83FE '..<.' - vi2uc.q S723, C030 // fixed 53 | 0x0000D66C: 0xF79E0058 'X...' - svl.q C720, 88($gp) 54 | 0x0000D670: 0x03E00008 '....' - jr $ra 55 | 0x0000D674: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 56 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_CDP.txt: -------------------------------------------------------------------------------- 1 | CDP: 2 | 3 | 0x0000E668: 0xDB9C0050 'P...' - lv.q C700, 80($gp) 4 | 0x0000E66C: 0x8F8E0020 ' ...' - lw $t6, 32($gp) 5 | 0x0000E670: 0x8F890018 '....' - lw $t1, 24($gp) 6 | 0x0000E674: 0x000E7300 '.s..' - sll $t6, $t6, 12 7 | 0x0000E678: 0x8F880024 '$...' - lw $t0, 36($gp) 8 | 0x0000E67C: 0x8F8B00D4 '....' - lw $t3, 212($gp) 9 | 0x0000E680: 0x7D2C3800 '.8,}' - ext $t4, $t1, 0, 8 10 | 0x0000E684: 0x01880018 '....' - mult $t4, $t0 11 | 0x0000E688: 0x24028000 '...$' - li $v0, -32768 12 | 0x0000E68C: 0x24037FFF '...$' - li $v1, 32767 13 | 0x0000E690: 0x00004012 '.@..' - mflo $t0 14 | 0x0000E694: 0x00084203 '.B..' - sra $t0, $t0, 8 15 | 0x0000E698: 0x0168C023 '#.h.' - subu $t8, $t3, $t0 16 | 0x0000E69C: 0x0302502C ',P..' - max $t2, $t8, $v0 17 | 0x0000E6A0: 0x0143502D '-PC.' - min $t2, $t2, $v1 18 | 0x0000E6A4: 0x030AC023 '#...' - subu $t8, $t8, $t2 19 | 0x0000E6A8: 0x0018082B '+...' - sltu $at, $zr, $t8 20 | 0x0000E6AC: 0x00010E00 '....' - sll $at, $at, 24 21 | 0x0000E6B0: 0x000A5200 '.R..' - sll $t2, $t2, 8 22 | 0x0000E6B4: 0x014E0018 '..N.' - mult $t2, $t6 23 | 0x0000E6B8: 0x240500FF '...$' - li $a1, 255 24 | 0x0000E6BC: 0x0000C010 '....' - mfhi $t8 25 | 0x0000E6C0: 0x0118C021 '!...' - addu $t8, $t0, $t8 26 | 0x0000E6C4: 0xAF980064 'd...' - sw $t8, 100($gp) 27 | 0x0000E6C8: 0x0302502C ',P..' - max $t2, $t8, $v0 28 | 0x0000E6CC: 0x0143502D '-PC.' - min $t2, $t2, $v1 29 | 0x0000E6D0: 0x030AC023 '#...' - subu $t8, $t8, $t2 30 | 0x0000E6D4: 0x0018C02B '+...' - sltu $t8, $zr, $t8 31 | 0x0000E6D8: 0x0018C600 '....' - sll $t8, $t8, 24 32 | 0x0000E6DC: 0x00380825 '%.8.' - or $at, $at, $t8 33 | 0x0000E6E0: 0x8F880028 '(...' - lw $t0, 40($gp) 34 | 0x0000E6E4: 0x8F8B00D8 '....' - lw $t3, 216($gp) 35 | 0x0000E6E8: 0x7D2C3A00 '.:,}' - ext $t4, $t1, 8, 8 36 | 0x0000E6EC: 0x01880018 '....' - mult $t4, $t0 37 | 0x0000E6F0: 0xAF8A0024 '$...' - sw $t2, 36($gp) 38 | 0x0000E6F4: 0x000A5103 '.Q..' - sra $t2, $t2, 4 39 | 0x0000E6F8: 0x00004012 '.@..' - mflo $t0 40 | 0x0000E6FC: 0x00084203 '.B..' - sra $t0, $t0, 8 41 | 0x0000E700: 0x0168C023 '#.h.' - subu $t8, $t3, $t0 42 | 0x0000E704: 0x0302582C ',X..' - max $t3, $t8, $v0 43 | 0x0000E708: 0x0163582D '-Xc.' - min $t3, $t3, $v1 44 | 0x0000E70C: 0x030BC023 '#...' - subu $t8, $t8, $t3 45 | 0x0000E710: 0x0018C02B '+...' - sltu $t8, $zr, $t8 46 | 0x0000E714: 0x7F01BDC4 '....' - ins $at, $t8, 23, 1 47 | 0x0000E718: 0x000B5A00 '.Z..' - sll $t3, $t3, 8 48 | 0x0000E71C: 0x016E0018 '..n.' - mult $t3, $t6 49 | 0x0000E720: 0x00AA582B '+X..' - sltu $t3, $a1, $t2 50 | 0x0000E724: 0x000A502C ',P..' - max $t2, $zr, $t2 51 | 0x0000E728: 0x00AA502D '-P..' - min $t2, $a1, $t2 52 | 0x0000E72C: 0x7D61AD44 'D.a}' - ins $at, $t3, 21, 1 53 | 0x0000E730: 0x7D493804 '.8I}' - ins $t1, $t2, 0, 8 54 | 0x0000E734: 0x0000C010 '....' - mfhi $t8 55 | 0x0000E738: 0x0118C021 '!...' - addu $t8, $t0, $t8 56 | 0x0000E73C: 0xAF980068 'h...' - sw $t8, 104($gp) 57 | 0x0000E740: 0x0302502C ',P..' - max $t2, $t8, $v0 58 | 0x0000E744: 0x0143502D '-PC.' - min $t2, $t2, $v1 59 | 0x0000E748: 0x030AC023 '#...' - subu $t8, $t8, $t2 60 | 0x0000E74C: 0x0018C02B '+...' - sltu $t8, $zr, $t8 61 | 0x0000E750: 0x0018C5C0 '....' - sll $t8, $t8, 23 62 | 0x0000E754: 0x00380825 '%.8.' - or $at, $at, $t8 63 | 0x0000E758: 0x8F88002C ',...' - lw $t0, 44($gp) 64 | 0x0000E75C: 0x8F8B00DC '....' - lw $t3, 220($gp) 65 | 0x0000E760: 0x7D2C3C00 '.<,}' - ext $t4, $t1, 16, 8 66 | 0x0000E764: 0x01880018 '....' - mult $t4, $t0 67 | 0x0000E768: 0xAF8A0028 '(...' - sw $t2, 40($gp) 68 | 0x0000E76C: 0x000A5103 '.Q..' - sra $t2, $t2, 4 69 | 0x0000E770: 0x00004012 '.@..' - mflo $t0 70 | 0x0000E774: 0x00084203 '.B..' - sra $t0, $t0, 8 71 | 0x0000E778: 0x0168C023 '#.h.' - subu $t8, $t3, $t0 72 | 0x0000E77C: 0x0302582C ',X..' - max $t3, $t8, $v0 73 | 0x0000E780: 0x0163582D '-Xc.' - min $t3, $t3, $v1 74 | 0x0000E784: 0x030BC023 '#...' - subu $t8, $t8, $t3 75 | 0x0000E788: 0x0018C02B '+...' - sltu $t8, $zr, $t8 76 | 0x0000E78C: 0x7F01B584 '....' - ins $at, $t8, 22, 1 77 | 0x0000E790: 0x000B5A00 '.Z..' - sll $t3, $t3, 8 78 | 0x0000E794: 0x016E0018 '..n.' - mult $t3, $t6 79 | 0x0000E798: 0x00AA582B '+X..' - sltu $t3, $a1, $t2 80 | 0x0000E79C: 0x000A502C ',P..' - max $t2, $zr, $t2 81 | 0x0000E7A0: 0x00AA502D '-P..' - min $t2, $a1, $t2 82 | 0x0000E7A4: 0x7D61A504 '..a}' - ins $at, $t3, 20, 1 83 | 0x0000E7A8: 0x7D497A04 '.zI}' - ins $t1, $t2, 8, 8 84 | 0x0000E7AC: 0x0000C010 '....' - mfhi $t8 85 | 0x0000E7B0: 0x0118C021 '!...' - addu $t8, $t0, $t8 86 | 0x0000E7B4: 0xAF98006C 'l...' - sw $t8, 108($gp) 87 | 0x0000E7B8: 0x0302502C ',P..' - max $t2, $t8, $v0 88 | 0x0000E7BC: 0x0143502D '-PC.' - min $t2, $t2, $v1 89 | 0x0000E7C0: 0x030AC023 '#...' - subu $t8, $t8, $t2 90 | 0x0000E7C4: 0x0018C02B '+...' - sltu $t8, $zr, $t8 91 | 0x0000E7C8: 0x0018C580 '....' - sll $t8, $t8, 22 92 | 0x0000E7CC: 0x00380825 '%.8.' - or $at, $at, $t8 93 | 0x0000E7D0: 0xAF8A002C ',...' - sw $t2, 44($gp) 94 | 0x0000E7D4: 0x000A5903 '.Y..' - sra $t3, $t2, 4 95 | 0x0000E7D8: 0x00AB502B '+P..' - sltu $t2, $a1, $t3 96 | 0x0000E7DC: 0x000B582C ',X..' - max $t3, $zr, $t3 97 | 0x0000E7E0: 0x00AB582D '-X..' - min $t3, $a1, $t3 98 | 0x0000E7E4: 0x7D419CC4 '..A}' - ins $at, $t2, 19, 1 99 | 0x0000E7E8: 0x7D69BC04 '..i}' - ins $t1, $t3, 16, 8 100 | 0x0000E7EC: 0x48E9007C '|..H' - mtv $t1, S703 101 | 0x0000E7F0: 0x48E1000F '...H' - mtv $at, S330 102 | 0x0000E7F4: 0x03E00008 '....' - jr $ra 103 | 0x0000E7F8: 0xF79C0058 'X...' - svl.q C700, 88($gp) 104 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_DPCL.txt: -------------------------------------------------------------------------------- 1 | DPCL: 2 | 3 | 0x0000D4A8: 0xDB940020 ' ...' - lv.q C500, 32($gp) 4 | 0x0000D4AC: 0xDB8900B0 '....' - lv.q C210, 176($gp) 5 | 0x0000D4B0: 0xDB8800C0 '....' - lv.q C200, 192($gp) 6 | 0x0000D4B4: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 7 | 0x0000D4B8: 0xD03B0880 '..;.' - vs2i.p C000, C200 8 | 0x0000D4BC: 0xD03B4881 '.H;.' - vs2i.p C010, C202 9 | 0x0000D4C0: 0xD29C8080 '....' - vi2f.q C000, C000, 28 10 | 0x0000D4C4: 0xD29C8181 '....' - vi2f.q C010, C010, 28 11 | 0x0000D4C8: 0xD28C0B42 'B...' - vi2f.s S022, S230, 12 12 | 0x0000D4CC: 0xD0004182 '.A..' - vmov.p C020, C012 13 | 0x0000D4D0: 0xD0002141 'A!..' - vmov.s S012, S011 14 | 0x0000D4D4: 0xD0000121 '!...' - vmov.s S011, S010 15 | 0x0000D4D8: 0xD0006001 '.`..' - vmov.s S010, S003 16 | 0x0000D4DC: 0xD28CC923 '#...' - vi2f.t R003, C211, 12 17 | 0x0000D4E0: 0xDC000039 '9...' - vpfxs [y, z, w, x] 18 | 0x0000D4E4: 0xD28C9488 '....' - vi2f.q C200, C500, 12 19 | 0x0000D4E8: 0xD006800F '....' - vzero.t C330 20 | 0x0000D4EC: 0xF1888005 '....' - vhtfm4.q C110, M000, C200 21 | 0x0000D4F0: 0x8F840018 '....' - lw $a0, 24($gp) 22 | 0x0000D4F4: 0xBFEA0040 '@...' - cache 0xA, 64($ra) 23 | 0x0000D4F8: 0x6DB38504 '...m' - vmax.t C100, C110, R403 24 | 0x0000D4FC: 0x6D138404 '...m' - vmin.t C100, C100, C430 25 | 0x0000D500: 0x6C058405 '...l' - vcmp.t NE, C100, C110 26 | 0x0000D504: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 27 | 0x0000D508: 0xD28CCB00 '....' - vi2f.t C000, C231, 12 28 | 0x0000D50C: 0x7C823800 '.8.|' - ext $v0, $a0, 0, 8 29 | 0x0000D510: 0x7C853A00 '.:.|' - ext $a1, $a0, 8, 8 30 | 0x0000D514: 0x7C863C00 '.<.|' - ext $a2, $a0, 16, 8 31 | 0x0000D518: 0x48E20001 '...H' - mtv $v0, S010 32 | 0x0000D51C: 0x48E50021 '!..H' - mtv $a1, S011 33 | 0x0000D520: 0x48E60041 'A..H' - mtv $a2, S012 34 | 0x0000D524: 0xD2888101 '....' - vi2f.t C010, C010, 8 35 | 0x0000D528: 0x64048108 '...d' - vmul.t C200, C010, C100 36 | 0x0000D52C: 0x6088801D '...`' - vsub.t C710, C000, C200 37 | 0x0000D530: 0x6D929D1E '...m' - vmax.t C720, C710, C420 38 | 0x0000D534: 0xDD0007E4 '....' - vpfxt [|x|, |y|, |z|, w] 39 | 0x0000D538: 0x6C1D9303 '...l' - vcmp.t LE, C430, C710 40 | 0x0000D53C: 0x6D139E1E '...m' - vmin.t C720, C720, C430 41 | 0x0000D540: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 42 | 0x0000D544: 0x65689E1D '..he' - vscl.t C710, C720, S203 43 | 0x0000D548: 0x601D8808 '...`' - vadd.t C200, C200, C710 44 | 0x0000D54C: 0x00042042 'B ..' - srl $a0, $a0, 1 45 | 0x0000D550: 0x48E40063 'c..H' - mtv $a0, S033 46 | 0x0000D554: 0xDB9E0050 'P...' - lv.q C720, 80($gp) 47 | 0x0000D558: 0x6DB38802 '...m' - vmax.t C020, C200, R403 48 | 0x0000D55C: 0xD20C8801 '....' - vf2in.t C010, C200, 12 49 | 0x0000D560: 0xD0048800 '....' - vsat0.t C000, C200 50 | 0x0000D564: 0x6D138202 '...m' - vmin.t C020, C020, C430 51 | 0x0000D568: 0xF7810066 'f...' - svr.q C010, 100($gp) 52 | 0x0000D56C: 0x6C028805 '...l' - vcmp.t NE, C200, C020 53 | 0x0000D570: 0xD20C8202 '....' - vf2in.t C020, C020, 12 54 | 0x0000D574: 0xD21F8803 '....' - vf2in.t C030, C200, 31 55 | 0x0000D578: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 56 | 0x0000D57C: 0x6C008805 '...l' - vcmp.t NE, C200, C000 57 | 0x0000D580: 0xD0468F6F 'o.F.' - vfad.t R313, C330 58 | 0x0000D584: 0xF7820026 '&...' - svr.q C020, 36($gp) 59 | 0x0000D588: 0xD006800F '....' - vzero.t C330 60 | 0x0000D58C: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 61 | 0x0000D590: 0xD0468F8F '..F.' - vfad.q C330, C330 62 | 0x0000D594: 0xD03C83FE '..<.' - vi2uc.q S723, C030 // fixed 63 | 0x0000D598: 0xF79E0058 'X...' - svl.q C720, 88($gp) 64 | 0x0000D59C: 0x03E00008 '....' - jr $ra 65 | 0x0000D5A0: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 66 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_DPCS.txt: -------------------------------------------------------------------------------- 1 | DPCS: 2 | 3 | 0x0000D37C: 0xDB8B00D0 '....' - lv.q C230, 208($gp) 4 | 0x0000D380: 0xCB880020 ' ...' - lv.s S200, 32($gp) 5 | 0x0000D384: 0x8F840018 '....' - lw $a0, 24($gp) 6 | 0x0000D388: 0xD28CCB00 '....' - vi2f.t C000, C231, 12 7 | 0x0000D38C: 0x7C823800 '.8.|' - ext $v0, $a0, 0, 8 8 | 0x0000D390: 0x7C853A00 '.:.|' - ext $a1, $a0, 8, 8 9 | 0x0000D394: 0x7C863C00 '.<.|' - ext $a2, $a0, 16, 8 10 | 0x0000D398: 0x48E20001 '...H' - mtv $v0, S010 11 | 0x0000D39C: 0x48E50021 '!..H' - mtv $a1, S011 12 | 0x0000D3A0: 0x48E60041 'A..H' - mtv $a2, S012 13 | 0x0000D3A4: 0xD2888101 '....' - vi2f.t C010, C010, 8 14 | 0x0000D3A8: 0xD28C0808 '....' - vi2f.s S200, S200, 12 15 | 0x0000D3AC: 0x60818000 '...`' - vsub.t C000, C000, C010 16 | 0x0000D3B0: 0xD006800F '....' - vzero.t C330 17 | 0x0000D3B4: 0x6D92801D '...m' - vmax.t C710, C000, C420 18 | 0x0000D3B8: 0xDD0007E4 '....' - vpfxt [|x|, |y|, |z|, w] 19 | 0x0000D3BC: 0x6C009303 '...l' - vcmp.t LE, C430, C000 20 | 0x0000D3C0: 0x6D139D1D '...m' - vmin.t C710, C710, C430 21 | 0x0000D3C4: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 22 | 0x0000D3C8: 0x65089D1D '...e' - vscl.t C710, C710, S200 23 | 0x0000D3CC: 0x00042042 'B ..' - srl $a0, $a0, 1 24 | 0x0000D3D0: 0x48E40063 'c..H' - mtv $a0, S033 25 | 0x0000D3D4: 0x60019D08 '...`' - vadd.t C200, C710, C010 26 | 0x0000D3D8: 0xDE000815 '....' - vpfxd [[0:1], [0:1], [0:1], m] 27 | 0x0000D3DC: 0x60019D03 '...`' - vadd.t C030, C710, C010 28 | 0x0000D3E0: 0x6D928809 '...m' - vmax.t C210, C200, C420 29 | 0x0000D3E4: 0xDD0007E4 '....' - vpfxt [|x|, |y|, |z|, w] 30 | 0x0000D3E8: 0x6C089303 '...l' - vcmp.t LE, C430, C200 31 | 0x0000D3EC: 0x6D138909 '...m' - vmin.t C210, C210, C430 32 | 0x0000D3F0: 0xD2A6900F '....' - vcmovt.t C330, C400, 6 33 | 0x0000D3F4: 0xD20C8801 '....' - vf2in.t C010, C200, 12 34 | 0x0000D3F8: 0xD20C8909 '....' - vf2in.t C210, C210, 12 35 | 0x0000D3FC: 0xF7810066 'f...' - svr.q C010, 100($gp) 36 | 0x0000D400: 0x6C038805 '...l' - vcmp.t NE, C200, C030 37 | 0x0000D404: 0xDB9E0050 'P...' - lv.q C720, 80($gp) 38 | 0x0000D408: 0xF7890026 '&...' - svr.q C210, 36($gp) 39 | 0x0000D40C: 0xD21F8303 '....' - vf2in.t C030, C030, 31 40 | 0x0000D410: 0xD0468F6F 'o.F.' - vfad.t R313, C330 41 | 0x0000D414: 0xD006800F '....' - vzero.t C330 42 | 0x0000D418: 0xD2A6910F '....' - vcmovt.t C330, C410, 6 43 | 0x0000D41C: 0xD0468F8F '..F.' - vfad.q C330, C330 44 | 0x0000D420: 0xD03C83FE '..<.' - vi2uc.q S723, C030 // fixed 45 | 0x0000D424: 0xF79E0058 'X...' - svl.q C720, 88($gp) 46 | 0x0000D428: 0x03E00008 '....' - jr $ra 47 | 0x0000D42C: 0xD2700F0F '..p.' - vf2id.s S330, S330, 16 48 | -------------------------------------------------------------------------------- /GTE/raw/PopsGTE_DPCT.txt: -------------------------------------------------------------------------------- 1 | DPCT: 2 | 3 | 0x0000E958: 0x2787FFF4 '...'' - addiu $a3, $gp, -12 4 | 0x0000E95C: 0x24010000 '...$' - li $at, 0 5 | 0x0000E960: 0x8F8D0020 ' ...' - lw $t5, 32($gp) 6 | 0x0000E964: 0x240E7FFF '...$' - li $t6, 32767 7 | 0x0000E968: 0x24058000 '...$' - li $a1, -32768 8 | 0x0000E96C: 0x240C00FF '...$' - li $t4, 255 9 | 0x0000E970: 0x8F820018 '....' - lw $v0, 24($gp) 10 | 0x0000E974: 0x8F8A00D4 '....' - lw $t2, 212($gp) 11 | 0x0000E978: 0x8F8600D8 '....' - lw $a2, 216($gp) 12 | 0x0000E97C: 0x8F8400DC '....' - lw $a0, 220($gp) 13 | 14 | loc_0000E980: ; Refs: 0x0000EA64 15 | 0x0000E980: 0x8CEB005C '\...' - lw $t3, 92($a3) 16 | 0x0000E984: 0x24E70004 '...$' - addiu $a3, $a3, 4 17 | 0x0000E988: 0x7D783800 '.8x}' - ext $t8, $t3, 0, 8 18 | 0x0000E98C: 0x0018C100 '....' - sll $t8, $t8, 4 19 | 0x0000E990: 0x01584823 '#HX.' - subu $t1, $t2, $t8 20 | 0x0000E994: 0x0125782C ',x%.' - max $t7, $t1, $a1 21 | 0x0000E998: 0x01EE782D '-x..' - min $t7, $t7, $t6 22 | 0x0000E99C: 0x012F4823 '#H/.' - subu $t1, $t1, $t7 23 | 0x0000E9A0: 0x0009402B '+@..' - sltu $t0, $zr, $t1 24 | 0x0000E9A4: 0x00084600 '.F..' - sll $t0, $t0, 24 25 | 0x0000E9A8: 0x01ED0018 '....' - mult $t7, $t5 26 | 0x0000E9AC: 0x0018C300 '....' - sll $t8, $t8, 12 27 | 0x0000E9B0: 0x00004812 '.H..' - mflo $t1 28 | 0x0000E9B4: 0x0309C021 '!...' - addu $t8, $t8, $t1 29 | 0x0000E9B8: 0x00184C03 '.L..' - sra $t1, $t8, 16 30 | 0x0000E9BC: 0x0189782B '+x..' - sltu $t7, $t4, $t1 31 | 0x0000E9C0: 0x0009482C ',H..' - max $t1, $zr, $t1 32 | 0x0000E9C4: 0x0189482D '-H..' - min $t1, $t4, $t1 33 | 0x0000E9C8: 0x7DE8AD44 'D..}' - ins $t0, $t7, 21, 1 34 | 0x0000E9CC: 0x7D223804 '.8"}' - ins $v0, $t1, 0, 8 35 | 0x0000E9D0: 0x7D633A00 '.:c}' - ext $v1, $t3, 8, 8 36 | 0x0000E9D4: 0x00031900 '....' - sll $v1, $v1, 4 37 | 0x0000E9D8: 0x00C34823 '#H..' - subu $t1, $a2, $v1 38 | 0x0000E9DC: 0x0125782C ',x%.' - max $t7, $t1, $a1 39 | 0x0000E9E0: 0x01EE782D '-x..' - min $t7, $t7, $t6 40 | 0x0000E9E4: 0x012F4823 '#H/.' - subu $t1, $t1, $t7 41 | 0x0000E9E8: 0x0009482B '+H..' - sltu $t1, $zr, $t1 42 | 0x0000E9EC: 0x7D28BDC4 '..(}' - ins $t0, $t1, 23, 1 43 | 0x0000E9F0: 0x01ED0018 '....' - mult $t7, $t5 44 | 0x0000E9F4: 0x00031B00 '....' - sll $v1, $v1, 12 45 | 0x0000E9F8: 0x00004812 '.H..' - mflo $t1 46 | 0x0000E9FC: 0x00691821 '!.i.' - addu $v1, $v1, $t1 47 | 0x0000EA00: 0x00034C03 '.L..' - sra $t1, $v1, 16 48 | 0x0000EA04: 0x0189782B '+x..' - sltu $t7, $t4, $t1 49 | 0x0000EA08: 0x0009482C ',H..' - max $t1, $zr, $t1 50 | 0x0000EA0C: 0x0189482D '-H..' - min $t1, $t4, $t1 51 | 0x0000EA10: 0x7DE8A504 '...}' - ins $t0, $t7, 20, 1 52 | 0x0000EA14: 0x7D227A04 '.z"}' - ins $v0, $t1, 8, 8 53 | 0x0000EA18: 0x7D6B3C00 '. 2 | #include "gte2.h" 3 | 4 | void GTEWriteData (int id, u_long value) 5 | { 6 | switch (id) 7 | { 8 | case 0: GTEWriteData0 (value); break; 9 | case 1: GTEWriteData1 (value); break; 10 | case 2: GTEWriteData2 (value); break; 11 | case 3: GTEWriteData3 (value); break; 12 | case 4: GTEWriteData4 (value); break; 13 | case 5: GTEWriteData5 (value); break; 14 | case 6: GTEWriteData6 (value); break; 15 | case 7: GTEWriteData7 (value); break; 16 | case 8: GTEWriteData8 (value); break; 17 | case 9: GTEWriteData9 (value); break; 18 | case 10: GTEWriteData10 (value); break; 19 | case 11: GTEWriteData11 (value); break; 20 | case 12: GTEWriteData12 (value); break; 21 | case 13: GTEWriteData13 (value); break; 22 | case 14: GTEWriteData14 (value); break; 23 | case 15: GTEWriteData15 (value); break; 24 | case 16: GTEWriteData16 (value); break; 25 | case 17: GTEWriteData17 (value); break; 26 | case 18: GTEWriteData18 (value); break; 27 | case 19: GTEWriteData19 (value); break; 28 | case 20: GTEWriteData20 (value); break; 29 | case 21: GTEWriteData21 (value); break; 30 | case 22: GTEWriteData22 (value); break; 31 | case 23: GTEWriteData23 (value); break; 32 | case 24: GTEWriteData24 (value); break; 33 | case 25: GTEWriteData25 (value); break; 34 | case 26: GTEWriteData26 (value); break; 35 | case 27: GTEWriteData27 (value); break; 36 | case 28: GTEWriteData28 (value); break; 37 | case 29: GTEWriteData29 (value); break; 38 | case 30: GTEWriteData30 (value); break; 39 | case 31: GTEWriteData31 (value); break; 40 | } 41 | } 42 | 43 | u_long GTEReadData (int id) 44 | { 45 | switch (id) 46 | { 47 | case 0: return GTEReadData0 (); 48 | case 1: return GTEReadData1 (); 49 | case 2: return GTEReadData2 (); 50 | case 3: return GTEReadData3 (); 51 | case 4: return GTEReadData4 (); 52 | case 5: return GTEReadData5 (); 53 | case 6: return GTEReadData6 (); 54 | case 7: return GTEReadData7 (); 55 | case 8: return GTEReadData8 (); 56 | case 9: return GTEReadData9 (); 57 | case 10: return GTEReadData10 (); 58 | case 11: return GTEReadData11 (); 59 | case 12: return GTEReadData12 (); 60 | case 13: return GTEReadData13 (); 61 | case 14: return GTEReadData14 (); 62 | case 15: return GTEReadData15 (); 63 | case 16: return GTEReadData16 (); 64 | case 17: return GTEReadData17 (); 65 | case 18: return GTEReadData18 (); 66 | case 19: return GTEReadData19 (); 67 | case 20: return GTEReadData20 (); 68 | case 21: return GTEReadData21 (); 69 | case 22: return GTEReadData22 (); 70 | case 23: return GTEReadData23 (); 71 | case 24: return GTEReadData24 (); 72 | case 25: return GTEReadData25 (); 73 | case 26: return GTEReadData26 (); 74 | case 27: return GTEReadData27 (); 75 | case 28: return GTEReadData28 (); 76 | case 29: return GTEReadData29 (); 77 | case 30: return GTEReadData30 (); 78 | case 31: return GTEReadData31 (); 79 | } 80 | } 81 | 82 | void GTEWriteCtrl (int id, u_long value) 83 | { 84 | switch (id) 85 | { 86 | case 0: GTEWriteCtrl0 (value); break; 87 | case 1: GTEWriteCtrl1 (value); break; 88 | case 2: GTEWriteCtrl2 (value); break; 89 | case 3: GTEWriteCtrl3 (value); break; 90 | case 4: GTEWriteCtrl4 (value); break; 91 | case 5: GTEWriteCtrl5 (value); break; 92 | case 6: GTEWriteCtrl6 (value); break; 93 | case 7: GTEWriteCtrl7 (value); break; 94 | case 8: GTEWriteCtrl8 (value); break; 95 | case 9: GTEWriteCtrl9 (value); break; 96 | case 10: GTEWriteCtrl10 (value); break; 97 | case 11: GTEWriteCtrl11 (value); break; 98 | case 12: GTEWriteCtrl12 (value); break; 99 | case 13: GTEWriteCtrl13 (value); break; 100 | case 14: GTEWriteCtrl14 (value); break; 101 | case 15: GTEWriteCtrl15 (value); break; 102 | case 16: GTEWriteCtrl16 (value); break; 103 | case 17: GTEWriteCtrl17 (value); break; 104 | case 18: GTEWriteCtrl18 (value); break; 105 | case 19: GTEWriteCtrl19 (value); break; 106 | case 20: GTEWriteCtrl20 (value); break; 107 | case 21: GTEWriteCtrl21 (value); break; 108 | case 22: GTEWriteCtrl22 (value); break; 109 | case 23: GTEWriteCtrl23 (value); break; 110 | case 24: GTEWriteCtrl24 (value); break; 111 | case 25: GTEWriteCtrl25 (value); break; 112 | case 26: GTEWriteCtrl26 (value); break; 113 | case 27: GTEWriteCtrl27 (value); break; 114 | case 28: GTEWriteCtrl28 (value); break; 115 | case 29: GTEWriteCtrl29 (value); break; 116 | case 30: GTEWriteCtrl30 (value); break; 117 | case 31: GTEWriteCtrl31 (value); break; 118 | } 119 | } 120 | 121 | u_long GTEReadCtrl (int id) 122 | { 123 | switch (id) 124 | { 125 | case 0: return GTEReadCtrl0 (); 126 | case 1: return GTEReadCtrl1 (); 127 | case 2: return GTEReadCtrl2 (); 128 | case 3: return GTEReadCtrl3 (); 129 | case 4: return GTEReadCtrl4 (); 130 | case 5: return GTEReadCtrl5 (); 131 | case 6: return GTEReadCtrl6 (); 132 | case 7: return GTEReadCtrl7 (); 133 | case 8: return GTEReadCtrl8 (); 134 | case 9: return GTEReadCtrl9 (); 135 | case 10: return GTEReadCtrl10 (); 136 | case 11: return GTEReadCtrl11 (); 137 | case 12: return GTEReadCtrl12 (); 138 | case 13: return GTEReadCtrl13 (); 139 | case 14: return GTEReadCtrl14 (); 140 | case 15: return GTEReadCtrl15 (); 141 | case 16: return GTEReadCtrl16 (); 142 | case 17: return GTEReadCtrl17 (); 143 | case 18: return GTEReadCtrl18 (); 144 | case 19: return GTEReadCtrl19 (); 145 | case 20: return GTEReadCtrl20 (); 146 | case 21: return GTEReadCtrl21 (); 147 | case 22: return GTEReadCtrl22 (); 148 | case 23: return GTEReadCtrl23 (); 149 | case 24: return GTEReadCtrl24 (); 150 | case 25: return GTEReadCtrl25 (); 151 | case 26: return GTEReadCtrl26 (); 152 | case 27: return GTEReadCtrl27 (); 153 | case 28: return GTEReadCtrl28 (); 154 | case 29: return GTEReadCtrl29 (); 155 | case 30: return GTEReadCtrl30 (); 156 | case 31: return GTEReadCtrl31 (); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /GTECheck/gte.h: -------------------------------------------------------------------------------- 1 | void GTEEnable (int a0, int a1); 2 | void GTEDisable (int a0, int a1); 3 | 4 | void GTEWriteData (int id, u_long value); 5 | u_long GTEReadData (int id); 6 | void GTEWriteCtrl (int id, u_long value); 7 | u_long GTEReadCtrl (int id); 8 | -------------------------------------------------------------------------------- /GTECheck/gte2.h: -------------------------------------------------------------------------------- 1 | 2 | void GTEWriteData0 (u_long value); 3 | void GTEWriteData1 (u_long value); 4 | void GTEWriteData2 (u_long value); 5 | void GTEWriteData3 (u_long value); 6 | void GTEWriteData4 (u_long value); 7 | void GTEWriteData5 (u_long value); 8 | void GTEWriteData6 (u_long value); 9 | void GTEWriteData7 (u_long value); 10 | void GTEWriteData8 (u_long value); 11 | void GTEWriteData9 (u_long value); 12 | void GTEWriteData10 (u_long value); 13 | void GTEWriteData11 (u_long value); 14 | void GTEWriteData12 (u_long value); 15 | void GTEWriteData13 (u_long value); 16 | void GTEWriteData14 (u_long value); 17 | void GTEWriteData15 (u_long value); 18 | void GTEWriteData16 (u_long value); 19 | void GTEWriteData17 (u_long value); 20 | void GTEWriteData18 (u_long value); 21 | void GTEWriteData19 (u_long value); 22 | void GTEWriteData20 (u_long value); 23 | void GTEWriteData21 (u_long value); 24 | void GTEWriteData22 (u_long value); 25 | void GTEWriteData23 (u_long value); 26 | void GTEWriteData24 (u_long value); 27 | void GTEWriteData25 (u_long value); 28 | void GTEWriteData26 (u_long value); 29 | void GTEWriteData27 (u_long value); 30 | void GTEWriteData28 (u_long value); 31 | void GTEWriteData29 (u_long value); 32 | void GTEWriteData30 (u_long value); 33 | void GTEWriteData31 (u_long value); 34 | 35 | u_long GTEReadData0 (void); 36 | u_long GTEReadData1 (void); 37 | u_long GTEReadData2 (void); 38 | u_long GTEReadData3 (void); 39 | u_long GTEReadData4 (void); 40 | u_long GTEReadData5 (void); 41 | u_long GTEReadData6 (void); 42 | u_long GTEReadData7 (void); 43 | u_long GTEReadData8 (void); 44 | u_long GTEReadData9 (void); 45 | u_long GTEReadData10 (void); 46 | u_long GTEReadData11 (void); 47 | u_long GTEReadData12 (void); 48 | u_long GTEReadData13 (void); 49 | u_long GTEReadData14 (void); 50 | u_long GTEReadData15 (void); 51 | u_long GTEReadData16 (void); 52 | u_long GTEReadData17 (void); 53 | u_long GTEReadData18 (void); 54 | u_long GTEReadData19 (void); 55 | u_long GTEReadData20 (void); 56 | u_long GTEReadData21 (void); 57 | u_long GTEReadData22 (void); 58 | u_long GTEReadData23 (void); 59 | u_long GTEReadData24 (void); 60 | u_long GTEReadData25 (void); 61 | u_long GTEReadData26 (void); 62 | u_long GTEReadData27 (void); 63 | u_long GTEReadData28 (void); 64 | u_long GTEReadData29 (void); 65 | u_long GTEReadData30 (void); 66 | u_long GTEReadData31 (void); 67 | 68 | void GTEWriteCtrl0 (u_long value); 69 | void GTEWriteCtrl1 (u_long value); 70 | void GTEWriteCtrl2 (u_long value); 71 | void GTEWriteCtrl3 (u_long value); 72 | void GTEWriteCtrl4 (u_long value); 73 | void GTEWriteCtrl5 (u_long value); 74 | void GTEWriteCtrl6 (u_long value); 75 | void GTEWriteCtrl7 (u_long value); 76 | void GTEWriteCtrl8 (u_long value); 77 | void GTEWriteCtrl9 (u_long value); 78 | void GTEWriteCtrl10 (u_long value); 79 | void GTEWriteCtrl11 (u_long value); 80 | void GTEWriteCtrl12 (u_long value); 81 | void GTEWriteCtrl13 (u_long value); 82 | void GTEWriteCtrl14 (u_long value); 83 | void GTEWriteCtrl15 (u_long value); 84 | void GTEWriteCtrl16 (u_long value); 85 | void GTEWriteCtrl17 (u_long value); 86 | void GTEWriteCtrl18 (u_long value); 87 | void GTEWriteCtrl19 (u_long value); 88 | void GTEWriteCtrl20 (u_long value); 89 | void GTEWriteCtrl21 (u_long value); 90 | void GTEWriteCtrl22 (u_long value); 91 | void GTEWriteCtrl23 (u_long value); 92 | void GTEWriteCtrl24 (u_long value); 93 | void GTEWriteCtrl25 (u_long value); 94 | void GTEWriteCtrl26 (u_long value); 95 | void GTEWriteCtrl27 (u_long value); 96 | void GTEWriteCtrl28 (u_long value); 97 | void GTEWriteCtrl29 (u_long value); 98 | void GTEWriteCtrl30 (u_long value); 99 | void GTEWriteCtrl31 (u_long value); 100 | 101 | u_long GTEReadCtrl0 (void); 102 | u_long GTEReadCtrl1 (void); 103 | u_long GTEReadCtrl2 (void); 104 | u_long GTEReadCtrl3 (void); 105 | u_long GTEReadCtrl4 (void); 106 | u_long GTEReadCtrl5 (void); 107 | u_long GTEReadCtrl6 (void); 108 | u_long GTEReadCtrl7 (void); 109 | u_long GTEReadCtrl8 (void); 110 | u_long GTEReadCtrl9 (void); 111 | u_long GTEReadCtrl10 (void); 112 | u_long GTEReadCtrl11 (void); 113 | u_long GTEReadCtrl12 (void); 114 | u_long GTEReadCtrl13 (void); 115 | u_long GTEReadCtrl14 (void); 116 | u_long GTEReadCtrl15 (void); 117 | u_long GTEReadCtrl16 (void); 118 | u_long GTEReadCtrl17 (void); 119 | u_long GTEReadCtrl18 (void); 120 | u_long GTEReadCtrl19 (void); 121 | u_long GTEReadCtrl20 (void); 122 | u_long GTEReadCtrl21 (void); 123 | u_long GTEReadCtrl22 (void); 124 | u_long GTEReadCtrl23 (void); 125 | u_long GTEReadCtrl24 (void); 126 | u_long GTEReadCtrl25 (void); 127 | u_long GTEReadCtrl26 (void); 128 | u_long GTEReadCtrl27 (void); 129 | u_long GTEReadCtrl28 (void); 130 | u_long GTEReadCtrl29 (void); 131 | u_long GTEReadCtrl30 (void); 132 | u_long GTEReadCtrl31 (void); 133 | 134 | void GTE_AVSZ3 (void); 135 | -------------------------------------------------------------------------------- /GTECheck/gteregs.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GTE data registers 4 | */ 5 | #define C2_VXY0 0 6 | #define C2_VZ0 1 7 | #define C2_VXY1 2 8 | #define C2_VZ1 3 9 | #define C2_VXY2 4 10 | #define C2_VZ2 5 11 | #define C2_RGB 6 12 | #define C2_OTZ 7 13 | 14 | #define C2_IR0 8 15 | #define C2_IR1 9 16 | #define C2_IR2 10 17 | #define C2_IR3 11 18 | #define C2_SXY0 12 19 | #define C2_SXY1 13 20 | #define C2_SXY2 14 21 | #define C2_SXYP 15 22 | 23 | #define C2_SZ0 16 24 | #define C2_SZ1 17 25 | #define C2_SZ2 18 26 | #define C2_SZ3 19 27 | #define C2_RGB0 20 28 | #define C2_RGB1 21 29 | #define C2_RGB2 22 30 | 31 | 32 | #define C2_MAC0 24 33 | #define C2_MAC1 25 34 | #define C2_MAC2 26 35 | #define C2_MAC3 27 36 | #define C2_IRGB 28 37 | #define C2_ORGB 29 38 | #define C2_LZCS 30 39 | #define C2_LZCR 31 40 | 41 | /* 42 | * GTE control Registers 43 | */ 44 | #define C2_R11R12 0 45 | #define C2_R13R21 1 46 | #define C2_R22R23 2 47 | #define C2_R31R32 3 48 | #define C2_R33 4 49 | #define C2_TRX 5 50 | #define C2_TRY 6 51 | #define C2_TRZ 7 52 | 53 | #define C2_L11L12 8 54 | #define C2_L13L21 9 55 | #define C2_L22L23 10 56 | #define C2_L31L32 11 57 | #define C2_L33 12 58 | #define C2_RBK 13 59 | #define C2_GBK 14 60 | #define C2_BBK 15 61 | 62 | #define C2_LR1LR2 16 63 | #define C2_LR3LG1 17 64 | #define C2_LG2LG3 18 65 | #define C2_LB1LB2 19 66 | #define C2_LB3 20 67 | #define C2_RFC 21 68 | #define C2_GFC 22 69 | #define C2_BFC 23 70 | 71 | #define C2_OFX 24 72 | #define C2_OFY 25 73 | #define C2_H 26 74 | #define C2_DQA 27 75 | #define C2_DQB 28 76 | #define C2_ZSF3 29 77 | #define C2_ZSF4 30 78 | #define C2_FLAG 31 79 | -------------------------------------------------------------------------------- /GTECheck/main.c: -------------------------------------------------------------------------------- 1 | // Bruteforce all GTE instructions and compare output with standard gauge values. 2 | // (c) org 2011. 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "gte.h" 15 | #include "gte2.h" 16 | #include "gteregs.h" 17 | 18 | /**************************************************************************/ 19 | 20 | #define PIH (320) 21 | #define PIV (240) 22 | #define OTLEN (16) 23 | 24 | static int side = 0; 25 | static long ot[2][OTLEN]; 26 | DRAWENV draw[2]; 27 | DISPENV disp[2]; 28 | //int current; 29 | int fnt; 30 | 31 | /**************************************************************************/ 32 | 33 | /* GTE Registers. */ 34 | u_long GTEData[32], GTECtrl[32]; 35 | 36 | static void ClearGTERegs (void) 37 | { 38 | int i; 39 | 40 | for (i=0; i<=31; i++) 41 | { 42 | GTEData[i] = GTECtrl[i] = 0; 43 | } 44 | } 45 | 46 | static void DumpGTERegs (void) 47 | { 48 | int i; 49 | 50 | for (i=0; i<=31; i++) 51 | { 52 | GTEData[i] = GTEReadData (i); 53 | GTECtrl[i] = GTEReadCtrl (i); 54 | } 55 | } 56 | 57 | static void WritebackGTERegs (void) 58 | { 59 | int i; 60 | 61 | for (i=0; i<=31; i++) 62 | { 63 | GTEWriteData (i, GTEData[i]); 64 | GTEWriteCtrl (i, GTECtrl[i]); 65 | } 66 | } 67 | 68 | static u_long GTERegsChecksum (void) 69 | { 70 | int i; 71 | u_long sum = 0; 72 | for (i=0; i<=31; i++) 73 | { 74 | sum += GTEData[i]; 75 | sum += GTECtrl[i]; 76 | } 77 | return sum; 78 | } 79 | 80 | /**************************************************************************/ 81 | 82 | typedef struct RunFlow { // value = [from ... to] with step. 83 | u_long from; 84 | u_long to; 85 | u_long step; // if ( value += step > to ) value = to. 86 | } RunFlow; 87 | 88 | typedef struct RegFlow { 89 | int index; // reg. index 90 | int datactrl; // 0 - Data reg, 1 - ctrl reg; 91 | u_long value; // current value 92 | RunFlow *run; // runflow control 93 | } RegFlow; 94 | 95 | #define DATA 0 96 | #define CTRL 1 97 | 98 | static void Test_AVSZ3 (char *info, u_long sz1, u_long sz2, u_long sz3, u_long zsf3) 99 | { 100 | char txt[256]; 101 | u_long otz, mac0, flag; 102 | 103 | ClearGTERegs (); 104 | GTEData [C2_SZ1] = sz1 ; 105 | GTEData [C2_SZ2] = sz2 ; 106 | GTEData [C2_SZ3] = sz3 ; 107 | GTECtrl [C2_ZSF3] = zsf3 ; 108 | WritebackGTERegs (); 109 | GTE_AVSZ3 (); 110 | DumpGTERegs (); 111 | otz = GTEData [C2_OTZ]; 112 | mac0 = GTEData [C2_MAC0]; 113 | flag = GTECtrl [C2_FLAG]; 114 | sprintf (txt, "\n%s\n(%04X+%04X+%04X)*%04X\nOTZ=%08X\nMAC0=%08X\nFLAG=%08X\n", info, sz1, sz2, sz3, zsf3, otz, mac0, flag ); 115 | FntPrint (fnt, txt); 116 | } 117 | 118 | /**************************************************************************/ 119 | 120 | main () 121 | { 122 | char txt[256]; 123 | 124 | SetDispMask( 0 ); 125 | ResetGraph( 0 ); 126 | SetGraphDebug( 0 ); 127 | ResetCallback(); 128 | PadInit( 0 ); 129 | ExitCriticalSection(); 130 | 131 | // current = 0; 132 | 133 | /* Initialize drawing environment & screen double buffer */ 134 | SetDefDrawEnv( &draw[0], 0, 0, PIH, PIV ); 135 | SetDefDrawEnv( &draw[1], 0, PIV, PIH, PIV ); 136 | SetDefDispEnv( &disp[0], 0, PIV, PIH, PIV ); 137 | SetDefDispEnv( &disp[1], 0, 0, PIH, PIV ); 138 | draw[0].isbg = draw[1].isbg = 1; 139 | setRGB0( &draw[0], 0, 0, 64 ); 140 | setRGB0( &draw[1], 0, 0, 64 ); 141 | PutDispEnv( &disp[0] ); 142 | PutDrawEnv( &draw[0] ); 143 | 144 | /* Initialize onscreen font and text output system */ 145 | FntLoad(960, 256); 146 | SetDumpFnt(FntOpen(16, 16, 368, 480, 0, 1024)); 147 | 148 | VSync(0); /* Wait for VBLANK */ 149 | SetDispMask(1); /* Turn on the display */ 150 | 151 | GTEEnable (0, 0); 152 | 153 | while (1) 154 | { 155 | ClearOTag( ot[side], OTLEN ); 156 | DrawSync( 0 ); 157 | side ^= 1; 158 | PutDispEnv( &disp[side] ); 159 | PutDrawEnv( &draw[side] ); 160 | DrawOTag( ot[side/*^1*/] ); 161 | 162 | sprintf (txt, "AVSZ3 Test\n" ); 163 | FntPrint (fnt, txt); 164 | Test_AVSZ3 ("Normal calc", 1, 2, 3, 0x0556 ); 165 | Test_AVSZ3 ("Limit C", 0x1C72, 0x1C72, 0x1C72, 0x3000 ); 166 | Test_AVSZ3 ("Overflow", 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF ); 167 | Test_AVSZ3 ("Underflow", 0xFFFF, 0xFFFF, 0xFFFF, 0x8001 ); 168 | 169 | FntFlush (fnt); 170 | //DrawSync (0); 171 | 172 | VSync (0); 173 | 174 | /* current ^= 1; 175 | PutDrawEnv (&draw[current]); 176 | PutDispEnv (&disp[current]); */ 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /GTECheck/main.lnk: -------------------------------------------------------------------------------- 1 | org $80010000 2 | 3 | text group ; main text group 4 | bss group bss ; main data group 5 | 6 | 7 | section .rdata,text ; main sections 8 | section .text,text 9 | section .data,text 10 | section .sdata,text 11 | section .sbss,bss 12 | section .bss,bss 13 | 14 | 15 | inclib "c:\psyq\lib\libapi.lib" 16 | inclib "c:\PsyQ\lib\libgpu.lib" 17 | inclib "c:\PsyQ\lib\libgs.lib" 18 | inclib "c:\PsyQ\lib\libgte.lib" 19 | inclib "c:\PsyQ\lib\libetc.lib" 20 | inclib "c:\PsyQ\lib\libcd.lib" 21 | inclib "c:\PsyQ\lib\libpress.lib" 22 | inclib "c:\PsyQ\lib\libc.lib" 23 | inclib "c:\PsyQ\lib\libmath.lib" 24 | inclib "c:\PsyQ\lib\libspu.lib" 25 | inclib "c:\PsyQ\lib\libsnd.lib" 26 | inclib "c:\PsyQ\lib\libsn.lib" 27 | 28 | include main.obj 29 | include gte2.obj 30 | include gte.obj 31 | 32 | regs pc=__SN_ENTRY_POINT ; entry point 33 | 34 | -------------------------------------------------------------------------------- /GTETest/BUILD.BAT: -------------------------------------------------------------------------------- 1 | @echo off 2 | del main.exe 3 | 4 | SET PSYQ_PATH=C:\PSYQ\BIN 5 | set PATH=c:\PsyQ\BIN;%PATH% 6 | 7 | ccpsx -O2 -c -Xo$80010000 main.c 8 | ccpsx -O2 -c gte.c 9 | ccpsx -O2 -c disasm.c 10 | asmpsx /l gte2.asm, gte2.obj 11 | psylink /c /z @main.lnk,main.cpe 12 | -------------------------------------------------------------------------------- /GTETest/CONVERT.BAT: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | echo Run under DOSBox. 4 | 5 | cpe2x main.cpe 6 | del main.cpe 7 | exefixup main.exe 8 | -------------------------------------------------------------------------------- /GTETest/CPE2X.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTETest/CPE2X.COM -------------------------------------------------------------------------------- /GTETest/CWSDPMI.EXE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTETest/CWSDPMI.EXE -------------------------------------------------------------------------------- /GTETest/Disasm.h: -------------------------------------------------------------------------------- 1 | // Project VisualStation: PSX Disassembler. 2 | 3 | // Instruction types. 4 | #define DISA_TYPE_ITYPE 0x80000000 5 | #define DISA_TYPE_JTYPE 0x40000000 6 | #define DISA_TYPE_RTYPE 0x20000000 7 | 8 | #define DISA_TYPE_LDST 0x00000001 9 | #define DISA_TYPE_ALU 0x00000002 10 | #define DISA_TYPE_ALU3 0x00000004 11 | #define DISA_TYPE_SHIFT 0x00000008 12 | #define DISA_TYPE_MULDIV 0x00000010 13 | #define DISA_TYPE_JUMP 0x00000020 14 | #define DISA_TYPE_BRANCH 0x00000040 15 | #define DISA_TYPE_SPECIAL 0x00000080 16 | #define DISA_TYPE_COP0 0x00000100 17 | #define DISA_TYPE_COP1 0x00000200 18 | #define DISA_TYPE_COP2 0x00000400 19 | #define DISA_TYPE_COP3 0x00000800 20 | #define DISA_TYPE_NOP 0x00001000 21 | 22 | #define DISA_TYPE_SIMPLE 0x10000000 23 | 24 | typedef struct DisasmData 25 | { 26 | /* 27 | * Input parameters. 28 | */ 29 | 30 | u_long instr; // Instruction to disassemble 31 | u_long pc; // Program Counter 32 | 33 | int simplify; // Use simplified notation 34 | 35 | /* 36 | * Output parameters. 37 | */ 38 | 39 | char mnem[16]; 40 | char operands[64]; 41 | u_long type; 42 | } DisasmData; 43 | 44 | void PSXDisasm (DisasmData *disa); 45 | -------------------------------------------------------------------------------- /GTETest/EXEFIXUP.C: -------------------------------------------------------------------------------- 1 | /* 2 | * exefixup.c v0.02 Andrew Kieschnick 3 | * 4 | * displays PS-X EXE header information 5 | * offers to fix incorrect t_size 6 | * offers to pad to 2048-byte boundary for cd-rom use 7 | * 8 | * THIS SOURCE WAS MODIFIED (SLIGHTLY) TO WORK UNDER DOS 9 | * IF YOU USE UNIX, GET THE THE UNMODIFIED SOURCE 10 | * 11 | * 12 | * This program is free software; you can redistribute it and/or modify 13 | * it under the terms of the GNU General Public License as published by 14 | * the Free Software Foundation; either version 2 of the License, or 15 | * (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU General Public License 23 | * along with this program; if not, write to the Free Software 24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 25 | * 26 | */ 27 | 28 | #include 29 | #include 30 | #include 31 | 32 | unsigned int char2int(unsigned char *foo) 33 | { 34 | return foo[3]*16777216 + foo[2]*65536 + foo[1]*256 + foo[0]; 35 | } 36 | 37 | void int2char(unsigned int foo, unsigned char *bar) 38 | { 39 | bar[3]=foo>>24; 40 | bar[2]=foo>>16; 41 | bar[1]=foo>>8; 42 | bar[0]=foo; 43 | } 44 | 45 | void usage(void) 46 | { 47 | printf("Usage: exefixup \n\n"); 48 | printf("\t\ta PS-X EXE file\n\n"); 49 | printf("\tdisplays EXE header\n"); 50 | printf("\toffers to correct a wrong t_size\n"); 51 | printf("\toffers to pad to 2048-byte boundary\n\n"); 52 | exit(0); 53 | } 54 | 55 | void main(int argc, char *argv[]) 56 | { 57 | FILE *exe; 58 | FILE *out; 59 | unsigned char data[8]; 60 | char filename[256]; 61 | int i; 62 | unsigned int header_data[12]; 63 | unsigned int size; 64 | unsigned int padsize; 65 | char yesno='Z'; 66 | 67 | printf("exefixup v0.02 Andrew Kieschnick \n\n"); 68 | 69 | if (argc!=2) 70 | usage(); 71 | 72 | strncpy(filename,argv[1],256); 73 | 74 | exe=fopen(filename, "rb"); 75 | 76 | if (!exe) 77 | { 78 | printf("ERROR: Can't open %s\n",filename); 79 | exit(-1); 80 | } 81 | 82 | for(i=0;i<8;i++) 83 | fscanf(exe, "%c", &data[i]); 84 | data[8]=0; 85 | 86 | if (strncmp(data, "PS-X EXE", 8)) 87 | { 88 | printf("ERROR: Not a PS-X EXE file\n"); 89 | exit(-1); 90 | } 91 | 92 | for(i=0;i<12;i++) 93 | { 94 | fscanf(exe, "%c", &data[0]); 95 | fscanf(exe, "%c", &data[1]); 96 | fscanf(exe, "%c", &data[2]); 97 | fscanf(exe, "%c", &data[3]); 98 | header_data[i]=char2int(data); 99 | } 100 | 101 | printf("id\tPS-X EXE\n"); 102 | printf("text\t0x%.8x\n", header_data[0]); 103 | printf("data\t0x%.8x\n", header_data[1]); 104 | printf("pc0\t0x%.8x\n", header_data[2]); 105 | printf("gp0\t0x%.8x\n", header_data[3]); 106 | printf("t_addr\t0x%.8x\n", header_data[4]); 107 | printf("t_size\t0x%.8x\n", header_data[5]); 108 | printf("d_addr\t0x%.8x\n", header_data[6]); 109 | printf("d_size\t0x%.8x\n", header_data[7]); 110 | printf("b_addr\t0x%.8x\n", header_data[8]); 111 | printf("b_size\t0x%.8x\n", header_data[9]); 112 | printf("s_addr\t0x%.8x\n", header_data[10]); 113 | printf("s_size\t0x%.8x\n\n", header_data[11]); 114 | 115 | fseek(exe, 0, SEEK_END); 116 | 117 | size=ftell(exe)-2048; 118 | 119 | padsize=2048-(size%2048); 120 | 121 | if (padsize!=2048) 122 | { 123 | printf("WARNING: EXE size is not a multiple of 2048!\n"); 124 | while ((yesno!='Y')&&(yesno!='N')) 125 | { 126 | printf("Write a padded EXE (to padded.exe) ? "); 127 | scanf("%c%*c", &yesno); 128 | yesno=toupper(yesno); 129 | } 130 | if (yesno=='Y') 131 | { 132 | out = fopen("padded.exe", "wb"); 133 | 134 | header_data[5]=size+padsize; 135 | 136 | fprintf(out, "PS-X EXE"); 137 | for(i=0;i<12;i++) 138 | { 139 | int2char(header_data[i], data); 140 | fprintf(out, "%c%c%c%c", data[0], data[1], data[2], data[3]); 141 | } 142 | 143 | fseek(exe, 56, SEEK_SET); 144 | 145 | for(i=0;i 2 | #include "gte2.h" 3 | 4 | void GTEWriteData (int id, u_long value) 5 | { 6 | switch (id) 7 | { 8 | case 0: GTEWriteData0 (value); break; 9 | case 1: GTEWriteData1 (value); break; 10 | case 2: GTEWriteData2 (value); break; 11 | case 3: GTEWriteData3 (value); break; 12 | case 4: GTEWriteData4 (value); break; 13 | case 5: GTEWriteData5 (value); break; 14 | case 6: GTEWriteData6 (value); break; 15 | case 7: GTEWriteData7 (value); break; 16 | case 8: GTEWriteData8 (value); break; 17 | case 9: GTEWriteData9 (value); break; 18 | case 10: GTEWriteData10 (value); break; 19 | case 11: GTEWriteData11 (value); break; 20 | case 12: GTEWriteData12 (value); break; 21 | case 13: GTEWriteData13 (value); break; 22 | case 14: GTEWriteData14 (value); break; 23 | case 15: GTEWriteData15 (value); break; 24 | case 16: GTEWriteData16 (value); break; 25 | case 17: GTEWriteData17 (value); break; 26 | case 18: GTEWriteData18 (value); break; 27 | case 19: GTEWriteData19 (value); break; 28 | case 20: GTEWriteData20 (value); break; 29 | case 21: GTEWriteData21 (value); break; 30 | case 22: GTEWriteData22 (value); break; 31 | case 23: GTEWriteData23 (value); break; 32 | case 24: GTEWriteData24 (value); break; 33 | case 25: GTEWriteData25 (value); break; 34 | case 26: GTEWriteData26 (value); break; 35 | case 27: GTEWriteData27 (value); break; 36 | case 28: GTEWriteData28 (value); break; 37 | case 29: GTEWriteData29 (value); break; 38 | case 30: GTEWriteData30 (value); break; 39 | case 31: GTEWriteData31 (value); break; 40 | } 41 | } 42 | 43 | u_long GTEReadData (int id) 44 | { 45 | switch (id) 46 | { 47 | case 0: return GTEReadData0 (); 48 | case 1: return GTEReadData1 (); 49 | case 2: return GTEReadData2 (); 50 | case 3: return GTEReadData3 (); 51 | case 4: return GTEReadData4 (); 52 | case 5: return GTEReadData5 (); 53 | case 6: return GTEReadData6 (); 54 | case 7: return GTEReadData7 (); 55 | case 8: return GTEReadData8 (); 56 | case 9: return GTEReadData9 (); 57 | case 10: return GTEReadData10 (); 58 | case 11: return GTEReadData11 (); 59 | case 12: return GTEReadData12 (); 60 | case 13: return GTEReadData13 (); 61 | case 14: return GTEReadData14 (); 62 | case 15: return GTEReadData15 (); 63 | case 16: return GTEReadData16 (); 64 | case 17: return GTEReadData17 (); 65 | case 18: return GTEReadData18 (); 66 | case 19: return GTEReadData19 (); 67 | case 20: return GTEReadData20 (); 68 | case 21: return GTEReadData21 (); 69 | case 22: return GTEReadData22 (); 70 | case 23: return GTEReadData23 (); 71 | case 24: return GTEReadData24 (); 72 | case 25: return GTEReadData25 (); 73 | case 26: return GTEReadData26 (); 74 | case 27: return GTEReadData27 (); 75 | case 28: return GTEReadData28 (); 76 | case 29: return GTEReadData29 (); 77 | case 30: return GTEReadData30 (); 78 | case 31: return GTEReadData31 (); 79 | } 80 | } 81 | 82 | void GTEWriteCtrl (int id, u_long value) 83 | { 84 | switch (id) 85 | { 86 | case 0: GTEWriteCtrl0 (value); break; 87 | case 1: GTEWriteCtrl1 (value); break; 88 | case 2: GTEWriteCtrl2 (value); break; 89 | case 3: GTEWriteCtrl3 (value); break; 90 | case 4: GTEWriteCtrl4 (value); break; 91 | case 5: GTEWriteCtrl5 (value); break; 92 | case 6: GTEWriteCtrl6 (value); break; 93 | case 7: GTEWriteCtrl7 (value); break; 94 | case 8: GTEWriteCtrl8 (value); break; 95 | case 9: GTEWriteCtrl9 (value); break; 96 | case 10: GTEWriteCtrl10 (value); break; 97 | case 11: GTEWriteCtrl11 (value); break; 98 | case 12: GTEWriteCtrl12 (value); break; 99 | case 13: GTEWriteCtrl13 (value); break; 100 | case 14: GTEWriteCtrl14 (value); break; 101 | case 15: GTEWriteCtrl15 (value); break; 102 | case 16: GTEWriteCtrl16 (value); break; 103 | case 17: GTEWriteCtrl17 (value); break; 104 | case 18: GTEWriteCtrl18 (value); break; 105 | case 19: GTEWriteCtrl19 (value); break; 106 | case 20: GTEWriteCtrl20 (value); break; 107 | case 21: GTEWriteCtrl21 (value); break; 108 | case 22: GTEWriteCtrl22 (value); break; 109 | case 23: GTEWriteCtrl23 (value); break; 110 | case 24: GTEWriteCtrl24 (value); break; 111 | case 25: GTEWriteCtrl25 (value); break; 112 | case 26: GTEWriteCtrl26 (value); break; 113 | case 27: GTEWriteCtrl27 (value); break; 114 | case 28: GTEWriteCtrl28 (value); break; 115 | case 29: GTEWriteCtrl29 (value); break; 116 | case 30: GTEWriteCtrl30 (value); break; 117 | case 31: GTEWriteCtrl31 (value); break; 118 | } 119 | } 120 | 121 | u_long GTEReadCtrl (int id) 122 | { 123 | switch (id) 124 | { 125 | case 0: return GTEReadCtrl0 (); 126 | case 1: return GTEReadCtrl1 (); 127 | case 2: return GTEReadCtrl2 (); 128 | case 3: return GTEReadCtrl3 (); 129 | case 4: return GTEReadCtrl4 (); 130 | case 5: return GTEReadCtrl5 (); 131 | case 6: return GTEReadCtrl6 (); 132 | case 7: return GTEReadCtrl7 (); 133 | case 8: return GTEReadCtrl8 (); 134 | case 9: return GTEReadCtrl9 (); 135 | case 10: return GTEReadCtrl10 (); 136 | case 11: return GTEReadCtrl11 (); 137 | case 12: return GTEReadCtrl12 (); 138 | case 13: return GTEReadCtrl13 (); 139 | case 14: return GTEReadCtrl14 (); 140 | case 15: return GTEReadCtrl15 (); 141 | case 16: return GTEReadCtrl16 (); 142 | case 17: return GTEReadCtrl17 (); 143 | case 18: return GTEReadCtrl18 (); 144 | case 19: return GTEReadCtrl19 (); 145 | case 20: return GTEReadCtrl20 (); 146 | case 21: return GTEReadCtrl21 (); 147 | case 22: return GTEReadCtrl22 (); 148 | case 23: return GTEReadCtrl23 (); 149 | case 24: return GTEReadCtrl24 (); 150 | case 25: return GTEReadCtrl25 (); 151 | case 26: return GTEReadCtrl26 (); 152 | case 27: return GTEReadCtrl27 (); 153 | case 28: return GTEReadCtrl28 (); 154 | case 29: return GTEReadCtrl29 (); 155 | case 30: return GTEReadCtrl30 (); 156 | case 31: return GTEReadCtrl31 (); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /GTETest/gte.h: -------------------------------------------------------------------------------- 1 | void GTEEnable (int a0, int a1); 2 | void GTEDisable (int a0, int a1); 3 | 4 | void GTEWriteData (int id, u_long value); 5 | u_long GTEReadData (int id); 6 | void GTEWriteCtrl (int id, u_long value); 7 | u_long GTEReadCtrl (int id); 8 | -------------------------------------------------------------------------------- /GTETest/gte2.h: -------------------------------------------------------------------------------- 1 | 2 | void GTEWriteData0 (u_long value); 3 | void GTEWriteData1 (u_long value); 4 | void GTEWriteData2 (u_long value); 5 | void GTEWriteData3 (u_long value); 6 | void GTEWriteData4 (u_long value); 7 | void GTEWriteData5 (u_long value); 8 | void GTEWriteData6 (u_long value); 9 | void GTEWriteData7 (u_long value); 10 | void GTEWriteData8 (u_long value); 11 | void GTEWriteData9 (u_long value); 12 | void GTEWriteData10 (u_long value); 13 | void GTEWriteData11 (u_long value); 14 | void GTEWriteData12 (u_long value); 15 | void GTEWriteData13 (u_long value); 16 | void GTEWriteData14 (u_long value); 17 | void GTEWriteData15 (u_long value); 18 | void GTEWriteData16 (u_long value); 19 | void GTEWriteData17 (u_long value); 20 | void GTEWriteData18 (u_long value); 21 | void GTEWriteData19 (u_long value); 22 | void GTEWriteData20 (u_long value); 23 | void GTEWriteData21 (u_long value); 24 | void GTEWriteData22 (u_long value); 25 | void GTEWriteData23 (u_long value); 26 | void GTEWriteData24 (u_long value); 27 | void GTEWriteData25 (u_long value); 28 | void GTEWriteData26 (u_long value); 29 | void GTEWriteData27 (u_long value); 30 | void GTEWriteData28 (u_long value); 31 | void GTEWriteData29 (u_long value); 32 | void GTEWriteData30 (u_long value); 33 | void GTEWriteData31 (u_long value); 34 | 35 | u_long GTEReadData0 (void); 36 | u_long GTEReadData1 (void); 37 | u_long GTEReadData2 (void); 38 | u_long GTEReadData3 (void); 39 | u_long GTEReadData4 (void); 40 | u_long GTEReadData5 (void); 41 | u_long GTEReadData6 (void); 42 | u_long GTEReadData7 (void); 43 | u_long GTEReadData8 (void); 44 | u_long GTEReadData9 (void); 45 | u_long GTEReadData10 (void); 46 | u_long GTEReadData11 (void); 47 | u_long GTEReadData12 (void); 48 | u_long GTEReadData13 (void); 49 | u_long GTEReadData14 (void); 50 | u_long GTEReadData15 (void); 51 | u_long GTEReadData16 (void); 52 | u_long GTEReadData17 (void); 53 | u_long GTEReadData18 (void); 54 | u_long GTEReadData19 (void); 55 | u_long GTEReadData20 (void); 56 | u_long GTEReadData21 (void); 57 | u_long GTEReadData22 (void); 58 | u_long GTEReadData23 (void); 59 | u_long GTEReadData24 (void); 60 | u_long GTEReadData25 (void); 61 | u_long GTEReadData26 (void); 62 | u_long GTEReadData27 (void); 63 | u_long GTEReadData28 (void); 64 | u_long GTEReadData29 (void); 65 | u_long GTEReadData30 (void); 66 | u_long GTEReadData31 (void); 67 | 68 | void GTEWriteCtrl0 (u_long value); 69 | void GTEWriteCtrl1 (u_long value); 70 | void GTEWriteCtrl2 (u_long value); 71 | void GTEWriteCtrl3 (u_long value); 72 | void GTEWriteCtrl4 (u_long value); 73 | void GTEWriteCtrl5 (u_long value); 74 | void GTEWriteCtrl6 (u_long value); 75 | void GTEWriteCtrl7 (u_long value); 76 | void GTEWriteCtrl8 (u_long value); 77 | void GTEWriteCtrl9 (u_long value); 78 | void GTEWriteCtrl10 (u_long value); 79 | void GTEWriteCtrl11 (u_long value); 80 | void GTEWriteCtrl12 (u_long value); 81 | void GTEWriteCtrl13 (u_long value); 82 | void GTEWriteCtrl14 (u_long value); 83 | void GTEWriteCtrl15 (u_long value); 84 | void GTEWriteCtrl16 (u_long value); 85 | void GTEWriteCtrl17 (u_long value); 86 | void GTEWriteCtrl18 (u_long value); 87 | void GTEWriteCtrl19 (u_long value); 88 | void GTEWriteCtrl20 (u_long value); 89 | void GTEWriteCtrl21 (u_long value); 90 | void GTEWriteCtrl22 (u_long value); 91 | void GTEWriteCtrl23 (u_long value); 92 | void GTEWriteCtrl24 (u_long value); 93 | void GTEWriteCtrl25 (u_long value); 94 | void GTEWriteCtrl26 (u_long value); 95 | void GTEWriteCtrl27 (u_long value); 96 | void GTEWriteCtrl28 (u_long value); 97 | void GTEWriteCtrl29 (u_long value); 98 | void GTEWriteCtrl30 (u_long value); 99 | void GTEWriteCtrl31 (u_long value); 100 | 101 | u_long GTEReadCtrl0 (void); 102 | u_long GTEReadCtrl1 (void); 103 | u_long GTEReadCtrl2 (void); 104 | u_long GTEReadCtrl3 (void); 105 | u_long GTEReadCtrl4 (void); 106 | u_long GTEReadCtrl5 (void); 107 | u_long GTEReadCtrl6 (void); 108 | u_long GTEReadCtrl7 (void); 109 | u_long GTEReadCtrl8 (void); 110 | u_long GTEReadCtrl9 (void); 111 | u_long GTEReadCtrl10 (void); 112 | u_long GTEReadCtrl11 (void); 113 | u_long GTEReadCtrl12 (void); 114 | u_long GTEReadCtrl13 (void); 115 | u_long GTEReadCtrl14 (void); 116 | u_long GTEReadCtrl15 (void); 117 | u_long GTEReadCtrl16 (void); 118 | u_long GTEReadCtrl17 (void); 119 | u_long GTEReadCtrl18 (void); 120 | u_long GTEReadCtrl19 (void); 121 | u_long GTEReadCtrl20 (void); 122 | u_long GTEReadCtrl21 (void); 123 | u_long GTEReadCtrl22 (void); 124 | u_long GTEReadCtrl23 (void); 125 | u_long GTEReadCtrl24 (void); 126 | u_long GTEReadCtrl25 (void); 127 | u_long GTEReadCtrl26 (void); 128 | u_long GTEReadCtrl27 (void); 129 | u_long GTEReadCtrl28 (void); 130 | u_long GTEReadCtrl29 (void); 131 | u_long GTEReadCtrl30 (void); 132 | u_long GTEReadCtrl31 (void); 133 | -------------------------------------------------------------------------------- /GTETest/image.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/GTETest/image.bin -------------------------------------------------------------------------------- /GTETest/image.cue: -------------------------------------------------------------------------------- 1 | FILE "image.bin" BINARY 2 | TRACK 01 MODE2/2352 3 | INDEX 01 00:00:00 4 | -------------------------------------------------------------------------------- /GTETest/main.lnk: -------------------------------------------------------------------------------- 1 | org $80010000 2 | 3 | text group ; main text group 4 | bss group bss ; main data group 5 | 6 | 7 | section .rdata,text ; main sections 8 | section .text,text 9 | section .data,text 10 | section .sdata,text 11 | section .sbss,bss 12 | section .bss,bss 13 | 14 | 15 | inclib "c:\psyq\lib\libapi.lib" 16 | inclib "c:\PsyQ\lib\libgpu.lib" 17 | inclib "c:\PsyQ\lib\libgs.lib" 18 | inclib "c:\PsyQ\lib\libgte.lib" 19 | inclib "c:\PsyQ\lib\libetc.lib" 20 | inclib "c:\PsyQ\lib\libcd.lib" 21 | inclib "c:\PsyQ\lib\libpress.lib" 22 | inclib "c:\PsyQ\lib\libc.lib" 23 | inclib "c:\PsyQ\lib\libmath.lib" 24 | inclib "c:\PsyQ\lib\libspu.lib" 25 | inclib "c:\PsyQ\lib\libsnd.lib" 26 | inclib "c:\PsyQ\lib\libsn.lib" 27 | 28 | include main.obj 29 | include disasm.obj 30 | include gte2.obj 31 | include gte.obj 32 | 33 | regs pc=__SN_ENTRY_POINT ; entry point 34 | 35 | -------------------------------------------------------------------------------- /GTE_Divider/gte_divider2.h: -------------------------------------------------------------------------------- 1 | // GTE Divider by org. errrr... by Sony :P 2 | // Based on Pops hacking: http://code.google.com/p/pops-gte 3 | 4 | // UNR table. 5 | // Must be hardwired somewhere in CPU chip. 6 | // If someone wish to decap PSX CPU I have bunch of them, contact me ogamespec@gmail.com, I'll send it free. 7 | static u8 unrt[] = { 8 | 0xFF, 0xFD, 0xFB, 0xF9, 0xF7, 0xF5, 0xF3, 0xF1, 0xEF, 0xEE, 0xEC, 0xEA, 0xE8, 0xE6, 0xE4, 0xE3, 9 | 0xE1, 0xDF, 0xDD, 0xDC, 0xDA, 0xD8, 0xD6, 0xD5, 0xD3, 0xD1, 0xD0, 0xCE, 0xCD, 0xCB, 0xC9, 0xC8, 10 | 0xC6, 0xC5, 0xC3, 0xC1, 0xC0, 0xBE, 0xBD, 0xBB, 0xBA, 0xB8, 0xB7, 0xB5, 0xB4, 0xB2, 0xB1, 0xB0, 11 | 0xAE, 0xAD, 0xAB, 0xAA, 0xA9, 0xA7, 0xA6, 0xA4, 0xA3, 0xA2, 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 12 | 0x99, 0x97, 0x96, 0x95, 0x94, 0x92, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x87, 0x86, 13 | 0x85, 0x84, 0x83, 0x82, 0x81, 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x75, 0x74, 14 | 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 15 | 0x63, 0x62, 0x61, 0x60, 0x5F, 0x5E, 0x5D, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58, 0x57, 0x56, 0x55, 16 | 0x54, 0x53, 0x53, 0x52, 0x51, 0x50, 0x4F, 0x4E, 0x4D, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x48, 17 | 0x47, 0x46, 0x45, 0x44, 0x43, 0x43, 0x42, 0x41, 0x40, 0x3F, 0x3F, 0x3E, 0x3D, 0x3C, 0x3C, 0x3B, 18 | 0x3A, 0x39, 0x39, 0x38, 0x37, 0x36, 0x36, 0x35, 0x34, 0x33, 0x33, 0x32, 0x31, 0x31, 0x30, 0x2F, 19 | 0x2E, 0x2E, 0x2D, 0x2C, 0x2C, 0x2B, 0x2A, 0x2A, 0x29, 0x28, 0x28, 0x27, 0x26, 0x26, 0x25, 0x24, 20 | 0x24, 0x23, 0x22, 0x22, 0x21, 0x20, 0x20, 0x1F, 0x1E, 0x1E, 0x1D, 0x1D, 0x1C, 0x1B, 0x1B, 0x1A, 21 | 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13, 0x12, 0x12, 0x11, 0x11, 22 | 0x10, 0x0F, 0x0F, 0x0E, 0x0E, 0x0D, 0x0D, 0x0C, 0x0C, 0x0B, 0x0A, 0x0A, 0x09, 0x09, 0x08, 0x08, 23 | 0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 24 | }; 25 | 26 | // Count leading zeros. 27 | // I know, there is more complicated algo, but meh... I'm lazy 28 | static inline int CLZ (u16 rs) 29 | { 30 | u32 n, m; 31 | for(n=0, m=1<<15; n<16; n++, m>>=1) 32 | { 33 | if (rs & m) break; 34 | } 35 | return 16 + n; 36 | } 37 | 38 | // inputs are 0.16.0, returns 0.16.16 fixed-point 39 | static inline u32 DIVIDE(u16 n, u16 d) { 40 | // no need to check n >= 0, because it cannot be greater 0x7FFF (0x7FFF * 2 = 0xFFFE, but 0x8000 * 2 = 0x10000 = 0 already) 41 | if (n < d * 2) { 42 | int zeros = CLZ ( d ) - 14; 43 | u32 a3 = (d << zeros) >> 2; 44 | s32 t6 = unrt[(( a3 + 64) >> 7) - 256] + 257; 45 | s32 t8 = 128 - t6 * a3; 46 | s32 t7 = (t8 >> 8) & 0x1FFFF; 47 | s32 t4 = t7 * t6 + 128; 48 | s32 t3 = t4 >> 8; 49 | u32 reciprocal = t3 << 14; 50 | u64 res = 0x80000000 + (u64)(n << zeros) * (u64)(reciprocal); 51 | return res >> 32; 52 | 53 | // Don't ask me how does it work. Honestly, I don't understand it at all ^_^ 54 | } 55 | 56 | return 0xffffffff; 57 | } 58 | -------------------------------------------------------------------------------- /GTE_Divider/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "gte_divider2.h" 3 | 4 | typedef signed char s8; 5 | typedef signed short s16; 6 | typedef signed long s32; 7 | typedef signed __int64 s64; 8 | typedef unsigned char u8; 9 | typedef unsigned short u16; 10 | typedef unsigned long u32; 11 | typedef unsigned __int64 u64; 12 | 13 | main () 14 | { 15 | 16 | u16 n = 0xA0; 17 | u16 d = 0x200; 18 | 19 | u32 result = DIVIDE ( n, d ); 20 | 21 | printf ( "%04X / %04X = %08X\n", n, d, result ); 22 | } -------------------------------------------------------------------------------- /MDEC/Pops_EFB4_MDECReset.txt: -------------------------------------------------------------------------------- 1 | 2 | EFB4: 3 | void MDECReset (void) 4 | { 5 | // clear mdec control block 6 | [0x00119B70 + 24] = 0 7 | [0x00119B70 + 4 ] = 0 8 | mdec.block_size = 0 9 | [0x00119B70 + 12] = 0 10 | [0x00119B70 + 16] = 0 11 | mdec.block_ptr = 0 12 | mdec.reg0 = 0 13 | 14 | SetDMAHandler ( 0, MDEC_DMA0 ); 15 | SetDMAHandler ( 1, MDEC_DMA1 ); 16 | } 17 | -------------------------------------------------------------------------------- /MDEC/Pops_F00C_Init.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/MDEC/Pops_F00C_Init.txt -------------------------------------------------------------------------------- /MDEC/Pops_MDEC_DMA.txt: -------------------------------------------------------------------------------- 1 | 2 | #define MDEC0_SIZE_MASK 0x0000FFFF 3 | 4 | float iqtab[64*2]; // 0 ... 2 ... 4 ... 6 - Y component 5 | //... 1 ... 2 ... 5 - UV component 6 | 7 | u16 iqscale[64] = { 8 | 8000 B18B B18B A73D F642 A73D E7F8 9683 9 | E7F8 9683 8000 D0C4 DA82 D0C4 6492 8000 10 | B18B C4A7 C4A7 B18B 6492 4546 8B7E A73D 11 | B0FC A73D 8B7E 4546 2351 6016 8366 9683 12 | 9683 8366 6016 2351 30FC 5A82 7642 8000 13 | 7642 5A82 30FC 2E24 5175 6492 6492 5175 14 | 2E24 2987 4546 4F04 4546 2987 2351 366D 15 | 366D 2351 1BBF 257E 1BBF 131D 131D 09BE 16 | } 17 | 18 | F040: 19 | int MDEC_DMA0 (u32 addr, int length ) 20 | { 21 | addr &= 0x1FFFFFFF; 22 | u8 * ramptr = 0x09800000 | addr; 23 | if (addr > 0x007FFFFF) ramptr = NULL; 24 | 25 | switch ( mdec.reg0 >> 29 ) 26 | { 27 | case 0: 28 | return length; 29 | 30 | case 1: // decode 31 | mdec.block_size = (mdec.reg0 & MDEC0_SIZE_MASK) * 2; 32 | mdec.block_ptr = ramptr; 33 | if ([0x00119B70 + 16]) 34 | { 35 | [0x00119B70 + 12] = length; 36 | MDECDecode (); 37 | } 38 | sub_00017B4C (); 39 | return 0; 40 | 41 | case 2: // quantization table upload 42 | for (int i=0; i<128; i++) 43 | { 44 | float iq; 45 | int prod = ramptr[i] * iqscale[i & 0x3f]; 46 | if ( (i & 0x3F) == 0 ) prod = prod * 8; 47 | if (i & 0x40) iq = (float)prod * 1.1368683772161603e-13f; // 0x2A000000 as hex 48 | else iq = (float)prod * 1.7719999551773071f; // 0x3FE2D0E5 as hex 49 | iqtab[(i & 0x3F) * 2 + i / 64] = iq; 50 | } 51 | return length; 52 | } 53 | } 54 | 55 | ====================================================================== 56 | 57 | F164: 58 | int MDEC_DMA1 (u32 addr, int length ) 59 | { 60 | addr &= 0x1FFFFFFF; 61 | u8 * ramptr = 0x09800000 | addr; 62 | if (addr > 0x007FFFFF) ramptr = NULL; 63 | 64 | int old_size = mdec.block_size; 65 | mdec.block_size = length; 66 | if ( old_size > 0 ) 67 | { 68 | if ( [0x00119B70 + 12] ) MDECDecode (); 69 | } 70 | else mdec.block_ptr = ramptr; 71 | return 0; 72 | } 73 | 74 | u8 _0x002092FF; 75 | 76 | void sub_00017B4C () 77 | { 78 | _0x002092FF = 1; 79 | } 80 | -------------------------------------------------------------------------------- /PopsExecute/Pops_0508_CpuMainLoop .txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsExecute/Pops_0508_CpuMainLoop .txt -------------------------------------------------------------------------------- /PopsExecute/Pops_06AC.txt: -------------------------------------------------------------------------------- 1 | // sub_000006AC 2 | 3 | void * sub_000006AC () 4 | 5 | if ([0x0001021C]) { 6 | InvalidateRecompilerCacheAll (); 7 | [0x0001021C] = 0 8 | } 9 | 10 | loc_000006E8: 11 | v1 = [0x00010214] 12 | a0 = [0x000F1988] 13 | v0 = [0x0001020C] 14 | [0x00010214] = 0 15 | 16 | 17 | ; ====================================================== 18 | ; Subroutine sub_000006AC - Address 0x000006AC 19 | sub_000006AC: ; Refs: 0x00000524 0x00005C18 0x00005C30 20 | 0x000006AC: 0x27BDFFE0 '...'' - addiu $sp, $sp, -32 21 | 0x000006B0: 0xAFBF0014 '....' - sw $ra, 20($sp) 22 | 0x000006B4: 0xAFB40010 '....' - sw $s4, 16($sp) 23 | 0x000006B8: 0xAFB3000C '....' - sw $s3, 12($sp) 24 | 0x000006BC: 0xAFB20008 '....' - sw $s2, 8($sp) 25 | 0x000006C0: 0xAFB10004 '....' - sw $s1, 4($sp) 26 | 0x000006C4: 0xAFB00000 '....' - sw $s0, 0($sp) 27 | 0x000006C8: 0x3C040001 '...<' - lui $a0, 0x1 28 | 0x000006CC: 0x8C84021C '....' - lw $a0, 540($a0) 29 | 0x000006D0: 0x1480004E 'N...' - bnez $a0, loc_0000080C 30 | 0x000006D4: 0x3C020001 '...<' - lui $v0, 0x1 31 | 32 | loc_000006D8: ; Refs: 0x00000814 33 | 0x000006D8: 0x3C030001 '...<' - lui $v1, 0x1 34 | 0x000006DC: 0x8C630214 '..c.' - lw $v1, 532($v1) 35 | 0x000006E0: 0x3C140001 '...<' - lui $s4, 0x1 36 | 0x000006E4: 0x3C13000F '...<' - lui $s3, 0xF 37 | 38 | loc_000006E8: ; Refs: 0x00000754 39 | 0x000006E8: 0x3C12000F '...<' - lui $s2, 0xF 40 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 41 | 0x000006EC: 0x8E441988 '..D.' - lw $a0, 6536($s2) 42 | 0x000006F0: 0x3C020001 '...<' - lui $v0, 0x1 43 | 0x000006F4: 0x8C42020C '..B.' - lw $v0, 524($v0) 44 | 0x000006F8: 0xAE800214 '....' - sw $zr, 532($s4) 45 | 0x000006FC: 0x8C85000C '....' - lw $a1, 12($a0) 46 | 0x00000700: 0x10A00012 '....' - beqz $a1, loc_0000074C 47 | 0x00000704: 0x00438823 '#.C.' - subu $s1, $v0, $v1 48 | 0x00000708: 0x3C100001 '...<' - lui $s0, 0x1 49 | 0x0000070C: 0x8C830008 '....' - lw $v1, 8($a0) 50 | 51 | loc_00000710: ; Refs: 0x00000744 52 | 0x00000710: 0x00713823 '#8q.' - subu $a3, $v1, $s1 53 | 0x00000714: 0x28E60002 '...(' - slti $a2, $a3, 2 54 | 0x00000718: 0x10C0000C '....' - beqz $a2, loc_0000074C 55 | 0x0000071C: 0x00000000 '....' - nop 56 | 0x00000720: 0x8C880000 '....' - lw $t0, 0($a0) 57 | 0x00000724: 0xAC80000C '....' - sw $zr, 12($a0) 58 | 0x00000728: 0xAE03020C '....' - sw $v1, 524($s0) 59 | 0x0000072C: 0x8C840010 '....' - lw $a0, 16($a0) 60 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 61 | 0x00000730: 0xAE681988 '..h.' - sw $t0, 6536($s3) 62 | 0x00000734: 0x00A0F809 '....' - jalr $a1 63 | 0x00000738: 0xAE110210 '....' - sw $s1, 528($s0) 64 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 65 | 0x0000073C: 0x8E441988 '..D.' - lw $a0, 6536($s2) 66 | 0x00000740: 0x8C85000C '....' - lw $a1, 12($a0) 67 | 0x00000744: 0x54A0FFF2 '...T' - bnezl $a1, loc_00000710 68 | 0x00000748: 0x8C830008 '....' - lw $v1, 8($a0) 69 | 70 | loc_0000074C: ; Refs: 0x00000700 0x00000718 71 | 0x0000074C: 0x3C030001 '...<' - lui $v1, 0x1 72 | 0x00000750: 0x8C630214 '..c.' - lw $v1, 532($v1) 73 | 0x00000754: 0x0460FFE4 '..`.' - bltz $v1, loc_000006E8 74 | 0x00000758: 0x3C020001 '...<' - lui $v0, 0x1 75 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 76 | 0x0000075C: 0x8E521988 '..R.' - lw $s2, 6536($s2) 77 | 0x00000760: 0x3C090204 '...<' - lui $t1, 0x204 78 | 0x00000764: 0xAC51020C '..Q.' - sw $s1, 524($v0) 79 | 0x00000768: 0x8E44000C '..D.' - lw $a0, 12($s2) 80 | 0x0000076C: 0x10800004 '....' - beqz $a0, loc_00000780 81 | 0x00000770: 0x3525CC00 '..%5' - ori $a1, $t1, 0xCC00 82 | 0x00000774: 0x8E4A0008 '..J.' - lw $t2, 8($s2) 83 | 0x00000778: 0x02235823 '#X#.' - subu $t3, $s1, $v1 84 | 85 | loc_0000077C: ; Refs: 0x00097F80 86 | 0x0000077C: 0x014B2823 '#(K.' - subu $a1, $t2, $t3 87 | 88 | loc_00000780: ; Refs: 0x0000076C 89 | 0x00000780: 0x3C0E0001 '...<' - lui $t6, 0x1 90 | 0x00000784: 0x8DCE020C '....' - lw $t6, 524($t6) 91 | 0x00000788: 0x3C0C0001 '...<' - lui $t4, 0x1 92 | 0x0000078C: 0x8D8C0218 '....' - lw $t4, 536($t4) 93 | 0x00000790: 0x3C030001 '...<' - lui $v1, 0x1 94 | 0x00000794: 0x01C56821 '!h..' - addu $t5, $t6, $a1 95 | 0x00000798: 0xAC650214 '..e.' - sw $a1, 532($v1) 96 | 0x0000079C: 0x05800016 '....' - bltz $t4, loc_000007F8 97 | 0x000007A0: 0xAC6D020C '..m.' - sw $t5, 524($v1) 98 | 99 | loc_000007A4: 100 | v0 = sub_0001B354 (); 101 | if (v0 != 0) goto loc_000007DC 102 | 103 | loc_000007B4: 104 | v0 = [0x00010218] 105 | return 106 | 107 | loc_000007DC: 108 | sub_000003F8 (); 109 | CpuException (33, 0); 110 | goto loc_000007B4 111 | 112 | loc_000007F8: 113 | CpuException (0, 0); 114 | 115 | loc_00000804: 116 | goto loc_000007A4 117 | -------------------------------------------------------------------------------- /PopsExecute/Pops_0BDC_ExecGTE.txt: -------------------------------------------------------------------------------- 1 | 2 | void (*psxCP2[64])() = { 3 | psxBASIC, gteRTPS , psxNULL , psxNULL, psxNULL, psxNULL , gteNCLIP, psxNULL, // 00 4 | psxNULL , psxNULL , psxNULL , psxNULL, gteOP , psxNULL , psxNULL , psxNULL, // 08 5 | gteDPCS , gteINTPL, gteMVMVA, gteNCDS, gteCDP , psxNULL , gteNCDT , psxNULL, // 10 6 | psxNULL , psxNULL , psxNULL , gteNCCS, gteCC , psxNULL , gteNCS , psxNULL, // 18 7 | 8 | gteNCT , psxNULL , psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, // 20 9 | gteSQR , gteDPCL , gteDPCT , psxNULL, psxNULL, gteAVSZ3, gteAVSZ4, psxNULL, // 28 10 | gteRTPT , psxNULL , psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, // 30 11 | psxNULL , psxNULL , psxNULL , psxNULL, psxNULL, gteGPF , gteGPL , gteNCCT // 38 12 | }; 13 | 14 | 15 | GTEInstructions: (0x0002CBD8): 16 | 0x00001010 0x0000DEFC 0x00001010 0x00001010 0x00001010 0x00001010 0x0000E58C 0x00001010 17 | 0x00001010 0x00001010 0x00001010 0x00001010 0x00000FE4 0x00001010 0x00001010 0x00001010 18 | 0x0000D37C 0x0000E7FC 0x00000F00 0x0000D678 0x0000E668 0x00001010 0x0000D7B8 0x00001010 19 | 0x00001010 0x00001010 0x00001010 0x0000D9DC 0x0000D5A4 0x00001010 0x0000DCB0 0x00001010 20 | 21 | 0x0000DD94 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 22 | 0x00000F60 0x0000D4A8 0x0000E958 0x00001010 0x00001010 0x0000E5D0 0x0000E618 0x00001010 23 | 0x0000E36C 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 24 | 0x00001010 0x00001010 0x00001010 0x00001010 0x00001010 0x00000F8C 0x00000FB8 0x0000DAF0 25 | 26 | GTEInstructions: (0x0002CBD8): 27 | --- RTPS --- --- --- --- NCLIP --- 28 | --- --- --- --- OP --- --- --- 29 | DPCS INTPL MVMVA NCDS DPCL --- NCDT --- 30 | --- --- --- NCCS CC --- NCS --- 31 | 32 | NCT --- --- --- --- --- --- --- 33 | SQR CDP DPCT --- --- AVSZ3 AVSZ4 --- 34 | RTPT --- --- --- --- --- --- --- 35 | --- --- --- --- --- GPF GPL NCCT 36 | 37 | // sub_00000BDC 38 | ExecGTEInstruction ( op ) 39 | { 40 | GTEInstructions [op & 0x3f] (); 41 | } 42 | 43 | // sub_1010 44 | CPU_NOP: 45 | return; -------------------------------------------------------------------------------- /PopsExecute/Pops_0C18_Exception.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsExecute/Pops_0C18_Exception.txt -------------------------------------------------------------------------------- /PopsExecute/Pops_13A8_InvalidateRecompilerCacheByAddress.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsExecute/Pops_13A8_InvalidateRecompilerCacheByAddress.txt -------------------------------------------------------------------------------- /PopsExecute/Pops_1430_InvalidateRecompilerCacheAll.txt: -------------------------------------------------------------------------------- 1 | 2 | // Refs: 0x00000598 0x0000080C 0x00001298 0x0000A44C 3 | 4 | // sub_00001430 5 | void * InvalidateRecompilerCacheAll ( void ) 6 | { 7 | memclr ( 0x09C00000 - 0x09E00000 ); 8 | 9 | [0x00010220] = 0x09580000; 10 | [0x00010228] = 0 11 | 12 | return 0x09580000; 13 | } 14 | -------------------------------------------------------------------------------- /PopsExecute/Pops_1498_SetupJITC.txt: -------------------------------------------------------------------------------- 1 | sub_00001498: 2 | 3 | [0x00010220] = 0x09580000 4 | [0x00010224] = 0x09B80000 5 | 6 | memclr ( 0x09C0_0000 ... 0x09E8_0000 ) 7 | -------------------------------------------------------------------------------- /PopsExecute/Pops_5B2C_CpuExecute.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsExecute/Pops_5B2C_CpuExecute.txt -------------------------------------------------------------------------------- /PopsInit/PopsInit.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsInit/PopsInit.txt -------------------------------------------------------------------------------- /PopsInit/Pops_03F8_PSXReset.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsInit/Pops_03F8_PSXReset.txt -------------------------------------------------------------------------------- /PopsInit/Pops_0494_PSXInit.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsInit/Pops_0494_PSXInit.txt -------------------------------------------------------------------------------- /PopsInit/module_start.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/PopsInit/module_start.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | ![JPG](/imgstore/whc4e032dbd75870.jpg) 4 | 5 | Reverse engineering of `PlayStation` CPU GTE. 6 | 7 | 8 | The aim of this project is full discovery how Pops emulating GTE and write own port for some of freeware Sony `PlayStation` emulators (e.g. Pcsx). **DEPRECATED** 9 | 10 | Since Pops is buggy shit, new goal is: drop acid on PSX CPU, microscope it, find GTE, recover standard cells and study its logic layout. 11 | 12 | GTE was always kind of mystery for PSX emu authors, now we have a chance to look how it was made of silicon. 13 | 14 | Overall progress: 15 | - Decap CPU **DONE** 16 | - Microscope top metal layer (M2) on 20x zoom **DONE** 17 | - Microscope bottom metal layer (M1) **DONE** 18 | - Trace both metal layers 19 | - Delayer metal and microscope diffusion layer **DONE** 20 | - Trace diffusion **DONE** 21 | - Find all combinations of standard cells **DONE** 22 | - Locate GTE **DONE** 23 | - Restore GTE logic circuit 24 | 25 | ## News 26 | 27 | 02 jul 2015:
28 | Almost all standard cells are discovered and identified. GTE location is confirmed at bottom-left corner of chip. 29 | 30 | 13 sep 2013:
31 | CPU was delayered and imaged on 40x. Now we have to stitch 2900 image pieces (8.5 GB of data) and recover CPU Standard cells %)
32 |
33 | 34 | 35 | 2 jun 2013:
36 | Starting to stitch 850 pieces on 20x zoom.
37 |
38 | 27 may 2013: Sony, squeeze your rolls :P Here we go!
39 | 40 | ![JPG](/imgstore/whc51a3124a21d97.jpg) 41 | 42 |
43 | Waves to http://zeptobars.ru for high-resolution PSX CPU images.
44 |
45 | 15 oct 2012: I captured PSX CPU die photo, wow :P
46 | 47 | ![PNG](/imgstore/whc51a31241062f2.png) 48 | 49 | 1 feb 2012: Pwned GTE divider, used in RTPS/RTPT. See wiki. Also uploaded gte_divider.h in source tree.
50 |
51 | 24 aug 2011: Uploaded GTECheck. This small program is used to test GTE instructions on the real hardware.
52 | + discovered that Pops has bug in AVSZ3 emulation (see wiki)
53 |
54 | 21 jul 2011: GTETest is reported to be working on real hardware! Thanks to edgbla :) You can grab latest version on SVN.
55 |
56 | 20 jul 2011: Found strange thing : DPCL and CDP instructions are swapped in opcode table. See details on "Bug_DPCL_CDP" wiki page.
57 | GTETest now uploaded to the repo + I found that GTE instructions opcode decoding in Disasm.c was a bit wrong :=) (OP2 instruction field).
58 |
59 | 18 jul 2011: GTETest is reported to be not working on real hardware. Still available from downloads though. DPCS disassembled. Found bug in vi2uc.q instruction in prxtool (I already fixed disassembly listings where it was occured). Some small corrections here and there.
60 |
61 | 23 jun 2011: DCPL was mistyped. It should be DPCL. Small program for PSX was uploaded (GTETest)
62 |
63 | 24 jun 2011: Added some MDEC reversing by unknown reason
64 |
65 | 25 jun 2011: Added cool project logo. Tell me, if you have hires microscoped PSX-CPU image, I want to use it as logo.
66 |
67 |

Credits

68 | 69 | Credits go to old scene members:
70 | - Doomed/Padua: first complete GTE documentation. Where did you get it guys? o_O [now I know hehe]
71 | - Groepaz/Hitmen: for valuable help with VFPU instructions
72 | - Tyranid: for prxtool
73 | - Pcsx team: good testing framework, nah, and for the best opensource PSX emu :P
74 | - Anonymous contributor for the convudendual Inlinref.pdf "Inline Programming Reference"
75 |
76 | (c) org, 2011, 2012
77 |
78 | Contact:
79 | email: ogamespec at gmail.com
80 | Skype: ogamespec 81 | -------------------------------------------------------------------------------- /RootCounters/00081C.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | ; Subroutine sub_0000081C - Address 0x0000081C 4 | sub_0000081C: ; Refs: 0x00000604 0x00000A74 0x0000B1B8 0x0000B288 0x0000B35C 0x0000B6B4 0x0000B7FC 0x0000BDF8 0x0000C378 0x0000C40C 0x0000C44C 0x0000C6D4 0x0000C914 0x00010268 0x000108A4 0x00010EA4 0x00011070 0x00011130 0x000112CC 0x0001149C 0x0001221C 0x00012390 0x00012470 0x00012590 0x000128F8 0x00015E80 0x00016668 0x0001AD50 5 | 0x0000081C: 0x3C09000F '...<' - lui $t1, 0xF 6 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 7 | 0x00000820: 0x8D221988 '..".' - lw $v0, 6536($t1) 8 | 0x00000824: 0x00804021 '!@..' - move $t0, $a0 9 | 0x00000828: 0x8C470004 '..G.' - lw $a3, 4($v0) 10 | 0x0000082C: 0x8CE4000C '....' - lw $a0, 12($a3) 11 | 0x00000830: 0x14800026 '&...' - bnez $a0, loc_000008CC 12 | 0x00000834: 0x00001821 '!...' - move $v1, $zr 13 | 0x00000838: 0x8CEA0004 '....' - lw $t2, 4($a3) 14 | 0x0000083C: 0x8CE30000 '....' - lw $v1, 0($a3) 15 | 0x00000840: 0xAD430000 '..C.' - sw $v1, 0($t2) 16 | 0x00000844: 0x8CE40000 '....' - lw $a0, 0($a3) 17 | 0x00000848: 0x0500002E '....' - bltz $t0, loc_00000904 18 | 0x0000084C: 0xAC8A0004 '....' - sw $t2, 4($a0) 19 | 0x00000850: 0x3C0D0001 '...<' - lui $t5, 0x1 20 | 0x00000854: 0x8DAD020C '....' - lw $t5, 524($t5) 21 | 0x00000858: 0x3C0C0001 '...<' - lui $t4, 0x1 22 | 0x0000085C: 0x8D8C0214 '....' - lw $t4, 532($t4) 23 | 0x00000860: 0x01AC5823 '#X..' - subu $t3, $t5, $t4 24 | 0x00000864: 0x01685021 '!Ph.' - addu $t2, $t3, $t0 25 | 0x00000868: 0xACEA0008 '....' - sw $t2, 8($a3) 26 | 27 | loc_0000086C: ; Refs: 0x0000094C 28 | 0x0000086C: 0xACE5000C '....' - sw $a1, 12($a3) 29 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 30 | 0x00000870: 0x8D251988 '..%.' - lw $a1, 6536($t1) 31 | 0x00000874: 0xACE60010 '....' - sw $a2, 16($a3) 32 | 0x00000878: 0x8CA6000C '....' - lw $a2, 12($a1) 33 | 0x0000087C: 0x50C0000B '...P' - beqzl $a2, loc_000008AC 34 | 0x00000880: 0x8CA30004 '....' - lw $v1, 4($a1) 35 | 0x00000884: 0x8CE30008 '....' - lw $v1, 8($a3) 36 | 0x00000888: 0x8CAF0008 '....' - lw $t7, 8($a1) 37 | 38 | loc_0000088C: ; Refs: 0x000008A0 39 | 0x0000088C: 0x01E37023 '#p..' - subu $t6, $t7, $v1 40 | 0x00000890: 0x5DC00006 '...]' - bgtzl $t6, loc_000008AC 41 | 0x00000894: 0x8CA30004 '....' - lw $v1, 4($a1) 42 | 0x00000898: 0x8CA50000 '....' - lw $a1, 0($a1) 43 | 0x0000089C: 0x8CB8000C '....' - lw $t8, 12($a1) 44 | 0x000008A0: 0x5700FFFA '...W' - bnezl $t8, loc_0000088C 45 | 0x000008A4: 0x8CAF0008 '....' - lw $t7, 8($a1) 46 | 0x000008A8: 0x8CA30004 '....' - lw $v1, 4($a1) 47 | 48 | loc_000008AC: ; Refs: 0x0000087C 0x00000890 49 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 50 | 0x000008AC: 0x8D391988 '..9.' - lw $t9, 6536($t1) 51 | 0x000008B0: 0x8C640000 '..d.' - lw $a0, 0($v1) 52 | 0x000008B4: 0xACE30004 '....' - sw $v1, 4($a3) 53 | 0x000008B8: 0xACE40000 '....' - sw $a0, 0($a3) 54 | 0x000008BC: 0xAC870004 '....' - sw $a3, 4($a0) 55 | 0x000008C0: 0x13250004 '..%.' - beq $t9, $a1, loc_000008D4 56 | 0x000008C4: 0xAC670000 '..g.' - sw $a3, 0($v1) 57 | 58 | loc_000008C8: ; Refs: 0x000008E4 0x000008FC 59 | 0x000008C8: 0x00E01821 '!...' - move $v1, $a3 60 | 61 | loc_000008CC: ; Refs: 0x00000830 62 | 0x000008CC: 0x03E00008 '....' - jr $ra 63 | 0x000008D0: 0x00601021 '!.`.' - move $v0, $v1 64 | 65 | loc_000008D4: ; Refs: 0x000008C0 66 | 0x000008D4: 0x3C050001 '...<' - lui $a1, 0x1 67 | 0x000008D8: 0x8CA50214 '....' - lw $a1, 532($a1) 68 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 69 | 0x000008DC: 0xAD271988 '..'.' - sw $a3, 6536($t1) 70 | 0x000008E0: 0x00A82023 '# ..' - subu $a0, $a1, $t0 71 | 0x000008E4: 0x1880FFF8 '....' - blez $a0, loc_000008C8 72 | 0x000008E8: 0x3C030001 '...<' - lui $v1, 0x1 73 | 0x000008EC: 0x3C0A0001 '...<' - lui $t2, 0x1 74 | 0x000008F0: 0x8D4A020C '..J.' - lw $t2, 524($t2) 75 | 0x000008F4: 0xAC680214 '..h.' - sw $t0, 532($v1) 76 | 0x000008F8: 0x01444823 '#HD.' - subu $t1, $t2, $a0 77 | 0x000008FC: 0x08000232 '2...' - j loc_000008C8 78 | -------------------------------------------------------------------------------- /RootCounters/00095C.txt: -------------------------------------------------------------------------------- 1 | 2 | ; Subroutine sub_0000095C - Address 0x0000095C 3 | sub_0000095C: ; Refs: 0x00000694 0x0000B188 0x0000BBC8 0x0000BC9C 0x0000BE50 0x0000C1C8 0x0000C7F4 0x0000C850 0x0000C930 0x0000C9C8 0x00010ED8 0x00010F3C 0x00010F98 0x00011060 0x00011190 0x000111A0 0x00011304 0x000114E4 0x00011540 0x00011D18 0x000125E4 0x000125F4 0x00012844 0x00012A40 4 | 0x0000095C: 0x3C03000F '...<' - lui $v1, 0xF 5 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 6 | 0x00000960: 0x8C651988 '..e.' - lw $a1, 6536($v1) 7 | 0x00000964: 0x14A4001D '....' - bne $a1, $a0, loc_000009DC 8 | 0x00000968: 0xAC80000C '....' - sw $zr, 12($a0) 9 | 0x0000096C: 0x8C880000 '....' - lw $t0, 0($a0) 10 | 0x00000970: 0x3C040001 '...<' - lui $a0, 0x1 11 | 0x00000974: 0x8C840218 '....' - lw $a0, 536($a0) 12 | 0x00000978: 0x3C070001 '...<' - lui $a3, 0x1 13 | 14 | loc_0000097C: ; Refs: 0x0008A568 15 | 0x0000097C: 0x3C060204 '...<' - lui $a2, 0x204 16 | ; Data ref 0x000F1988 ... 0x00000000 0x00000000 0x00000000 0x00000000 17 | 0x00000980: 0xAC681988 '..h.' - sw $t0, 6536($v1) 18 | 0x00000984: 0x14800013 '....' - bnez $a0, loc_000009D4 19 | 0x00000988: 0x3C050001 '...<' - lui $a1, 0x1 20 | 0x0000098C: 0x3C0A0001 '...<' - lui $t2, 0x1 21 | 0x00000990: 0x8D4A020C '..J.' - lw $t2, 524($t2) 22 | 0x00000994: 0x3C020001 '...<' - lui $v0, 0x1 23 | 0x00000998: 0x8C420214 '..B.' - lw $v0, 532($v0) 24 | 0x0000099C: 0x8D09000C '....' - lw $t1, 12($t0) 25 | 0x000009A0: 0x34C6CC00 '...4' - ori $a2, $a2, 0xCC00 26 | 0x000009A4: 0x01421823 '#.B.' - subu $v1, $t2, $v0 27 | 0x000009A8: 0xACA00214 '....' - sw $zr, 532($a1) 28 | 0x000009AC: 0x11200003 '.. .' - beqz $t1, loc_000009BC 29 | 0x000009B0: 0xACA3020C '....' - sw $v1, 524($a1) 30 | 0x000009B4: 0x8D040008 '....' - lw $a0, 8($t0) 31 | 0x000009B8: 0x00833023 '#0..' - subu $a2, $a0, $v1 32 | 33 | loc_000009BC: ; Refs: 0x000009AC 34 | 0x000009BC: 0x3C050001 '...<' - lui $a1, 0x1 35 | 0x000009C0: 0x8CA5020C '....' - lw $a1, 524($a1) 36 | 0x000009C4: 0xACE60214 '....' - sw $a2, 532($a3) 37 | 0x000009C8: 0x00A61821 '!...' - addu $v1, $a1, $a2 38 | 0x000009CC: 0x03E00008 '....' - jr $ra 39 | 0x000009D0: 0xACE3020C '....' - sw $v1, 524($a3) 40 | 41 | loc_000009D4: ; Refs: 0x00000984 42 | 0x000009D4: 0x03E00008 '....' - jr $ra 43 | 0x000009D8: 0x00000000 '....' - nop 44 | 45 | loc_000009DC: ; Refs: 0x00000964 46 | 0x000009DC: 0x8C8B0004 '....' - lw $t3, 4($a0) 47 | 0x000009E0: 0x8C8C0000 '....' - lw $t4, 0($a0) 48 | 0x000009E4: 0xAD6C0000 '..l.' - sw $t4, 0($t3) 49 | 0x000009E8: 0x8C880000 '....' - lw $t0, 0($a0) 50 | 0x000009EC: 0xAD0B0004 '....' - sw $t3, 4($t0) 51 | 0x000009F0: 0x8CA60004 '....' - lw $a2, 4($a1) 52 | 0x000009F4: 0x8CC70000 '....' - lw $a3, 0($a2) 53 | 0x000009F8: 0xAC860004 '....' - sw $a2, 4($a0) 54 | 0x000009FC: 0xAC870000 '....' - sw $a3, 0($a0) 55 | 0x00000A00: 0xACE40004 '....' - sw $a0, 4($a3) 56 | 0x00000A04: 0x03E00008 '....' - jr $ra 57 | 0x00000A08: 0xACC40000 '....' - sw $a0, 0($a2) 58 | -------------------------------------------------------------------------------- /RootCounters/00BD64.txt: -------------------------------------------------------------------------------- 1 | // wtf? 2 | void sub_0000BD64 (void *reg_base) 3 | { 4 | u32 target = *(u32 *)(reg_base ); 5 | if ( target < 0 ) return; 6 | 7 | u32 count = RtcReadCount (reg_base); 8 | 9 | if ( *(u32 *)(reg_base + 12) ) 10 | { 11 | sub_0000095C (); 12 | *(u32 *)(reg_base + 12) = 0; 13 | } 14 | 15 | u32 mode = *(u16 *)(reg_base + 8); 16 | if ( mode & 0x38 ) return; 17 | 18 | if ( count > target ) 19 | { 20 | target += 0x10000; 21 | if ( mode & 0x20 ) target = 0x10000; 22 | } 23 | 24 | if ( (target & (target-1)) && (( *(u32 *)[000F1400] & 0x400 ) == 0) ) 25 | { 26 | int check = ( sub_0000AD5C () >> *(u8 *)(reg_base + 10) ) & 1; 27 | if ( check == 0) return; 28 | if ( (mode & 0x10) == 0 ) return; 29 | } 30 | 31 | *(u32 *)(reg_base + 12) = sub_0000081C ( 32 | (target - count) << *(u8 *)(reg_base + 11), 33 | (proc)0x0000BF34, reg_base, 0x00010000 ); 34 | } 35 | 36 | 37 | sub_0000BD64 (reg_base): 38 | v1 = *(u32 *)(reg_base ); 39 | s0 = reg_base 40 | if (v1 < 0) return 41 | v0 = RtcReadCount (reg_base); 42 | a0 = *(u32 *)(reg_base + 12); 43 | s1 = v0 44 | if (a0) 45 | { 46 | sub_0000095C () 47 | *(u32 *)(reg_base + 12) = 0 48 | } 49 | 50 | v1 = *(u16 *)(reg_base + 8) 51 | a0 = v1 & 0x38 52 | if (a0 == 0) return; 53 | s2 = *(u32 *)(reg_base ); 54 | a1 = s2 < s1 55 | t0 = 0x000F0000 56 | if (a1) 57 | { 58 | a2 = 0x00010000 59 | v0 = v1 & 0x20 60 | s2 = s2 + a2 61 | if (v0) s2 = a2 62 | } 63 | 64 | a3 = *(u32 *)[000F1400]; 65 | v1 = a3 & 0x400 66 | t2 = s2 - 1 67 | 68 | 69 | if ( (s2 & t2) == 0 && v1 == 0) 70 | { 71 | sub_0000AD5C (); 72 | t5 = *(u8 *)(reg_base + 10) 73 | t4 = v0 >> t5 74 | t3 = t4 & 1 75 | if (t3 == 0) return; 76 | t7 = *(u16 *)(reg_base + 8) 77 | t6 = t7 & 0x10 78 | if (t6 == 0) return; 79 | } 80 | 81 | t8 = *(u8 *)(reg_base + 11) 82 | t9 = s2 - s1 83 | s2 = 0x00010000 84 | a0 = t9 << t8 85 | a1 = 0x0000BF34 86 | *(u32 *)(reg_base + 12) = sub_0000081C ( t9 << t8, 0x0000BF34, reg_base ); 87 | 88 | ------------------------------------------------------------------------- 89 | 90 | 91 | sub_0000AD5C: ; Refs: 0x0000BE1C 92 | 0x0000AD5C: 0x3C050001 '...<' - lui $a1, 0x1 93 | 0x0000AD60: 0x8CA50130 '0...' - lw $a1, 304($a1) 94 | 0x0000AD64: 0x3C020001 '...<' - lui $v0, 0x1 95 | 0x0000AD68: 0x8C422074 't B.' - lw $v0, 8308($v0) 96 | 0x0000AD6C: 0x30A40001 '...0' - andi $a0, $a1, 0x1 97 | 0x0000AD70: 0x03E00008 '....' - jr $ra 98 | 0x0000AD74: 0x0004100A '....' - movz $v0, $zr, $a0 99 | 100 | ------------------------------------------------------------------------- 101 | 102 | 103 | 0x0000BF34: 0x27BDFFF0 '...'' - addiu $sp, $sp, -16 104 | 0x0000BF38: 0xAFB00000 '....' - sw $s0, 0($sp) 105 | 0x0000BF3C: 0x00808021 '!...' - move $s0, $a0 106 | 0x0000BF40: 0xAFBF0004 '....' - sw $ra, 4($sp) 107 | 0x0000BF44: 0x94850008 '....' - lhu $a1, 8($a0) 108 | 0x0000BF48: 0x30A3FFFF '...0' - andi $v1, $a1, 0xFFFF 109 | 0x0000BF4C: 0x30640030 '0.d0' - andi $a0, $v1, 0x30 110 | 0x0000BF50: 0x1080000C '....' - beqz $a0, loc_0000BF84 111 | 0x0000BF54: 0x30A4FFFF '...0' - andi $a0, $a1, 0xFFFF 112 | 0x0000BF58: 0x30640080 '..d0' - andi $a0, $v1, 0x80 113 | 0x0000BF5C: 0x10800004 '....' - beqz $a0, loc_0000BF70 114 | 0x0000BF60: 0x24020400 '...$' - li $v0, 1024 115 | 0x0000BF64: 0x38A30400 '...8' - xori $v1, $a1, 0x400 116 | 0x0000BF68: 0xA6030008 '....' - sh $v1, 8($s0) 117 | 0x0000BF6C: 0x3062FFFF '..b0' - andi $v0, $v1, 0xFFFF 118 | 119 | loc_0000BF70: ; Refs: 0x0000BF5C 120 | 0x0000BF70: 0x30450400 '..E0' - andi $a1, $v0, 0x400 121 | 0x0000BF74: 0x14A00018 '....' - bnez $a1, loc_0000BFD8 122 | 0x0000BF78: 0x00000000 '....' - nop 123 | 0x0000BF7C: 0x96050008 '....' - lhu $a1, 8($s0) 124 | 125 | loc_0000BF80: ; Refs: 0x0000BFF8 126 | 0x0000BF80: 0x30A4FFFF '...0' - andi $a0, $a1, 0xFFFF 127 | 128 | loc_0000BF84: ; Refs: 0x0000BF50 0x0000BFE8 129 | 0x0000BF84: 0x30880008 '...0' - andi $t0, $a0, 0x8 130 | 0x0000BF88: 0x11000007 '....' - beqz $t0, loc_0000BFA8 131 | 0x0000BF8C: 0x308B0040 '@..0' - andi $t3, $a0, 0x40 132 | 0x0000BF90: 0x3C020001 '...<' - lui $v0, 0x1 133 | 0x0000BF94: 0x8C42020C '..B.' - lw $v0, 524($v0) 134 | 0x0000BF98: 0x3C0A0001 '...<' - lui $t2, 0x1 135 | 0x0000BF9C: 0x8D4A0214 '..J.' - lw $t2, 532($t2) 136 | 0x0000BFA0: 0x004A4823 '#HJ.' - subu $t1, $v0, $t2 137 | 0x0000BFA4: 0xAE090004 '....' - sw $t1, 4($s0) 138 | 139 | loc_0000BFA8: ; Refs: 0x0000BF88 140 | 0x0000BFA8: 0x55600005 '..`U' - bnezl $t3, loc_0000BFC0 141 | 0x0000BFAC: 0xAE00000C '....' - sw $zr, 12($s0) 142 | 0x0000BFB0: 0x00A06021 '!`..' - move $t4, $a1 143 | 0x0000BFB4: 0x7C0C2904 '.).|' - ins $t4, $zr, 4, 2 144 | 0x0000BFB8: 0xA60C0008 '....' - sh $t4, 8($s0) 145 | 0x0000BFBC: 0xAE00000C '....' - sw $zr, 12($s0) 146 | 147 | loc_0000BFC0: ; Refs: 0x0000BFA8 148 | 0x0000BFC0: 0x0C002F59 'Y/..' - jal sub_0000BD64 149 | 0x0000BFC4: 0x02002021 '! ..' - move $a0, $s0 150 | 0x0000BFC8: 0x8FBF0004 '....' - lw $ra, 4($sp) 151 | 0x0000BFCC: 0x8FB00000 '....' - lw $s0, 0($sp) 152 | 0x0000BFD0: 0x03E00008 '....' - jr $ra 153 | 0x0000BFD4: 0x27BD0010 '...'' - addiu $sp, $sp, 16 154 | 155 | loc_0000BFD8: ; Refs: 0x0000BF74 156 | 0x0000BFD8: 0x0C002B5E '^+..' - jal sub_0000AD78 157 | 0x0000BFDC: 0x9204000A '....' - lbu $a0, 10($s0) 158 | 0x0000BFE0: 0x96050008 '....' - lhu $a1, 8($s0) 159 | 0x0000BFE4: 0x30A60010 '...0' - andi $a2, $a1, 0x10 160 | 0x0000BFE8: 0x10C0FFE6 '....' - beqz $a2, loc_0000BF84 161 | 0x0000BFEC: 0x30A4FFFF '...0' - andi $a0, $a1, 0xFFFF 162 | 0x0000BFF0: 0x34A70800 '...4' - ori $a3, $a1, 0x800 163 | 0x0000BFF4: 0x00E02821 '!(..' - move $a1, $a3 164 | 0x0000BFF8: 0x08002FE0 './..' - j loc_0000BF80 165 | 0x0000BFFC: 0xA6070008 '....' - sh $a3, 8($s0) 166 | -------------------------------------------------------------------------------- /RootCounters/17d5c.txt: -------------------------------------------------------------------------------- 1 | 2 | ; Subroutine sub_00017D5C - Address 0x00017D5C 3 | sub_00017D5C: ; Refs: 0x0000C224 0x0000C24C 4 | 0x00017D5C: 0x3C040021 '!..<' - lui $a0, 0x21 5 | ; Data ref 0x002092FD ... 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 6 | 0x00017D60: 0x908392FD '....' - lbu $v1, -27907($a0) 7 | 0x00017D64: 0x03E00008 '....' - jr $ra 8 | 0x00017D68: 0x30620001 '..b0' - andi $v0, $v1, 0x1 9 | 10 | 11 | return *(u8 *)[0x002092FD] & 1; -------------------------------------------------------------------------------- /RootCounters/Pops_BF00_RtcInit.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/RootCounters/Pops_BF00_RtcInit.txt -------------------------------------------------------------------------------- /RootCounters/Pops_C000_RtcReadCount.txt: -------------------------------------------------------------------------------- 1 | 2 | // sub_0000C000 3 | u32 RtcReadCount (void *reg_base) 4 | { 5 | u32 count = *(u32 *)[0x0001020C] - *(u32 *)[0x00010214] - *(u32 *)(reg_base + 4) 6 | u32 target = *(u32 *)(reg_base ) // Target 7 | 8 | if ( target < 0 ) return *(u32 *)(reg_base + 4); 9 | 10 | div = *(u8 *)(reg_base + 11) 11 | count = count >> div 12 | if ( target > count ) return count & 0xffff; 13 | 14 | if ( count > 0xffff ) 15 | { 16 | *(u16 *)(reg_base + 8) |= 0x1000; 17 | count = count & 0xffff; 18 | } 19 | 20 | if ( *(u16 *)(reg_base + 8) & 8 ) // Tar:1 - Count to value in target register 21 | { 22 | count = count % target; 23 | } 24 | 25 | *(u32 *)(reg_base + 4) = *(u32 *)[0x0001020C] - *(u32 *)[0x00010214] - (count << div); 26 | return count & 0xffff; 27 | } 28 | 29 | t0 = 0x00010000 30 | t0 = [0x00010214] 31 | t1 = 0x00010000 32 | t1 = [0x0001020C] 33 | a1 = *(u32 *)(reg_base + 4) 34 | a2 = *(u32 *)(reg_base ) // Target 35 | a3 = t1 - t0 36 | v0 = a1 37 | t0 = a3 - a1 38 | if ( a2 < 0 ) return 39 | 40 | a1 = *(u8 *)(reg_base + 11) 41 | v0 = 0xffff 42 | t0 = t0 >> a1 43 | t2 = t0 < a2 44 | v1 = t0 > 0xffff 45 | if (t2 == 0) goto C04C 46 | 47 | C040 48 | v0 = t0 & 0xFFFF 49 | 50 | C044 51 | return 52 | 53 | C04C 54 | 55 | 56 | 57 | sub_0000C000: ; Refs: 0x0000BC5C 0x0000BCAC 0x0000BD84 0x0000C0CC 0x000CFD6C 0x000D1FB0 58 | 0x0000C000: 0x3C080001 '...<' - lui $t0, 0x1 59 | 0x0000C004: 0x8D080214 '....' - lw $t0, 532($t0) 60 | 0x0000C008: 0x3C090001 '...<' - lui $t1, 0x1 61 | 0x0000C00C: 0x8D29020C '..).' - lw $t1, 524($t1) 62 | 0x0000C010: 0x8C850004 '....' - lw $a1, 4($a0) 63 | 0x0000C014: 0x8C860000 '....' - lw $a2, 0($a0) 64 | 0x0000C018: 0x01283823 '#8(.' - subu $a3, $t1, $t0 65 | 0x0000C01C: 0x00A01021 '!...' - move $v0, $a1 66 | 0x0000C020: 0x04C00008 '....' - bltz $a2, loc_0000C044 67 | 0x0000C024: 0x00E54023 '#@..' - subu $t0, $a3, $a1 68 | 69 | 0x0000C028: 0x9085000B '....' - lbu $a1, 11($a0) 70 | 0x0000C02C: 0x3402FFFF '...4' - li $v0, 0xFFFF 71 | 0x0000C030: 0x00A84006 '.@..' - srlv $t0, $t0, $a1 72 | 0x0000C034: 0x0106502B '+P..' - sltu $t2, $t0, $a2 73 | 0x0000C038: 0x11400004 '..@.' - beqz $t2, loc_0000C04C 74 | 0x0000C03C: 0x0048182B '+.H.' - sltu $v1, $v0, $t0 75 | 76 | loc_0000C040: ; Refs: 0x0000C084 77 | 0x0000C040: 0x3102FFFF '...1' - andi $v0, $t0, 0xFFFF 78 | 79 | loc_0000C044: ; Refs: 0x0000C020 80 | 0x0000C044: 0x03E00008 '....' - jr $ra 81 | 0x0000C048: 0x00000000 '....' - nop 82 | 83 | loc_0000C04C: ; Refs: 0x0000C038 84 | t5 = *(u16 *)(reg_base + 8) 85 | if ( v1 == 0) goto c068; 86 | t0 = t0 & 0xFFFF 87 | mode |= 0x1000 88 | t5 = mode 89 | 90 | 0x0000C04C: 0x50600006 '..`P' - beqzl $v1, loc_0000C068 91 | 0x0000C050: 0x948D0008 '....' - lhu $t5, 8($a0) 92 | 0x0000C054: 0x948B0008 '....' - lhu $t3, 8($a0) 93 | 0x0000C058: 0x3108FFFF '...1' - andi $t0, $t0, 0xFFFF 94 | 0x0000C05C: 0x35631000 '..c5' - ori $v1, $t3, 0x1000 95 | 0x0000C060: 0xA4830008 '....' - sh $v1, 8($a0) 96 | 0x0000C064: 0x948D0008 '....' - lhu $t5, 8($a0) 97 | 98 | loc_0000C068: ; Refs: 0x0000C04C 99 | t4 = mode & 8 100 | t6 = t0 << a1 101 | if (t4) 102 | t0 = t0 % a2 103 | t6 = t0 << a1 104 | 105 | loc_0000C080: ; Refs: 0x0000C06C 106 | a2 = a3 - t6 107 | *(u32 *)(reg_base + 4) = a2 108 | return; 109 | -------------------------------------------------------------------------------- /RootCounters/Pops_RtcRead.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/RootCounters/Pops_RtcRead.txt -------------------------------------------------------------------------------- /RootCounters/RtcWrite.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/RootCounters/RtcWrite.txt -------------------------------------------------------------------------------- /imgstore/whc4e032dbd75870.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/imgstore/whc4e032dbd75870.jpg -------------------------------------------------------------------------------- /imgstore/whc51a31241062f2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/imgstore/whc51a31241062f2.png -------------------------------------------------------------------------------- /imgstore/whc51a3124a21d97.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogamespec/pops-gte/dcd8f755f6ff37793afa4e2b110138e7a10e09a7/imgstore/whc51a3124a21d97.jpg --------------------------------------------------------------------------------