mirror of
https://github.com/gligli/nulldc-360.git
synced 2025-04-02 11:11:56 -04:00
128 lines
No EOL
3 KiB
C++
128 lines
No EOL
3 KiB
C++
/*
|
|
Left-over file from HLE emulation of the bios
|
|
I think its still used when the bios is bypassed to start ELFs directly ...
|
|
*/
|
|
|
|
#include "types.h"
|
|
#include "memutil.h"
|
|
#include "sh4_mem.h"
|
|
#include "Elf.h"
|
|
|
|
u32 LoadFileToSh4Mem(u32 offset,char*file)
|
|
{
|
|
FILE * fd = fopen(file, "rb");
|
|
if (fd==NULL) {
|
|
printf("LoadFileToSh4Mem: can't load file \"%s\" to memory , file not found\n",file);
|
|
return 0;
|
|
}
|
|
|
|
u32 e_ident;
|
|
fread(&e_ident, 1,4, fd);
|
|
fseek(fd,SEEK_SET,0);
|
|
|
|
if( 0x464C457F == e_ident )
|
|
{
|
|
fclose(fd);
|
|
if(!LoadELF(file)) {
|
|
printf("!\tERROR: LoadELF(%s) has terminated unsuccessfully!\n\n",file);
|
|
return 0;
|
|
}
|
|
LoadSyscallHooks();
|
|
return 2;
|
|
}
|
|
else
|
|
{
|
|
int toff=offset;
|
|
|
|
int size;
|
|
fseek(fd,0,SEEK_END);
|
|
size=ftell(fd);
|
|
fseek(fd,0,SEEK_SET);
|
|
|
|
fread(&mem_b[toff],1,size,fd);
|
|
fclose(fd);
|
|
toff+=size;
|
|
|
|
printf("LoadFileToSh4Mem: loaded file \"%s\" to {SysMem[%x]-SysMem[%x]}\nLoadFileToSh4Mem: file size : %d bytes\n",file,offset,toff-1,toff-offset);
|
|
LoadSyscallHooks();
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
u32 LoadBinfileToSh4Mem(u32 offset,char*file)
|
|
{
|
|
u8 CheckStr[8]={0x7,0xd0,0x8,0xd1,0x17,0x10,0x5,0xdf};/* String for checking if a binary file has an inbuilt ip.bin */
|
|
u32 rv=0;
|
|
rv=LoadFileToSh4Mem(0x10000, file);
|
|
|
|
for (int i=0;i<8;i++)
|
|
{
|
|
if (ReadMem8(0x8C010000 + i+0x300)==CheckStr[i])
|
|
__noop;
|
|
else
|
|
return rv;
|
|
}
|
|
return LoadFileToSh4Mem(0x8000, file);
|
|
}
|
|
|
|
void AddHook(u32 Addr, u16 Opcode)
|
|
{
|
|
if (Addr==0)
|
|
return;
|
|
u32 Offs = (Opcode != 0x000B) ? 2 : 0;
|
|
static const u16 RtsNOP[2] = { 0x000B, 0x0009 };
|
|
|
|
|
|
if( Opcode != 0x000B ) // RTS
|
|
WriteMem16_nommu(Addr,Opcode);
|
|
|
|
WriteMem16_nommu(Addr+Offs,RtsNOP[0]);
|
|
WriteMem16_nommu(Addr+Offs+2,RtsNOP[1]);
|
|
}
|
|
|
|
|
|
#define SYSINFO_OPCODE ((u16)0x30F1) // SYSINFO - 0011 0000 1111 0001
|
|
|
|
|
|
#define dc_bios_syscall_system 0x8C0000B0
|
|
#define dc_bios_syscall_font 0x8C0000B4
|
|
#define dc_bios_syscall_flashrom 0x8C0000B8
|
|
#define dc_bios_syscall_GDrom_misc 0x8C0000BC
|
|
#define dc_bios_syscall_resets_Misc 0x8c0000E0
|
|
|
|
u32 EnabledPatches=0;
|
|
|
|
void SetPatches(u32 Value,u32 Mask)
|
|
{
|
|
EnabledPatches=(EnabledPatches&(~Mask))|Value;
|
|
LoadSyscallHooks();
|
|
}
|
|
|
|
void LoadSyscallHooks()
|
|
{
|
|
//skip em all :)
|
|
|
|
if (EnabledPatches & patch_syscall_system)
|
|
AddHook(ReadMem32(dc_bios_syscall_system),0x000B);
|
|
|
|
if (EnabledPatches & patch_syscall_font)
|
|
AddHook(ReadMem32_nommu(dc_bios_syscall_font), 0x000B);
|
|
|
|
if (EnabledPatches & patch_syscall_flashrom)
|
|
AddHook(ReadMem32_nommu(dc_bios_syscall_flashrom),0x000B);
|
|
|
|
if (EnabledPatches & patch_syscall_GDrom_misc)
|
|
AddHook(ReadMem32_nommu(dc_bios_syscall_GDrom_misc),0x000B);
|
|
|
|
|
|
|
|
if (EnabledPatches & patch_syscall_GDrom_HLE)
|
|
AddHook(0x1000, GDROM_OPCODE); // gdrom call, reads / checks status
|
|
|
|
if (EnabledPatches & patch_syscall_GDrom_HLE)
|
|
AddHook(ReadMem32_nommu(dc_bios_syscall_resets_Misc),0x000B);
|
|
|
|
if (EnabledPatches & patch_resets_Misc)
|
|
AddHook(ReadMem32_nommu(dc_bios_syscall_resets_Misc),0x000B);
|
|
|
|
} |