1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-25 18:30:07 +00:00

Adapts the Mac port to use a Machine::DynamicMachine, thereby eliminating plenty of duplication.

This commit is contained in:
Thomas Harte 2017-11-24 21:36:22 -05:00
parent fcf295fd68
commit 221c05ca76
17 changed files with 178 additions and 219 deletions

View File

@ -15,44 +15,7 @@
#include "../Oric/Oric.hpp"
#include "../ZX8081/ZX8081.hpp"
namespace {
template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine {
public:
TypedDynamicMachine(T *machine) : machine_(machine) {}
ConfigurationTarget::Machine *configuration_target() override {
return get<ConfigurationTarget::Machine>();
}
CRTMachine::Machine *crt_machine() override {
return get<CRTMachine::Machine>();
}
JoystickMachine::Machine *joystick_machine() override {
return get<JoystickMachine::Machine>();
}
KeyboardMachine::Machine *keyboard_machine() override {
return get<KeyboardMachine::Machine>();
}
Configurable::Device *configurable_device() override {
return get<Configurable::Device>();
}
Utility::TypeRecipient *type_recipient() override {
return get<Utility::TypeRecipient>();
}
private:
template <typename Class> Class *get() {
return dynamic_cast<Class *>(machine_.get());
}
std::unique_ptr<T> machine_;
};
}
#include "TypedDynamicMachine.hpp"
::Machine::DynamicMachine *::Machine::MachineForTarget(const StaticAnalyser::Target &target) {
switch(target.machine) {

View File

@ -0,0 +1,61 @@
//
// TypedDynamicMachine.hpp
// Clock Signal
//
// Created by Thomas Harte on 24/11/2017.
// Copyright © 2017 Thomas Harte. All rights reserved.
//
#ifndef TypedDynamicMachine_h
#define TypedDynamicMachine_h
#include "MachineForTarget.hpp"
namespace Machine {
template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine {
public:
TypedDynamicMachine(T *machine) : machine_(machine) {}
T *get() { return machine_.get(); }
TypedDynamicMachine() : TypedDynamicMachine(nullptr) {}
TypedDynamicMachine(TypedDynamicMachine &&rhs) : machine_(std::move(rhs.machine_)) {}
TypedDynamicMachine &operator=(TypedDynamicMachine &&rhs) {
machine_ = std::move(rhs.machine_);
return *this;
}
ConfigurationTarget::Machine *configuration_target() override {
return get<ConfigurationTarget::Machine>();
}
CRTMachine::Machine *crt_machine() override {
return get<CRTMachine::Machine>();
}
JoystickMachine::Machine *joystick_machine() override {
return get<JoystickMachine::Machine>();
}
KeyboardMachine::Machine *keyboard_machine() override {
return get<KeyboardMachine::Machine>();
}
Configurable::Device *configurable_device() override {
return get<Configurable::Device>();
}
Utility::TypeRecipient *type_recipient() override {
return get<Utility::TypeRecipient>();
}
private:
template <typename Class> Class *get() {
return dynamic_cast<Class *>(machine_.get());
}
std::unique_ptr<T> machine_;
};
}
#endif /* TypedDynamicMachine_h */

View File

@ -819,6 +819,7 @@
4B77069C1EC904570053B588 /* Z80.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Z80.hpp; path = Z80/Z80.hpp; sourceTree = "<group>"; };
4B7913CA1DFCD80E00175A82 /* Video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Video.cpp; path = Electron/Video.cpp; sourceTree = "<group>"; };
4B7913CB1DFCD80E00175A82 /* Video.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Video.hpp; path = Electron/Video.hpp; sourceTree = "<group>"; };
4B79A4FE1FC9082300EEDAD5 /* TypedDynamicMachine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = TypedDynamicMachine.hpp; sourceTree = "<group>"; };
4B79E4411E3AF38600141F11 /* cassette.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cassette.png; sourceTree = "<group>"; };
4B79E4421E3AF38600141F11 /* floppy35.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = floppy35.png; sourceTree = "<group>"; };
4B79E4431E3AF38600141F11 /* floppy525.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = floppy525.png; sourceTree = "<group>"; };
@ -1471,11 +1472,12 @@
isa = PBXGroup;
children = (
4B055ABE1FAE98000060FFFF /* MachineForTarget.cpp */,
4B055ABF1FAE98000060FFFF /* MachineForTarget.hpp */,
4B2B3A471F9B8FA70062DABF /* Typer.cpp */,
4B2B3A481F9B8FA70062DABF /* MemoryFuzzer.cpp */,
4B2B3A471F9B8FA70062DABF /* Typer.cpp */,
4B055ABF1FAE98000060FFFF /* MachineForTarget.hpp */,
4B2B3A491F9B8FA70062DABF /* MemoryFuzzer.hpp */,
4B2B3A4A1F9B8FA70062DABF /* Typer.hpp */,
4B79A4FE1FC9082300EEDAD5 /* TypedDynamicMachine.hpp */,
);
path = Utility;
sourceTree = "<group>";

View File

@ -17,7 +17,7 @@ class ElectronOptionsPanel: MachinePanel {
@IBOutlet var displayTypeButton: NSPopUpButton?
@IBAction func setDisplayType(_ sender: NSPopUpButton!) {
electron.useTelevisionOutput = (sender.indexOfSelectedItem == 1)
electron.useCompositeOutput = (sender.indexOfSelectedItem == 1)
UserDefaults.standard.set(sender.indexOfSelectedItem, forKey: self.displayTypeUserDefaultsKey)
}
@ -29,7 +29,7 @@ class ElectronOptionsPanel: MachinePanel {
])
let displayType = standardUserDefaults.integer(forKey: self.displayTypeUserDefaultsKey)
electron.useTelevisionOutput = (displayType == 1)
electron.useCompositeOutput = (displayType == 1)
self.displayTypeButton?.selectItem(at: displayType)
}
}

View File

@ -12,4 +12,5 @@
@interface CSMachine (Subclassing)
- (void)setupOutputWithAspectRatio:(float)aspectRatio;
@end

View File

@ -22,7 +22,7 @@
/*!
Initialises an instance of CSMachine.
@param machine The pointer to an instance of @c CRTMachine::Machine* . C++ type is omitted because
@param machine The pointer to an instance of @c Machine::DynamicMachine . C++ type is omitted because
this header is visible to Swift, and the designated initialiser cannot be placed into a category.
*/
- (instancetype)initWithMachine:(void *)machine NS_DESIGNATED_INITIALIZER;
@ -49,4 +49,8 @@
- (void)paste:(NSString *)string;
@property (nonatomic, assign) BOOL useFastLoadingHack;
@property (nonatomic, assign) BOOL useCompositeOutput;
@property (nonatomic, assign) BOOL useAutomaticTapeMotorControl;
@end

View File

@ -10,11 +10,13 @@
#import "CSMachine+Subclassing.h"
#import "CSMachine+Target.h"
#include "KeyCodes.h"
#include "Typer.hpp"
#include "ConfigurationTarget.hpp"
#include "JoystickMachine.hpp"
#include "KeyboardMachine.hpp"
#include "KeyCodes.h"
#include "MachineForTarget.hpp"
#include "StandardOptions.hpp"
#include "Typer.hpp"
#import "NSBundle+DataResource.h"
#import "NSData+StdVector.h"
@ -57,13 +59,13 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
SpeakerDelegate _speakerDelegate;
MachineDelegate _machineDelegate;
NSLock *_delegateMachineAccessLock;
CRTMachine::Machine *_machine;
Machine::DynamicMachine *_machine;
}
- (instancetype)initWithMachine:(void *)machine {
self = [super init];
if(self) {
_machine = (CRTMachine::Machine *)machine;
_machine = (Machine::DynamicMachine *)machine;
_delegateMachineAccessLock = [[NSLock alloc] init];
_machineDelegate.machine = self;
@ -71,8 +73,8 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
_machineDelegate.machineAccessLock = _delegateMachineAccessLock;
_speakerDelegate.machineAccessLock = _delegateMachineAccessLock;
_machine->set_delegate(&_machineDelegate);
_machine->set_rom_fetcher( [] (const std::string &machine, const std::vector<std::string> &names) -> std::vector<std::unique_ptr<std::vector<std::uint8_t>>> {
_machine->crt_machine()->set_delegate(&_machineDelegate);
_machine->crt_machine()->set_rom_fetcher( [] (const std::string &machine, const std::vector<std::string> &names) -> std::vector<std::unique_ptr<std::vector<std::uint8_t>>> {
NSString *subDirectory = [@"ROMImages/" stringByAppendingString:[NSString stringWithUTF8String:machine.c_str()]];
std::vector<std::unique_ptr<std::vector<std::uint8_t>>> results;
for(auto &name: names) {
@ -119,14 +121,14 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
[_view performWithGLContext:^{
@synchronized(self) {
_machine->close_output();
_machine->crt_machine()->close_output();
}
}];
}
- (float)idealSamplingRateFromRange:(NSRange)range {
@synchronized(self) {
std::shared_ptr<Outputs::Speaker> speaker = _machine->get_speaker();
std::shared_ptr<Outputs::Speaker> speaker = _machine->crt_machine()->get_speaker();
if(speaker) {
return speaker->get_ideal_clock_rate_in_range((float)range.location, (float)(range.location + range.length));
}
@ -142,7 +144,7 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
- (BOOL)setSpeakerDelegate:(Outputs::Speaker::Delegate *)delegate sampleRate:(float)sampleRate bufferSize:(NSUInteger)bufferSize {
@synchronized(self) {
std::shared_ptr<Outputs::Speaker> speaker = _machine->get_speaker();
std::shared_ptr<Outputs::Speaker> speaker = _machine->crt_machine()->get_speaker();
if(speaker) {
speaker->set_output_rate(sampleRate, (int)bufferSize);
speaker->set_delegate(delegate);
@ -154,7 +156,7 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
- (void)runForNumberOfCycles:(int)numberOfCycles {
@synchronized(self) {
_machine->run_for(Cycles(numberOfCycles));
_machine->crt_machine()->run_for(Cycles(numberOfCycles));
}
}
@ -166,49 +168,47 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
}
- (void)setupOutputWithAspectRatio:(float)aspectRatio {
_machine->setup_output(aspectRatio);
_machine->crt_machine()->setup_output(aspectRatio);
// Since OS X v10.6, Macs have had a gamma of 2.2.
_machine->get_crt()->set_output_gamma(2.2f);
_machine->get_crt()->set_target_framebuffer(0);
_machine->crt_machine()->get_crt()->set_output_gamma(2.2f);
_machine->crt_machine()->get_crt()->set_target_framebuffer(0);
}
- (void)drawViewForPixelSize:(CGSize)pixelSize onlyIfDirty:(BOOL)onlyIfDirty {
_machine->get_crt()->draw_frame((unsigned int)pixelSize.width, (unsigned int)pixelSize.height, onlyIfDirty ? true : false);
_machine->crt_machine()->get_crt()->draw_frame((unsigned int)pixelSize.width, (unsigned int)pixelSize.height, onlyIfDirty ? true : false);
}
- (double)clockRate {
return _machine->get_clock_rate();
return _machine->crt_machine()->get_clock_rate();
}
- (BOOL)clockIsUnlimited {
return _machine->get_clock_is_unlimited() ? YES : NO;
return _machine->crt_machine()->get_clock_is_unlimited() ? YES : NO;
}
- (void)paste:(NSString *)paste {
Utility::TypeRecipient *typeRecipient = dynamic_cast<Utility::TypeRecipient *>(_machine);
Utility::TypeRecipient *typeRecipient = _machine->type_recipient();
if(typeRecipient)
typeRecipient->set_typer_for_string([paste UTF8String]);
}
- (void)applyTarget:(const StaticAnalyser::Target &)target {
@synchronized(self) {
ConfigurationTarget::Machine *const configurationTarget =
dynamic_cast<ConfigurationTarget::Machine *>(_machine);
ConfigurationTarget::Machine *const configurationTarget = _machine->configuration_target();
if(configurationTarget) configurationTarget->configure_as_target(target);
}
}
- (void)applyMedia:(const StaticAnalyser::Media &)media {
@synchronized(self) {
ConfigurationTarget::Machine *const configurationTarget =
dynamic_cast<ConfigurationTarget::Machine *>(_machine);
ConfigurationTarget::Machine *const configurationTarget = _machine->configuration_target();
if(configurationTarget) configurationTarget->insert_media(media);
}
}
- (void)setKey:(uint16_t)key isPressed:(BOOL)isPressed {
auto keyboard_machine = dynamic_cast<KeyboardMachine::Machine *>(_machine);
auto keyboard_machine = _machine->keyboard_machine();
if(keyboard_machine) {
@synchronized(self) {
Inputs::Keyboard &keyboard = keyboard_machine->get_keyboard();
@ -272,7 +272,7 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
return;
}
auto joystick_machine = dynamic_cast<JoystickMachine::Machine *>(_machine);
auto joystick_machine = _machine->joystick_machine();
if(joystick_machine) {
@synchronized(self) {
std::vector<std::unique_ptr<Inputs::Joystick>> &joysticks = joystick_machine->get_joysticks();
@ -292,14 +292,14 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
}
- (void)clearAllKeys {
auto keyboard_machine = dynamic_cast<KeyboardMachine::Machine *>(_machine);
auto keyboard_machine = _machine->keyboard_machine();
if(keyboard_machine) {
@synchronized(self) {
keyboard_machine->get_keyboard().reset_all_keys();
}
}
auto joystick_machine = dynamic_cast<JoystickMachine::Machine *>(_machine);
auto joystick_machine = _machine->joystick_machine();
if(joystick_machine) {
@synchronized(self) {
for(auto &joystick : joystick_machine->get_joysticks()) {
@ -309,4 +309,45 @@ struct MachineDelegate: CRTMachine::Machine::Delegate, public LockProtectedDeleg
}
}
#pragma mark - Options
- (void)setUseFastLoadingHack:(BOOL)useFastLoadingHack {
Configurable::Device *configurable_device = _machine->configurable_device();
if(!configurable_device) return;
@synchronized(self) {
_useFastLoadingHack = useFastLoadingHack;
Configurable::SelectionSet selection_set;
append_quick_load_tape_selection(selection_set, useFastLoadingHack ? true : false);
configurable_device->set_selections(selection_set);
}
}
- (void)setUseCompositeOutput:(BOOL)useCompositeOutput {
Configurable::Device *configurable_device = _machine->configurable_device();
if(!configurable_device) return;
@synchronized(self) {
_useCompositeOutput = useCompositeOutput;
Configurable::SelectionSet selection_set;
append_display_selection(selection_set, useCompositeOutput ? Configurable::Display::Composite : Configurable::Display::RGB);
configurable_device->set_selections(selection_set);
}
}
- (void)setUseAutomaticTapeMotorControl:(BOOL)useAutomaticTapeMotorControl {
Configurable::Device *configurable_device = _machine->configurable_device();
if(!configurable_device) return;
@synchronized(self) {
_useAutomaticTapeMotorControl = useAutomaticTapeMotorControl;
Configurable::SelectionSet selection_set;
append_automatic_tape_motor_control_selection(selection_set, useAutomaticTapeMotorControl ? true : false);
configurable_device->set_selections(selection_set);
}
}
@end

View File

@ -9,19 +9,15 @@
#import "CSAmstradCPC.h"
#include "AmstradCPC.hpp"
#include "TypedDynamicMachine.hpp"
@implementation CSAmstradCPC {
std::unique_ptr<AmstradCPC::Machine> _amstradCPC;
Machine::TypedDynamicMachine<AmstradCPC::Machine> _amstradCPC;
}
- (instancetype)init {
AmstradCPC::Machine *machine = AmstradCPC::Machine::AmstradCPC();
self = [super initWithMachine:machine];
if(self) {
_amstradCPC.reset(machine);
}
return self;
_amstradCPC = Machine::TypedDynamicMachine<AmstradCPC::Machine>(AmstradCPC::Machine::AmstradCPC());
return [super initWithMachine:&_amstradCPC];
}
- (NSString *)userDefaultsPrefix { return @"amstradCPC"; }

View File

@ -9,24 +9,21 @@
#import "CSAtari2600.h"
#include "Atari2600.hpp"
#include "TypedDynamicMachine.hpp"
#import "CSMachine+Subclassing.h"
@implementation CSAtari2600 {
std::unique_ptr<Atari2600::Machine> _atari2600;
Machine::TypedDynamicMachine<Atari2600::Machine> _atari2600;
}
- (instancetype)init {
Atari2600::Machine *machine = Atari2600::Machine::Atari2600();
self = [super initWithMachine:machine];
if(self) {
_atari2600.reset(machine);
}
return self;
_atari2600 = Machine::TypedDynamicMachine<Atari2600::Machine>(Atari2600::Machine::Atari2600());
return [super initWithMachine:&_atari2600];
}
- (void)setResetLineEnabled:(BOOL)enabled {
@synchronized(self) {
_atari2600->set_reset_switch(enabled ? true : false);
_atari2600.get()->set_reset_switch(enabled ? true : false);
}
}
@ -41,31 +38,31 @@
- (void)setColourButton:(BOOL)colourButton {
_colourButton = colourButton;
@synchronized(self) {
_atari2600->set_switch_is_enabled(Atari2600SwitchColour, colourButton);
_atari2600.get()->set_switch_is_enabled(Atari2600SwitchColour, colourButton);
}
}
- (void)setLeftPlayerDifficultyButton:(BOOL)leftPlayerDifficultyButton {
_leftPlayerDifficultyButton = leftPlayerDifficultyButton;
@synchronized(self) {
_atari2600->set_switch_is_enabled(Atari2600SwitchLeftPlayerDifficulty, leftPlayerDifficultyButton);
_atari2600.get()->set_switch_is_enabled(Atari2600SwitchLeftPlayerDifficulty, leftPlayerDifficultyButton);
}
}
- (void)setRightPlayerDifficultyButton:(BOOL)rightPlayerDifficultyButton {
_rightPlayerDifficultyButton = rightPlayerDifficultyButton;
@synchronized(self) {
_atari2600->set_switch_is_enabled(Atari2600SwitchRightPlayerDifficulty, rightPlayerDifficultyButton);
_atari2600.get()->set_switch_is_enabled(Atari2600SwitchRightPlayerDifficulty, rightPlayerDifficultyButton);
}
}
- (void)toggleSwitch:(Atari2600Switch)toggleSwitch {
@synchronized(self) {
_atari2600->set_switch_is_enabled(toggleSwitch, true);
_atari2600.get()->set_switch_is_enabled(toggleSwitch, true);
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
@synchronized(self) {
_atari2600->set_switch_is_enabled(toggleSwitch, false);
_atari2600.get()->set_switch_is_enabled(toggleSwitch, false);
}
});
}

View File

@ -13,7 +13,4 @@
- (instancetype)init;
@property (nonatomic, assign) BOOL useFastLoadingHack;
@property (nonatomic, assign) BOOL useTelevisionOutput;
@end

View File

@ -9,45 +9,19 @@
#import "CSElectron.h"
#include "Electron.hpp"
#include "StandardOptions.hpp"
#include "TypedDynamicMachine.hpp"
@implementation CSElectron {
std::unique_ptr<Electron::Machine> _electron;
Machine::TypedDynamicMachine<Electron::Machine> _electron;
}
- (instancetype)init {
Electron::Machine *machine = Electron::Machine::Electron();
self = [super initWithMachine:machine];
if(self) {
_electron.reset(machine);
}
return self;
_electron = Machine::TypedDynamicMachine<Electron::Machine>(Electron::Machine::Electron());
return [super initWithMachine:&_electron];
}
#pragma mark - ROM setting
- (NSString *)userDefaultsPrefix { return @"electron"; }
#pragma mark - Options
- (void)setUseFastLoadingHack:(BOOL)useFastLoadingHack {
@synchronized(self) {
_useFastLoadingHack = useFastLoadingHack;
Configurable::SelectionSet selection_set;
append_quick_load_tape_selection(selection_set, useFastLoadingHack ? true : false);
_electron->set_selections(selection_set);
}
}
- (void)setUseTelevisionOutput:(BOOL)useTelevisionOutput {
@synchronized(self) {
_useTelevisionOutput = useTelevisionOutput;
Configurable::SelectionSet selection_set;
append_display_selection(selection_set, useTelevisionOutput ? Configurable::Display::Composite : Configurable::Display::RGB);
_electron->set_selections(selection_set);
}
}
@end

View File

@ -13,7 +13,4 @@
- (instancetype)init;
@property (nonatomic, assign) BOOL useFastLoadingHack;
@property (nonatomic, assign) BOOL useCompositeOutput;
@end

View File

@ -9,42 +9,15 @@
#import "CSOric.h"
#include "Oric.hpp"
#include "StandardOptions.hpp"
#include "TypedDynamicMachine.hpp"
@implementation CSOric {
std::unique_ptr<Oric::Machine> _oric;
Machine::TypedDynamicMachine<Oric::Machine> _oric;
}
- (instancetype)init {
Oric::Machine *machine = Oric::Machine::Oric();
self = [super initWithMachine:machine];
if(self) {
_oric.reset(machine);
}
return self;
}
#pragma mark - Options
- (void)setUseFastLoadingHack:(BOOL)useFastLoadingHack {
@synchronized(self) {
_useFastLoadingHack = useFastLoadingHack;
Configurable::SelectionSet selection_set;
append_quick_load_tape_selection(selection_set, useFastLoadingHack ? true : false);
_oric->set_selections(selection_set);
}
}
- (void)setUseCompositeOutput:(BOOL)useCompositeOutput {
@synchronized(self) {
_useCompositeOutput = useCompositeOutput;
Configurable::SelectionSet selection_set;
append_display_selection(selection_set, useCompositeOutput ? Configurable::Display::Composite : Configurable::Display::RGB);
_oric->set_selections(selection_set);
}
_oric = Machine::TypedDynamicMachine<Oric::Machine>(Oric::Machine::Oric());
return [super initWithMachine:&_oric];
}
@end

View File

@ -29,7 +29,6 @@ typedef NS_ENUM(NSInteger, CSVic20MemorySize)
- (instancetype)init;
@property (nonatomic, assign) BOOL useFastLoadingHack;
@property (nonatomic, assign) CSVic20Country country;
@property (nonatomic, assign) CSVic20MemorySize memorySize;

View File

@ -9,28 +9,19 @@
#import "CSVic20.h"
#include "Vic20.hpp"
#include "StandardOptions.hpp"
using namespace Commodore::Vic20;
#include "TypedDynamicMachine.hpp"
@implementation CSVic20 {
std::unique_ptr<Machine> _vic20;
BOOL _joystickMode;
Machine::TypedDynamicMachine<Commodore::Vic20::Machine> _vic20;
}
- (instancetype)init {
_vic20 = Machine::TypedDynamicMachine<Commodore::Vic20::Machine>(Commodore::Vic20::Machine::Vic20());
return [super initWithMachine:&_vic20];
}
- (NSString *)userDefaultsPrefix { return @"vic20"; }
- (instancetype)init {
Machine *machine = Commodore::Vic20::Machine::Vic20();
self = [super initWithMachine:machine];
if(self) {
_vic20.reset(machine);
[self setCountry:CSVic20CountryEuropean];
}
return self;
}
#pragma mark - Keyboard map
/*- (void)setKey:(uint16_t)key isPressed:(BOOL)isPressed {
@ -45,15 +36,6 @@ using namespace Commodore::Vic20;
#pragma mark - Public configuration options
- (void)setUseFastLoadingHack:(BOOL)useFastLoadingHack {
_useFastLoadingHack = useFastLoadingHack;
@synchronized(self) {
Configurable::SelectionSet selection_set;
append_quick_load_tape_selection(selection_set, useFastLoadingHack ? true : false);
_vic20->set_selections(selection_set);
}
}
- (void)setCountry:(CSVic20Country)country {
_country = country;
Commodore::Vic20::Region region;
@ -66,7 +48,7 @@ using namespace Commodore::Vic20;
}
@synchronized(self) {
_vic20->set_region(region);
_vic20.get()->set_region(region);
}
}
@ -74,9 +56,9 @@ using namespace Commodore::Vic20;
_memorySize = memorySize;
@synchronized(self) {
switch(memorySize) {
case CSVic20MemorySize5Kb: _vic20->set_memory_size(Commodore::Vic20::Default); break;
case CSVic20MemorySize8Kb: _vic20->set_memory_size(Commodore::Vic20::ThreeKB); break;
case CSVic20MemorySize32Kb: _vic20->set_memory_size(Commodore::Vic20::ThirtyTwoKB); break;
case CSVic20MemorySize5Kb: _vic20.get()->set_memory_size(Commodore::Vic20::Default); break;
case CSVic20MemorySize8Kb: _vic20.get()->set_memory_size(Commodore::Vic20::ThreeKB); break;
case CSVic20MemorySize32Kb: _vic20.get()->set_memory_size(Commodore::Vic20::ThirtyTwoKB); break;
}
}
}

View File

@ -11,9 +11,6 @@
@interface CSZX8081 : CSMachine <CSFastLoading>
@property (nonatomic, assign) BOOL useFastLoadingHack;
@property (nonatomic, assign) BOOL useAutomaticTapeMotorControl;
@property (nonatomic, assign) BOOL tapeIsPlaying;
@end

View File

@ -9,50 +9,25 @@
#import "CSZX8081.h"
#include "ZX8081.hpp"
#include "StandardOptions.hpp"
#include "TypedDynamicMachine.hpp"
@implementation CSZX8081 {
std::unique_ptr<ZX8081::Machine> _zx8081;
Machine::TypedDynamicMachine<ZX8081::Machine> _zx8081;
}
- (instancetype)initWithIntendedTarget:(const StaticAnalyser::Target &)target {
ZX8081::Machine *machine = ZX8081::Machine::ZX8081(target);
self = [super initWithMachine:machine];
if(self) {
_zx8081.reset(machine);
}
return self;
_zx8081 = Machine::TypedDynamicMachine<ZX8081::Machine>(ZX8081::Machine::ZX8081(target));
return [super initWithMachine:&_zx8081];
}
- (NSString *)userDefaultsPrefix { return @"zx8081"; }
#pragma mark - Options
- (void)setUseFastLoadingHack:(BOOL)useFastLoadingHack {
@synchronized(self) {
_useFastLoadingHack = useFastLoadingHack;
Configurable::SelectionSet selection_set;
append_quick_load_tape_selection(selection_set, useFastLoadingHack ? true : false);
_zx8081->set_selections(selection_set);
}
}
- (void)setTapeIsPlaying:(BOOL)tapeIsPlaying {
@synchronized(self) {
_tapeIsPlaying = tapeIsPlaying;
_zx8081->set_tape_is_playing(tapeIsPlaying ? true : false);
}
}
- (void)setUseAutomaticTapeMotorControl:(BOOL)useAutomaticTapeMotorControl {
@synchronized(self) {
_useAutomaticTapeMotorControl = useAutomaticTapeMotorControl;
Configurable::SelectionSet selection_set;
append_automatic_tape_motor_control_selection(selection_set, useAutomaticTapeMotorControl ? true : false);
_zx8081->set_selections(selection_set);
_zx8081.get()->set_tape_is_playing(tapeIsPlaying ? true : false);
}
}