MBC2 working

This commit is contained in:
2026-03-16 02:50:02 -07:00
parent 3bd1ef34d8
commit 89e7891249
2 changed files with 25 additions and 4 deletions

View File

@@ -97,7 +97,10 @@ public:
Byte *MBCRead(Word address); Byte *MBCRead(Word address);
// prevents seg faults when programs with no MBC try to write to ROM // prevents seg faults when programs with no MBC try to write to ROM
Byte dummyVal = 0; Byte dummyVal = 0;
// called after every op
void MBCUpdate(); void MBCUpdate();
void loadRomBank(); void loadRomBank();
void createRamBank(); void createRamBank();
void loadRamBank(); void loadRamBank();
@@ -110,6 +113,7 @@ public:
bool dmaTransferRequested = false; bool dmaTransferRequested = false;
void dmaTransfer(); void dmaTransfer();
// MBC registers
// Selected ROM Bank = (Secondary Bank << 5) + ROM Bank // Selected ROM Bank = (Secondary Bank << 5) + ROM Bank
Byte selectedRomBank = 0; Byte selectedRomBank = 0;
Byte romBankRegister = 0x00; Byte romBankRegister = 0x00;
@@ -117,6 +121,10 @@ public:
Byte twoBitBankRegister = 0x0; Byte twoBitBankRegister = 0x0;
Byte selectedExternalRamBank = 0; Byte selectedExternalRamBank = 0;
Byte romRamSelect = 0x00; Byte romRamSelect = 0x00;
// 0xA if enabled in MBC1/3, else off
// in MBC2 also the rom bank number
// in MBC3 also timer enable
// reading ram while disabled is undefined behaviour
Byte ramEnable = 0x00; Byte ramEnable = 0x00;
// MBC3 // MBC3
Byte latchClockData = 0x00; Byte latchClockData = 0x00;
@@ -139,6 +147,9 @@ public:
if (address < 0xC000) { if (address < 0xC000) {
if (externalRamSize == 0) if (externalRamSize == 0)
return 0xFF; return 0xFF;
// MBC2 echos 15 times and only stores lower 4 bits
if (MBC == MBC2 || MBC == MBC2Battery)
return memoryLayout.externalRam[(address - 0xA000) & 0x01FF] | 0xF0;
return memoryLayout.externalRam[address - 0xA000]; return memoryLayout.externalRam[address - 0xA000];
} }
if (address < 0xD000) if (address < 0xD000)

View File

@@ -64,6 +64,14 @@ Byte *AddressSpace::MBCRead(const Word address) {
if (address <= 0x7FFF) if (address <= 0x7FFF)
return &romRamSelect; return &romRamSelect;
} }
if (MBC == MBC2 || MBC == MBC2Battery) {
if (address <= 0x3FFF) {
if (address & 0x0100)
return &romBankRegister;
else
return &ramEnable;
}
}
return &dummyVal; return &dummyVal;
} }
@@ -93,8 +101,7 @@ void AddressSpace::MBCUpdate() {
loadRomBank(); loadRomBank();
loadRamBank(); loadRamBank();
} } else if (MBC == MBC1Ram || MBC == MBC1RamBattery) {
if (MBC == MBC1Ram || MBC == MBC1RamBattery) {
// Selected ROM Bank = (Secondary Bank << 5) + ROM Bank // Selected ROM Bank = (Secondary Bank << 5) + ROM Bank
romBankRegister &= 0b11111; romBankRegister &= 0b11111;
twoBitBankRegister &= 0b11; twoBitBankRegister &= 0b11;
@@ -119,7 +126,9 @@ void AddressSpace::MBCUpdate() {
loadRomBank(); loadRomBank();
loadRamBank(); loadRamBank();
} else if (MBC == MBC2 || MBC == MBC2Battery) { } else if (MBC == MBC2 || MBC == MBC2Battery) {
// TODO selectedRomBank = romBankRegister & 0x0F;
loadRomBank();
loadRamBank();
} else if (MBC == MBC3 || MBC == MBC3TimerBattery) { } else if (MBC == MBC3 || MBC == MBC3TimerBattery) {
romBankRegister &= 0b11111; romBankRegister &= 0b11111;
twoBitBankRegister &= 0b11; twoBitBankRegister &= 0b11;
@@ -168,7 +177,8 @@ void AddressSpace::createRamBank() {
} }
void AddressSpace::loadRamBank() { void AddressSpace::loadRamBank() {
if (cartridgeRam != nullptr) if (cartridgeRam != nullptr) {
memoryLayout.externalRam = memoryLayout.externalRam =
cartridgeRam + (RAM_BANK_SIZE * selectedExternalRamBank); cartridgeRam + (RAM_BANK_SIZE * selectedExternalRamBank);
}
} }