44#include "ps2cstd.h"
55#include "ps2iop.h"
66#include "ps2rpc.h"
7+ #include "ps2cdvd.h"
78
8- typedef int (* readBufferInternal_t )(char * , int , int , void * , int , int );
9- readBufferInternal_t readBufferInternal ;
9+ int no_reset = 0 ;
1010
1111static void setup_pointers () {
1212 u32 * video_ts_ifo_300e = (u32 * )0x009091a0 ;
1313 u32 * video_ts_ifo_300u = (u32 * )0x009090a0 ;
1414 u32 * video_ts_ifo_300j = (u32 * )0x00684920 ;
15+ u32 * video_ts_ifo_302e = (u32 * )0x0090c310 ;
16+ u32 * video_ts_ifo_302c = (u32 * )0x006ee290 ;
1517 if (video_ts_ifo_300e [0 ] == 0x45444956 ) {
16- readBufferInternal = (readBufferInternal_t )0x00244438 ;
1718 sceSifSyncIop = (sceSifSyncIop_t )0x00283460 ;
1819 sceSifResetIop = (sceSifResetIop_t )0x002832f8 ;
1920 sceSifInitRpc = (sceSifInitRpc_t )0x00207c60 ;
2021 sceSifExitRpc = (sceSifExitRpc_t )0x00207e00 ;
22+ sceSifCallRpc = (sceSifCallRpc_t )0x002084a0 ;
23+ sceSifWriteBackDCache = (sceSifWriteBackDCache_t )0x00209fc0 ;
24+ sceCdNCmdDiskReady = (sceCdNCmdDiskReady_t )0x00268a58 ;
25+ _sceCd_ncmd_prechk = (_sceCd_ncmd_prechk_t )0x002688e8 ;
26+ _sceCd_cd_read_intr = (_sceCd_cd_read_intr_t )0x002682ac ;
27+ sceCdSync = (sceCdSync_t )0x00268af0 ;
28+ sceCdDiskReady = (sceCdDiskReady_t )0x00268ff0 ;
29+ sceCdCbfunc_num = (int * )0x008c9114 ;
30+ _sceCd_c_cb_sem = (int * )0x008c90f0 ;
31+ _sceCd_cd_ncmd = (void * )0x008ca290 ;
32+ _sceCd_ncmd_semid = (int * )0x008c90e8 ;
2133 } else if (video_ts_ifo_300u [0 ] == 0x45444956 ) {
22- readBufferInternal = (readBufferInternal_t )0x00244378 ;
2334 sceSifSyncIop = (sceSifSyncIop_t )0x00283340 ;
2435 sceSifResetIop = (sceSifResetIop_t )0x002831d8 ;
2536 sceSifInitRpc = (sceSifInitRpc_t )0x00207c60 ;
2637 sceSifExitRpc = (sceSifExitRpc_t )0x00207e00 ;
38+ sceSifCallRpc = (sceSifCallRpc_t )0x002084a0 ;
39+ sceSifWriteBackDCache = (sceSifWriteBackDCache_t )0x00209fc0 ;
40+ sceCdNCmdDiskReady = (sceCdNCmdDiskReady_t )0x00268938 ;
41+ _sceCd_ncmd_prechk = (_sceCd_ncmd_prechk_t )0x002687c8 ;
42+ _sceCd_cd_read_intr = (_sceCd_cd_read_intr_t )0x00268190 ;
43+ sceCdSync = (sceCdSync_t )0x002689d0 ;
44+ sceCdDiskReady = (sceCdDiskReady_t )0x00268ed0 ;
45+ sceCdCbfunc_num = (int * )0x008c9014 ;
46+ _sceCd_c_cb_sem = (int * )0x008c8ff0 ;
47+ _sceCd_cd_ncmd = (void * )0x008ca190 ;
48+ _sceCd_ncmd_semid = (int * )0x008c8fe8 ;
49+ no_reset = 1 ; // For some reason 3.00U breaks if the IOP is reset
2750 } else if (video_ts_ifo_300j [0 ] == 0x45444956 ) {
28- readBufferInternal = (readBufferInternal_t )0x00244018 ;
2951 sceSifSyncIop = (sceSifSyncIop_t )0x002834f0 ;
3052 sceSifResetIop = (sceSifResetIop_t )0x00283388 ;
3153 sceSifInitRpc = (sceSifInitRpc_t )0x00207c60 ;
3254 sceSifExitRpc = (sceSifExitRpc_t )0x00207e00 ;
55+ sceSifCallRpc = (sceSifCallRpc_t )0x002084a0 ;
56+ sceSifWriteBackDCache = (sceSifWriteBackDCache_t )0x00209fc0 ;
57+ sceCdNCmdDiskReady = (sceCdNCmdDiskReady_t )0x00268ae0 ;
58+ _sceCd_ncmd_prechk = (_sceCd_ncmd_prechk_t )0x00268970 ;
59+ _sceCd_cd_read_intr = (_sceCd_cd_read_intr_t )0x00268338 ;
60+ sceCdSync = (sceCdSync_t )0x00268b78 ;
61+ sceCdDiskReady = (sceCdDiskReady_t )0x00269078 ;
62+ sceCdCbfunc_num = (int * )0x00644894 ;
63+ _sceCd_c_cb_sem = (int * )0x00644870 ;
64+ _sceCd_cd_ncmd = (void * )0x00645a10 ;
65+ _sceCd_ncmd_semid = (int * )0x00644868 ;
66+ } else if (video_ts_ifo_302e [0 ] == 0x45444956 ) {
67+ sceSifSyncIop = (sceSifSyncIop_t )0x00284d00 ;
68+ sceSifResetIop = (sceSifResetIop_t )0x00284b98 ;
69+ sceSifInitRpc = (sceSifInitRpc_t )0x00207ce0 ;
70+ sceSifExitRpc = (sceSifExitRpc_t )0x00207e80 ;
71+ sceSifCallRpc = (sceSifCallRpc_t )0x00208520 ;
72+ sceSifWriteBackDCache = (sceSifWriteBackDCache_t )0x0020a040 ;
73+ sceCdNCmdDiskReady = (sceCdNCmdDiskReady_t )0x00258b00 ;
74+ _sceCd_ncmd_prechk = (_sceCd_ncmd_prechk_t )0x00258990 ;
75+ _sceCd_cd_read_intr = (_sceCd_cd_read_intr_t )0x00258358 ;
76+ sceCdSync = (sceCdSync_t )0x00258b98 ;
77+ sceCdDiskReady = (sceCdDiskReady_t )0x00259098 ;
78+ sceCdCbfunc_num = (int * )0x004d4254 ;
79+ _sceCd_c_cb_sem = (int * )0x004d4230 ;
80+ _sceCd_cd_ncmd = (void * )0x004d53d0 ;
81+ _sceCd_ncmd_semid = (int * )0x004d4228 ;
82+ } else if (video_ts_ifo_302c [0 ] == 0x45444956 ) {
83+ sceSifSyncIop = (sceSifSyncIop_t )0x00284f30 ;
84+ sceSifResetIop = (sceSifResetIop_t )0x00284dc8 ;
85+ sceSifInitRpc = (sceSifInitRpc_t )0x00207ce0 ;
86+ sceSifExitRpc = (sceSifExitRpc_t )0x00207e80 ;
87+ sceSifCallRpc = (sceSifCallRpc_t )0x00208520 ;
88+ sceSifWriteBackDCache = (sceSifWriteBackDCache_t )0x0020a040 ;
89+ sceCdNCmdDiskReady = (sceCdNCmdDiskReady_t )0x00258ae0 ;
90+ _sceCd_ncmd_prechk = (_sceCd_ncmd_prechk_t )0x00258970 ;
91+ _sceCd_cd_read_intr = (_sceCd_cd_read_intr_t )0x00258338 ;
92+ sceCdSync = (sceCdSync_t )0x00258b78 ;
93+ sceCdDiskReady = (sceCdDiskReady_t )0x00259078 ;
94+ sceCdCbfunc_num = (int * )0x004d4454 ;
95+ _sceCd_c_cb_sem = (int * )0x004d4430 ;
96+ _sceCd_cd_ncmd = (void * )0x004d55d0 ;
97+ _sceCd_ncmd_semid = (int * )0x004d4428 ;
3398 }
3499}
35100
101+ int readSector (int n , u8 * s ) {
102+ const int max_tries = 30 ;
103+ int tries = 0 ;
104+ sceCdRMode rm ;
105+ rm .spindlctrl = SCECdSpinNom ;
106+ rm .datapattern = SCECdSecS2048 ;
107+ rm .trycount = max_tries ;
108+
109+ while (tries < max_tries ) {
110+ sceCdDiskReady (0 );
111+ if (sceCdReadDVDV (n , 1 , s , & rm )) {
112+ break ;
113+ }
114+ ++ tries ;
115+ }
116+ if (tries == max_tries ) {
117+ return -1 ;
118+ }
119+ sceCdSync (0 );
120+ return 0 ;
121+ }
122+
36123static void readDiscData (int off , u8 * dest , int len ) {
37- u8 tmp [0x800 ];
124+ u8 tmp [2064 ];
38125 if (len <= 0 ) {
39126 return ;
40127 }
@@ -44,27 +131,28 @@ static void readDiscData(int off, u8 *dest, int len) {
44131 if (skip ) {
45132 int first = 0x800 - skip ;
46133 if (first > len ) first = len ;
47- readBufferInternal ( "" , 0 , s ++ , tmp , 1 , 0 );
48- memcpy (dest , & tmp [skip ], first );
134+ readSector ( s ++ , tmp );
135+ memcpy (dest , & tmp [12 + skip ], first );
49136 dest += first ;
50137 len -= first ;
51138 }
52139 int sc = len >> 11 ;
53140 for (int i = 0 ; i < sc ; ++ i ) {
54- readBufferInternal ( "" , 0 , s ++ , tmp , 1 , 0 );
55- memcpy (dest , tmp , 0x800 );
141+ readSector ( s ++ , tmp );
142+ memcpy (dest , & tmp [ 12 ] , 0x800 );
56143 dest += 0x800 ;
57144 }
58145 int rem = len - (sc << 11 );
59146 if (rem > 0 ) {
60- readBufferInternal ( "" , 0 , s , tmp , 1 , 0 );
61- memcpy (dest , tmp , rem );
147+ readSector ( s , tmp );
148+ memcpy (dest , & tmp [ 12 ] , rem );
62149 }
63150}
64151
65152void main () {
66- int off = ( 396 - 278 ) << 11 ;
153+ int off = 516 << 11 ;
67154 Elf32_Ehdr ehdr ;
155+
68156 readDiscData (off , (u8 * )& ehdr , sizeof (Elf32_Ehdr ));
69157
70158 // Validate ELF header
@@ -89,10 +177,12 @@ void main() {
89177 }
90178 FlushCache (0 );
91179 FlushCache (2 );
92- /*sceSifResetIop("rom0:UDNL rom0:EELOADCNF", 0);
93- while(!sceSifSyncIop());*/
94180 sceSifInitRpc (0 );
95181 sceSifExitRpc ();
182+ if (!no_reset ) {
183+ sceSifResetIop ("rom0:UDNL rom0:EELOADCNF" , 0 );
184+ while (!sceSifSyncIop ());
185+ }
96186 ExecPS2 ((void * )(unsigned long )ehdr .e_entry , 0 , 0 , NULL );
97187}
98188
0 commit comments