1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-27 15:29:34 +00:00

Improve const correctness, simplify inheritance.

This commit is contained in:
Thomas Harte 2023-01-01 13:49:11 -05:00
parent 71598250ea
commit 11542e7a7f
3 changed files with 414 additions and 415 deletions

View File

@ -671,7 +671,7 @@ void TMS9918<personality>::write(int address, uint8_t value) {
} }
template <Personality personality> template <Personality personality>
uint8_t TMS9918<personality>::get_current_line() { uint8_t TMS9918<personality>::get_current_line() const {
// Determine the row to return. // Determine the row to return.
constexpr int row_change_position = 63; // This is the proper Master System value; substitute if any other VDPs turn out to have this functionality. constexpr int row_change_position = 63; // This is the proper Master System value; substitute if any other VDPs turn out to have this functionality.
int source_row = int source_row =
@ -706,7 +706,7 @@ uint8_t TMS9918<personality>::get_current_line() {
} }
template <Personality personality> template <Personality personality>
uint8_t TMS9918<personality>::get_latched_horizontal_counter() { uint8_t TMS9918<personality>::get_latched_horizontal_counter() const {
// Translate from internal numbering, which puts pixel output // Translate from internal numbering, which puts pixel output
// in the final 256 pixels of 342, to the public numbering, // in the final 256 pixels of 342, to the public numbering,
// which makes the 256 pixels the first 256 spots, but starts // which makes the 256 pixels the first 256 spots, but starts
@ -741,12 +741,12 @@ uint8_t TMS9918<personality>::read(int address) {
} }
template <Personality personality> template <Personality personality>
HalfCycles Base<personality>::half_cycles_before_internal_cycles(int internal_cycles) { HalfCycles Base<personality>::half_cycles_before_internal_cycles(int internal_cycles) const {
return HalfCycles(((internal_cycles << 2) + (2 - cycles_error_)) / 3); return HalfCycles(((internal_cycles << 2) + (2 - cycles_error_)) / 3);
} }
template <Personality personality> template <Personality personality>
HalfCycles TMS9918<personality>::get_next_sequence_point() { HalfCycles TMS9918<personality>::get_next_sequence_point() const {
if(!this->generate_interrupts_ && !this->enable_line_interrupts_) return HalfCycles::max(); if(!this->generate_interrupts_ && !this->enable_line_interrupts_) return HalfCycles::max();
if(get_interrupt_line()) return HalfCycles::max(); if(get_interrupt_line()) return HalfCycles::max();
@ -819,7 +819,7 @@ HalfCycles TMS9918<personality>::get_time_until_line(int line) {
} }
template <Personality personality> template <Personality personality>
bool TMS9918<personality>::get_interrupt_line() { bool TMS9918<personality>::get_interrupt_line() const {
return return
((this->status_ & StatusInterrupt) && this->generate_interrupts_) || ((this->status_ & StatusInterrupt) && this->generate_interrupts_) ||
(this->enable_line_interrupts_ && this->line_interrupt_pending_); (this->enable_line_interrupts_ && this->line_interrupt_pending_);

View File

@ -55,7 +55,7 @@ namespace TMS {
These chips have only one non-on-demand interaction with the outside world: an interrupt line. These chips have only one non-on-demand interaction with the outside world: an interrupt line.
See get_time_until_interrupt and get_interrupt_line for asynchronous operation options. See get_time_until_interrupt and get_interrupt_line for asynchronous operation options.
*/ */
template <Personality personality> class TMS9918: public Base<personality> { template <Personality personality> class TMS9918: private Base<personality> {
public: public:
/*! Constructs an instance of the VDP that behaves according to the templated personality. */ /*! Constructs an instance of the VDP that behaves according to the templated personality. */
TMS9918(); TMS9918();
@ -93,10 +93,10 @@ template <Personality personality> class TMS9918: public Base<personality> {
uint8_t read(int address); uint8_t read(int address);
/*! Gets the current scan line; provided by the Sega VDPs only. */ /*! Gets the current scan line; provided by the Sega VDPs only. */
uint8_t get_current_line(); uint8_t get_current_line() const;
/*! Gets the current latched horizontal counter; provided by the Sega VDPs only. */ /*! Gets the current latched horizontal counter; provided by the Sega VDPs only. */
uint8_t get_latched_horizontal_counter(); uint8_t get_latched_horizontal_counter() const;
/*! Latches the current horizontal counter. */ /*! Latches the current horizontal counter. */
void latch_horizontal_counter(); void latch_horizontal_counter();
@ -108,7 +108,7 @@ template <Personality personality> class TMS9918: public Base<personality> {
If get_interrupt_line is true now of if get_interrupt_line would If get_interrupt_line is true now of if get_interrupt_line would
never return true, returns HalfCycles::max(). never return true, returns HalfCycles::max().
*/ */
HalfCycles get_next_sequence_point(); HalfCycles get_next_sequence_point() const;
/*! /*!
Returns the amount of time until the nominated line interrupt position is Returns the amount of time until the nominated line interrupt position is
@ -123,7 +123,7 @@ template <Personality personality> class TMS9918: public Base<personality> {
/*! /*!
@returns @c true if the interrupt line is currently active; @c false otherwise. @returns @c true if the interrupt line is currently active; @c false otherwise.
*/ */
bool get_interrupt_line(); bool get_interrupt_line() const;
}; };
} }

View File

@ -121,9 +121,11 @@ struct LineBufferPointer {
int row, column; int row, column;
}; };
template <Personality personality> class Base { template <Personality personality> struct Base {
public: static constexpr int output_lag = 11; // i.e. pixel output will occur 11 cycles
static uint32_t palette_pack(uint8_t r, uint8_t g, uint8_t b) { // after corresponding data read.
static constexpr uint32_t palette_pack(uint8_t r, uint8_t g, uint8_t b) {
uint32_t result = 0; uint32_t result = 0;
uint8_t *const result_ptr = reinterpret_cast<uint8_t *>(&result); uint8_t *const result_ptr = reinterpret_cast<uint8_t *>(&result);
result_ptr[0] = r; result_ptr[0] = r;
@ -133,9 +135,6 @@ template <Personality personality> class Base {
return result; return result;
} }
protected:
static constexpr int output_lag = 11; // i.e. pixel output will occur 11 cycles after corresponding data read.
// The default TMS palette. // The default TMS palette.
const uint32_t palette[16] = { const uint32_t palette[16] = {
palette_pack(0, 0, 0), palette_pack(0, 0, 0),
@ -213,7 +212,7 @@ template <Personality personality> class Base {
// internally at 5.37Mhz. The following two help to maintain a lossless conversion // internally at 5.37Mhz. The following two help to maintain a lossless conversion
// from the one to the other. // from the one to the other.
int cycles_error_ = 0; int cycles_error_ = 0;
HalfCycles half_cycles_before_internal_cycles(int internal_cycles); HalfCycles half_cycles_before_internal_cycles(int internal_cycles) const;
// Internal mechanisms for position tracking. // Internal mechanisms for position tracking.
int latched_column_ = 0; int latched_column_ = 0;