From b0c4b664f2775808c43af4e310ee9e8920960216 Mon Sep 17 00:00:00 2001 From: slederer Date: Sun, 2 Feb 2025 01:13:49 +0100 Subject: [PATCH] tridoraemu: update framebuffer image on palette change --- tridoraemu/framebuffer.go | 22 ++++++++++++++++++++++ tridoraemu/tridoraemu.go | 1 + 2 files changed, 23 insertions(+) diff --git a/tridoraemu/framebuffer.go b/tridoraemu/framebuffer.go index 4586287..189100a 100644 --- a/tridoraemu/framebuffer.go +++ b/tridoraemu/framebuffer.go @@ -32,6 +32,7 @@ type Framebuffer struct { paletteSlot word vmem [VmemWords]word readCount int + paletteChanged bool } func (f *Framebuffer) initialize() { @@ -104,6 +105,26 @@ func (f *Framebuffer) readPalette() word { return word(0) } +func (f *Framebuffer) startFrame() { + // when the palette changes, we + // need to redraw every pixel + // to get the new colors + if f.paletteChanged { + oldRAddr := f.readAddr + oldWAddr := f.writeAddr + f.readAddr = 0 + f.writeAddr = 0 + + for i := 0; i < VmemWords; i++ { + f.writeVmem(f.readVmem()) + } + + f.readAddr = oldRAddr + f.writeAddr = oldWAddr + f.paletteChanged = false + } +} + func (f *Framebuffer) writePalette(value word) { // 4 bits per color channel r := uint8((value & 0b111100000000) >> 8) @@ -116,6 +137,7 @@ func (f *Framebuffer) writePalette(value word) { b = b << 4 f.palette[f.paletteSlot] = color.RGBA{r,g,b,0} + f.paletteChanged = true } func (f *Framebuffer) readCtl() word { diff --git a/tridoraemu/tridoraemu.go b/tridoraemu/tridoraemu.go index 875c3c0..88804b4 100644 --- a/tridoraemu/tridoraemu.go +++ b/tridoraemu/tridoraemu.go @@ -43,6 +43,7 @@ type Game struct{ func (g *Game) Update() error { startTime := time.Now() + framebuffer.startFrame() for i := 0; i < g.stepsPerFrame; i++ { err := cpu.step() if err != nil {