mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-13 00:29:14 +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_;
|
||||
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;
|
||||
bit_count_++;
|
||||
}
|
||||
@ -107,7 +107,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
void process_index_hole() {
|
||||
void process_index_hole() override {
|
||||
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.
|
||||
*/
|
||||
template <typename Machine> class AuxiliaryMemorySwitches {
|
||||
public:
|
||||
public:
|
||||
static constexpr bool Auxiliary = true;
|
||||
static constexpr bool Main = false;
|
||||
static constexpr bool ROM = true;
|
||||
@ -220,7 +220,7 @@ template <typename Machine> class AuxiliaryMemorySwitches {
|
||||
set_card_paging();
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
Machine &machine_;
|
||||
SwitchState switches_;
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
namespace Apple::IIgs::ADB {
|
||||
|
||||
class GLU: public InstructionSet::M50740::PortHandler {
|
||||
public:
|
||||
public:
|
||||
GLU();
|
||||
|
||||
uint8_t get_keyboard_data();
|
||||
@ -53,7 +53,7 @@ class GLU: public InstructionSet::M50740::PortHandler {
|
||||
return mouse_;
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
InstructionSet::M50740::Executor executor_;
|
||||
|
||||
void run_ports_for(Cycles) override;
|
||||
|
@ -88,7 +88,7 @@ class ConcreteMachine:
|
||||
public MachineTypes::TimedMachine,
|
||||
public CPU::MOS6502Esque::BusHandler<uint32_t> {
|
||||
|
||||
public:
|
||||
public:
|
||||
ConcreteMachine(const Analyser::Static::AppleIIgs::Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
||||
m65816_(*this),
|
||||
memory_(target.model >= Analyser::Static::AppleIIgs::Target::Model::ROM03),
|
||||
@ -133,43 +133,43 @@ class ConcreteMachine:
|
||||
// rom_[0x36402] = 2;
|
||||
// rom_[0x36403] = 0x7c; // ROM_CHECKSUM [working, when hacks like this are removed]
|
||||
// rom_[0x36404] = 0x6c;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0x82; // MOVIRAM [working]
|
||||
// rom_[0x36404] = 0x67;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0x2c; // SOFT_SW [working]
|
||||
// rom_[0x36404] = 0x6a;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0xe8; // RAM_ADDR [working]
|
||||
// rom_[0x36404] = 0x6f;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0xc7; // FPI_SPEED [working]
|
||||
// rom_[0x36404] = 0x6a;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0xd7; // SER_TST [broken]
|
||||
// rom_[0x36404] = 0x68;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0xdc; // CLOCK [broken]
|
||||
// rom_[0x36404] = 0x6c;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0x1b; // BAT_RAM [broken]
|
||||
// rom_[0x36404] = 0x6e;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0x11; // FDB (/ADB?) [broken]
|
||||
// rom_[0x36404] = 0x6f;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0x41; // SHADOW_TST [working]
|
||||
// rom_[0x36404] = 0x6d;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0x09; // CUSTOM_IRQ [broken?]
|
||||
// rom_[0x36404] = 0x6b;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0xf4; // DOC_EXEC
|
||||
// rom_[0x36404] = 0x70;
|
||||
|
||||
//
|
||||
// rom_[0x36403] = 0xab; // ECT_SEQ
|
||||
// rom_[0x36404] = 0x64;
|
||||
|
||||
//
|
||||
// rom_[0xfc146f] = rom_[0xfc1470] = 0xea;
|
||||
|
||||
size_t ram_size = 0;
|
||||
@ -932,7 +932,7 @@ class ConcreteMachine:
|
||||
return joysticks_.get_joysticks();
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
CPU::WDC65816::Processor<ConcreteMachine, false> m65816_;
|
||||
MemoryMap memory_;
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
namespace Apple::IIgs {
|
||||
|
||||
class MemoryMap {
|
||||
public:
|
||||
public:
|
||||
// MARK: - Initial construction and configuration.
|
||||
|
||||
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
|
||||
// even on that.
|
||||
|
||||
private:
|
||||
private:
|
||||
AuxiliaryMemorySwitches auxiliary_switches_;
|
||||
LanguageCardSwitches language_card_;
|
||||
friend AuxiliaryMemorySwitches;
|
||||
|
@ -17,7 +17,7 @@
|
||||
namespace Apple::IIgs::Sound {
|
||||
|
||||
class GLU: public Outputs::Speaker::BufferSource<GLU, false> { // TODO: isn't this stereo?
|
||||
public:
|
||||
public:
|
||||
GLU(Concurrency::AsyncTaskQueue<false> &audio_queue);
|
||||
|
||||
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);
|
||||
bool is_zero_level() const { return false; } // TODO.
|
||||
|
||||
private:
|
||||
private:
|
||||
Concurrency::AsyncTaskQueue<false> &audio_queue_;
|
||||
|
||||
uint16_t address_ = 0;
|
||||
|
@ -20,7 +20,7 @@ namespace Apple::IIgs::Video {
|
||||
stretched cycle.
|
||||
*/
|
||||
class Video: public Apple::II::VideoSwitches<Cycles> {
|
||||
public:
|
||||
public:
|
||||
Video();
|
||||
void set_internal_ram(const uint8_t *);
|
||||
|
||||
@ -69,7 +69,7 @@ class Video: public Apple::II::VideoSwitches<Cycles> {
|
||||
|
||||
void clear_megaii_interrupts();
|
||||
|
||||
private:
|
||||
private:
|
||||
Outputs::CRT::CRT crt_;
|
||||
|
||||
// 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.
|
||||
*/
|
||||
class Audio: public ::Outputs::Speaker::BufferSource<Audio, false> {
|
||||
public:
|
||||
public:
|
||||
Audio(Concurrency::AsyncTaskQueue<false> &task_queue);
|
||||
|
||||
/*!
|
||||
@ -55,7 +55,7 @@ class Audio: public ::Outputs::Speaker::BufferSource<Audio, false> {
|
||||
bool is_zero_level() const;
|
||||
void set_sample_volume_range(std::int16_t range);
|
||||
|
||||
private:
|
||||
private:
|
||||
Concurrency::AsyncTaskQueue<false> &task_queue_;
|
||||
|
||||
// A queue of fetched samples; read from by one thread,
|
||||
|
@ -15,7 +15,7 @@
|
||||
namespace Apple::Macintosh {
|
||||
|
||||
class DriveSpeedAccumulator {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
Accepts fetched motor control values.
|
||||
*/
|
||||
@ -31,7 +31,7 @@ class DriveSpeedAccumulator {
|
||||
delegate_ = delegate;
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
static constexpr int samples_per_bucket = 20;
|
||||
int sample_count_ = 0;
|
||||
int sample_total_ = 0;
|
||||
|
@ -83,7 +83,7 @@ enum class Key: uint16_t {
|
||||
};
|
||||
|
||||
class Keyboard {
|
||||
public:
|
||||
public:
|
||||
void set_input(bool data) {
|
||||
switch(mode_) {
|
||||
case Mode::Waiting:
|
||||
@ -218,7 +218,7 @@ class Keyboard {
|
||||
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
|
||||
/// the proper result if the command were to terminate now. So, it treats inquiry
|
||||
/// and instant as the same command.
|
||||
|
@ -79,7 +79,7 @@ template <Analyser::Static::Macintosh::Target::Model model> class ConcreteMachin
|
||||
public Configurable::Device,
|
||||
public DriveSpeedAccumulator::Delegate,
|
||||
public ClockingHint::Observer {
|
||||
public:
|
||||
public:
|
||||
using Target = Analyser::Static::Macintosh::Target;
|
||||
|
||||
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;
|
||||
|
||||
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.
|
||||
*/
|
||||
class Video {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
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.
|
||||
@ -81,7 +81,7 @@ class Video {
|
||||
*/
|
||||
HalfCycles next_sequence_point();
|
||||
|
||||
private:
|
||||
private:
|
||||
DeferredAudio &audio_;
|
||||
DriveSpeedAccumulator &drive_speed_accumulator_;
|
||||
|
||||
|
@ -36,7 +36,7 @@ namespace {
|
||||
namespace Atari2600 {
|
||||
|
||||
class Joystick: public Inputs::ConcreteJoystick {
|
||||
public:
|
||||
public:
|
||||
Joystick(Bus *bus, std::size_t shift, std::size_t fire_tia_input) :
|
||||
ConcreteJoystick({
|
||||
Input(Input::Up),
|
||||
@ -66,7 +66,7 @@ class Joystick: public Inputs::ConcreteJoystick {
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
Bus *bus_;
|
||||
std::size_t shift_, fire_tia_input_;
|
||||
};
|
||||
@ -79,7 +79,7 @@ class ConcreteMachine:
|
||||
public MachineTypes::AudioProducer,
|
||||
public MachineTypes::ScanProducer,
|
||||
public MachineTypes::JoystickMachine {
|
||||
public:
|
||||
public:
|
||||
ConcreteMachine(const Target &target) : frequency_mismatch_warner_(*this) {
|
||||
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();
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
// The bus.
|
||||
std::unique_ptr<Bus> bus_;
|
||||
|
||||
|
@ -64,7 +64,7 @@ class ConcreteMachine:
|
||||
public GI::AY38910::PortHandler,
|
||||
public Configurable::Device,
|
||||
public Video::RangeObserver {
|
||||
public:
|
||||
public:
|
||||
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
||||
mc68000_(*this),
|
||||
keyboard_acia_(Cycles(500000)),
|
||||
@ -455,7 +455,7 @@ class ConcreteMachine:
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
forceinline void advance_time(HalfCycles length) {
|
||||
// Advance the relevant counters.
|
||||
cycles_since_audio_update_ += length;
|
||||
|
@ -19,7 +19,7 @@
|
||||
namespace Atari::ST {
|
||||
|
||||
class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, public ClockingHint::Observer {
|
||||
public:
|
||||
public:
|
||||
DMAController();
|
||||
|
||||
uint16_t read(int address);
|
||||
@ -50,7 +50,7 @@ class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, p
|
||||
// ClockingHint::Source.
|
||||
ClockingHint::Preference preferred_clocking() const final;
|
||||
|
||||
private:
|
||||
private:
|
||||
HalfCycles running_time_;
|
||||
struct WD1772: public WD::WD1770 {
|
||||
WD1772(): WD::WD1770(WD::WD1770::P1772) {
|
||||
|
@ -54,7 +54,7 @@ class IntelligentKeyboard:
|
||||
public Serial::Line<false>::ReadDelegate,
|
||||
public ClockingHint::Source,
|
||||
public Inputs::Mouse {
|
||||
public:
|
||||
public:
|
||||
IntelligentKeyboard(Serial::Line<false> &input, Serial::Line<false> &output);
|
||||
ClockingHint::Preference preferred_clocking() const final;
|
||||
void run_for(HalfCycles duration);
|
||||
@ -68,7 +68,7 @@ class IntelligentKeyboard:
|
||||
return joysticks_;
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
// MARK: - Key queue.
|
||||
std::mutex key_queue_mutex_;
|
||||
std::vector<uint8_t> key_queue_;
|
||||
|
@ -31,7 +31,7 @@ struct LineLength {
|
||||
(hopefully) to a subsystem.
|
||||
*/
|
||||
class Video {
|
||||
public:
|
||||
public:
|
||||
Video();
|
||||
|
||||
/*!
|
||||
@ -123,7 +123,7 @@ class Video {
|
||||
*/
|
||||
Range get_memory_access_range();
|
||||
|
||||
private:
|
||||
private:
|
||||
DeferredQueue<HalfCycles> deferrer_;
|
||||
|
||||
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.
|
||||
*/
|
||||
class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||
public:
|
||||
public:
|
||||
SerialPortVIA(MOS::MOS6522::MOS6522<SerialPortVIA> &via);
|
||||
|
||||
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> &);
|
||||
|
||||
private:
|
||||
private:
|
||||
MOS::MOS6522::MOS6522<SerialPortVIA> &via_;
|
||||
uint8_t port_b_ = 0x0;
|
||||
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.
|
||||
*/
|
||||
class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||
public:
|
||||
public:
|
||||
class Delegate {
|
||||
public:
|
||||
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);
|
||||
|
||||
private:
|
||||
private:
|
||||
uint8_t port_b_ = 0xff, port_a_ = 0xff;
|
||||
bool should_set_overflow_ = 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.
|
||||
*/
|
||||
class SerialPort : public ::Commodore::Serial::Port {
|
||||
public:
|
||||
public:
|
||||
void set_input(::Commodore::Serial::Line, ::Commodore::Serial::LineLevel);
|
||||
void set_serial_port_via(const std::shared_ptr<SerialPortVIA> &);
|
||||
|
||||
private:
|
||||
private:
|
||||
std::weak_ptr<SerialPortVIA> serial_port_VIA_;
|
||||
};
|
||||
|
||||
@ -124,7 +124,7 @@ class MachineBase:
|
||||
public DriveVIA::Delegate,
|
||||
public Storage::Disk::Controller {
|
||||
|
||||
public:
|
||||
public:
|
||||
MachineBase(Personality personality, const ROM::Map &roms);
|
||||
|
||||
// to satisfy CPU::MOS6502::Processor
|
||||
@ -140,7 +140,7 @@ class MachineBase:
|
||||
/// Attaches the activity observer to this C1540.
|
||||
void set_activity_observer(Activity::Observer *observer);
|
||||
|
||||
protected:
|
||||
protected:
|
||||
CPU::MOS6502::Processor<CPU::MOS6502::Personality::P6502, MachineBase, false> m6502_;
|
||||
|
||||
uint8_t ram_[0x800];
|
||||
|
@ -209,7 +209,7 @@ struct Description {
|
||||
/// plus all the fields provided as @c flags .
|
||||
std::string description(int flags) const;
|
||||
|
||||
private:
|
||||
private:
|
||||
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}, 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'*').
|
||||
std::wstring description(int description_flags, wchar_t bullet_point);
|
||||
|
||||
private:
|
||||
private:
|
||||
struct Node {
|
||||
enum class Type {
|
||||
Any, All, One
|
||||
|
@ -14,13 +14,13 @@
|
||||
namespace Utility {
|
||||
|
||||
class StringSerialiser {
|
||||
public:
|
||||
public:
|
||||
StringSerialiser(const std::string &source, bool use_linefeed_only = false);
|
||||
|
||||
uint8_t head();
|
||||
bool advance();
|
||||
|
||||
private:
|
||||
private:
|
||||
std::string input_string_;
|
||||
std::size_t input_string_pointer_ = 0;
|
||||
};
|
||||
|
@ -15,7 +15,7 @@
|
||||
namespace Machine {
|
||||
|
||||
template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine {
|
||||
public:
|
||||
public:
|
||||
TypedDynamicMachine(std::unique_ptr<T> &&machine) : machine_(std::move(machine)) {}
|
||||
T *get() { return machine_.get(); }
|
||||
|
||||
@ -47,7 +47,7 @@ template<typename T> class TypedDynamicMachine: public ::Machine::DynamicMachine
|
||||
return get();
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
template <typename Class> Class *get() {
|
||||
return dynamic_cast<Class *>(machine_.get());
|
||||
|
||||
|
@ -63,7 +63,7 @@ class CharacterMapper {
|
||||
fresh key transition is ready to be consumed.
|
||||
*/
|
||||
class Typer {
|
||||
public:
|
||||
public:
|
||||
class Delegate: public MachineTypes::KeyActions {
|
||||
public:
|
||||
/// 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 EndString = 0x03; // i.e. ASCII end of text
|
||||
|
||||
private:
|
||||
private:
|
||||
std::string string_;
|
||||
std::size_t string_pointer_ = 0;
|
||||
|
||||
@ -106,7 +106,7 @@ class Typer {
|
||||
*/
|
||||
template <typename CMapper>
|
||||
class TypeRecipient: public Typer::Delegate {
|
||||
protected:
|
||||
protected:
|
||||
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.
|
||||
@ -144,7 +144,7 @@ class TypeRecipient: public Typer::Delegate {
|
||||
virtual HalfCycles get_typer_frequency() const { return HalfCycles(0); }
|
||||
std::unique_ptr<Typer> typer_;
|
||||
|
||||
private:
|
||||
private:
|
||||
std::unique_ptr<Typer> previous_typer_;
|
||||
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. */
|
||||
template <typename IntType, IntType reset_value, IntType output_xor, bool reflect_input, bool reflect_output> class Generator {
|
||||
public:
|
||||
template <typename IntType, IntType reset_value, IntType output_xor, bool reflect_input, bool reflect_output>
|
||||
class Generator {
|
||||
public:
|
||||
/*!
|
||||
Instantiates a CRC16 that will compute the CRC16 specified by the supplied
|
||||
@c polynomial and @c reset_value.
|
||||
@ -97,7 +98,7 @@ template <typename IntType, IntType reset_value, IntType output_xor, bool reflec
|
||||
return get_value();
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
static constexpr int multibyte_shift = (sizeof(IntType) * 8) - 8;
|
||||
IntType xor_table[256];
|
||||
IntType value_;
|
||||
|
@ -40,7 +40,7 @@ template <> struct LSFRPolynomial<uint8_t> {
|
||||
in the specified int type.
|
||||
*/
|
||||
template <typename IntType = uint64_t, IntType polynomial = LSFRPolynomial<IntType>::value> class LFSR {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
Constructs an LFSR with a random initial value.
|
||||
*/
|
||||
@ -73,7 +73,7 @@ template <typename IntType = uint64_t, IntType polynomial = LSFRPolynomial<IntTy
|
||||
return result;
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
IntType value_ = 0;
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@ namespace Numeric {
|
||||
/// = 65
|
||||
///
|
||||
template <int... Sizes> class NumericCoder {
|
||||
public:
|
||||
public:
|
||||
/// Modifies @c target to hold @c value at @c index.
|
||||
template <int index> static void encode(int &target, int value) {
|
||||
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);
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
|
||||
template <int size, int... Tail>
|
||||
struct NumericEncoder {
|
||||
|
@ -55,7 +55,7 @@ class Delegate {
|
||||
colour phase for colour composite video.
|
||||
*/
|
||||
class CRT {
|
||||
private:
|
||||
private:
|
||||
// The incoming clock lengths will be multiplied by @c time_multiplier_; this increases
|
||||
// precision across the line.
|
||||
int time_multiplier_ = 1;
|
||||
@ -109,7 +109,7 @@ class CRT {
|
||||
size_t allocated_data_length_ = std::numeric_limits<size_t>::min();
|
||||
#endif
|
||||
|
||||
public:
|
||||
public:
|
||||
/*! 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,
|
||||
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.
|
||||
*/
|
||||
template <typename Receiver> class CRTFrequencyMismatchWarner: public Outputs::CRT::Delegate {
|
||||
public:
|
||||
public:
|
||||
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 {
|
||||
@ -383,7 +383,7 @@ template <typename Receiver> class CRTFrequencyMismatchWarner: public Outputs::C
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
Receiver &receiver_;
|
||||
struct FrameRecord {
|
||||
int number_of_frames = 0;
|
||||
|
@ -229,7 +229,7 @@ struct Flywheel {
|
||||
(counter_ >= expected_next_sync_ - (standard_period_ / 100));
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
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 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.
|
||||
*/
|
||||
class Metrics {
|
||||
public:
|
||||
public:
|
||||
/// 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.
|
||||
void announce_did_resize();
|
||||
|
||||
/// 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.
|
||||
void announce_draw_status(bool complete);
|
||||
@ -44,7 +44,7 @@ class Metrics {
|
||||
/// @returns The number of lines since vertical retrace ended.
|
||||
int current_line() const;
|
||||
|
||||
private:
|
||||
private:
|
||||
int lines_this_frame_ = 0;
|
||||
std::array<int, 20> line_total_history_;
|
||||
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.
|
||||
*/
|
||||
class Rectangle {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
Instantiates an instance of Rectange with the coordinates given.
|
||||
*/
|
||||
@ -29,7 +29,7 @@ class Rectangle {
|
||||
*/
|
||||
void draw(float red, float green, float blue);
|
||||
|
||||
private:
|
||||
private:
|
||||
Shader pixel_shader_;
|
||||
GLuint drawing_vertex_array_ = 0, drawing_array_buffer_ = 0;
|
||||
GLint colour_uniform_;
|
||||
|
@ -19,7 +19,7 @@ namespace Outputs::Display::OpenGL {
|
||||
handles render-to-texture framebuffer objects.
|
||||
*/
|
||||
class TextureTarget {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
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;
|
||||
|
||||
private:
|
||||
private:
|
||||
GLuint framebuffer_ = 0, texture_ = 0, renderbuffer_ = 0;
|
||||
const GLsizei width_ = 0, 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.
|
||||
*/
|
||||
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();
|
||||
|
||||
@ -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. */
|
||||
void update(int output_width, int output_height);
|
||||
|
||||
private:
|
||||
private:
|
||||
static constexpr int LineBufferWidth = 2048;
|
||||
static constexpr int LineBufferHeight = 2048;
|
||||
|
||||
|
@ -33,7 +33,7 @@ namespace Outputs::Display {
|
||||
This buffer rejects new data when full.
|
||||
*/
|
||||
class BufferingScanTarget: public Outputs::Display::ScanTarget {
|
||||
public:
|
||||
public:
|
||||
/*! @returns The DisplayMetrics object that this ScanTarget has been providing with announcements and draw overages. */
|
||||
const Metrics &display_metrics();
|
||||
|
||||
@ -164,7 +164,7 @@ class BufferingScanTarget: public Outputs::Display::ScanTarget {
|
||||
/// Safe to call from any thread.
|
||||
bool has_new_modals() const;
|
||||
|
||||
private:
|
||||
private:
|
||||
// ScanTarget overrides.
|
||||
void set_modals(Modals) final;
|
||||
Outputs::Display::ScanTarget::Scan *begin_scan() final;
|
||||
|
@ -100,7 +100,7 @@ class BufferSource {
|
||||
///
|
||||
template <typename SourceT, bool stereo, int divider = 1>
|
||||
struct SampleSource: public BufferSource<SourceT, stereo> {
|
||||
public:
|
||||
public:
|
||||
template <Action action>
|
||||
void apply_samples(std::size_t number_of_samples, typename SampleT<stereo>::type *target) {
|
||||
auto &source = *static_cast<SourceT *>(this);
|
||||
@ -144,7 +144,7 @@ struct SampleSource: public BufferSource<SourceT, stereo> {
|
||||
// typename SampleT<stereo>::type level() const;
|
||||
// void advance();
|
||||
|
||||
private:
|
||||
private:
|
||||
int master_divider_{};
|
||||
};
|
||||
|
||||
|
@ -45,8 +45,9 @@ template <typename... S> constexpr bool are_properly_ordered() {
|
||||
An owner may optionally assign relative volumes.
|
||||
*/
|
||||
template <typename... T> class CompoundSource:
|
||||
public Outputs::Speaker::BufferSource<CompoundSource<T...>, ::Outputs::Speaker::is_stereo<T...>()> {
|
||||
private:
|
||||
public Outputs::Speaker::BufferSource<CompoundSource<T...>, ::Outputs::Speaker::is_stereo<T...>()>
|
||||
{
|
||||
private:
|
||||
template <typename... S> class CompoundSourceHolder {
|
||||
public:
|
||||
static constexpr bool is_stereo = false;
|
||||
@ -121,7 +122,7 @@ template <typename... T> class CompoundSource:
|
||||
std::vector<MonoSample> conversion_source_;
|
||||
};
|
||||
|
||||
public:
|
||||
public:
|
||||
using Sample = typename SampleT<::Outputs::Speaker::is_stereo<T...>()>::type;
|
||||
|
||||
// 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_;
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
void push_volumes() {
|
||||
const double scale = source_holder_.total_scale(volumes_.data());
|
||||
source_holder_.set_scaled_volume_range(volume_range_, volumes_.data(), scale);
|
||||
|
@ -23,7 +23,7 @@
|
||||
namespace Outputs::Speaker {
|
||||
|
||||
template <typename ConcreteT, bool is_stereo> class LowpassBase: public Speaker {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
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;
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
float get_ideal_clock_rate_in_range(float minimum, float maximum) final {
|
||||
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;
|
||||
}
|
||||
|
||||
protected:
|
||||
protected:
|
||||
bool process(size_t length) {
|
||||
const auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||
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.
|
||||
*/
|
||||
template <bool is_stereo> class PushLowpass: public LowpassBase<PushLowpass<is_stereo>, is_stereo> {
|
||||
private:
|
||||
private:
|
||||
using BaseT = LowpassBase<PushLowpass<is_stereo>, is_stereo>;
|
||||
friend BaseT;
|
||||
using BaseT::process;
|
||||
@ -316,7 +316,7 @@ template <bool is_stereo> class PushLowpass: public LowpassBase<PushLowpass<is_s
|
||||
buffer_ += word_length;
|
||||
}
|
||||
|
||||
public:
|
||||
public:
|
||||
void set_output_volume(float volume) final {
|
||||
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.
|
||||
*/
|
||||
template <typename SampleSource> class PullLowpass: public LowpassBase<PullLowpass<SampleSource>, SampleSource::is_stereo> {
|
||||
public:
|
||||
public:
|
||||
PullLowpass(SampleSource &sample_source) : sample_source_(sample_source) {
|
||||
// Propagate an initial volume level.
|
||||
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>;
|
||||
friend BaseT;
|
||||
using BaseT::process;
|
||||
|
@ -61,7 +61,7 @@ template <bool stereo> struct SampleT {
|
||||
audio output.
|
||||
*/
|
||||
class Speaker {
|
||||
public:
|
||||
public:
|
||||
virtual ~Speaker() = default;
|
||||
|
||||
/*!
|
||||
@ -136,7 +136,7 @@ class Speaker {
|
||||
// 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;
|
||||
|
||||
protected:
|
||||
protected:
|
||||
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.
|
||||
const auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||
@ -170,7 +170,7 @@ class Speaker {
|
||||
}
|
||||
std::atomic<Delegate *> delegate_{nullptr};
|
||||
|
||||
private:
|
||||
private:
|
||||
void compute_output_rate() {
|
||||
// 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.
|
||||
|
@ -142,7 +142,7 @@ class ProcessorBase: public ProcessorStorage {
|
||||
can produce a minor runtime performance improvement.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
@ -162,7 +162,7 @@ template <Personality personality, typename BusHandler, bool uses_ready_line> cl
|
||||
*/
|
||||
void set_ready_line(bool active);
|
||||
|
||||
private:
|
||||
private:
|
||||
BusHandler &bus_handler_;
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@ using Type = CPU::MOS6502Esque::Type;
|
||||
template <Type type, bool has_cias> class ConcreteAllRAMProcessor:
|
||||
public AllRAMProcessor, public CPU::MOS6502Esque::BusHandlerT<type>
|
||||
{
|
||||
public:
|
||||
public:
|
||||
using typename CPU::MOS6502Esque::BusHandlerT<type>::AddressType;
|
||||
|
||||
ConcreteAllRAMProcessor(size_t memory_size) :
|
||||
@ -145,7 +145,7 @@ template <Type type, bool has_cias> class ConcreteAllRAMProcessor:
|
||||
mos6502_.set_value_of(r, value);
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
CPU::MOS6502Esque::Processor<type, ConcreteAllRAMProcessor, false> mos6502_;
|
||||
int instructions_ = 0;
|
||||
|
||||
|
@ -34,7 +34,7 @@ enum ExtendedBusOutput {
|
||||
#include "Implementation/65816Storage.hpp"
|
||||
|
||||
class ProcessorBase: protected ProcessorStorage {
|
||||
public:
|
||||
public:
|
||||
inline void set_power_on(bool);
|
||||
inline void set_irq_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 {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
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.
|
||||
*/
|
||||
void run_for(const Cycles cycles);
|
||||
void run_for(const Cycles);
|
||||
|
||||
/*!
|
||||
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);
|
||||
|
||||
private:
|
||||
private:
|
||||
BusHandler &bus_handler_;
|
||||
};
|
||||
|
||||
|
@ -108,7 +108,7 @@ struct CPU::WDC65816::ProcessorStorageConstructor {
|
||||
storage_.micro_ops_.push_back(OperationDecode);
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
|
||||
PatternTable::iterator install(Generator generator, AccessType access_type = AccessType::Read) {
|
||||
// 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>
|
||||
class Processor: private ProcessorBase {
|
||||
public:
|
||||
public:
|
||||
Processor(BusHandler &bus_handler) : ProcessorBase(), bus_handler_(bus_handler) {}
|
||||
Processor(const Processor& rhs) = delete;
|
||||
Processor& operator=(const Processor& rhs) = delete;
|
||||
@ -491,7 +491,7 @@ class Processor: private ProcessorBase {
|
||||
|
||||
void reset();
|
||||
|
||||
private:
|
||||
private:
|
||||
BusHandler &bus_handler_;
|
||||
};
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
namespace CPU {
|
||||
|
||||
class AllRAMProcessor {
|
||||
public:
|
||||
public:
|
||||
AllRAMProcessor(std::size_t memory_size);
|
||||
HalfCycles get_timestamp();
|
||||
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 add_trap_address(uint16_t address);
|
||||
|
||||
protected:
|
||||
protected:
|
||||
std::vector<uint8_t> memory_;
|
||||
HalfCycles timestamp_;
|
||||
|
||||
@ -40,7 +40,7 @@ class AllRAMProcessor {
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
TrapHandler *trap_handler_;
|
||||
std::vector<bool> traps_;
|
||||
};
|
||||
|
@ -376,7 +376,7 @@ struct PartialMachineCycle {
|
||||
}
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
@ -386,7 +386,7 @@ struct PartialMachineCycle {
|
||||
handler.
|
||||
*/
|
||||
class BusHandler {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
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
|
||||
via this mechanism.
|
||||
*/
|
||||
HalfCycles perform_machine_cycle([[maybe_unused]] const PartialMachineCycle &cycle) {
|
||||
HalfCycles perform_machine_cycle([[maybe_unused]] const PartialMachineCycle &) {
|
||||
return HalfCycles(0);
|
||||
}
|
||||
};
|
||||
@ -406,7 +406,7 @@ class BusHandler {
|
||||
A base class from which the Z80 descends; separated for implementation reasons only.
|
||||
*/
|
||||
class ProcessorBase: public ProcessorStorage {
|
||||
public:
|
||||
public:
|
||||
/*!
|
||||
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
|
||||
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.
|
||||
@ -451,7 +451,7 @@ class ProcessorBase: public ProcessorStorage {
|
||||
|
||||
@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.
|
||||
@ -461,7 +461,7 @@ class ProcessorBase: public ProcessorStorage {
|
||||
/*!
|
||||
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.
|
||||
@ -493,7 +493,7 @@ class ProcessorBase: public ProcessorStorage {
|
||||
support either can produce a minor runtime performance improvement.
|
||||
*/
|
||||
template <class T, bool uses_bus_request, bool uses_wait_line> class Processor: public ProcessorBase {
|
||||
public:
|
||||
public:
|
||||
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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
void set_bus_request_line(bool value);
|
||||
void set_bus_request_line(bool);
|
||||
|
||||
/*!
|
||||
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.
|
||||
*/
|
||||
void set_wait_line(bool value);
|
||||
void set_wait_line(bool);
|
||||
|
||||
/*!
|
||||
Gets the logical value of the bus request line.
|
||||
*/
|
||||
bool get_wait_line() const;
|
||||
|
||||
private:
|
||||
private:
|
||||
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);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user