void reios_boot() { //setup syscalls //find boot file //boot it memset(GetMemPtr(0x8C000000, 0), 0xFF, 64 * 1024); setup_syscall(hook_addr(&reios_sys_system), dc_bios_syscall_system); setup_syscall(hook_addr(&reios_sys_font), dc_bios_syscall_font); setup_syscall(hook_addr(&reios_sys_flashrom), dc_bios_syscall_flashrom); setup_syscall(hook_addr(&reios_sys_gd), dc_bios_syscall_gd); setup_syscall(hook_addr(&reios_sys_misc), dc_bios_syscall_misc); WriteMem32(dc_bios_entrypoint_gd_do_bioscall, REIOS_OPCODE); //Infinitive loop for arm ! WriteMem32(0x80800000, 0xEAFFFFFE); if (settings.reios.ElfFile.size()) { if (!reios_loadElf(settings.reios.ElfFile)) { msgboxf("Failed to open %s\n", MBX_ICONERROR, settings.reios.ElfFile.c_str()); } reios_setup_state(0x8C010000); } else { const char* bootfile = reios_locate_ip(); if (!bootfile || !reios_locate_bootfile(bootfile)) msgboxf("Failed to locate bootfile", MBX_ICONERROR); reios_setup_state(0xac008300); } }
void reios_sys_system() { debugf("reios_sys_system\n"); u32 cmd = Sh4cntx.r[7]; switch (cmd) { case 0: //SYSINFO_INIT Sh4cntx.r[0] = 0; break; case 2: //SYSINFO_ICON { printf("SYSINFO_ICON\n"); /* r4 = icon number (0-9, but only 5-9 seems to really be icons) r5 = destination buffer (704 bytes in size) */ Sh4cntx.r[0] = 704; } break; case 3: //SYSINFO_ID { WriteMem32(SYSINFO_ID_ADDR + 0, 0xe1e2e3e4); WriteMem32(SYSINFO_ID_ADDR + 4, 0xe5e6e7e8); Sh4cntx.r[0] = SYSINFO_ID_ADDR; } break; default: printf("unhandled: reios_sys_system\n"); break; } }
static void reios_boot(void) { printf("-----------------\n"); printf("REIOS: Booting up\n"); printf("-----------------\n"); //setup syscalls //find boot file //boot it memset(GetMemPtr(0x8C000000, 0), 0xFF, 64 * 1024); setup_syscall(hook_addr(&reios_sys_system), dc_bios_syscall_system); setup_syscall(hook_addr(&reios_sys_font), dc_bios_syscall_font); setup_syscall(hook_addr(&reios_sys_flashrom), dc_bios_syscall_flashrom); setup_syscall(hook_addr(&reios_sys_gd), dc_bios_syscall_gd); setup_syscall(hook_addr(&reios_sys_misc), dc_bios_syscall_misc); WriteMem32(dc_bios_entrypoint_gd_do_bioscall, REIOS_OPCODE); //Infinitive loop for arm ! WriteMem32(0x80800000, 0xEAFFFFFE); if (settings.reios.ElfFile.size()) { if (!reios_loadElf(settings.reios.ElfFile)) msgboxf("Failed to open %s\n", MBX_ICONERROR, settings.reios.ElfFile.c_str()); reios_setup_state(0x8C010000); } else { if (DC_PLATFORM == DC_PLATFORM_DREAMCAST) { if (!bootfile_inited) msgboxf("Failed to locate bootfile", MBX_ICONERROR); reios_setup_state(0xac008300); } else { verify(DC_PLATFORM == DC_PLATFORM_NAOMI); u32* sz = (u32*)naomi_cart_GetPtr(0x368, 4); if (!sz) { msgboxf("Naomi boot failure", MBX_ICONERROR); } int size = *sz; verify(size < RAM_SIZE && naomi_cart_GetPtr(size - 1, 1) && "Invalid cart size"); WriteMemBlock_nommu_ptr(0x0c020000, (u32*)naomi_cart_GetPtr(0, size), size); reios_setuo_naomi(0x0c021000); } } }
void setup_syscall(u32 hook_addr, u32 syscall_addr) { WriteMem32(syscall_addr, hook_addr); WriteMem16(hook_addr, REIOS_OPCODE); debugf("reios: Patching syscall vector %08X, points to %08X\n", syscall_addr, hook_addr); debugf("reios: - address %08X: data %04X [%04X]\n", hook_addr, ReadMem16(hook_addr), REIOS_OPCODE); }
/* - gdGdcReqCmd, 0 - gdGdcGetCmdStat, 1 - gdGdcExecServer, 2 - gdGdcInitSystem, 3 - gdGdcGetDrvStat, 4 */ void gd_do_bioscall() { //looks like the "real" entrypoint for this on a dreamcast gdrom_hle_op(); return; /* int func1, func2, arg1, arg2; */ switch (Sh4cntx.r[7]) { case 0: //gdGdcReqCmd, wth is r6 ? GD_HLE_Command(Sh4cntx.r[4], Sh4cntx.r[5]); Sh4cntx.r[0] = 0xf344312e; break; case 1: //gdGdcGetCmdStat, r4 -> id as returned by gdGdcReqCmd, r5 -> buffer to get status in ram, r6 ? Sh4cntx.r[0] = 0; //All good, no status info break; case 2: //gdGdcExecServer //nop? returns something, though. //Bios seems to be based on a cooperative threading model //this is the "context" switch entry point break; case 3: //gdGdcInitSystem //nop? returns something, though. break; case 4: //gdGdcGetDrvStat /* Looks to same as GDROM_CHECK_DRIVE */ WriteMem32(Sh4cntx.r[4] + 0, 0x02); // STANDBY WriteMem32(Sh4cntx.r[4] + 4, 0x80); // CDROM | 0x80 for GDROM Sh4cntx.r[0] = 0; // RET SUCCESS break; default: printf("gd_do_bioscall: (%d) %d, %d, %d\n", Sh4cntx.r[4], Sh4cntx.r[5], Sh4cntx.r[6], Sh4cntx.r[7]); break; } //gdGdcInitSystem }