From 7cb51c021b57c64aebbece3d151c0407ae1591e3 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 6 Feb 2023 21:45:35 -0500 Subject: [PATCH] Observation: offset is needed only ephemerally. --- Components/9918/Implementation/9918Base.hpp | 13 +++------- Components/9918/Implementation/Draw.hpp | 6 ++--- Components/9918/Implementation/Fetch.hpp | 28 ++++++++++----------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/Components/9918/Implementation/9918Base.hpp b/Components/9918/Implementation/9918Base.hpp index 427b7dda5..f7db5bf10 100644 --- a/Components/9918/Implementation/9918Base.hpp +++ b/Components/9918/Implementation/9918Base.hpp @@ -40,9 +40,6 @@ enum class VerticalState { }; // Temporary buffers collect a representation of each line prior to pixel serialisation. -// -// TODO: either template on personality, to avoid having to be the union of all potential footprints, -// or just stop keeping so many of these in the 9918. struct LineBuffer { LineBuffer() {} @@ -62,10 +59,7 @@ struct LineBuffer { // The TMS and Sega VDPs are close enough to always tile-based; // this struct captures maximal potential detail there. struct { - struct { - size_t offset = 0; // TODO: could presumably be much smaller. One byte maybe? - uint8_t flags = 0; - } names[40]; + uint8_t flags[40]{}; // The patterns array holds tile patterns, corresponding 1:1 with names. // Four bytes per pattern is the maximum required by any @@ -73,8 +67,8 @@ struct LineBuffer { uint8_t patterns[40][4]{}; }; - // The Yamaha VDP also has a variety of bitmap modes, the widest of which is - // 512px @ 4bpp. + // The Yamaha VDP also has a variety of bitmap modes, + // the widest of which is 512px @ 4bpp. uint8_t bitmap[256]; }; @@ -571,6 +565,7 @@ template struct Base: public Storage { ScreenMode screen_mode_, underlying_mode_; LineBuffer line_buffers_[313]; + size_t tile_offset_ = 0; void posit_sprite(LineBuffer &buffer, int sprite_number, int sprite_y, int screen_row); // There is a delay between reading into the line buffer and outputting from there to the screen. That delay diff --git a/Components/9918/Implementation/Draw.hpp b/Components/9918/Implementation/Draw.hpp index 355f09d69..014f3b6a5 100644 --- a/Components/9918/Implementation/Draw.hpp +++ b/Components/9918/Implementation/Draw.hpp @@ -170,14 +170,14 @@ void Base::draw_sms(int start, int end, uint32_t cram_dot) { int length = std::min(pixels_left, 8 - shift); pattern = *reinterpret_cast(line_buffer.patterns[byte_column]); - if(line_buffer.names[byte_column].flags&2) + if(line_buffer.flags[byte_column]&2) pattern >>= shift; else pattern <<= shift; while(true) { - const int palette_offset = (line_buffer.names[byte_column].flags&0x18) << 1; - if(line_buffer.names[byte_column].flags&2) { + const int palette_offset = (line_buffer.flags[byte_column]&0x18) << 1; + if(line_buffer.flags[byte_column]&2) { for(int c = 0; c < length; ++c) { colour_buffer[tile_offset] = ((pattern_index[3] & 0x01) << 3) | diff --git a/Components/9918/Implementation/Fetch.hpp b/Components/9918/Implementation/Fetch.hpp index f8053cc47..a7af6a52d 100644 --- a/Components/9918/Implementation/Fetch.hpp +++ b/Components/9918/Implementation/Fetch.hpp @@ -142,9 +142,9 @@ struct TextFetcher { constexpr int offset = cycle - 47; constexpr auto column = AddressT(offset / 3); switch(offset % 3) { - case 0: line_buffer.names[column].offset = base->ram_[row_base + column]; break; // (1) fetch tile name. - case 1: base->do_external_slot(to_internal(cycle)); break; // (2) external slot. - case 2: line_buffer.patterns[column][0] = base->ram_[row_offset + size_t(line_buffer.names[column].offset << 3)]; break; // (3) fetch tile pattern. + case 0: base->tile_offset_ = base->ram_[row_base + column]; break; // (1) fetch tile name. + case 1: base->do_external_slot(to_internal(cycle)); break; // (2) external slot. + case 2: line_buffer.patterns[column][0] = base->ram_[row_offset + size_t(base->tile_offset_ << 3)]; break; // (3) fetch tile pattern. } } } @@ -206,11 +206,11 @@ template void Base::fetch_tms_character(LineBuffer &l #define sprite_y_read(location, sprite) \ slot(location): posit_sprite(sprite_selection_buffer, sprite, ram_[sprite_attribute_table_address_ & (((sprite) << 2) | 0x3f80)], y); -#define fetch_tile_name(column) line_buffer.names[column].offset = ram_[(row_base + column) & 0x3fff]; +#define fetch_tile_name(column) tile_offset_ = ram_[(row_base + column) & 0x3fff]; #define fetch_tile(column) {\ - line_buffer.patterns[column][1] = ram_[(colour_base + size_t((line_buffer.names[column].offset << 3) >> colour_name_shift)) & 0x3fff]; \ - line_buffer.patterns[column][0] = ram_[(pattern_base + size_t(line_buffer.names[column].offset << 3)) & 0x3fff]; \ + line_buffer.patterns[column][1] = ram_[(colour_base + size_t((tile_offset_ << 3) >> colour_name_shift)) & 0x3fff]; \ + line_buffer.patterns[column][0] = ram_[(pattern_base + size_t(tile_offset_ << 3)) & 0x3fff]; \ } #define background_fetch_block(location, column, sprite) \ @@ -347,17 +347,17 @@ template void Base::fetch_sms(LineBuffer &line_buffer #define fetch_tile_name(column, row_info) {\ const size_t scrolled_column = (column - horizontal_offset) & 0x1f;\ const size_t address = row_info.pattern_address_base + (scrolled_column << 1); \ - line_buffer.names[column].flags = ram_[address+1]; \ - line_buffer.names[column].offset = size_t( \ - (((line_buffer.names[column].flags&1) << 8) | ram_[address]) << 5 \ - ) + row_info.sub_row[(line_buffer.names[column].flags&4) >> 2]; \ + line_buffer.flags[column] = ram_[address+1]; \ + tile_offset_ = size_t( \ + (((line_buffer.flags[column]&1) << 8) | ram_[address]) << 5 \ + ) + row_info.sub_row[(line_buffer.flags[column]&4) >> 2]; \ } #define fetch_tile(column) \ - line_buffer.patterns[column][0] = ram_[line_buffer.names[column].offset]; \ - line_buffer.patterns[column][1] = ram_[line_buffer.names[column].offset+1]; \ - line_buffer.patterns[column][2] = ram_[line_buffer.names[column].offset+2]; \ - line_buffer.patterns[column][3] = ram_[line_buffer.names[column].offset+3]; + line_buffer.patterns[column][0] = ram_[tile_offset_]; \ + line_buffer.patterns[column][1] = ram_[tile_offset_+1]; \ + line_buffer.patterns[column][2] = ram_[tile_offset_+2]; \ + line_buffer.patterns[column][3] = ram_[tile_offset_+3]; #define background_fetch_block(location, column, sprite, row_info) \ slot(location): fetch_tile_name(column, row_info) \