Merge pull request #2 from Hojun-Cho/dev/mbc1

add mbc1
This commit is contained in:
O_WRONLY 2024-07-16 12:22:18 +00:00 committed by GitHub
commit 3c68d0fdaa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 68 additions and 6 deletions

29
gb.c
View File

@ -4,6 +4,7 @@
int cpuhalt;
int backup;
int savefd = -1;
u64 clock;
u8 mbc, feat, mode;
@ -14,7 +15,13 @@ loadrom(const char* file)
long sz;
static u8 mbctab[31] = { 0, 1, 1, 1, -1, 2, 2, -1, 0, 0, -1, 6, 6, 6, -1, 3,
3, 3, 3, 3, -1, 4, 4, 4, -1, 5, 5, 5, 5, 5, 5 };
static u8 feattab[31] = {
0, 0, FEATRAM, FEATRAM|FEATBAT, 0, FEATRAM, FEATRAM|FEATBAT, 0,
FEATRAM, FEATRAM|FEATBAT, 0, 0, FEATRAM, FEATRAM|FEATBAT, 0, FEATTIM|FEATBAT,
FEATTIM|FEATRAM|FEATBAT, 0, FEATRAM, FEATRAM|FEATBAT, 0, 0, FEATRAM, FEATRAM|FEATBAT,
0, 0, FEATRAM, FEATRAM|FEATBAT, 0, FEATRAM, FEATRAM|FEATBAT,
};
f = fopen(file, "r");
if (f == nil)
panic("can't open %s", file);
@ -31,11 +38,25 @@ loadrom(const char* file)
if (rom[0x147] > 0x1F)
panic("bad cartidge type %d\n", rom[0x147]);
mbc = mbctab[rom[0x147]];
feat = feattab[rom[0x147]];
if((feat & FEATRAM) != 0){
switch(rom[0x149]){
case 0: feat &= ~FEATRAM; break;
case 1: nback = 2048; break;
case 2: nback = 8192; break;
case 3: nback = 32768; break;
default: panic("Unkown Ram size %d\n", rom[0x149]);
}
}
back = xalloc(nback);
if(nback == 0)
nbackbank = 1;
else
nbackbank = (nback + 8191) / 8192;
switch (mbc) {
case 0:
case 0: case 1:
break;
default:
panic("unsupported mbc %d", mbc);
default: panic("unsupported mbc %d", mbc);
}
if ((rom[0x143] & 0x80) != 0 && (mode & FORCEDMG) == 0)
mode = CGB | COL;

2
gb.h
View File

@ -147,7 +147,7 @@ struct Event
extern u8 *rom, *back, reg[256], oam[256];
extern u8 vram[16384];
extern int nrom;
extern int nrom, nback, nbackbank;
extern u32 pal[64];
extern u8 dma;
extern u32 divclock;

43
mem.c
View File

@ -2,6 +2,8 @@
static int
mbc0(int a, int _);
static int
mbc1(int a, int _);
u8* rom;
u8 *romb, *vramb, *wramb, *eramb;
@ -15,7 +17,7 @@ int prish;
u8 dma;
u32 moncols[4];
u32 white;
int (*mappers[])(int, int) = { mbc0 };
int (*mappers[])(int, int) = { mbc0, mbc1 };
int (*mapper)(int, int);
static u8
@ -192,6 +194,45 @@ mbc0(int a, int _)
return 0;
}
static int
mbc1(int a, int v)
{
static u8 ramen, b0, b1, romram;
u16 b;
if (a < 0) {
switch(a) {
case INIT: return 0;
case SAVE:
case RSTR:
break;
case READ:
return -1;
default: panic("MBC1 does not have function of %d", a);
}
}
switch (a >> 13) {
case 0: ramen = (v & 0xF) == 0xA; break;
case 1: v &= 0x1F; b0 = v != 0 ? v : 1; break;
case 2: b1 = v & 3; b1 % nbackbank; break;
case 3: romram = v & 1; break;
}
b = b0;
if (romram == 0)
b |= b1 << 5;
b %= nrom >> 14; /* 32KB => 2bank */
romb = rom + (b << 14);
if (ramen) {
if (romram)
eramb = back + (b1 << 13);
else
eramb = back;
} else {
eramb = nil;
}
return 0;
}
void
meminit(void)
{