1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-25 18:30:07 +00:00

Merge DataBlock and Pattern.

This commit is contained in:
Thomas Harte 2023-02-18 21:34:09 -05:00
parent 4e3e4806b9
commit d6e4f12fdc
2 changed files with 29 additions and 47 deletions

View File

@ -576,6 +576,33 @@ template<ScreenMode mode> void Base<personality>::fetch_yamaha(LineBuffer &line_
character_fetcher.fetch_tile_pattern(Storage<personality>::next_event_->id);
break;
case ScreenMode::YamahaGraphics4:
case ScreenMode::YamahaGraphics5: {
const int column = Storage<personality>::next_event_->id << 2;
const auto start = bits<15>((y << 7) | column);
line_buffer.bitmap[column + 0] = ram_[pattern_name_address_ & AddressT(start + 0)];
line_buffer.bitmap[column + 1] = ram_[pattern_name_address_ & AddressT(start + 1)];
line_buffer.bitmap[column + 2] = ram_[pattern_name_address_ & AddressT(start + 2)];
line_buffer.bitmap[column + 3] = ram_[pattern_name_address_ & AddressT(start + 3)];
} break;
case ScreenMode::YamahaGraphics6:
case ScreenMode::YamahaGraphics7: {
const int column = Storage<personality>::next_event_->id << 3;
const auto start = bits<15>((y << 7) | column);
// Fetch from alternate banks.
line_buffer.bitmap[column + 0] = ram_[rotated_name_ & AddressT(start + 0)];
line_buffer.bitmap[column + 1] = ram2[rotated_name_ & AddressT(start + 0)];
line_buffer.bitmap[column + 2] = ram_[rotated_name_ & AddressT(start + 1)];
line_buffer.bitmap[column + 3] = ram2[rotated_name_ & AddressT(start + 1)];
line_buffer.bitmap[column + 4] = ram_[rotated_name_ & AddressT(start + 2)];
line_buffer.bitmap[column + 5] = ram2[rotated_name_ & AddressT(start + 2)];
line_buffer.bitmap[column + 6] = ram_[rotated_name_ & AddressT(start + 3)];
line_buffer.bitmap[column + 7] = ram2[rotated_name_ & AddressT(start + 3)];
} break;
default: break;
}
break;
@ -616,44 +643,6 @@ template<ScreenMode mode> void Base<personality>::fetch_yamaha(LineBuffer &line_
}
break;
case Type::DataBlock:
// Exactly how to fetch depends upon mode...
switch(mode) {
case ScreenMode::YamahaGraphics4:
case ScreenMode::YamahaGraphics5: {
const int column = Storage<personality>::data_block_;
Storage<personality>::data_block_ += 4;
const auto start = bits<15>((y << 7) | column);
line_buffer.bitmap[column + 0] = ram_[pattern_name_address_ & AddressT(start + 0)];
line_buffer.bitmap[column + 1] = ram_[pattern_name_address_ & AddressT(start + 1)];
line_buffer.bitmap[column + 2] = ram_[pattern_name_address_ & AddressT(start + 2)];
line_buffer.bitmap[column + 3] = ram_[pattern_name_address_ & AddressT(start + 3)];
} break;
case ScreenMode::YamahaGraphics6:
case ScreenMode::YamahaGraphics7: {
const int column = Storage<personality>::data_block_ << 1;
Storage<personality>::data_block_ += 4;
const auto start = bits<15>((y << 7) | column);
// Fetch from alternate banks.
line_buffer.bitmap[column + 0] = ram_[rotated_name_ & AddressT(start + 0)];
line_buffer.bitmap[column + 1] = ram2[rotated_name_ & AddressT(start + 0)];
line_buffer.bitmap[column + 2] = ram_[rotated_name_ & AddressT(start + 1)];
line_buffer.bitmap[column + 3] = ram2[rotated_name_ & AddressT(start + 1)];
line_buffer.bitmap[column + 4] = ram_[rotated_name_ & AddressT(start + 2)];
line_buffer.bitmap[column + 5] = ram2[rotated_name_ & AddressT(start + 2)];
line_buffer.bitmap[column + 6] = ram_[rotated_name_ & AddressT(start + 3)];
line_buffer.bitmap[column + 7] = ram2[rotated_name_ & AddressT(start + 3)];
} break;
default: break;
}
break;
default: break;
}

View File

@ -56,11 +56,6 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
/// A slot for reading or writing data on behalf of the CPU or the command engine.
External,
//
// Bitmap modes.
//
DataBlock,
//
// Sprites.
//
@ -69,7 +64,7 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
SpritePattern,
//
// Text and character modes.
// Backgrounds.
//
Name,
Colour,
@ -87,7 +82,6 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
// State that tracks fetching position within a line.
const Event *next_event_ = nullptr;
int data_block_ = 0;
int sprite_block_ = 0;
// Text blink colours.
uint8_t blink_text_colour_ = 0;
@ -104,7 +98,6 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
/// Resets line-ephemeral state for a new line.
void begin_line(ScreenMode mode, bool is_refresh) {
data_block_ = 0;
sprite_block_ = 0;
if(is_refresh) {
next_event_ = refresh_events.data();
@ -352,7 +345,7 @@ template <Personality personality> struct Storage<personality, std::enable_if_t<
break;
case 12:
if(block) {
return Event::Type::DataBlock;
return Event(Event::Type::Pattern, uint8_t(block - 1));
}
break;
}