ref: b70db298bb0c72d5324b3db91f9e482637cff52e
parent: 42e2e421d94472d0b79dea9166505e32645aef4b
author: Jacob Moody <moody@posixcafe.org>
date: Fri Feb 10 22:38:26 EST 2023
games/gb: implement internal window line counter The y offset used for windows is not based on LY but another internal window counter that is incremented alongside LY but only when the window is on screen. This fixes an issue with the dmg-acid2 and cgb-acid2 test roms. https://github.com/mattcurrie/dmg-acid2 https://gbdev.io/pandocs/Tile_Maps.html#window
--- a/sys/src/games/gb/dat.h
+++ b/sys/src/games/gb/dat.h
@@ -14,7 +14,7 @@
extern Event *elist;
extern ulong clock;
-extern u8int ppuy, ppustate;
+extern u8int ppuy, ppustate, ppuw;
extern u8int apustatus;
--- a/sys/src/games/gb/mem.c
+++ b/sys/src/games/gb/mem.c
@@ -109,6 +109,7 @@
ppusync();
if((~v & reg[a] & LCDEN) != 0){
ppuy = 0;
+ ppuw = 0;
ppustate = 0;
delevent(&evhblank);
}
--- a/sys/src/games/gb/ppu.c
+++ b/sys/src/games/gb/ppu.c
@@ -5,7 +5,7 @@
#include "dat.h"
#include "fns.h"
-u8int ppustate, ppuy;
+u8int ppustate, ppuy, ppuw;
ulong hblclock, rendclock;
jmp_buf mainjmp, renderjmp;
static int cyc, done, ppux, ppux0;
@@ -118,8 +118,8 @@
}while(m > 8);
if(win == -1){
win = 1;
- ta = 0x1800 | reg[LCDC] << 4 & 0x400 | ppuy - reg[WY] << 2 & 0x3e0;
- y = ppuy - reg[WY] << 1 & 14;
+ ta = 0x1800 | reg[LCDC] << 4 & 0x400 | ppuw - reg[WY] << 2 & 0x3e0;
+ y = ppuw - reg[WY] << 1 & 14;
cyc += 2;
m = 175 - reg[WX];
goto restart;
@@ -292,6 +292,8 @@
switch(ppustate){
case 0:
hblclock = clock + evhblank.time;
+ if(reg[WX] <= 166 && reg[WY] <= 143)
+ ppuw++;
if(++ppuy == 144){
ppustate = 1;
if((reg[STAT] & IRQM1) != 0)
@@ -310,8 +312,11 @@
break;
case 1:
hblclock = clock + evhblank.time;
+ if(reg[WX] <= 166 && reg[WY] <= 143)
+ ppuw++;
if(++ppuy == 154){
ppuy = 0;
+ ppuw = 0;
ppustate = 2;
if((reg[STAT] & IRQM2) != 0)
reg[IF] |= IRQLCDS;
--
⑨