From 4f058726584b60a8c976715a35f488875cac7aa8 Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Wed, 20 Jun 2018 15:42:23 -0400 Subject: add gb.h --- ops.yaml | 153 +++++++++------------------------------------------------------ 1 file changed, 22 insertions(+), 131 deletions(-) (limited to 'ops.yaml') diff --git a/ops.yaml b/ops.yaml index 9f33510..f08a64a 100644 --- a/ops.yaml +++ b/ops.yaml @@ -7519,6 +7519,7 @@ templates: main: | #include #include + #include "gb.h" #define UNUSED(a) ((void) (a)) @@ -7550,127 +7551,16 @@ templates: RW_LAST, } rw_t; - typedef enum { - STATE_RUN, - STATE_STOP, - STATE_HALT, - STATE_INVALID, - STATE_NOT_IMPLEMENTED, - STATE_LAST, - } gb_cpu_state_t; - // gb-manual, p23 - typedef enum { - P1_MODE_NONE, - P1_MODE_P14, - P1_MODE_P15, - } p1_mode_t; - - #define GB_BTN_UP 1 - #define GB_BTN_DOWN (1 << 1) - #define GB_BTN_LEFT (1 << 2) - #define GB_BTN_RIGHT (1 << 3) - #define GB_BTN_A (1 << 4) - #define GB_BTN_B (1 << 5) - #define GB_BTN_SELECT (1 << 6) - #define GB_BTN_START (1 << 7) + #define P1_MODE_NONE 0 + #define P1_MODE_P14 1 + #define P1_MODE_P15 2 #define GPU_MODE_OAM 2 #define GPU_MODE_VRAM 3 #define GPU_MODE_HBLANK 0 #define GPU_MODE_VBLANK 1 - typedef struct { - struct { - bool in_bios; - - // FIXME: combine these? - uint8_t bios[0x100]; // bios (256 bytes) - uint8_t ram[0x2000]; // working ram (8k) - uint8_t eram[65536]; // external ram (banked, up to 64k) - uint8_t vram[0x2000]; // vram (8k) - uint8_t oam[0xA0]; // oam (160 bytes) - uint8_t zram[0x7F]; // zram (128 bytes) - - // rom (at least 32k) - const uint8_t *rom; - uint32_t rom_size; - - union { - struct { - // current rom bank (5 bits); see note about - // rom_ram_mode below - uint8_t rom_bank; - - // is external ram enabled? - bool ram_enable; - - // ram bank - // rom_ram_mode == 0: high two bits of rom bank - // rom_ram_mode == 1: ram bank - uint8_t ram_bank; - - // set interpretation of ram_bank - bool rom_ram_mode; - } mbc1; - - struct { - // current rom bank (4 bits) - uint8_t rom_bank; - - // is eram enabled? - bool ram_enable; - } mbc2; - }; - - // interrupts - // ie: interrupt enable (addr: 0xFFFF) - // iv: interrupt vector (addr: 0xFF0F) - // (gb-manual, p26) - uint8_t ie; - uint8_t iv; - - // buttons (addr: 0xFF00) - // gb-manual, p23 - uint8_t p1_mode; - uint8_t btns; - } mmu; - - struct { - uint16_t clock; - uint8_t mode, - lcdc, - stat, - scy, - scx, - wy, - wx, - bgp, - obp0, - obp1, - line, - lyc; - uint8_t rgb[3 * 160 * 144]; - uint32_t frame_num; - } gpu; - - struct { - uint16_t div; - uint32_t tima; // NOTE: cannot be uint16_t because of 10-bit shift - uint8_t tma, - tac; - } timer; - - struct { - uint16_t rs[RW_LAST]; - uint32_t clock; /* FIXME: uint16_t? */ - gb_cpu_state_t state; - - // interrupt master enable - bool ime; - } cpu; - } gb_t; - #define CART_TYPE_ROM_ONLY 0x00 #define CART_TYPE_MBC1 0x01 #define CART_TYPE_MBC1_RAM 0x02 @@ -9625,23 +9515,6 @@ templates: } } - void - gb_btn_set( - gb_t * const ctx, - const uint8_t btn, - const bool set - ) { - if (set) { - ctx->mmu.btns |= btn; - } else { - ctx->mmu.btns &= ~btn; - } - - // trigger p1 interrupt - mmu_wb(ctx, PORT_IF, mmu_rb(ctx, PORT_IF) & (1 << 4)); - // TODO: handle HALT and STOP - } - static void cpu_handle_interrupts( gb_t * const ctx @@ -9733,6 +9606,24 @@ templates: gpu_step(ctx, clock); } + void + gb_set_buttons( + gb_t * const ctx, + const uint8_t btn, + const bool set + ) { + if (set) { + // set buttons + ctx->mmu.btns |= btn; + } else { + // clear buttons + ctx->mmu.btns &= ~btn; + } + + // trigger p1 interrupt + mmu_wb(ctx, PORT_IF, mmu_rb(ctx, PORT_IF) & (1 << 4)); + } + void gb_frame( gb_t * const ctx -- cgit v1.2.3