add mbc1
This commit is contained in:
parent
5d10cbdf3a
commit
b6d479c595
27
gb.c
27
gb.c
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
int cpuhalt;
|
int cpuhalt;
|
||||||
int backup;
|
int backup;
|
||||||
|
int savefd = -1;
|
||||||
u64 clock;
|
u64 clock;
|
||||||
u8 mbc, feat, mode;
|
u8 mbc, feat, mode;
|
||||||
|
|
||||||
@ -14,6 +15,12 @@ loadrom(const char* file)
|
|||||||
long sz;
|
long sz;
|
||||||
static u8 mbctab[31] = { 0, 1, 1, 1, -1, 2, 2, -1, 0, 0, -1, 6, 6, 6, -1, 3,
|
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 };
|
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");
|
f = fopen(file, "r");
|
||||||
if (f == nil)
|
if (f == nil)
|
||||||
@ -31,11 +38,25 @@ loadrom(const char* file)
|
|||||||
if (rom[0x147] > 0x1F)
|
if (rom[0x147] > 0x1F)
|
||||||
panic("bad cartidge type %d\n", rom[0x147]);
|
panic("bad cartidge type %d\n", rom[0x147]);
|
||||||
mbc = mbctab[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) {
|
switch (mbc) {
|
||||||
case 0:
|
case 0: case 1:
|
||||||
break;
|
break;
|
||||||
default:
|
default: panic("unsupported mbc %d", mbc);
|
||||||
panic("unsupported mbc %d", mbc);
|
|
||||||
}
|
}
|
||||||
if ((rom[0x143] & 0x80) != 0 && (mode & FORCEDMG) == 0)
|
if ((rom[0x143] & 0x80) != 0 && (mode & FORCEDMG) == 0)
|
||||||
mode = CGB | COL;
|
mode = CGB | COL;
|
||||||
|
|||||||
2
gb.h
2
gb.h
@ -147,7 +147,7 @@ struct Event
|
|||||||
|
|
||||||
extern u8 *rom, *back, reg[256], oam[256];
|
extern u8 *rom, *back, reg[256], oam[256];
|
||||||
extern u8 vram[16384];
|
extern u8 vram[16384];
|
||||||
extern int nrom;
|
extern int nrom, nback, nbackbank;
|
||||||
extern u32 pal[64];
|
extern u32 pal[64];
|
||||||
extern u8 dma;
|
extern u8 dma;
|
||||||
extern u32 divclock;
|
extern u32 divclock;
|
||||||
|
|||||||
43
mem.c
43
mem.c
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
mbc0(int a, int _);
|
mbc0(int a, int _);
|
||||||
|
static int
|
||||||
|
mbc1(int a, int _);
|
||||||
|
|
||||||
u8* rom;
|
u8* rom;
|
||||||
u8 *romb, *vramb, *wramb, *eramb;
|
u8 *romb, *vramb, *wramb, *eramb;
|
||||||
@ -15,7 +17,7 @@ int prish;
|
|||||||
u8 dma;
|
u8 dma;
|
||||||
u32 moncols[4];
|
u32 moncols[4];
|
||||||
u32 white;
|
u32 white;
|
||||||
int (*mappers[])(int, int) = { mbc0 };
|
int (*mappers[])(int, int) = { mbc0, mbc1 };
|
||||||
int (*mapper)(int, int);
|
int (*mapper)(int, int);
|
||||||
|
|
||||||
static u8
|
static u8
|
||||||
@ -192,6 +194,45 @@ mbc0(int a, int _)
|
|||||||
return 0;
|
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
|
void
|
||||||
meminit(void)
|
meminit(void)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user