diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 5d29d7266..d6856d087 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -50,6 +50,7 @@ 4B73C71D1D036C030074D992 /* Vic20Document.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B73C71B1D036C030074D992 /* Vic20Document.xib */; }; 4B92EACA1B7C112B00246143 /* 6502TimingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */; }; 4B96F7221D75119A0058BB2D /* Tape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B96F7201D75119A0058BB2D /* Tape.cpp */; }; + 4BA22B071D8817CE0008C640 /* Disk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BA22B051D8817CE0008C640 /* Disk.cpp */; }; 4BAB62AD1D3272D200DF5BA0 /* Disk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB62AB1D3272D200DF5BA0 /* Disk.cpp */; }; 4BAB62B51D327F7E00DF5BA0 /* G64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB62B31D327F7E00DF5BA0 /* G64.cpp */; }; 4BAB62B81D3302CA00DF5BA0 /* PCMTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB62B61D3302CA00DF5BA0 /* PCMTrack.cpp */; }; @@ -455,6 +456,8 @@ 4B92EAC91B7C112B00246143 /* 6502TimingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 6502TimingTests.swift; sourceTree = ""; }; 4B96F7201D75119A0058BB2D /* Tape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Tape.cpp; path = ../../StaticAnalyser/Acorn/Tape.cpp; sourceTree = ""; }; 4B96F7211D75119A0058BB2D /* Tape.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Tape.hpp; path = ../../StaticAnalyser/Acorn/Tape.hpp; sourceTree = ""; }; + 4BA22B051D8817CE0008C640 /* Disk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Disk.cpp; path = ../../StaticAnalyser/Commodore/Disk.cpp; sourceTree = ""; }; + 4BA22B061D8817CE0008C640 /* Disk.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Disk.hpp; path = ../../StaticAnalyser/Commodore/Disk.hpp; sourceTree = ""; }; 4BA9C3CF1D8164A9002DDB61 /* ConfigurationTarget.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ConfigurationTarget.hpp; sourceTree = ""; }; 4BAB62AB1D3272D200DF5BA0 /* Disk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Disk.cpp; sourceTree = ""; }; 4BAB62AC1D3272D200DF5BA0 /* Disk.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Disk.hpp; sourceTree = ""; }; @@ -1534,6 +1537,8 @@ 4BC5E4941D7EE0E0008CF980 /* Utilities.hpp */, 4BE77A2C1D84ADFB00BC3827 /* File.cpp */, 4BE77A2D1D84ADFB00BC3827 /* File.hpp */, + 4BA22B051D8817CE0008C640 /* Disk.cpp */, + 4BA22B061D8817CE0008C640 /* Disk.hpp */, ); name = Commodore; sourceTree = ""; @@ -2077,6 +2082,7 @@ 4B2A53A31D117D36003C6002 /* CSVic20.mm in Sources */, 4B2A53A21D117D36003C6002 /* CSElectron.mm in Sources */, 4B2E2D9A1C3A06EC00138695 /* Atari2600.cpp in Sources */, + 4BA22B071D8817CE0008C640 /* Disk.cpp in Sources */, 4BC3B7521CD1956900F86E85 /* OutputShader.cpp in Sources */, 4B4C83701D4F623200CD541F /* D64.cpp in Sources */, 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */, diff --git a/StaticAnalyser/Commodore/CommodoreAnalyser.cpp b/StaticAnalyser/Commodore/CommodoreAnalyser.cpp index 787c4124b..47cab467c 100644 --- a/StaticAnalyser/Commodore/CommodoreAnalyser.cpp +++ b/StaticAnalyser/Commodore/CommodoreAnalyser.cpp @@ -8,7 +8,9 @@ #include "CommodoreAnalyser.hpp" +#include "File.hpp" #include "Tape.hpp" +#include "Disk.hpp" using namespace StaticAnalyser::Commodore; @@ -22,88 +24,107 @@ void StaticAnalyser::Commodore::AddTargets( target.machine = Target::Vic20; // TODO: machine estimation target.probability = 1.0; // TODO: a proper estimation + int device = 0; + std::list files; + // strip out inappropriate cartridges // target.cartridges = AcornCartridgesFrom(cartridges); - // if there are any tapes, attempt to get data from the first - if(tapes.size() > 0) + // check disks + for(auto &disk : disks) { - std::shared_ptr tape = tapes.front(); - tape->reset(); - std::list files = GetFiles(tape); - tape->reset(); - - // continue if there are any files - if(files.size()) + std::list disk_files = GetFiles(disk); + if(disk_files.size()) { - target.tapes = tapes; - - target.vic20.memory_model = Vic20MemoryModel::Unexpanded; - if(files.front().is_basic()) - { - target.loadingCommand = "LOAD\"\",1,0\nRUN\n"; - } - else - { - target.loadingCommand = "LOAD\"\",1,1\nRUN\n"; - } - - // make a first guess based on loading address - switch(files.front().starting_address) - { - case 0x1001: - default: break; - case 0x1201: - target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; - break; - case 0x0401: - target.vic20.memory_model = Vic20MemoryModel::EightKB; - break; - } - - // General approach: increase memory size conservatively such that the largest file found will fit. - for(File &file : files) - { - size_t file_size = file.data.size(); - //bool is_basic = file.is_basic(); - - /*if(is_basic) - { - // BASIC files may be relocated, so the only limit is size. - // - // An unexpanded machine has 3583 bytes free for BASIC; - // a 3kb expanded machine has 6655 bytes free. - if(file_size > 6655) - target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; - else if(target.vic20.memory_model == Vic20MemoryModel::Unexpanded && file_size > 3583) - target.vic20.memory_model = Vic20MemoryModel::EightKB; - } - else - {*/ -// if(!file.type == File::NonRelocatableProgram) -// { - // Non-BASIC files may be relocatable but, if so, by what logic? - // Given that this is unknown, take starting address as literal - // and check against memory windows. - // - // (ignoring colour memory...) - // An unexpanded Vic has memory between 0x0000 and 0x0400; and between 0x1000 and 0x2000. - // A 3kb expanded Vic fills in the gap and has memory between 0x0000 and 0x2000. - // A 32kb expanded Vic has memory in the entire low 32kb. - uint16_t starting_address = file.starting_address; - - // If anything above the 8kb mark is touched, mark as a 32kb machine; otherwise if the - // region 0x0400 to 0x1000 is touched and this is an unexpanded machine, mark as 3kb. - if(starting_address + file_size > 0x2000) - target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; - else if(target.vic20.memory_model == Vic20MemoryModel::Unexpanded && !(starting_address >= 0x1000 || starting_address+file_size < 0x0400)) - target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; -// } - // } - } + files.splice(files.end(), disk_files); + target.disks = disks; + if(!device) device = 8; } } + // check tapes + for(auto &tape : tapes) + { + std::list tape_files = GetFiles(tape); + if(tape_files.size()) + { + files.splice(files.end(), tape_files); + target.tapes = tapes; + if(!device) device = 1; + } + } + + if(files.size()) + { + target.vic20.memory_model = Vic20MemoryModel::Unexpanded; + if(files.front().is_basic()) + { + char command[16]; + snprintf(command, 16, "LOAD\"\",%d,0\nRUN\n", device); + target.loadingCommand = command; + } + else + { + char command[16]; + snprintf(command, 16, "LOAD\"\",%d,1\nRUN\n", device); + target.loadingCommand = command; + } + + // make a first guess based on loading address + switch(files.front().starting_address) + { + case 0x1001: + default: break; + case 0x1201: + target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; + break; + case 0x0401: + target.vic20.memory_model = Vic20MemoryModel::EightKB; + break; + } + + // General approach: increase memory size conservatively such that the largest file found will fit. + for(File &file : files) + { + size_t file_size = file.data.size(); +// bool is_basic = file.is_basic(); + + /*if(is_basic) + { + // BASIC files may be relocated, so the only limit is size. + // + // An unexpanded machine has 3583 bytes free for BASIC; + // a 3kb expanded machine has 6655 bytes free. + if(file_size > 6655) + target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; + else if(target.vic20.memory_model == Vic20MemoryModel::Unexpanded && file_size > 3583) + target.vic20.memory_model = Vic20MemoryModel::EightKB; + } + else + {*/ +// if(!file.type == File::NonRelocatableProgram) +// { + // Non-BASIC files may be relocatable but, if so, by what logic? + // Given that this is unknown, take starting address as literal + // and check against memory windows. + // + // (ignoring colour memory...) + // An unexpanded Vic has memory between 0x0000 and 0x0400; and between 0x1000 and 0x2000. + // A 3kb expanded Vic fills in the gap and has memory between 0x0000 and 0x2000. + // A 32kb expanded Vic has memory in the entire low 32kb. + uint16_t starting_address = file.starting_address; + + // If anything above the 8kb mark is touched, mark as a 32kb machine; otherwise if the + // region 0x0400 to 0x1000 is touched and this is an unexpanded machine, mark as 3kb. + if(starting_address + file_size > 0x2000) + target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; + else if(target.vic20.memory_model == Vic20MemoryModel::Unexpanded && !(starting_address >= 0x1000 || starting_address+file_size < 0x0400)) + target.vic20.memory_model = Vic20MemoryModel::ThirtyTwoKB; +// } + } + } + + if(target.tapes.size() || target.cartridges.size() || target.disks.size()) destination.push_back(target); } diff --git a/StaticAnalyser/Commodore/Disk.cpp b/StaticAnalyser/Commodore/Disk.cpp new file mode 100644 index 000000000..3fdf5022b --- /dev/null +++ b/StaticAnalyser/Commodore/Disk.cpp @@ -0,0 +1,19 @@ +// +// Disk.cpp +// Clock Signal +// +// Created by Thomas Harte on 13/09/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +#include "Disk.hpp" + +using namespace StaticAnalyser::Commodore; + +std::list StaticAnalyser::Commodore::GetFiles(const std::shared_ptr &disk) +{ + std::list _files; + + return _files; +} + diff --git a/StaticAnalyser/Commodore/Disk.hpp b/StaticAnalyser/Commodore/Disk.hpp new file mode 100644 index 000000000..373d00124 --- /dev/null +++ b/StaticAnalyser/Commodore/Disk.hpp @@ -0,0 +1,25 @@ +// +// Disk.hpp +// Clock Signal +// +// Created by Thomas Harte on 13/09/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +#ifndef StaticAnalyser_Commodore_Disk_hpp +#define StaticAnalyser_Commodore_Disk_hpp + +#include "../../Storage/Disk/Disk.hpp" +#include "File.hpp" +#include + +namespace StaticAnalyser { +namespace Commodore { + +std::list GetFiles(const std::shared_ptr &disk); + +} +} + + +#endif /* Disk_hpp */ diff --git a/StaticAnalyser/Commodore/Tape.hpp b/StaticAnalyser/Commodore/Tape.hpp index 9a16bcdd0..8318b0837 100644 --- a/StaticAnalyser/Commodore/Tape.hpp +++ b/StaticAnalyser/Commodore/Tape.hpp @@ -9,9 +9,9 @@ #ifndef StaticAnalyser_Commodore_Tape_hpp #define StaticAnalyser_Commodore_Tape_hpp -#include -#include "../StaticAnalyser.hpp" +#include "../../Storage/Tape/Tape.hpp" #include "File.hpp" +#include namespace StaticAnalyser { namespace Commodore { @@ -20,4 +20,5 @@ std::list GetFiles(const std::shared_ptr &tape); } } + #endif /* Tape_hpp */