#ifndef GB_H #define GB_H #include #include #include #include enum { GB_TIMERS_DIV = 0, GB_TIMERS_TIMA, GB_TIMERS_TMA, GB_TIMERS_TAC, GB_TIMERS_N_REGS, }; typedef struct gb_timers_t { ut64 seek; ut32 fd; ut16 odiv; ut16 div; ut8 buf[4]; ut8 otma; st8 tima_wait; bool check_fedge; } GBTimers; GBTimers *gb_timers_open(RIO *io); void gb_timers_update(GBTimers *timers, ut32 cycles); void gb_timers_close(GBTimers *timers, RIO *io); typedef struct gb_joypad_t { ut8 *keys; int fd; ut16 up; ut16 down; ut16 left; ut16 right; ut16 a; ut16 b; ut16 start; ut16 select; ut8 data; ut8 odata; } GBJoypad; GBJoypad *gb_joypad_open(RIO *io); void gb_joypad_update(GBJoypad *joypad); void gb_joypad_close(GBJoypad *joypad, RIO *io); typedef struct gb_dma_t { ut64 seek; //17 bit seek and some flags int dma_fd; //fd representing the dma register int dma_bus_fd; //fd representing the memory bus while dma occupies it int oam_fd; //fd representing oam ut32 dma_bank_id; ut32 default_bank_id; // ut16 bus_occupancy_size; ut8 buf[0xa0]; ut8 dst; //current dst addr low byte // ut8 todo; //cycles todo st8 frontrun; //cycles that read/write ops had frontrun the dma copy ut8 val; } GBDMA; #define GB_DMA_LAUNCH 0x20000 #define GB_DMA_RUNNING 0x40000 #define GB_DMA_ACTIVE 0x60000 #define GB_DMA_CGB_MODE 0x80000 GBDMA *gb_dma_open(RIO *io); //void gb_dma_enable_cgb(GBDMA *dma); void gb_dma_update(GBDMA *dma, RIO *io, ut32 cycles, bool pre_exec); void gb_dma_close(GBDMA *dma, RIO *io); enum { GB_PPU_LCDC = 0, //0xff40 GB_PPU_STAT, //0xff41 GB_PPU_SCY, //0xff42 GB_PPU_SCX, //0xff43 GB_PPU_LY, //0xff44 GB_PPU_LYC, //0xff45 GB_PPU_BGP, //0xff47 GB_PPU_OBP0, //0xff48 GB_PPU_OBP1, //0xff49 GB_PPU_WY, //0xff4a GB_PPU_WX, //0xff4b GB_PPU_N_REGS, }; typedef struct gb_dmg_ppu_t { ut64 seek; ut8 buf[GB_PPU_N_REGS]; int reg_fd; int vram_fd; } GBPPU; #define GB_PPU_MODE0 0 #define GB_PPU_MODE1 0x10000 #define GB_PPU_MODE2 0x20000 #define GB_PPU_MODE3 0x30000 #define GB_PPU_MODE_MASK 0x30000 #define GB_PPU_DOUBLE_SPEED 0x40000 typedef struct gameboy_t { RIO *io; RArch *arch; GBTimers *timers; GBJoypad *joypad; GBDMA *dma; GBPPU *ppu; GBPixBuf *pixbuf; int cartrigde_fd; } GB; GBPPU *gb_ppu_open (RIO *io); void gb_ppu_update (GB *gb, ut32 cycles); void gb_ppu_close (GBPPU *ppu); extern RIOPlugin r_io_plugin_gb_timers; extern RIOPlugin r_io_plugin_gb_mbc1; extern RIOPlugin r_io_plugin_gb_mbc2; extern RIOPlugin r_io_plugin_gb_joypad; #endif