Skip to content

Commit b3eb5d2

Browse files
committed
Gameboy MBC
1 parent 49b3d0e commit b3eb5d2

File tree

7 files changed

+135
-21
lines changed

7 files changed

+135
-21
lines changed

include/functions.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ void Yay0_Decompress(void* src, void* dst);
2121
// DDC0.s
2222
void func_8000D564(void);
2323

24-
// E570.s
25-
void func_8000D970(OSPfs *);
26-
2724
// exception_set.s
2825
void set_watch_lohi(s32);
2926

linker_scripts/us/symbol_addrs_code.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,9 @@ func_8000D678 = 0x8000D678; // type:func
346346
func_8000D738 = 0x8000D738; // type:func
347347
func_8000D8A8 = 0x8000D8A8; // type:func
348348
func_8000D8DC = 0x8000D8DC; // type:func
349-
func_8000D970 = 0x8000D970; // type:func
350-
func_8000DA78 = 0x8000DA78; // type:func
351-
func_8000DAFC = 0x8000DAFC; // type:func
349+
osGbmbcRamEnable = 0x8000D970; // type:func
350+
osGbmbcSelectRamBank = 0x8000DA78; // type:func
351+
osGbmbcReadWrite = 0x8000DAFC; // type:func
352352
func_8000DC90 = 0x8000DC90; // type:func
353353
func_8000DD68 = 0x8000DD68; // type:func
354354
func_8000DDB0 = 0x8000DDB0; // type:func

src/E570.c

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/gb_mbc.c

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*
2+
* GameBoy MBC (Memory Bank Controller) functions
3+
* for use with the Nintendo 64 Transfer Pak
4+
*/
5+
#include "global.h"
6+
7+
#define MBC_RAM_ENABLE 0x0000
8+
#define MBC_ROM_BANK_ADDRESS 0x2000
9+
#define MBC_RAM_BANK_ADDRESS 0x4000
10+
#define MBC_BANKING_MODE 0x6000
11+
#define RAM_BASE_ADDRESS 0xA000
12+
#define RAM_BANK_NONE 0XFF;
13+
#define ERRCK(fn) \
14+
ret = fn; \
15+
if (ret != 0) \
16+
return ret
17+
18+
// Track ram banks for channels
19+
extern u8 D_800AA670[16];
20+
21+
// #pragma GLOBAL_ASM("asm/us/nonmatchings/gb_mbc/osGbmbcRamEnable.s")
22+
s32 osGbmbcRamEnable(OSPfs* pfs) {
23+
s32 i;
24+
s32 ret;
25+
u8 status;
26+
u8 buffer[BLOCKSIZE];
27+
28+
ret = osGbpakGetStatus(pfs, &status);
29+
if (ret != 0) {
30+
return ret;
31+
}
32+
for (i = 0; i < BLOCKSIZE; i++) {
33+
buffer[i] = 1;
34+
}
35+
// Select Banking Mode 1
36+
ERRCK(osGbpakReadWrite(pfs, OS_WRITE, MBC_BANKING_MODE, buffer, BLOCKSIZE));
37+
38+
for (i = 0; i < BLOCKSIZE; i++) buffer[i] = 0;
39+
40+
buffer[0x1F] = 0xA;
41+
42+
ERRCK(osGbpakReadWrite(pfs, OS_WRITE, MBC_RAM_ENABLE, buffer, BLOCKSIZE));
43+
44+
D_800AA670[pfs->channel] = RAM_BANK_NONE;
45+
46+
ret = osGbpakGetStatus(pfs, &status);
47+
if ((ret == 0) && !(status & OS_GBPAK_POWER)) {
48+
ret = PFS_ERR_CONTRFAIL;
49+
}
50+
return ret;
51+
}
52+
53+
// #pragma GLOBAL_ASM("asm/us/nonmatchings/gb_mbc/osGbmbcSelectRamBank.s")
54+
s32 osGbmbcSelectRamBank(OSPfs* pfs, u8 bank) {
55+
s32 i;
56+
s32 ret;
57+
u8 buffer[BLOCKSIZE];
58+
59+
for (i = 0; i < BLOCKSIZE; i++) buffer[i] = bank;
60+
61+
ret = osGbpakReadWrite(pfs, OS_WRITE, MBC_RAM_BANK_ADDRESS, buffer, BLOCKSIZE);
62+
if (ret == 0) {
63+
D_800AA670[pfs->channel] = bank;
64+
}
65+
return ret;
66+
}
67+
68+
#ifdef NON_MATCHING
69+
s32 osGbmbcReadWrite(OSPfs* pfs, u16 flag, u32 address, u8* buffer, u32 size) {
70+
s32 ret;
71+
s32 var_s0;
72+
u8 status;
73+
u8 var_s2;
74+
75+
ERRCK(osGbpakGetStatus(pfs, &status));
76+
77+
var_s2 = (address >> 0xD);
78+
if (var_s2 != D_800AA670[pfs->channel]) {
79+
ERRCK(osGbmbcSelectRamBank(pfs, var_s2));
80+
}
81+
address &= 0x1FFF;
82+
var_s0 = address + size;
83+
84+
while (var_s0 > MBC_ROM_BANK_ADDRESS) {
85+
var_s0 -= MBC_ROM_BANK_ADDRESS;
86+
ret = osGbpakReadWrite(pfs, flag, address + RAM_BASE_ADDRESS, buffer, MBC_ROM_BANK_ADDRESS - address);
87+
if (ret != 0) {
88+
goto end;
89+
}
90+
buffer = (buffer - address) + MBC_ROM_BANK_ADDRESS;
91+
var_s2++;
92+
ret = osGbmbcSelectRamBank(pfs, var_s2);
93+
if (ret != 0) {
94+
goto end;
95+
}
96+
size = var_s0;
97+
address = 0;
98+
if (0) { }
99+
}
100+
101+
ret = osGbpakReadWrite(pfs, flag, address + RAM_BASE_ADDRESS, buffer, size);
102+
103+
end:
104+
if (ret == 0) {
105+
ret = osGbpakGetStatus(pfs, &status);
106+
}
107+
108+
if ((ret == 0) && !(status & 1)) {
109+
ret = PFS_ERR_CONTRFAIL;
110+
}
111+
return ret;
112+
}
113+
#else
114+
#pragma GLOBAL_ASM("asm/us/nonmatchings/gb_mbc/osGbmbcReadWrite.s")
115+
#endif

src/gb_mbc.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef _SRC_GB_MBC_H_
2+
#define _SRC_GB_MBC_H_
3+
4+
#include "global.h"
5+
6+
s32 osGbmbcRamEnable(OSPfs*);
7+
s32 osGbmbcSelectRamBank(OSPfs*, u8);
8+
s32 osGbmbcReadWrite(OSPfs*, u16, u32, u8*, u32);
9+
10+
#endif /* _SRC_GB_MBC_H_ */

src/gb_tower.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
#include "hal_libc.h"
33
#include "controller.h"
44
#include "29BA0.h"
5-
6-
extern s32 func_8000DAFC(void*, s32, u16, s32, s32);
5+
#include "gb_mbc.h"
76

87
// gb_tower.c
98
// dont forget to pass -signed when compiling
@@ -76,7 +75,7 @@ s32 func_8000A798(s32 arg0, u8* arg1, u8* arg2) {
7675
func_8002B274(arg0, 1);
7776
}
7877
if ((status & OS_GBPAK_RSTB_STATUS) && (osGbpakCheckConnector(&D_800A8100[arg0], &status) == 0)) {
79-
func_8000D970(&D_800A8100[arg0]);
78+
osGbmbcRamEnable(&D_800A8100[arg0]);
8079
sp28 = func_8000A6D8(arg0, arg2);
8180
}
8281
D_800A82A0[arg0] = 1;
@@ -160,7 +159,7 @@ s32 func_8000AA7C(void) {
160159
// what. the redundant temp_v0 functionless check is apparently needed to match.
161160
}
162161
if (osGbpakCheckConnector(&D_800A8100[i], &status) == 0) {
163-
func_8000D970(&D_800A8100[i]);
162+
osGbmbcRamEnable(&D_800A8100[i]);
164163
D_800A82A0[i] = 1;
165164
D_800A82A5 |= (1 << i);
166165
} else {
@@ -215,7 +214,7 @@ s32 func_8000AD68(s32 arg0) {
215214
(osGbpakReadId(&D_800A8100[arg0], &sp28, &status) == 0) && (status & OS_GBPAK_RSTB_STATUS) &&
216215
(osGbpakCheckConnector(&D_800A8100[arg0], &status) == 0)) {
217216

218-
func_8000D970(&D_800A8100[arg0]);
217+
osGbmbcRamEnable(&D_800A8100[arg0]);
219218
D_800A82A0[arg0] = 1;
220219
}
221220

@@ -240,7 +239,7 @@ s32 func_8000AEBC(s32 arg0, void* arg1, u16 arg2, u16 arg3) {
240239

241240
var_v1 = 1;
242241
if (D_800A82A5 & (1 << arg0)) {
243-
var_v1 = func_8000DAFC(&D_800A8100[arg0], 0, arg2, arg1, arg3);
242+
var_v1 = osGbmbcReadWrite(&D_800A8100[arg0], 0, arg2, arg1, arg3);
244243
}
245244
return var_v1;
246245
}
@@ -250,7 +249,7 @@ s32 func_8000AF40(s32 arg0, void* arg1, u16 arg2, u16 arg3) {
250249

251250
var_v1 = 1;
252251
if (D_800A82A5 & (1 << arg0)) {
253-
var_v1 = func_8000DAFC(&D_800A8100[arg0], 1, arg2, (uintptr_t)arg1, arg3);
252+
var_v1 = osGbmbcReadWrite(&D_800A8100[arg0], 1, arg2, (uintptr_t)arg1, arg3);
254253
}
255254
return var_v1;
256255
}

yamls/us/rom.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
- [0xD470, c] #
5353
- [0xDDC0, c]
5454
- [0xE1C0, c]
55-
- [0xE570, c] #
55+
- [0xE570, c, gb_mbc] # gameboy memory bank controller
5656
- [0xE890, c] #
5757
- [0xF420, c] #
5858
- [0x11BA0, c] #

0 commit comments

Comments
 (0)