From 5b31db700b30fa8e4e9959e7a28f595692dc50f8 Mon Sep 17 00:00:00 2001
From: Thomas Harte <thomas.harte@gmail.com>
Date: Fri, 17 Feb 2023 22:23:10 -0500
Subject: [PATCH] Deduplicate 40-column text fetching.

---
 Components/9918/Implementation/Fetch.hpp | 28 ++++++++----------------
 1 file changed, 9 insertions(+), 19 deletions(-)

diff --git a/Components/9918/Implementation/Fetch.hpp b/Components/9918/Implementation/Fetch.hpp
index 94b3644ec..12002f0e5 100644
--- a/Components/9918/Implementation/Fetch.hpp
+++ b/Components/9918/Implementation/Fetch.hpp
@@ -111,12 +111,12 @@ struct TextFetcher {
 		row_base(base->pattern_name_address_ & bits10(AddressT((y >> 3) * 40))),
 		row_offset(base->pattern_generator_table_address_ & bits11(AddressT(y & 7))) {}
 
-	void fetch_name(AddressT column) {
-		base->name_[0] = base->ram_[row_base + column];
+	void fetch_name(AddressT column, int slot = 0) {
+		base->name_[slot] = base->ram_[row_base + column];
 	}
 
-	void fetch_pattern(AddressT column) {
-		line_buffer.characters.shapes[column] = base->ram_[row_offset + size_t(base->name_[0] << 3)];
+	void fetch_pattern(AddressT column, int slot = 0) {
+		line_buffer.characters.shapes[column] = base->ram_[row_offset + size_t(base->name_[slot] << 3)];
 	}
 
 	Base<personality> *const base;
@@ -499,7 +499,7 @@ template<ScreenMode mode> void Base<personality>::fetch_yamaha(LineBuffer &line_
 	const uint8_t *const ram2 = &ram_[65536];
 
 	CharacterFetcher character_fetcher(this, line_buffer, next_line_buffer, y);
-//	TextFetcher text_fetcher(this, line_buffer, y);
+	TextFetcher text_fetcher(this, line_buffer, y);
 
 	using Type = typename Storage<personality>::Event::Type;
 	while(Storage<personality>::next_event_->offset < end) {
@@ -512,14 +512,8 @@ template<ScreenMode mode> void Base<personality>::fetch_yamaha(LineBuffer &line_
 				switch(mode) {
 					case ScreenMode::Text: {
 						const auto column = AddressT(Storage<personality>::data_block_);
-						const AddressT start = pattern_name_address_ & (0x1fc00 | size_t(y >> 3) * 40);
-
-						name_[0] = ram_[start + column + 0];
-						name_[1] = ram_[start + column + 1];
-
-						// TODO: use fetcher after resolving ambiguity over name_[0]/name_[1]/etc.
-//						text_fetcher.fetch_name(column);
-//						text_fetcher.fetch_name(column + 1);
+						text_fetcher.fetch_name(column, 0);
+						text_fetcher.fetch_name(column + 1, 1);
 					} break;
 
 					case ScreenMode::YamahaText80: {
@@ -566,12 +560,8 @@ template<ScreenMode mode> void Base<personality>::fetch_yamaha(LineBuffer &line_
 						const auto column = AddressT(Storage<personality>::data_block_);
 						Storage<personality>::data_block_ += 2;
 
-						const AddressT start = pattern_generator_table_address_ & (0x1f800 | (y & 7));
-						line_buffer.characters.shapes[column + 0] = ram_[start + AddressT(name_[0] << 3)];
-						line_buffer.characters.shapes[column + 1] = ram_[start + AddressT(name_[1] << 3)];
-
-//						text_fetcher.fetch_pattern(column);
-//						text_fetcher.fetch_pattern(column + 1);
+						text_fetcher.fetch_pattern(column, 0);
+						text_fetcher.fetch_pattern(column + 1, 1);
 					} break;
 
 					case ScreenMode::YamahaText80: {