mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-05 13:30:07 +00:00
Merge pull request #1428 from TomHarte/MoreIndentation
Adjust more dangling indentation changes.
This commit is contained in:
commit
88b31ea940
@ -70,7 +70,7 @@ private:
|
|||||||
uint8_t track_;
|
uint8_t track_;
|
||||||
std::shared_ptr<Sector> sector_cache_[65536];
|
std::shared_ptr<Sector> sector_cache_[65536];
|
||||||
|
|
||||||
void process_input_bit(const int value) {
|
void process_input_bit(const int value) override {
|
||||||
shift_register_ = ((shift_register_ << 1) | unsigned(value)) & 0x3ff;
|
shift_register_ = ((shift_register_ << 1) | unsigned(value)) & 0x3ff;
|
||||||
bit_count_++;
|
bit_count_++;
|
||||||
}
|
}
|
||||||
@ -107,7 +107,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_index_hole() {
|
void process_index_hole() override {
|
||||||
index_count_++;
|
index_count_++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ namespace Apple::II {
|
|||||||
Implementation observation: as implemented on the IIe, the zero page setting also affects what happens in the language card area.
|
Implementation observation: as implemented on the IIe, the zero page setting also affects what happens in the language card area.
|
||||||
*/
|
*/
|
||||||
template <typename Machine> class AuxiliaryMemorySwitches {
|
template <typename Machine> class AuxiliaryMemorySwitches {
|
||||||
public:
|
public:
|
||||||
static constexpr bool Auxiliary = true;
|
static constexpr bool Auxiliary = true;
|
||||||
static constexpr bool Main = false;
|
static constexpr bool Main = false;
|
||||||
static constexpr bool ROM = true;
|
static constexpr bool ROM = true;
|
||||||
@ -220,7 +220,7 @@ template <typename Machine> class AuxiliaryMemorySwitches {
|
|||||||
set_card_paging();
|
set_card_paging();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Machine &machine_;
|
Machine &machine_;
|
||||||
SwitchState switches_;
|
SwitchState switches_;
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
namespace Apple::IIgs::ADB {
|
namespace Apple::IIgs::ADB {
|
||||||
|
|
||||||
class GLU: public InstructionSet::M50740::PortHandler {
|
class GLU: public InstructionSet::M50740::PortHandler {
|
||||||
public:
|
public:
|
||||||
GLU();
|
GLU();
|
||||||
|
|
||||||
uint8_t get_keyboard_data();
|
uint8_t get_keyboard_data();
|
||||||
@ -53,7 +53,7 @@ class GLU: public InstructionSet::M50740::PortHandler {
|
|||||||
return mouse_;
|
return mouse_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
InstructionSet::M50740::Executor executor_;
|
InstructionSet::M50740::Executor executor_;
|
||||||
|
|
||||||
void run_ports_for(Cycles) override;
|
void run_ports_for(Cycles) override;
|
||||||
|
@ -88,7 +88,7 @@ class ConcreteMachine:
|
|||||||
public MachineTypes::TimedMachine,
|
public MachineTypes::TimedMachine,
|
||||||
public CPU::MOS6502Esque::BusHandler<uint32_t> {
|
public CPU::MOS6502Esque::BusHandler<uint32_t> {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ConcreteMachine(const Analyser::Static::AppleIIgs::Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
ConcreteMachine(const Analyser::Static::AppleIIgs::Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
||||||
m65816_(*this),
|
m65816_(*this),
|
||||||
memory_(target.model >= Analyser::Static::AppleIIgs::Target::Model::ROM03),
|
memory_(target.model >= Analyser::Static::AppleIIgs::Target::Model::ROM03),
|
||||||
@ -133,43 +133,43 @@ class ConcreteMachine:
|
|||||||
// rom_[0x36402] = 2;
|
// rom_[0x36402] = 2;
|
||||||
// rom_[0x36403] = 0x7c; // ROM_CHECKSUM [working, when hacks like this are removed]
|
// rom_[0x36403] = 0x7c; // ROM_CHECKSUM [working, when hacks like this are removed]
|
||||||
// rom_[0x36404] = 0x6c;
|
// rom_[0x36404] = 0x6c;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0x82; // MOVIRAM [working]
|
// rom_[0x36403] = 0x82; // MOVIRAM [working]
|
||||||
// rom_[0x36404] = 0x67;
|
// rom_[0x36404] = 0x67;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0x2c; // SOFT_SW [working]
|
// rom_[0x36403] = 0x2c; // SOFT_SW [working]
|
||||||
// rom_[0x36404] = 0x6a;
|
// rom_[0x36404] = 0x6a;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0xe8; // RAM_ADDR [working]
|
// rom_[0x36403] = 0xe8; // RAM_ADDR [working]
|
||||||
// rom_[0x36404] = 0x6f;
|
// rom_[0x36404] = 0x6f;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0xc7; // FPI_SPEED [working]
|
// rom_[0x36403] = 0xc7; // FPI_SPEED [working]
|
||||||
// rom_[0x36404] = 0x6a;
|
// rom_[0x36404] = 0x6a;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0xd7; // SER_TST [broken]
|
// rom_[0x36403] = 0xd7; // SER_TST [broken]
|
||||||
// rom_[0x36404] = 0x68;
|
// rom_[0x36404] = 0x68;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0xdc; // CLOCK [broken]
|
// rom_[0x36403] = 0xdc; // CLOCK [broken]
|
||||||
// rom_[0x36404] = 0x6c;
|
// rom_[0x36404] = 0x6c;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0x1b; // BAT_RAM [broken]
|
// rom_[0x36403] = 0x1b; // BAT_RAM [broken]
|
||||||
// rom_[0x36404] = 0x6e;
|
// rom_[0x36404] = 0x6e;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0x11; // FDB (/ADB?) [broken]
|
// rom_[0x36403] = 0x11; // FDB (/ADB?) [broken]
|
||||||
// rom_[0x36404] = 0x6f;
|
// rom_[0x36404] = 0x6f;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0x41; // SHADOW_TST [working]
|
// rom_[0x36403] = 0x41; // SHADOW_TST [working]
|
||||||
// rom_[0x36404] = 0x6d;
|
// rom_[0x36404] = 0x6d;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0x09; // CUSTOM_IRQ [broken?]
|
// rom_[0x36403] = 0x09; // CUSTOM_IRQ [broken?]
|
||||||
// rom_[0x36404] = 0x6b;
|
// rom_[0x36404] = 0x6b;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0xf4; // DOC_EXEC
|
// rom_[0x36403] = 0xf4; // DOC_EXEC
|
||||||
// rom_[0x36404] = 0x70;
|
// rom_[0x36404] = 0x70;
|
||||||
|
//
|
||||||
// rom_[0x36403] = 0xab; // ECT_SEQ
|
// rom_[0x36403] = 0xab; // ECT_SEQ
|
||||||
// rom_[0x36404] = 0x64;
|
// rom_[0x36404] = 0x64;
|
||||||
|
//
|
||||||
// rom_[0xfc146f] = rom_[0xfc1470] = 0xea;
|
// rom_[0xfc146f] = rom_[0xfc1470] = 0xea;
|
||||||
|
|
||||||
size_t ram_size = 0;
|
size_t ram_size = 0;
|
||||||
@ -932,7 +932,7 @@ class ConcreteMachine:
|
|||||||
return joysticks_.get_joysticks();
|
return joysticks_.get_joysticks();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CPU::WDC65816::Processor<ConcreteMachine, false> m65816_;
|
CPU::WDC65816::Processor<ConcreteMachine, false> m65816_;
|
||||||
MemoryMap memory_;
|
MemoryMap memory_;
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
namespace Apple::IIgs {
|
namespace Apple::IIgs {
|
||||||
|
|
||||||
class MemoryMap {
|
class MemoryMap {
|
||||||
public:
|
public:
|
||||||
// MARK: - Initial construction and configuration.
|
// MARK: - Initial construction and configuration.
|
||||||
|
|
||||||
MemoryMap(bool is_rom03) : auxiliary_switches_(*this), language_card_(*this) {
|
MemoryMap(bool is_rom03) : auxiliary_switches_(*this), language_card_(*this) {
|
||||||
@ -106,7 +106,7 @@ class MemoryMap {
|
|||||||
// With a further twist: the modulo and pointer are indexed on ::IsShadowed to eliminate a branch
|
// With a further twist: the modulo and pointer are indexed on ::IsShadowed to eliminate a branch
|
||||||
// even on that.
|
// even on that.
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AuxiliaryMemorySwitches auxiliary_switches_;
|
AuxiliaryMemorySwitches auxiliary_switches_;
|
||||||
LanguageCardSwitches language_card_;
|
LanguageCardSwitches language_card_;
|
||||||
friend AuxiliaryMemorySwitches;
|
friend AuxiliaryMemorySwitches;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
namespace Apple::IIgs::Sound {
|
namespace Apple::IIgs::Sound {
|
||||||
|
|
||||||
class GLU: public Outputs::Speaker::BufferSource<GLU, false> { // TODO: isn't this stereo?
|
class GLU: public Outputs::Speaker::BufferSource<GLU, false> { // TODO: isn't this stereo?
|
||||||
public:
|
public:
|
||||||
GLU(Concurrency::AsyncTaskQueue<false> &audio_queue);
|
GLU(Concurrency::AsyncTaskQueue<false> &audio_queue);
|
||||||
|
|
||||||
void set_control(uint8_t);
|
void set_control(uint8_t);
|
||||||
@ -39,7 +39,7 @@ class GLU: public Outputs::Speaker::BufferSource<GLU, false> { // TODO: isn't th
|
|||||||
void set_sample_volume_range(std::int16_t range);
|
void set_sample_volume_range(std::int16_t range);
|
||||||
bool is_zero_level() const { return false; } // TODO.
|
bool is_zero_level() const { return false; } // TODO.
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Concurrency::AsyncTaskQueue<false> &audio_queue_;
|
Concurrency::AsyncTaskQueue<false> &audio_queue_;
|
||||||
|
|
||||||
uint16_t address_ = 0;
|
uint16_t address_ = 0;
|
||||||
|
@ -20,7 +20,7 @@ namespace Apple::IIgs::Video {
|
|||||||
stretched cycle.
|
stretched cycle.
|
||||||
*/
|
*/
|
||||||
class Video: public Apple::II::VideoSwitches<Cycles> {
|
class Video: public Apple::II::VideoSwitches<Cycles> {
|
||||||
public:
|
public:
|
||||||
Video();
|
Video();
|
||||||
void set_internal_ram(const uint8_t *);
|
void set_internal_ram(const uint8_t *);
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ class Video: public Apple::II::VideoSwitches<Cycles> {
|
|||||||
|
|
||||||
void clear_megaii_interrupts();
|
void clear_megaii_interrupts();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Outputs::CRT::CRT crt_;
|
Outputs::CRT::CRT crt_;
|
||||||
|
|
||||||
// This is coupled to Apple::II::GraphicsMode, but adds detail for the IIgs.
|
// This is coupled to Apple::II::GraphicsMode, but adds detail for the IIgs.
|
||||||
|
@ -24,7 +24,7 @@ namespace Apple::Macintosh {
|
|||||||
a shade less than 4Mhz.
|
a shade less than 4Mhz.
|
||||||
*/
|
*/
|
||||||
class Audio: public ::Outputs::Speaker::BufferSource<Audio, false> {
|
class Audio: public ::Outputs::Speaker::BufferSource<Audio, false> {
|
||||||
public:
|
public:
|
||||||
Audio(Concurrency::AsyncTaskQueue<false> &task_queue);
|
Audio(Concurrency::AsyncTaskQueue<false> &task_queue);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -55,7 +55,7 @@ class Audio: public ::Outputs::Speaker::BufferSource<Audio, false> {
|
|||||||
bool is_zero_level() const;
|
bool is_zero_level() const;
|
||||||
void set_sample_volume_range(std::int16_t range);
|
void set_sample_volume_range(std::int16_t range);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Concurrency::AsyncTaskQueue<false> &task_queue_;
|
Concurrency::AsyncTaskQueue<false> &task_queue_;
|
||||||
|
|
||||||
// A queue of fetched samples; read from by one thread,
|
// A queue of fetched samples; read from by one thread,
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
namespace Apple::Macintosh {
|
namespace Apple::Macintosh {
|
||||||
|
|
||||||
class DriveSpeedAccumulator {
|
class DriveSpeedAccumulator {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Accepts fetched motor control values.
|
Accepts fetched motor control values.
|
||||||
*/
|
*/
|
||||||
@ -31,7 +31,7 @@ class DriveSpeedAccumulator {
|
|||||||
delegate_ = delegate;
|
delegate_ = delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr int samples_per_bucket = 20;
|
static constexpr int samples_per_bucket = 20;
|
||||||
int sample_count_ = 0;
|
int sample_count_ = 0;
|
||||||
int sample_total_ = 0;
|
int sample_total_ = 0;
|
||||||
|
@ -83,7 +83,7 @@ enum class Key: uint16_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class Keyboard {
|
class Keyboard {
|
||||||
public:
|
public:
|
||||||
void set_input(bool data) {
|
void set_input(bool data) {
|
||||||
switch(mode_) {
|
switch(mode_) {
|
||||||
case Mode::Waiting:
|
case Mode::Waiting:
|
||||||
@ -218,7 +218,7 @@ class Keyboard {
|
|||||||
key_queue_.insert(key_queue_.begin(), (is_pressed ? 0x00 : 0x80) | uint8_t(key));
|
key_queue_.insert(key_queue_.begin(), (is_pressed ? 0x00 : 0x80) | uint8_t(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Performs the pre-ADB Apple keyboard protocol command @c command, returning
|
/// Performs the pre-ADB Apple keyboard protocol command @c command, returning
|
||||||
/// the proper result if the command were to terminate now. So, it treats inquiry
|
/// the proper result if the command were to terminate now. So, it treats inquiry
|
||||||
/// and instant as the same command.
|
/// and instant as the same command.
|
||||||
|
@ -79,7 +79,7 @@ template <Analyser::Static::Macintosh::Target::Model model> class ConcreteMachin
|
|||||||
public Configurable::Device,
|
public Configurable::Device,
|
||||||
public DriveSpeedAccumulator::Delegate,
|
public DriveSpeedAccumulator::Delegate,
|
||||||
public ClockingHint::Observer {
|
public ClockingHint::Observer {
|
||||||
public:
|
public:
|
||||||
using Target = Analyser::Static::Macintosh::Target;
|
using Target = Analyser::Static::Macintosh::Target;
|
||||||
|
|
||||||
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
||||||
@ -527,7 +527,7 @@ template <Analyser::Static::Macintosh::Target::Model model> class ConcreteMachin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool quickboot_ = false;
|
bool quickboot_ = false;
|
||||||
|
|
||||||
void set_component_prefers_clocking(ClockingHint::Source *, ClockingHint::Preference) final {
|
void set_component_prefers_clocking(ClockingHint::Source *, ClockingHint::Preference) final {
|
||||||
|
@ -28,7 +28,7 @@ constexpr int sync_end = 38;
|
|||||||
This class also collects audio and 400kb drive-speed data, forwarding those values.
|
This class also collects audio and 400kb drive-speed data, forwarding those values.
|
||||||
*/
|
*/
|
||||||
class Video {
|
class Video {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Constructs an instance of @c Video sourcing its pixel data from @c ram and
|
Constructs an instance of @c Video sourcing its pixel data from @c ram and
|
||||||
providing audio and drive-speed bytes to @c audio and @c drive_speed_accumulator.
|
providing audio and drive-speed bytes to @c audio and @c drive_speed_accumulator.
|
||||||
@ -81,7 +81,7 @@ class Video {
|
|||||||
*/
|
*/
|
||||||
HalfCycles next_sequence_point();
|
HalfCycles next_sequence_point();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DeferredAudio &audio_;
|
DeferredAudio &audio_;
|
||||||
DriveSpeedAccumulator &drive_speed_accumulator_;
|
DriveSpeedAccumulator &drive_speed_accumulator_;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ namespace {
|
|||||||
namespace Atari2600 {
|
namespace Atari2600 {
|
||||||
|
|
||||||
class Joystick: public Inputs::ConcreteJoystick {
|
class Joystick: public Inputs::ConcreteJoystick {
|
||||||
public:
|
public:
|
||||||
Joystick(Bus *bus, std::size_t shift, std::size_t fire_tia_input) :
|
Joystick(Bus *bus, std::size_t shift, std::size_t fire_tia_input) :
|
||||||
ConcreteJoystick({
|
ConcreteJoystick({
|
||||||
Input(Input::Up),
|
Input(Input::Up),
|
||||||
@ -66,7 +66,7 @@ class Joystick: public Inputs::ConcreteJoystick {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Bus *bus_;
|
Bus *bus_;
|
||||||
std::size_t shift_, fire_tia_input_;
|
std::size_t shift_, fire_tia_input_;
|
||||||
};
|
};
|
||||||
@ -79,7 +79,7 @@ class ConcreteMachine:
|
|||||||
public MachineTypes::AudioProducer,
|
public MachineTypes::AudioProducer,
|
||||||
public MachineTypes::ScanProducer,
|
public MachineTypes::ScanProducer,
|
||||||
public MachineTypes::JoystickMachine {
|
public MachineTypes::JoystickMachine {
|
||||||
public:
|
public:
|
||||||
ConcreteMachine(const Target &target) : frequency_mismatch_warner_(*this) {
|
ConcreteMachine(const Target &target) : frequency_mismatch_warner_(*this) {
|
||||||
const std::vector<uint8_t> &rom = target.media.cartridges.front()->get_segments().front().data;
|
const std::vector<uint8_t> &rom = target.media.cartridges.front()->get_segments().front().data;
|
||||||
|
|
||||||
@ -187,7 +187,7 @@ class ConcreteMachine:
|
|||||||
return confidence_counter_.get_confidence();
|
return confidence_counter_.get_confidence();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The bus.
|
// The bus.
|
||||||
std::unique_ptr<Bus> bus_;
|
std::unique_ptr<Bus> bus_;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ class ConcreteMachine:
|
|||||||
public GI::AY38910::PortHandler,
|
public GI::AY38910::PortHandler,
|
||||||
public Configurable::Device,
|
public Configurable::Device,
|
||||||
public Video::RangeObserver {
|
public Video::RangeObserver {
|
||||||
public:
|
public:
|
||||||
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
||||||
mc68000_(*this),
|
mc68000_(*this),
|
||||||
keyboard_acia_(Cycles(500000)),
|
keyboard_acia_(Cycles(500000)),
|
||||||
@ -455,7 +455,7 @@ class ConcreteMachine:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
forceinline void advance_time(HalfCycles length) {
|
forceinline void advance_time(HalfCycles length) {
|
||||||
// Advance the relevant counters.
|
// Advance the relevant counters.
|
||||||
cycles_since_audio_update_ += length;
|
cycles_since_audio_update_ += length;
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
namespace Atari::ST {
|
namespace Atari::ST {
|
||||||
|
|
||||||
class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, public ClockingHint::Observer {
|
class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, public ClockingHint::Observer {
|
||||||
public:
|
public:
|
||||||
DMAController();
|
DMAController();
|
||||||
|
|
||||||
uint16_t read(int address);
|
uint16_t read(int address);
|
||||||
@ -50,7 +50,7 @@ class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, p
|
|||||||
// ClockingHint::Source.
|
// ClockingHint::Source.
|
||||||
ClockingHint::Preference preferred_clocking() const final;
|
ClockingHint::Preference preferred_clocking() const final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HalfCycles running_time_;
|
HalfCycles running_time_;
|
||||||
struct WD1772: public WD::WD1770 {
|
struct WD1772: public WD::WD1770 {
|
||||||
WD1772(): WD::WD1770(WD::WD1770::P1772) {
|
WD1772(): WD::WD1770(WD::WD1770::P1772) {
|
||||||
|
@ -54,7 +54,7 @@ class IntelligentKeyboard:
|
|||||||
public Serial::Line<false>::ReadDelegate,
|
public Serial::Line<false>::ReadDelegate,
|
||||||
public ClockingHint::Source,
|
public ClockingHint::Source,
|
||||||
public Inputs::Mouse {
|
public Inputs::Mouse {
|
||||||
public:
|
public:
|
||||||
IntelligentKeyboard(Serial::Line<false> &input, Serial::Line<false> &output);
|
IntelligentKeyboard(Serial::Line<false> &input, Serial::Line<false> &output);
|
||||||
ClockingHint::Preference preferred_clocking() const final;
|
ClockingHint::Preference preferred_clocking() const final;
|
||||||
void run_for(HalfCycles duration);
|
void run_for(HalfCycles duration);
|
||||||
@ -68,7 +68,7 @@ class IntelligentKeyboard:
|
|||||||
return joysticks_;
|
return joysticks_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// MARK: - Key queue.
|
// MARK: - Key queue.
|
||||||
std::mutex key_queue_mutex_;
|
std::mutex key_queue_mutex_;
|
||||||
std::vector<uint8_t> key_queue_;
|
std::vector<uint8_t> key_queue_;
|
||||||
|
@ -31,7 +31,7 @@ struct LineLength {
|
|||||||
(hopefully) to a subsystem.
|
(hopefully) to a subsystem.
|
||||||
*/
|
*/
|
||||||
class Video {
|
class Video {
|
||||||
public:
|
public:
|
||||||
Video();
|
Video();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -123,7 +123,7 @@ class Video {
|
|||||||
*/
|
*/
|
||||||
Range get_memory_access_range();
|
Range get_memory_access_range();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DeferredQueue<HalfCycles> deferrer_;
|
DeferredQueue<HalfCycles> deferrer_;
|
||||||
|
|
||||||
Outputs::CRT::CRT crt_;
|
Outputs::CRT::CRT crt_;
|
||||||
|
@ -38,7 +38,7 @@ namespace Commodore::C1540 {
|
|||||||
The attention input is also connected to CA1, similarly invertedl; the CA1 wire will be high when the bus is low and vice versa.
|
The attention input is also connected to CA1, similarly invertedl; the CA1 wire will be high when the bus is low and vice versa.
|
||||||
*/
|
*/
|
||||||
class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||||
public:
|
public:
|
||||||
SerialPortVIA(MOS::MOS6522::MOS6522<SerialPortVIA> &via);
|
SerialPortVIA(MOS::MOS6522::MOS6522<SerialPortVIA> &via);
|
||||||
|
|
||||||
uint8_t get_port_input(MOS::MOS6522::Port);
|
uint8_t get_port_input(MOS::MOS6522::Port);
|
||||||
@ -48,7 +48,7 @@ class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
|||||||
|
|
||||||
void set_serial_port(const std::shared_ptr<::Commodore::Serial::Port> &);
|
void set_serial_port(const std::shared_ptr<::Commodore::Serial::Port> &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MOS::MOS6522::MOS6522<SerialPortVIA> &via_;
|
MOS::MOS6522::MOS6522<SerialPortVIA> &via_;
|
||||||
uint8_t port_b_ = 0x0;
|
uint8_t port_b_ = 0x0;
|
||||||
std::weak_ptr<::Commodore::Serial::Port> serial_port_;
|
std::weak_ptr<::Commodore::Serial::Port> serial_port_;
|
||||||
@ -76,7 +76,7 @@ class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
|||||||
whether the disk head is being told to read or write, but it's unclear and I've yet to investigate. So, TODO.
|
whether the disk head is being told to read or write, but it's unclear and I've yet to investigate. So, TODO.
|
||||||
*/
|
*/
|
||||||
class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||||
public:
|
public:
|
||||||
class Delegate {
|
class Delegate {
|
||||||
public:
|
public:
|
||||||
virtual void drive_via_did_step_head(void *driveVIA, int direction) = 0;
|
virtual void drive_via_did_step_head(void *driveVIA, int direction) = 0;
|
||||||
@ -97,7 +97,7 @@ class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
|||||||
|
|
||||||
void set_activity_observer(Activity::Observer *observer);
|
void set_activity_observer(Activity::Observer *observer);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t port_b_ = 0xff, port_a_ = 0xff;
|
uint8_t port_b_ = 0xff, port_a_ = 0xff;
|
||||||
bool should_set_overflow_ = false;
|
bool should_set_overflow_ = false;
|
||||||
bool drive_motor_ = false;
|
bool drive_motor_ = false;
|
||||||
@ -110,11 +110,11 @@ class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
|||||||
An implementation of the C1540's serial port; this connects incoming line levels to the serial-port VIA.
|
An implementation of the C1540's serial port; this connects incoming line levels to the serial-port VIA.
|
||||||
*/
|
*/
|
||||||
class SerialPort : public ::Commodore::Serial::Port {
|
class SerialPort : public ::Commodore::Serial::Port {
|
||||||
public:
|
public:
|
||||||
void set_input(::Commodore::Serial::Line, ::Commodore::Serial::LineLevel);
|
void set_input(::Commodore::Serial::Line, ::Commodore::Serial::LineLevel);
|
||||||
void set_serial_port_via(const std::shared_ptr<SerialPortVIA> &);
|
void set_serial_port_via(const std::shared_ptr<SerialPortVIA> &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::weak_ptr<SerialPortVIA> serial_port_VIA_;
|
std::weak_ptr<SerialPortVIA> serial_port_VIA_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ class MachineBase:
|
|||||||
public DriveVIA::Delegate,
|
public DriveVIA::Delegate,
|
||||||
public Storage::Disk::Controller {
|
public Storage::Disk::Controller {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MachineBase(Personality personality, const ROM::Map &roms);
|
MachineBase(Personality personality, const ROM::Map &roms);
|
||||||
|
|
||||||
// to satisfy CPU::MOS6502::Processor
|
// to satisfy CPU::MOS6502::Processor
|
||||||
@ -140,7 +140,7 @@ class MachineBase:
|
|||||||
/// Attaches the activity observer to this C1540.
|
/// Attaches the activity observer to this C1540.
|
||||||
void set_activity_observer(Activity::Observer *observer);
|
void set_activity_observer(Activity::Observer *observer);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CPU::MOS6502::Processor<CPU::MOS6502::Personality::P6502, MachineBase, false> m6502_;
|
CPU::MOS6502::Processor<CPU::MOS6502::Personality::P6502, MachineBase, false> m6502_;
|
||||||
|
|
||||||
uint8_t ram_[0x800];
|
uint8_t ram_[0x800];
|
||||||
|
@ -209,7 +209,7 @@ struct Description {
|
|||||||
/// plus all the fields provided as @c flags .
|
/// plus all the fields provided as @c flags .
|
||||||
std::string description(int flags) const;
|
std::string description(int flags) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename FileNameT, typename CRC32T> Description(
|
template <typename FileNameT, typename CRC32T> Description(
|
||||||
Name name, std::string machine_name, std::string descriptive_name, FileNameT file_names, size_t size, CRC32T crc32s = uint32_t(0)
|
Name name, std::string machine_name, std::string descriptive_name, FileNameT file_names, size_t size, CRC32T crc32s = uint32_t(0)
|
||||||
) : name{name}, machine_name{machine_name}, descriptive_name{descriptive_name}, file_names{file_names}, size{size}, crc32s{crc32s} {
|
) : name{name}, machine_name{machine_name}, descriptive_name{descriptive_name}, file_names{file_names}, size{size}, crc32s{crc32s} {
|
||||||
@ -273,7 +273,7 @@ struct Request {
|
|||||||
/// portion of a sentence, e.g. "Please supply" + request.description(0, L'*').
|
/// portion of a sentence, e.g. "Please supply" + request.description(0, L'*').
|
||||||
std::wstring description(int description_flags, wchar_t bullet_point);
|
std::wstring description(int description_flags, wchar_t bullet_point);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Node {
|
struct Node {
|
||||||
enum class Type {
|
enum class Type {
|
||||||
Any, All, One
|
Any, All, One
|
||||||
|
@ -14,13 +14,13 @@
|
|||||||
namespace Utility {
|
namespace Utility {
|
||||||
|
|
||||||
class StringSerialiser {
|
class StringSerialiser {
|
||||||
public:
|
public:
|
||||||
StringSerialiser(const std::string &source, bool use_linefeed_only = false);
|
StringSerialiser(const std::string &source, bool use_linefeed_only = false);
|
||||||
|
|
||||||
uint8_t head();
|
uint8_t head();
|
||||||
bool advance();
|
bool advance();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string input_string_;
|
std::string input_string_;
|
||||||
std::size_t input_string_pointer_ = 0;
|
std::size_t input_string_pointer_ = 0;
|
||||||
};
|
};
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
namespace Machine {
|
namespace Machine {
|
||||||
|
|
||||||
template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine {
|
template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine {
|
||||||
public:
|
public:
|
||||||
TypedDynamicMachine(std::unique_ptr<T> &&machine) : machine_(std::move(machine)) {}
|
TypedDynamicMachine(std::unique_ptr<T> &&machine) : machine_(std::move(machine)) {}
|
||||||
T *get() { return machine_.get(); }
|
T *get() { return machine_.get(); }
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine
|
|||||||
return get();
|
return get();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename Class> Class *get() {
|
template <typename Class> Class *get() {
|
||||||
return dynamic_cast<Class *>(machine_.get());
|
return dynamic_cast<Class *>(machine_.get());
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ class CharacterMapper {
|
|||||||
fresh key transition is ready to be consumed.
|
fresh key transition is ready to be consumed.
|
||||||
*/
|
*/
|
||||||
class Typer {
|
class Typer {
|
||||||
public:
|
public:
|
||||||
class Delegate: public MachineTypes::KeyActions {
|
class Delegate: public MachineTypes::KeyActions {
|
||||||
public:
|
public:
|
||||||
/// Informs the delegate that this typer has reached the end of its content.
|
/// Informs the delegate that this typer has reached the end of its content.
|
||||||
@ -85,7 +85,7 @@ class Typer {
|
|||||||
const char BeginString = 0x02; // i.e. ASCII start of text
|
const char BeginString = 0x02; // i.e. ASCII start of text
|
||||||
const char EndString = 0x03; // i.e. ASCII end of text
|
const char EndString = 0x03; // i.e. ASCII end of text
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string string_;
|
std::string string_;
|
||||||
std::size_t string_pointer_ = 0;
|
std::size_t string_pointer_ = 0;
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ class Typer {
|
|||||||
*/
|
*/
|
||||||
template <typename CMapper>
|
template <typename CMapper>
|
||||||
class TypeRecipient: public Typer::Delegate {
|
class TypeRecipient: public Typer::Delegate {
|
||||||
protected:
|
protected:
|
||||||
template <typename... Args> TypeRecipient(Args&&... args) : character_mapper(std::forward<Args>(args)...) {}
|
template <typename... Args> TypeRecipient(Args&&... args) : character_mapper(std::forward<Args>(args)...) {}
|
||||||
|
|
||||||
/// Attaches a typer to this class that will type @c string using @c character_mapper as a source.
|
/// Attaches a typer to this class that will type @c string using @c character_mapper as a source.
|
||||||
@ -144,7 +144,7 @@ class TypeRecipient: public Typer::Delegate {
|
|||||||
virtual HalfCycles get_typer_frequency() const { return HalfCycles(0); }
|
virtual HalfCycles get_typer_frequency() const { return HalfCycles(0); }
|
||||||
std::unique_ptr<Typer> typer_;
|
std::unique_ptr<Typer> typer_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<Typer> previous_typer_;
|
std::unique_ptr<Typer> previous_typer_;
|
||||||
CMapper character_mapper;
|
CMapper character_mapper;
|
||||||
};
|
};
|
||||||
|
@ -26,8 +26,9 @@ constexpr uint8_t reverse_byte(uint8_t byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! Provides a class capable of generating a CRC from source data. */
|
/*! Provides a class capable of generating a CRC from source data. */
|
||||||
template <typename IntType, IntType reset_value, IntType output_xor, bool reflect_input, bool reflect_output> class Generator {
|
template <typename IntType, IntType reset_value, IntType output_xor, bool reflect_input, bool reflect_output>
|
||||||
public:
|
class Generator {
|
||||||
|
public:
|
||||||
/*!
|
/*!
|
||||||
Instantiates a CRC16 that will compute the CRC16 specified by the supplied
|
Instantiates a CRC16 that will compute the CRC16 specified by the supplied
|
||||||
@c polynomial and @c reset_value.
|
@c polynomial and @c reset_value.
|
||||||
@ -97,7 +98,7 @@ template <typename IntType, IntType reset_value, IntType output_xor, bool reflec
|
|||||||
return get_value();
|
return get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr int multibyte_shift = (sizeof(IntType) * 8) - 8;
|
static constexpr int multibyte_shift = (sizeof(IntType) * 8) - 8;
|
||||||
IntType xor_table[256];
|
IntType xor_table[256];
|
||||||
IntType value_;
|
IntType value_;
|
||||||
|
@ -40,7 +40,7 @@ template <> struct LSFRPolynomial<uint8_t> {
|
|||||||
in the specified int type.
|
in the specified int type.
|
||||||
*/
|
*/
|
||||||
template <typename IntType = uint64_t, IntType polynomial = LSFRPolynomial<IntType>::value> class LFSR {
|
template <typename IntType = uint64_t, IntType polynomial = LSFRPolynomial<IntType>::value> class LFSR {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Constructs an LFSR with a random initial value.
|
Constructs an LFSR with a random initial value.
|
||||||
*/
|
*/
|
||||||
@ -73,7 +73,7 @@ template <typename IntType = uint64_t, IntType polynomial = LSFRPolynomial<IntTy
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IntType value_ = 0;
|
IntType value_ = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ namespace Numeric {
|
|||||||
/// = 65
|
/// = 65
|
||||||
///
|
///
|
||||||
template <int... Sizes> class NumericCoder {
|
template <int... Sizes> class NumericCoder {
|
||||||
public:
|
public:
|
||||||
/// Modifies @c target to hold @c value at @c index.
|
/// Modifies @c target to hold @c value at @c index.
|
||||||
template <int index> static void encode(int &target, int value) {
|
template <int index> static void encode(int &target, int value) {
|
||||||
static_assert(index < sizeof...(Sizes), "Index must be within range");
|
static_assert(index < sizeof...(Sizes), "Index must be within range");
|
||||||
@ -41,7 +41,7 @@ template <int... Sizes> class NumericCoder {
|
|||||||
return NumericDecoder<Sizes...>::template decode<index>(source);
|
return NumericDecoder<Sizes...>::template decode<index>(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
template <int size, int... Tail>
|
template <int size, int... Tail>
|
||||||
struct NumericEncoder {
|
struct NumericEncoder {
|
||||||
|
@ -55,7 +55,7 @@ class Delegate {
|
|||||||
colour phase for colour composite video.
|
colour phase for colour composite video.
|
||||||
*/
|
*/
|
||||||
class CRT {
|
class CRT {
|
||||||
private:
|
private:
|
||||||
// The incoming clock lengths will be multiplied by @c time_multiplier_; this increases
|
// The incoming clock lengths will be multiplied by @c time_multiplier_; this increases
|
||||||
// precision across the line.
|
// precision across the line.
|
||||||
int time_multiplier_ = 1;
|
int time_multiplier_ = 1;
|
||||||
@ -109,7 +109,7 @@ class CRT {
|
|||||||
size_t allocated_data_length_ = std::numeric_limits<size_t>::min();
|
size_t allocated_data_length_ = std::numeric_limits<size_t>::min();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*! Constructs the CRT with a specified clock rate, height and colour subcarrier frequency.
|
/*! Constructs the CRT with a specified clock rate, height and colour subcarrier frequency.
|
||||||
The requested number of buffers, each with the requested number of bytes per pixel,
|
The requested number of buffers, each with the requested number of bytes per pixel,
|
||||||
is created for the machine to write raw pixel data to.
|
is created for the machine to write raw pixel data to.
|
||||||
@ -353,7 +353,7 @@ class CRT {
|
|||||||
ask its receiver to try a different display frequency.
|
ask its receiver to try a different display frequency.
|
||||||
*/
|
*/
|
||||||
template <typename Receiver> class CRTFrequencyMismatchWarner: public Outputs::CRT::Delegate {
|
template <typename Receiver> class CRTFrequencyMismatchWarner: public Outputs::CRT::Delegate {
|
||||||
public:
|
public:
|
||||||
CRTFrequencyMismatchWarner(Receiver &receiver) : receiver_(receiver) {}
|
CRTFrequencyMismatchWarner(Receiver &receiver) : receiver_(receiver) {}
|
||||||
|
|
||||||
void crt_did_end_batch_of_frames(Outputs::CRT::CRT *, int number_of_frames, int number_of_unexpected_vertical_syncs) final {
|
void crt_did_end_batch_of_frames(Outputs::CRT::CRT *, int number_of_frames, int number_of_unexpected_vertical_syncs) final {
|
||||||
@ -383,7 +383,7 @@ template <typename Receiver> class CRTFrequencyMismatchWarner: public Outputs::C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Receiver &receiver_;
|
Receiver &receiver_;
|
||||||
struct FrameRecord {
|
struct FrameRecord {
|
||||||
int number_of_frames = 0;
|
int number_of_frames = 0;
|
||||||
|
@ -229,7 +229,7 @@ struct Flywheel {
|
|||||||
(counter_ >= expected_next_sync_ - (standard_period_ / 100));
|
(counter_ >= expected_next_sync_ - (standard_period_ / 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const int standard_period_; // The idealised length of time between syncs.
|
const int standard_period_; // The idealised length of time between syncs.
|
||||||
const int retrace_time_; // A constant indicating the amount of time it takes to perform a retrace.
|
const int retrace_time_; // A constant indicating the amount of time it takes to perform a retrace.
|
||||||
const int sync_error_window_; // A constant indicating the window either side of the next expected sync in which we'll accept other syncs.
|
const int sync_error_window_; // A constant indicating the window either side of the next expected sync in which we'll accept other syncs.
|
||||||
|
@ -22,15 +22,15 @@ namespace Outputs::Display {
|
|||||||
to allow for host-client frame synchronisation.
|
to allow for host-client frame synchronisation.
|
||||||
*/
|
*/
|
||||||
class Metrics {
|
class Metrics {
|
||||||
public:
|
public:
|
||||||
/// Notifies Metrics of a beam event.
|
/// Notifies Metrics of a beam event.
|
||||||
void announce_event(ScanTarget::Event event);
|
void announce_event(ScanTarget::Event);
|
||||||
|
|
||||||
/// Notifies Metrics that the size of the output buffer has changed.
|
/// Notifies Metrics that the size of the output buffer has changed.
|
||||||
void announce_did_resize();
|
void announce_did_resize();
|
||||||
|
|
||||||
/// Provides Metrics with a new data point for output speed estimation.
|
/// Provides Metrics with a new data point for output speed estimation.
|
||||||
void announce_draw_status(size_t lines, std::chrono::high_resolution_clock::duration duration, bool complete);
|
void announce_draw_status(size_t lines, std::chrono::high_resolution_clock::duration, bool complete);
|
||||||
|
|
||||||
/// Provides Metrics with a new data point for output speed estimation, albeit without line-specific information.
|
/// Provides Metrics with a new data point for output speed estimation, albeit without line-specific information.
|
||||||
void announce_draw_status(bool complete);
|
void announce_draw_status(bool complete);
|
||||||
@ -44,7 +44,7 @@ class Metrics {
|
|||||||
/// @returns The number of lines since vertical retrace ended.
|
/// @returns The number of lines since vertical retrace ended.
|
||||||
int current_line() const;
|
int current_line() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int lines_this_frame_ = 0;
|
int lines_this_frame_ = 0;
|
||||||
std::array<int, 20> line_total_history_;
|
std::array<int, 20> line_total_history_;
|
||||||
size_t line_total_history_pointer_ = 0;
|
size_t line_total_history_pointer_ = 0;
|
||||||
|
@ -18,7 +18,7 @@ namespace Outputs::Display::OpenGL {
|
|||||||
Provides a wrapper for drawing a solid, single-colour rectangle.
|
Provides a wrapper for drawing a solid, single-colour rectangle.
|
||||||
*/
|
*/
|
||||||
class Rectangle {
|
class Rectangle {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Instantiates an instance of Rectange with the coordinates given.
|
Instantiates an instance of Rectange with the coordinates given.
|
||||||
*/
|
*/
|
||||||
@ -29,7 +29,7 @@ class Rectangle {
|
|||||||
*/
|
*/
|
||||||
void draw(float red, float green, float blue);
|
void draw(float red, float green, float blue);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Shader pixel_shader_;
|
Shader pixel_shader_;
|
||||||
GLuint drawing_vertex_array_ = 0, drawing_array_buffer_ = 0;
|
GLuint drawing_vertex_array_ = 0, drawing_array_buffer_ = 0;
|
||||||
GLint colour_uniform_;
|
GLint colour_uniform_;
|
||||||
|
@ -19,7 +19,7 @@ namespace Outputs::Display::OpenGL {
|
|||||||
handles render-to-texture framebuffer objects.
|
handles render-to-texture framebuffer objects.
|
||||||
*/
|
*/
|
||||||
class TextureTarget {
|
class TextureTarget {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Creates a new texture target. Contents are initially undefined.
|
Creates a new texture target. Contents are initially undefined.
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ class TextureTarget {
|
|||||||
*/
|
*/
|
||||||
void draw(float aspect_ratio, float colour_threshold = 0.0f) const;
|
void draw(float aspect_ratio, float colour_threshold = 0.0f) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint framebuffer_ = 0, texture_ = 0, renderbuffer_ = 0;
|
GLuint framebuffer_ = 0, texture_ = 0, renderbuffer_ = 0;
|
||||||
const GLsizei width_ = 0, height_ = 0;
|
const GLsizei width_ = 0, height_ = 0;
|
||||||
GLsizei expanded_width_ = 0, expanded_height_ = 0;
|
GLsizei expanded_width_ = 0, expanded_height_ = 0;
|
||||||
|
@ -36,7 +36,7 @@ namespace Outputs::Display::OpenGL {
|
|||||||
drawn to the target framebuffer is a quad.
|
drawn to the target framebuffer is a quad.
|
||||||
*/
|
*/
|
||||||
class ScanTarget: public Outputs::Display::BufferingScanTarget { // TODO: use private inheritance and expose only display_metrics() and a custom cast?
|
class ScanTarget: public Outputs::Display::BufferingScanTarget { // TODO: use private inheritance and expose only display_metrics() and a custom cast?
|
||||||
public:
|
public:
|
||||||
ScanTarget(GLuint target_framebuffer = 0, float output_gamma = 2.2f);
|
ScanTarget(GLuint target_framebuffer = 0, float output_gamma = 2.2f);
|
||||||
~ScanTarget();
|
~ScanTarget();
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ class ScanTarget: public Outputs::Display::BufferingScanTarget { // TODO: use pr
|
|||||||
/*! Processes all the latest input, at a resolution suitable for later output to a framebuffer of the specified size. */
|
/*! Processes all the latest input, at a resolution suitable for later output to a framebuffer of the specified size. */
|
||||||
void update(int output_width, int output_height);
|
void update(int output_width, int output_height);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr int LineBufferWidth = 2048;
|
static constexpr int LineBufferWidth = 2048;
|
||||||
static constexpr int LineBufferHeight = 2048;
|
static constexpr int LineBufferHeight = 2048;
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ namespace Outputs::Display {
|
|||||||
This buffer rejects new data when full.
|
This buffer rejects new data when full.
|
||||||
*/
|
*/
|
||||||
class BufferingScanTarget: public Outputs::Display::ScanTarget {
|
class BufferingScanTarget: public Outputs::Display::ScanTarget {
|
||||||
public:
|
public:
|
||||||
/*! @returns The DisplayMetrics object that this ScanTarget has been providing with announcements and draw overages. */
|
/*! @returns The DisplayMetrics object that this ScanTarget has been providing with announcements and draw overages. */
|
||||||
const Metrics &display_metrics();
|
const Metrics &display_metrics();
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ class BufferingScanTarget: public Outputs::Display::ScanTarget {
|
|||||||
/// Safe to call from any thread.
|
/// Safe to call from any thread.
|
||||||
bool has_new_modals() const;
|
bool has_new_modals() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// ScanTarget overrides.
|
// ScanTarget overrides.
|
||||||
void set_modals(Modals) final;
|
void set_modals(Modals) final;
|
||||||
Outputs::Display::ScanTarget::Scan *begin_scan() final;
|
Outputs::Display::ScanTarget::Scan *begin_scan() final;
|
||||||
|
@ -100,7 +100,7 @@ class BufferSource {
|
|||||||
///
|
///
|
||||||
template <typename SourceT, bool stereo, int divider = 1>
|
template <typename SourceT, bool stereo, int divider = 1>
|
||||||
struct SampleSource: public BufferSource<SourceT, stereo> {
|
struct SampleSource: public BufferSource<SourceT, stereo> {
|
||||||
public:
|
public:
|
||||||
template <Action action>
|
template <Action action>
|
||||||
void apply_samples(std::size_t number_of_samples, typename SampleT<stereo>::type *target) {
|
void apply_samples(std::size_t number_of_samples, typename SampleT<stereo>::type *target) {
|
||||||
auto &source = *static_cast<SourceT *>(this);
|
auto &source = *static_cast<SourceT *>(this);
|
||||||
@ -144,7 +144,7 @@ struct SampleSource: public BufferSource<SourceT, stereo> {
|
|||||||
// typename SampleT<stereo>::type level() const;
|
// typename SampleT<stereo>::type level() const;
|
||||||
// void advance();
|
// void advance();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int master_divider_{};
|
int master_divider_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -45,8 +45,9 @@ template <typename... S> constexpr bool are_properly_ordered() {
|
|||||||
An owner may optionally assign relative volumes.
|
An owner may optionally assign relative volumes.
|
||||||
*/
|
*/
|
||||||
template <typename... T> class CompoundSource:
|
template <typename... T> class CompoundSource:
|
||||||
public Outputs::Speaker::BufferSource<CompoundSource<T...>, ::Outputs::Speaker::is_stereo<T...>()> {
|
public Outputs::Speaker::BufferSource<CompoundSource<T...>, ::Outputs::Speaker::is_stereo<T...>()>
|
||||||
private:
|
{
|
||||||
|
private:
|
||||||
template <typename... S> class CompoundSourceHolder {
|
template <typename... S> class CompoundSourceHolder {
|
||||||
public:
|
public:
|
||||||
static constexpr bool is_stereo = false;
|
static constexpr bool is_stereo = false;
|
||||||
@ -121,7 +122,7 @@ template <typename... T> class CompoundSource:
|
|||||||
std::vector<MonoSample> conversion_source_;
|
std::vector<MonoSample> conversion_source_;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using Sample = typename SampleT<::Outputs::Speaker::is_stereo<T...>()>::type;
|
using Sample = typename SampleT<::Outputs::Speaker::is_stereo<T...>()>::type;
|
||||||
|
|
||||||
// To ensure at most one mono to stereo conversion, require appropriate source ordering.
|
// To ensure at most one mono to stereo conversion, require appropriate source ordering.
|
||||||
@ -168,7 +169,7 @@ template <typename... T> class CompoundSource:
|
|||||||
return average_output_peak_;
|
return average_output_peak_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void push_volumes() {
|
void push_volumes() {
|
||||||
const double scale = source_holder_.total_scale(volumes_.data());
|
const double scale = source_holder_.total_scale(volumes_.data());
|
||||||
source_holder_.set_scaled_volume_range(volume_range_, volumes_.data(), scale);
|
source_holder_.set_scaled_volume_range(volume_range_, volumes_.data(), scale);
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
namespace Outputs::Speaker {
|
namespace Outputs::Speaker {
|
||||||
|
|
||||||
template <typename ConcreteT, bool is_stereo> class LowpassBase: public Speaker {
|
template <typename ConcreteT, bool is_stereo> class LowpassBase: public Speaker {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Sets the clock rate of the input audio.
|
Sets the clock rate of the input audio.
|
||||||
*/
|
*/
|
||||||
@ -52,7 +52,7 @@ template <typename ConcreteT, bool is_stereo> class LowpassBase: public Speaker
|
|||||||
filter_parameters_.parameters_are_dirty = true;
|
filter_parameters_.parameters_are_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float get_ideal_clock_rate_in_range(float minimum, float maximum) final {
|
float get_ideal_clock_rate_in_range(float minimum, float maximum) final {
|
||||||
std::lock_guard lock_guard(filter_parameters_mutex_);
|
std::lock_guard lock_guard(filter_parameters_mutex_);
|
||||||
|
|
||||||
@ -237,7 +237,7 @@ template <typename ConcreteT, bool is_stereo> class LowpassBase: public Speaker
|
|||||||
return filter_parameters.input_rate_changed;
|
return filter_parameters.input_rate_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool process(size_t length) {
|
bool process(size_t length) {
|
||||||
const auto delegate = delegate_.load(std::memory_order_relaxed);
|
const auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||||
if(!delegate) return false;
|
if(!delegate) return false;
|
||||||
@ -294,7 +294,7 @@ template <typename ConcreteT, bool is_stereo> class LowpassBase: public Speaker
|
|||||||
Provides a low-pass speaker to which blocks of samples are pushed.
|
Provides a low-pass speaker to which blocks of samples are pushed.
|
||||||
*/
|
*/
|
||||||
template <bool is_stereo> class PushLowpass: public LowpassBase<PushLowpass<is_stereo>, is_stereo> {
|
template <bool is_stereo> class PushLowpass: public LowpassBase<PushLowpass<is_stereo>, is_stereo> {
|
||||||
private:
|
private:
|
||||||
using BaseT = LowpassBase<PushLowpass<is_stereo>, is_stereo>;
|
using BaseT = LowpassBase<PushLowpass<is_stereo>, is_stereo>;
|
||||||
friend BaseT;
|
friend BaseT;
|
||||||
using BaseT::process;
|
using BaseT::process;
|
||||||
@ -316,7 +316,7 @@ template <bool is_stereo> class PushLowpass: public LowpassBase<PushLowpass<is_s
|
|||||||
buffer_ += word_length;
|
buffer_ += word_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void set_output_volume(float volume) final {
|
void set_output_volume(float volume) final {
|
||||||
scale_.store(int(std::clamp(volume * 65536.0f, 0.0f, 65536.0f)));
|
scale_.store(int(std::clamp(volume * 65536.0f, 0.0f, 65536.0f)));
|
||||||
}
|
}
|
||||||
@ -350,7 +350,7 @@ template <bool is_stereo> class PushLowpass: public LowpassBase<PushLowpass<is_s
|
|||||||
lower-frequency output.
|
lower-frequency output.
|
||||||
*/
|
*/
|
||||||
template <typename SampleSource> class PullLowpass: public LowpassBase<PullLowpass<SampleSource>, SampleSource::is_stereo> {
|
template <typename SampleSource> class PullLowpass: public LowpassBase<PullLowpass<SampleSource>, SampleSource::is_stereo> {
|
||||||
public:
|
public:
|
||||||
PullLowpass(SampleSource &sample_source) : sample_source_(sample_source) {
|
PullLowpass(SampleSource &sample_source) : sample_source_(sample_source) {
|
||||||
// Propagate an initial volume level.
|
// Propagate an initial volume level.
|
||||||
sample_source.set_sample_volume_range(32767);
|
sample_source.set_sample_volume_range(32767);
|
||||||
@ -381,7 +381,7 @@ template <typename SampleSource> class PullLowpass: public LowpassBase<PullLowpa
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using BaseT = LowpassBase<PullLowpass<SampleSource>, SampleSource::is_stereo>;
|
using BaseT = LowpassBase<PullLowpass<SampleSource>, SampleSource::is_stereo>;
|
||||||
friend BaseT;
|
friend BaseT;
|
||||||
using BaseT::process;
|
using BaseT::process;
|
||||||
|
@ -61,7 +61,7 @@ template <bool stereo> struct SampleT {
|
|||||||
audio output.
|
audio output.
|
||||||
*/
|
*/
|
||||||
class Speaker {
|
class Speaker {
|
||||||
public:
|
public:
|
||||||
virtual ~Speaker() = default;
|
virtual ~Speaker() = default;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -136,7 +136,7 @@ class Speaker {
|
|||||||
// This is primarily exposed for MultiSpeaker et al; it's not for general callers.
|
// This is primarily exposed for MultiSpeaker et al; it's not for general callers.
|
||||||
virtual void set_computed_output_rate(float cycles_per_second, int buffer_size, bool stereo) = 0;
|
virtual void set_computed_output_rate(float cycles_per_second, int buffer_size, bool stereo) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void did_complete_samples(Speaker *, const std::vector<int16_t> &buffer, bool is_stereo) {
|
void did_complete_samples(Speaker *, const std::vector<int16_t> &buffer, bool is_stereo) {
|
||||||
// Test the delegate for existence again, as it may have changed.
|
// Test the delegate for existence again, as it may have changed.
|
||||||
const auto delegate = delegate_.load(std::memory_order_relaxed);
|
const auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||||
@ -170,7 +170,7 @@ class Speaker {
|
|||||||
}
|
}
|
||||||
std::atomic<Delegate *> delegate_{nullptr};
|
std::atomic<Delegate *> delegate_{nullptr};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void compute_output_rate() {
|
void compute_output_rate() {
|
||||||
// The input rate multiplier is actually used as an output rate divider,
|
// The input rate multiplier is actually used as an output rate divider,
|
||||||
// to confirm to the public interface of a generic speaker being output-centric.
|
// to confirm to the public interface of a generic speaker being output-centric.
|
||||||
|
@ -142,7 +142,7 @@ class ProcessorBase: public ProcessorStorage {
|
|||||||
can produce a minor runtime performance improvement.
|
can produce a minor runtime performance improvement.
|
||||||
*/
|
*/
|
||||||
template <Personality personality, typename BusHandler, bool uses_ready_line> class Processor: public ProcessorBase {
|
template <Personality personality, typename BusHandler, bool uses_ready_line> class Processor: public ProcessorBase {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Constructs an instance of the 6502 that will use @c bus_handler for all bus communications.
|
Constructs an instance of the 6502 that will use @c bus_handler for all bus communications.
|
||||||
*/
|
*/
|
||||||
@ -162,7 +162,7 @@ template <Personality personality, typename BusHandler, bool uses_ready_line> cl
|
|||||||
*/
|
*/
|
||||||
void set_ready_line(bool active);
|
void set_ready_line(bool active);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BusHandler &bus_handler_;
|
BusHandler &bus_handler_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ using Type = CPU::MOS6502Esque::Type;
|
|||||||
template <Type type, bool has_cias> class ConcreteAllRAMProcessor:
|
template <Type type, bool has_cias> class ConcreteAllRAMProcessor:
|
||||||
public AllRAMProcessor, public CPU::MOS6502Esque::BusHandlerT<type>
|
public AllRAMProcessor, public CPU::MOS6502Esque::BusHandlerT<type>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using typename CPU::MOS6502Esque::BusHandlerT<type>::AddressType;
|
using typename CPU::MOS6502Esque::BusHandlerT<type>::AddressType;
|
||||||
|
|
||||||
ConcreteAllRAMProcessor(size_t memory_size) :
|
ConcreteAllRAMProcessor(size_t memory_size) :
|
||||||
@ -145,7 +145,7 @@ template <Type type, bool has_cias> class ConcreteAllRAMProcessor:
|
|||||||
mos6502_.set_value_of(r, value);
|
mos6502_.set_value_of(r, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CPU::MOS6502Esque::Processor<type, ConcreteAllRAMProcessor, false> mos6502_;
|
CPU::MOS6502Esque::Processor<type, ConcreteAllRAMProcessor, false> mos6502_;
|
||||||
int instructions_ = 0;
|
int instructions_ = 0;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ enum ExtendedBusOutput {
|
|||||||
#include "Implementation/65816Storage.hpp"
|
#include "Implementation/65816Storage.hpp"
|
||||||
|
|
||||||
class ProcessorBase: protected ProcessorStorage {
|
class ProcessorBase: protected ProcessorStorage {
|
||||||
public:
|
public:
|
||||||
inline void set_power_on(bool);
|
inline void set_power_on(bool);
|
||||||
inline void set_irq_line(bool);
|
inline void set_irq_line(bool);
|
||||||
inline void set_nmi_line(bool);
|
inline void set_nmi_line(bool);
|
||||||
@ -64,7 +64,7 @@ class ProcessorBase: protected ProcessorStorage {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename BusHandler, bool uses_ready_line> class Processor: public ProcessorBase {
|
template <typename BusHandler, bool uses_ready_line> class Processor: public ProcessorBase {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Constructs an instance of the 6502 that will use @c bus_handler for all bus communications.
|
Constructs an instance of the 6502 that will use @c bus_handler for all bus communications.
|
||||||
*/
|
*/
|
||||||
@ -75,7 +75,7 @@ template <typename BusHandler, bool uses_ready_line> class Processor: public Pro
|
|||||||
|
|
||||||
@param cycles The number of cycles to run the 6502 for.
|
@param cycles The number of cycles to run the 6502 for.
|
||||||
*/
|
*/
|
||||||
void run_for(const Cycles cycles);
|
void run_for(const Cycles);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the current level of the RDY line.
|
Sets the current level of the RDY line.
|
||||||
@ -84,7 +84,7 @@ template <typename BusHandler, bool uses_ready_line> class Processor: public Pro
|
|||||||
*/
|
*/
|
||||||
void set_ready_line(bool active);
|
void set_ready_line(bool active);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BusHandler &bus_handler_;
|
BusHandler &bus_handler_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ struct CPU::WDC65816::ProcessorStorageConstructor {
|
|||||||
storage_.micro_ops_.push_back(OperationDecode);
|
storage_.micro_ops_.push_back(OperationDecode);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
PatternTable::iterator install(Generator generator, AccessType access_type = AccessType::Read) {
|
PatternTable::iterator install(Generator generator, AccessType access_type = AccessType::Read) {
|
||||||
// Check whether this access type + addressing mode generator has already been generated.
|
// Check whether this access type + addressing mode generator has already been generated.
|
||||||
|
@ -438,7 +438,7 @@ namespace CPU::MC68000 {
|
|||||||
*/
|
*/
|
||||||
template <class BusHandler, bool dtack_is_implicit = true, bool permit_overrun = true, bool signal_will_perform = false>
|
template <class BusHandler, bool dtack_is_implicit = true, bool permit_overrun = true, bool signal_will_perform = false>
|
||||||
class Processor: private ProcessorBase {
|
class Processor: private ProcessorBase {
|
||||||
public:
|
public:
|
||||||
Processor(BusHandler &bus_handler) : ProcessorBase(), bus_handler_(bus_handler) {}
|
Processor(BusHandler &bus_handler) : ProcessorBase(), bus_handler_(bus_handler) {}
|
||||||
Processor(const Processor& rhs) = delete;
|
Processor(const Processor& rhs) = delete;
|
||||||
Processor& operator=(const Processor& rhs) = delete;
|
Processor& operator=(const Processor& rhs) = delete;
|
||||||
@ -491,7 +491,7 @@ class Processor: private ProcessorBase {
|
|||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BusHandler &bus_handler_;
|
BusHandler &bus_handler_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
namespace CPU {
|
namespace CPU {
|
||||||
|
|
||||||
class AllRAMProcessor {
|
class AllRAMProcessor {
|
||||||
public:
|
public:
|
||||||
AllRAMProcessor(std::size_t memory_size);
|
AllRAMProcessor(std::size_t memory_size);
|
||||||
HalfCycles get_timestamp();
|
HalfCycles get_timestamp();
|
||||||
void set_data_at_address(size_t startAddress, size_t length, const uint8_t *data);
|
void set_data_at_address(size_t startAddress, size_t length, const uint8_t *data);
|
||||||
@ -30,7 +30,7 @@ class AllRAMProcessor {
|
|||||||
void set_trap_handler(TrapHandler *trap_handler);
|
void set_trap_handler(TrapHandler *trap_handler);
|
||||||
void add_trap_address(uint16_t address);
|
void add_trap_address(uint16_t address);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector<uint8_t> memory_;
|
std::vector<uint8_t> memory_;
|
||||||
HalfCycles timestamp_;
|
HalfCycles timestamp_;
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ class AllRAMProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TrapHandler *trap_handler_;
|
TrapHandler *trap_handler_;
|
||||||
std::vector<bool> traps_;
|
std::vector<bool> traps_;
|
||||||
};
|
};
|
||||||
|
@ -376,7 +376,7 @@ struct PartialMachineCycle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PartialMachineCycle(const PartialMachineCycle &rhs) noexcept;
|
PartialMachineCycle(const PartialMachineCycle &rhs) noexcept;
|
||||||
PartialMachineCycle(Operation operation, HalfCycles length, uint16_t *address, uint8_t *value, bool was_requested) noexcept;
|
PartialMachineCycle(Operation, HalfCycles, uint16_t *address, uint8_t *value, bool was_requested) noexcept;
|
||||||
PartialMachineCycle() noexcept;
|
PartialMachineCycle() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -386,7 +386,7 @@ struct PartialMachineCycle {
|
|||||||
handler.
|
handler.
|
||||||
*/
|
*/
|
||||||
class BusHandler {
|
class BusHandler {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Announces that the Z80 has performed the partial machine cycle defined by @c cycle.
|
Announces that the Z80 has performed the partial machine cycle defined by @c cycle.
|
||||||
|
|
||||||
@ -395,7 +395,7 @@ class BusHandler {
|
|||||||
during some periods or may impose wait states so predictably that it's more efficient just to add them
|
during some periods or may impose wait states so predictably that it's more efficient just to add them
|
||||||
via this mechanism.
|
via this mechanism.
|
||||||
*/
|
*/
|
||||||
HalfCycles perform_machine_cycle([[maybe_unused]] const PartialMachineCycle &cycle) {
|
HalfCycles perform_machine_cycle([[maybe_unused]] const PartialMachineCycle &) {
|
||||||
return HalfCycles(0);
|
return HalfCycles(0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -406,7 +406,7 @@ class BusHandler {
|
|||||||
A base class from which the Z80 descends; separated for implementation reasons only.
|
A base class from which the Z80 descends; separated for implementation reasons only.
|
||||||
*/
|
*/
|
||||||
class ProcessorBase: public ProcessorStorage {
|
class ProcessorBase: public ProcessorStorage {
|
||||||
public:
|
public:
|
||||||
/*!
|
/*!
|
||||||
Gets the value of a register.
|
Gets the value of a register.
|
||||||
|
|
||||||
@ -439,7 +439,7 @@ class ProcessorBase: public ProcessorStorage {
|
|||||||
how many cycles before now the line changed state. The value may not be longer than the
|
how many cycles before now the line changed state. The value may not be longer than the
|
||||||
current machine cycle. If called at any other time, this must be zero.
|
current machine cycle. If called at any other time, this must be zero.
|
||||||
*/
|
*/
|
||||||
inline void set_interrupt_line(bool value, HalfCycles offset = 0);
|
inline void set_interrupt_line(bool, HalfCycles offset = 0);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Gets the value of the interrupt line.
|
Gets the value of the interrupt line.
|
||||||
@ -451,7 +451,7 @@ class ProcessorBase: public ProcessorStorage {
|
|||||||
|
|
||||||
@param offset See discussion in set_interrupt_line.
|
@param offset See discussion in set_interrupt_line.
|
||||||
*/
|
*/
|
||||||
inline void set_non_maskable_interrupt_line(bool value, HalfCycles offset = 0);
|
inline void set_non_maskable_interrupt_line(bool, HalfCycles offset = 0);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Gets the value of the non-maskable interrupt line.
|
Gets the value of the non-maskable interrupt line.
|
||||||
@ -461,7 +461,7 @@ class ProcessorBase: public ProcessorStorage {
|
|||||||
/*!
|
/*!
|
||||||
Sets the logical value of the reset line.
|
Sets the logical value of the reset line.
|
||||||
*/
|
*/
|
||||||
inline void set_reset_line(bool value);
|
inline void set_reset_line(bool);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Gets whether the Z80 would reset at the next opportunity.
|
Gets whether the Z80 would reset at the next opportunity.
|
||||||
@ -493,7 +493,7 @@ class ProcessorBase: public ProcessorStorage {
|
|||||||
support either can produce a minor runtime performance improvement.
|
support either can produce a minor runtime performance improvement.
|
||||||
*/
|
*/
|
||||||
template <class T, bool uses_bus_request, bool uses_wait_line> class Processor: public ProcessorBase {
|
template <class T, bool uses_bus_request, bool uses_wait_line> class Processor: public ProcessorBase {
|
||||||
public:
|
public:
|
||||||
Processor(T &bus_handler);
|
Processor(T &bus_handler);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -505,12 +505,12 @@ template <class T, bool uses_bus_request, bool uses_wait_line> class Processor:
|
|||||||
|
|
||||||
@param cycles The number of cycles to run for.
|
@param cycles The number of cycles to run for.
|
||||||
*/
|
*/
|
||||||
void run_for(const HalfCycles cycles);
|
void run_for(const HalfCycles);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Sets the logical value of the bus request line, having asserted that this Z80 supports the bus request line.
|
Sets the logical value of the bus request line, having asserted that this Z80 supports the bus request line.
|
||||||
*/
|
*/
|
||||||
void set_bus_request_line(bool value);
|
void set_bus_request_line(bool);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Gets the logical value of the bus request line.
|
Gets the logical value of the bus request line.
|
||||||
@ -520,17 +520,17 @@ template <class T, bool uses_bus_request, bool uses_wait_line> class Processor:
|
|||||||
/*!
|
/*!
|
||||||
Sets the logical value of the wait line, having asserted that this Z80 supports the wait line.
|
Sets the logical value of the wait line, having asserted that this Z80 supports the wait line.
|
||||||
*/
|
*/
|
||||||
void set_wait_line(bool value);
|
void set_wait_line(bool);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Gets the logical value of the bus request line.
|
Gets the logical value of the bus request line.
|
||||||
*/
|
*/
|
||||||
bool get_wait_line() const;
|
bool get_wait_line() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T &bus_handler_;
|
T &bus_handler_;
|
||||||
|
|
||||||
void assemble_page(InstructionPage &target, InstructionTable &table, bool add_offsets);
|
void assemble_page(InstructionPage &, InstructionTable &, bool add_offsets);
|
||||||
void copy_program(const MicroOp *source, std::vector<MicroOp> &destination);
|
void copy_program(const MicroOp *source, std::vector<MicroOp> &destination);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user