1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 08:49:37 +00:00

Avoid expressing the same thing at different clock rates.

This commit is contained in:
Thomas Harte 2023-01-08 13:58:12 -05:00
parent 72e0bfecc1
commit 5f6ddf8557
2 changed files with 21 additions and 52 deletions

View File

@ -275,13 +275,9 @@ void TMS9918<personality>::run_for(const HalfCycles cycles) {
this->mode_timing_.maximum_visible_sprites = 4; this->mode_timing_.maximum_visible_sprites = 4;
switch(this->screen_mode_) { switch(this->screen_mode_) {
case ScreenMode::Text: case ScreenMode::Text:
if constexpr (Timing<personality>::SupportsTextMode) { next_line_buffer.line_mode = LineMode::Text;
next_line_buffer.line_mode = LineMode::Text; next_line_buffer.first_pixel_output_column = Timing<personality>::FirstTextCycle;
next_line_buffer.first_pixel_output_column = Timing<personality>::FirstTextCycle; next_line_buffer.next_border_column = Timing<personality>::LastTextCycle;
next_line_buffer.next_border_column = Timing<personality>::LastTextCycle;
} else {
next_line_buffer.line_mode = LineMode::Refresh;
}
break; break;
case ScreenMode::SMSMode4: case ScreenMode::SMSMode4:
next_line_buffer.line_mode = LineMode::SMS; next_line_buffer.line_mode = LineMode::SMS;

View File

@ -18,10 +18,11 @@ namespace TMS {
// Timing constants. // Timing constants.
template <Personality, typename Enable = void> struct Timing {}; template <Personality, typename Enable = void> struct Timing {};
template <Personality personality> /// Provides default timing measurements that duplicate the layout of a TMS9928's line,
struct Timing<personality, std::enable_if_t<is_classic_vdp(personality)>> { /// scaled to the clock rate specified.
template <int _CyclesPerLine> struct StandardTiming {
/// The total number of internal cycles per line of output. /// The total number of internal cycles per line of output.
constexpr static int CyclesPerLine = 342; constexpr static int CyclesPerLine = _CyclesPerLine;
/// The number of internal cycles that must elapse between a request to read or write and /// The number of internal cycles that must elapse between a request to read or write and
/// it becoming a candidate for action. /// it becoming a candidate for action.
@ -29,17 +30,13 @@ struct Timing<personality, std::enable_if_t<is_classic_vdp(personality)>> {
/// The first internal cycle at which pixels will be output in any mode other than text. /// The first internal cycle at which pixels will be output in any mode other than text.
/// Pixels implicitly run from here to the end of the line. /// Pixels implicitly run from here to the end of the line.
constexpr static int FirstPixelCycle = 86; constexpr static int FirstPixelCycle = 86 * CyclesPerLine / 342;
/// Indicates whether text modes are supported by this VDP. If so then
/// values for First & Last TextCycle are required. If not then they can be omitted.
constexpr static bool SupportsTextMode = true;
/// The first internal cycle at which pixels will be output text mode. /// The first internal cycle at which pixels will be output text mode.
constexpr static int FirstTextCycle = 94; constexpr static int FirstTextCycle = 94 * CyclesPerLine / 342;
/// The final internal cycle at which pixels will be output text mode. /// The final internal cycle at which pixels will be output text mode.
constexpr static int LastTextCycle = 334; constexpr static int LastTextCycle = 334 * CyclesPerLine / 342;
// For the below, the fixed portion of line layout is: // For the below, the fixed portion of line layout is:
// //
@ -53,48 +50,24 @@ struct Timing<personality, std::enable_if_t<is_classic_vdp(personality)>> {
// The region from StartOfLeftBorder until the end is then filled with // The region from StartOfLeftBorder until the end is then filled with
// some combination of pixels and more border, depending on the vertical // some combination of pixels and more border, depending on the vertical
// position of this line and the current screen mode. // position of this line and the current screen mode.
constexpr static int EndOfRightBorder = 15; constexpr static int EndOfRightBorder = 15 * CyclesPerLine / 342;
constexpr static int StartOfSync = 23; constexpr static int StartOfSync = 23 * CyclesPerLine / 342;
constexpr static int EndOfSync = 49; constexpr static int EndOfSync = 49 * CyclesPerLine / 342;
constexpr static int StartOfColourBurst = 51; constexpr static int StartOfColourBurst = 51 * CyclesPerLine / 342;
constexpr static int EndOfColourBurst = 65; constexpr static int EndOfColourBurst = 65 * CyclesPerLine / 342;
constexpr static int StartOfLeftBorder = 73; constexpr static int StartOfLeftBorder = 73 * CyclesPerLine / 342;
}; };
template <Personality personality> template <Personality personality>
struct Timing<personality, std::enable_if_t<is_yamaha_vdp(personality)>> { struct Timing<personality, std::enable_if_t<is_classic_vdp(personality)>>: public StandardTiming<342> {
constexpr static int CyclesPerLine = 1368; };
constexpr static int VRAMAccessDelay = 6; template <Personality personality>
constexpr static int FirstPixelCycle = 344; struct Timing<personality, std::enable_if_t<is_yamaha_vdp(personality)>>: public StandardTiming<1368> {
constexpr static bool SupportsTextMode = true;
constexpr static int FirstTextCycle = 376;
constexpr static int LastTextCycle = 1336;
constexpr static int EndOfRightBorder = 15 * 4;
constexpr static int StartOfSync = 23 * 4;
constexpr static int EndOfSync = 49 * 4;
constexpr static int StartOfColourBurst = 51 * 4;
constexpr static int EndOfColourBurst = 65 * 4;
constexpr static int StartOfLeftBorder = 73 * 4;
}; };
template <> template <>
struct Timing<Personality::MDVDP> { struct Timing<Personality::MDVDP>: public StandardTiming<3420> {
constexpr static int CyclesPerLine = 3420;
constexpr static int VRAMAccessDelay = 6;
constexpr static int FirstPixelCycle = 860;
constexpr static bool SupportsTextMode = false;
// Implementation note: these currently need to be multiples of 2.5
// per the stateless Mega Drive -> CRT clock conversion.
constexpr static int EndOfRightBorder = 15 * 10;
constexpr static int StartOfSync = 23 * 10;
constexpr static int EndOfSync = 49 * 10;
constexpr static int StartOfColourBurst = 51 * 10;
constexpr static int EndOfColourBurst = 65 * 10;
constexpr static int StartOfLeftBorder = 73 * 10;
}; };
constexpr int TMSAccessWindowsPerLine = 171; constexpr int TMSAccessWindowsPerLine = 171;