notaz.gp2x.de
/
pcsx_rearmed.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
52b1a7c
)
psxbios: remove some globals
author
notaz
<notasas@gmail.com>
Thu, 17 Aug 2023 19:49:26 +0000
(22:49 +0300)
committer
notaz
<notasas@gmail.com>
Thu, 17 Aug 2023 22:34:05 +0000
(
01:34
+0300)
libpcsxcore/psxbios.c
patch
|
blob
|
blame
|
history
diff --git
a/libpcsxcore/psxbios.c
b/libpcsxcore/psxbios.c
index
d9fcd6a
..
bbc250b
100644
(file)
--- a/
libpcsxcore/psxbios.c
+++ b/
libpcsxcore/psxbios.c
@@
-253,11
+253,11
@@
typedef struct {
u32 mcfile;
} FileDesc;
u32 mcfile;
} FileDesc;
-static u32 heap_size = 0;
-static u32 *heap_addr = NULL;
-static u32 *heap_end = NULL;
+// todo: FileDesc layout is wrong
+// todo: get rid of these globals
static FileDesc FDesc[32];
static FileDesc FDesc[32];
-static u32 card_active_chan = 0;
+static char ffile[64], *pfile;
+static int nfile;
// fixed RAM offsets, SCPH1001 compatible
#define A_TT_ExCB 0x0100
// fixed RAM offsets, SCPH1001 compatible
#define A_TT_ExCB 0x0100
@@
-282,12
+282,17
@@
static u32 card_active_chan = 0;
#define A_PAD_IN_LEN 0x74d8
#define A_PAD_OUT_LEN 0x74e0
#define A_PAD_DR_DST 0x74c4
#define A_PAD_IN_LEN 0x74d8
#define A_PAD_OUT_LEN 0x74e0
#define A_PAD_DR_DST 0x74c4
+#define A_CARD_CHAN1 0x7500
#define A_PAD_DR_BUF1 0x7570
#define A_PAD_DR_BUF2 0x7598
#define A_EEXIT_PTR 0x75d0
#define A_EXC_STACK 0x85d8 // exception stack top
#define A_RCNT_VBL_ACK 0x8600
#define A_PAD_ACK_VBL 0x8914 // enable vint ack by pad reading code
#define A_PAD_DR_BUF1 0x7570
#define A_PAD_DR_BUF2 0x7598
#define A_EEXIT_PTR 0x75d0
#define A_EXC_STACK 0x85d8 // exception stack top
#define A_RCNT_VBL_ACK 0x8600
#define A_PAD_ACK_VBL 0x8914 // enable vint ack by pad reading code
+#define A_HEAP_BASE 0x9000
+#define A_HEAP_SIZE 0x9004
+#define A_HEAP_END 0x9008
+#define A_HEAP_FLAG 0x900c
#define A_CD_EVENTS 0xb9b8
#define A_EXC_GP 0xf450
#define A_CD_EVENTS 0xb9b8
#define A_EXC_GP 0xf450
@@
-912,24
+917,20
@@
void psxBios_bcopy() { // 0x27
pc0 = ra;
}
pc0 = ra;
}
-void psxBios_bzero() { // 0x28
- char *p = (char *)Ra0;
- v0 = a0;
+static void psxBios_bzero() { // 0x28
/* Same as memset here (See memset below) */
/* Same as memset here (See memset below) */
- if (a1 > 0x7FFFFFFF || a1 == 0)
+ u32 ret = a0;
+ if (a0 == 0 || (s32)a1 <= 0)
{
{
- v0 = 0;
- pc0 = ra;
+ mips_return_c(0, 6);
return;
}
return;
}
- else if (a0 == 0)
- {
- pc0 = ra;
- return;
+ while ((s32)a1-- > 0) {
+ storeRam8(a0++, 0);
+ use_cycles(4);
}
}
- while ((s32)a1-- > 0) *p++ = '\0';
- a1 = 0;
- pc0 = ra;
+ // todo: many more cycles due to uncached bios mem
+ mips_return_c(ret, 5);
}
void psxBios_bcmp() { // 0x29
}
void psxBios_bcmp() { // 0x29
@@
-963,23
+964,19
@@
void psxBios_memcpy() { // 0x2a
pc0 = ra;
}
pc0 = ra;
}
-void psxBios_memset() { // 0x2b
- char *p = (char *)Ra0;
- v0 = a0;
- if (a2 > 0x7FFFFFFF || a2 == 0)
+static void psxBios_memset() { // 0x2b
+ u32 ret = a0;
+ if (a0 == 0 || (s32)a2 <= 0)
{
{
- v0 = 0;
- pc0 = ra;
+ mips_return_c(0, 6);
return;
}
return;
}
- if (a0 == 0)
- {
- pc0 = ra;
- return;
+ while ((s32)a2-- > 0) {
+ storeRam8(a0++, a1);
+ use_cycles(4);
}
}
- while ((s32)a2-- > 0) *p++ = (char)a1;
- a2 = 0;
- v0 = a0; pc0 = ra;
+ // todo: many more cycles due to uncached bios mem
+ mips_return_c(ret, 5);
}
void psxBios_memmove() { // 0x2c
}
void psxBios_memmove() { // 0x2c
@@
-1142,14
+1139,16
@@
void psxBios_qsort() { // 0x31
pc0 = ra;
}
pc0 = ra;
}
-void psxBios_malloc() { // 0x33
+// this isn't how the real bios works, but maybe good enough
+static void psxBios_malloc() { // 0x33
+ u32 *heap_addr, *heap_end;
u32 *chunk, *newchunk = NULL;
unsigned int dsize = 0, csize, cstat;
int colflag;
u32 *chunk, *newchunk = NULL;
unsigned int dsize = 0, csize, cstat;
int colflag;
-#ifdef PSXBIOS_LOG
-
PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x33]
);
-#endif
- if (
!a0 || (!heap_size || !heap_addr)
) {
+ PSXBIOS_LOG("psxBios_%s %x\n", biosA0n[0x33], a0);
+
heap_addr = loadRam32ptr(A_HEAP_BASE
);
+ heap_end = loadRam32ptr(A_HEAP_END);
+ if (
heap_addr >= heap_end
) {
v0 = 0;
pc0 = ra;
return;
v0 = 0;
pc0 = ra;
return;
@@
-1246,27
+1245,24
@@
void psxBios_malloc() { // 0x33
pc0 = ra;
}
pc0 = ra;
}
-void psxBios_free() { // 0x34
-
- PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x34]);
- PSXBIOS_LOG("free %x: %x bytes\n", a0, *(u32*)(Ra0-4));
-
- if (a0)
- *(u32*)(Ra0-4) |= 1; // set chunk to free
- pc0 = ra;
+static void psxBios_free() { // 0x34
+ PSXBIOS_LOG("psxBios_%s %x (%x bytes)\n", biosA0n[0x34], a0, loadRam32(a0 - 4));
+ storeRam32(a0 - 4, loadRam32(a0 - 4) | 1); // set chunk to free
+ mips_return_void_c(5);
}
}
-void psxBios_calloc() { // 0x37
- void *pv0;
-#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x37]);
-#endif
+static void psxBios_calloc() { // 0x37
+ u32 ret, size;
+ PSXBIOS_LOG("psxBios_%s %x %x\n", biosA0n[0x37], a0, a1);
- a0 = a0 * a1;
+ a0 =
size =
a0 * a1;
psxBios_malloc();
psxBios_malloc();
- pv0 = Rv0;
- if (pv0)
- memset(pv0, 0, a0);
+ ret = v0;
+ if (ret) {
+ a0 = ret; a1 = size;
+ psxBios_bzero();
+ }
+ mips_return_c(ret, 21);
}
void psxBios_realloc() { // 0x38
}
void psxBios_realloc() { // 0x38
@@
-1299,27
+1295,16
@@
void psxBios_realloc() { // 0x38
/* InitHeap(void *block , int n) */
/* InitHeap(void *block , int n) */
-void psxBios_InitHeap() { // 0x39
- unsigned int size;
-
-#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x39]);
-#endif
-
- if (((a0 & 0x1fffff) + a1)>= 0x200000) size = 0x1ffffc - (a0 & 0x1fffff);
- else size = a1;
+static void psxBios_InitHeap() { // 0x39
+ PSXBIOS_LOG("psxBios_%s %x %x\n", biosA0n[0x39], a0, a1);
- size &= 0xfffffffc;
+ storeRam32(A_HEAP_BASE, a0);
+ storeRam32(A_HEAP_SIZE, a1);
+ storeRam32(A_HEAP_END, a0 + (a1 & ~3) + 4);
+ storeRam32(A_HEAP_FLAG, 0);
+ storeRam32(a0, 0);
- heap_addr = (u32 *)Ra0;
- heap_size = size;
- heap_end = (u32 *)((u8 *)heap_addr + heap_size);
- /* HACKFIX: Commenting out this line fixes GTA2 crash */
- //*heap_addr = SWAP32(size | 1);
-
- PSXBIOS_LOG("InitHeap %x,%x : %x %x\n",a0,a1, (int)((uptr)heap_addr-(uptr)psxM), size);
-
- pc0 = ra;
+ mips_return_void_c(14);
}
void psxBios_getchar() { //0x3b
}
void psxBios_getchar() { //0x3b
@@
-1685,19
+1670,18
@@
void psxBios_SetMem() { // 9f
}
/* TODO FIXME : Not compliant. -1 indicates failure but using 1 for now. */
}
/* TODO FIXME : Not compliant. -1 indicates failure but using 1 for now. */
-
void psxBios_get_cd_status(void) //
a6
+
static void psxBios_get_cd_status() //
a6
{
{
+ PSXBIOS_LOG("psxBios_%s\n", biosA0n[0xa6]);
v0 = 1;
pc0 = ra;
}
v0 = 1;
pc0 = ra;
}
-void psxBios__card_info() { // ab
-#ifdef PSXBIOS_LOG
+static void psxBios__card_info() { // ab
PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0);
PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0);
-#endif
u32 ret, port;
u32 ret, port;
-
card_active_chan = a0
;
- port =
card_active_chan
>> 4;
+
storeRam32(A_CARD_CHAN1, a0)
;
+ port =
a0
>> 4;
switch (port) {
case 0x0:
switch (port) {
case 0x0:
@@
-1707,9
+1691,7
@@
void psxBios__card_info() { // ab
ret = 0x0100;
break;
default:
ret = 0x0100;
break;
default:
-#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], card_active_chan);
-#endif
+ PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], a0);
ret = 0x0302;
break;
}
ret = 0x0302;
break;
}
@@
-1728,7
+1710,7
@@
void psxBios__card_load() { // ac
PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xac], a0);
#endif
PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xac], a0);
#endif
-
card_active_chan = a0
;
+
storeRam32(A_CARD_CHAN1, a0)
;
// DeliverEvent(0xf0000011, 0x0004);
DeliverEvent(0xf4000001, 0x0004);
// DeliverEvent(0xf0000011, 0x0004);
DeliverEvent(0xf4000001, 0x0004);
@@
-2221,9
+2203,6
@@
static void psxBios_UnDeliverEvent() { // 0x20
mips_return(ret);
}
mips_return(ret);
}
-char ffile[64], *pfile;
-int nfile;
-
static void buopen(int mcd, char *ptr, char *cfg)
{
int i;
static void buopen(int mcd, char *ptr, char *cfg)
{
int i;
@@
-2683,7
+2662,7
@@
void psxBios__card_write() { // 0x4e
v0 = 0; pc0 = ra;
return;
}
v0 = 0; pc0 = ra;
return;
}
-
card_active_chan = a0
;
+
storeRam32(A_CARD_CHAN1, a0)
;
port = a0 >> 4;
if (pa2 != INVALID_PTR) {
port = a0 >> 4;
if (pa2 != INVALID_PTR) {
@@
-2719,7
+2698,7
@@
void psxBios__card_read() { // 0x4f
v0 = 0; pc0 = ra;
return;
}
v0 = 0; pc0 = ra;
return;
}
-
card_active_chan = a0
;
+
storeRam32(A_CARD_CHAN1, a0)
;
port = a0 >> 4;
if (pa2 != INVALID_PTR) {
port = a0 >> 4;
if (pa2 != INVALID_PTR) {
@@
-2810,13
+2789,14
@@
void psxBios_GetB0Table() { // 57
mips_return_c(A_B0_TABLE, 3);
}
mips_return_c(A_B0_TABLE, 3);
}
-void psxBios__card_chan() { // 0x58
-#ifdef PSXBIOS_LOG
+
static
void psxBios__card_chan() { // 0x58
+ u32 ret;
PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x58]);
PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x58]);
-#endif
- v0 = card_active_chan;
- pc0 = ra;
+ // todo: should return active slot chan
+ // (active - which was last processed by irq code)
+ ret = loadRam32(A_CARD_CHAN1);
+ mips_return_c(ret, 8);
}
static void psxBios_ChangeClearPad() { // 5b
}
static void psxBios_ChangeClearPad() { // 5b
@@
-2828,21
+2808,17
@@
static void psxBios_ChangeClearPad() { // 5b
mips_return_c(ret, 6);
}
mips_return_c(ret, 6);
}
-void psxBios__card_status() { // 5c
-#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x5c], a0);
-#endif
+static void psxBios__card_status() { // 5c
+ PSXBIOS_LOG("psxBios_%s %x\n", biosB0n[0x5c], a0);
- v0 =
card_active_chan;
+ v0 =
1; // ready
pc0 = ra;
}
pc0 = ra;
}
-void psxBios__card_wait() { // 5d
-#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x5d], a0);
-#endif
+static void psxBios__card_wait() { // 5d
+ PSXBIOS_LOG("psxBios_%s %x\n", biosB0n[0x5d], a0);
- v0 = 1;
+ v0 = 1;
// ready
pc0 = ra;
}
pc0 = ra;
}
@@
-3523,11
+3499,7
@@
void psxBiosInit() {
//************** THE END ***************************************
/**/
//************** THE END ***************************************
/**/
- heap_addr = NULL;
- heap_end = NULL;
- heap_size = 0;
memset(FDesc, 0, sizeof(FDesc));
memset(FDesc, 0, sizeof(FDesc));
- card_active_chan = 0;
// initial RNG seed
psxMu32ref(0x9010) = SWAPu32(0xac20cc00);
// initial RNG seed
psxMu32ref(0x9010) = SWAPu32(0xac20cc00);
@@
-3945,8
+3917,5
@@
void psxBiosException() {
void psxBiosFreeze(int Mode) {
u32 base = 0x40000;
void psxBiosFreeze(int Mode) {
u32 base = 0x40000;
- bfreezepsxMptr(heap_addr, u32);
bfreezes(FDesc);
bfreezes(FDesc);
- bfreezel(&card_active_chan);
- bfreezel(&heap_size);
}
}