From ca6b54536ec50f7280a61f72fa8ba7d4ee71aed5 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 18 Aug 2015 20:58:05 -0400 Subject: [PATCH] Added fire and reset inputs. --- Machines/Atari2600.cpp | 29 +++++++++---------- Machines/Atari2600.hpp | 2 +- .../Mac/Clock Signal/Atari2600Document.swift | 8 +++++ OSBindings/Mac/Clock Signal/CSAtari2600.h | 2 ++ OSBindings/Mac/Clock Signal/CSAtari2600.mm | 6 ++++ 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/Machines/Atari2600.cpp b/Machines/Atari2600.cpp index 4f709a69d..d08eed8d6 100644 --- a/Machines/Atari2600.cpp +++ b/Machines/Atari2600.cpp @@ -27,7 +27,7 @@ Machine::Machine() _hMoveWillCount = false; _piaDataValue[0] = _piaDataValue[1] = 0xff; - _piaInputValue[0] = _piaInputValue[1] = 0xff; + _tiaInputValue[0] = _tiaInputValue[1] = 0xff; setup6502(); set_reset_line(true); @@ -358,7 +358,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin case 0x0c: case 0x0d: - // TODO: inputs + returnValue &= _tiaInputValue[decodedAddress - 0x0c]; break; } } else { @@ -530,11 +530,6 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin returnValue &= _piaTimerStatus; _piaTimerStatus &= ~0x40; break; - - case 0x0c: - case 0x0d: - returnValue &= _piaInputValue[decodedAddress - 0x0c]; - break; } } else { const uint8_t decodedAddress = address & 0x0f; @@ -570,15 +565,19 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin void Machine::set_digital_input(Atari2600DigitalInput input, bool state) { switch (input) { - case Atari2600DigitalInputJoy1Up: if(state) _piaDataValue[0] &= 0x10; else _piaDataValue[0] |= 0x10; break; - case Atari2600DigitalInputJoy1Down: if(state) _piaDataValue[0] &= 0x20; else _piaDataValue[0] |= 0x20; break; - case Atari2600DigitalInputJoy1Left: if(state) _piaDataValue[0] &= 0x40; else _piaDataValue[0] |= 0x40; break; - case Atari2600DigitalInputJoy1Right: if(state) _piaDataValue[0] &= 0x80; else _piaDataValue[0] |= 0x80; break; + case Atari2600DigitalInputJoy1Up: if(state) _piaDataValue[0] &= ~0x10; else _piaDataValue[0] |= 0x10; break; + case Atari2600DigitalInputJoy1Down: if(state) _piaDataValue[0] &= ~0x20; else _piaDataValue[0] |= 0x20; break; + case Atari2600DigitalInputJoy1Left: if(state) _piaDataValue[0] &= ~0x40; else _piaDataValue[0] |= 0x40; break; + case Atari2600DigitalInputJoy1Right: if(state) _piaDataValue[0] &= ~0x80; else _piaDataValue[0] |= 0x80; break; - case Atari2600DigitalInputJoy2Up: if(state) _piaDataValue[0] &= 0x01; else _piaDataValue[0] |= 0x01; break; - case Atari2600DigitalInputJoy2Down: if(state) _piaDataValue[0] &= 0x02; else _piaDataValue[0] |= 0x02; break; - case Atari2600DigitalInputJoy2Left: if(state) _piaDataValue[0] &= 0x04; else _piaDataValue[0] |= 0x04; break; - case Atari2600DigitalInputJoy2Right: if(state) _piaDataValue[0] &= 0x08; else _piaDataValue[0] |= 0x08; break; + case Atari2600DigitalInputJoy2Up: if(state) _piaDataValue[0] &= ~0x01; else _piaDataValue[0] |= 0x01; break; + case Atari2600DigitalInputJoy2Down: if(state) _piaDataValue[0] &= ~0x02; else _piaDataValue[0] |= 0x02; break; + case Atari2600DigitalInputJoy2Left: if(state) _piaDataValue[0] &= ~0x04; else _piaDataValue[0] |= 0x04; break; + case Atari2600DigitalInputJoy2Right: if(state) _piaDataValue[0] &= ~0x08; else _piaDataValue[0] |= 0x08; break; + + // TODO: latching + case Atari2600DigitalInputJoy1Fire: if(state) _tiaInputValue[0] &= ~0x80; else _tiaInputValue[0] |= 0x80; break; + case Atari2600DigitalInputJoy2Fire: if(state) _tiaInputValue[1] &= ~0x80; else _tiaInputValue[1] |= 0x80; break; default: break; } diff --git a/Machines/Atari2600.hpp b/Machines/Atari2600.hpp index 1aa226455..57718cd55 100644 --- a/Machines/Atari2600.hpp +++ b/Machines/Atari2600.hpp @@ -78,7 +78,7 @@ class Machine: public CPU6502::Processor { // joystick state uint8_t _piaDataDirection[2]; uint8_t _piaDataValue[2]; - uint8_t _piaInputValue[2]; + uint8_t _tiaInputValue[2]; // collisions uint8_t _collisions[8]; diff --git a/OSBindings/Mac/Clock Signal/Atari2600Document.swift b/OSBindings/Mac/Clock Signal/Atari2600Document.swift index d75b95e30..f3edcd55d 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600Document.swift +++ b/OSBindings/Mac/Clock Signal/Atari2600Document.swift @@ -88,12 +88,20 @@ class Atari2600Document: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewR if let input = inputForKey(event) { atari2600!.setState(true, forDigitalInput: input) } + + if event.keyCode == 36 { + atari2600!.setResetLineEnabled(true) + } } func keyUp(event: NSEvent) { if let input = inputForKey(event) { atari2600!.setState(false, forDigitalInput: input) } + + if event.keyCode == 36 { + atari2600!.setResetLineEnabled(false) + } } func flagsChanged(newModifiers: NSEvent) { diff --git a/OSBindings/Mac/Clock Signal/CSAtari2600.h b/OSBindings/Mac/Clock Signal/CSAtari2600.h index 4aa626e26..004ba63a4 100644 --- a/OSBindings/Mac/Clock Signal/CSAtari2600.h +++ b/OSBindings/Mac/Clock Signal/CSAtari2600.h @@ -16,6 +16,8 @@ - (void)runForNumberOfCycles:(int)cycles; - (void)setROM:(NSData *)rom; + - (void)setState:(BOOL)state forDigitalInput:(Atari2600DigitalInput)digitalInput; +- (void)setResetLineEnabled:(BOOL)enabled; @end diff --git a/OSBindings/Mac/Clock Signal/CSAtari2600.mm b/OSBindings/Mac/Clock Signal/CSAtari2600.mm index 9a6c9f673..02995feb7 100644 --- a/OSBindings/Mac/Clock Signal/CSAtari2600.mm +++ b/OSBindings/Mac/Clock Signal/CSAtari2600.mm @@ -83,6 +83,12 @@ struct Atari2600CRTDelegate: public Outputs::CRT::CRTDelegate { }); } +- (void)setResetLineEnabled:(BOOL)enabled { + dispatch_async(_serialDispatchQueue, ^{ + _atari2600.set_reset_line(enabled ? true : false); + }); +} + - (instancetype)init { self = [super init];