From b9d24e00470c2538aa55e36833a7b89cdfcd9494 Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Wed, 20 Jun 2018 22:41:50 -0400 Subject: populate gpu_draw() --- ops.yaml | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) (limited to 'ops.yaml') diff --git a/ops.yaml b/ops.yaml index 0b6a42e..30c0c64 100644 --- a/ops.yaml +++ b/ops.yaml @@ -7523,6 +7523,7 @@ templates: #include "gb.h" #define UNUSED(a) ((void) (a)) + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define FLAG(ctx, f) (cpu_rb(ctx, RB_F) & (F_##f)) #define F_Z (1 << 7) @@ -9387,8 +9388,80 @@ templates: gpu_draw( gb_t * const ctx ) { - UNUSED(ctx); - // TODO + struct { + uint8_t x, y, tile; + bool priority, + y_flip, + x_flip, + palette; + } objs[40]; + + // decode oam + for (int i = 0; i < 40; i++) { + objs[i].y = (ctx->mmu.oam[i * 4 + 0] + 16) & 0xFF; + objs[i].x = (ctx->mmu.oam[i * 4 + 1] + 8) & 0xFF; + objs[i].tile = ctx->mmu.oam[i * 4 + 2]; + + const uint8_t flags = ctx->mmu.oam[i * 4 + 3]; + objs[i].priority = flags & (1 << 7); + objs[i].y_flip = flags & (1 << 6); + objs[i].x_flip = flags & (1 << 5); + objs[i].palette = flags & (1 << 4); + } + + // draw sprites behind bg + for (int i = 0; i < 40; i++) { + if ( + // sprite is below bg + objs[i].priority && + + // sprite is on screen + objs[i].y < 144 && objs[i].x < 160 && + + // sprite is on current line + ctx->gpu.line >= objs[i].y && + ctx->gpu.line <= objs[i].y + ) { + const uint8_t max_j = MIN(8, 160 - objs[i].x); + + for (uint8_t j = 0; j < max_j; j++) { + const uint32_t ofs = 3 * (objs[i].y * 160 + objs[i].x + j); + + // TODO: draw sprite scanline + ctx->gpu.rgb[ofs + 0] = 0xff; + ctx->gpu.rgb[ofs + 1] = 0xff; + ctx->gpu.rgb[ofs + 2] = 0xff; + } + } + } + + // TODO: draw background + + // draw foreground sprites + for (int i = 0; i < 40; i++) { + if ( + // sprite is above bg + !objs[i].priority && + + // sprite is on screen + objs[i].y < 144 && objs[i].x < 160 && + + // sprite is on current line + ctx->gpu.line >= objs[i].y && + ctx->gpu.line <= objs[i].y + ) { + const uint8_t max_j = MIN(8, 160 - objs[i].x); + + for (int j = 0; j < max_j; j++) { + const uint32_t ofs = 3 * (objs[i].y * 160 + objs[i].x + j); + + // TODO: draw sprite scanline + ctx->gpu.rgb[ofs + 0] = 0xff; + ctx->gpu.rgb[ofs + 1] = 0xff; + ctx->gpu.rgb[ofs + 2] = 0xff; + } + } + } } static void -- cgit v1.2.3