gametitle=Road Trip (NTSC-U) (SLUS-20398) [Widescreen 16:9] gsaspectratio=16:9 author=Souzooka description=16:9 3D with 16:9-optimized UI // 3D aspect ratio patch=0,EE,2021F798,extended,3C013F40 // lui $at, 0x3F40 // Fix culling of 3D environment mesh subdivisions on sides of screen // Also fixes the camera being able to slightly go through objects after changing 3D aspect patch=0,EE,2021F550,extended,0 // Removes a branch to PAL logic patch=0,EE,2021F558,extended,3C013F40 // lui $at, 0x3F40 patch=0,EE,2021F55C,extended,4481B800 // mtc1 $at, $f23 patch=0,EE,2021F560,extended,4617A082 // mul.s $f2, $f20, $f23 patch=0,EE,2021F564,extended,C6010008 // lwc1 $f1, 0x8($s0) patch=0,EE,2021F568,extended,46010002 // mul.s $f0, $f0, $f1 patch=0,EE,2021F56C,extended,0 // nop patch=0,EE,2021F570,extended,0 // nop patch=0,EE,2021F574,extended,46020003 // div.s $f0, $f0, $f2 patch=0,EE,2021F578,extended,0 // nop patch=0,EE,2021F57C,extended,0 // nop patch=0,EE,2021F580,extended,0 // nop patch=0,EE,2021F584,extended,0 // nop patch=0,EE,2021F588,extended,0 // nop patch=0,EE,2021F58C,extended,E7A00050 // swc1 $f0, 0x50($sp) // Various UI Scaling Functions // Function 1 // Known to affect the middle portion of the minimap border/transparent overlay patch=0,EE,20206160,extended,0 // nop patch=0,EE,2020616C,extended,22900 // sll a1,v0,0x04 patch=0,EE,20206170,extended,20880 // sll at,v0,0x02 patch=0,EE,20206174,extended,A11023 // subu v0,a1,at patch=0,EE,20206178,extended,32900 // sll a1,v1,0x04 patch=0,EE,2020617C,extended,30880 // sll at,v1,0x02 patch=0,EE,20206180,extended,A12823 // subu a1,a1,at patch=0,EE,20206184,extended,718C0 // sll v1,a3,0x03 patch=0,EE,20206188,extended,EF3021 // addu a2,a3,t7 patch=0,EE,2020618C,extended,630C0 // sll a2,a2,0x03 patch=0,EE,20206190,extended,24637900 // addiu v1,v1,0x7900 patch=0,EE,20206194,extended,24C67900 // addiu a2,a2,0x7900 patch=0,EE,20206198,extended,24A56C00 // addiu a1,a1,0x6C00 patch=0,EE,2020619C,extended,24426C00 // addiu v0,v0,0x6C00 patch=0,EE,202061A0,extended,A5250000 // sh a1,0x0(t1) patch=0,EE,202061A4,extended,A5420000 // sh v0,0x0(t2) patch=0,EE,202061A8,extended,A5230002 // sh v1,0x2(t1) patch=0,EE,202061AC,extended,A5460002 // sh a2,0x2(t2) patch=0,EE,202061B0,extended,0 // nop patch=0,EE,202061B4,extended,0 // nop patch=0,EE,202061B8,extended,0 // nop patch=0,EE,202061BC,extended,10000010 // beq zero,zero,0x00206200 patch=0,EE,202061C0,extended,0 // nop // Function 2 // Known to affect most UI -- speedometer, minimap left/right borders, chat windows, // pause menus, etc. patch=0,EE,202064DC,extended,0 // nop patch=0,EE,202064E4,extended,25890040 // addiu t1,t4,0x40 patch=0,EE,202064E8,extended,6D1021 // addu v0,v1,t5 patch=0,EE,202064EC,extended,22900 // sll a1,v0,0x04 patch=0,EE,202064F0,extended,20880 // sll at,v0,0x02 patch=0,EE,202064F4,extended,A11023 // subu v0,a1,at patch=0,EE,202064F8,extended,32900 // sll a1,v1,0x04 patch=0,EE,202064FC,extended,30880 // sll at,v1,0x02 patch=0,EE,20206500,extended,A12823 // subu a1,a1,at patch=0,EE,20206504,extended,718C0 // sll v1,a3,0x03 patch=0,EE,20206508,extended,EE3021 // addu a2,a3,t6 patch=0,EE,2020650C,extended,630C0 // sll a2,a2,0x03 patch=0,EE,20206510,extended,24637900 // addiu v1,v1,0x7900 patch=0,EE,20206514,extended,24C67900 // addiu a2,a2,0x7900 patch=0,EE,20206518,extended,24A56C00 // addiu a1,a1,0x6C00 patch=0,EE,2020651C,extended,24426C00 // addiu v0,v0,0x6C00 patch=0,EE,20206520,extended,A5050000 // sh a1,0x0(t0) patch=0,EE,20206524,extended,A5220000 // sh v0,0x0(t1) patch=0,EE,20206528,extended,A5030002 // sh v1,0x2(t0) patch=0,EE,2020652C,extended,A5260002 // sh a2,0x2(t1) patch=0,EE,20206530,extended,0 // nop patch=0,EE,20206534,extended,0 // nop patch=0,EE,20206538,extended,0 // nop patch=0,EE,2020653C,extended,1000000F // beq zero,zero,0x2020657C patch=0,EE,20206540,extended,0 // nop // Function 3 // Known to affect quick-pic photos, the small trophies in My Garage patch=0,EE,20206764,extended,25A90040 // addiu t1,t5,0x40 patch=0,EE,20206768,extended,6E1021 // addu v0,v1,t6 patch=0,EE,2020676C,extended,30880 // sll at,v1,0x02 patch=0,EE,20206770,extended,31900 // sll v1,v1,0x04 patch=0,EE,20206774,extended,611823 // subu v1,v1,at patch=0,EE,20206778,extended,20880 // sll at,v0,0x02 patch=0,EE,2020677C,extended,21100 // sll v0,v0,0x04 patch=0,EE,20206780,extended,411023 // subu v0,v0,at patch=0,EE,20206784,extended,EF3021 // addu a2,a3,t7 patch=0,EE,20206788,extended,738C0 // sll a3,a3,0x03 patch=0,EE,2020678C,extended,000630C0 // sll a2,a2,0x03 patch=0,EE,20206790,extended,24636C00 // addiu v1,v1,0x6C00 patch=0,EE,20206794,extended,24426C00 // addiu v0,v0,0x6C00 patch=0,EE,20206798,extended,24E77900 // addiu a3,a3,0x7900 patch=0,EE,2020679C,extended,24C67900 // addiu a2,a2,0x7900 patch=0,EE,202067A0,extended,A5030000 // sh v1,0x0(t0) patch=0,EE,202067A4,extended,A5220000 // sh v0,0x0(t1) patch=0,EE,202067A8,extended,A5070002 // sh a3,0x2(t0) patch=0,EE,202067AC,extended,10000014 // beq zero,zero,0x00206800 patch=0,EE,202067B0,extended,A5260002 // sh a2,0x2(t1) // Function 4 // Affects the color bar widths in paint shop, the text for part names in shops I believe patch=0,EE,202075F0,extended,1064021 // addu t0,t0,a2 patch=0,EE,202075F4,extended,61100 // sll v0,a2,0x04 patch=0,EE,202075F8,extended,60880 // sll at,a2,0x02 patch=0,EE,202075FC,extended,413023 // subu a2,v0,at patch=0,EE,20207600,extended,81100 // sll v0,t0,0x04 patch=0,EE,20207604,extended,80880 // sll at,t0,0x02 patch=0,EE,20207608,extended,414023 // subu t0,v0,at patch=0,EE,2020760C,extended,1274821 // addu t1,t1,a3 patch=0,EE,20207610,extended,738C0 // sll a3,a3,0x03 patch=0,EE,20207614,extended,948C0 // sll t1,t1,0x03 patch=0,EE,20207618,extended,24C66C00 // addiu a2,a2,0x6C00 patch=0,EE,2020761C,extended,25086C00 // addiu t0,t0,0x6C00 patch=0,EE,20207620,extended,24E77900 // addiu a3,a3,0x7900 patch=0,EE,20207624,extended,25297900 // addiu t1,t1,0x7900 patch=0,EE,20207628,extended,A4860000 // sh a2,0x0(a0) patch=0,EE,2020762C,extended,A4A80000 // sh t0,0x0(a1) patch=0,EE,20207630,extended,A4870002 // sh a3,0x2(a0) patch=0,EE,20207634,extended,3E00008 // jr ra patch=0,EE,20207638,extended,A4A90002 // sh t1,0x2(a1) // Function 5 // Affects the scale of the paint spray effect in the paint shop patch=0,EE,202079A8,extended,52940 // sll a1,a1,0x05 patch=0,EE,202079AC,extended,852021 // addu a0,a0,a1 patch=0,EE,202079B0,extended,60880 // sll at,a2,0x02 patch=0,EE,202079B4,extended,63100 // sll a2,a2,0x04 patch=0,EE,202079B8,extended,C13023 // subu a2,a2,at patch=0,EE,202079BC,extended,738C0 // sll a3,a3,0x03 patch=0,EE,202079C0,extended,24C66C00 // addiu a2,a2,0x6C00 patch=0,EE,202079C4,extended,24E77900 // addiu a3,a3,0x7900 patch=0,EE,202079C8,extended,AC860030 // sw a2,0x30(a0) patch=0,EE,202079CC,extended,AC870034 // sw a3,0x34(a0) patch=0,EE,202079D0,extended,AC880038 // sw t0,0x38(a0) patch=0,EE,202079D4,extended,3E00008 // jr ra patch=0,EE,202079D8,extended,AC80003C // sw zero,0x3C(a0) // Function 6 // Affects the BG for part windows in the shop, BGs for courses in course select // in particular this calculates the four points of the rectangular BG // This also rolls up an unrolled loop so it leaves a lot of blank space afterwards patch=0,EE,20244200,extended,24840010 // addiu a0,a0,0x10 patch=0,EE,20244204,extended,54400 // sll t0,a1,0x10 patch=0,EE,20244208,extended,84403 // sra t0,t0,0x10 patch=0,EE,2024420C,extended,55403 // sra t2,a1,0x10 patch=0,EE,20244210,extended,5483F // dsra32 t1,a1,0x00 patch=0,EE,20244214,extended,94C00 // sll t1,t1,0x10 patch=0,EE,20244218,extended,94C03 // sra t1,t1,0x10 patch=0,EE,2024421C,extended,55C3F // dsra32 t3,a1,0x10 patch=0,EE,20244220,extended,80880 // sll at,t0,0x02 patch=0,EE,20244224,extended,84100 // sll t0,t0,0x04 patch=0,EE,20244228,extended,1014023 // subu t0,t0,at patch=0,EE,2024422C,extended,A0880 // sll at,t2,0x02 patch=0,EE,20244230,extended,A5100 // sll t2,t2,0x04 patch=0,EE,20244234,extended,1415023 // subu t2,t2,at patch=0,EE,20244238,extended,25086BF8 // addiu t0,t0,0x6BF8 patch=0,EE,2024423C,extended,254A6BF8 // addiu t2,t2,0x6BF8 patch=0,EE,20244240,extended,948C0 // sll t1,t1,0x03 patch=0,EE,20244244,extended,B58C0 // sll t3,t3,0x03 patch=0,EE,20244248,extended,252978F8 // addiu t1,t1,0x78F8 patch=0,EE,2024424C,extended,256B78F8 // addiu t3,t3,0x78F8 patch=0,EE,20244250,extended,63900 // sll a3,a2,0x04 patch=0,EE,20244254,extended,7821 // addu t7,zero,zero patch=0,EE,20244258,extended,24180004 // addiu t8,zero,0x4 patch=0,EE,2024425C,extended,31ED0001 // andi t5,t7,0x0001 patch=0,EE,20244260,extended,31EE0002 // andi t6,t7,0x0002 patch=0,EE,20244264,extended,1002821 // addu a1,t0,zero patch=0,EE,20244268,extended,1203021 // addu a2,t1,zero patch=0,EE,2024426C,extended,14D280B // movn a1,t2,t5 patch=0,EE,20244270,extended,16E300B // movn a2,t3,t6 patch=0,EE,20244274,extended,AC850020 // sw a1,0x20(a0) patch=0,EE,20244278,extended,AC860024 // sw a2,0x24(a0) patch=0,EE,2024427C,extended,AC870028 // sw a3,0x28(a0) patch=0,EE,20244280,extended,25EF0001 // addiu t7,t7,0x1 patch=0,EE,20244284,extended,15F8FFF5 // bne t7,t8,0x0024425C patch=0,EE,20244288,extended,24840030 // addiu a0,a0,0x30 patch=0,EE,2024428C,extended,3E00008 // jr ra patch=0,EE,20244290,extended,0 // nop // After function 6's correction we'll have to write some more custom code to correct the parts wheel in shops/map wheel in quick race patch=0,EE,20246D54,extended,3C014320 // lui at,0x4320 // h. scale of parts wheel patch=0,EE,20246D94,extended,245E0112 // addiu fp,v0,0x112 // h. position of parts wheel // And then this assembly corrects the positioning of 3D models for parts in the part select patch=0,EE,20246FB4,extended,E7A00048 // swc1 f00,0x48(sp) patch=0,EE,20246FB8,extended,1E2083 // sra a0,fp,0x02 patch=0,EE,20246FBC,extended,3C42023 // subu a0,fp,a0 patch=0,EE,20246FC0,extended,1317C2 // srl v0,s3,0x1F patch=0,EE,20246FC4,extended,2621021 // addu v0,s3,v0 patch=0,EE,20246FC8,extended,21043 // sra v0,v0,0x01 patch=0,EE,20246FCC,extended,2E21021 // addu v0,s7,v0 patch=0,EE,20246FD0,extended,21FC2 // srl v1,v0,0x1F patch=0,EE,20246FD4,extended,431021 // addu v0,v0,v1 patch=0,EE,20246FD8,extended,00021043 // sra v0,v0,0x01 patch=0,EE,20246FDC,extended,2442078C // addiu v0,v0,0x78C patch=0,EE,20246FE0,extended,44826800 // mtc1 v0,f13 patch=0,EE,20246FE4,extended,0 // nop patch=0,EE,20246FE8,extended,46806B60 // cvt.s.w f13,f13 patch=0,EE,20246FEC,extended,248406C0 // addiu a0,a0,0x6C0 patch=0,EE,20246FF0,extended,44846000 // mtc1 a0,f12 patch=0,EE,20246FF4,extended,C087E44 // jal 0x21f910 patch=0,EE,20246FF8,extended,46806320 // cvt.s.w f12,f12 patch=0,EE,20246FFC,extended,1000001A // beq zero,zero,0x00247068 patch=0,EE,20247000,extended,0 // nop // Changes to fix up the map select wheel for quick race patch=0,EE,20245BFC,extended,3C0143A0 // lui at,0x43A0 // h.scale of map wheel patch=0,EE,20245C18,extended,245201AB // addiu s2,v0,0x1AB // h. pos of map wheel patch=0,EE,20245D68,extended,240401AB // addiu a0,zero,0x1AB // h. position of map window after choice patch=0,EE,20245D98,extended,2451010B // addiu s1,v0,0x10B // h. position of map window before choice patch=0,EE,20245DA8,extended,2411010B // addiu s1,zero,0x10B // h. position of map window before choice patch=0,EE,20245DB8,extended,241101AB // addiu s1,zero,0x1AB // h. position of map window after choice // Fix 3D map clips patch=0,EE,20244A80,extended,100802D // daddu s0,t0,zero patch=0,EE,20244A84,extended,30A3FFFF // andi v1,a1,0xFFFF patch=0,EE,20244A88,extended,AD2824 // and a1,a1,t5 patch=0,EE,20244A8C,extended,30883 // sra at,v1,0x02 patch=0,EE,20244A90,extended,611823 // subu v1,v1,at patch=0,EE,20244A94,extended,3063FFFF // andi v1,v1,0xFFFF patch=0,EE,20244A98,extended,A32825 // or a1,a1,v1 patch=0,EE,20244A9C,extended,5103C // dsll32 v0,a1,0x00 patch=0,EE,20244AA0,extended,2103F // dsra32 v0,v0,0x00 patch=0,EE,20244AA4,extended,AC2824 // and a1,a1,t4 patch=0,EE,20244AA8,extended,21403 // sra v0,v0,0x10 patch=0,EE,20244AAC,extended,20883 // sra at,v0,0x02 patch=0,EE,20244AB0,extended,411023 // subu v0,v0,at patch=0,EE,20244AB4,extended,3042FFFF // andi v0,v0,0xFFFF patch=0,EE,20244AB8,extended,21438 // dsll v0,v0,0x10 patch=0,EE,20244ABC,extended,10000008 // beq zero,zero,0x00244AE0 patch=0,EE,20244AC0,extended,A22825 // or a1,a1,v0 // Fix 3D map camera patch=0,EE,20244C68,extended,122083 // sra a0,s2,0x02 patch=0,EE,20244C6C,extended,2442023 // subu a0,s2,a0 patch=0,EE,20244C70,extended,1117C2 // srl v0,s1,0x1F patch=0,EE,20244C74,extended,2221021 // addu v0,s1,v0 patch=0,EE,20244C78,extended,21043 // sra v0,v0,0x01 patch=0,EE,20244C7C,extended,2621021 // addu v0,s3,v0 patch=0,EE,20244C80,extended,21FC2 // srl v1,v0,0x1F patch=0,EE,20244C84,extended,431021 // addu v0,v0,v1 patch=0,EE,20244C88,extended,21043 // sra v0,v0,0x01 patch=0,EE,20244C8C,extended,24420790 // addiu v0,v0,0x790 patch=0,EE,20244C90,extended,44826800 // mtc1 v0,f13 patch=0,EE,20244C94,extended,0 // nop patch=0,EE,20244C98,extended,46806B60 // cvt.s.w f13,f13 patch=0,EE,20244C9C,extended,248406C0 // addiu a0,a0,0x6C0 patch=0,EE,20244CA0,extended,44846000 // mtc1 a0,f12 patch=0,EE,20244CA4,extended,C087E44 // jal 0x21f910 patch=0,EE,20244CA8,extended,46806320 // cvt.s.w f12,f12 patch=0,EE,20244CAC,extended,1000001B // beq zero,zero,0x00244D1C patch=0,EE,20244CB0,extended,0 // nop // Function 7 // Corrects scale of speedometer needle/gas gauge (normal meter), some other random UI patch=0,EE,2024ED34,extended,24E70600 // addiu a3,a3,0x600 // Adjusts x position of UI patch=0,EE,2024ED64,extended,C09CB56 // jal 0x272D58 // Jump to sceVu0CameraMatrix (unused) where we'll write some scaling code patch=0,EE,20272D58,extended,3C013F40 // lui at,0x3F40 patch=0,EE,20272D5C,extended,44815000 // mtc1 at,f10 patch=0,EE,20272D60,extended,C7AB0000 // lwc1 f11,0x0(sp) patch=0,EE,20272D64,extended,460A5AC2 // mul.s f11,f11,f10 patch=0,EE,20272D68,extended,E7AB0000 // swc1 f11,0x0(sp) patch=0,EE,20272D6C,extended,C7AB0010 // lwc1 f11,0x10(sp) patch=0,EE,20272D70,extended,460A5AC2 // mul.s f11,f11,f10 patch=0,EE,20272D74,extended,E7AB0010 // swc1 f11,0x10(sp) patch=0,EE,20272D78,extended,C7AB0020 // lwc1 f11,0x20(sp) patch=0,EE,20272D7C,extended,460A5AC2 // mul.s f11,f11,f10 patch=0,EE,20272D80,extended,3E00008 // jr ra patch=0,EE,20272D84,extended,E7AB0020 // swc1 f11,0x20(sp) // Function 8 // Corrects position of the button indicator in controls settings patch=0,EE,20207AB8,extended,50900 // sll at,a1,0x04 patch=0,EE,20207ABC,extended,52880 // sll a1,a1,0x02 patch=0,EE,20207AC0,extended,252823 // subu a1,at,a1 patch=0,EE,20207AC4,extended,24A56C00 // addiu a1,a1,0x6C00 patch=0,EE,20207AC8,extended,24C67900 // addiu a2,a2,0x7900 patch=0,EE,20207ACC,extended,AC800004 // sw zero,0x4(a0) patch=0,EE,20207AD0,extended,73827 // nor a3,zero,a3 patch=0,EE,20207AD4,extended,A4850010 // sh a1,0x10(a0) patch=0,EE,20207AD8,extended,1000000B // beq zero,zero,0x00207B08 patch=0,EE,20207ADC,extended,A4860012 // sh a2,0x12(a0) // At this point for the most part UI should be aspect corrected, but all left-aligned and using up a 4:3 space // So the positions of all UI elements will have to be changed // In general, approximately 0x6B units needs to be added to center-aligned elements, while 0xD6 needs to be added to right-aligned elements // Speedometers patch=0,EE,202A8FF0,extended,2B9 // Normal Meter h. pos patch=0,EE,202A8FF8,extended,2B9 // Normal Meter h. pos (2 player) patch=0,EE,202A9000,extended,2B9 // Normal Meter h. pos (2 player) patch=0,EE,202A9038,extended,2BA // Chronometer h. pos patch=0,EE,202A9040,extended,2BA // Chronometer h. pos (2 player) patch=0,EE,202A9048,extended,2BA // Chronometer h. pos (2 player) patch=0,EE,2024A3E0,extended,2402002F // addiu v0,zero,0x2F // Correct gas meter needle position for Chronometer patch=0,EE,202A9060,extended,2AF // Rainbow Meter h. pos patch=0,EE,202A9068,extended,2AF // Rainbow Meter h. pos (2 player) patch=0,EE,202A9070,extended,2AF // Rainbow Meter h. pos (2 player) patch=0,EE,202A9218,extended,2C1 // Space Meter h. pos patch=0,EE,202A9220,extended,2C1 // Space Meter h. pos (2 player) patch=0,EE,202A9228,extended,2C1 // Space Meter h. pos (2 player) patch=0,EE,202A9260,extended,27D // Triangle Meter h. pos patch=0,EE,202A9268,extended,27D // Triangle Meter h. pos (2 player) patch=0,EE,202A9270,extended,27D // Triangle Meter h. pos (2 player) patch=0,EE,202A9478,extended,2AD // Love Sick Meter h. pos patch=0,EE,202A9480,extended,2AD // Love Sick Meter h. pos (2 player) patch=0,EE,202A9488,extended,2AD // Love Sick Meter h. pos (2 player) patch=0,EE,202A9778,extended,29D // Cherry Meter h. pos patch=0,EE,202A9780,extended,29D // Cherry Meter h. pos (2 player) patch=0,EE,202A9788,extended,29D // Cherry Meter h. pos (2 player) patch=0,EE,202A9850,extended,28E // Duck Meter h. pos patch=0,EE,202A9858,extended,28E // Duck Meter h. pos (2 player) patch=0,EE,202A9860,extended,28E // Duck Meter h. pos (2 player) patch=0,EE,202A9AB8,extended,2AB // Devil Meter h. pos patch=0,EE,202A9AC0,extended,2AB // Devil Meter h. pos (2 player) patch=0,EE,202A9AC8,extended,2AB // Devil Meter h. pos (2 player) patch=0,EE,202A9AF0,extended,2C2 // Digital Meter h. pos patch=0,EE,202A9AF8,extended,2C2 // Digital Meter h. pos (2 player) patch=0,EE,202A9B00,extended,2C2 // Digital Meter h. pos (2 player) // Most text patch=0,EE,2020433C,extended,24480075 // addiu t0,v0,0x75 // Chat textbox patch=0,EE,2020295C,extended,2405008A // addiu a1,zero,0x8A // Chat box left border patch=0,EE,202029A8,extended,2405008A // addiu a1,zero,0x8A // Chat box left border patch=0,EE,202029F0,extended,240500B2 // addiu a1,zero,0xB2 // Chat box middle patch=0,EE,20202A48,extended,240500B2 // addiu a1,zero,0xB2 // Chat box middle patch=0,EE,20202AA4,extended,240502A2 // addiu a1,zero,0x2A2 // Chat box right border patch=0,EE,20202ADC,extended,240502A2 // addiu a1,zero,0x2A2 // Chat box right border patch=0,EE,20202B24,extended,2405019A // addiu a1,zero,0x19A // Little circle at bottom of chat box where arrow goes patch=0,EE,2023B4C8,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box patch=0,EE,2023B67C,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box patch=0,EE,2023B734,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box patch=0,EE,2023B7A4,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box patch=0,EE,2023B8A4,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box patch=0,EE,2023B8F4,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box patch=0,EE,2023B944,extended,240401A1 // addiu a0,zero,0x1A1 // Arrow at bottom of chat box (these are all branch delay slots for the same function call) patch=0,EE,20202BF0,extended,2402029C // addiu v0,zero,0x29C // Chat nametag piece left patch=0,EE,20202C48,extended,240202A4 // addiu v0,zero,0x2A4 // Chat nametag piece middle patch=0,EE,20202CD8,extended,240502A8 // addiu a1,zero,0x2A8 // Chat nametag piece right patch=0,EE,2023AA04,extended,241200B0 // addiu s2,zero,0xB0 // Chat text patch=0,EE,2023B454,extended,240402A8 // addiu a0,zero,0x2A8 // Chat nametag text // minimap patch=0,EE,2021F96C,extended,3C013F40 // lui at,0x3F40 // Horizontal scale of minimap patch=0,EE,20332EF4,extended,3F400000 // Fixes bug where overworld minimap shifts gradually horizontally when travelling horizontally along terrain mesh patch=0,EE,202424CC,extended,0 // nop // overwrite branch to use PAL logic for overworld minimap patch=0,EE,20242530,extended,3C0144F2 // lui at,0x44F2 // 3d Minimap model vertical position patch=0,EE,2024253C,extended,3C0144D8 // lui at,0x44D8 // 3d Minimap model horizontal position patch=0,EE,102A4420,extended,21 // overworld minimap model clip left patch=0,EE,102A4422,extended,76 // overworld minimap model clip right patch=0,EE,102A4424,extended,9C // overworld minimap model clip top patch=0,EE,102A4426,extended,CE // overworld minimap model clip bottom patch=0,EE,102A4440,extended,20 // Figure 8 minimap model clip left patch=0,EE,2024294C,extended,0 // nop // overwrite branch to use PAL logic for race minimap patch=0,EE,20242964,extended,3C0144D8 // lui at,0x44D8 // 3d Minimap model horizontal position (in race) patch=0,EE,20242C18,extended,0 // nop // overwrite branch to use PAL logic for golf minimap patch=0,EE,20242C2C,extended,3C0144D8 // lui at,0x44D8 // 3d Minimap model horizontal position (in golf) // Title menu items patch=0,EE,2020326C,extended,24040219 // addiu a0,zero,0x219 // BG for "button Enter" text patch=0,EE,20203290,extended,24040219 // addiu a0,zero,0x219 // BG for "button Enter" and "button Back" text patch=0,EE,20205C88,extended,240301AB // addiu v1,zero,0x1AB // Default h. pos parameter for dark blue UI windows patch=0,EE,20205CA8,extended,240301AB // addiu v1,zero,0x1AB // Same as above but technically unreachable *shrug* patch=0,EE,202045B4,extended,24840089 // addiu a0,a0,0x89 // Default h. pos parameter for brown/greenish UI windows (like which contains the save data info) patch=0,EE,20209668,extended,240201FB // addiu v0,zero,0x1FB // "New Game"/"Continue" dialog window patch=0,EE,20205B40,extended,240202B7 // addiu v0,zero,0x2B7 // "Adventure"/"Quick Race"/"2 Player"/"Options"/"Results" dialog window patch=0,EE,202032C4,extended,24080221 // addiu t0,zero,0x221 // "button Enter" text ?? (for ??) patch=0,EE,202033C8,extended,24080221 // addiu t0,zero,0x221 // "button Enter" text (for everything) patch=0,EE,20203500,extended,24080221 // addiu t0,zero,0x221 // "button Exit" text (after selecting "Adventure" or "2 Player") patch=0,EE,20203600,extended,24090221 // addiu t1,zero,0x221 // "button Exit" text (after selecting "Options") patch=0,EE,20203704,extended,24090221 // addiu t1,zero,0x221 // Something similar to the above 4 patch=0,EE,20228060,extended,24040165 // addiu a0,zero,0x165 // Mile number counter in save statistics when loading patch=0,EE,202280A0,extended,240401F1 // addiu a0,zero,0x1F1 // Currency number counter in save statistics when loading patch=0,EE,2026A498,extended,24020093 // addiu v0,zero,0x93 // In "Results"->"Course", course select BG window h. pos patch=0,EE,2026A4E0,extended,24040093 // addiu a0,zero,0x93 // In "Results"->"Course", race statistics BG window h. pos patch=0,EE,2026A190,extended,2404018D // addiu a0,zero,0x18D // In "Results", h.pos of red "Oppose" text patch=0,EE,2026A500,extended,240400F7 // addiu a0,zero,0xF7 // "BEST LAP" text (on results statistics window) patch=0,EE,2026A520,extended,240400A7 // addiu a0,zero,0xA7 // "1ST" text (this and following changes are in order under "BEST LAP") patch=0,EE,2026A530,extended,240400A7 // addiu a0,zero,0xA7 // "NAME" text patch=0,EE,2026A548,extended,240400A7 // addiu a0,zero,0xA7 // "2ND" text patch=0,EE,2026A560,extended,240400A7 // addiu a0,zero,0xA7 // "NAME" text patch=0,EE,2026A578,extended,240400A7 // addiu a0,zero,0xA7 // "3RD" text patch=0,EE,2026A590,extended,240400A7 // addiu a0,zero,0xA7 // "NAME" text patch=0,EE,2026A5F8,extended,240400F7 // addiu a0,zero,0xF7 // Player names patch=0,EE,2026A628,extended,240400F7 // addiu a0,zero,0xF7 // Player names patch=0,EE,2026A674,extended,240400F7 // addiu a0,zero,0xF7 // 1ST result time patch=0,EE,2026A698,extended,240400F7 // addiu a0,zero,0xF7 // 2ND result time patch=0,EE,2026A6BC,extended,240400F7 // addiu a0,zero,0xF7 // 3RD result time patch=0,EE,2026A6D8,extended,2404020F // addiu a0,zero,0x20F // "BEST TIME" text patch=0,EE,2026A6F4,extended,240401BF // addiu a0,zero,0x1BF // "1ST" text (this and following changes are in order under "BEST TIME") patch=0,EE,2026A70C,extended,240401BF // addiu a0,zero,0x1BF // "NAME" text patch=0,EE,2026A72C,extended,240401BF // addiu a0,zero,0x1BF // "2ND" text patch=0,EE,2026A744,extended,240401BF // addiu a0,zero,0x1BF // "NAME" text patch=0,EE,2026A75C,extended,240401BF // addiu a0,zero,0x1BF // "3RD" text patch=0,EE,2026A774,extended,240401BF // addiu a0,zero,0x1BF // "NAME" text patch=0,EE,2026A7D8,extended,2404020F // addiu a0,zero,0x20F // Player names patch=0,EE,2026A800,extended,2404020F // addiu a0,zero,0x20F // Player names patch=0,EE,2026A85C,extended,2404020F // addiu a0,zero,0x20F // 1ST result time patch=0,EE,2026A880,extended,2404020F // addiu a0,zero,0x20F // 2ND result time patch=0,EE,2026A8A4,extended,2404020F // addiu a0,zero,0x20F // 3RD result time patch=0,EE,202087B8,extended,240500E9 // addiu a1,zero,0xE9 // Conspiracy Entertainment Logo h. pos // Quick Race select (slightly stretch clouds in background (by about ~6%) to leave no empty spots) patch=0,EE,202458A4,extended,241700D4 // addiu s7,zero,0xD4 // Was addiu s7,zero,0xC8 -- fixes offsets/wrapping patch=0,EE,20245924,extended,2610FFFF // addiu s0,s0,-0x1 patch=0,EE,20245928,extended,7FAB0020 // sq t3,0x20(sp) patch=0,EE,2024592C,extended,7FAC0030 // sq t4,0x30(sp) patch=0,EE,20245930,extended,26520050 // addiu s2,s2,0x50 patch=0,EE,20245934,extended,2810 // mfhi a1 patch=0,EE,20245938,extended,2A52823 // subu a1,s5,a1 patch=0,EE,2024593C,extended,C0818F2 // jal 0x2063c8 patch=0,EE,20245940,extended,26B500D4 // addiu s5,s5,0xD4 // Was addiu s5,0xC8 -- fixes offsets/wrapping patch=0,EE,20245944,extended,0 // nop patch=0,EE,20245948,extended,8641FFF0 // lh at,-0x10(s2) // These 3 is the actual magic, the above rearranges some instructions patch=0,EE,2024594C,extended,242100C0 // addiu at,at,0xC0 patch=0,EE,20245950,extended,A641FFF0 // sh at,-0x10(s2) patch=0,EE,20248320,extended,24040269 // addiu a0,zero,0x269 // Quick Race/2 Player text/elements patch=0,EE,2024835C,extended,24040269 // addiu a0,zero,0x269 // h. position of right button prompt after choice patch=0,EE,2024836C,extended,2404020F // addiu a0,zero,0x20F // h. position of left button prompt after choice patch=0,EE,20247828,extended,2404027D // addiu a0,zero,0x27D // Number of miles patch=0,EE,202478C8,extended,2404027D // addiu a0,zero,0x27D // Number of laps patch=0,EE,2024791C,extended,2404027D // addiu a0,zero,0x27D // Number of cars patch=0,EE,20247B44,extended,24040291 // addiu a0,zero,0x291 // Number of challenge attempts patch=0,EE,20247B8C,extended,24040101 // addiu a0,zero,0x101 // 2 Player -- Player 1 challenge attempts patch=0,EE,20247BD0,extended,24040269 // addiu a0,zero,0x269 // 2 Player -- Player 2 challenge attempts patch=0,EE,20247C88,extended,24040241 // addiu a0,zero,0x241 // Best total time patch=0,EE,20247CC0,extended,240400C5 // addiu a0,zero,0xC5 // Unused 2-player total time display ? patch=0,EE,20247CE4,extended,2404022D // addiu a0,zero,0x22D // Unused 2-player total time display ? patch=0,EE,20247D2C,extended,24040241 // addiu a0,zero,0x241 // Best lap time patch=0,EE,20247D58,extended,240400C5 // addiu a0,zero,0xC5 // Unused 2-player lap time display ? patch=0,EE,20247D78,extended,2404022D // addiu a0,zero,0x22D // Unused 2-player lap time display ? patch=0,EE,20247F04,extended,24040241 // addiu a0,zero,0x241 // 2 Player -- Unused 1 player total time display ? patch=0,EE,20247F38,extended,240400C5 // addiu a0,zero,0xC5 // 2 Player -- Player 1 best total time patch=0,EE,20247F5C,extended,2404022D // addiu a0,zero,0x22D // 2 Player -- Player 2 best total time patch=0,EE,20247FC4,extended,24040241 // addiu a0,zero,0x241 // 2 Player -- Unused 1 player lap time display ? patch=0,EE,20247FF0,extended,240400C5 // addiu a0,zero,0xC5 // 2 Player -- Player 1 best lap time patch=0,EE,20248010,extended,2404022D // addiu a0,zero,0x22D // 2 Player -- Player 2 best lap time patch=0,EE,20248064,extended,24040101 // addiu a0,zero,0x101 // 2 Player -- Player 1 course score patch=0,EE,20248098,extended,24040269 // addiu a0,zero,0x269 // 2 Player -- Player 2 course score patch=0,EE,202480FC,extended,24040101 // addiu a0,zero,0x101 // 2 Player -- Player 1 total score patch=0,EE,20248150,extended,24040269 // addiu a0,zero,0x269 // 2 Player -- Player 2 total score patch=0,EE,2022EDBC,extended,24040216 // addiu a0,zero,0x216 // 2 Player -- Player 1 cash when trading parts patch=0,EE,2022EDE0,extended,2404028E // addiu a0,zero,0x28E // 2 Player -- Player 2 cash when trading parts patch=0,EE,20247394,extended,24040015 // addiu a0,zero,0x15 // 2 Player -- "Selling" menu BG left bound when trading parts patch=0,EE,2024739C,extended,24060023 // addiu a2,zero,0x23 // 2 Player -- "Selling" menu BG right bound when trading parts patch=0,EE,20247514,extended,24040016 // addiu a0,zero,0x16 // 2 Player -- Player 1 name when trading parts patch=0,EE,202473B8,extended,24040016 // addiu a0,zero,0x16 // 2 Player -- Player 2 name when trading parts patch=0,EE,20247534,extended,24040017 // addiu a0,zero,0x17 // 2 Player -- "Selling" when trading parts patch=0,EE,20247564,extended,240402E0 // addiu a0,zero,0x2E0 // 2 Player -- Sell price when trading parts patch=0,EE,20269390,extended,24040093 // addiu a0,zero,0x93 // 2 Player -- Bottom top left money indicator during part trade confirmation patch=0,EE,202693B8,extended,24040093 // addiu a0,zero,0x93 // 2 Player -- Bottom bottom left money indicator during part trade confirmation patch=0,EE,202693D0,extended,240400DF // addiu a0,zero,0xDF // 2 Player -- Arrow between bottom left money indicators during part trade confirmation patch=0,EE,202693FC,extended,24040223 // addiu a0,zero,0x223 // 2 Player -- Bottom top right money indicator during part trade confirmation patch=0,EE,20269410,extended,24040223 // addiu a0,zero,0x223 // 2 Player -- Bottom bottom right money indicator during part trade confirmation patch=0,EE,2026942C,extended,2404026F // addiu a0,zero,0x26F // 2 Player -- Arrow between bottom right money indicators during part trade confirmation // Debug menu patch=0,EE,2026B270,extended,2404009D // addiu a0,zero,0x9D // Left trumpet cursor on race stage select patch=0,EE,2026B29C,extended,240401C9 // addiu a0,zero,0x1C9 // Right trumpet cursor on race stage select patch=0,EE,2026B678,extended,24040089 // addiu a0,zero,0x89 // Left trumpet cursor on action stage select patch=0,EE,2026B6A4,extended,240401B5 // addiu a0,zero,0x1B5 // Right trumpet cursor on action stage select // New Game screen patch=0,EE,2025B5BC,extended,24040094 // addiu a0,zero,0x94 // Character select BG patch=0,EE,2025B6BC,extended,2484009E // addiu a0,a0,0x9E // Character select highlight patch=0,EE,2025B75C,extended,2484009E // addiu a0,a0,0x9E // Character select text patch=0,EE,2025BB34,extended,241502DB // addiu s5,zero,0x2DB // "Enter your name." BG and text // Pause menus patch=0,EE,20212A10,extended,2403030D // addiu v1,zero,0x30D // Final position of top car in pause menu patch=0,EE,20212A60,extended,2409034F // addiu t1,zero,0x34F // Adjusts position of lower cars in pause menu patch=0,EE,20214B48,extended,2401006B // addiu at,zero,0x6B // Main pause menu -- BG h.pos patch=0,EE,20214B50,extended,ACA10004 // sw at,0x4(a1) // Main pause menu -- BG h.pos patch=0,EE,20214B78,extended,240C0223 // addiu t4,zero,0x223 // Main pause menu -- Signpost h.pos patch=0,EE,20214BF8,extended,2401006B // addiu at,zero,0x6B // Main pause menu -- Menu top/bottom borders patch=0,EE,20214BFC,extended,ACE10004 // sw at,0x4(a1) // Main pause menu -- Menu top/bottom borders patch=0,EE,20214F7C,extended,2401006B // addiu at,zero,0x6B // Warp menu -- BG h.pos patch=0,EE,20214F88,extended,ACC10004 // sw at,0x4(a1) // Warp menu -- BG h.pos patch=0,EE,20214F8C,extended,240B0223 // addiu t4,zero,0x223 // Warp menu -- Signpost h.pos patch=0,EE,20214FC4,extended,2001006B // addiu at,zero,0x6B // Warp menu -- Arrows patch=0,EE,20214FC8,extended,AC610004 // sw at,0x4(a1) // Warp menu -- Top arrow h. pos patch=0,EE,20214FD8,extended,AC61001C // sw at,0x1C(a1) // Warp menu -- Bottom arrow h. pos patch=0,EE,20215014,extended,2401006B // addiu at,zero,0x6B // Warp menu -- Menu top/bottom borders patch=0,EE,20215018,extended,AC810004 // sw at,0x4(a1) // Warp menu -- Menu top/bottom borders patch=0,EE,202152B0,extended,2401006B // addiu at,zero,0x6B // Notebook menu -- BG h.pos patch=0,EE,202152B8,extended,AC810004 // sw at,0x4(a1) // Notebook menu -- BG h.pos patch=0,EE,202152D8,extended,2401006B // addiu at,zero,0x6B // Notebook menu -- Menu top/bottom borders patch=0,EE,202152DC,extended,ACA10004 // sw at,0x4(a1) // Notebook menu -- Menu top/bottom borders patch=0,EE,2021543C,extended,240700E3 // addiu a3,zero,0xE3 // Notebook menu -- Notebook h. pos patch=0,EE,202154E4,extended,240700E3 // addiu a3,zero,0xE3 // Notebook menu -- license label h. pos patch=0,EE,20215588,extended,240700E3 // addiu a3,zero,0xE3 // Notebook menu -- tabs on right edge of notebook h. pos patch=0,EE,2021562C,extended,240700E3 // addiu a3,zero,0xE3 // Notebook menu -- labels (e.g. "Stamps" tag) h. pos patch=0,EE,20215768,extended,2401006B // addiu at,zero,0x6B // Radio menu -- BG h.pos patch=0,EE,2021576C,extended,AC810004 // sw at,0x4(a1) // Radio menu -- BG h.pos patch=0,EE,2021578C,extended,2401006B // addiu at,zero,0x6B // Radio menu -- Menu top/bottom borders patch=0,EE,20215790,extended,ACA10004 // sw at,0x4(a1) // Radio menu -- Menu top/bottom borders patch=0,EE,20215914,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- radio BG left part patch=0,EE,2021598C,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- radio BG middle part patch=0,EE,20215A1C,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- radio BG right part patch=0,EE,20215AA8,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- arrow patch=0,EE,20215BCC,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- time display patch=0,EE,20215D54,extended,2407017E // addiu a3,zero,0x17E // Radio menu -- volume indicator on knob patch=0,EE,20215DC0,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- station name patch=0,EE,20215EBC,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- music visualizer patch=0,EE,20215FE8,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- radio station button BGs patch=0,EE,20216180,extended,24070110 // addiu a3,zero,0x110 // Radio menu -- radio station button text patch=0,EE,202162F0,extended,2401006B // addiu at,zero,0x6B // Items menu -- BG h.pos patch=0,EE,202162F8,extended,ACA10004 // sw at,0x4(a1) // Items menu -- BG h.pos patch=0,EE,2021631C,extended,2401006B // addiu at,zero,0x6B // Items menu -- Menu top/bottom borders patch=0,EE,20216324,extended,ACC10004 // sw at,0x4(a1) // Items menu -- Menu top/bottom borders patch=0,EE,20216340,extended,24030093 // addiu v1,zero,0x93 // Items menu -- Light blue top left window patch=0,EE,202164A8,extended,24040093 // addiu v1,zero,0x93 // Items menu -- Dark blue bottom left window BG patch=0,EE,202164C0,extended,240401BF // addiu a0,zero,0x1BF // Items menu -- Dark blue right window BG patch=0,EE,20216574,extended,24040093 // addiu a0,zero,0x93 // Items menu -- Dark blue bottom left window text patch=0,EE,20216588,extended,240401F1 // addiu a0,zero,0x1F1 // Items menu -- Money indicator h. pos patch=0,EE,202165A8,extended,240401D3 // addiu a0,zero,0x1D3 // Items menu -- "Choro Q Coins" patch=0,EE,202165CC,extended,240402AF // addiu a0,zero,0x2AF // Items menu -- Number of Choro Q Coins patch=0,EE,20216650,extended,240401D3 // addiu a0,zero,0x1D3 // Items menu -- "Advertisement" patch=0,EE,2021667C,extended,240401D3 // addiu a0,zero,0x1D3 // Items menu -- "Cafe"/"Noodle cafe"/etc. text patch=0,EE,202166AC,extended,240602AF // addiu a2,zero,0x2AF // Items menu -- "Mile" patch=0,EE,202166CC,extended,240302AF // addiu v1,zero,0x2AF // Items menu -- Number of miles patch=0,EE,202167C8,extended,2401006B // addiu at,zero,0x6B // Settings menu -- BG h.pos patch=0,EE,202167D0,extended,AC810004 // sw at,0x4(a0) // Settings menu -- BG h.pos patch=0,EE,202167F0,extended,2401006B // addiu at,zero,0x6B // Settings menu -- Menu top/bottom borders patch=0,EE,202167F4,extended,ACA10004 // sw at,0x4(a0) // Settings menu -- Menu top/bottom borders patch=0,EE,20216824,extended,24040093 // addiu a0,zero,0x93 // Settings menu -- Light blue window BG h.pos patch=0,EE,20216840,extended,240401BF // addiu a0,zero,0x1BF // Settings menu -- Dark blue window BG h.pos patch=0,EE,20216894,extended,24840093 // addiu a0,a0,0x93 // Settings menu -- trumpet selection h.pos patch=0,EE,202168C8,extended,248400A7 // addiu a0,a0,0xA7 // Settings menu -- Light blue window text h.pos patch=0,EE,2021692C,extended,240401D3 // addiu a0,zero,0x1D3 // Settings menu -- Dark blue window text h.pos patch=0,EE,20216C00,extended,2407015B // addiu a3,zero,0x15B // Settings menu -- Button icons h.pos patch=0,EE,20216DC4,extended,24E70273 // addiu a3,a3,0x273 // Settings menu -- Controller button indicator h.pos (the spinning square) patch=0,EE,20216F40,extended,2407006B // addiu a3,zero,0x6B // Map menu -- Map BG patch=0,EE,20216FCC,extended,248400ED // addiu a0,a0,0xED // Map menu -- Car icon h. pos // Stamp/photo/results book part h.positions // Background patch=0,EE,202DBDB8,extended,356 // Background width // Parts of the actual book patch=0,EE,202DBDD0,extended,73 patch=0,EE,202DBDF8,extended,73 patch=0,EE,202DBE20,extended,73 patch=0,EE,202DBE48,extended,93 patch=0,EE,202DBE70,extended,93 patch=0,EE,202DBE98,extended,17B patch=0,EE,202DBEC0,extended,17B patch=0,EE,202DBEE8,extended,1AB patch=0,EE,202DBF10,extended,1AB patch=0,EE,202DBF38,extended,1DB patch=0,EE,202DBF60,extended,1DB patch=0,EE,202DBF88,extended,2C3 patch=0,EE,202DBFB0,extended,2C3 patch=0,EE,202DBFD8,extended,2C3 patch=0,EE,202DC000,extended,19B patch=0,EE,202DC028,extended,19B patch=0,EE,202DC050,extended,19B patch=0,EE,202DC078,extended,93 patch=0,EE,202DC0A0,extended,93 patch=0,EE,202DC0C8,extended,93 patch=0,EE,202DC0F0,extended,A3 patch=0,EE,202DC118,extended,A3 patch=0,EE,202DC140,extended,A3 patch=0,EE,202DC168,extended,2B3 patch=0,EE,202DC190,extended,2B3 patch=0,EE,202DC1B8,extended,2B3 patch=0,EE,202DC1E0,extended,1BB patch=0,EE,202DC208,extended,1BB patch=0,EE,202DC230,extended,1BB // Arrows patch=0,EE,2032F0A0,extended,6B patch=0,EE,2032F0C0,extended,6B // Re-center page turning effect patch=0,EE,20264E98,extended,240700C0 // addiu a3,zero,0xC0 // white part of 3D page turn patch=0,EE,20264FC0,extended,240700C0 // addiu a3,zero,0xC0 // green part of 3D page turn // Green text on top/bottom of page patch=0,EE,20265048,extended,240900A3 // addiu t1,zero,0xA3 // Stamp border parts patch=0,EE,202DC258,extended,BB patch=0,EE,202DC280,extended,DB patch=0,EE,202DC2A8,extended,15B patch=0,EE,202DC2D0,extended,BB patch=0,EE,202DC2F8,extended,DB patch=0,EE,202DC320,extended,15B patch=0,EE,202DC348,extended,BB patch=0,EE,202DC370,extended,DB patch=0,EE,202DC398,extended,15B // Stamp page numbers patch=0,EE,20265308,extended,2405009B // addiu a1,zero,0x9B patch=0,EE,20265310,extended,2402027B // addiu v0,zero,0x27B patch=0,EE,202653A4,extended,240202AD // addiu v0,zero,0x242 patch=0,EE,202653A8,extended,240200BF // addiu v0,zero,0xBF // Lines under stamp descriptions patch=0,EE,202653F8,extended,240200A3 // addiu v0,zero,0xA3 patch=0,EE,202653FC,extended,240301C3 // addiu v1,zero,0x1C3 // Stamp description text h. position patch=0,EE,202654D0,extended,248400A7 // addiu a0,a0,0xA7 // When viewing a stamp in the stamps page patch=0,EE,2026572C,extended,248400A7 // addiu a0,a0,0xA7 // This is for when a stamp is being initially awarded // Stamp positions patch=0,EE,202651E0,extended,32020001 // andi v0,s0,0x0001 patch=0,EE,202651E8,extended,240100D8 // addiu at,zero,0xD8 patch=0,EE,202651F0,extended,220018 // mult zero,at,v0 patch=0,EE,202651F8,extended,0 // nop patch=0,EE,20265200,extended,0 // nop patch=0,EE,20265208,extended,0 // nop patch=0,EE,20265210,extended,0 // nop patch=0,EE,20265218,extended,1012 // mflo v0 patch=0,EE,20265220,extended,24420194 // addiu v0,v0,0x194 // Photo page numbers patch=0,EE,20266120,extended,2413027F // addiu s3,zero,0x27F patch=0,EE,20266154,extended,24050093 // addiu a1,zero,0x93 patch=0,EE,20266168,extended,2402020F // addiu v0,zero,0x20F patch=0,EE,202661C0,extended,240200C3 // addiu v0,zero,0xC3 // Correct small photo spacing in photos page patch=0,EE,20266570,extended,C09CB4C // jal 0x272d30 // jump to a code cave created by overwriting another UI function patch=0,EE,20272D30,extended,3C013F40 // lui at,0x3F40 patch=0,EE,20272D34,extended,44810000 // mtc1 at,f00 patch=0,EE,20272D38,extended,44870800 // mtc1 a3,f01 patch=0,EE,20272D3C,extended,46800860 // cvt.s.w f01,f01 patch=0,EE,20272D40,extended,46010002 // mul.s f00,f00,f01 patch=0,EE,20272D44,extended,46000024 // cvt.w.s f00,f00 patch=0,EE,20272D48,extended,44070000 // mfc1 a3,f00 patch=0,EE,20272D4C,extended,8093AC4 // j 0x24eb10 // original function call -- this code corrected spacing between photos patch=0,EE,20272D50,extended,24E700C0 // addiu a3,a3,0xC0 // Correct small photo positions in photos page patch=0,EE,202DBD34,extended,125 patch=0,EE,202DBD40,extended,B3 patch=0,EE,202DBD4C,extended,125 patch=0,EE,202DBD58,extended,B3 patch=0,EE,202DBD64,extended,125 patch=0,EE,202DBD70,extended,1D3 patch=0,EE,202DBD7C,extended,1D3 patch=0,EE,202DBD88,extended,245 patch=0,EE,202DBD94,extended,1D3 patch=0,EE,202DBDA0,extended,245 // Results patch=0,EE,202377B4,extended,26310115 // addiu s1,s1,0x115 // Race time text patch=0,EE,20267574,extended,2411009D // addiu s1,zero,0x9D // Event (e.g. Figure 8) left page text (when flipping page going right) patch=0,EE,202675F4,extended,241101C9 // addiu s1,zero,0x1C9 // Event (e.g. Figure 8) right page text (when flipping page going right) patch=0,EE,20267690,extended,2402009D // addiu v0,zero,0x32 // Event (e.g. Figure 8) left page text (when flipping page going left) patch=0,EE,20267694,extended,241101C9 // addiu s1,zero,0x1C9 // Event (e.g. Figure 8) right page text (when flipping page going left) patch=0,EE,2026778C,extended,2411009D // addiu s1,zero,0x9D // Event (e.g. Figure 8) left page text patch=0,EE,2026782C,extended,241101C9 // addiu s1,zero,0x1C9 // Event (e.g. Figure 8) right page text // Part Shops/Q's Factory patch=0,EE,2022E9A4,extended,24040016 // addiu a0,zero,0x16 // Parts description text patch=0,EE,2022E9CC,extended,24040015 // addiu a0,zero,0x15 // Parts description BG left bound patch=0,EE,2022E9D8,extended,24060023 // addiu a2,zero,0x23 // Parts description BG right bound patch=0,EE,20247260,extended,24040015 // addiu a0,zero,0x15 // Price BG left bound patch=0,EE,20247268,extended,24060023 // addiu a2,zero,0x23 // Price BG right bound patch=0,EE,20247294,extended,24040016 // addiu a0,zero,0x16 // "You have it." (??) patch=0,EE,202472B0,extended,2404022D // addiu a0,zero,0x22D // "You have X" patch=0,EE,202473E4,extended,2404022D // addiu a0,zero,0x22D // "You have X" patch=0,EE,202472E4,extended,24040016 // addiu a0,zero,0x16 // "You don't have it." patch=0,EE,2024741C,extended,24040016 // addiu a0,zero,0x16 // "You don't have it." patch=0,EE,20247300,extended,24040017 // addiu a0,zero,0x17 // "Price" patch=0,EE,20247320,extended,240402E0 // addiu a0,zero,0x2E0 // Numerical price h. pos patch=0,EE,20247338,extended,2404001F // addiu a0,zero,0x1F // Currency unit h. pos patch=0,EE,2022E7D0,extended,24040294 // addiu a0,zero,0x294 // Top Top Right Money Indicator patch=0,EE,2022E818,extended,24040294 // addiu a0,zero,0x294 // Top Bottom Right Money Indicator patch=0,EE,2022E844,extended,24040294 // addiu a0,zero,0x294 // Bottom Bottom Right Money Indicator patch=0,EE,2022E880,extended,240402E0 // addiu a0,zero,0x2E0 // Arrow between bottom right money indicators patch=0,EE,2022E8D8,extended,24040294 // addiu a0,zero,0x294 // Bottom Top Right Money Indicator patch=0,EE,2022E928,extended,240402E0 // addiu a0,zero,0x2E0 // Arrow between top right money indicators patch=0,EE,20247434,extended,24040017 // addiu a0,zero,0x17 // Recycle Shop (??) patch=0,EE,202475E4,extended,24040017 // addiu a0,zero,0x17 // Recycle Shop (??) patch=0,EE,202474B0,extended,240402E0 // addiu a0,zero,0x2E0 // Numerical price when buying/selling patch=0,EE,202475F8,extended,240402E0 // addiu a0,zero,0x2E0 // Numerical price when buying/selling patch=0,EE,202474DC,extended,2404001F // addiu a0,zero,0x1F // Currency unit when buying/selling patch=0,EE,20247614,extended,2404001F // addiu a0,zero,0x1F // Currency unit when buying/selling patch=0,EE,202474F8,extended,24040015 // addiu a0,zero,0x15 // BG left bound for price box when buying/selling patch=0,EE,20247504,extended,24060023 // addiu a2,zero,0x23 // BG right bound for price box when buying/selling patch=0,EE,202475BC,extended,24040015 // addiu a0,zero,0x15 // BG left bound for price box when buying/selling patch=0,EE,202475CC,extended,24060023 // addiu a2,zero,0x23 // BG right bound for price box when buying/selling patch=0,EE,20268C08,extended,244201AB // addiu v0,v0,0x1AB // Buy/sell prompt patch=0,EE,2023A274,extended,240401B5 // addiu a0,zero,0x1B5 // Number of miles driven when redeeming advertisement rewards patch=0,EE,2023A2A0,extended,240401DD // addiu a0,zero,0x1DD // Dosh earned when redeeming advertisement rewards // Bank patch=0,EE,2023A564,extended,241001A3 // addiu s0,zero,0x1A3 // Flashing arrows patch=0,EE,2023A6E0,extended,240401B5 // addiu a0,zero,0x1B5 // Numbers // Paint shop patch=0,EE,202568F8,extended,240501E3 // addiu a1,zero,0x1E3 // Overhead sprayer patch=0,EE,20256A7C,extended,240501E3 // addiu a1,zero,0x1E3 // Overhead sprayer patch=0,EE,202556C8,extended,240601FB // addiu a2,zero,0x1FB // Spray effect patch=0,EE,202556E4,extended,240602A1 // addiu a2,zero,0x2A1 // Spray effect patch=0,EE,20255700,extended,240601DB // addiu a2,zero,0x1DB // Spray effect patch=0,EE,20255728,extended,240602C1 // addiu a2,zero,0x2C1 // Spray effect patch=0,EE,102AC600,extended,1D7 // Flashing lights patch=0,EE,102AC604,extended,1E8 // Flashing lights patch=0,EE,102AC608,extended,208 // Flashing lights patch=0,EE,102AC60C,extended,232 // Flashing lights patch=0,EE,102AC610,extended,25E // Flashing lights patch=0,EE,102AC614,extended,284 // Flashing lights patch=0,EE,102AC618,extended,29B // Flashing lights // Race UI patch=0,EE,202EC08C,extended,2C4 // Lap 1 time patch=0,EE,202EC0A4,extended,2C4 // Lap 2 time patch=0,EE,202EC0BC,extended,2C4 // Lap 3 time patch=0,EE,202EC104,extended,2C0 // "LAPTIME" label patch=0,EE,202EC11C,extended,2C4 // Lap 1 time (unknown condition) patch=0,EE,202EC134,extended,2C4 // Lap 2 time (unknown condition) patch=0,EE,202EC14C,extended,2C4 // Lap 3 time (unknown condition) patch=0,EE,20234260,extended,240301AB // addiu v1,zero,0x1AB // "FINAL LAP" label patch=0,EE,20232C80,extended,241101AB // addiu s1,zero,0x1AB // "WRONG WAY" label patch=0,EE,202EBCE0,extended,6B // Signal lights BG texture left patch=0,EE,202EBD00,extended,10B // Signal lights BG texture middle patch=0,EE,202EBD20,extended,7B // Signal lights BG texture right patch=0,EE,2022F57C,extended,254A0073 // addiu t2,t2,0x73 // Signal lights texture patch=0,EE,2022F6BC,extended,2463006D // addiu v1,v1,0x6D // Signal light highlights patch=0,EE,202378F8,extended,240400E3 // addiu a0,zero,0xE3 // Rank positions when paused -> "Ranking" patch=0,EE,20237938,extended,2404011F // addiu a0,zero,0x11F // Names when paused -> "Ranking" patch=0,EE,20237978,extended,240401E7 // addiu a0,zero,0x1E7 // Locations when paused -> "Ranking" (NPCs) patch=0,EE,202379A8,extended,240401E7 // addiu a0,zero,0x1E7 // Locations when paused -> "Ranking" (Player) // Race Results (general) patch=0,EE,20235900,extended,240901AB // addiu t1,zero,0x1AB // Fixes BG stretching patch=0,EE,20235910,extended,24080356 // addiu t0,zero,0x356 // Makes BG cover whole screen patch=0,EE,2023596C,extended,240500F7 // addiu a1,zero,0xF7 // Race name left border patch=0,EE,20235990,extended,24050137 // addiu a1,zero,0x137 // Race name middle border patch=0,EE,202359B4,extended,2405024F // addiu a1,zero,0x24F // Race name right border // 2 Player Race Results patch=0,EE,20235CB0,extended,24040151 // addiu a0,zero,0x151 // Race name text patch=0,EE,20235A3C,extended,240400B1 // addiu a0,zero,0xB1 // Entry names patch=0,EE,20235A68,extended,24040183 // addiu a0,zero,0x183 // Rank ordinals patch=0,EE,20235A80,extended,2404016F // addiu a0,zero,0x16F // "retire" text patch=0,EE,20235AB0,extended,240401DD // addiu a0,zero,0x1DD // points patch=0,EE,20235AC8,extended,240401F1 // addiu a0,zero,0x1F1 // time patch=0,EE,20235B18,extended,2404024B // addiu a0,zero,0x24B // best lap time patch=0,EE,20235E04,extended,24040197 // addiu a0,zero,0x197 // Player 1 total points patch=0,EE,20235E38,extended,240401DD // addiu a0,zero,0x1DD // Player 2 total points // Race Results (not Grand Prix) patch=0,EE,20235F7C,extended,240400B1 // addiu a0,zero,0xB1 // Entry names patch=0,EE,20235FC0,extended,2404016F // addiu a0,zero,0x16F // "retire" patch=0,EE,20235FF8,extended,24040183 // addiu a0,zero,0x183 // rank ordinals patch=0,EE,20236000,extended,24040179 // addiu a0,zero,0x179 // left parenthesis around record rank ordinals patch=0,EE,20236078,extended,24040183 // addiu a0,zero,0x183 // record rank ordinals patch=0,EE,2023608C,extended,240401AB // addiu a0,zero,0x1AB // right parenthesis around record rank ordinals patch=0,EE,20236100,extended,240401D3 // addiu a0,zero,0x1D3 // time patch=0,EE,20236118,extended,240401C9 // addiu a0,zero,0x1C9 // left parenthesis around record time patch=0,EE,20236130,extended,240401D3 // addiu a0,zero,0x1D3 // record time patch=0,EE,20236148,extended,24040223 // addiu a0,zero,0x223 // right parenthesis around record time patch=0,EE,202361BC,extended,2404024B // addiu a0,zero,0x24B // best lap time patch=0,EE,202361D4,extended,24040241 // addiu a0,zero,0x241 // left parenthesis around record best lap time patch=0,EE,202361E4,extended,2404024B // addiu a0,zero,0x241 // record best lap time patch=0,EE,202361F8,extended,2404029B // addiu a0,zero,0x241 // right parenthesis around record best lap time patch=0,EE,20236434,extended,24040205 // addiu a0,zero,0x205 // Prize amounts patch=0,EE,202364E8,extended,24040151 // addiu a0,zero,0x151 // Race name text // Race Results (Grand Prix) patch=0,EE,20236A5C,extended,240400BB // addiu a0,zero,0xBB // 4th screen after race -- rank ordinals column patch=0,EE,20236A68,extended,24040115 // addiu a0,zero,0x115 // 4th screen after race -- Team name column patch=0,EE,20236AA8,extended,2404027D // addiu a0,zero,0x27D // 4th screen after race -- Total pts column patch=0,EE,20236BF4,extended,24040205 // addiu a0,zero,0x205 // 4th screen after race (final race) -- prize amount patch=0,EE,20236E20,extended,240400C5 // addiu a0,zero,0xC5 // 2nd screen after race -- Team names patch=0,EE,20236E88,extended,240401C9 // addiu a0,zero,0x1C9 // 2nd screen after race -- left rank column patch=0,EE,20236EB4,extended,24040205 // addiu a0,zero,0x205 // 2nd screen after race -- middle rank column patch=0,EE,20236EE4,extended,24040241 // addiu a0,zero,0x241 // 2nd screen after race -- right rank column patch=0,EE,20236F0C,extended,240401E7 // addiu a0,zero,0x1E7 // 3rd screen after race -- left points column patch=0,EE,20236F34,extended,240401F1 // addiu a0,zero,0x1F1 // 3rd screen after race -- left + column patch=0,EE,20236F4C,extended,24040223 // addiu a0,zero,0x223 // 3rd screen after race -- middle points column patch=0,EE,20236F74,extended,2404022D // addiu a0,zero,0x22D // 3rd screen after race -- right + column patch=0,EE,20236F8C,extended,2404025F // addiu a0,zero,0x25F // 3rd screen after race -- right points column patch=0,EE,20236FBC,extended,2404029B // addiu a0,zero,0x29B // 3rd screen after race -- total points column patch=0,EE,202371BC,extended,240400BB // addiu a0,zero,0xBB // 1st screen after race -- left side rank ordinals patch=0,EE,202371EC,extended,24040101 // addiu a0,zero,0x101 // 1st screen after race -- left side names patch=0,EE,20237274,extended,240401BF // addiu a0,zero,0x1BF // 1st screen after race -- right side rank ordinals patch=0,EE,202372A4,extended,24040205 // addiu a0,zero,0x205 // 1st screen after race -- right side names patch=0,EE,20237460,extended,2404013D // addiu a0,zero,0x13D // 1st screen after race -- "World GPX Stage" patch=0,EE,20237474,extended,2404022D // addiu a0,zero,0x22D // 1st screen after race -- stage number // Figure 8 patch=0,EE,20328FF0,extended,356 // Makes instructions/results BG cover whole screen patch=0,EE,20329028,extended,9D // Instructions - h.pos of "Figure 8" graphic patch=0,EE,20329048,extended,9D // Instructions - h.pos of map graphic patch=0,EE,2025ABD8,extended,240301BF // addiu v1,zero,0x1BF // Instructions - light blue window h.pos patch=0,EE,2025ACF8,extended,2404025F // addiu a0,zero,0x25F // Instructions - Step times patch=0,EE,2025AD10,extended,240401BF // addiu a0,zero,0x1BF // Instructions - Bottom-right dark blue window h.pos patch=0,EE,2025AD30,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions - "Goal" patch=0,EE,2025AD4C,extended,2404025F // addiu a0,zero,0x25F // Instructions - Goal time patch=0,EE,2025ADA4,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions - Course description text (e.g. "Basic slalom course...") patch=0,EE,2025ADDC,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions - "5 sec penalty" patch=0,EE,2025AE04,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions - "for pylon hit" patch=0,EE,20234CC8,extended,240601AE // addiu a2,zero,0x1AE // "Pylon touch!" graphic patch=0,EE,202331F4,extended,24020200 // addiu v0,zero,0x200 // unknown graphic patch=0,EE,202332C8,extended,24020200 // addiu v0,zero,0x200 // "Miss Course!" graphic patch=0,EE,20234194,extended,24030200 // addiu v1,zero,0x200 // "Finish!" graphic patch=0,EE,2025B24C,extended,240400CF // addiu a0,zero,0xCF // Results - Dark blue window h.pos patch=0,EE,2025B288,extended,240400E3 // addiu a0,zero,0xE3 // Results - Course name (e.g. "STEP1") h.pos patch=0,EE,2025B2B8,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Course missed!" patch=0,EE,2025B2D8,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Time" patch=0,EE,2025B2EC,extended,24040197 // addiu a0,zero,0x197 // Results - time value patch=0,EE,2025B308,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Pylon hit" patch=0,EE,2025B344,extended,24040197 // addiu a0,zero,0x197 // Results - Pylon hit value text patch=0,EE,2025B364,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Total time" patch=0,EE,2025B39C,extended,24040197 // addiu a0,zero,0x197 // Results - Total time value patch=0,EE,2025B3C0,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Best time" patch=0,EE,2025B3EC,extended,24040197 // addiu a0,zero,0x197 // Results - Best time value patch=0,EE,2025B40C,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Goal time" patch=0,EE,2025B42C,extended,24040197 // addiu a0,zero,0x197 // Results - Goal time value patch=0,EE,202A42E0,extended,43CC0000 // Step 1 Minimap h.pos patch=0,EE,202A42F0,extended,43E50000 // Step 2 Minimap h.pos patch=0,EE,202A4300,extended,C3340000 // Step 3 Minimap h.pos patch=0,EE,202A4310,extended,43830000 // Step 4 Minimap h.pos // Step 5 is fine as is // Ski Jump patch=0,EE,20231BB4,extended,241402BA // addiu s4,zero,0x2BA // digits top right patch=0,EE,202EBFF0,extended,2E2 // "M" icon top right // Soccer patch=0,EE,20235140,extended,24030306 // addiu v1,zero,0x306 // overhead score display (2 player) patch=0,EE,20235144,extended,240401AB // addiu v1,zero,0x1AB // overhead score display (1 player) patch=0,EE,20235174,extended,240301AB // addiu v1,zero,0x1AB // overhead score display (1 player) patch=0,EE,20230EF8,extended,26B50054 // addiu s5,s5,0x54 // h.pos of score after scoring goal patch=0,EE,20230F1C,extended,2A0382D // daddu a3,s5,zero // h.pos of score after scoring goal // Q's Rally patch=0,EE,20243238,extended,24040151 // addiu a0,zero,0x151 // "+++ Q's Rally +++" patch=0,EE,20243294,extended,240402E8 // addiu a0,zero,0x2E8 // "TIME" patch=0,EE,202432E8,extended,240402E8 // addiu a0,zero,0x2E8 // Running time value // Roulette patch=0,EE,20261B58,extended,2407006B // addiu a3,zero,0x6B // Roulette board BG patch=0,EE,20261BF4,extended,2607006B // addiu a3,s0,0x6B // Flashing chip cursor h.pos patch=0,EE,20261E80,extended,2407006B // addiu a3,zero,0x6B // Roulette board BG (after playing round of roulette) patch=0,EE,20261F48,extended,2407006B // addiu a3,zero,0x6B // Position of flashing elements after playing round of roulette patch=0,EE,202620B8,extended,2607006B // addiu a3,s0,0x6B // Chip after playing round of roulette patch=0,EE,20262510,extended,240501AB // addiu a1,zero,0x1AB // Window h.pos for "You don't have the money to play." window patch=0,EE,202625F4,extended,240501AB // addiu a1,zero,0x1AB // Window h.pos for "Please make a bet." window patch=0,EE,20261574,extended,240501AB // addiu a1,zero,0x1AB // Window h.pos for "Start?" window patch=0,EE,20261688,extended,240400E3 // addiu a0,zero,0xE3 // Window h.pos for "How much do you wish to bet?" patch=0,EE,2026169C,extended,240400E3 // addiu a0,zero,0xE3 // Window h.pos for "How much do you wish to bet?" patch=0,EE,20261910,extended,240400E3 // addiu a0,zero,0xE3 // Window h.pos for "How much do you wish to bet?" patch=0,EE,2026196C,extended,240400E3 // addiu a0,zero,0xE3 // Window h.pos for "How much do you wish to bet?" patch=0,EE,20261988,extended,240400E3 // addiu a0,zero,0xE3 // "How much do you wish to bet?" patch=0,EE,202619A0,extended,240401C3 // addiu a0,zero,0x1C3 // Currency unit h.pos on bet window patch=0,EE,202619CC,extended,240401C3 // addiu a0,zero,0x1C3 // Currency amount h.pos on bet window patch=0,EE,202619F4,extended,240400E3 // addiu a0,zero,0xE3 // Arrow under currency amount on bet window // Golf patch=0,EE,20328320,extended,3D6 // Makes instructions/results BG cover whole screen patch=0,EE,20328338,extended,9D // Instructions/results - "Golf" graphic patch=0,EE,20328358,extended,B9 // Instructions - Map graphic patch=0,EE,20252984,extended,240401BF // addiu a0,zero,0x1BF // Instructions -- Dark blue window BG patch=0,EE,202529AC,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions -- hole name e.g. "1 HOLE" patch=0,EE,202529E0,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions -- hole distance patch=0,EE,20252A14,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions -- hole par patch=0,EE,20252A54,extended,240401D3 // addiu a0,zero,0x1D3 // Instructions -- hole description text patch=0,EE,202308F0,extended,247402C8 // addiu s4,v1,0x2C8 // Top-right HUD elements in-game patch=0,EE,202EC20C,extended,200 // BG splash for "HOLE IN ONE!" graphic patch=0,EE,202EC23C,extended,200 // "HOLE IN ONE!" graphic patch=0,EE,202EC26C,extended,200 // Albatross (?) graphic patch=0,EE,202EC29C,extended,200 // Eagle (?) graphic patch=0,EE,202EC2CC,extended,200 // Birdie graphic patch=0,EE,202EC2FC,extended,200 // Par graphic patch=0,EE,202EC32C,extended,200 // Bogey graphic patch=0,EE,202EC35C,extended,200 // Double Bogey (?) graphic patch=0,EE,202EC38C,extended,200 // Triple Bogey (?) graphic patch=0,EE,20252CD8,extended,2416011F // addiu s6,zero,0x11F // Results - Hole numbers patch=0,EE,20252E3C,extended,240400CF // addiu a0,zero,0xCF // Results - Dark blue window BG patch=0,EE,20252E5C,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Hole"/"Par"/"Score"/"Best" text patch=0,EE,20252E74,extended,240400E3 // addiu a0,zero,0xE3 // Results - "Total" patch=0,EE,20252EE8,extended,24160179 // addiu s6,zero,0x179 // Results - Par scores patch=0,EE,20252F8C,extended,241601F1 // addiu s6,zero,0x179 // Results - Scores patch=0,EE,20253070,extended,2416025F // addiu s6,zero,0x179 // Results - Best scores // Curling patch=0,EE,20231580,extended,24070300 // addiu a3,zero,0x300 // Scores patch=0,EE,20231588,extended,26940017 // addiu s4,s4,0x17 // Spacing between digits in scores patch=0,EE,20231620,extended,241602A8 // addiu s6,zero,0x2A8 // Trial number graphics patch=0,EE,20231654,extended,24070316 // addiu a3,zero,0x316 // "Pts" graphic near scores patch=0,EE,20231760,extended,245201B4 // addiu s2,v0,0x1B4 // Big score shown on screen after attempt patch=0,EE,20231848,extended,2652FFC8 // addiu s2,s2,-0x38 // Spacing between digits in big score // Fishing patch=0,EE,20231E50,extended,24140300 // addiu s4,zero,0x300 // Fish caught digits graphic patch=0,EE,202EC010,extended,285 // Fish graphic patch=0,EE,202EC030,extended,2C0 // "X" graphic // Which Way Race patch=0,EE,20231FF8,extended,2407016D // addiu a3,zero,0x16D // "Time limit" graphic patch=0,EE,20232074,extended,245101E0 // addiu s1,v0,0x1E0 // Timer digits graphic patch=0,EE,20232144,extended,2631FFE9 // addiu s1,s1,-0x17 // Affects spacing between the digits in timer patch=0,EE,202EC074,extended,2BF // ?? // My Garage patch=0,EE,2022C6C4,extended,241200EB // addiu s2,zero,0xEB // h.pos of left-side small trophies patch=0,EE,2022C714,extended,241201F1 // addiu s2,zero,0x1F1 // h.pos of right-side small trophies patch=0,EE,2022C7B4,extended,2405015D // addiu a1,zero,0x15D // h.pos of large trophy patch=0,EE,2022C820,extended,24A5006B // addiu a1,a1,0x6B // Corrects h.pos of furniture patch=0,EE,2022C83C,extended,2610000C // addiu s0,s0,0xC // Rearranged original code for furniture correction patch=0,EE,2022C844,extended,220202D // daddu a0,s1,zero // Rearranged original code for furniture correction // Email patch=0,EE,202645E0,extended,240400CF // addiu a0,zero,0xCF // Inbox main BG window patch=0,EE,20264620,extended,240400CF // addiu a0,zero,0xCF // Inbox header BG window patch=0,EE,20264664,extended,240400F7 // addiu a0,zero,0xF7 // "mail box" patch=0,EE,202646F0,extended,2404024B // addiu a0,zero,0x24B // "mail" and mail count patch=0,EE,20264778,extended,240400E3 // addiu a0,zero,0xE3 // Mail read status patch=0,EE,20264834,extended,240400BB // addiu a0,zero,0xBB // E-mail contents header BG window patch=0,EE,20264854,extended,240400E3 // addiu a0,zero,0xE3 // "Subject" patch=0,EE,20264880,extended,240400E3 // addiu a0,zero,0xE3 // "From" patch=0,EE,202648A4,extended,24120273 // addiu s2,zero,0x273 // Subject/From text patch=0,EE,20264970,extended,240400BB // addiu a0,zero,0xBB // E-mail contents main BG window patch=0,EE,20264A54,extended,240400E3 // addiu a0,zero,0xE3 // E-mail body text patch=0,EE,20264BA4,extended,240401AB // addiu a0,zero,0x1AB // Where the e-mail contents main BG window starts opening patch=0,EE,20264C3C,extended,240401AB // addiu a0,zero,0x1AB // Where the e-mail contents main BG window starts closing // Uncategorized/unknown graphics horizontal positions patch=0,EE,2022C0B8,extended,240500AB // addiu a1,zero,0xAB patch=0,EE,2022C0E0,extended,240600AB // addiu a2,zero,0xAB patch=0,EE,20232CE0,extended,241101AB // addiu s1,zero,0x1AB patch=0,EE,20232DEC,extended,24020200 // addiu v0,zero,0x200 patch=0,EE,20232E98,extended,24020200 // addiu v0,zero,0x200 patch=0,EE,20232FA8,extended,24020200 // addiu v0,zero,0x200 patch=0,EE,20233050,extended,24020200 // addiu v0,zero,0x200 patch=0,EE,202330DC,extended,24020200 // addiu v0,zero,0x200 patch=0,EE,20233C08,extended,24040200 // addiu a0,zero,0x200 patch=0,EE,20233C9C,extended,24040200 // addiu a0,zero,0x200 patch=0,EE,20233D24,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20233DA8,extended,24020200 // addiu v0,zero,0x200 patch=0,EE,20233E70,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234328,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,202343E4,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,202344BC,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,202346A0,extended,24040200 // addiu a0,zero,0x200 patch=0,EE,2023477C,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234864,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234950,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234A3C,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234B24,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234C0C,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20234FC0,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,202351F4,extended,24030200 // addiu v1,zero,0x200 patch=0,EE,20235290,extended,24030200 // addiu v1,zero,0x200 [No-Interlacing] gsinterlacemode=1 author=raceywacey description=Removes interlacing artefacts patch=0,EE,2026F3AC,extended,00000000 // nop patch=0,EE,2026F434,extended,00000000 // nop [Force Hi-Quality Car Models] author=Souzooka description=Forces the highest-quality LOD for car models in the overworld patch=0,EE,202217CC,extended,4480B000 // mtc1 zero,f22 // Use 0.0f as distance from camera for LOD calc (also causes 3D wheels to appear!) [Anti-Blur] author=Souzooka description=Disables after-image effect // Returns from blur function under normal circumstances (keeps blur when entering/leaving buildings) patch=0,EE,20208154,extended,14A00010 // bne $a1, $zero, 0x208198 patch=0,EE,20208158,extended,24050009 // addiu $a1, $zero, 0x9 patch=0,EE,2020815C,extended,03E00008 // jr $ra patch=0,EE,20208160,extended,27BD0010 // addiu $sp, $sp, 0x10 [Analog Steering] author=Souzooka description=Enables analog steering with the left analog stick (WIP; breaks player 2, race replays, front wheels don't turn) // First, we'll patch out the normal code which calculates steering magnitude at 0x21A3AC // The original code behaves something like this and calculates steering for all cars, including NPCs: //#define INPUT_MASK_RIGHT 0x2000; //#define INPUT_MASK_LEFT 0x8000; // //Car *car; //int grip; // Potentially not the exact value of Car->m_grip, there is a small calculation beforehand //int input_mask; //int steering_direction = car->m_steering_direction; // +0x1CE // //if (input_mask & INPUT_MASK_LEFT) //{ // // Turn to the left // if (steering_direction <= 0) // { // // Already steering left // steering_direction -= 1; // if (steering_direction < -0x20) // { // steering_direction = -0x20; // } // } // else // { // // Was turning right, whip it over // // Also save the calculated grip value in this case // car->m_grip = grip; // +0x1D8 // steering_direction = -steering_direction; // } //} //else if (input_mask & INPUT_MASK_RIGHT) //{ // // Turn to the right // if (steering_direction <= 0) // { // // Already steering right // steering_direction += 1; // if (steering_direction > 0x20) // { // steering_direction = 0x20; // } // } // else // { // // Was turning left, whip it over // // Also save the calculated grip value in this case // car->m_grip = grip; // steering_direction = -steering_direction; // } //} //else //{ // // No turn input, dampen steering towards 0 // if (grip) // { // if (steering_direction > 4) // { // steering_direction -= 4; // } // else if (steering_direction >= 0) // { // steering_direction = 0; // } // else if (steering_direction < -4) // { // steering_direction += 4; // } // else if (steering_direction <= 0) // { // steering_direction = 0; // } // } // car->m_grip = grip; //} // //car->m_steering_direction = steering_direction; // Overwrite this code with a jump to the new code and also saving some variables patch=0,EE,2021A3AC,extended,00C0A021 // addu s4,a2,zero patch=0,EE,2021A3B0,extended,02002021 // addu a0,s0,zero patch=0,EE,2021A3B4,extended,0C09E08E // jal 0x278238 (this was sceCdLayerSearchFile, which is unused) patch=0,EE,2021A3B8,extended,02202821 // addu a1,s1,zero patch=0,EE,2021A3BC,extended,02803021 // addu a2,s4,zero patch=0,EE,2021A3C0,extended,00402821 // addu a1,v0,zero patch=0,EE,2021A3C4,extended,10000024 // beq zero,zero,0x0021A458 patch=0,EE,2021A3C8,extended,86020242 // lh v0,0x242(s0) // Now at 0x278238 we'll write some assembly which roughly matches this C code: // Note scePadRead is at 00273B48 and might be useable to improve player 2 behavior later //#define INPUT_MASK_RIGHT 0x2000; //#define INPUT_MASK_LEFT 0x8000; // //int do_steer(Car *car, int input_bitmask, int grip) //{ // const float DEADZONE = 0.1f; // // // Total range of steering // float max = 32.0f; // float min = -max; // // // Range of steering as dictated by analog stick position // float delta_max = max; // float delta_min = min; // // // The change in steering direction // float delta = 0.0f; // // float steering_direction = car->m_steering_direction; // // if (input_bitmask & INPUT_MASK_LEFT) // { // delta = -1.0f; // } // else if (input_bitmask & INPUT_MASK_RIGHT) // { // delta = 1.0f; // } // // if (/* car is player */) // { // float axis = /* poll left analog stick X axis */; // if (std::fabsf(axis) >= DEADZONE) // { // delta = axis; // } // } // // delta_max *= std::fabsf(delta); // delta_min *= std::fabsf(delta); // // if (delta < 0.0f) // { // // Turning left // if (steering_direction <= 0.0f) // { // // Already turning left // if (steering_direction > delta_min) // { // steering_direction = std::fmaxf(steering_direction + delta, delta_min); // } // } // else // { // // Was turning right // car->m_grip = grip; // steering_direction = -steering_direction; // } // } // else if (delta > 0.0f) // { // // Turning right // if (steering_direction >= 0.0f) // { // // Already turning right // if (steering_direction < delta_max) // { // steering_direction = std::fminf(steering_direction + delta, delta_max); // } // } // else // { // // Was turning left // car->m_grip = grip; // steering_direction = -steering_direction; // } // } // else // { // // No turning // car->m_grip = grip; // } // // // Apply dampening // if (grip) // { // // Softer dampening if the analog stick is being held // float damp_factor = 4.0f * (1.0f - std::fabsf(delta)); // if (steering_direction > delta_max) // { // steering_direction = std::fmaxf(steering_direction - damp_factor, delta_max); // } // else if (steering_direction < delta_min) // { // steering_direction = std::fminf(steering_direction + damp_factor, delta_min); // } // } // // car->m_steering_direction = steering_direction; // return (int)steering_direction; //} patch=0,EE,20278238,extended,3C014200 // lui at,0x4200 //max = 32f patch=0,EE,2027823C,extended,44810000 // mtc1 at,f00 patch=0,EE,20278240,extended,46000047 // neg.s f01,f00 patch=0,EE,20278244,extended,C48300AC // lwc1 f03,0xAC(a0) //unused int vec4 component on Car, initialized to 0, used to store float steering magnitude patch=0,EE,20278248,extended,30A82000 // andi t0,a1,0x2000 patch=0,EE,2027824C,extended,30A98000 // andi t1,a1,0x8000 patch=0,EE,20278250,extended,3C0A3F80 // lui t2,0x3F80 patch=0,EE,20278254,extended,3C0BBF80 // lui t3,0xBF80 patch=0,EE,20278258,extended,00000821 // addu at,zero,zero //delta = 0.0f patch=0,EE,2027825C,extended,0148080B // movn at,t2,t0 //delta = 1.0f if input_bitmask & INPUT_MASK_RIGHT patch=0,EE,20278260,extended,0169080B // movn at,t3,t1 //delta = -1.0f if input_bitmask & INPUT_MASK_LEFT patch=0,EE,20278264,extended,44811000 // mtc1 at,f02 patch=0,EE,20278268,extended,3C080033 // lui t0,0x0033 patch=0,EE,2027826C,extended,8D085928 // lw t0,0x5928(t0) //bitset to help tell if car is player has control, prevents inputs in replays patch=0,EE,20278270,extended,31020040 // andi v0,t0,0x0040 patch=0,EE,20278274,extended,14400019 // bne v0,zero,0x002782DC //branch if in replay patch=0,EE,20278278,extended,31020080 // andi v0,t0,0x0080 patch=0,EE,2027827C,extended,14400017 // bne v0,zero,0x002782DC //branch if in replay patch=0,EE,20278280,extended,00000000 // nop patch=0,EE,20278284,extended,90880198 // lbu t0,0x198(a0) //player controls this car if this == 2 patch=0,EE,20278288,extended,24010002 // addiu at,zero,0x2 patch=0,EE,2027828C,extended,15010013 // bne t0,at,0x002782DC //branch if not player car patch=0,EE,20278290,extended,3C010033 // lui at,0x0033 patch=0,EE,20278294,extended,90285A86 // lbu t0,0x5A86(at) //left analog [0..255] from last scePadRead call patch=0,EE,20278298,extended,3C013C00 // lui at,0x3C00 patch=0,EE,2027829C,extended,34218081 // ori at,at,0x8081 //nextafterf(1/127.5f, 1f) // next is used so that full right gives result of >=1 after mult, instead of ~0.9999 patch=0,EE,202782A0,extended,44815800 // mtc1 at,f11 patch=0,EE,202782A4,extended,44882000 // mtc1 t0,f04 patch=0,EE,202782A8,extended,46802120 // cvt.s.w f04,f04 patch=0,EE,202782AC,extended,460B2102 // mul.s f04,f04,f11 patch=0,EE,202782B0,extended,3C013F80 // lui at,0x3F80 patch=0,EE,202782B4,extended,44815800 // mtc1 at,f11 patch=0,EE,202782B8,extended,460B2101 // sub.s f04,f04,f11 //axis now normalized to ~[-1.0..1.0f] patch=0,EE,202782BC,extended,3C013DCC // lui at,0x3DCC patch=0,EE,202782C0,extended,3421CCCD // ori at,at,0xCCCD //DEADZONE (0.1f) patch=0,EE,202782C4,extended,44815800 // mtc1 at,f11 patch=0,EE,202782C8,extended,46002285 // abs.s f10,f04 patch=0,EE,202782CC,extended,460B5034 // c.lt.s f10,f11 patch=0,EE,202782D0,extended,45010002 // bc1t 0x002782DC //branch if abs(axis) < DEADZONE patch=0,EE,202782D4,extended,00000000 // nop patch=0,EE,202782D8,extended,46002086 // mov.s f02,f04 //delta = axis patch=0,EE,202782DC,extended,460012C5 // abs.s f11,f02 patch=0,EE,202782E0,extended,460B0002 // mul.s f00,f00,f11 //delta_max *= std::fabsf(delta); patch=0,EE,202782E4,extended,460B0842 // mul.s f01,f01,f11 //delta_min *= std::fabsf(delta); patch=0,EE,202782E8,extended,44805800 // mtc1 zero,f11 patch=0,EE,202782EC,extended,460B1034 // c.lt.s f02,f11 patch=0,EE,202782F0,extended,45000007 // bc1f 0x00278310 //branch if not turning left patch=0,EE,202782F4,extended,460B1836 // c.le.s f03,f11 patch=0,EE,202782F8,extended,4500000E // bc1f 0x00278334 //branch if car was turning right patch=0,EE,202782FC,extended,46030834 // c.lt.s f01,f03 patch=0,EE,20278300,extended,4500000E // bc1f 0x0027833C //branch if delta_min is gte our last steering direction (i.e. we're steering more than the stick is pushed) patch=0,EE,20278304,extended,46021AC0 // add.s f11,f03,f02 patch=0,EE,20278308,extended,1000000C // b 0x0027833C //branch to dampening code patch=0,EE,2027830C,extended,460158E8 // max.s f03,f11,f01 //steering_direction = std::fmaxf(steering_direction + delta, delta_min); patch=0,EE,20278310,extended,46025834 // c.lt.s f11,f02 patch=0,EE,20278314,extended,45000008 // bc1f 0x00278338 //branch if not turning right patch=0,EE,20278318,extended,46035836 // c.le.s f11,f03 patch=0,EE,2027831C,extended,45000005 // bc1f 0x00278334 //branch if car was turning left patch=0,EE,20278320,extended,46001834 // c.lt.s f03,f00 patch=0,EE,20278324,extended,45000005 // bc1f 0x0027833C //branch if delta_max is lte our last steering direction (i.e. we're steering more than the stick is pushed) patch=0,EE,20278328,extended,46021AC0 // add.s f11,f03,f02 patch=0,EE,2027832C,extended,10000003 // b 0x0027833C //branch to dampening code patch=0,EE,20278330,extended,460058E9 // min.s f03,f11,f00 //steering_direction = std::fminf(steering_direction + delta, delta_max); patch=0,EE,20278334,extended,460018C7 // neg.s f03,f03 //steering_direction = -steering_direction (when changing direction) patch=0,EE,20278338,extended,AC8601D8 // sw a2,0x1D8(a0) //car->m_grip = grip (when not steering or when changing direction) patch=0,EE,2027833C,extended,10C00018 // beq a2,zero,0x002783A0 //skip dampening if grip is 0 patch=0,EE,20278340,extended,460012C5 // abs.s f11,f02 patch=0,EE,20278344,extended,3C013F80 // lui at,0x3F80 patch=0,EE,20278348,extended,44815000 // mtc1 at,f10 patch=0,EE,2027834C,extended,460B52C1 // sub.s f11,f10,f11 patch=0,EE,20278350,extended,3C014080 // lui at,0x4080 patch=0,EE,20278354,extended,44815000 // mtc1 at,f10 patch=0,EE,20278358,extended,460B5142 // mul.s f05,f10,f11 //float damp_factor = 4.0f * (1.0f - std::fabsf(delta)); patch=0,EE,2027835C,extended,44805800 // mtc1 zero,f11 patch=0,EE,20278360,extended,00000000 // nop patch=0,EE,20278364,extended,00000000 // nop patch=0,EE,20278368,extended,00000000 // nop patch=0,EE,2027836C,extended,46030034 // c.lt.s f00,f03 patch=0,EE,20278370,extended,45000003 // bc1f 0x00278380 //branch if delta_max >= steering_direction, no dampening needed patch=0,EE,20278374,extended,00000000 // nop patch=0,EE,20278378,extended,460518C1 // sub.s f03,f03,f05 patch=0,EE,2027837C,extended,460018E8 // max.s f03,f03,f00 //steering_direction = std::fmaxf(steering_direction - damp_factor, delta_max); patch=0,EE,20278380,extended,00000000 // nop patch=0,EE,20278384,extended,00000000 // nop patch=0,EE,20278388,extended,46011834 // c.lt.s f03,f01 patch=0,EE,2027838C,extended,45000004 // bc1f 0x002783A0 //branch if delta_min <= steering_direction, no dampening needed patch=0,EE,20278390,extended,00000000 // nop patch=0,EE,20278394,extended,460518C0 // add.s f03,f03,f05 patch=0,EE,20278398,extended,460118E9 // min.s f03,f03,f01 //steering_direction = std::fminf(steering_direction + damp_factor, delta_min); patch=0,EE,2027839C,extended,00000000 // nop patch=0,EE,202783A0,extended,E48300AC // swc1 f03,0xAC(a0) //Save current steering direction back to our hijacked float member patch=0,EE,202783A4,extended,460018E4 // cvt.w.s f03,f03 patch=0,EE,202783A8,extended,03E00008 // jr ra patch=0,EE,202783AC,extended,44021800 // mfc1 v0,f03 //return (int)steering_direction