MBC2 working
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
18
src/mbc.cpp
18
src/mbc.cpp
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user