mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-16 04:05:16 +00:00
Adds extended Introduces extended ROM details for the C1540, Electron, Master System and MSX.
This commit is contained in:
parent
712cb473f7
commit
f3aac603f8
@ -39,13 +39,20 @@ MachineBase::MachineBase(Personality personality, const ROMMachine::ROMFetcher &
|
|||||||
// attach the only drive there is
|
// attach the only drive there is
|
||||||
set_drive(drive_);
|
set_drive(drive_);
|
||||||
|
|
||||||
std::string rom_name;
|
std::string device_name;
|
||||||
|
uint32_t crc = 0;
|
||||||
switch(personality) {
|
switch(personality) {
|
||||||
case Personality::C1540: rom_name = "1540.bin"; break;
|
case Personality::C1540:
|
||||||
case Personality::C1541: rom_name = "1541.bin"; break;
|
device_name = "1540";
|
||||||
|
crc = 0x718d42b1;
|
||||||
|
break;
|
||||||
|
case Personality::C1541:
|
||||||
|
device_name = "1541";
|
||||||
|
crc = 0xfb760019;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto roms = rom_fetcher("Commodore1540", {rom_name});
|
auto roms = rom_fetcher("Commodore1540", { ROMMachine::ROM("the " + device_name + " ROM", device_name + ".bin", 16*1024, crc) });
|
||||||
if(!roms[0]) {
|
if(!roms[0]) {
|
||||||
throw ROMMachine::Error::MissingROMs;
|
throw ROMMachine::Error::MissingROMs;
|
||||||
}
|
}
|
||||||
|
@ -64,16 +64,19 @@ class ConcreteMachine:
|
|||||||
speaker_.set_input_rate(2000000 / SoundGenerator::clock_rate_divider);
|
speaker_.set_input_rate(2000000 / SoundGenerator::clock_rate_divider);
|
||||||
speaker_.set_high_frequency_cutoff(7000);
|
speaker_.set_high_frequency_cutoff(7000);
|
||||||
|
|
||||||
std::vector<ROMMachine::ROM> rom_names = { {"basic.rom"}, {"os.rom"} };
|
std::vector<ROMMachine::ROM> required_roms = {
|
||||||
|
{"the Acorn BASIC II ROM", "basic.rom", 16*1024, 0x79434781},
|
||||||
|
{"the Electron MOS ROM", "os.rom", 16*1024, 0xbf63fb1f}
|
||||||
|
};
|
||||||
if(target.has_adfs) {
|
if(target.has_adfs) {
|
||||||
rom_names.emplace_back("ADFS-E00_1.rom");
|
required_roms.emplace_back("the E00 ADFS ROM, first slot", "ADFS-E00_1.rom", 16*1024, 0x51523993);
|
||||||
rom_names.emplace_back("ADFS-E00_2.rom");
|
required_roms.emplace_back("the E00 ADFS ROM, second slot", "ADFS-E00_2.rom", 16*1024, 0x8d17de0e);
|
||||||
}
|
}
|
||||||
const size_t dfs_rom_position = rom_names.size();
|
const size_t dfs_rom_position = required_roms.size();
|
||||||
if(target.has_dfs) {
|
if(target.has_dfs) {
|
||||||
rom_names.emplace_back("DFS-1770-2.20.rom");
|
required_roms.emplace_back("the 1770 DFS ROM", "DFS-1770-2.20.rom", 16*1024, 0xf3dc9bc5);
|
||||||
}
|
}
|
||||||
const auto roms = rom_fetcher("Electron", rom_names);
|
const auto roms = rom_fetcher("Electron", required_roms);
|
||||||
|
|
||||||
for(const auto &rom: roms) {
|
for(const auto &rom: roms) {
|
||||||
if(!rom) {
|
if(!rom) {
|
||||||
|
@ -173,16 +173,19 @@ class ConcreteMachine:
|
|||||||
mixer_.set_relative_volumes({0.5f, 0.1f, 0.4f});
|
mixer_.set_relative_volumes({0.5f, 0.1f, 0.4f});
|
||||||
|
|
||||||
// Install the proper TV standard and select an ideal BIOS name.
|
// Install the proper TV standard and select an ideal BIOS name.
|
||||||
std::vector<ROMMachine::ROM> rom_names = { {"msx.rom"} };
|
std::vector<ROMMachine::ROM> required_roms = {
|
||||||
|
{"any MSX BIOS", "msx.rom", 32*1024, 0x94ee12f3}
|
||||||
|
};
|
||||||
|
|
||||||
bool is_ntsc = true;
|
bool is_ntsc = true;
|
||||||
uint8_t character_generator = 1; /* 0 = Japan, 1 = USA, etc, 2 = USSR */
|
uint8_t character_generator = 1; /* 0 = Japan, 1 = USA, etc, 2 = USSR */
|
||||||
uint8_t date_format = 1; /* 0 = Y/M/D, 1 = M/D/Y, 2 = D/M/Y */
|
uint8_t date_format = 1; /* 0 = Y/M/D, 1 = M/D/Y, 2 = D/M/Y */
|
||||||
uint8_t keyboard = 1; /* 0 = Japan, 1 = USA, 2 = France, 3 = UK, 4 = Germany, 5 = USSR, 6 = Spain */
|
uint8_t keyboard = 1; /* 0 = Japan, 1 = USA, 2 = France, 3 = UK, 4 = Germany, 5 = USSR, 6 = Spain */
|
||||||
|
|
||||||
|
// TODO: CRCs below are incomplete, at best.
|
||||||
switch(target.region) {
|
switch(target.region) {
|
||||||
case Target::Region::Japan:
|
case Target::Region::Japan:
|
||||||
rom_names.emplace_back("msx-japanese.rom");
|
required_roms.emplace_back("a Japanese MSX BIOS", "msx-japanese.rom", 32*1024, 0xee229390);
|
||||||
vdp_.set_tv_standard(TI::TMS::TVStandard::NTSC);
|
vdp_.set_tv_standard(TI::TMS::TVStandard::NTSC);
|
||||||
|
|
||||||
is_ntsc = true;
|
is_ntsc = true;
|
||||||
@ -190,7 +193,7 @@ class ConcreteMachine:
|
|||||||
date_format = 0;
|
date_format = 0;
|
||||||
break;
|
break;
|
||||||
case Target::Region::USA:
|
case Target::Region::USA:
|
||||||
rom_names.emplace_back("msx-american.rom");
|
required_roms.emplace_back("an American MSX BIOS", "msx-american.rom", 32*1024, 0);
|
||||||
vdp_.set_tv_standard(TI::TMS::TVStandard::NTSC);
|
vdp_.set_tv_standard(TI::TMS::TVStandard::NTSC);
|
||||||
|
|
||||||
is_ntsc = true;
|
is_ntsc = true;
|
||||||
@ -198,7 +201,7 @@ class ConcreteMachine:
|
|||||||
date_format = 1;
|
date_format = 1;
|
||||||
break;
|
break;
|
||||||
case Target::Region::Europe:
|
case Target::Region::Europe:
|
||||||
rom_names.emplace_back("msx-european.rom");
|
required_roms.emplace_back("a European MSX BIOS", "msx-european.rom", 32*1024, 0);
|
||||||
vdp_.set_tv_standard(TI::TMS::TVStandard::PAL);
|
vdp_.set_tv_standard(TI::TMS::TVStandard::PAL);
|
||||||
|
|
||||||
is_ntsc = false;
|
is_ntsc = false;
|
||||||
@ -211,10 +214,10 @@ class ConcreteMachine:
|
|||||||
// but failing that fall back on patching the main one.
|
// but failing that fall back on patching the main one.
|
||||||
size_t disk_index = 0;
|
size_t disk_index = 0;
|
||||||
if(target.has_disk_drive) {
|
if(target.has_disk_drive) {
|
||||||
disk_index = rom_names.size();
|
disk_index = required_roms.size();
|
||||||
rom_names.emplace_back("disk.rom");
|
required_roms.emplace_back("the MSX-DOS ROM", "disk.rom", 16*1024, 0x721f61df);
|
||||||
}
|
}
|
||||||
const auto roms = rom_fetcher("MSX", rom_names);
|
const auto roms = rom_fetcher("MSX", required_roms);
|
||||||
|
|
||||||
if((!roms[0] && !roms[1]) || (target.has_disk_drive && !roms[2])) {
|
if((!roms[0] && !roms[1]) || (target.has_disk_drive && !roms[2])) {
|
||||||
throw ROMMachine::Error::MissingROMs;
|
throw ROMMachine::Error::MissingROMs;
|
||||||
|
@ -132,7 +132,9 @@ class ConcreteMachine:
|
|||||||
|
|
||||||
// Load the BIOS if relevant.
|
// Load the BIOS if relevant.
|
||||||
if(has_bios()) {
|
if(has_bios()) {
|
||||||
const auto roms = rom_fetcher("MasterSystem", { ROMMachine::ROM("bios.sms") });
|
// TODO: there's probably a million other versions of the Master System BIOS; try to build a
|
||||||
|
// CRC32 catalogue of those.
|
||||||
|
const auto roms = rom_fetcher("MasterSystem", { {"the Master System BIOS", "bios.sms", 8*1024, 0x0072ed54} });
|
||||||
if(!roms[0]) {
|
if(!roms[0]) {
|
||||||
// No BIOS found; attempt to boot as though it has already disabled itself.
|
// No BIOS found; attempt to boot as though it has already disabled itself.
|
||||||
memory_control_ |= 0x08;
|
memory_control_ |= 0x08;
|
||||||
|
Loading…
Reference in New Issue
Block a user