Skip to content

Commit

Permalink
- Implement DVD ROM/RAM dumping
Browse files Browse the repository at this point in the history
- Tidy up some patching logic
  • Loading branch information
emukidid committed Oct 9, 2016
1 parent 88eba0f commit fcb99a3
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 52 deletions.
1 change: 1 addition & 0 deletions cube/swiss/include/dvd.h
Expand Up @@ -70,4 +70,5 @@ unsigned int npdp_getid(unsigned char *dst);
void dvd_enable_patches();
void dvd_setstatus();
void dvd_setextension();
int dvd_readmem_array(u32 addr, void* buf, u32 size);
#endif
33 changes: 31 additions & 2 deletions cube/swiss/source/devices/dvd/dvd.c
Expand Up @@ -178,9 +178,24 @@ void dvd_unlock()
while (dvd[7] & 1);
}


u32 dvd_readmem_32(u32 addr)
{
dvd[0] = 0x2E;
dvd[1] = 0;
dvd[2] = 0xFE010000;
dvd[3] = addr;
dvd[4] = 0x00010000;
dvd[8] = 0;
dvd[7] = 1;

while (dvd[7] & 1);
return dvd[8];
}

int dvd_writemem_32(u32 addr, u32 dat)
{
dvd[0] = 0x2e;
dvd[0] = 0x2E;
dvd[1] = 0;
dvd[2] = 0xFE010100;
dvd[3] = addr;
Expand All @@ -190,7 +205,7 @@ int dvd_writemem_32(u32 addr, u32 dat)
dvd[7] = 3;
while (dvd[7] & 1);

dvd[0] = 0x2e;
dvd[0] = 0x2E;
dvd[1] = 0;
dvd[2] = dat;
dvd[7] = 1;
Expand All @@ -199,6 +214,20 @@ int dvd_writemem_32(u32 addr, u32 dat)
return 0;
}

int dvd_readmem_array(u32 addr, void* buf, u32 size)
{
u32* ptr = (u32*)buf;
int rem = size;

while (rem>0)
{
*ptr++ = dvd_readmem_32(addr);
addr += 4;
rem -= 4;
}
return 0;
}

int dvd_writemem_array(u32 addr, void* buf, u32 size)
{
u32* ptr = (u32*)buf;
Expand Down
47 changes: 32 additions & 15 deletions cube/swiss/source/devices/system/deviceHandler-SYS.c
Expand Up @@ -6,25 +6,29 @@
#include <malloc.h>
#include "deviceHandler-SYS.h"
#include "main.h"
#include "dvd.h"
#include "gui/FrameBufferMagic.h"

int read_rom_ipl(unsigned int offset, void* buffer, unsigned int length);
int read_rom_ipl_clear(unsigned int offset, void* buffer, unsigned int length);
int read_rom_sram(unsigned int offset, void* buffer, unsigned int length);
int read_rom_dsp_rom(unsigned int offset, void* buffer, unsigned int length);
int read_rom_dsp_coef(unsigned int offset, void* buffer, unsigned int length);
int read_rom_dvd_ram(unsigned int offset, void* buffer, unsigned int length);
int read_rom_dvd_ram_low(unsigned int offset, void* buffer, unsigned int length);
int read_rom_dvd_ram_high(unsigned int offset, void* buffer, unsigned int length);
int read_rom_dvd_rom(unsigned int offset, void* buffer, unsigned int length);

#define NUM_ROMS 7

#define NUM_ROMS 8

const char* rom_names[] =
{
"ipl.bin",
"ipl_clear.bin",
"dsp_rom.bin",
"dsp_coef.bin",
"dvd_ram.bin",
"dvd_ram_low.bin",
"dvd_ram_high.bin",
"dvd_rom.bin",
"sram.bin"
};
Expand All @@ -36,6 +40,7 @@ const int rom_sizes[] =
8 * 1024,
4 * 1024,
32 * 1024,
192 * 1024,
128 * 1024,
64
};
Expand All @@ -46,7 +51,8 @@ int (*read_rom[])(unsigned int offset, void* buffer, unsigned int length) =
read_rom_ipl_clear,
read_rom_dsp_rom,
read_rom_dsp_coef,
read_rom_dvd_ram,
read_rom_dvd_ram_low,
read_rom_dvd_ram_high,
read_rom_dvd_rom,
read_rom_sram
};
Expand Down Expand Up @@ -193,20 +199,31 @@ int read_rom_dsp_coef(unsigned int offset, void* buffer, unsigned int length) {
return 0;
}

int read_rom_dvd_ram(unsigned int offset, void* buffer, unsigned int length) {
// TODO
(void) offset;
(void) buffer;
(void) length;
return 0;
int read_rom_dvd_ram_low(unsigned int offset, void* buffer, unsigned int length) {
dvd_enable_patches();
void *ram = (void*)memalign(32, 32*1024);
dvd_readmem_array(0x8000, ram, 32*1024);
memcpy(buffer, ram + offset, length);
free(ram);
return length;
}

int read_rom_dvd_ram_high(unsigned int offset, void* buffer, unsigned int length) {
dvd_enable_patches();
void *ram = (void*)memalign(32, 192*1024);
dvd_readmem_array(0x400000, ram, 192*1024);
memcpy(buffer, ram + offset, length);
free(ram);
return length;
}

int read_rom_dvd_rom(unsigned int offset, void* buffer, unsigned int length) {
// TODO
(void) offset;
(void) buffer;
(void) length;
return 0;
dvd_enable_patches();
void *rom = (void*)memalign(32, 128*1024);
dvd_readmem_array(0xA0000, rom, 128*1024);
memcpy(buffer, rom + offset, length);
free(rom);
return length;
}

int deviceHandler_SYS_init(file_handle* file) {
Expand Down
48 changes: 13 additions & 35 deletions cube/swiss/source/patcher.c
Expand Up @@ -450,28 +450,19 @@ u32 Patch_DVDLowLevelReadForWKF(void *addr, u32 length, int dataType) {
// Overwrite the DI start to go to our code that will manipulate offsets for frag'd files.
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr + i + 0x84)-(u32)(addr));
print_gecko("Found:[%s] @ %08X for WKF\r\n", ReadCommon.Name, properAddress - 0x84);
u32 newval = (u32)(ADJUST_LBA_OFFSET - properAddress);
newval&= 0x03FFFFFC;
newval|= 0x48000001;
*(u32*)(addr + i + 0x84) = newval;
*(u32*)(addr + i + 0x84) = branchAndLink(ADJUST_LBA_OFFSET, properAddress);
return 1;
}
if(compare_pattern(&fp, &ReadDebug)) { // As above, for debug read now.
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr + i + 0x88)-(u32)(addr));
print_gecko("Found:[%s] @ %08X for WKF\r\n", ReadDebug.Name, properAddress - 0x88);
u32 newval = (u32)(ADJUST_LBA_OFFSET - properAddress);
newval&= 0x03FFFFFC;
newval|= 0x48000001;
*(u32*)(addr + i + 0x88) = newval;
*(u32*)(addr + i + 0x88) = branchAndLink(ADJUST_LBA_OFFSET, properAddress);
return 1;
}
if(compare_pattern(&fp, &ReadUncommon)) { // Same, for the less common read type.
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr + i + 0x7C)-(u32)(addr));
print_gecko("Found:[%s] @ %08X for WKF\r\n", ReadUncommon.Name, properAddress - 0x7C);
u32 newval = (u32)(ADJUST_LBA_OFFSET - properAddress);
newval&= 0x03FFFFFC;
newval|= 0x48000001;
*(u32*)(addr + i + 0x7C) = newval;
*(u32*)(addr + i + 0x7C) = branchAndLink(ADJUST_LBA_OFFSET, properAddress);
return 1;
}
}
Expand Down Expand Up @@ -501,28 +492,19 @@ u32 Patch_DVDLowLevelReadForDVD(void *addr, u32 length, int dataType) {
// Overwrite the DI start to go to our code that will manipulate offsets for frag'd files.
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr + i + 0x84)-(u32)(addr));
print_gecko("Found:[%s] @ %08X for DVD\r\n", ReadCommon.Name, properAddress - 0x84);
u32 newval = (u32)(READ_REAL_OR_PATCHED - properAddress);
newval&= 0x03FFFFFC;
newval|= 0x48000001;
*(u32*)(addr + i + 0x84) = newval;
*(u32*)(addr + i + 0x84) = branchAndLink(READ_REAL_OR_PATCHED, properAddress);
return 1;
}
if(compare_pattern(&fp, &ReadDebug)) { // As above, for debug read now.
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr + i + 0x88)-(u32)(addr));
print_gecko("Found:[%s] @ %08X for DVD\r\n", ReadDebug.Name, properAddress - 0x88);
u32 newval = (u32)(READ_REAL_OR_PATCHED - properAddress);
newval&= 0x03FFFFFC;
newval|= 0x48000001;
*(u32*)(addr + i + 0x88) = newval;
*(u32*)(addr + i + 0x88) = branchAndLink(READ_REAL_OR_PATCHED, properAddress);
return 1;
}
if(compare_pattern(&fp, &ReadUncommon)) { // Same, for the less common read type.
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr + i + 0x7C)-(u32)(addr));
print_gecko("Found:[%s] @ %08X for DVD\r\n", ReadUncommon.Name, properAddress - 0x7C);
u32 newval = (u32)(READ_REAL_OR_PATCHED - properAddress);
newval&= 0x03FFFFFC;
newval|= 0x48000001;
*(u32*)(addr + i + 0x7C) = newval;
*(u32*)(addr + i + 0x7C) = branchAndLink(READ_REAL_OR_PATCHED, properAddress);
return 1;
}
}
Expand All @@ -541,21 +523,17 @@ u32 Patch_DVDLowLevelRead(void *addr, u32 length, int dataType) {
if( find_pattern( (u8*)(addr_start), length, &OSExceptionInitSig ) )
{
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr_start + 472)-(u32)(addr));
if(properAddress) {
print_gecko("Found:[OSExceptionInit] @ %08X\r\n", properAddress);
*(u32*)(addr_start + 472) = branchAndLink(PATCHED_MEMCPY, properAddress);
patched |= 0x100;
}
print_gecko("Found:[OSExceptionInit] @ %08X\r\n", properAddress);
*(u32*)(addr_start + 472) = branchAndLink(PATCHED_MEMCPY, properAddress);
patched |= 0x100;
}
// Debug version of the above
else if( find_pattern( (u8*)(addr_start), length, &OSExceptionInitSigDBG ) )
{
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr_start + 512)-(u32)(addr));
if(properAddress) {
print_gecko("Found:[OSExceptionInitDBG] @ %08X\r\n", properAddress);
*(u32*)(addr_start + 512) = branchAndLink(PATCHED_MEMCPY_DBG, properAddress);
patched |= 0x100;
}
print_gecko("Found:[OSExceptionInitDBG] @ %08X\r\n", properAddress);
*(u32*)(addr_start + 512) = branchAndLink(PATCHED_MEMCPY_DBG, properAddress);
patched |= 0x100;
}
// Audio Streaming Hook (only if required)
else if(!swissSettings.muteAudioStreaming && find_pattern( (u8*)(addr_start), length, &DSPHandler ) )
Expand All @@ -572,7 +550,7 @@ u32 Patch_DVDLowLevelRead(void *addr, u32 length, int dataType) {
if(compare_pattern(&fp, &ReadCommon) // Common Read function
|| compare_pattern(&fp, &ReadDebug) // Debug Read function
|| compare_pattern(&fp, &ReadUncommon)) // Uncommon Read function
{
{
u32 iEnd = 4;
while(*(u32*)(addr_start + iEnd) != 0x4E800020) iEnd += 4; // branch relative from the end
u32 properAddress = Calc_ProperAddress(addr, dataType, (u32)(addr_start + iEnd)-(u32)(addr));
Expand Down

0 comments on commit fcb99a3

Please sign in to comment.