From 02712d69cdd859d702cc7577e72db27d6f0c9ad5 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Mon, 12 Dec 2022 14:34:05 -0600 Subject: Implement fast video --- tb/vga.impl.hpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 4 deletions(-) (limited to 'tb/vga.impl.hpp') diff --git a/tb/vga.impl.hpp b/tb/vga.impl.hpp index 9c3294c..988259a 100644 --- a/tb/vga.impl.hpp +++ b/tb/vga.impl.hpp @@ -11,6 +11,8 @@ #include #include +#include "avalon.hpp" + namespace { // https://web.mit.edu/6.111/www/s2004/NEWKIT/vga.shtml @@ -35,10 +37,26 @@ namespace namespace taller::vga { template - display::display(Crtc &crtc, std::uint32_t clock_hz) noexcept - : crtc(crtc), + display::display(Crtc &crtc, std::uint32_t base, std::uint32_t clock_hz, std::uint32_t bus_hz) noexcept + : avalon::slave(base, 64 << 20, 4), + crtc(crtc), clock_hz(clock_hz) - {} + { + if(bus_hz > 0) + { + mode = &MODES[0]; + max_addr = mode->h.active * mode->v.active; + + refresh_ticks = + static_cast(bus_hz) + / mode->pixel_clk + * (mode->h.active + mode->h.front_porch + mode->h.sync + mode->h.back_porch) + * (mode->v.active + mode->v.front_porch + mode->v.sync + mode->v.back_porch); + + ticks = refresh_ticks - 1; + update_window(); + } + } template display::~display() noexcept @@ -48,7 +66,54 @@ namespace taller::vga } template - void display::tick(bool clk) noexcept + void display::tick() noexcept + { + if(++ticks == refresh_ticks) + { + ticks = 0; + if(!window) + { + update_window(); + } + + if(window) + { + ::SDL_UpdateWindowSurface(window); + } + } + } + + template + bool display::read(std::uint32_t addr, std::uint32_t &data) noexcept + { + return true; + } + + template + bool display::write(std::uint32_t addr, std::uint32_t data, unsigned byte_enable) noexcept + { + if(!window || !mode) + { + return true; + } + + auto *surface = ::SDL_GetWindowSurface(window); + if(!surface) + { + return true; + } + + auto *pixels = static_cast(surface->pixels); + if(addr < max_addr) + { + pixels[addr] = data; + } + + return true; + } + + template + void display::signal_tick(bool clk) noexcept { if(!clk) { -- cgit v1.2.3