mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2025-02-02 08:29:45 +00:00
Simplify memory event handlers and ROM recognition a little (bit of speed difference)
Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
parent
3e854c7c49
commit
fbf098ae00
@ -20,13 +20,11 @@ public:
|
|||||||
void initialise();
|
void initialise();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint8_t& reference(uint16_t address, bool& rom) {
|
virtual uint8_t& reference(uint16_t address) {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual uint8_t reference(uint16_t address, bool& rom) const {
|
virtual uint8_t reference(uint16_t address) const {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,13 +37,11 @@ namespace Fuse {
|
|||||||
EightBit::register16_t actual, EightBit::register16_t expected) const;
|
EightBit::register16_t actual, EightBit::register16_t expected) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint8_t& reference(uint16_t address, bool& rom) {
|
virtual uint8_t& reference(uint16_t address) {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual uint8_t reference(uint16_t address, bool& rom) const {
|
virtual uint8_t reference(uint16_t address) const {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ namespace EightBit {
|
|||||||
|
|
||||||
void validateCartridgeType();
|
void validateCartridgeType();
|
||||||
|
|
||||||
void Bus_WrittenByte(uint16_t address);
|
void Bus_WrittenByte(EightBit::EventArgs);
|
||||||
|
|
||||||
int runRasterLines(int lines);
|
int runRasterLines(int lines);
|
||||||
int runVerticalBlankLines(int lines);
|
int runVerticalBlankLines(int lines);
|
||||||
|
@ -195,8 +195,8 @@ namespace EightBit {
|
|||||||
triggerInterrupt(Interrupts::KeypadPressed);
|
triggerInterrupt(Interrupts::KeypadPressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bus_WrittenByte(uint16_t address);
|
void Bus_WrittenByte(EightBit::EventArgs);
|
||||||
void Bus_ReadingByte(uint16_t address);
|
void Bus_ReadingByte(EightBit::EventArgs);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -28,8 +28,9 @@ void EightBit::GameBoy::Bus::loadGameRom(const std::string& path) {
|
|||||||
validateCartridgeType();
|
validateCartridgeType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::GameBoy::Bus::Bus_WrittenByte(const uint16_t address) {
|
void EightBit::GameBoy::Bus::Bus_WrittenByte(EightBit::EventArgs) {
|
||||||
|
|
||||||
|
const auto address = ADDRESS().word;
|
||||||
const auto value = DATA();
|
const auto value = DATA();
|
||||||
|
|
||||||
switch (address & 0xe000) {
|
switch (address & 0xe000) {
|
||||||
|
@ -23,7 +23,8 @@ void EightBit::GameBoy::IoRegisters::transferDma() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::GameBoy::IoRegisters::Bus_ReadingByte(const uint16_t address) {
|
void EightBit::GameBoy::IoRegisters::Bus_ReadingByte(EightBit::EventArgs) {
|
||||||
|
const auto address = m_bus.ADDRESS().word;
|
||||||
const auto io = (address >= BASE) && (address < 0xff80);
|
const auto io = (address >= BASE) && (address < 0xff80);
|
||||||
if (io) {
|
if (io) {
|
||||||
auto port = address - BASE;
|
auto port = address - BASE;
|
||||||
@ -92,8 +93,9 @@ void EightBit::GameBoy::IoRegisters::Bus_ReadingByte(const uint16_t address) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::GameBoy::IoRegisters::Bus_WrittenByte(const uint16_t address) {
|
void EightBit::GameBoy::IoRegisters::Bus_WrittenByte(EightBit::EventArgs) {
|
||||||
|
|
||||||
|
const auto address = m_bus.ADDRESS().word;
|
||||||
const auto value = m_bus.DATA();
|
const auto value = m_bus.DATA();
|
||||||
const auto port = address - BASE;
|
const auto port = address - BASE;
|
||||||
|
|
||||||
|
@ -100,17 +100,15 @@ void Board::Cpu_ExecutingInstruction_Debug(const EightBit::MOS6502& cpu) {
|
|||||||
std::cout << "\n";
|
std::cout << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::Memory_ReadingByte_Input(const uint16_t address) {
|
void Board::Memory_ReadingByte_Input(EightBit::EventArgs) {
|
||||||
if (address == m_configuration.getInputAddress()) {
|
if (ADDRESS().word == m_configuration.getInputAddress()) {
|
||||||
if (DATA() != 0) {
|
if (DATA() != 0)
|
||||||
assert(address == ADDRESS().word);
|
|
||||||
write(0);
|
write(0);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Board::Memory_WrittenByte_Output(const uint16_t address) {
|
void Board::Memory_WrittenByte_Output(EightBit::EventArgs) {
|
||||||
if (address == m_configuration.getOutputAddress()) {
|
if (ADDRESS().word == m_configuration.getOutputAddress()) {
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
_putch(DATA());
|
_putch(DATA());
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,13 +20,11 @@ public:
|
|||||||
void initialise();
|
void initialise();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint8_t& reference(uint16_t address, bool& rom) {
|
virtual uint8_t& reference(uint16_t address) {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual uint8_t reference(uint16_t address, bool& rom) const {
|
virtual uint8_t reference(uint16_t address) const {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,8 +48,8 @@ private:
|
|||||||
|
|
||||||
void Cpu_ExecutedInstruction_StopLoop(const EightBit::MOS6502& cpu);
|
void Cpu_ExecutedInstruction_StopLoop(const EightBit::MOS6502& cpu);
|
||||||
|
|
||||||
void Memory_ReadingByte_Input(uint16_t address);
|
void Memory_ReadingByte_Input(EightBit::EventArgs);
|
||||||
void Memory_WrittenByte_Output(uint16_t address);
|
void Memory_WrittenByte_Output(EightBit::EventArgs);
|
||||||
|
|
||||||
void Cpu_ExecutedInstruction_Poll(const EightBit::MOS6502& cpu);
|
void Cpu_ExecutedInstruction_Poll(const EightBit::MOS6502& cpu);
|
||||||
};
|
};
|
||||||
|
@ -36,13 +36,11 @@ namespace Fuse {
|
|||||||
EightBit::register16_t actual, EightBit::register16_t expected) const;
|
EightBit::register16_t actual, EightBit::register16_t expected) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint8_t& reference(uint16_t address, bool& rom) {
|
virtual uint8_t& reference(uint16_t address) {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual uint8_t reference(uint16_t address, bool& rom) const {
|
virtual uint8_t reference(uint16_t address) const {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,13 +22,11 @@ public:
|
|||||||
void initialise();
|
void initialise();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint8_t& reference(uint16_t address, bool& rom) {
|
virtual uint8_t& reference(uint16_t address) {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual uint8_t reference(uint16_t address, bool& rom) const {
|
virtual uint8_t reference(uint16_t address) const {
|
||||||
rom = false;
|
|
||||||
return m_ram.reference(address);
|
return m_ram.reference(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
inc/Bus.h
15
inc/Bus.h
@ -4,24 +4,27 @@
|
|||||||
|
|
||||||
#include "Signal.h"
|
#include "Signal.h"
|
||||||
#include "Register.h"
|
#include "Register.h"
|
||||||
|
#include "EventArgs.h"
|
||||||
|
|
||||||
namespace EightBit {
|
namespace EightBit {
|
||||||
class Bus {
|
class Bus {
|
||||||
public:
|
public:
|
||||||
virtual ~Bus() = default;
|
virtual ~Bus() = default;
|
||||||
|
|
||||||
Signal<uint16_t> WritingByte;
|
Signal<EventArgs> WritingByte;
|
||||||
Signal<uint16_t> WrittenByte;
|
Signal<EventArgs> WrittenByte;
|
||||||
|
|
||||||
Signal<uint16_t> ReadingByte;
|
Signal<EventArgs> ReadingByte;
|
||||||
Signal<uint16_t> ReadByte;
|
Signal<EventArgs> ReadByte;
|
||||||
|
|
||||||
register16_t& ADDRESS() { return m_address; }
|
register16_t& ADDRESS() { return m_address; }
|
||||||
register16_t ADDRESS() const { return m_address; }
|
register16_t ADDRESS() const { return m_address; }
|
||||||
uint8_t& DATA() { return m_data; }
|
uint8_t& DATA() { return m_data; }
|
||||||
uint8_t DATA() const { return m_data; }
|
uint8_t DATA() const { return m_data; }
|
||||||
|
|
||||||
|
uint8_t peek() const;
|
||||||
uint8_t peek(uint16_t address) const;
|
uint8_t peek(uint16_t address) const;
|
||||||
|
void poke(uint8_t value);
|
||||||
void poke(uint16_t address, uint8_t value);
|
void poke(uint16_t address, uint8_t value);
|
||||||
|
|
||||||
uint16_t peekWord(uint16_t address) const;
|
uint16_t peekWord(uint16_t address) const;
|
||||||
@ -36,8 +39,8 @@ namespace EightBit {
|
|||||||
void write(register16_t address, uint8_t value);
|
void write(register16_t address, uint8_t value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint8_t& reference(uint16_t address, bool& rom) = 0;
|
virtual uint8_t& reference(uint16_t address) = 0;
|
||||||
virtual uint8_t reference(uint16_t address, bool& rom) const = 0;
|
virtual uint8_t reference(uint16_t address) const = 0;
|
||||||
|
|
||||||
uint8_t& reference();
|
uint8_t& reference();
|
||||||
uint8_t reference() const;
|
uint8_t reference() const;
|
||||||
|
28
src/Bus.cpp
28
src/Bus.cpp
@ -1,16 +1,20 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Bus.h"
|
#include "Bus.h"
|
||||||
|
|
||||||
#include "EightBitCompilerDefinitions.h"
|
uint8_t EightBit::Bus::peek() const {
|
||||||
|
return reference();
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t EightBit::Bus::peek(const uint16_t address) const {
|
uint8_t EightBit::Bus::peek(const uint16_t address) const {
|
||||||
bool rom;
|
return reference(address);
|
||||||
return reference(address, rom);
|
}
|
||||||
|
|
||||||
|
void EightBit::Bus::poke(const uint8_t value) {
|
||||||
|
reference() = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Bus::poke(const uint16_t address, const uint8_t value) {
|
void EightBit::Bus::poke(const uint16_t address, const uint8_t value) {
|
||||||
bool rom;
|
reference(address) = value;
|
||||||
reference(address, rom) = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t EightBit::Bus::peekWord(const uint16_t address) const {
|
uint16_t EightBit::Bus::peekWord(const uint16_t address) const {
|
||||||
@ -21,9 +25,9 @@ uint16_t EightBit::Bus::peekWord(const uint16_t address) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t EightBit::Bus::read() {
|
uint8_t EightBit::Bus::read() {
|
||||||
ReadingByte.fire(ADDRESS().word);
|
ReadingByte.fire(EventArgs::empty());
|
||||||
DATA() = reference();
|
DATA() = reference();
|
||||||
ReadByte.fire(ADDRESS().word);
|
ReadByte.fire(EventArgs::empty());
|
||||||
return DATA();
|
return DATA();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,9 +42,9 @@ uint8_t EightBit::Bus::read(const register16_t address) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Bus::write() {
|
void EightBit::Bus::write() {
|
||||||
WritingByte.fire(ADDRESS().word);
|
WritingByte.fire(EventArgs::empty());
|
||||||
reference() = DATA();
|
reference() = DATA();
|
||||||
WrittenByte.fire(ADDRESS().word);
|
WrittenByte.fire(EventArgs::empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Bus::write(const uint8_t value) {
|
void EightBit::Bus::write(const uint8_t value) {
|
||||||
@ -59,11 +63,9 @@ void EightBit::Bus::write(const register16_t address, const uint8_t value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t EightBit::Bus::reference() const {
|
uint8_t EightBit::Bus::reference() const {
|
||||||
bool rom;
|
return reference(ADDRESS().word);
|
||||||
return reference(ADDRESS().word, rom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t& EightBit::Bus::reference() {
|
uint8_t& EightBit::Bus::reference() {
|
||||||
bool rom;
|
return reference(ADDRESS().word);
|
||||||
return reference(ADDRESS().word, rom);
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user