2016-09-01 00:43:29 +00:00
|
|
|
//
|
|
|
|
// CSStaticAnalyser.m
|
|
|
|
// Clock Signal
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 31/08/2016.
|
2018-05-13 19:19:52 +00:00
|
|
|
// Copyright 2016 Thomas Harte. All rights reserved.
|
2016-09-01 00:43:29 +00:00
|
|
|
//
|
|
|
|
|
|
|
|
#import "CSStaticAnalyser.h"
|
|
|
|
|
|
|
|
#import "CSMachine.h"
|
|
|
|
#import "CSMachine+Target.h"
|
|
|
|
|
2016-10-12 02:20:13 +00:00
|
|
|
#include "StaticAnalyser.hpp"
|
|
|
|
|
2018-04-03 02:42:41 +00:00
|
|
|
#include "../../../../../Analyser/Static/Acorn/Target.hpp"
|
|
|
|
#include "../../../../../Analyser/Static/AmstradCPC/Target.hpp"
|
2018-04-24 04:14:45 +00:00
|
|
|
#include "../../../../../Analyser/Static/AppleII/Target.hpp"
|
2018-04-03 02:42:41 +00:00
|
|
|
#include "../../../../../Analyser/Static/Commodore/Target.hpp"
|
|
|
|
#include "../../../../../Analyser/Static/MSX/Target.hpp"
|
|
|
|
#include "../../../../../Analyser/Static/Oric/Target.hpp"
|
|
|
|
#include "../../../../../Analyser/Static/ZX8081/Target.hpp"
|
|
|
|
|
2016-10-12 02:20:13 +00:00
|
|
|
#import "Clock_Signal-Swift.h"
|
|
|
|
|
2017-07-31 02:05:29 +00:00
|
|
|
@implementation CSStaticAnalyser {
|
2018-04-14 23:46:15 +00:00
|
|
|
Analyser::Static::TargetList _targets;
|
2016-09-01 00:43:29 +00:00
|
|
|
}
|
|
|
|
|
2017-07-31 02:05:29 +00:00
|
|
|
- (instancetype)initWithFileAtURL:(NSURL *)url {
|
2016-09-01 00:43:29 +00:00
|
|
|
self = [super init];
|
2017-07-31 02:05:29 +00:00
|
|
|
if(self) {
|
2018-01-25 02:48:44 +00:00
|
|
|
_targets = Analyser::Static::GetTargets([url fileSystemRepresentation]);
|
2018-01-24 03:18:16 +00:00
|
|
|
if(!_targets.size()) return nil;
|
2016-09-13 02:15:38 +00:00
|
|
|
|
2018-01-25 01:14:15 +00: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?
|
2016-09-13 02:15:38 +00:00
|
|
|
_displayName = [[url pathComponents] lastObject];
|
2016-09-01 00:43:29 +00:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-04-03 02:42:41 +00:00
|
|
|
- (instancetype)initWithElectronDFS:(BOOL)dfs adfs:(BOOL)adfs {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Acorn::Target;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::Electron;
|
|
|
|
target->has_dfs = !!dfs;
|
|
|
|
target->has_adfs = !!adfs;
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithAmstradCPCModel:(CSMachineCPCModel)model {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::AmstradCPC::Target;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::AmstradCPC;
|
|
|
|
switch(model) {
|
|
|
|
case CSMachineCPCModel464: target->model = Analyser::Static::AmstradCPC::Target::Model::CPC464; break;
|
|
|
|
case CSMachineCPCModel664: target->model = Analyser::Static::AmstradCPC::Target::Model::CPC664; break;
|
|
|
|
case CSMachineCPCModel6128: target->model = Analyser::Static::AmstradCPC::Target::Model::CPC6128; break;
|
|
|
|
}
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithMSXHasDiskDrive:(BOOL)hasDiskDrive {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::MSX::Target;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::MSX;
|
|
|
|
target->has_disk_drive = !!hasDiskDrive;
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-05-09 02:05:43 +00:00
|
|
|
- (instancetype)initWithOricModel:(CSMachineOricModel)model diskInterface:(CSMachineOricDiskInterface)diskInterface {
|
2018-04-03 02:42:41 +00:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Oric::Target;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::Oric;
|
2018-05-09 02:05:43 +00: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;
|
|
|
|
}
|
2018-04-03 02:42:41 +00:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithVic20Region:(CSMachineVic20Region)region memorySize:(Kilobytes)memorySize hasC1540:(BOOL)hasC1540 {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
|
|
|
using Target = Analyser::Static::Commodore::Target;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::Vic20;
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
switch(memorySize) {
|
|
|
|
default: target->memory_model = Target::MemoryModel::Unexpanded; break;
|
|
|
|
case 8: target->memory_model = Target::MemoryModel::EightKB; break;
|
|
|
|
case 32: target->memory_model = Target::MemoryModel::ThirtyTwoKB; break;
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::ZX8081;
|
|
|
|
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;
|
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::ZX8081;
|
|
|
|
target->is_ZX81 = true;
|
|
|
|
target->memory_model = ZX8081MemoryModelFromSize(memorySize);
|
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-05-03 23:37:32 +00:00
|
|
|
- (instancetype)initWithAppleIIModel:(CSMachineAppleIIModel)model diskController:(CSMachineAppleIIDiskController)diskController {
|
2018-04-14 23:46:15 +00:00
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
2018-04-24 04:14:45 +00:00
|
|
|
using Target = Analyser::Static::AppleII::Target;
|
2018-04-14 23:46:15 +00:00
|
|
|
std::unique_ptr<Target> target(new Target);
|
|
|
|
target->machine = Analyser::Machine::AppleII;
|
2018-05-03 23:37:32 +00:00
|
|
|
target->model = (model == CSMachineAppleIIModelAppleII) ? Target::Model::II : Target::Model::IIplus;
|
|
|
|
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;
|
|
|
|
}
|
2018-04-14 23:46:15 +00:00
|
|
|
_targets.push_back(std::move(target));
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-07-31 02:05:29 +00:00
|
|
|
- (NSString *)optionsPanelNibName {
|
2018-01-25 03:35:54 +00:00
|
|
|
switch(_targets.front()->machine) {
|
2018-01-25 02:48:44 +00:00
|
|
|
case Analyser::Machine::AmstradCPC: return nil;
|
|
|
|
case Analyser::Machine::Atari2600: return @"Atari2600Options";
|
|
|
|
case Analyser::Machine::Electron: return @"QuickLoadCompositeOptions";
|
|
|
|
case Analyser::Machine::MSX: return @"QuickLoadCompositeOptions";
|
|
|
|
case Analyser::Machine::Oric: return @"OricOptions";
|
2018-04-01 17:29:04 +00:00
|
|
|
case Analyser::Machine::Vic20: return @"QuickLoadCompositeOptions";
|
2018-01-25 02:48:44 +00:00
|
|
|
case Analyser::Machine::ZX8081: return @"ZX8081Options";
|
2016-10-11 11:39:48 +00:00
|
|
|
default: return nil;
|
2016-10-02 20:31:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-14 23:46:15 +00:00
|
|
|
- (Analyser::Static::TargetList &)targets {
|
2018-01-25 01:14:15 +00:00
|
|
|
return _targets;
|
|
|
|
}
|
|
|
|
|
2016-09-01 00:43:29 +00:00
|
|
|
@end
|
2017-08-17 15:00:08 +00:00
|
|
|
|
|
|
|
@implementation CSMediaSet {
|
2018-01-25 02:48:44 +00:00
|
|
|
Analyser::Static::Media _media;
|
2017-08-17 15:00:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithFileAtURL:(NSURL *)url {
|
|
|
|
self = [super init];
|
|
|
|
if(self) {
|
2018-01-25 02:48:44 +00:00
|
|
|
_media = Analyser::Static::GetMedia([url fileSystemRepresentation]);
|
2017-08-17 15:00:08 +00:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)applyToMachine:(CSMachine *)machine {
|
|
|
|
[machine applyMedia:_media];
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|