diff --git a/Analyser/Static/Acorn/StaticAnalyser.cpp b/Analyser/Static/Acorn/StaticAnalyser.cpp index 757e821e5..75dfed7e9 100644 --- a/Analyser/Static/Acorn/StaticAnalyser.cpp +++ b/Analyser/Static/Acorn/StaticAnalyser.cpp @@ -41,7 +41,7 @@ AcornCartridgesFrom(const std::vector> acorn_cartridges; for(const auto &cartridge : cartridges) { - const auto &segments = cartridge->get_segments(); + const auto &segments = cartridge->segments(); // Only one mapped item is allowed. if(segments.size() != 1) continue; diff --git a/Analyser/Static/Atari2600/StaticAnalyser.cpp b/Analyser/Static/Atari2600/StaticAnalyser.cpp index 714310dd9..a866abf81 100644 --- a/Analyser/Static/Atari2600/StaticAnalyser.cpp +++ b/Analyser/Static/Atari2600/StaticAnalyser.cpp @@ -203,7 +203,7 @@ Analyser::Static::TargetList Analyser::Static::Atari2600::GetTargets( // try to figure out the paging scheme if(!media.cartridges.empty()) { - const auto &segments = media.cartridges.front()->get_segments(); + const auto &segments = media.cartridges.front()->segments(); if(segments.size() == 1) { const Storage::Cartridge::Cartridge::Segment &segment = segments.front(); diff --git a/Analyser/Static/Coleco/StaticAnalyser.cpp b/Analyser/Static/Coleco/StaticAnalyser.cpp index 86e097473..42673baec 100644 --- a/Analyser/Static/Coleco/StaticAnalyser.cpp +++ b/Analyser/Static/Coleco/StaticAnalyser.cpp @@ -13,7 +13,7 @@ ColecoCartridgesFrom(const std::vector> coleco_cartridges; for(const auto &cartridge : cartridges) { - const auto &segments = cartridge->get_segments(); + const auto &segments = cartridge->segments(); // only one mapped item is allowed if(segments.size() != 1) continue; diff --git a/Analyser/Static/Commodore/StaticAnalyser.cpp b/Analyser/Static/Commodore/StaticAnalyser.cpp index e048ebad3..b39a25aae 100644 --- a/Analyser/Static/Commodore/StaticAnalyser.cpp +++ b/Analyser/Static/Commodore/StaticAnalyser.cpp @@ -33,7 +33,7 @@ Vic20CartridgesFrom(const std::vector> vic20_cartridges; for(const auto &cartridge : cartridges) { - const auto &segments = cartridge->get_segments(); + const auto &segments = cartridge->segments(); // Only one mapped item is allowed ... if(segments.size() != 1) continue; diff --git a/Analyser/Static/MSX/StaticAnalyser.cpp b/Analyser/Static/MSX/StaticAnalyser.cpp index 864953651..481dbdcdd 100644 --- a/Analyser/Static/MSX/StaticAnalyser.cpp +++ b/Analyser/Static/MSX/StaticAnalyser.cpp @@ -77,7 +77,7 @@ static Analyser::Static::TargetList CartridgeTargetsFrom( Analyser::Static::TargetList targets; for(const auto &cartridge : cartridges) { - const auto &segments = cartridge->get_segments(); + const auto &segments = cartridge->segments(); // Only one mapped item is allowed. if(segments.size() != 1) continue; diff --git a/Analyser/Static/Sega/StaticAnalyser.cpp b/Analyser/Static/Sega/StaticAnalyser.cpp index c46152075..c89c9a4af 100644 --- a/Analyser/Static/Sega/StaticAnalyser.cpp +++ b/Analyser/Static/Sega/StaticAnalyser.cpp @@ -34,7 +34,7 @@ Analyser::Static::TargetList Analyser::Static::Sega::GetTargets( // If this is a Master System title, look for a ROM header. if(target->model == Target::Model::MasterSystem) { - const auto &data = media.cartridges.front()->get_segments()[0].data; + const auto &data = media.cartridges.front()->segments()[0].data; // First try to locate a header. size_t header_offset = 0; diff --git a/Analyser/Static/StaticAnalyser.cpp b/Analyser/Static/StaticAnalyser.cpp index cf9c3233e..565d64367 100644 --- a/Analyser/Static/StaticAnalyser.cpp +++ b/Analyser/Static/StaticAnalyser.cpp @@ -274,6 +274,7 @@ static Media GetMediaAndPlatforms(const std::string &file_name, TargetPlatform:: accumulator.try_standard(TargetPlatform::ThomsonMO | TargetPlatform::ThomsonTO, "k5"); accumulator.try_standard(TargetPlatform::ThomsonMO | TargetPlatform::ThomsonTO, "k7"); + accumulator.try_standard(TargetPlatform::ThomsonMO, "m5"); accumulator.try_standard>(TargetPlatform::Macintosh, "moof"); accumulator.try_standard>(TargetPlatform::AtariST, "msa"); accumulator.try_standard(TargetPlatform::MSX, "mx2"); diff --git a/Analyser/Static/Thomson/StaticAnalyser.cpp b/Analyser/Static/Thomson/StaticAnalyser.cpp index a14ca0d46..0d4f568f8 100644 --- a/Analyser/Static/Thomson/StaticAnalyser.cpp +++ b/Analyser/Static/Thomson/StaticAnalyser.cpp @@ -45,12 +45,16 @@ Analyser::Static::TargetList Analyser::Static::Thomson::GetTargets( } } - // Currently: accept all floppy disks. + // Currently: accept all floppy disks and all cartridges. if(!media.disks.empty()) { target->floppy = MOTarget::Floppy::CD90_640; target->media.disks = media.disks; } + if(!media.cartridges.empty()) { + target->media.cartridges = media.cartridges; + } + if(!target->media.empty()) { destination.push_back(std::move(target)); } diff --git a/Machines/Acorn/Electron/Electron.cpp b/Machines/Acorn/Electron/Electron.cpp index 799513e94..3905ae367 100644 --- a/Machines/Acorn/Electron/Electron.cpp +++ b/Machines/Acorn/Electron/Electron.cpp @@ -206,7 +206,7 @@ public: slot = ROM((int(slot) + 1) & 15); if(slot == first_slot_tried) return false; } - set_rom(slot, cartridge->get_segments().front().data, false); + set_rom(slot, cartridge->segments().front().data, false); } // TODO: allow this only at machine startup? diff --git a/Machines/Atari/2600/Atari2600.cpp b/Machines/Atari/2600/Atari2600.cpp index 0987b5d6d..f4e1c9cca 100644 --- a/Machines/Atari/2600/Atari2600.cpp +++ b/Machines/Atari/2600/Atari2600.cpp @@ -84,7 +84,7 @@ class ConcreteMachine: public MachineTypes::TimedMachine { public: ConcreteMachine(const Target &target) : frequency_mismatch_warner_(*this) { - const std::vector &rom = target.media.cartridges.front()->get_segments().front().data; + const std::vector &rom = target.media.cartridges.front()->segments().front().data; using PagingModel = Target::PagingModel; switch(target.paging_model) { diff --git a/Machines/ColecoVision/ColecoVision.cpp b/Machines/ColecoVision/ColecoVision.cpp index 5022c1472..b745fbbb6 100644 --- a/Machines/ColecoVision/ColecoVision.cpp +++ b/Machines/ColecoVision/ColecoVision.cpp @@ -136,7 +136,7 @@ public: bios_ = roms.find(rom_name)->second; if(!target.media.cartridges.empty()) { - const auto &segment = target.media.cartridges.front()->get_segments().front(); + const auto &segment = target.media.cartridges.front()->segments().front(); cartridge_ = segment.data; if(cartridge_.size() >= 32768) cartridge_address_limit_ = 0xffff; diff --git a/Machines/Commodore/Vic-20/Vic20.cpp b/Machines/Commodore/Vic-20/Vic20.cpp index 8b875dea6..ae21eee3e 100644 --- a/Machines/Commodore/Vic-20/Vic20.cpp +++ b/Machines/Commodore/Vic-20/Vic20.cpp @@ -446,7 +446,7 @@ public: if(!media.cartridges.empty()) { rom_address_ = 0xa000; - std::vector rom_image = media.cartridges.front()->get_segments().front().data; + std::vector rom_image = media.cartridges.front()->segments().front().data; rom_length_ = uint16_t(rom_image.size()); rom_ = rom_image; diff --git a/Machines/MSX/MSX.cpp b/Machines/MSX/MSX.cpp index e28abf482..606e6c53f 100644 --- a/Machines/MSX/MSX.cpp +++ b/Machines/MSX/MSX.cpp @@ -404,7 +404,7 @@ public: bool insert_media(const Analyser::Static::Media &media) final { if(!media.cartridges.empty()) { - const auto &segment = media.cartridges.front()->get_segments().front(); + const auto &segment = media.cartridges.front()->segments().front(); auto &slot = cartridge_slot(); slot.set_source(segment.data); diff --git a/Machines/MasterSystem/MasterSystem.cpp b/Machines/MasterSystem/MasterSystem.cpp index b9f929206..a40da904f 100644 --- a/Machines/MasterSystem/MasterSystem.cpp +++ b/Machines/MasterSystem/MasterSystem.cpp @@ -118,7 +118,7 @@ public: // Take a copy of the cartridge and place it into memory. if(!target.media.cartridges.empty()) { - cartridge_ = target.media.cartridges[0]->get_segments()[0].data; + cartridge_ = target.media.cartridges[0]->segments()[0].data; } static constexpr size_t TargetSize = 48*1024; diff --git a/Machines/Thomson/MO5/MO5.cpp b/Machines/Thomson/MO5/MO5.cpp index b9280e2f3..e8265d526 100644 --- a/Machines/Thomson/MO5/MO5.cpp +++ b/Machines/Thomson/MO5/MO5.cpp @@ -77,7 +77,7 @@ struct ConcreteMachine: } const auto &rom = roms.find(ROM::Name::ThomsonMO5v11)->second; - std::copy_n(rom.begin(), rom.size(), rom_.begin()); + std::copy_n(rom.begin(), rom.size(), rom_.begin() + 0x1000); if(has_floppy) { const auto &floppy_rom = roms.find(ROM::Name::ThomsonCD90_640)->second; @@ -178,8 +178,8 @@ struct ConcreteMachine: value = start_pointer_[address]; } else if(address >= 0xa000 && address < 0xa7c0) { value = has_floppy ? floppy_rom_[address - 0xa000] : 0xff; - } else if(address >= 0xc000) { - value = rom_[address - 0xc000]; + } else if(address >= 0xb000) { + value = rom_[address - 0xb000]; if constexpr (lic == CPU::M6809::LIC::InstructionFetch) { // Catch RDBITS. @@ -257,7 +257,7 @@ private: CPU::M6809::Processor m6809_; std::array ram_; - std::array rom_; + std::array rom_{0xff}; std::array floppy_rom_; uint8_t *start_pointer_ = nullptr; @@ -594,16 +594,20 @@ private: tape_player_.set_tape(media.tapes.front(), TargetPlatform::ThomsonMO); } - if(!has_floppy) { - return !media.tapes.empty(); + if(!media.cartridges.empty()) { + auto segment = media.cartridges.front()->segments().front(); + std::copy_n(segment.data.begin(), std::min(segment.data.size(), 16384), rom_.begin()); } - size_t index = 0; - for(auto &disk: media.disks) { - fdc_.set_disk(disk, index); - ++ index; + if(has_floppy) { + size_t index = 0; + for(auto &disk: media.disks) { + fdc_.set_disk(disk, index); + ++ index; + } } - return !media.tapes.empty() || !media.disks.empty(); + + return !media.tapes.empty() || (!media.disks.empty() && has_floppy) || !media.cartridges.empty(); } ChangeEffect effect_for_file_did_change(const std::string &) const override { diff --git a/OSBindings/Mac/Clock Signal/Info.plist b/OSBindings/Mac/Clock Signal/Info.plist index 8a06b7185..7e2eb2776 100644 --- a/OSBindings/Mac/Clock Signal/Info.plist +++ b/OSBindings/Mac/Clock Signal/Info.plist @@ -897,6 +897,28 @@ NSDocumentClass $(PRODUCT_MODULE_NAME).MachineDocument + + CFBundleTypeExtensions + + m5 + + CFBundleTypeIconFile + cartridge + CFBundleTypeName + Thomson MO Cartridge + CFBundleTypeOSTypes + + ???? + + CFBundleTypeRole + Viewer + LSHandlerRank + Owner + LSTypeIsPackage + + NSDocumentClass + $(PRODUCT_MODULE_NAME).MachineDocument + CFBundleExecutable $(EXECUTABLE_NAME) diff --git a/Storage/Cartridge/Cartridge.hpp b/Storage/Cartridge/Cartridge.hpp index 04cb8da04..8181fddca 100644 --- a/Storage/Cartridge/Cartridge.hpp +++ b/Storage/Cartridge/Cartridge.hpp @@ -68,7 +68,7 @@ public: std::vector data; }; - const std::vector &get_segments() const { + const std::vector &segments() const { return segments_; } virtual ~Cartridge() = default;