diff --git a/Machines/Utility/MachineForTarget.cpp b/Machines/Utility/MachineForTarget.cpp index 45833dbff..5783317a0 100644 --- a/Machines/Utility/MachineForTarget.cpp +++ b/Machines/Utility/MachineForTarget.cpp @@ -12,6 +12,7 @@ #include "../Atari2600/Atari2600.hpp" #include "../Commodore/Vic-20/Vic20.hpp" #include "../Electron/Electron.hpp" +#include "../MSX/MSX.hpp" #include "../Oric/Oric.hpp" #include "../ZX8081/ZX8081.hpp" @@ -22,6 +23,7 @@ case StaticAnalyser::Target::AmstradCPC: return new TypedDynamicMachine(AmstradCPC::Machine::AmstradCPC()); case StaticAnalyser::Target::Atari2600: return new TypedDynamicMachine(Atari2600::Machine::Atari2600()); case StaticAnalyser::Target::Electron: return new TypedDynamicMachine(Electron::Machine::Electron()); + case StaticAnalyser::Target::MSX: return new TypedDynamicMachine(MSX::Machine::MSX()); case StaticAnalyser::Target::Oric: return new TypedDynamicMachine(Oric::Machine::Oric()); case StaticAnalyser::Target::Vic20: return new TypedDynamicMachine(Commodore::Vic20::Machine::Vic20()); case StaticAnalyser::Target::ZX8081: return new TypedDynamicMachine(ZX8081::Machine::ZX8081(target)); @@ -35,6 +37,7 @@ std::string Machine::ShortNameForTargetMachine(const StaticAnalyser::Target::Mac case StaticAnalyser::Target::AmstradCPC: return "AmstradCPC"; case StaticAnalyser::Target::Atari2600: return "Atari2600"; case StaticAnalyser::Target::Electron: return "Electron"; + case StaticAnalyser::Target::MSX: return "MSX"; case StaticAnalyser::Target::Oric: return "Oric"; case StaticAnalyser::Target::Vic20: return "Vic20"; case StaticAnalyser::Target::ZX8081: return "ZX8081"; @@ -48,6 +51,7 @@ std::string Machine::LongNameForTargetMachine(StaticAnalyser::Target::Machine ma case StaticAnalyser::Target::AmstradCPC: return "Amstrad CPC"; case StaticAnalyser::Target::Atari2600: return "Atari 2600"; case StaticAnalyser::Target::Electron: return "Acorn Electron"; + case StaticAnalyser::Target::MSX: return "MSX"; case StaticAnalyser::Target::Oric: return "Oric"; case StaticAnalyser::Target::Vic20: return "Vic 20"; case StaticAnalyser::Target::ZX8081: return "ZX80/81"; diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 5bf59aa7a..99923ecbc 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -128,6 +128,11 @@ 4B08A2751EE35D56008B7065 /* Z80InterruptTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B08A2741EE35D56008B7065 /* Z80InterruptTests.swift */; }; 4B08A2781EE39306008B7065 /* TestMachine.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B08A2771EE39306008B7065 /* TestMachine.mm */; }; 4B0CCC451C62D0B3001CAC5F /* CRT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0CCC421C62D0B3001CAC5F /* CRT.cpp */; }; + 4B0E04EA1FC9E5DA00F43484 /* CAS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E04E81FC9E5DA00F43484 /* CAS.cpp */; }; + 4B0E04EB1FC9E78800F43484 /* CAS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E04E81FC9E5DA00F43484 /* CAS.cpp */; }; + 4B0E04EE1FC9E88300F43484 /* StaticAnalyser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E04EC1FC9E88300F43484 /* StaticAnalyser.cpp */; }; + 4B0E04F11FC9EA9500F43484 /* MSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B79A4FF1FC913C900EEDAD5 /* MSX.cpp */; }; + 4B0E04F21FC9EAA800F43484 /* StaticAnalyser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B0E04EC1FC9E88300F43484 /* StaticAnalyser.cpp */; }; 4B121F951E05E66800BFDA12 /* PCMPatchedTrackTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B121F941E05E66800BFDA12 /* PCMPatchedTrackTests.mm */; }; 4B121F9B1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B121F9A1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm */; }; 4B1414601B58885000E04248 /* WolfgangLorenzTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */; }; @@ -630,6 +635,10 @@ 4B0B6E121C9DBD5D00FFB60D /* CRTConstants.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CRTConstants.hpp; sourceTree = ""; }; 4B0CCC421C62D0B3001CAC5F /* CRT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRT.cpp; sourceTree = ""; }; 4B0CCC431C62D0B3001CAC5F /* CRT.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CRT.hpp; sourceTree = ""; }; + 4B0E04E81FC9E5DA00F43484 /* CAS.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CAS.cpp; sourceTree = ""; }; + 4B0E04E91FC9E5DA00F43484 /* CAS.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CAS.hpp; sourceTree = ""; }; + 4B0E04EC1FC9E88300F43484 /* StaticAnalyser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = StaticAnalyser.cpp; path = ../../StaticAnalyser/MSX/StaticAnalyser.cpp; sourceTree = ""; }; + 4B0E04ED1FC9E88300F43484 /* StaticAnalyser.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = StaticAnalyser.hpp; path = ../../StaticAnalyser/MSX/StaticAnalyser.hpp; sourceTree = ""; }; 4B121F941E05E66800BFDA12 /* PCMPatchedTrackTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PCMPatchedTrackTests.mm; sourceTree = ""; }; 4B121F9A1E06293F00BFDA12 /* PCMSegmentEventSourceTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PCMSegmentEventSourceTests.mm; sourceTree = ""; }; 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ClockSignal-Bridging-Header.h"; sourceTree = ""; }; @@ -1346,6 +1355,15 @@ path = ../../Outputs/CRT; sourceTree = ""; }; + 4B0E04F01FC9E89100F43484 /* MSX */ = { + isa = PBXGroup; + children = ( + 4B0E04EC1FC9E88300F43484 /* StaticAnalyser.cpp */, + 4B0E04ED1FC9E88300F43484 /* StaticAnalyser.hpp */, + ); + name = MSX; + sourceTree = ""; + }; 4B1414561B58879D00E04248 /* 6502 */ = { isa = PBXGroup; children = ( @@ -1831,6 +1849,7 @@ 4B69FB411C4D941400B5F0AA /* Formats */ = { isa = PBXGroup; children = ( + 4B0E04E81FC9E5DA00F43484 /* CAS.cpp */, 4BC91B811D1F160E00884B76 /* CommodoreTAP.cpp */, 4B3BF5AE1F146264005B6C36 /* CSW.cpp */, 4B59199A1DAC6C46005BB85C /* OricTAP.cpp */, @@ -1838,6 +1857,7 @@ 4B69FB421C4D941400B5F0AA /* TapeUEF.cpp */, 4B448E7F1F1C45A00009ABD6 /* TZX.cpp */, 4B1497861EE4A1DA00CE2596 /* ZX80O81P.cpp */, + 4B0E04E91FC9E5DA00F43484 /* CAS.hpp */, 4BC91B821D1F160E00884B76 /* CommodoreTAP.hpp */, 4B3BF5AF1F146264005B6C36 /* CSW.hpp */, 4B59199B1DAC6C46005BB85C /* OricTAP.hpp */, @@ -2673,6 +2693,7 @@ 4BCF1FAC1DADD41F0039D2E7 /* Oric */, 4B14978C1EE4AC6200CE2596 /* ZX80/81 */, 4B38F3451F2EB41800D9235D /* AmstradCPC */, + 4B0E04F01FC9E89100F43484 /* MSX */, ); name = StaticAnalyser; sourceTree = ""; @@ -3149,6 +3170,7 @@ 4B055AA41FAE85E50060FFFF /* DigitalPhaseLockedLoop.cpp in Sources */, 4B055AE61FAE9B6F0060FFFF /* OutputShader.cpp in Sources */, 4B055A9B1FAE85DA0060FFFF /* AcornADF.cpp in Sources */, + 4B0E04F11FC9EA9500F43484 /* MSX.cpp in Sources */, 4B055AD51FAE9B0B0060FFFF /* Video.cpp in Sources */, 4B055A811FAE853A0060FFFF /* Disk.cpp in Sources */, 4B055AE11FAE9B6F0060FFFF /* ArrayBuilder.cpp in Sources */, @@ -3235,6 +3257,7 @@ 4B055ADF1FAE9B4C0060FFFF /* IRQDelegatePortHandler.cpp in Sources */, 4B055AB51FAE860F0060FFFF /* TapePRG.cpp in Sources */, 4B055AE01FAE9B660060FFFF /* CRT.cpp in Sources */, + 4B0E04F21FC9EAA800F43484 /* StaticAnalyser.cpp in Sources */, 4B055AD01FAE9B030060FFFF /* Tape.cpp in Sources */, 4B055A961FAE85BB0060FFFF /* Commodore.cpp in Sources */, 4B055ADE1FAE9B4C0060FFFF /* 6522Base.cpp in Sources */, @@ -3247,6 +3270,7 @@ 4B07835B1FC11D42001D12BB /* Configurable.cpp in Sources */, 4B055AE71FAE9B6F0060FFFF /* Shader.cpp in Sources */, 4B055AEC1FAE9BA20060FFFF /* Z80Base.cpp in Sources */, + 4B0E04EB1FC9E78800F43484 /* CAS.cpp in Sources */, 4B055AE31FAE9B6F0060FFFF /* TextureBuilder.cpp in Sources */, 4B055AB91FAE86170060FFFF /* Acorn.cpp in Sources */, 4B055A931FAE85B50060FFFF /* BinaryDump.cpp in Sources */, @@ -3267,6 +3291,7 @@ 4B59199C1DAC6C46005BB85C /* OricTAP.cpp in Sources */, 4BB697CE1D4BA44400248BDF /* CommodoreGCR.cpp in Sources */, 4B7136861F78724F008B8ED9 /* Encoder.cpp in Sources */, + 4B0E04EA1FC9E5DA00F43484 /* CAS.cpp in Sources */, 4B58601E1F806AB200AEE2E3 /* MFMSectorDump.cpp in Sources */, 4B448E841F1C4C480009ABD6 /* PulseQueuedTape.cpp in Sources */, 4BD14B111D74627C0088EAD6 /* StaticAnalyser.cpp in Sources */, @@ -3309,6 +3334,7 @@ 4B2A332F1DB86869002876E3 /* OricOptionsPanel.swift in Sources */, 4B2B3A4C1F9B8FA70062DABF /* MemoryFuzzer.cpp in Sources */, 4B7913CC1DFCD80E00175A82 /* Video.cpp in Sources */, + 4B0E04EE1FC9E88300F43484 /* StaticAnalyser.cpp in Sources */, 4B4518831F75E91A00926311 /* PCMTrack.cpp in Sources */, 4B45189F1F75FD1C00926311 /* AcornADF.cpp in Sources */, 4B2A53A11D117D36003C6002 /* CSAtari2600.mm in Sources */, diff --git a/OSBindings/Mac/Clock Signal/Info.plist b/OSBindings/Mac/Clock Signal/Info.plist index ca23f90e0..ee2011d8a 100644 --- a/OSBindings/Mac/Clock Signal/Info.plist +++ b/OSBindings/Mac/Clock Signal/Info.plist @@ -261,6 +261,20 @@ NSDocumentClass $(PRODUCT_MODULE_NAME).MachineDocument + + CFBundleTypeExtensions + + cas + + CFBundleTypeIconFile + cassette + CFBundleTypeName + MSX Tape Image + CFBundleTypeRole + Viewer + NSDocumentClass + $(PRODUCT_MODULE_NAME).MachineDocument + CFBundleExecutable $(EXECUTABLE_NAME) diff --git a/StaticAnalyser/MSX/StaticAnalyser.cpp b/StaticAnalyser/MSX/StaticAnalyser.cpp new file mode 100644 index 000000000..e6ecf1cb8 --- /dev/null +++ b/StaticAnalyser/MSX/StaticAnalyser.cpp @@ -0,0 +1,18 @@ +// +// StaticAnalyser.cpp +// Clock Signal +// +// Created by Thomas Harte on 25/11/2017. +// Copyright © 2017 Thomas Harte. All rights reserved. +// + +#include "StaticAnalyser.hpp" + +void StaticAnalyser::MSX::AddTargets(const Media &media, std::list &destination) { + // Very trusting... + Target target; + target.machine = Target::MSX; + target.probability = 1.0; + target.media = media; + destination.push_back(target); +} diff --git a/StaticAnalyser/MSX/StaticAnalyser.hpp b/StaticAnalyser/MSX/StaticAnalyser.hpp new file mode 100644 index 000000000..354fd2d7c --- /dev/null +++ b/StaticAnalyser/MSX/StaticAnalyser.hpp @@ -0,0 +1,22 @@ +// +// StaticAnalyser.hpp +// Clock Signal +// +// Created by Thomas Harte on 25/11/2017. +// Copyright © 2017 Thomas Harte. All rights reserved. +// + +#ifndef StaticAnalyser_MSX_StaticAnalyser_hpp +#define StaticAnalyser_MSX_StaticAnalyser_hpp + +#include "../StaticAnalyser.hpp" + +namespace StaticAnalyser { +namespace MSX { + +void AddTargets(const Media &media, std::list &destination); + +} +} + +#endif /* StaticAnalyser_MSX_StaticAnalyser_hpp */ diff --git a/StaticAnalyser/StaticAnalyser.cpp b/StaticAnalyser/StaticAnalyser.cpp index 36e2c082c..ab5e05ff0 100644 --- a/StaticAnalyser/StaticAnalyser.cpp +++ b/StaticAnalyser/StaticAnalyser.cpp @@ -16,6 +16,7 @@ #include "AmstradCPC/StaticAnalyser.hpp" #include "Atari/StaticAnalyser.hpp" #include "Commodore/StaticAnalyser.hpp" +#include "MSX/StaticAnalyser.hpp" #include "Oric/StaticAnalyser.hpp" #include "ZX8081/StaticAnalyser.hpp" @@ -33,6 +34,7 @@ #include "../Storage/Disk/DiskImage/Formats/SSD.hpp" // Tapes +#include "../Storage/Tape/Formats/CAS.hpp" #include "../Storage/Tape/Formats/CommodoreTAP.hpp" #include "../Storage/Tape/Formats/CSW.hpp" #include "../Storage/Tape/Formats/OricTAP.hpp" @@ -83,6 +85,7 @@ static Media GetMediaAndPlatforms(const char *file_name, TargetPlatform::IntType Format("a26", result.cartridges, Cartridge::BinaryDump, TargetPlatform::Atari2600) // A26 Format("adf", result.disks, Disk::DiskImageHolder, TargetPlatform::Acorn) // ADF Format("bin", result.cartridges, Cartridge::BinaryDump, TargetPlatform::Atari2600) // BIN + Format("cas", result.tapes, Tape::CAS, TargetPlatform::MSX) // CAS Format("cdt", result.tapes, Tape::TZX, TargetPlatform::AmstradCPC) // CDT Format("csw", result.tapes, Tape::CSW, TargetPlatform::AllTape) // CSW Format("d64", result.disks, Disk::DiskImageHolder, TargetPlatform::Commodore) // D64 @@ -145,6 +148,7 @@ std::list StaticAnalyser::GetTargets(const char *file_name) { if(potential_platforms & TargetPlatform::AmstradCPC) AmstradCPC::AddTargets(media, targets); if(potential_platforms & TargetPlatform::Atari2600) Atari::AddTargets(media, targets); if(potential_platforms & TargetPlatform::Commodore) Commodore::AddTargets(media, targets); + if(potential_platforms & TargetPlatform::MSX) MSX::AddTargets(media, targets); if(potential_platforms & TargetPlatform::Oric) Oric::AddTargets(media, targets); if(potential_platforms & TargetPlatform::ZX8081) ZX8081::AddTargets(media, targets, potential_platforms); diff --git a/StaticAnalyser/StaticAnalyser.hpp b/StaticAnalyser/StaticAnalyser.hpp index 943c67089..a3faa2a74 100644 --- a/StaticAnalyser/StaticAnalyser.hpp +++ b/StaticAnalyser/StaticAnalyser.hpp @@ -70,6 +70,7 @@ struct Target { AmstradCPC, Atari2600, Electron, + MSX, Oric, Vic20, ZX8081 diff --git a/Storage/Tape/Formats/CAS.cpp b/Storage/Tape/Formats/CAS.cpp new file mode 100644 index 000000000..edce11dd2 --- /dev/null +++ b/Storage/Tape/Formats/CAS.cpp @@ -0,0 +1,28 @@ +// +// CAS.cpp +// Clock Signal +// +// Created by Thomas Harte on 25/11/2017. +// Copyright © 2017 Thomas Harte. All rights reserved. +// + +#include "CAS.hpp" + +using namespace Storage::Tape; + +CAS::CAS(const char *file_name) : + file_(file_name) { +} + +bool CAS::is_at_end() { + return true; +} + +void CAS::virtual_reset() { + +} + +Tape::Pulse CAS::virtual_get_next_pulse() { + Pulse empty_pulse; + return empty_pulse; +} diff --git a/Storage/Tape/Formats/CAS.hpp b/Storage/Tape/Formats/CAS.hpp new file mode 100644 index 000000000..4b998e2b9 --- /dev/null +++ b/Storage/Tape/Formats/CAS.hpp @@ -0,0 +1,47 @@ +// +// CAS.hpp +// Clock Signal +// +// Created by Thomas Harte on 25/11/2017. +// Copyright © 2017 Thomas Harte. All rights reserved. +// + +#ifndef CAS_hpp +#define CAS_hpp + +#include "../Tape.hpp" +#include "../../FileHolder.hpp" + +namespace Storage { +namespace Tape { + +/*! + Provides a @c Tape containing a CAS tape image, which is an MSX byte stream. +*/ +class CAS: public Tape { + public: + /*! + Constructs a @c CAS containing content from the file with name @c file_name. + + @throws ErrorNotCAS if this file could not be opened and recognised as a valid CAS file. + */ + CAS(const char *file_name); + + enum { + ErrorNotCAS + }; + + // implemented to satisfy @c Tape + bool is_at_end(); + + private: + Storage::FileHolder file_; + + void virtual_reset(); + Pulse virtual_get_next_pulse(); +}; + +} +} + +#endif /* CAS_hpp */ diff --git a/Storage/TargetPlatforms.hpp b/Storage/TargetPlatforms.hpp index e05759d2c..560abf0be 100644 --- a/Storage/TargetPlatforms.hpp +++ b/Storage/TargetPlatforms.hpp @@ -21,14 +21,15 @@ enum Type: IntType { BBCModelA = 1 << 6, BBCModelB = 1 << 7, Commodore = 1 << 8, - Oric = 1 << 9, - ZX80 = 1 << 10, - ZX81 = 1 << 11, + MSX = 1 << 9, + Oric = 1 << 10, + ZX80 = 1 << 11, + ZX81 = 1 << 12, Acorn = AcornAtom | AcornElectron | BBCMaster | BBCModelA | BBCModelB, ZX8081 = ZX80 | ZX81, - AllTape = Acorn | AmstradCPC | Commodore | Oric | ZX80 | ZX81, - AllDisk = Acorn | AmstradCPC | Commodore | Oric, + AllTape = Acorn | AmstradCPC | Commodore | Oric | ZX80 | ZX81 | MSX, + AllDisk = Acorn | AmstradCPC | Commodore | Oric | MSX, }; class TypeDistinguisher {