start of mbc3

This commit is contained in:
2026-01-30 16:18:01 -08:00
parent ab258d177e
commit 712ee55e7b
2 changed files with 150 additions and 111 deletions

View File

@@ -92,7 +92,7 @@ public:
void loadGame(const std::string& filename);
void determineMBCInfo();
static bool testMBCWrite(Word address);
bool MBCWrite(Word address);
Byte* MBCRead(Word address);
//prevents seg faults when programs with no MBC try to write to ROM
Byte dummyVal = 0;

View File

@@ -35,7 +35,7 @@ void AddressSpace::determineMBCInfo() {
}
}
bool AddressSpace::testMBCWrite(const Word address) {
bool AddressSpace::MBCWrite(const Word address) {
if (address <= 0x7FFF)
return true;
return false;
@@ -72,21 +72,23 @@ void AddressSpace::MBCUpdate() {
// see: https://gbdev.io/pandocs/MBC1.html
if (MBC == MBC1) {
// Selected ROM Bank = (Secondary Bank << 5) + ROM Bank
romBankRegister &= 0x1F;
twoBitBankRegister &= 0x3;
romBankRegister &= 0b11111;
twoBitBankRegister &= 0b11;
// 512 KiB can only have 8KiB of ram
if (romSize >= 524288) {
if (romBankRegister == 0)
selectedRomBank = (twoBitBankRegister << 5) + 1;
selectedRomBank = (twoBitBankRegister << 5) + romBankRegister;
}
else {
} else {
if (romBankRegister == 0)
selectedRomBank = 1;
else
selectedRomBank = romBankRegister;
}
if (romBankRegister == 0x20 || romBankRegister == 0x40 ||
romBankRegister == 0x60)
romBankRegister += 1;
selectedExternalRamBank = 0;
loadRomBank();
@@ -94,8 +96,8 @@ void AddressSpace::MBCUpdate() {
}
if (MBC == MBC1Ram || MBC == MBC1RamBattery) {
// Selected ROM Bank = (Secondary Bank << 5) + ROM Bank
romBankRegister &= 0x1F;
twoBitBankRegister &= 0x3;
romBankRegister &= 0b11111;
twoBitBankRegister &= 0b11;
// 512 KiB can only have 8KiB of ram
if (romSize >= 524288) {
@@ -103,16 +105,54 @@ void AddressSpace::MBCUpdate() {
selectedRomBank = (twoBitBankRegister << 5) + 1;
selectedRomBank = (twoBitBankRegister << 5) + romBankRegister;
selectedExternalRamBank = 0;
}
else {
} else {
if (romBankRegister == 0)
selectedRomBank = 1;
else
selectedRomBank = romBankRegister;
selectedExternalRamBank = twoBitBankRegister;
}
if (romBankRegister == 0x20 || romBankRegister == 0x40 ||
romBankRegister == 0x60)
romBankRegister += 1;
loadRomBank();
loadRamBank();
} else if (MBC == MBC2 || MBC == MBC2Battery) {
// TODO
} else if (MBC == MBC3 || MBC == MBC3TimerBattery) {
romBankRegister &= 0b11111;
twoBitBankRegister &= 0b11;
// 512 KiB can only have 8KiB of ram
if (romSize >= 524288) {
if (romBankRegister == 0)
selectedRomBank = (twoBitBankRegister << 5) + 1;
selectedRomBank = (twoBitBankRegister << 5) + romBankRegister;
} else {
if (romBankRegister == 0)
selectedRomBank = 1;
else
selectedRomBank = romBankRegister;
}
} else if (MBC == MBC3Ram || MBC == MBC3RamBattery ||
MBC == MBC3TimerRamBattery) {
romBankRegister &= 0b11111;
twoBitBankRegister &= 0b11;
// 512 KiB can only have 8KiB of ram
if (romSize >= 524288) {
if (romBankRegister == 0)
selectedRomBank = (twoBitBankRegister << 5) + 1;
selectedRomBank = (twoBitBankRegister << 5) + romBankRegister;
selectedExternalRamBank = 0;
} else {
if (romBankRegister == 0)
selectedRomBank = 1;
else
selectedRomBank = romBankRegister;
selectedExternalRamBank = twoBitBankRegister;
}
}
}
@@ -129,7 +169,6 @@ void AddressSpace::createRamBank() {
void AddressSpace::loadRamBank() {
if (cartridgeRam != nullptr)
memoryLayout.externalRam = cartridgeRam + (RAM_BANK_SIZE * selectedExternalRamBank);
memoryLayout.externalRam =
cartridgeRam + (RAM_BANK_SIZE * selectedExternalRamBank);
}