From de4e5c40aa85e0aae85e6e6eff3820946cc25c52 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 3 Oct 2018 23:28:33 -0400 Subject: [PATCH] Implements horizontal scrolling lock. --- Components/9918/9918.cpp | 26 +++++++++++---------- Components/9918/Implementation/9918Base.hpp | 3 ++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Components/9918/9918.cpp b/Components/9918/9918.cpp index baa98a251..b4815fd29 100644 --- a/Components/9918/9918.cpp +++ b/Components/9918/9918.cpp @@ -647,7 +647,7 @@ void Base::draw_tms_text(int start, int end) { } void Base::draw_sms(int start, int end) { - if(!start) { + if(!start && (row_ >= 16 || !master_system_.horizontal_scroll_lock)) { pixel_target_ += master_system_.horizontal_scroll & 7; } @@ -655,7 +655,9 @@ void Base::draw_sms(int start, int end) { int byte_column = start >> 3; int pixels_left = end - start; int length = std::min(pixels_left, 8 - shift); + uint32_t pattern = *reinterpret_cast(master_system_.tile_graphics[byte_column]); + uint8_t *const pattern_index = reinterpret_cast(&pattern); if(master_system_.names[byte_column].flags&2) pattern >>= shift; @@ -664,25 +666,25 @@ void Base::draw_sms(int start, int end) { while(true) { pixels_left -= length; - const uint32_t palette_offset = static_cast((master_system_.names[byte_column].flags&0x08) << 1); + const int palette_offset = (master_system_.names[byte_column].flags&0x08) << 1; if(master_system_.names[byte_column].flags&2) { for(int c = 0; c < length; ++c) { - const uint32_t value = - ((pattern & 0x00000001) >> 0) | - ((pattern & 0x00000100) >> 6) | - ((pattern & 0x00010000) >> 15) | - ((pattern & 0x01000000) >> 24) | + const int value = + ((pattern_index[3] & 0x01) << 3) | + ((pattern_index[2] & 0x01) << 2) | + ((pattern_index[1] & 0x01) << 1) | + ((pattern_index[0] & 0x01) << 0) | palette_offset; pixel_target_[c] = master_system_.colour_ram[value]; pattern >>= 1; } } else { for(int c = 0; c < length; ++c) { - const uint32_t value = - ((pattern & 0x00000080) >> 7) | - ((pattern & 0x00008000) >> 14) | - ((pattern & 0x00800000) >> 21) | - ((pattern & 0x80000000) >> 28) | + const int value = + ((pattern_index[3] & 0x80) >> 4) | + ((pattern_index[2] & 0x80) >> 5) | + ((pattern_index[1] & 0x80) >> 6) | + ((pattern_index[0] & 0x80) >> 7) | palette_offset; pixel_target_[c] = master_system_.colour_ram[value]; pattern <<= 1; diff --git a/Components/9918/Implementation/9918Base.hpp b/Components/9918/Implementation/9918Base.hpp index 13177ecf3..de34e51b8 100644 --- a/Components/9918/Implementation/9918Base.hpp +++ b/Components/9918/Implementation/9918Base.hpp @@ -597,7 +597,7 @@ class Base { */ #define fetch_tile_name(column) {\ - const size_t scrolled_column = (column - (master_system_.horizontal_scroll >> 3)) & 0x1f;\ + const size_t scrolled_column = (column - horizontal_offset) & 0x1f;\ const size_t address = pattern_address_base + (scrolled_column << 1); \ master_system_.names[column].flags = ram_[address+1]; \ master_system_.names[column].offset = static_cast( \ @@ -634,6 +634,7 @@ class Base { const int scrolled_row = (row_ + master_system_.vertical_scroll) % 224; const size_t pattern_address_base = (pattern_name_address_ | size_t(0x3ff)) & static_cast(((scrolled_row & ~7) << 3) | 0x3800); const size_t sub_row[2] = {static_cast((scrolled_row & 7) << 2), 28 ^ static_cast((scrolled_row & 7) << 2)}; + const int horizontal_offset = (row_ >= 16 || !master_system_.horizontal_scroll_lock) ? (master_system_.horizontal_scroll >> 3) : 0; /* To add, relative to the times below: