1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-29 12:50:28 +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) Machine::Machine() : _cycles_since_video_update(0)
{ {
set_clock_rate(1000000); set_clock_rate(1000000);
_via.set_interrupt_delegate(this);
} }
void Machine::configure_as_target(const StaticAnalyser::Target &target) 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]; if(isReadOperation(operation)) *value = _rom[address&16383];
} }
else else
{
if((address & 0xff00) == 0x0300)
{
if(isReadOperation(operation)) *value = _via.get_register(address);
else _via.set_register(address, *value);
}
else
{ {
if(isReadOperation(operation)) if(isReadOperation(operation))
*value = _ram[address]; *value = _ram[address];
@ -40,7 +48,9 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
_ram[address] = *value; _ram[address] = *value;
} }
} }
}
_via.run_for_half_cycles(2);
_cycles_since_video_update++; _cycles_since_video_update++;
return 1; return 1;
} }
@ -65,3 +75,8 @@ void Machine::close_output()
{ {
_videoOutput.reset(); _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 #define Oric_hpp
#include "../../Processors/6502/CPU6502.hpp" #include "../../Processors/6502/CPU6502.hpp"
#include "../../Components/6522/6522.hpp"
#include "../../Storage/Tape/Tape.hpp" #include "../../Storage/Tape/Tape.hpp"
#include "../ConfigurationTarget.hpp" #include "../ConfigurationTarget.hpp"
@ -23,10 +24,16 @@
namespace Oric { namespace Oric {
class VIA: public MOS::MOS6522<VIA>, public MOS::MOS6522IRQDelegate {
public:
using MOS6522IRQDelegate::set_interrupt_status;
};
class Machine: class Machine:
public CPU6502::Processor<Machine>, public CPU6502::Processor<Machine>,
public CRTMachine::Machine, public CRTMachine::Machine,
public ConfigurationTarget::Machine { public ConfigurationTarget::Machine,
public MOS::MOS6522IRQDelegate::Delegate {
public: public:
Machine(); Machine();
@ -47,6 +54,9 @@ class Machine:
virtual std::shared_ptr<Outputs::Speaker> get_speaker() { return nullptr; } 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); } 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: private:
// RAM and ROM // RAM and ROM
uint8_t _ram[65536], _rom[16384]; uint8_t _ram[65536], _rom[16384];
@ -55,6 +65,9 @@ class Machine:
// Outputs // Outputs
std::unique_ptr<VideoOutput> _videoOutput; std::unique_ptr<VideoOutput> _videoOutput;
//
VIA _via;
}; };
} }