tridoraemu: update framebuffer image on palette change

This commit is contained in:
slederer 2025-02-02 01:13:49 +01:00
parent 3c8525dcca
commit b0c4b664f2
2 changed files with 23 additions and 0 deletions

View file

@ -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 {

View file

@ -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 {