2016-08-31 20:43:29 -04:00
|
|
|
//
|
|
|
|
// CSStaticAnalyser.m
|
|
|
|
// Clock Signal
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 31/08/2016.
|
2018-05-13 15:19:52 -04:00
|
|
|
// Copyright 2016 Thomas Harte. All rights reserved.
|
2016-08-31 20:43:29 -04:00
|
|
|
//
|
|
|
|
|
|
|
|
#import "CSStaticAnalyser.h"
|
|
|
|
|
|
|
|
#import "CSMachine.h"
|
|
|
|
#import "CSMachine+Target.h"
|
|
|
|
|
2016-10-11 22:20:13 -04:00
|
|
|
#include "StaticAnalyser.hpp"
|
|
|
|
|
2018-04-02 22:42:41 -04:00
|
|
|
#include "../../../../../Analyser/Static/Acorn/Target.hpp"
|
2021-08-06 21:58:31 -04:00
|
|
|
#include "../../../../../Analyser/Static/Amiga/Target.hpp"
|
2018-04-02 22:42:41 -04:00
|
|
|
#include "../../../../../Analyser/Static/AmstradCPC/Target.hpp"
|
2018-04-23 21:14:45 -07:00
|
|
|
#include "../../../../../Analyser/Static/AppleII/Target.hpp"
|
2020-10-20 22:18:11 -04:00
|
|
|
#include "../../../../../Analyser/Static/AppleIIgs/Target.hpp"
|
2020-03-15 00:13:38 -04:00
|
|
|
#include "../../../../../Analyser/Static/AtariST/Target.hpp"
|
2018-04-02 22:42:41 -04:00
|
|
|
#include "../../../../../Analyser/Static/Commodore/Target.hpp"
|
2021-06-14 20:55:39 -04:00
|
|
|
#include "../../../../../Analyser/Static/Enterprise/Target.hpp"
|
2019-06-03 14:50:36 -04:00
|
|
|
#include "../../../../../Analyser/Static/Macintosh/Target.hpp"
|
2018-04-02 22:42:41 -04:00
|
|
|
#include "../../../../../Analyser/Static/MSX/Target.hpp"
|
|
|
|
#include "../../../../../Analyser/Static/Oric/Target.hpp"
|
|
|
|
#include "../../../../../Analyser/Static/ZX8081/Target.hpp"
|
2021-03-21 21:50:50 -04:00
|
|
|
#include "../../../../../Analyser/Static/ZXSpectrum/Target.hpp"
|
2018-04-02 22:42:41 -04:00
|
|
|
|
2016-10-11 22:20:13 -04:00
|
|
|
#import "Clock_Signal-Swift.h"
|
|
|
|
|
2017-07-30 22:05:29 -04:00
|
|
|
@implementation CSStaticAnalyser {
|
2018-04-14 19:46:15 -04:00
|
|
|
Analyser::Static::TargetList _targets;
|
2016-08-31 20:43:29 -04:00
|
|
|
}
|
|
|
|
|
2020-06-18 23:34:28 -04:00
|
|
|
// MARK: - File-based Initialiser
|
|
|
|
|
2017-07-30 22:05:29 -04:00
|
|
|
- (instancetype)initWithFileAtURL:(NSURL *)url {
|
2016-08-31 20:43:29 -04:00
|
|
|
self = [super init];
|
2017-07-30 22:05:29 -04:00
|
|
|
if(self) {
|
2018-01-24 21:48:44 -05:00
|
|
|
_targets = Analyser::Static::GetTargets([url fileSystemRepresentation]);
|
2018-01-23 22:18:16 -05:00
|
|
|
if(!_targets.size()) return nil;
|
2016-09-12 22:15:38 -04:00
|
|
|
|
2018-01-24 20:14:15 -05:00
|
|
|
// TODO: could this better be supplied by the analyser? A hypothetical file format might
|
|
|
|
// provide a better name for it contents than the file name?
|
2020-12-31 13:23:46 -07:00
|
|
|
_displayName = [url.lastPathComponent copy];
|
2016-08-31 20:43:29 -04:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2020-06-18 23:34:28 -04:00
|
|
|
// MARK: - Machine-based Initialisers
|
|
|
|
|
2021-12-22 18:20:55 -05:00
|
|
|
- (instancetype)initWithAmigaModel:(CSMachineAmigaModel)model chipMemorySize:(Kilobytes)chipMemorySize fastMemorySize:(Kilobytes)fastMemorySize {
|
2021-08-06 21:58:31 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Amiga::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
2021-12-22 18:20:55 -05:00
|
|
|
|
|
|
|
switch(chipMemorySize) {
|
|
|
|
default: return nil;
|
|
|
|
case 512: target->chip_ram = Target::ChipRAM::FiveHundredAndTwelveKilobytes; break;
|
|
|
|
case 1024: target->chip_ram = Target::ChipRAM::OneMegabyte; break;
|
|
|
|
case 2048: target->chip_ram = Target::ChipRAM::TwoMegabytes; break;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(fastMemorySize) {
|
|
|
|
default: return nil;
|
|
|
|
case 0: target->fast_ram = Target::FastRAM::None; break;
|
|
|
|
case 1024: target->fast_ram = Target::FastRAM::OneMegabyte; break;
|
|
|
|
case 2048: target->fast_ram = Target::FastRAM::TwoMegabytes; break;
|
|
|
|
case 4096: target->fast_ram = Target::FastRAM::FourMegabytes; break;
|
|
|
|
case 8192: target->fast_ram = Target::FastRAM::EightMegabytes; break;
|
|
|
|
}
|
|
|
|
|
2021-08-06 21:58:31 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2020-06-18 23:34:28 -04:00
|
|
|
- (instancetype)initWithAmstradCPCModel:(CSMachineCPCModel)model {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::AmstradCPC::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
|
|
|
switch(model) {
|
|
|
|
case CSMachineCPCModel464: target->model = Target::Model::CPC464; break;
|
|
|
|
case CSMachineCPCModel664: target->model = Target::Model::CPC664; break;
|
|
|
|
case CSMachineCPCModel6128: target->model = Target::Model::CPC6128; break;
|
|
|
|
}
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithAppleIIModel:(CSMachineAppleIIModel)model diskController:(CSMachineAppleIIDiskController)diskController {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::AppleII::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
|
|
|
switch(model) {
|
|
|
|
default: target->model = Target::Model::II; break;
|
|
|
|
case CSMachineAppleIIModelAppleIIPlus: target->model = Target::Model::IIplus; break;
|
|
|
|
case CSMachineAppleIIModelAppleIIe: target->model = Target::Model::IIe; break;
|
|
|
|
case CSMachineAppleIIModelAppleEnhancedIIe: target->model = Target::Model::EnhancedIIe; break;
|
|
|
|
}
|
|
|
|
switch(diskController) {
|
|
|
|
default:
|
|
|
|
case CSMachineAppleIIDiskControllerNone: target->disk_controller = Target::DiskController::None; break;
|
|
|
|
case CSMachineAppleIIDiskControllerSixteenSector: target->disk_controller = Target::DiskController::SixteenSector; break;
|
|
|
|
case CSMachineAppleIIDiskControllerThirteenSector: target->disk_controller = Target::DiskController::ThirteenSector; break;
|
|
|
|
}
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2020-10-20 22:18:11 -04:00
|
|
|
- (instancetype)initWithAppleIIgsModel:(CSMachineAppleIIgsModel)model memorySize:(Kilobytes)memorySize {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::AppleIIgs::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
|
|
|
switch(model) {
|
|
|
|
default: target->model = Target::Model::ROM00; break;
|
|
|
|
case CSMachineAppleIIgsModelROM01: target->model = Target::Model::ROM01; break;
|
|
|
|
case CSMachineAppleIIgsModelROM03: target->model = Target::Model::ROM03; break;
|
|
|
|
}
|
|
|
|
switch(memorySize) {
|
|
|
|
default: target->memory_model = Target::MemoryModel::EightMB; break;
|
|
|
|
case 1024: target->memory_model = Target::MemoryModel::OneMB; break;
|
|
|
|
case 256: target->memory_model = Target::MemoryModel::TwoHundredAndFiftySixKB; break;
|
|
|
|
}
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-08-10 14:58:19 -04:00
|
|
|
- (instancetype)initWithAtariSTModel:(CSMachineAtariSTModel)model memorySize:(Kilobytes)memorySize {
|
2020-06-18 23:34:28 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::AtariST::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
2022-08-10 14:58:19 -04:00
|
|
|
switch(memorySize) {
|
|
|
|
default: target->memory_size = Target::MemorySize::FiveHundredAndTwelveKilobytes; break;
|
|
|
|
case 1024: target->memory_size = Target::MemorySize::OneMegabyte; break;
|
|
|
|
case 4096: target->memory_size = Target::MemorySize::FourMegabytes; break;
|
|
|
|
}
|
2020-06-18 23:34:28 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2021-01-31 09:49:51 -05:00
|
|
|
- (instancetype)initWithElectronDFS:(BOOL)dfs adfs:(BOOL)adfs ap6:(BOOL)ap6 sidewaysRAM:(BOOL)sidewaysRAM {
|
2018-04-02 22:42:41 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Acorn::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2021-01-31 09:49:51 -05:00
|
|
|
target->has_dfs = dfs;
|
2021-01-31 13:12:59 -05:00
|
|
|
target->has_pres_adfs = adfs;
|
2021-01-31 09:49:51 -05:00
|
|
|
target->has_ap6_rom = ap6;
|
|
|
|
target->has_sideways_ram = sidewaysRAM;
|
2018-04-02 22:42:41 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2021-07-08 18:50:37 -04:00
|
|
|
- (instancetype)initWithEnterpriseModel:(CSMachineEnterpriseModel)model speed:(CSMachineEnterpriseSpeed)speed exosVersion:(CSMachineEnterpriseEXOS)exosVersion basicVersion:(CSMachineEnterpriseBASIC)basicVersion dos:(CSMachineEnterpriseDOS)dos {
|
2021-06-14 20:55:39 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Enterprise::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
2021-06-22 21:39:07 -04:00
|
|
|
|
|
|
|
switch(model) {
|
|
|
|
case CSMachineEnterpriseModel64: target->model = Target::Model::Enterprise64; break;
|
|
|
|
default:
|
|
|
|
case CSMachineEnterpriseModel128: target->model = Target::Model::Enterprise128; break;
|
|
|
|
case CSMachineEnterpriseModel256: target->model = Target::Model::Enterprise256; break;
|
|
|
|
}
|
|
|
|
|
2021-07-08 18:50:37 -04:00
|
|
|
switch(speed) {
|
|
|
|
case CSMachineEnterpriseSpeed6MHz: target->speed = Target::Speed::SixMHz; break;
|
|
|
|
default:
|
|
|
|
case CSMachineEnterpriseSpeed4MHz: target->speed = Target::Speed::FourMHz; break;
|
|
|
|
}
|
|
|
|
|
2021-06-22 21:39:07 -04:00
|
|
|
switch(exosVersion) {
|
|
|
|
case CSMachineEnterpriseEXOSVersion21: target->exos_version = Target::EXOSVersion::v21; break;
|
|
|
|
default:
|
|
|
|
case CSMachineEnterpriseEXOSVersion20: target->exos_version = Target::EXOSVersion::v20; break;
|
|
|
|
case CSMachineEnterpriseEXOSVersion10: target->exos_version = Target::EXOSVersion::v10; break;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(basicVersion) {
|
|
|
|
case CSMachineEnterpriseBASICNone: target->basic_version = Target::BASICVersion::None; break;
|
|
|
|
default:
|
|
|
|
case CSMachineEnterpriseBASICVersion21: target->basic_version = Target::BASICVersion::v21; break;
|
|
|
|
case CSMachineEnterpriseBASICVersion11: target->basic_version = Target::BASICVersion::v11; break;
|
|
|
|
case CSMachineEnterpriseBASICVersion10: target->basic_version = Target::BASICVersion::v10; break;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(dos) {
|
|
|
|
case CSMachineEnterpriseDOSEXDOS: target->dos = Target::DOS::EXDOS; break;
|
|
|
|
default:
|
|
|
|
case CSMachineEnterpriseDOSNone: target->dos = Target::DOS::None; break;
|
|
|
|
}
|
|
|
|
|
2021-06-14 20:55:39 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2020-06-18 23:34:28 -04:00
|
|
|
- (instancetype)initWithMacintoshModel:(CSMachineMacintoshModel)model {
|
2018-04-02 22:42:41 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
2020-06-18 23:34:28 -04:00
|
|
|
using Target = Analyser::Static::Macintosh::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2020-06-18 23:34:28 -04:00
|
|
|
|
|
|
|
using Model = Target::Model;
|
2018-04-02 22:42:41 -04:00
|
|
|
switch(model) {
|
2020-06-18 23:34:28 -04:00
|
|
|
default:
|
|
|
|
case CSMachineMacintoshModel128k: target->model = Model::Mac128k; break;
|
|
|
|
case CSMachineMacintoshModel512k: target->model = Model::Mac512k; break;
|
|
|
|
case CSMachineMacintoshModel512ke: target->model = Model::Mac512ke; break;
|
|
|
|
case CSMachineMacintoshModelPlus: target->model = Model::MacPlus; break;
|
2018-04-02 22:42:41 -04:00
|
|
|
}
|
2020-06-18 23:34:28 -04:00
|
|
|
|
2018-04-02 22:42:41 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2023-05-13 22:25:50 -04:00
|
|
|
- (instancetype)initWithMSXModel:(CSMachineMSXModel)model region:(CSMachineMSXRegion)region hasDiskDrive:(BOOL)hasDiskDrive hasMSXMUSIC:(BOOL)hasMSXMUSIC {
|
2018-04-02 22:42:41 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::MSX::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2023-05-13 22:25:50 -04:00
|
|
|
target->has_disk_drive = hasDiskDrive;
|
|
|
|
target->has_msx_music = hasMSXMUSIC;
|
2019-02-28 20:54:43 -05:00
|
|
|
switch(region) {
|
2020-06-18 23:34:28 -04:00
|
|
|
case CSMachineMSXRegionAmerican: target->region = Target::Region::USA; break;
|
|
|
|
case CSMachineMSXRegionEuropean: target->region = Target::Region::Europe; break;
|
|
|
|
case CSMachineMSXRegionJapanese: target->region = Target::Region::Japan; break;
|
2019-02-28 20:54:43 -05:00
|
|
|
}
|
2023-03-21 20:05:10 -04:00
|
|
|
switch(model) {
|
|
|
|
case CSMachineMSXModelMSX1: target->model = Target::Model::MSX1; break;
|
|
|
|
case CSMachineMSXModelMSX2: target->model = Target::Model::MSX2; break;
|
|
|
|
}
|
2018-04-02 22:42:41 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-05-08 22:05:43 -04:00
|
|
|
- (instancetype)initWithOricModel:(CSMachineOricModel)model diskInterface:(CSMachineOricDiskInterface)diskInterface {
|
2018-04-02 22:42:41 -04:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Oric::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2018-05-08 22:05:43 -04:00
|
|
|
switch(model) {
|
|
|
|
case CSMachineOricModelOric1: target->rom = Target::ROM::BASIC10; break;
|
|
|
|
case CSMachineOricModelOricAtmos: target->rom = Target::ROM::BASIC11; break;
|
|
|
|
case CSMachineOricModelPravetz: target->rom = Target::ROM::Pravetz; break;
|
|
|
|
}
|
|
|
|
switch(diskInterface) {
|
|
|
|
case CSMachineOricDiskInterfaceNone: target->disk_interface = Target::DiskInterface::None; break;
|
|
|
|
case CSMachineOricDiskInterfaceMicrodisc: target->disk_interface = Target::DiskInterface::Microdisc; break;
|
|
|
|
case CSMachineOricDiskInterfacePravetz: target->disk_interface = Target::DiskInterface::Pravetz; break;
|
2020-01-05 21:57:33 -05:00
|
|
|
case CSMachineOricDiskInterfaceJasmin: target->disk_interface = Target::DiskInterface::Jasmin; break;
|
2020-01-15 23:56:56 -05:00
|
|
|
case CSMachineOricDiskInterfaceBD500: target->disk_interface = Target::DiskInterface::BD500; break;
|
2018-05-08 22:05:43 -04:00
|
|
|
}
|
2018-04-02 22:42:41 -04:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2021-03-21 21:50:50 -04:00
|
|
|
- (instancetype)initWithSpectrumModel:(CSMachineSpectrumModel)model {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::ZXSpectrum::Target;
|
|
|
|
auto target = std::make_unique<Target>();
|
|
|
|
switch(model) {
|
2021-04-14 21:37:10 -04:00
|
|
|
case CSMachineSpectrumModelSixteenK: target->model = Target::Model::SixteenK; break;
|
|
|
|
case CSMachineSpectrumModelFortyEightK: target->model = Target::Model::FortyEightK; break;
|
|
|
|
case CSMachineSpectrumModelOneTwoEightK: target->model = Target::Model::OneTwoEightK; break;
|
|
|
|
case CSMachineSpectrumModelPlus2: target->model = Target::Model::Plus2; break;
|
|
|
|
case CSMachineSpectrumModelPlus2a: target->model = Target::Model::Plus2a; break;
|
|
|
|
case CSMachineSpectrumModelPlus3: target->model = Target::Model::Plus3; break;
|
2021-03-21 21:50:50 -04:00
|
|
|
}
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-04-02 22:42:41 -04:00
|
|
|
- (instancetype)initWithVic20Region:(CSMachineVic20Region)region memorySize:(Kilobytes)memorySize hasC1540:(BOOL)hasC1540 {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Commodore::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2018-04-02 22:42:41 -04:00
|
|
|
switch(region) {
|
|
|
|
case CSMachineVic20RegionDanish: target->region = Target::Region::Danish; break;
|
|
|
|
case CSMachineVic20RegionSwedish: target->region = Target::Region::Swedish; break;
|
|
|
|
case CSMachineVic20RegionAmerican: target->region = Target::Region::American; break;
|
|
|
|
case CSMachineVic20RegionEuropean: target->region = Target::Region::European; break;
|
|
|
|
case CSMachineVic20RegionJapanese: target->region = Target::Region::Japanese; break;
|
|
|
|
}
|
2019-12-26 22:49:48 -05:00
|
|
|
auto memory_model = Target::MemoryModel::Unexpanded;
|
2018-04-02 22:42:41 -04:00
|
|
|
switch(memorySize) {
|
2019-12-26 22:49:48 -05:00
|
|
|
default: break;
|
|
|
|
case 8: memory_model = Target::MemoryModel::EightKB; break;
|
|
|
|
case 32: memory_model = Target::MemoryModel::ThirtyTwoKB; break;
|
2018-04-02 22:42:41 -04:00
|
|
|
}
|
2019-12-26 22:49:48 -05:00
|
|
|
target->set_memory_model(memory_model);
|
2018-04-02 22:42:41 -04:00
|
|
|
target->has_c1540 = !!hasC1540;
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Analyser::Static::ZX8081::Target::MemoryModel ZX8081MemoryModelFromSize(Kilobytes size) {
|
|
|
|
using MemoryModel = Analyser::Static::ZX8081::Target::MemoryModel;
|
|
|
|
switch(size) {
|
|
|
|
default: return MemoryModel::Unexpanded;
|
|
|
|
case 16: return MemoryModel::SixteenKB;
|
|
|
|
case 64: return MemoryModel::SixtyFourKB;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithZX80MemorySize:(Kilobytes)memorySize useZX81ROM:(BOOL)useZX81ROM {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::ZX8081::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2018-04-02 22:42:41 -04:00
|
|
|
target->is_ZX81 = false;
|
|
|
|
target->ZX80_uses_ZX81_ROM = !!useZX81ROM;
|
|
|
|
target->memory_model = ZX8081MemoryModelFromSize(memorySize);
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithZX81MemorySize:(Kilobytes)memorySize {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::ZX8081::Target;
|
2019-12-21 23:52:04 -05:00
|
|
|
auto target = std::make_unique<Target>();
|
2018-04-02 22:42:41 -04:00
|
|
|
target->is_ZX81 = true;
|
|
|
|
target->memory_model = ZX8081MemoryModelFromSize(memorySize);
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2020-06-18 23:34:28 -04:00
|
|
|
// MARK: - NIB mapping
|
2019-12-17 23:04:12 -05:00
|
|
|
|
2021-07-13 19:04:24 -04:00
|
|
|
- (NSString *)optionsNibName {
|
2018-01-24 22:35:54 -05:00
|
|
|
switch(_targets.front()->machine) {
|
2021-03-15 11:37:23 -04:00
|
|
|
// case Analyser::Machine::AmstradCPC: return @"QuickLoadCompositeOptions";
|
|
|
|
case Analyser::Machine::AmstradCPC: return @"CompositeOptions";
|
2019-02-12 19:52:32 -05:00
|
|
|
case Analyser::Machine::AppleII: return @"AppleIIOptions";
|
2018-10-23 22:30:24 -04:00
|
|
|
case Analyser::Machine::Atari2600: return @"Atari2600Options";
|
2019-12-20 20:49:14 -05:00
|
|
|
case Analyser::Machine::AtariST: return @"CompositeOptions";
|
2019-03-02 22:59:40 -05:00
|
|
|
case Analyser::Machine::ColecoVision: return @"CompositeOptions";
|
2018-10-23 22:30:24 -04:00
|
|
|
case Analyser::Machine::Electron: return @"QuickLoadCompositeOptions";
|
2021-07-02 21:42:09 -04:00
|
|
|
case Analyser::Machine::Enterprise: return @"CompositeOptions";
|
2019-09-19 22:32:12 -04:00
|
|
|
case Analyser::Machine::Macintosh: return @"MacintoshOptions";
|
2018-10-23 22:30:24 -04:00
|
|
|
case Analyser::Machine::MasterSystem: return @"CompositeOptions";
|
|
|
|
case Analyser::Machine::MSX: return @"QuickLoadCompositeOptions";
|
|
|
|
case Analyser::Machine::Oric: return @"OricOptions";
|
|
|
|
case Analyser::Machine::Vic20: return @"QuickLoadCompositeOptions";
|
|
|
|
case Analyser::Machine::ZX8081: return @"ZX8081Options";
|
2021-03-19 22:17:20 -04:00
|
|
|
case Analyser::Machine::ZXSpectrum: return @"QuickLoadCompositeOptions"; // TODO: @"ZXSpectrumOptions";
|
2016-10-11 07:39:48 -04:00
|
|
|
default: return nil;
|
2016-10-02 16:31:50 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-14 19:46:15 -04:00
|
|
|
- (Analyser::Static::TargetList &)targets {
|
2018-01-24 20:14:15 -05:00
|
|
|
return _targets;
|
|
|
|
}
|
|
|
|
|
2016-08-31 20:43:29 -04:00
|
|
|
@end
|
2017-08-17 11:00:08 -04:00
|
|
|
|
|
|
|
@implementation CSMediaSet {
|
2018-01-24 21:48:44 -05:00
|
|
|
Analyser::Static::Media _media;
|
2017-08-17 11:00:08 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithFileAtURL:(NSURL *)url {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
2018-01-24 21:48:44 -05:00
|
|
|
_media = Analyser::Static::GetMedia([url fileSystemRepresentation]);
|
2017-08-17 11:00:08 -04:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)applyToMachine:(CSMachine *)machine {
|
|
|
|
[machine applyMedia:_media];
|
|
|
|
}
|
|
|
|
|
2021-04-30 21:37:41 -04:00
|
|
|
- (BOOL)empty {
|
|
|
|
return _media.empty();
|
|
|
|
}
|
|
|
|
|
2017-08-17 11:00:08 -04:00
|
|
|
@end
|