u32 Apploader_Run() { app_entry appldr_entry; app_init appldr_init; app_main appldr_main; app_final appldr_final; char *dst; u32 len, offset; sync_before_read(TGCInfo, sizeof(struct _TGCInfo)); /* Read apploader header */ DVDLowRead(&apploader_hdr, 0x20, TGCInfo->tgcoffset + APPLDR_OFFSET); /* Calculate apploader length */ u32 appldr_len = apploader_hdr.size + apploader_hdr.trailersize; /* Read apploader code */ DVDLowRead(appldr, appldr_len, TGCInfo->tgcoffset + APPLDR_CODE); /* Flush into memory */ sync_before_exec(appldr, appldr_len); /* Set basic information */ *(vu32*)0x800000F8 = 243000000; // Bus Clock Speed *(vu32*)0x800000FC = 729000000; // CPU Clock Speed /* Set apploader entry function */ appldr_entry = apploader_hdr.entry; /* Call apploader entry */ appldr_entry(&appldr_init, &appldr_main, &appldr_final); /* Initialize apploader */ appldr_init(noprintf); while(appldr_main(&dst, &len, &offset)) { /* Read data from DVD */ PrepareTGC( offset ); DVDLowRead( dst, len, offset + TGCInfo->tgcoffset ); ParseTGC( dst, len, offset ); } /* Set entry point from apploader */ return (u32)appldr_final(); }
u32 DumpFile( char *FileName, u64 Offset, u32 Size ) { DVDLowRead( DVDBuffer, Offset, (Size+31) & (~31) ); // align reads by 32 bytes, doesn't effect final filesize! s32 fd = DVDOpen( FileName ); if( fd < 0 ) { DVDError = DI_FATAL|(0x20<<16); return 2; } else { if( DVDWrite( fd, DVDBuffer, Size ) != Size ) { DVDError = DI_FATAL|(0x21<<16); DVDClose( fd ); return 2; } DVDWrote += Size; DVDClose( fd ); } return 1; }