mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-24 10:29:16 +00:00
Eliminates all emdashes in cross-platform code.
This commit is contained in:
parent
0b771ce61a
commit
5d6b5d9f10
@ -15,7 +15,7 @@ namespace Activity {
|
||||
|
||||
/*!
|
||||
Provides a purely virtual base class for anybody that wants to receive notifications of
|
||||
'activity' — any feedback from an emulated system which a user could perceive other than
|
||||
'activity': any feedback from an emulated system which a user could perceive other than
|
||||
through the machine's native audio and video outputs.
|
||||
|
||||
So: status LEDs, drive activity, etc. A receiver may choose to make appropriate noises
|
||||
|
@ -24,10 +24,10 @@ class ConfidenceCounter: public ConfidenceSource {
|
||||
/*! @returns The computed probability, based on the history of events. */
|
||||
float get_confidence() override;
|
||||
|
||||
/*! Records an event that implies this is the appropriate class — pushes probability up towards 1.0. */
|
||||
/*! Records an event that implies this is the appropriate class: pushes probability up towards 1.0. */
|
||||
void add_hit();
|
||||
|
||||
/*! Records an event that implies this is not the appropriate class — pushes probability down towards 0.0. */
|
||||
/*! Records an event that implies this is not the appropriate class: pushes probability down towards 0.0. */
|
||||
void add_miss();
|
||||
|
||||
/*!
|
||||
|
@ -16,7 +16,7 @@ namespace Analyser {
|
||||
namespace Static {
|
||||
namespace Acorn {
|
||||
|
||||
/// Describes a DFS- or ADFS-format catalogue(/directory) — the list of files available and the catalogue's boot option.
|
||||
/// Describes a DFS- or ADFS-format catalogue(/directory): the list of files available and the catalogue's boot option.
|
||||
struct Catalogue {
|
||||
std::string name;
|
||||
std::vector<File> files;
|
||||
|
@ -50,7 +50,7 @@ static std::vector<std::shared_ptr<Storage::Cartridge::Cartridge>>
|
||||
// 1/(2^32) *
|
||||
// ( ((2^24)-1)/(2^24)*(1/4) + 1/(2^24) ) *
|
||||
// 1/4
|
||||
// = something very improbable — around 1/16th of 1 in 2^32, but not exactly.
|
||||
// = something very improbable, around 1/16th of 1 in 2^32, but not exactly.
|
||||
acorn_cartridges.push_back(cartridge);
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ namespace Static {
|
||||
namespace MOS6502 {
|
||||
|
||||
/*!
|
||||
Describes a 6502 instruciton — its address, the operation it performs, its addressing mode
|
||||
Describes a 6502 instruciton: its address, the operation it performs, its addressing mode
|
||||
and its operand, if any.
|
||||
*/
|
||||
struct Instruction {
|
||||
|
@ -121,7 +121,7 @@ template <class T> class WrappedInt {
|
||||
inline int as_int() const { return length_; }
|
||||
|
||||
/*!
|
||||
Severs from @c this the effect of dividing by @c divisor — @c this will end up with
|
||||
Severs from @c this the effect of dividing by @c divisor; @c this will end up with
|
||||
the value of @c this modulo @c divisor and @c divided by @c divisor is returned.
|
||||
*/
|
||||
inline T divide(const T &divisor) {
|
||||
@ -147,7 +147,7 @@ template <class T> class WrappedInt {
|
||||
int length_;
|
||||
};
|
||||
|
||||
/// Describes an integer number of whole cycles — pairs of clock signal transitions.
|
||||
/// Describes an integer number of whole cycles: pairs of clock signal transitions.
|
||||
class Cycles: public WrappedInt<Cycles> {
|
||||
public:
|
||||
inline Cycles(int l) : WrappedInt<Cycles>(l) {}
|
||||
@ -155,7 +155,7 @@ class Cycles: public WrappedInt<Cycles> {
|
||||
inline Cycles(const Cycles &cycles) : WrappedInt<Cycles>(cycles.length_) {}
|
||||
};
|
||||
|
||||
/// Describes an integer number of half cycles — single clock signal transitions.
|
||||
/// Describes an integer number of half cycles: single clock signal transitions.
|
||||
class HalfCycles: public WrappedInt<HalfCycles> {
|
||||
public:
|
||||
inline HalfCycles(int l) : WrappedInt<HalfCycles>(l) {}
|
||||
@ -184,7 +184,7 @@ class HalfCycles: public WrappedInt<HalfCycles> {
|
||||
}
|
||||
|
||||
/*!
|
||||
Severs from @c this the effect of dividing by @c divisor — @c this will end up with
|
||||
Severs from @c this the effect of dividing by @c divisor; @c this will end up with
|
||||
the value of @c this modulo @c divisor and @c divided by @c divisor is returned.
|
||||
*/
|
||||
inline Cycles divide_cycles(const Cycles &divisor) {
|
||||
|
@ -10,7 +10,7 @@
|
||||
#define Sleeper_hpp
|
||||
|
||||
/*!
|
||||
A sleeper is any component that sometimes requires a clock but at other times is 'asleep' — i.e. is not doing
|
||||
A sleeper is any component that sometimes requires a clock but at other times is 'asleep', i.e. is not doing
|
||||
any clock-derived work, so needn't receive a clock. A disk controller is an archetypal example.
|
||||
|
||||
A sleeper will signal sleeps and wakes to an observer.
|
||||
|
@ -522,7 +522,7 @@ void WD1770::posit_event(int new_event_type) {
|
||||
type2_write_loop:
|
||||
/*
|
||||
This deviates from the data sheet slightly since that would prima facie request one more byte
|
||||
of data than is actually written — the last time around the loop it has transferred from the
|
||||
of data than is actually written; the last time around the loop it has transferred from the
|
||||
data register to the data shift register, set data request, written the byte, checked that data
|
||||
request has been satified, then finally considers whether all bytes are done. Based on both
|
||||
natural expectations and the way that emulated machines responded, I believe that to be a
|
||||
|
@ -35,7 +35,7 @@ class BusHandler {
|
||||
void perform_bus_cycle_phase1(const BusState &) {}
|
||||
|
||||
/*!
|
||||
Performs the second phase of a 6845 bus cycle. Some bus state — including sync — is updated
|
||||
Performs the second phase of a 6845 bus cycle. Some bus state, including sync, is updated
|
||||
directly after phase 1 and hence is visible to an observer during phase 2. Handlers may therefore
|
||||
implement @c perform_bus_cycle_phase2 to be notified of the availability of that state without
|
||||
having to wait until the next cycle has begun.
|
||||
|
@ -434,7 +434,7 @@ void i8272::posit_event(int event_type) {
|
||||
ClearControlMark();
|
||||
if(event_type == static_cast<int>(Event::Token)) {
|
||||
if(get_latest_token().type != Token::Data && get_latest_token().type != Token::DeletedData) {
|
||||
// Something other than a data mark came next — impliedly an ID or index mark.
|
||||
// Something other than a data mark came next, impliedly an ID or index mark.
|
||||
SetMissingAddressMark();
|
||||
SetMissingDataAddressMark();
|
||||
goto abort; // TODO: or read_next_data?
|
||||
@ -828,7 +828,7 @@ void i8272::posit_event(int event_type) {
|
||||
|
||||
goto post_result;
|
||||
|
||||
// Posts whatever is in result_stack_ as a result phase. Be aware that it is a stack — the
|
||||
// Posts whatever is in result_stack_ as a result phase. Be aware that it is a stack, so the
|
||||
// last thing in it will be returned first.
|
||||
post_result:
|
||||
printf("Result to %02x, main %02x: ", command_[0] & 0x1f, main_status_);
|
||||
|
@ -56,7 +56,7 @@ class TMS9918: public TMS9918Base {
|
||||
|
||||
/*!
|
||||
Runs the VCP for the number of cycles indicate; it is an implicit assumption of the code
|
||||
that the input clock rate is 3579545 Hz — the NTSC colour clock rate.
|
||||
that the input clock rate is 3579545 Hz, the NTSC colour clock rate.
|
||||
*/
|
||||
void run_for(const HalfCycles cycles);
|
||||
|
||||
|
@ -103,7 +103,7 @@ void AY38910::get_samples(std::size_t number_of_samples, int16_t *target) {
|
||||
noise_shift_register_ >>= 1;
|
||||
}
|
||||
|
||||
// ... and the envelope generator. Table based for pattern lookup, with a 'refill' step — a way of
|
||||
// ... and the envelope generator. Table based for pattern lookup, with a 'refill' step: a way of
|
||||
// implementing non-repeating patterns by locking them to table position 0x1f.
|
||||
if(envelope_divider_) envelope_divider_--;
|
||||
else {
|
||||
@ -130,7 +130,7 @@ void AY38910::evaluate_output_volume() {
|
||||
// The output level for a channel is:
|
||||
// 1 if neither tone nor noise is enabled;
|
||||
// 0 if either tone or noise is enabled and its value is low.
|
||||
// The tone/noise enable bits use inverse logic — 0 = on, 1 = off — permitting the OR logic below.
|
||||
// The tone/noise enable bits use inverse logic; 0 = on, 1 = off; permitting the OR logic below.
|
||||
#define tone_level(c, tone_bit) (tone_outputs_[c] | (output_registers_[7] >> tone_bit))
|
||||
#define noise_level(c, noise_bit) (noise_output_ | (output_registers_[7] >> noise_bit))
|
||||
|
||||
|
@ -34,7 +34,7 @@ void BestEffortUpdater::update() {
|
||||
|
||||
if(has_previous_time_point_) {
|
||||
// If the duration is valid, convert it to integer cycles, maintaining a rolling error and call the delegate
|
||||
// if there is one. Proceed only if the number of cycles is positive, and cap it to the per-second maximum —
|
||||
// if there is one. Proceed only if the number of cycles is positive, and cap it to the per-second maximum as
|
||||
// it's possible this is an adjustable clock so be ready to swallow unexpected adjustments.
|
||||
const int64_t integer_duration = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count();
|
||||
if(integer_duration > 0) {
|
||||
|
@ -277,7 +277,7 @@ class CRTCBusHandler {
|
||||
}
|
||||
|
||||
/*!
|
||||
The CRTC entry function for phase 2 of each bus cycle — in which the next sync line state becomes
|
||||
The CRTC entry function for phase 2 of each bus cycle, in which the next sync line state becomes
|
||||
visible early. The CPC uses changes in sync to clock the interrupt timer.
|
||||
*/
|
||||
void perform_bus_cycle_phase2(const Motorola::CRTC::BusState &state) {
|
||||
@ -818,7 +818,7 @@ class ConcreteMachine:
|
||||
*cycle.value &= fdc_.get_register(address & 1);
|
||||
}
|
||||
|
||||
// Check for a CRTC access; the below is not a typo — the CRTC can be selected
|
||||
// Check for a CRTC access; the below is not a typo, the CRTC can be selected
|
||||
// for writing via an input, and will sample whatever happens to be available
|
||||
if(!(address & 0x4000)) {
|
||||
switch((address >> 8) & 3) {
|
||||
|
@ -172,11 +172,11 @@ class ConcreteMachine:
|
||||
/*
|
||||
There are five distinct zones of memory on an Apple II:
|
||||
|
||||
0000 — 0200 : the zero and stack pages, which can be paged independently on a IIe
|
||||
0200 — c000 : the main block of RAM, which can be paged on a IIe
|
||||
c000 — d000 : the IO area, including card ROMs
|
||||
d000 — e000 : the low ROM area, which can contain indepdently-paged RAM with a language card
|
||||
e000 — : the rest of ROM, also potentially replaced with RAM by a language card
|
||||
0000 to 0200 : the zero and stack pages, which can be paged independently on a IIe
|
||||
0200 to c000 : the main block of RAM, which can be paged on a IIe
|
||||
c000 to d000 : the IO area, including card ROMs
|
||||
d000 to e000 : the low ROM area, which can contain indepdently-paged RAM with a language card
|
||||
e000 onward : the rest of ROM, also potentially replaced with RAM by a language card
|
||||
*/
|
||||
MemoryBlock *block = nullptr;
|
||||
if(address < 0x200) block = &memory_blocks_[0];
|
||||
@ -267,7 +267,7 @@ class ConcreteMachine:
|
||||
if(address >= 0xc100 && address < 0xc800) {
|
||||
/*
|
||||
Decode the area conventionally used by cards for ROMs:
|
||||
0xCn00 — 0xCnff: card n.
|
||||
0xCn00 to 0xCnff: card n.
|
||||
*/
|
||||
const size_t card_number = (address - 0xc100) >> 8;
|
||||
if(cards_[card_number]) {
|
||||
@ -277,7 +277,7 @@ class ConcreteMachine:
|
||||
} else if(address >= 0xc090 && address < 0xc100) {
|
||||
/*
|
||||
Decode the area conventionally used by cards for registers:
|
||||
C0n0--C0nF: card n - 8.
|
||||
C0n0 to C0nF: card n - 8.
|
||||
*/
|
||||
const size_t card_number = (address - 0xc090) >> 4;
|
||||
if(cards_[card_number]) {
|
||||
|
@ -63,8 +63,8 @@ template<class T> class Cartridge:
|
||||
uint8_t returnValue = 0xff;
|
||||
int cycles_run_for = 3;
|
||||
|
||||
// this occurs as a feedback loop — the 2600 requests ready, then performs the cycles_run_for
|
||||
// leap to the end of ready only once ready is signalled — because on a 6502 ready doesn't take
|
||||
// this occurs as a feedback loop: the 2600 requests ready, then performs the cycles_run_for
|
||||
// leap to the end of ready only once ready is signalled because on a 6502 ready doesn't take
|
||||
// effect until the next read; therefore it isn't safe to assume that signalling ready immediately
|
||||
// skips to the end of the line.
|
||||
if(operation == CPU::MOS6502::BusOperation::Ready)
|
||||
@ -129,7 +129,7 @@ template<class T> class Cartridge:
|
||||
tia_->reset_horizontal_counter();
|
||||
horizontal_counter_resets_++;
|
||||
break;
|
||||
// TODO: audio will now be out of synchronisation — fix
|
||||
// TODO: audio will now be out of synchronisation. Fix.
|
||||
|
||||
case 0x04:
|
||||
case 0x05: update_video(); tia_->set_player_number_and_size(decodedAddress - 0x04, *value); break;
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
namespace Atari2600 {
|
||||
|
||||
// This should be a divisor of 38; audio counters are updated every 38 cycles — though lesser dividers
|
||||
// This should be a divisor of 38; audio counters are updated every 38 cycles, though lesser dividers
|
||||
// will give greater resolution to changes in audio state. 1, 2 and 19 are the only divisors of 38.
|
||||
const int CPUTicksPerAudioTick = 2;
|
||||
|
||||
|
@ -23,7 +23,7 @@ namespace Commodore {
|
||||
namespace C1540 {
|
||||
|
||||
/*!
|
||||
An implementation of the serial-port VIA in a Commodore 1540 — the VIA that facilitates all
|
||||
An implementation of the serial-port VIA in a Commodore 1540: the VIA that facilitates all
|
||||
IEC bus communications.
|
||||
|
||||
It is wired up such that Port B contains:
|
||||
@ -35,7 +35,7 @@ namespace C1540 {
|
||||
Bits 5/6: device select input; the 1540 will act as device 8 + [value of bits]
|
||||
Bit 7: attention input; 1 if the line is low, 0 if it is high
|
||||
|
||||
The attention input is also connected to CA1, similarly inverted — 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 {
|
||||
public:
|
||||
@ -60,7 +60,7 @@ class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||
};
|
||||
|
||||
/*!
|
||||
An implementation of the drive VIA in a Commodore 1540 — the VIA that is used to interface with the disk.
|
||||
An implementation of the drive VIA in a Commodore 1540: the VIA that is used to interface with the disk.
|
||||
|
||||
It is wired up such that Port B contains:
|
||||
Bits 0/1: head step direction
|
||||
|
@ -75,8 +75,8 @@ enum ROM {
|
||||
};
|
||||
|
||||
/*!
|
||||
Models the user-port VIA, which is the Vic's connection point for controlling its tape recorder —
|
||||
sensing the presence or absence of a tape and controlling the tape motor — and reading the current
|
||||
Models the user-port VIA, which is the Vic's connection point for controlling its tape recorder;
|
||||
sensing the presence or absence of a tape and controlling the tape motor; and reading the current
|
||||
state from its serial port. Most of the joystick input is also exposed here.
|
||||
*/
|
||||
class UserPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||
|
@ -48,7 +48,7 @@ class Machine {
|
||||
|
||||
/*!
|
||||
Sets the contents of @c slot to @c data. If @c is_writeable is @c true then writing to the slot
|
||||
is enabled — it acts as if it were sideways RAM. Otherwise the slot is modelled as containing ROM.
|
||||
is enabled: it acts as if it were sideways RAM. Otherwise the slot is modelled as containing ROM.
|
||||
*/
|
||||
virtual void set_rom(ROMSlot slot, const std::vector<uint8_t> &data, bool is_writeable) = 0;
|
||||
};
|
||||
|
@ -58,8 +58,8 @@ class AYPortHandler: public GI::AY38910::PortHandler {
|
||||
|
||||
void set_port_output(bool port_b, uint8_t value) {
|
||||
if(port_b) {
|
||||
// Bits 0–3: touchpad handshaking (?)
|
||||
// Bit 4—5: monostable timer pulses
|
||||
// Bits 0-3: touchpad handshaking (?)
|
||||
// Bit 4-5: monostable timer pulses
|
||||
// Bit 6: joystick select
|
||||
// Bit 7: code LED, if any
|
||||
}
|
||||
|
@ -422,7 +422,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
|
||||
}
|
||||
}
|
||||
|
||||
// $02df is where the Oric ROMs — all of them, including BASIC 1.0, 1.1 and the Pravetz — have the
|
||||
// $02df is where the Oric ROMs; all of them, including BASIC 1.0, 1.1 and the Pravetz; have the
|
||||
// IRQ routine store an incoming keystroke in order for reading to occur later. By capturing the
|
||||
// read rather than the decode and write: (i) nothing is lost while BASIC is parsing; and
|
||||
// (ii) keyboard input is much more rapid.
|
||||
|
@ -141,7 +141,7 @@ static void audioOutputCallback(
|
||||
// Since the audio callback receives a void * pointer that identifies the class it should branch into,
|
||||
// it's therefore unsafe to pass 'self'. Instead I pass a CSWeakAudioQueuePointer which points to the actual
|
||||
// queue. The lifetime of that class is the lifetime of this instance plus 1 second, as effected by the
|
||||
// artificial dispatch_after below — it serves only to keep pointerSaviour alive for an extra second.
|
||||
// artificial dispatch_after below; it serves only to keep pointerSaviour alive for an extra second.
|
||||
//
|
||||
// Why a second? That's definitely quite a lot longer than any amount of audio that may be queued. So
|
||||
// probably safe. As and where Apple's audio queue works properly, CSAudioQueueDeallocLock should provide
|
||||
|
@ -31,7 +31,7 @@
|
||||
@end
|
||||
|
||||
struct LockProtectedDelegate {
|
||||
// Contractual promise is: machine — the pointer **and** the object ** — may be accessed only
|
||||
// Contractual promise is: machine, the pointer **and** the object **, may be accessed only
|
||||
// in sections protected by the machineAccessLock;
|
||||
NSLock *machineAccessLock;
|
||||
__unsafe_unretained CSMachine *machine;
|
||||
|
@ -216,7 +216,7 @@ class CRT {
|
||||
|
||||
/*! Sets the current phase of the colour subcarrier used by output_default_colour_burst.
|
||||
|
||||
@param phase The normalised instantaneous phase — 0.0f is the start of a colour cycle, 1.0f is the
|
||||
@param phase The normalised instantaneous phase. 0.0f is the start of a colour cycle, 1.0f is the
|
||||
end of a colour cycle, 0.25f is a quarter of the way through a colour cycle, etc.
|
||||
*/
|
||||
void set_immediate_default_phase(float phase);
|
||||
@ -267,7 +267,7 @@ class CRT {
|
||||
/*! Tells the CRT that the next call to draw_frame will occur on a different OpenGL context than
|
||||
the previous.
|
||||
|
||||
@param should_delete_resources If @c true then all resources — textures, vertex arrays, etc —
|
||||
@param should_delete_resources If @c true then all resources, textures, vertex arrays, etc,
|
||||
currently held by the CRT will be deleted now via calls to glDeleteTexture and equivalent. If
|
||||
@c false then the references are simply marked as invalid.
|
||||
*/
|
||||
@ -313,7 +313,7 @@ class CRT {
|
||||
DiscreteFourSamplesPerCycle
|
||||
};
|
||||
|
||||
/*! Provides information about the type of output the composite sampling function provides — discrete or continuous.
|
||||
/*! Provides information about the type of output the composite sampling function provides, discrete or continuous.
|
||||
|
||||
This is necessary because the CRT implementation samples discretely and therefore can use fewer intermediate
|
||||
samples if it can exactly duplicate the sampling rate and placement of the composite sampling function.
|
||||
|
@ -15,7 +15,7 @@
|
||||
namespace Outputs {
|
||||
namespace CRT {
|
||||
|
||||
// Output vertices are those used to copy from an input buffer — whether it describes data that maps directly to RGB
|
||||
// Output vertices are those used to copy from an input buffer, whether it describes data that maps directly to RGB
|
||||
// or is one of the intermediate buffers that we've used to convert from composite towards RGB.
|
||||
const GLsizei OutputVertexOffsetOfHorizontal = 0;
|
||||
const GLsizei OutputVertexOffsetOfVertical = 4;
|
||||
|
@ -157,7 +157,7 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
// for s-video, there are two steps — it's like composite but skips separation
|
||||
// for s-video, there are two steps: it's like composite but skips separation
|
||||
const RenderStage svideo_render_stages[] = {
|
||||
{svideo_input_shader_program_.get(), separated_texture_.get(), {0.0, 0.5, 0.5}},
|
||||
{composite_chrominance_filter_shader_program_.get(), filtered_texture_.get(), {0.0, 0.0, 0.0}},
|
||||
|
@ -125,7 +125,7 @@ public:
|
||||
void set_colour_conversion_matrices(float *fromRGB, float *toRGB);
|
||||
|
||||
/*!
|
||||
Sets the proportions of the input and output areas that should be considered the whole width — 1.0 means use all available
|
||||
Sets the proportions of the input and output areas that should be considered the whole width: 1.0 means use all available
|
||||
space, 0.5 means use half, etc.
|
||||
*/
|
||||
void set_width_scalers(float input_scaler, float output_scaler);
|
||||
|
@ -83,7 +83,7 @@ public:
|
||||
void set_gamma_ratio(float ratio);
|
||||
|
||||
/*!
|
||||
Sets the proportion of the input area that should be considered the whole width — 1.0 means use all available
|
||||
Sets the proportion of the input area that should be considered the whole width: 1.0 means use all available
|
||||
space, 0.5 means use half, etc.
|
||||
*/
|
||||
void set_input_width_scaler(float input_scaler);
|
||||
|
@ -40,7 +40,7 @@ namespace CRT {
|
||||
(iii) call retain_latest to add the most recently written write area to the flush queue.
|
||||
|
||||
The flush queue contains provisional data, that can sit in the CPU's memory space indefinitely. This facility
|
||||
is provided because it is expected that a texture will be built alontside some other collection of data —
|
||||
is provided because it is expected that a texture will be built alontside some other collection of data;
|
||||
that data in the flush queue is expected to become useful in coordination with something else but should
|
||||
be retained at least until then.
|
||||
|
||||
@ -55,7 +55,7 @@ namespace CRT {
|
||||
|
||||
(i) call submit to move data to the GPU and free up its CPU-side resources.
|
||||
|
||||
The latest data is now on the GPU, regardless of where the data provider may be in its process — only data
|
||||
The latest data is now on the GPU, regardless of where the data provider may be in its process; only data
|
||||
that has entered the submission queue is uploaded.
|
||||
|
||||
*/
|
||||
|
@ -80,7 +80,7 @@ class BusHandler {
|
||||
Announces that the 6502 has performed the cycle defined by operation, address and value. On the 6502,
|
||||
all bus cycles take one clock cycle so the amoutn of time advanced is implicit.
|
||||
|
||||
@param operation The type of bus cycle — read, read opcode (i.e. read, with sync active),
|
||||
@param operation The type of bus cycle: read, read opcode (i.e. read, with sync active),
|
||||
write or ready.
|
||||
@param address The value of the address bus during this bus cycle.
|
||||
@param value If this is a cycle that puts a value onto the data bus, *value is that value. If this is
|
||||
|
@ -17,7 +17,7 @@ namespace Data {
|
||||
namespace BitReverse {
|
||||
|
||||
/*!
|
||||
Reverses the order of the bits in every byte of the vector —
|
||||
Reverses the order of the bits in every byte of the vector:
|
||||
bit 7 exchanges with bit 0, bit 6 exchanges with bit 1, 5 with 2,
|
||||
and 4 with 3.
|
||||
*/
|
||||
|
@ -21,7 +21,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides the shell for emulating a disk controller — something that is connected to a disk drive and uses a
|
||||
Provides the shell for emulating a disk controller: something that is connected to a disk drive and uses a
|
||||
phase locked loop ('PLL') to decode a bit stream from the surface of the disk.
|
||||
|
||||
Partly abstract; it is expected that subclasses will provide methods to deal with receiving a newly-recognised
|
||||
|
@ -120,8 +120,8 @@ class MFMController: public Controller {
|
||||
void write_n_bytes(int quantity, uint8_t value);
|
||||
|
||||
/*!
|
||||
Writes everything that should, per the spec, appear prior to the address contained
|
||||
in an ID mark — proper gaps and the ID mark — and appropriate seeds the CRC generator.
|
||||
Writes everything that should per the spec appear prior to the address contained
|
||||
in an ID mark (i.e. proper gaps and the ID mark) and appropriate seeds the CRC generator.
|
||||
*/
|
||||
void write_id_joiner();
|
||||
|
||||
|
@ -29,7 +29,7 @@ class Disk {
|
||||
@returns the number of discrete positions that this disk uses to model its complete surface area.
|
||||
|
||||
This is not necessarily a track count. There is no implicit guarantee that every position will
|
||||
return a distinct track, or — e.g. if the media is holeless — will return any track at all.
|
||||
return a distinct track, or, e.g. if the media is holeless, will return any track at all.
|
||||
*/
|
||||
virtual HeadPosition get_maximum_head_position() = 0;
|
||||
|
||||
|
@ -38,7 +38,7 @@ class DiskImage {
|
||||
@returns the distance at which there stops being any further content.
|
||||
|
||||
This is not necessarily a track count. There is no implicit guarantee that every position will
|
||||
return a distinct track, or — e.g. if the media is holeless — will return any track at all.
|
||||
return a distinct track, or, e.g. if the media is holeless, will return any track at all.
|
||||
*/
|
||||
virtual HeadPosition get_maximum_head_position() = 0;
|
||||
|
||||
|
@ -17,7 +17,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c Disk containing an ADF disk image — a decoded sector dump of an Acorn ADFS disk.
|
||||
Provides a @c Disk containing an ADF disk image: a decoded sector dump of an Acorn ADFS disk.
|
||||
*/
|
||||
class AcornADF: public MFMSectorDump {
|
||||
public:
|
||||
|
@ -18,7 +18,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c DiskImage containing an Apple DSK disk image — a representation of sector contents,
|
||||
Provides a @c DiskImage containing an Apple DSK disk image: a representation of sector contents,
|
||||
implicitly numbered and located.
|
||||
*/
|
||||
class AppleDSK: public DiskImage {
|
||||
|
@ -20,7 +20,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c Disk containing an Amstrad CPC-type disk image — some arrangement of sectors with status bits.
|
||||
Provides a @c Disk containing an Amstrad CPC-type disk image: some arrangement of sectors with status bits.
|
||||
*/
|
||||
class CPCDSK: public DiskImage {
|
||||
public:
|
||||
|
@ -19,7 +19,7 @@ using namespace Storage::Disk;
|
||||
|
||||
D64::D64(const std::string &file_name) :
|
||||
file_(file_name) {
|
||||
// in D64, this is it for validation without imposing potential false-negative tests — check that
|
||||
// in D64, this is it for validation without imposing potential false-negative tests: check that
|
||||
// the file size appears to be correct. Stone-age stuff.
|
||||
if(file_.stats().st_size != 174848 && file_.stats().st_size != 196608)
|
||||
throw Error::InvalidFormat;
|
||||
|
@ -16,7 +16,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c Disk containing a D64 disk image — a decoded sector dump of a C1540-format disk.
|
||||
Provides a @c Disk containing a D64 disk image: a decoded sector dump of a C1540-format disk.
|
||||
*/
|
||||
class D64: public DiskImage {
|
||||
public:
|
||||
|
@ -139,7 +139,7 @@ std::shared_ptr<::Storage::Disk::Track> DMK::get_track_at_position(::Storage::Di
|
||||
|
||||
// Now at the IDAM, which will always be an FE regardless of FM/MFM encoding,
|
||||
// presumably through misunderstanding of the designer? Write out a real IDAM
|
||||
// for the current density, then the rest of the ID — four bytes for the address
|
||||
// for the current density, then the rest of the ID: four bytes for the address
|
||||
// plus two for the CRC. Keep a copy of the header while we're here, so that the
|
||||
// size of the sector is known momentarily.
|
||||
std::size_t step_rate = (!is_double_density && !is_purely_single_density_) ? 2 : 1;
|
||||
|
@ -18,7 +18,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c DiskImage containing a DMK disk image — mostly a decoded byte stream, but with
|
||||
Provides a @c DiskImage containing a DMK disk image: mostly a decoded byte stream, but with
|
||||
a record of IDAM locations.
|
||||
*/
|
||||
class DMK: public DiskImage {
|
||||
|
@ -18,7 +18,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c Disk containing a G64 disk image — a raw but perfectly-clocked GCR stream.
|
||||
Provides a @c Disk containing a G64 disk image: a raw but perfectly-clocked GCR stream.
|
||||
*/
|
||||
class G64: public DiskImage {
|
||||
public:
|
||||
|
@ -18,7 +18,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c DiskImage containing an HFE — a bit stream representation of a floppy.
|
||||
Provides a @c DiskImage containing an HFE: a bit stream representation of a floppy.
|
||||
*/
|
||||
class HFE: public DiskImage {
|
||||
public:
|
||||
|
@ -18,7 +18,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c Disk containing an Oric MFM-stype disk image — a stream of the MFM data bits with clocks omitted.
|
||||
Provides a @c Disk containing an Oric MFM-stype disk image: a stream of the MFM data bits with clocks omitted.
|
||||
*/
|
||||
class OricMFMDSK: public DiskImage {
|
||||
public:
|
||||
|
@ -15,7 +15,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c Disk containing a DSD or SSD disk image — a decoded sector dump of an Acorn DFS disk.
|
||||
Provides a @c Disk containing a DSD or SSD disk image: a decoded sector dump of an Acorn DFS disk.
|
||||
*/
|
||||
class SSD: public MFMSectorDump {
|
||||
public:
|
||||
|
@ -18,7 +18,7 @@ namespace Storage {
|
||||
namespace Disk {
|
||||
|
||||
/*!
|
||||
Provides a @c DiskImage containing a WOZ — a bit stream representation of a floppy.
|
||||
Provides a @c DiskImage containing a WOZ: a bit stream representation of a floppy.
|
||||
*/
|
||||
class WOZ: public DiskImage {
|
||||
public:
|
||||
|
@ -135,7 +135,7 @@ class Drive: public Sleeper, public TimedEventLoop {
|
||||
bool has_disk_ = false;
|
||||
|
||||
// Contains the multiplier that converts between track-relative lengths
|
||||
// to real-time lengths — so it's the reciprocal of rotation speed.
|
||||
// to real-time lengths. So it's the reciprocal of rotation speed.
|
||||
Time rotational_multiplier_;
|
||||
|
||||
// A count of time since the index hole was last seen. Which is used to
|
||||
|
@ -33,7 +33,7 @@ struct Sector {
|
||||
};
|
||||
|
||||
Address address;
|
||||
uint8_t size = 0; // Size is stored in ordinary MFM form — the number of bytes included in this sector
|
||||
uint8_t size = 0; // Size is stored in ordinary MFM form: the number of bytes included in this sector
|
||||
// is 2^(7 + size), or 128 << size.
|
||||
|
||||
// Multiple samplings of the underlying data are accepted, to allow weak and fuzzy data to be communicated.
|
||||
|
@ -86,10 +86,10 @@ class Track {
|
||||
};
|
||||
|
||||
/*!
|
||||
Describes a detectable track event — either a flux transition or the passing of the index hole,
|
||||
Describes a detectable track event: either a flux transition or the passing of the index hole,
|
||||
along with the length of time between the previous event and its occurance.
|
||||
|
||||
The sum of all lengths of time across an entire track should be 1 — if an event is said to be
|
||||
The sum of all lengths of time across an entire track should be 1; if an event is said to be
|
||||
1/3 away then that means 1/3 of a rotation.
|
||||
*/
|
||||
struct Event {
|
||||
|
@ -23,7 +23,7 @@ namespace Disk {
|
||||
This feature is offered for the benefit of various parts of the code that need to make
|
||||
sense of a track **other than emulation**, as it renders a one-off image of the track,
|
||||
which can be inaccurate. However there are many occasions where a single rendering is
|
||||
desireable — e.g. file formats that apply that constraint, or static analysis prior to
|
||||
desireable, e.g. file formats that apply that constraint, or static analysis prior to
|
||||
emulation launch, which works with broad strokes.
|
||||
|
||||
@param track The track to serialise.
|
||||
|
@ -39,7 +39,7 @@ class FileHolder final {
|
||||
ReadWrite attempt to open this file for random access reading and writing. If that fails,
|
||||
will attept to open in Read mode.
|
||||
Read attempts to open this file for reading only.
|
||||
Rewrite opens the file for rewriting — none of the original content is preserved; whatever
|
||||
Rewrite opens the file for rewriting; none of the original content is preserved; whatever
|
||||
the caller outputs will replace the existing file.
|
||||
|
||||
@raises ErrorCantOpen if the file cannot be opened.
|
||||
@ -113,7 +113,7 @@ class FileHolder final {
|
||||
/*! Writes @c buffer one byte at a time in order, writing @c size bytes in total. */
|
||||
std::size_t write(const uint8_t *buffer, std::size_t size);
|
||||
|
||||
/*! Moves @c bytes from the anchor indicated by @c whence — SEEK_SET, SEEK_CUR or SEEK_END. */
|
||||
/*! Moves @c bytes from the anchor indicated by @c whence: SEEK_SET, SEEK_CUR or SEEK_END. */
|
||||
void seek(long offset, int whence);
|
||||
|
||||
/*! @returns The current cursor position within this file. */
|
||||
@ -184,7 +184,7 @@ class FileHolder final {
|
||||
bool check_signature(const char *signature, std::size_t length = 0);
|
||||
|
||||
/*!
|
||||
Determines and returns the file extension — everything from the final character
|
||||
Determines and returns the file extension: everything from the final character
|
||||
back to the first dot. The string is converted to lowercase before being returned.
|
||||
*/
|
||||
std::string extension();
|
||||
|
@ -35,7 +35,7 @@ struct Time {
|
||||
}
|
||||
|
||||
/*!
|
||||
Reduces this @c Time to its simplest form — eliminates all common factors from @c length
|
||||
Reduces this @c Time to its simplest form; eliminates all common factors from @c length
|
||||
and @c clock_rate.
|
||||
*/
|
||||
void simplify() {
|
||||
|
@ -25,9 +25,9 @@ namespace Storage {
|
||||
until a next event; @c process_next_event will be called when that event occurs, with progression
|
||||
determined via @c run_for.
|
||||
|
||||
Due to the aggregation of total timing information between events — e.g. if an event loop has
|
||||
Due to the aggregation of total timing information between events, e.g. if an event loop has
|
||||
a clock rate of 1000 ticks per second and a steady stream of events that occur 10,000 times a second,
|
||||
bookkeeping is necessary to ensure that 10 events are triggered per tick — subclasses should call
|
||||
bookkeeping is necessary to ensure that 10 events are triggered per tick. Subclasses should call
|
||||
@c reset_timer if there is a discontinuity in events.
|
||||
|
||||
Subclasses may also call @c jump_to_next_event to cause the next event to be communicated instantly.
|
||||
|
Loading…
x
Reference in New Issue
Block a user