mirror of https://github.com/PCSX2/pcsx2.git
Removed some playstation (1) BIOS code and started cleaning up high level implementations of iop module functions.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2940 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
896f731eb8
commit
9de7e8be6f
|
@ -21,113 +21,6 @@
|
|||
|
||||
namespace R3000A {
|
||||
|
||||
const char *biosA0n[256] = {
|
||||
// 0x00
|
||||
"open", "lseek", "read", "write",
|
||||
"close", "ioctl", "exit", "sys_a0_07",
|
||||
"getc", "putc", "todigit", "atof",
|
||||
"strtoul", "strtol", "abs", "labs",
|
||||
// 0x10
|
||||
"atoi", "atol", "atob", "setjmp",
|
||||
"longjmp", "strcat", "strncat", "strcmp",
|
||||
"strncmp", "strcpy", "strncpy", "strlen",
|
||||
"index", "rindex", "strchr", "strrchr",
|
||||
// 0x20
|
||||
"strpbrk", "strspn", "strcspn", "strtok",
|
||||
"strstr", "toupper", "tolower", "bcopy",
|
||||
"bzero", "bcmp", "memcpy", "memset",
|
||||
"memmove", "memcmp", "memchr", "rand",
|
||||
// 0x30
|
||||
"srand", "qsort", "strtod", "malloc",
|
||||
"free", "lsearch", "bsearch", "calloc",
|
||||
"realloc", "InitHeap", "_exit", "getchar",
|
||||
"putchar", "gets", "puts", "printf",
|
||||
// 0x40
|
||||
"sys_a0_40", "LoadTest", "Load", "Exec",
|
||||
"FlushCache", "InstallInterruptHandler", "GPU_dw", "mem2vram",
|
||||
"SendGPUStatus", "GPU_cw", "GPU_cwb", "SendPackets",
|
||||
"sys_a0_4c", "GetGPUStatus", "GPU_sync", "sys_a0_4f",
|
||||
// 0x50
|
||||
"sys_a0_50", "LoadExec", "GetSysSp", "sys_a0_53",
|
||||
"_96_init()", "_bu_init()", "_96_remove()", "sys_a0_57",
|
||||
"sys_a0_58", "sys_a0_59", "sys_a0_5a", "dev_tty_init",
|
||||
"dev_tty_open", "sys_a0_5d", "dev_tty_ioctl","dev_cd_open",
|
||||
// 0x60
|
||||
"dev_cd_read", "dev_cd_close", "dev_cd_firstfile", "dev_cd_nextfile",
|
||||
"dev_cd_chdir", "dev_card_open", "dev_card_read", "dev_card_write",
|
||||
"dev_card_close", "dev_card_firstfile", "dev_card_nextfile","dev_card_erase",
|
||||
"dev_card_undelete","dev_card_format", "dev_card_rename", "dev_card_6f",
|
||||
// 0x70
|
||||
"_bu_init", "_96_init", "_96_remove", "sys_a0_73",
|
||||
"sys_a0_74", "sys_a0_75", "sys_a0_76", "sys_a0_77",
|
||||
"_96_CdSeekL", "sys_a0_79", "sys_a0_7a", "sys_a0_7b",
|
||||
"_96_CdGetStatus", "sys_a0_7d", "_96_CdRead", "sys_a0_7f",
|
||||
// 0x80
|
||||
"sys_a0_80", "sys_a0_81", "sys_a0_82", "sys_a0_83",
|
||||
"sys_a0_84", "_96_CdStop", "sys_a0_86", "sys_a0_87",
|
||||
"sys_a0_88", "sys_a0_89", "sys_a0_8a", "sys_a0_8b",
|
||||
"sys_a0_8c", "sys_a0_8d", "sys_a0_8e", "sys_a0_8f",
|
||||
// 0x90
|
||||
"sys_a0_90", "sys_a0_91", "sys_a0_92", "sys_a0_93",
|
||||
"sys_a0_94", "sys_a0_95", "AddCDROMDevice", "AddMemCardDevide",
|
||||
"DisableKernelIORedirection", "EnableKernelIORedirection", "sys_a0_9a", "sys_a0_9b",
|
||||
"SetConf", "GetConf", "sys_a0_9e", "SetMem",
|
||||
// 0xa0
|
||||
"_boot", "SystemError", "EnqueueCdIntr", "DequeueCdIntr",
|
||||
"sys_a0_a4", "ReadSector", "get_cd_status", "bufs_cb_0",
|
||||
"bufs_cb_1", "bufs_cb_2", "bufs_cb_3", "_card_info",
|
||||
"_card_load", "_card_auto", "bufs_cd_4", "sys_a0_af",
|
||||
// 0xb0
|
||||
"sys_a0_b0", "sys_a0_b1", "do_a_long_jmp", "sys_a0_b3",
|
||||
"?? sub_function",
|
||||
};
|
||||
|
||||
const char *biosB0n[256] = {
|
||||
// 0x00
|
||||
"SysMalloc", "sys_b0_01", "sys_b0_02", "sys_b0_03",
|
||||
"sys_b0_04", "sys_b0_05", "sys_b0_06", "DeliverEvent",
|
||||
"OpenEvent", "CloseEvent", "WaitEvent", "TestEvent",
|
||||
"EnableEvent", "DisableEvent", "OpenTh", "CloseTh",
|
||||
// 0x10
|
||||
"ChangeTh", "sys_b0_11", "InitPAD", "StartPAD",
|
||||
"StopPAD", "PAD_init", "PAD_dr", "ReturnFromExecption",
|
||||
"ResetEntryInt", "HookEntryInt", "sys_b0_1a", "sys_b0_1b",
|
||||
"sys_b0_1c", "sys_b0_1d", "sys_b0_1e", "sys_b0_1f",
|
||||
// 0x20
|
||||
"UnDeliverEvent", "sys_b0_21", "sys_b0_22", "sys_b0_23",
|
||||
"sys_b0_24", "sys_b0_25", "sys_b0_26", "sys_b0_27",
|
||||
"sys_b0_28", "sys_b0_29", "sys_b0_2a", "sys_b0_2b",
|
||||
"sys_b0_2c", "sys_b0_2d", "sys_b0_2e", "sys_b0_2f",
|
||||
// 0x30
|
||||
"sys_b0_30", "sys_b0_31", "open", "lseek",
|
||||
"read", "write", "close", "ioctl",
|
||||
"exit", "sys_b0_39", "getc", "putc",
|
||||
"getchar", "putchar", "gets", "puts",
|
||||
// 0x40
|
||||
"cd", "format", "firstfile", "nextfile",
|
||||
"rename", "delete", "undelete", "AddDevice",
|
||||
"RemoteDevice", "PrintInstalledDevices", "InitCARD", "StartCARD",
|
||||
"StopCARD", "sys_b0_4d", "_card_write", "_card_read",
|
||||
// 0x50
|
||||
"_new_card", "Krom2RawAdd", "sys_b0_52", "sys_b0_53",
|
||||
"_get_errno", "_get_error", "GetC0Table", "GetB0Table",
|
||||
"_card_chan", "sys_b0_59", "sys_b0_5a", "ChangeClearPAD",
|
||||
"_card_status", "_card_wait",
|
||||
};
|
||||
|
||||
const char *biosC0n[256] = {
|
||||
// 0x00
|
||||
"InitRCnt", "InitException", "SysEnqIntRP", "SysDeqIntRP",
|
||||
"get_free_EvCB_slot", "get_free_TCB_slot", "ExceptionHandler", "InstallExeptionHandler",
|
||||
"SysInitMemory", "SysInitKMem", "ChangeClearRCnt", "SystemError",
|
||||
"InitDefInt", "sys_c0_0d", "sys_c0_0e", "sys_c0_0f",
|
||||
// 0x10
|
||||
"sys_c0_10", "sys_c0_11", "InstallDevices", "FlushStfInOutPut",
|
||||
"sys_c0_14", "_cdevinput", "_cdevscan", "_circgetc",
|
||||
"_circputc", "ioabort", "sys_c0_1a", "KernelRedirect",
|
||||
"PatchAOTable",
|
||||
};
|
||||
|
||||
//#define r0 (psxRegs.GPR.n.r0)
|
||||
#define at (psxRegs.GPR.n.at)
|
||||
#define v0 (psxRegs.GPR.n.v0)
|
||||
|
@ -160,7 +53,7 @@ const char *biosC0n[256] = {
|
|||
#define sp (psxRegs.GPR.n.sp)
|
||||
#define fp (psxRegs.GPR.n.s8)
|
||||
#define ra (psxRegs.GPR.n.ra)
|
||||
#define pc0 (psxRegs.pc)
|
||||
#define pc (psxRegs.pc)
|
||||
|
||||
#define Ra0 (iopVirtMemR<char>(a0))
|
||||
#define Ra1 (iopVirtMemR<char>(a1))
|
||||
|
@ -169,42 +62,37 @@ const char *biosC0n[256] = {
|
|||
#define Rv0 (iopVirtMemR<char>(v0))
|
||||
#define Rsp (iopVirtMemR<char>(sp))
|
||||
|
||||
void bios_write() // 0x35/0x03
|
||||
int ioman_write()
|
||||
{
|
||||
if (a0 == 1) // stdout
|
||||
if (a0 == 1) // stdout
|
||||
{
|
||||
const char *ptr = Ra1;
|
||||
Console.Write( ConColor_IOP, L"%s", ShiftJIS_ConvertString(ptr, a2).c_str() );
|
||||
Console.Write( ConColor_IOP, L"%s", ShiftJIS_ConvertString(Ra1, a2).c_str() );
|
||||
}
|
||||
else
|
||||
{
|
||||
PSXBIOS_LOG("bios_%s: %x,%x,%x", biosB0n[0x35], a0, a1, a2);
|
||||
|
||||
v0 = -1;
|
||||
return 0;
|
||||
}
|
||||
pc0 = ra;
|
||||
|
||||
pc = ra;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void bios_printf() // 3f
|
||||
static u32 vararg_get(unsigned i)
|
||||
{
|
||||
return iopVirtMemR<u32>(sp)[i];
|
||||
}
|
||||
|
||||
int sysmem_Kprintf() // 3f
|
||||
{
|
||||
char tmp[1024], tmp2[1024];
|
||||
u32 save[4];
|
||||
char *ptmp = tmp;
|
||||
int n=1, i=0, j = 0;
|
||||
|
||||
memcpy(save, iopVirtMemR<void>(sp), 4*4);
|
||||
|
||||
iopMemWrite32(sp, a0);
|
||||
iopMemWrite32(sp + 4, a1);
|
||||
iopMemWrite32(sp + 8, a2);
|
||||
iopMemWrite32(sp + 12, a3);
|
||||
|
||||
// old code used phys... is iopMemRead32 more correct?
|
||||
//psxMu32(sp) = a0;
|
||||
//psxMu32(sp + 4) = a1;
|
||||
//psxMu32(sp + 8) = a2;
|
||||
//psxMu32(sp + 12) = a3;+
|
||||
|
||||
while (Ra0[i])
|
||||
{
|
||||
switch (Ra0[i])
|
||||
|
@ -282,53 +170,12 @@ _start:
|
|||
}
|
||||
*ptmp = 0;
|
||||
|
||||
// Use Read to obtain a write pointer here, since we're just writing back the
|
||||
// temp buffer we saved earlier.
|
||||
memcpy( (void*)iopVirtMemR<void>(sp), save, 4*4);
|
||||
|
||||
// Use "%s" even though it seems indirect: this avoids chaos if/when the IOP decides
|
||||
// to feed us strings that contain percentages or other printf formatting control chars.
|
||||
Console.Write( ConColor_IOP, L"%s", ShiftJIS_ConvertString(tmp).c_str(), 1023 );
|
||||
pc0 = ra;
|
||||
}
|
||||
|
||||
void bios_putchar () // 3d
|
||||
{
|
||||
// FIXME? How would we properly handle Shift-JIS here? Or is it even needed?
|
||||
Console.Write( ConColor_IOP, "%c", a0 );
|
||||
pc0 = ra;
|
||||
}
|
||||
|
||||
void bios_puts () // 3e/3f
|
||||
{
|
||||
Console.Write( ConColor_IOP, L"%s", ShiftJIS_ConvertString(Ra0).c_str() );
|
||||
pc0 = ra;
|
||||
}
|
||||
|
||||
void (*biosA0[256])();
|
||||
void (*biosB0[256])();
|
||||
void (*biosC0[256])();
|
||||
|
||||
void psxBiosInit()
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < 256; i++)
|
||||
{
|
||||
biosA0[i] = NULL;
|
||||
biosB0[i] = NULL;
|
||||
biosC0[i] = NULL;
|
||||
}
|
||||
biosA0[0x3e] = bios_puts;
|
||||
biosA0[0x3f] = bios_printf;
|
||||
|
||||
biosB0[0x3d] = bios_putchar;
|
||||
biosB0[0x3f] = bios_puts;
|
||||
|
||||
}
|
||||
|
||||
void psxBiosShutdown()
|
||||
{
|
||||
|
||||
pc = ra;
|
||||
return 1;
|
||||
}
|
||||
|
||||
} // end namespace R3000A
|
||||
|
|
|
@ -18,21 +18,8 @@
|
|||
|
||||
namespace R3000A
|
||||
{
|
||||
extern const char *biosA0n[256];
|
||||
extern const char *biosB0n[256];
|
||||
extern const char *biosC0n[256];
|
||||
|
||||
void psxBiosInit();
|
||||
void psxBiosShutdown();
|
||||
void psxBiosException();
|
||||
void psxBiosFreeze(int Mode);
|
||||
|
||||
extern void (*biosA0[256])();
|
||||
extern void (*biosB0[256])();
|
||||
extern void (*biosC0[256])();
|
||||
|
||||
extern void bios_write();
|
||||
extern void bios_printf();
|
||||
extern int ioman_write();
|
||||
extern int sysmem_Kprintf();
|
||||
|
||||
}
|
||||
#endif /* __PSXBIOS_H__ */
|
||||
|
|
|
@ -63,11 +63,9 @@ void psxReset()
|
|||
g_psxNextBranchCycle = psxRegs.cycle + 4;
|
||||
|
||||
psxHwReset();
|
||||
psxBiosInit();
|
||||
}
|
||||
|
||||
void psxShutdown() {
|
||||
psxBiosShutdown();
|
||||
//psxCpu->Shutdown();
|
||||
}
|
||||
|
||||
|
@ -103,38 +101,6 @@ void __fastcall psxException(u32 code, u32 bd)
|
|||
PSXMu32(psxRegs.CP0.n.EPC)&= ~0x02000000;
|
||||
}*/
|
||||
|
||||
if (!CHECK_IOPREC)
|
||||
{
|
||||
// HLE Bios Handlers, enabled for interpreters only.
|
||||
|
||||
u32 call = psxRegs.GPR.n.t1 & 0xff;
|
||||
switch (psxRegs.pc & 0x1fffff) {
|
||||
case 0xa0:
|
||||
|
||||
if (call != 0x28 && call != 0xe)
|
||||
PSXBIOS_LOG("Bios call a0: %s (%x) %x,%x,%x,%x", biosA0n[call], call, psxRegs.GPR.n.a0, psxRegs.GPR.n.a1, psxRegs.GPR.n.a2, psxRegs.GPR.n.a3);
|
||||
|
||||
if (biosA0[call])
|
||||
biosA0[call]();
|
||||
break;
|
||||
|
||||
case 0xb0:
|
||||
if (call != 0x17 && call != 0xb)
|
||||
PSXBIOS_LOG("Bios call b0: %s (%x) %x,%x,%x,%x", biosB0n[call], call, psxRegs.GPR.n.a0, psxRegs.GPR.n.a1, psxRegs.GPR.n.a2, psxRegs.GPR.n.a3);
|
||||
|
||||
if (biosB0[call])
|
||||
biosB0[call]();
|
||||
break;
|
||||
|
||||
case 0xc0:
|
||||
PSXBIOS_LOG("Bios call c0: %s (%x) %x,%x,%x,%x", biosC0n[call], call, psxRegs.GPR.n.a0, psxRegs.GPR.n.a1, psxRegs.GPR.n.a2, psxRegs.GPR.n.a3);
|
||||
|
||||
if (biosC0[call])
|
||||
biosC0[call]();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*if (psxRegs.CP0.n.Cause == 0x400 && (!(psxHu32(0x1450) & 0x8))) {
|
||||
hwIntcIrq(INTC_SBUS);
|
||||
}*/
|
||||
|
|
|
@ -231,15 +231,12 @@ void zeroEx()
|
|||
|
||||
if (!strncmp(lib, "ioman", 5) && code == 7) {
|
||||
if (psxRegs.GPR.n.a0 == 1) {
|
||||
pc = psxRegs.pc;
|
||||
bios_write();
|
||||
psxRegs.pc = pc;
|
||||
ioman_write();
|
||||
}
|
||||
}
|
||||
|
||||
if (!strncmp(lib, "sysmem", 6) && code == 0xe) {
|
||||
bios_printf();
|
||||
psxRegs.pc = psxRegs.GPR.n.ra;
|
||||
sysmem_Kprintf();
|
||||
}
|
||||
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue