mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-24 10:29:16 +00:00
Adapts the Mac port to use a Machine::DynamicMachine, thereby eliminating plenty of duplication.
This commit is contained in:
parent
fcf295fd68
commit
221c05ca76
@ -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) {
|
||||
|
61
Machines/Utility/TypedDynamicMachine.hpp
Normal file
61
Machines/Utility/TypedDynamicMachine.hpp
Normal 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 */
|
@ -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>";
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -12,4 +12,5 @@
|
||||
@interface CSMachine (Subclassing)
|
||||
|
||||
- (void)setupOutputWithAspectRatio:(float)aspectRatio;
|
||||
|
||||
@end
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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"; }
|
||||
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -13,7 +13,4 @@
|
||||
|
||||
- (instancetype)init;
|
||||
|
||||
@property (nonatomic, assign) BOOL useFastLoadingHack;
|
||||
@property (nonatomic, assign) BOOL useTelevisionOutput;
|
||||
|
||||
@end
|
||||
|
@ -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
|
||||
|
@ -13,7 +13,4 @@
|
||||
|
||||
- (instancetype)init;
|
||||
|
||||
@property (nonatomic, assign) BOOL useFastLoadingHack;
|
||||
@property (nonatomic, assign) BOOL useCompositeOutput;
|
||||
|
||||
@end
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,9 +11,6 @@
|
||||
|
||||
@interface CSZX8081 : CSMachine <CSFastLoading>
|
||||
|
||||
@property (nonatomic, assign) BOOL useFastLoadingHack;
|
||||
|
||||
@property (nonatomic, assign) BOOL useAutomaticTapeMotorControl;
|
||||
@property (nonatomic, assign) BOOL tapeIsPlaying;
|
||||
|
||||
@end
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user