mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-11 08:30:55 +00:00
Hit and hope is getting me nowhere. Time to unit test this thing.
This commit is contained in:
parent
8827597363
commit
7cc4bf3fe7
@ -117,15 +117,15 @@ template <class T> class MOS6522 {
|
|||||||
_registers.peripheral_control = value;
|
_registers.peripheral_control = value;
|
||||||
|
|
||||||
// TODO: simplify below; tryig to avoid improper logging of unimplemented warnings in input mode
|
// TODO: simplify below; tryig to avoid improper logging of unimplemented warnings in input mode
|
||||||
if(value & 0x08)
|
// if(value & 0x08)
|
||||||
{
|
// {
|
||||||
switch(value & 0x0e)
|
switch(value & 0x0e)
|
||||||
{
|
{
|
||||||
default: printf("Unimplemented control line mode %d\n", (value >> 1)&7); break;
|
default: printf("Unimplemented control line mode %d\n", (value >> 1)&7); break;
|
||||||
case 0x0c: static_cast<T *>(this)->set_control_line_output(Port::A, Line::Two, false); break;
|
case 0x0c: static_cast<T *>(this)->set_control_line_output(Port::A, Line::Two, false); break;
|
||||||
case 0x0e: static_cast<T *>(this)->set_control_line_output(Port::A, Line::Two, true); break;
|
case 0x0e: static_cast<T *>(this)->set_control_line_output(Port::A, Line::Two, true); break;
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
if(value & 0x80)
|
if(value & 0x80)
|
||||||
{
|
{
|
||||||
switch(value & 0xe0)
|
switch(value & 0xe0)
|
||||||
|
@ -30,14 +30,14 @@ void Machine::set_serial_bus(std::shared_ptr<::Commodore::Serial::Bus> serial_bu
|
|||||||
|
|
||||||
unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value)
|
unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value)
|
||||||
{
|
{
|
||||||
static bool log = false;
|
/* static bool log = false;
|
||||||
|
|
||||||
if(operation == CPU6502::BusOperation::ReadOpcode)
|
if(operation == CPU6502::BusOperation::ReadOpcode)
|
||||||
{
|
{
|
||||||
log = (address >= 0xE85B && address <= 0xE907) || (address >= 0xE9C9 && address <= 0xEA2D);
|
log = (address >= 0xE85B && address <= 0xE907) || (address >= 0xE9C9 && address <= 0xEA2D);
|
||||||
if(log) printf("\n%04x: ", address);
|
if(log) printf("\n%04x: ", address);
|
||||||
}
|
}
|
||||||
if(log) printf("[%c %04x] ", isReadOperation(operation) ? 'r' : 'w', address);
|
if(log) printf("[%c %04x] ", isReadOperation(operation) ? 'r' : 'w', address);*/
|
||||||
|
|
||||||
if(address < 0x800)
|
if(address < 0x800)
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,7 @@ class SerialPortVIA: public MOS::MOS6522<SerialPortVIA>, public MOS::MOS6522IRQD
|
|||||||
if(port) {
|
if(port) {
|
||||||
std::shared_ptr<::Commodore::Serial::Port> serialPort = _serialPort.lock();
|
std::shared_ptr<::Commodore::Serial::Port> serialPort = _serialPort.lock();
|
||||||
if(serialPort) {
|
if(serialPort) {
|
||||||
printf("1540 output: %02x\n", value);
|
// printf("1540 output: %02x\n", value);
|
||||||
// "ATNA (Attention Acknowledge) is an output from PB4 which is sensed on the serial data line after being exclusively "ored" by the attention line and inverted"
|
// "ATNA (Attention Acknowledge) is an output from PB4 which is sensed on the serial data line after being exclusively "ored" by the attention line and inverted"
|
||||||
_attention_acknowledge_level = !(value&0x10);
|
_attention_acknowledge_level = !(value&0x10);
|
||||||
_data_level_output = (value&0x02);
|
_data_level_output = (value&0x02);
|
||||||
@ -79,10 +79,7 @@ class SerialPortVIA: public MOS::MOS6522<SerialPortVIA>, public MOS::MOS6522IRQD
|
|||||||
if(serialPort) {
|
if(serialPort) {
|
||||||
serialPort->set_output(::Commodore::Serial::Line::Data,
|
serialPort->set_output(::Commodore::Serial::Line::Data,
|
||||||
(::Commodore::Serial::LineLevel)!(_data_level_output
|
(::Commodore::Serial::LineLevel)!(_data_level_output
|
||||||
|| (_attention_level_input == _attention_acknowledge_level))
|
|| (_attention_level_input == _attention_acknowledge_level)));
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -45,6 +45,7 @@ void Bus::set_line_output_did_change(Line line)
|
|||||||
if(locked_port)
|
if(locked_port)
|
||||||
{
|
{
|
||||||
new_line_level = (LineLevel)((bool)new_line_level & (bool)locked_port->get_output(line));
|
new_line_level = (LineLevel)((bool)new_line_level & (bool)locked_port->get_output(line));
|
||||||
|
// printf("[%s] %s is now %s\n", typeid(locked_port).name(), (bool)locked_port->get_output(line) ? "high" : "low");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +48,12 @@ namespace Serial {
|
|||||||
Port() : _line_levels{High, High, High, High, High} {}
|
Port() : _line_levels{High, High, High, High, High} {}
|
||||||
|
|
||||||
void set_output(Line line, LineLevel level) {
|
void set_output(Line line, LineLevel level) {
|
||||||
_line_levels[line] = level;
|
if(_line_levels[line] != level)
|
||||||
std::shared_ptr<Bus> bus = _serial_bus.lock();
|
{
|
||||||
if(bus) bus->set_line_output_did_change(line);
|
_line_levels[line] = level;
|
||||||
|
std::shared_ptr<Bus> bus = _serial_bus.lock();
|
||||||
|
if(bus) bus->set_line_output_did_change(line);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LineLevel get_output(Line line) {
|
LineLevel get_output(Line line) {
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
4B2E2D951C399D1200138695 /* ElectronDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B2E2D931C399D1200138695 /* ElectronDocument.xib */; };
|
4B2E2D951C399D1200138695 /* ElectronDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B2E2D931C399D1200138695 /* ElectronDocument.xib */; };
|
||||||
4B2E2D9A1C3A06EC00138695 /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D971C3A06EC00138695 /* Atari2600.cpp */; };
|
4B2E2D9A1C3A06EC00138695 /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D971C3A06EC00138695 /* Atari2600.cpp */; };
|
||||||
4B2E2D9D1C3A070400138695 /* Electron.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D9B1C3A070400138695 /* Electron.cpp */; };
|
4B2E2D9D1C3A070400138695 /* Electron.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D9B1C3A070400138695 /* Electron.cpp */; };
|
||||||
|
4B3BA0C11D31882D005DD7A7 /* C1540Bridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B3BA0C01D31882D005DD7A7 /* C1540Bridge.mm */; };
|
||||||
4B4DC8211D2C2425003C5BF8 /* Vic20.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC81F1D2C2425003C5BF8 /* Vic20.cpp */; };
|
4B4DC8211D2C2425003C5BF8 /* Vic20.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC81F1D2C2425003C5BF8 /* Vic20.cpp */; };
|
||||||
4B4DC8281D2C2470003C5BF8 /* Commodore1540.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC8261D2C2470003C5BF8 /* Commodore1540.cpp */; };
|
4B4DC8281D2C2470003C5BF8 /* Commodore1540.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC8261D2C2470003C5BF8 /* Commodore1540.cpp */; };
|
||||||
4B4DC82B1D2C27A4003C5BF8 /* SerialBus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC8291D2C27A4003C5BF8 /* SerialBus.cpp */; };
|
4B4DC82B1D2C27A4003C5BF8 /* SerialBus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B4DC8291D2C27A4003C5BF8 /* SerialBus.cpp */; };
|
||||||
@ -386,6 +387,8 @@
|
|||||||
4B2E2D991C3A06EC00138695 /* Atari2600Inputs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Atari2600Inputs.h; sourceTree = "<group>"; };
|
4B2E2D991C3A06EC00138695 /* Atari2600Inputs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Atari2600Inputs.h; sourceTree = "<group>"; };
|
||||||
4B2E2D9B1C3A070400138695 /* Electron.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Electron.cpp; path = Electron/Electron.cpp; sourceTree = "<group>"; };
|
4B2E2D9B1C3A070400138695 /* Electron.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Electron.cpp; path = Electron/Electron.cpp; sourceTree = "<group>"; };
|
||||||
4B2E2D9C1C3A070400138695 /* Electron.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Electron.hpp; path = Electron/Electron.hpp; sourceTree = "<group>"; };
|
4B2E2D9C1C3A070400138695 /* Electron.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Electron.hpp; path = Electron/Electron.hpp; sourceTree = "<group>"; };
|
||||||
|
4B3BA0BF1D31882D005DD7A7 /* C1540Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = C1540Bridge.h; sourceTree = "<group>"; };
|
||||||
|
4B3BA0C01D31882D005DD7A7 /* C1540Bridge.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = C1540Bridge.mm; sourceTree = "<group>"; };
|
||||||
4B4DC81F1D2C2425003C5BF8 /* Vic20.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Vic20.cpp; sourceTree = "<group>"; };
|
4B4DC81F1D2C2425003C5BF8 /* Vic20.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Vic20.cpp; sourceTree = "<group>"; };
|
||||||
4B4DC8201D2C2425003C5BF8 /* Vic20.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Vic20.hpp; sourceTree = "<group>"; };
|
4B4DC8201D2C2425003C5BF8 /* Vic20.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Vic20.hpp; sourceTree = "<group>"; };
|
||||||
4B4DC8261D2C2470003C5BF8 /* Commodore1540.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Commodore1540.cpp; sourceTree = "<group>"; };
|
4B4DC8261D2C2470003C5BF8 /* Commodore1540.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Commodore1540.cpp; sourceTree = "<group>"; };
|
||||||
@ -1285,6 +1288,8 @@
|
|||||||
4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */,
|
4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */,
|
||||||
4B1414631B588A1100E04248 /* Test Binaries */,
|
4B1414631B588A1100E04248 /* Test Binaries */,
|
||||||
4BC9E1ED1D23449A003FCEE4 /* 6502InterruptTests.swift */,
|
4BC9E1ED1D23449A003FCEE4 /* 6502InterruptTests.swift */,
|
||||||
|
4B3BA0BF1D31882D005DD7A7 /* C1540Bridge.h */,
|
||||||
|
4B3BA0C01D31882D005DD7A7 /* C1540Bridge.mm */,
|
||||||
);
|
);
|
||||||
path = "Clock SignalTests";
|
path = "Clock SignalTests";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1843,6 +1848,7 @@
|
|||||||
files = (
|
files = (
|
||||||
4BC751B61D157EB3006C31D9 /* MOS6522Bridge.mm in Sources */,
|
4BC751B61D157EB3006C31D9 /* MOS6522Bridge.mm in Sources */,
|
||||||
4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */,
|
4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */,
|
||||||
|
4B3BA0C11D31882D005DD7A7 /* C1540Bridge.mm in Sources */,
|
||||||
4B14145D1B5887A600E04248 /* CPU6502.cpp in Sources */,
|
4B14145D1B5887A600E04248 /* CPU6502.cpp in Sources */,
|
||||||
4B1E85811D176468001EF87D /* 6532Tests.swift in Sources */,
|
4B1E85811D176468001EF87D /* 6532Tests.swift in Sources */,
|
||||||
4BC9E1EE1D23449A003FCEE4 /* 6502InterruptTests.swift in Sources */,
|
4BC9E1EE1D23449A003FCEE4 /* 6502InterruptTests.swift in Sources */,
|
||||||
|
@ -126,7 +126,7 @@ using namespace Commodore::Vic20;
|
|||||||
{
|
{
|
||||||
switch(key)
|
switch(key)
|
||||||
{
|
{
|
||||||
case VK_UpArrow: _vic20.set_joystick_state(JoystickInput::Up, isPressed); break;
|
case VK_UpArrow: _vic20.set_joystick_state(JoystickInput::Up, isPressed); break;
|
||||||
case VK_DownArrow: _vic20.set_joystick_state(JoystickInput::Down, isPressed); break;
|
case VK_DownArrow: _vic20.set_joystick_state(JoystickInput::Down, isPressed); break;
|
||||||
case VK_LeftArrow: _vic20.set_joystick_state(JoystickInput::Left, isPressed); break;
|
case VK_LeftArrow: _vic20.set_joystick_state(JoystickInput::Left, isPressed); break;
|
||||||
case VK_RightArrow: _vic20.set_joystick_state(JoystickInput::Right, isPressed); break;
|
case VK_RightArrow: _vic20.set_joystick_state(JoystickInput::Right, isPressed); break;
|
||||||
|
20
OSBindings/Mac/Clock SignalTests/C1540Bridge.h
Normal file
20
OSBindings/Mac/Clock SignalTests/C1540Bridge.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// C1540Bridge.h
|
||||||
|
// Clock Signal
|
||||||
|
//
|
||||||
|
// Created by Thomas Harte on 09/07/2016.
|
||||||
|
// Copyright © 2016 Thomas Harte. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface C1540Bridge : NSObject
|
||||||
|
|
||||||
|
@property (nonatomic) BOOL attentionLine;
|
||||||
|
@property (nonatomic) BOOL dataLine;
|
||||||
|
@property (nonatomic) BOOL clockLine;
|
||||||
|
|
||||||
|
- (void)runForCycles:(NSUInteger)numberOfCycles;
|
||||||
|
- (void)setROM:(NSData *)ROM;
|
||||||
|
|
||||||
|
@end
|
83
OSBindings/Mac/Clock SignalTests/C1540Bridge.mm
Normal file
83
OSBindings/Mac/Clock SignalTests/C1540Bridge.mm
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
//
|
||||||
|
// C1540Bridge.m
|
||||||
|
// Clock Signal
|
||||||
|
//
|
||||||
|
// Created by Thomas Harte on 09/07/2016.
|
||||||
|
// Copyright © 2016 Thomas Harte. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "C1540Bridge.h"
|
||||||
|
#include "Commodore1540.hpp"
|
||||||
|
|
||||||
|
class VanillaSerialPort: public Commodore::Serial::Port {
|
||||||
|
public:
|
||||||
|
void set_input(Commodore::Serial::Line line, Commodore::Serial::LineLevel value)
|
||||||
|
{
|
||||||
|
_input_line_levels[(int)line] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Commodore::Serial::LineLevel _input_line_levels[5];
|
||||||
|
};
|
||||||
|
|
||||||
|
@implementation C1540Bridge
|
||||||
|
{
|
||||||
|
Commodore::C1540::Machine _c1540;
|
||||||
|
std::shared_ptr<Commodore::Serial::Bus> _serialBus;
|
||||||
|
std::shared_ptr<VanillaSerialPort> _serialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if(self)
|
||||||
|
{
|
||||||
|
_serialBus.reset(new ::Commodore::Serial::Bus);
|
||||||
|
_serialPort.reset(new VanillaSerialPort);
|
||||||
|
|
||||||
|
_c1540.set_serial_bus(_serialBus);
|
||||||
|
_serialBus->add_port(_serialPort);
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setROM:(NSData *)ROM
|
||||||
|
{
|
||||||
|
_c1540.set_rom((uint8_t *)ROM.bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)runForCycles:(NSUInteger)numberOfCycles
|
||||||
|
{
|
||||||
|
_c1540.run_for_cycles((int)numberOfCycles);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setAttentionLine:(BOOL)attentionLine
|
||||||
|
{
|
||||||
|
_serialPort->set_input(Commodore::Serial::Line::Attention, attentionLine ? Commodore::Serial::LineLevel::High : Commodore::Serial::LineLevel::Low);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)attentionLine
|
||||||
|
{
|
||||||
|
return _serialPort->_input_line_levels[Commodore::Serial::Line::Attention];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setDataLine:(BOOL)dataLine
|
||||||
|
{
|
||||||
|
_serialPort->set_input(Commodore::Serial::Line::Data, dataLine ? Commodore::Serial::LineLevel::High : Commodore::Serial::LineLevel::Low);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)dataLine
|
||||||
|
{
|
||||||
|
return _serialPort->_input_line_levels[Commodore::Serial::Line::Data];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setClockLine:(BOOL)clockLine
|
||||||
|
{
|
||||||
|
_serialPort->set_input(Commodore::Serial::Line::Clock, clockLine ? Commodore::Serial::LineLevel::High : Commodore::Serial::LineLevel::Low);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)clockLine
|
||||||
|
{
|
||||||
|
return _serialPort->_input_line_levels[Commodore::Serial::Line::Clock];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
Loading…
x
Reference in New Issue
Block a user