mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-29 13:29:46 +00:00
Merge pull request #792 from TomHarte/BIOSFreeMasterSystem
Ensures the Master System makes a genuine attempt to boot sans BIOS
This commit is contained in:
commit
e4335577ca
@ -25,7 +25,7 @@ class MultiJoystick: public Inputs::Joystick {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Input> &get_inputs() final {
|
const std::vector<Input> &get_inputs() final {
|
||||||
if(inputs.empty()) {
|
if(inputs.empty()) {
|
||||||
for(const auto &joystick: joysticks_) {
|
for(const auto &joystick: joysticks_) {
|
||||||
std::vector<Input> joystick_inputs = joystick->get_inputs();
|
std::vector<Input> joystick_inputs = joystick->get_inputs();
|
||||||
|
@ -51,7 +51,7 @@ class Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const static int output_lag = 11; // i.e. pixel output will occur 11 cycles after corresponding data read.
|
static constexpr int output_lag = 11; // i.e. pixel output will occur 11 cycles after corresponding data read.
|
||||||
|
|
||||||
// The default TMS palette.
|
// The default TMS palette.
|
||||||
const uint32_t palette[16] = {
|
const uint32_t palette[16] = {
|
||||||
|
@ -98,7 +98,7 @@ class Joystick {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// @returns The list of all inputs defined on this joystick.
|
/// @returns The list of all inputs defined on this joystick.
|
||||||
virtual std::vector<Input> &get_inputs() = 0;
|
virtual const std::vector<Input> &get_inputs() = 0;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the digital value of @c input. This may have direct effect or
|
Sets the digital value of @c input. This may have direct effect or
|
||||||
@ -170,7 +170,7 @@ class ConcreteJoystick: public Joystick {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Input> &get_inputs() final {
|
const std::vector<Input> &get_inputs() final {
|
||||||
return inputs_;
|
return inputs_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +223,7 @@ class ConcreteJoystick: public Joystick {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Input> inputs_;
|
const std::vector<Input> inputs_;
|
||||||
|
|
||||||
enum class StickType {
|
enum class StickType {
|
||||||
Digital,
|
Digital,
|
||||||
|
@ -80,10 +80,11 @@ class Keyboard {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::set<Key> observed_keys_;
|
std::set<Key> observed_keys_;
|
||||||
std::set<Key> essential_modifiers_;
|
const std::set<Key> essential_modifiers_;
|
||||||
|
const bool is_exclusive_ = true;
|
||||||
|
|
||||||
std::vector<bool> key_states_;
|
std::vector<bool> key_states_;
|
||||||
Delegate *delegate_ = nullptr;
|
Delegate *delegate_ = nullptr;
|
||||||
bool is_exclusive_ = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
#include "Cartridges/Unpaged.hpp"
|
#include "Cartridges/Unpaged.hpp"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
static const double NTSC_clock_rate = 1194720;
|
static constexpr double NTSC_clock_rate = 1194720;
|
||||||
static const double PAL_clock_rate = 1182298;
|
static constexpr double PAL_clock_rate = 1182298;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Atari2600 {
|
namespace Atari2600 {
|
||||||
|
@ -121,13 +121,13 @@ class MappedKeyboardMachine: public Inputs::Keyboard::Delegate, public KeyboardM
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Terminates a key sequence from the character mapper.
|
/// Terminates a key sequence from the character mapper.
|
||||||
static const uint16_t KeyEndSequence = 0xffff;
|
static constexpr uint16_t KeyEndSequence = 0xffff;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Indicates that a key is not mapped (for the keyboard mapper) or that a
|
Indicates that a key is not mapped (for the keyboard mapper) or that a
|
||||||
character cannot be typed (for the character mapper).
|
character cannot be typed (for the character mapper).
|
||||||
*/
|
*/
|
||||||
static const uint16_t KeyNotMapped = 0xfffe;
|
static constexpr uint16_t KeyNotMapped = 0xfffe;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Allows individual machines to provide the mapping between host keys
|
Allows individual machines to provide the mapping between host keys
|
||||||
|
@ -133,30 +133,31 @@ class ConcreteMachine:
|
|||||||
paging_registers_[2] = 0;
|
paging_registers_[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the BIOS if relevant.
|
// Load the BIOS if available.
|
||||||
if(has_bios()) {
|
//
|
||||||
// TODO: there's probably a million other versions of the Master System BIOS; try to build a
|
// TODO: there's probably a million other versions of the Master System BIOS; try to build a
|
||||||
// CRC32 catalogue of those. So far:
|
// CRC32 catalogue of those. So far:
|
||||||
//
|
//
|
||||||
// 0072ed54 = US/European BIOS 1.3
|
// 0072ed54 = US/European BIOS 1.3
|
||||||
// 48d44a13 = Japanese BIOS 2.1
|
// 48d44a13 = Japanese BIOS 2.1
|
||||||
const bool is_japanese = target.region == Target::Region::Japan;
|
const bool is_japanese = target.region == Target::Region::Japan;
|
||||||
const auto roms = rom_fetcher(
|
const auto roms = rom_fetcher(
|
||||||
{ {"MasterSystem",
|
{ {"MasterSystem",
|
||||||
is_japanese ? "the Japanese Master System BIOS" : "the European/US Master System BIOS",
|
is_japanese ? "the Japanese Master System BIOS" : "the European/US Master System BIOS",
|
||||||
is_japanese ? "japanese-bios.sms" : "bios.sms",
|
is_japanese ? "japanese-bios.sms" : "bios.sms",
|
||||||
8*1024,
|
8*1024,
|
||||||
{ is_japanese ? 0x48d44a13u : 0x0072ed54u }
|
{ is_japanese ? 0x48d44a13u : 0x0072ed54u }
|
||||||
} }
|
} }
|
||||||
);
|
);
|
||||||
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;
|
has_bios_ = false;
|
||||||
std::cerr << "No BIOS found; attempting to start cartridge directly" << std::endl;
|
memory_control_ |= 0x08;
|
||||||
} else {
|
std::cerr << "No BIOS found; attempting to start cartridge directly" << std::endl;
|
||||||
roms[0]->resize(8*1024);
|
} else {
|
||||||
memcpy(&bios_, roms[0]->data(), roms[0]->size());
|
has_bios_ = true;
|
||||||
}
|
roms[0]->resize(8*1024);
|
||||||
|
memcpy(&bios_, roms[0]->data(), roms[0]->size());
|
||||||
}
|
}
|
||||||
page_cartridge();
|
page_cartridge();
|
||||||
|
|
||||||
@ -486,9 +487,9 @@ class ConcreteMachine:
|
|||||||
}
|
}
|
||||||
|
|
||||||
using Target = Analyser::Static::Sega::Target;
|
using Target = Analyser::Static::Sega::Target;
|
||||||
Target::Model model_;
|
const Target::Model model_;
|
||||||
Target::Region region_;
|
const Target::Region region_;
|
||||||
Target::PagingScheme paging_scheme_;
|
const Target::PagingScheme paging_scheme_;
|
||||||
CPU::Z80::Processor<ConcreteMachine, false, false> z80_;
|
CPU::Z80::Processor<ConcreteMachine, false, false> z80_;
|
||||||
JustInTimeActor<TI::TMS::TMS9918> vdp_;
|
JustInTimeActor<TI::TMS::TMS9918> vdp_;
|
||||||
|
|
||||||
@ -550,13 +551,11 @@ class ConcreteMachine:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Throw the BIOS on top if this machine has one and it isn't disabled.
|
// Throw the BIOS on top if this machine has one and it isn't disabled.
|
||||||
if(has_bios() && !(memory_control_ & 0x08)) {
|
if(has_bios_ && !(memory_control_ & 0x08)) {
|
||||||
map(read_pointers_, bios_, 8*1024, 0);
|
map(read_pointers_, bios_, 8*1024, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool has_bios() {
|
bool has_bios_ = true;
|
||||||
return is_master_system(model_) && region_ != Target::Region::Japan;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ class CRT {
|
|||||||
|
|
||||||
Outputs::Display::ScanTarget *scan_target_ = &Outputs::Display::NullScanTarget::singleton;
|
Outputs::Display::ScanTarget *scan_target_ = &Outputs::Display::NullScanTarget::singleton;
|
||||||
Outputs::Display::ScanTarget::Modals scan_target_modals_;
|
Outputs::Display::ScanTarget::Modals scan_target_modals_;
|
||||||
static const uint8_t DefaultAmplitude = 80;
|
static constexpr uint8_t DefaultAmplitude = 80;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
size_t allocated_data_length_ = std::numeric_limits<size_t>::min();
|
size_t allocated_data_length_ = std::numeric_limits<size_t>::min();
|
||||||
|
@ -91,7 +91,7 @@ struct Microcycle {
|
|||||||
/// Provides the 68000's bus grant line — indicating whether a bus request has been acknowledged.
|
/// Provides the 68000's bus grant line — indicating whether a bus request has been acknowledged.
|
||||||
static constexpr int BusGrant = 1 << 10;
|
static constexpr int BusGrant = 1 << 10;
|
||||||
|
|
||||||
/// Contains a valid combination of the various static const int flags, describing the operation
|
/// Contains a valid combination of the various static constexpr int flags, describing the operation
|
||||||
/// performed by this Microcycle.
|
/// performed by this Microcycle.
|
||||||
int operation = 0;
|
int operation = 0;
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ class ProcessorStorage {
|
|||||||
static constexpr int DestinationMask = 1 << 6;
|
static constexpr int DestinationMask = 1 << 6;
|
||||||
uint8_t action = uint8_t(Action::None);
|
uint8_t action = uint8_t(Action::None);
|
||||||
|
|
||||||
static const uint16_t NoBusProgram = std::numeric_limits<uint16_t>::max();
|
static constexpr uint16_t NoBusProgram = std::numeric_limits<uint16_t>::max();
|
||||||
uint16_t bus_program = NoBusProgram;
|
uint16_t bus_program = NoBusProgram;
|
||||||
|
|
||||||
MicroOp() {}
|
MicroOp() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user