Four Shades of Green
Progress over the last months has been quite slow. I focused on improving my performance on the bike and took big strides in that regard. I found some time to tinker on sprite during my vacation. With a working CPU implementation in place, there isn't much left to do anyway. I had to fix a few timing-related problems and implement interrupts to pass the blargg tests I'm interested in. One nasty thing was a compiler bug in drizzle, which caused some variables to be popped off the stack early and resulted in undefined behavior.
Then it was time to start working on the screen to bring the whole thing to life. Since the Game Boy is just a dumbed-down version of the Game Boy Advance (surprise), I've already done most of the things once before, and the whole process was pretty straightforward.
def background():
var map_base = 0x1800
if this.lcdc & 0x08:
map_base = map_base + 0x0400
var tile_base = 0x1000
if this.lcdc & 0x10:
tile_base = tile_base - 0x1000
var y = this.ly
for x in 0 .. kScreenW:
var texel_x = (x + this.scx) & 0xFF
var texel_y = (y + this.scy) & 0xFF
var tile_x = texel_x >> 3
var tile_y = texel_y >> 3
var tile = this.vram[32 * tile_y + tile_x + map_base]
if (this.lcdc & 0x10) == 0:
tile = sign_extend(tile)
var pixel_x = texel_x & 0x7
var pixel_y = texel_y & 0x7
var index = this.read_tile(tile_base, tile, pixel_x, pixel_y)
this.window.set_pixel(x, y, color(this.bgp, index))
That was enough to ditch serial port printing of the tests and show them in all their green glory.
Even some games that don't require memory banking are working!