diff --git a/Machines/Electron/Video.cpp b/Machines/Electron/Video.cpp index d5f01194e..2386c93b6 100644 --- a/Machines/Electron/Video.cpp +++ b/Machines/Electron/Video.cpp @@ -32,6 +32,13 @@ namespace { static const int real_time_clock_interrupt_2 = 56704; static const int display_end_interrupt_1 = (first_graphics_line + display_end_interrupt_line)*cycles_per_line; static const int display_end_interrupt_2 = (first_graphics_line + field_divider_line + display_end_interrupt_line)*cycles_per_line; + + struct FourBPPBookender: public Outputs::CRT::TextureBuilder::Bookender { + void add_bookends(uint8_t *const left_value, uint8_t *const right_value, uint8_t *left_bookend, uint8_t *right_bookend) { + *left_bookend = static_cast(((*left_value) & 0x0f) | (((*left_value) & 0x0f) << 4)); + *right_bookend = static_cast(((*right_value) & 0xf0) | (((*right_value) & 0xf0) >> 4)); + } + }; } #pragma mark - Lifecycle @@ -49,6 +56,8 @@ VideoOutput::VideoOutput(uint8_t *memory) : ram_(memory) { "texValue >>= 4 - (int(icoordinate.x * 8) & 4);" "return vec3( uvec3(texValue) & uvec3(4u, 2u, 1u));" "}"); + std::unique_ptr bookender(new FourBPPBookender); + crt_->set_bookender(std::move(bookender)); // TODO: as implied below, I've introduced a clock's latency into the graphics pipeline somehow. Investigate. crt_->set_visible_area(crt_->get_rect_for_area(first_graphics_line - 3, 256, (first_graphics_cycle+1) * crt_cycles_multiplier, 80 * crt_cycles_multiplier, 4.0f / 3.0f)); } diff --git a/Outputs/CRT/CRT.hpp b/Outputs/CRT/CRT.hpp index cc6c6b903..ee6234521 100644 --- a/Outputs/CRT/CRT.hpp +++ b/Outputs/CRT/CRT.hpp @@ -312,6 +312,10 @@ class CRT { }); } + inline void set_bookender(std::unique_ptr bookender) { + openGL_output_builder_.texture_builder.set_bookender(std::move(bookender)); + } + inline void set_output_device(OutputDevice output_device) { enqueue_openGL_function([output_device, this] { openGL_output_builder_.set_output_device(output_device);