From 9b1ece39d6dac829fe9014b5de776b2d68fec0c3 Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Wed, 27 Jun 2018 22:56:28 -0400 Subject: misc oam/vram function fixes --- ops.yaml | 70 ++++++++++++++++++++++++++++------------------------------------ 1 file changed, 30 insertions(+), 40 deletions(-) (limited to 'ops.yaml') diff --git a/ops.yaml b/ops.yaml index 3088ea2..d11350e 100644 --- a/ops.yaml +++ b/ops.yaml @@ -8833,9 +8833,10 @@ templates: const gb_t * const ctx, const uint16_t addr ) { - if (gpu_is_active(ctx) && gpu_get_mode(ctx) == GPU_MODE_VRAM) { + switch (gpu_get_mode(ctx)) { + case GPU_MODE_VRAM: return 0xFF; - } else { + default: // return vram (8k) return ctx->mmu.vram[addr & 0x1FFF]; } @@ -8846,18 +8847,14 @@ templates: const gb_t * const ctx, const uint16_t addr ) { - if (gpu_is_active(ctx)) { - switch (gpu_get_mode(ctx)) { - case GPU_MODE_HBLANK: - case GPU_MODE_VBLANK: - // oam memory (160 bytes): - return ctx->mmu.oam[addr & 0xFF]; - default: - return 0; - } - } else { + // NOTE: gpu_get_mode() returns VBLANK if gpu is inactive + switch (gpu_get_mode(ctx)) { + case GPU_MODE_HBLANK: + case GPU_MODE_VBLANK: // oam memory (160 bytes): - return ctx->mmu.oam[addr & 0xFF]; + return ctx->mmu.oam[addr - 0xFE00]; + default: + return 0; } } @@ -8971,21 +8968,15 @@ templates: const uint16_t addr, const uint8_t val ) { - if (gpu_is_active(ctx)) { - switch (gpu_get_mode(ctx)) { - case GPU_MODE_HBLANK: - case GPU_MODE_VBLANK: - case GPU_MODE_OAM: - // vram (8k) - ctx->mmu.vram[addr & 0x1FFF] = val; - break; - default: - // do nothing - break; - } - } else { - // vram (8k) + // NOTE: gpu_get_mode() returns VBLANK if lcd is inactive + switch (gpu_get_mode(ctx)) { + case GPU_MODE_VRAM: + // do nothing + break; + default: + // write to vram (8k) ctx->mmu.vram[addr & 0x1FFF] = val; + break; } } @@ -8995,21 +8986,20 @@ templates: const uint16_t addr, const uint8_t val ) { - if (gpu_is_active(ctx)) { - switch (gpu_get_mode(ctx) & 0x3) { - case GPU_MODE_HBLANK: - case GPU_MODE_VBLANK: - // oam memory (160 bytes): - ctx->mmu.oam[addr & 0xFF] = val; + // NOTE: gpu_get_mode() returns VBLANK if lcd is inactive + switch (gpu_get_mode(ctx) & 0x3) { + case GPU_MODE_HBLANK: + case GPU_MODE_VBLANK: + // oam memory (160 bytes): + ctx->mmu.oam[addr - 0xFE00] = val; - // invalidate oam cache - ctx->gpu.oam_dirty = true; + // invalidate oam cache + ctx->gpu.oam_dirty = true; - break; - default: - // do nothing - break; - } + break; + default: + // do nothing + break; } } -- cgit v1.2.3