From 8741be5c84f8979f24a4e2859945b0c7690f4dbf Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 25 Jun 2016 16:24:52 -0400 Subject: [PATCH] Made the slightest possible effort to get TAPs opened and passed to the VIC. --- Machines/Vic-20/Vic20.cpp | 12 ++++++++++ Machines/Vic-20/Vic20.hpp | 3 +++ .../Documents/ElectronDocument.swift | 3 --- .../Documents/Vic20Document.swift | 14 +++++++++++ OSBindings/Mac/Clock Signal/Info.plist | 2 +- .../Machine/Wrappers/CSElectron.mm | 4 ++-- .../Clock Signal/Machine/Wrappers/CSVic20.h | 2 ++ .../Clock Signal/Machine/Wrappers/CSVic20.mm | 24 ++++++++++++++++--- 8 files changed, 55 insertions(+), 9 deletions(-) diff --git a/Machines/Vic-20/Vic20.cpp b/Machines/Vic-20/Vic20.cpp index 6e1644d9d..7f0e7321b 100644 --- a/Machines/Vic-20/Vic20.cpp +++ b/Machines/Vic-20/Vic20.cpp @@ -135,6 +135,18 @@ void Machine::add_prg(size_t length, const uint8_t *data) } } +#pragma mar - Tape + +void Machine::set_tape(std::shared_ptr tape) +{ + tape->get_next_pulse(); + tape->get_next_pulse(); + tape->get_next_pulse(); + tape->get_next_pulse(); + tape->get_next_pulse(); + tape->get_next_pulse(); +} + #pragma mark - Typer int Machine::get_typer_delay() diff --git a/Machines/Vic-20/Vic20.hpp b/Machines/Vic-20/Vic20.hpp index 7b888de7d..cf677b1f0 100644 --- a/Machines/Vic-20/Vic20.hpp +++ b/Machines/Vic-20/Vic20.hpp @@ -10,6 +10,7 @@ #define Vic20_hpp #include "../../Processors/6502/CPU6502.hpp" +#include "../../Storage/Tape/Tape.hpp" #include "../../Components/6560/6560.hpp" #include "../../Components/6522/6522.hpp" @@ -104,6 +105,8 @@ class Machine: void set_rom(ROMSlot slot, size_t length, const uint8_t *data); void add_prg(size_t length, const uint8_t *data); + void set_tape(std::shared_ptr tape); + void set_key_state(Key key, bool isPressed) { _keyboardVIA.set_key_state(key, isPressed); } void clear_all_keys() { _keyboardVIA.clear_all_keys(); } diff --git a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift index ab727c6d4..492b05ef1 100644 --- a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift @@ -42,9 +42,6 @@ class ElectronDocument: MachineDocument { } override func readFromURL(url: NSURL, ofType typeName: String) throws { - print(url) - print(typeName) - if let pathExtension = url.pathExtension { switch pathExtension.lowercaseString { case "uef": diff --git a/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift b/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift index 6339c4276..32e4390fb 100644 --- a/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift +++ b/OSBindings/Mac/Clock Signal/Documents/Vic20Document.swift @@ -36,6 +36,20 @@ class Vic20Document: MachineDocument { return "Vic20Document" } + override func readFromURL(url: NSURL, ofType typeName: String) throws { + if let pathExtension = url.pathExtension { + switch pathExtension.lowercaseString { + case "tap": + vic20.openTAPAtURL(url) + return + default: break; + } + } + + let fileWrapper = try NSFileWrapper(URL: url, options: NSFileWrapperReadingOptions(rawValue: 0)) + try self.readFromFileWrapper(fileWrapper, ofType: typeName) + } + // MARK: machine setup private func rom(name: String) -> NSData? { return dataForResource(name, ofType: "bin", inDirectory: "ROMImages/Vic20") diff --git a/OSBindings/Mac/Clock Signal/Info.plist b/OSBindings/Mac/Clock Signal/Info.plist index fc3fbeac9..ade36e2d2 100644 --- a/OSBindings/Mac/Clock Signal/Info.plist +++ b/OSBindings/Mac/Clock Signal/Info.plist @@ -98,7 +98,7 @@ CFBundleTypeRole Viewer NSDocumentClass - Vic20Document + $(PRODUCT_MODULE_NAME).Vic20Document CFBundleExecutable diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.mm b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.mm index c7b82425e..2785ce6d1 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.mm +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSElectron.mm @@ -8,9 +8,9 @@ #import "CSElectron.h" -#import "Electron.hpp" +#include "Electron.hpp" #import "CSMachine+Subclassing.h" -#import "TapeUEF.hpp" +#include "TapeUEF.hpp" @implementation CSElectron { Electron::Machine _electron; diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h index 3a8339dd6..5a181e9a9 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.h @@ -14,6 +14,8 @@ - (void)setKernelROM:(nonnull NSData *)rom; - (void)setBASICROM:(nonnull NSData *)rom; - (void)setCharactersROM:(nonnull NSData *)rom; + - (void)setPRG:(nonnull NSData *)prg; +- (BOOL)openTAPAtURL:(nonnull NSURL *)URL; @end diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm index cd5a0c18f..2ad687707 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSVic20.mm @@ -8,7 +8,8 @@ #import "CSVic20.h" -#import "Vic20.hpp" +#include "Vic20.hpp" +#include "CommodoreTAP.hpp" @implementation CSVic20 { Vic20::Machine _vic20; @@ -19,7 +20,9 @@ } - (void)setROM:(nonnull NSData *)rom slot:(Vic20::ROMSlot)slot { - _vic20.set_rom(slot, rom.length, (const uint8_t *)rom.bytes); + @synchronized(self) { + _vic20.set_rom(slot, rom.length, (const uint8_t *)rom.bytes); + } } - (void)setKernelROM:(nonnull NSData *)rom { @@ -34,8 +37,23 @@ [self setROM:rom slot:Vic20::ROMSlotCharacters]; } +- (BOOL)openTAPAtURL:(NSURL *)URL { + @synchronized(self) { + try { + std::shared_ptr tape(new Storage::CommodoreTAP([URL fileSystemRepresentation])); + _vic20.set_tape(tape); + return YES; + } catch(int exception) { + return NO; + } + } +} + + - (void)setPRG:(nonnull NSData *)prg { - _vic20.add_prg(prg.length, (const uint8_t *)prg.bytes); + @synchronized(self) { + _vic20.add_prg(prg.length, (const uint8_t *)prg.bytes); + } } - (void)setKey:(uint16_t)key isPressed:(BOOL)isPressed {