1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-27 01:31:42 +00:00

Added a VIA. Now it's time to find out how poor my 6522 emulation is.

This commit is contained in:
Thomas Harte 2016-10-13 20:50:55 -04:00
parent c9962f6502
commit 41e7eff6c8
2 changed files with 33 additions and 5 deletions

View File

@ -13,6 +13,7 @@ using namespace Oric;
Machine::Machine() : _cycles_since_video_update(0)
{
set_clock_rate(1000000);
_via.set_interrupt_delegate(this);
}
void Machine::configure_as_target(const StaticAnalyser::Target &target)
@ -31,6 +32,13 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
if(isReadOperation(operation)) *value = _rom[address&16383];
}
else
{
if((address & 0xff00) == 0x0300)
{
if(isReadOperation(operation)) *value = _via.get_register(address);
else _via.set_register(address, *value);
}
else
{
if(isReadOperation(operation))
*value = _ram[address];
@ -40,7 +48,9 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
_ram[address] = *value;
}
}
}
_via.run_for_half_cycles(2);
_cycles_since_video_update++;
return 1;
}
@ -65,3 +75,8 @@ void Machine::close_output()
{
_videoOutput.reset();
}
void Machine::mos6522_did_change_interrupt_status(void *mos6522)
{
set_irq_line(_via.get_interrupt_line());
}

View File

@ -10,6 +10,7 @@
#define Oric_hpp
#include "../../Processors/6502/CPU6502.hpp"
#include "../../Components/6522/6522.hpp"
#include "../../Storage/Tape/Tape.hpp"
#include "../ConfigurationTarget.hpp"
@ -23,10 +24,16 @@
namespace Oric {
class VIA: public MOS::MOS6522<VIA>, public MOS::MOS6522IRQDelegate {
public:
using MOS6522IRQDelegate::set_interrupt_status;
};
class Machine:
public CPU6502::Processor<Machine>,
public CRTMachine::Machine,
public ConfigurationTarget::Machine {
public ConfigurationTarget::Machine,
public MOS::MOS6522IRQDelegate::Delegate {
public:
Machine();
@ -47,6 +54,9 @@ class Machine:
virtual std::shared_ptr<Outputs::Speaker> get_speaker() { return nullptr; }
virtual void run_for_cycles(int number_of_cycles) { CPU6502::Processor<Machine>::run_for_cycles(number_of_cycles); }
// to satisfy MOS::MOS6522IRQDelegate::Delegate
void mos6522_did_change_interrupt_status(void *mos6522);
private:
// RAM and ROM
uint8_t _ram[65536], _rom[16384];
@ -55,6 +65,9 @@ class Machine:
// Outputs
std::unique_ptr<VideoOutput> _videoOutput;
//
VIA _via;
};
}