tridoraemu: update framebuffer image on palette change
This commit is contained in:
parent
3c8525dcca
commit
b0c4b664f2
2 changed files with 23 additions and 0 deletions
|
|
@ -32,6 +32,7 @@ type Framebuffer struct {
|
||||||
paletteSlot word
|
paletteSlot word
|
||||||
vmem [VmemWords]word
|
vmem [VmemWords]word
|
||||||
readCount int
|
readCount int
|
||||||
|
paletteChanged bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Framebuffer) initialize() {
|
func (f *Framebuffer) initialize() {
|
||||||
|
|
@ -104,6 +105,26 @@ func (f *Framebuffer) readPalette() word {
|
||||||
return word(0)
|
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) {
|
func (f *Framebuffer) writePalette(value word) {
|
||||||
// 4 bits per color channel
|
// 4 bits per color channel
|
||||||
r := uint8((value & 0b111100000000) >> 8)
|
r := uint8((value & 0b111100000000) >> 8)
|
||||||
|
|
@ -116,6 +137,7 @@ func (f *Framebuffer) writePalette(value word) {
|
||||||
b = b << 4
|
b = b << 4
|
||||||
|
|
||||||
f.palette[f.paletteSlot] = color.RGBA{r,g,b,0}
|
f.palette[f.paletteSlot] = color.RGBA{r,g,b,0}
|
||||||
|
f.paletteChanged = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Framebuffer) readCtl() word {
|
func (f *Framebuffer) readCtl() word {
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ type Game struct{
|
||||||
func (g *Game) Update() error {
|
func (g *Game) Update() error {
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
|
|
||||||
|
framebuffer.startFrame()
|
||||||
for i := 0; i < g.stepsPerFrame; i++ {
|
for i := 0; i < g.stepsPerFrame; i++ {
|
||||||
err := cpu.step()
|
err := cpu.step()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue