mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2025-01-26 22:31:38 +00:00
Refactor the MBC implementation to allow a single point of definition.
Signed-off-by: Adrian.Conlon <adrian.conlon@gmail.com>
This commit is contained in:
parent
da96454185
commit
448ee2f09f
@ -182,7 +182,7 @@ namespace EightBit {
|
||||
void loadBootRom(const std::string& path);
|
||||
void loadGameRom(const std::string& path);
|
||||
|
||||
virtual uint8_t peek(uint16_t address) const;
|
||||
virtual uint8_t peek(uint16_t address);
|
||||
virtual void poke(uint16_t address, uint8_t value);
|
||||
|
||||
virtual uint8_t& reference();
|
||||
@ -213,5 +213,7 @@ namespace EightBit {
|
||||
void checkTimer(int cycles);
|
||||
|
||||
void validateCartridgeType();
|
||||
|
||||
uint8_t& reference(uint16_t address, bool& rom);
|
||||
};
|
||||
}
|
@ -40,18 +40,8 @@ void EightBit::Bus::loadGameRom(const std::string& path) {
|
||||
validateCartridgeType();
|
||||
}
|
||||
|
||||
uint8_t& EightBit::Bus::reference() {
|
||||
auto effective = effectiveAddress(ADDRESS().word);
|
||||
if ((effective < 0x100) && bootRomEnabled())
|
||||
return placeDATA(m_bootRom[effective]);
|
||||
if ((effective < 0x4000) && gameRomEnabled())
|
||||
return placeDATA(m_gameRom[effective]);
|
||||
if ((effective < 0x8000) && gameRomEnabled())
|
||||
return placeDATA(m_gameRom[effective + (m_romBank * 0x4000)]);
|
||||
return Memory::reference();
|
||||
}
|
||||
|
||||
uint8_t EightBit::Bus::peek(uint16_t address) const {
|
||||
uint8_t& EightBit::Bus::reference(uint16_t address, bool& rom) {
|
||||
rom = true;
|
||||
auto effective = effectiveAddress(address);
|
||||
if ((effective < 0x100) && bootRomEnabled())
|
||||
return m_bootRom[effective];
|
||||
@ -59,18 +49,24 @@ uint8_t EightBit::Bus::peek(uint16_t address) const {
|
||||
return m_gameRom[effective];
|
||||
if ((effective < 0x8000) && gameRomEnabled())
|
||||
return m_gameRom[effective + (m_romBank * 0x4000)];
|
||||
rom = false;
|
||||
return m_bus[effective];
|
||||
}
|
||||
|
||||
uint8_t& EightBit::Bus::reference() {
|
||||
bool rom;
|
||||
auto& value = reference(ADDRESS().word, rom);
|
||||
return rom ? placeDATA(value) : referenceDATA(value);
|
||||
}
|
||||
|
||||
uint8_t EightBit::Bus::peek(uint16_t address) {
|
||||
bool rom;
|
||||
return reference(address, rom);
|
||||
}
|
||||
|
||||
void EightBit::Bus::poke(uint16_t address, uint8_t value) {
|
||||
auto effective = effectiveAddress(address);
|
||||
if ((effective < 0x100) && bootRomEnabled())
|
||||
m_bootRom[effective] = value;
|
||||
if ((effective < 0x4000) && gameRomEnabled())
|
||||
m_gameRom[effective] = value;
|
||||
if ((effective < 0x8000) && gameRomEnabled())
|
||||
m_gameRom[effective + (m_romBank * 0x4000)] = value;
|
||||
m_bus[effective] = value;
|
||||
bool rom;
|
||||
reference(address, rom) = value;
|
||||
}
|
||||
|
||||
void EightBit::Bus::Bus_WrittenByte(const AddressEventArgs& e) {
|
||||
|
@ -53,10 +53,10 @@ namespace EightBit {
|
||||
return DATA();
|
||||
}
|
||||
|
||||
virtual uint8_t peek(uint16_t address) const;
|
||||
virtual uint8_t peek(uint16_t address);
|
||||
virtual void poke(uint16_t address, uint8_t value);
|
||||
|
||||
virtual uint16_t peekWord(uint16_t address) const;
|
||||
virtual uint16_t peekWord(uint16_t address);
|
||||
|
||||
virtual int effectiveAddress(int address) const {
|
||||
return address & m_addressMask;
|
||||
|
@ -44,7 +44,7 @@ namespace EightBit {
|
||||
static int promoteNibble(int value) { return value << 4; }
|
||||
static int demoteNibble(int value) { return highNibble(value); }
|
||||
|
||||
const Memory& getMemory() const { return m_memory; }
|
||||
Memory& getMemory() { return m_memory; }
|
||||
|
||||
register16_t& PC() { return pc; }
|
||||
|
||||
|
@ -19,7 +19,7 @@ EightBit::Memory::Memory(uint16_t addressMask)
|
||||
EightBit::Memory::~Memory() {
|
||||
}
|
||||
|
||||
uint8_t EightBit::Memory::peek(uint16_t address) const {
|
||||
uint8_t EightBit::Memory::peek(uint16_t address) {
|
||||
return m_bus[address];
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ void EightBit::Memory::poke(uint16_t address, uint8_t value) {
|
||||
m_bus[address] = value;
|
||||
}
|
||||
|
||||
uint16_t EightBit::Memory::peekWord(uint16_t address) const {
|
||||
uint16_t EightBit::Memory::peekWord(uint16_t address) {
|
||||
register16_t returned;
|
||||
returned.low = peek(address);
|
||||
returned.high = peek(address + 1);
|
||||
|
Loading…
x
Reference in New Issue
Block a user