diff --git a/Components/9918/Implementation/ClockConverter.hpp b/Components/9918/Implementation/ClockConverter.hpp index f6ae33bd5..ce7f50657 100644 --- a/Components/9918/Implementation/ClockConverter.hpp +++ b/Components/9918/Implementation/ClockConverter.hpp @@ -182,6 +182,24 @@ template class ClockConverter { } } + /*! + Converts a position in TMS access cycles back to one at the native + clock rate. + */ + static constexpr int from_tms_access_clock(int source) { + switch(personality) { + default: + return source << 1; + + case Personality::V9938: + case Personality::V9958: + return source << 3; + + case Personality::MDVDP: + return source * 20; + } + } + /*! Converts a position in internal cycles to its corresponding position on the TMS pixel clock, i.e. scales to 342 clocks per line. diff --git a/Components/9918/Implementation/Fetch.hpp b/Components/9918/Implementation/Fetch.hpp index 03c3d9478..c44ab0822 100644 --- a/Components/9918/Implementation/Fetch.hpp +++ b/Components/9918/Implementation/Fetch.hpp @@ -41,19 +41,13 @@ for the exceptions. */ -// TODO: external_slot needs to do a proper conversion back to the internal clock, -// not assume a multiply by two. -// -// (and, for MSX 2 purposes, it would ideally know how many cycles since the last access -// slot, probably, but I'm not completely sure that's necessary yet) - #define slot(n) \ if(use_end && end == n) return; \ [[fallthrough]]; \ case n #define external_slot(n) \ - slot(n): do_external_slot((n)*2); + slot(n): do_external_slot(clock_converter_.from_tms_access_clock(n)); #define external_slots_2(n) \ external_slot(n); \ @@ -286,7 +280,7 @@ template void Base::fetch_tms_character(int start, in slot(31): sprite_selection_buffer.reset_sprite_collection(); - do_external_slot(31*2); + do_external_slot(clock_converter_.from_tms_access_clock(31)); external_slots_2(32); external_slot(34); @@ -437,7 +431,7 @@ template void Base::fetch_sms(int start, int end) { slot(29): sprite_selection_buffer.reset_sprite_collection(); - do_external_slot(29*2); + do_external_slot(clock_converter_.from_tms_access_clock(29)); external_slot(30); sprite_y_read(31, 0);