Start working on ppu

This commit is contained in:
condret 2024-10-28 21:03:15 +01:00
parent 13685b7903
commit 21875865c4
2 changed files with 67 additions and 2 deletions

View File

@ -7,6 +7,7 @@ enum {
GB_TIMERS_TIMA,
GB_TIMERS_TMA,
GB_TIMERS_TAC,
GB_TIMERS_N_REGS,
};
typedef struct gb_timers_t {
@ -47,6 +48,7 @@ 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;
@ -60,11 +62,58 @@ typedef struct gb_dma_t {
#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, bool cgb);
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;

View File

@ -1,4 +1,5 @@
#include <stdio.h>
#include <string.h>
#include <gb.h>
#include <r_io.h>
#include <r_util.h>
@ -171,7 +172,7 @@ RIOPlugin r_io_plugin_gb_dma = {
.write = __write,
};
GBDMA *gb_dma_open (RIO *io, bool cgb) {
GBDMA *gb_dma_open (RIO *io) {
GBDMA *dma = R_NEW0 (GBDMA);
if (!dma) {
return NULL;
@ -190,10 +191,18 @@ GBDMA *gb_dma_open (RIO *io, bool cgb) {
dma->dma_bank_id = bank->id;
char uri[64];
memset (uri, 0x00, sizeof (char) * 64);
strcpy (uri, "malloc://0xa0");
dma->oam_fd = r_io_fd_open (io, uri, R_PERM_RWX, 0);
if (oam_fd < 0) {
r_io_bank_free (bank);
free (dma);
return NULL;
}
sprintf (uri, "gb_dma://%p", dma);
RIODesc *desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_dma,
uri, R_PERM_RWX, 0);
if (!desc) {
r_io_fd_close (io, dma->oam_fd);
r_io_bank_free (bank);
free (dma);
return NULL;
@ -202,6 +211,7 @@ GBDMA *gb_dma_open (RIO *io, bool cgb) {
sprintf (uri, "gb_dma_bus://%p", dma);
desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_dma_bus, uri, R_PERM_RWX, 0);
if (!desc) {
r_io_fd_close (io, dma->oam_fd);
r_io_fd_close (io, dma->dma_fd);
r_io_bank_free (bank);
free (dma);
@ -236,8 +246,13 @@ void gb_dma_update (GBDMA *dma, RIO *io, ut32 cycles, bool pre_exec) {
dma->frontrun = ((st32)cycles) * (-1);
}
if (cycles) {
#if 1
r_io_fd_write_at (io, dma->oam_fd, (ut64)dma->dst,
&dma->buf[dma->dst], cycles);
#else
r_io_bank_write_at (io, dma->default_bank_id, 0xfe00 | dma->dst,
&dma->buf[dma->dst], cycles);
#endif
dma->dst += cycles;
}
if (pre_exec) {
@ -257,5 +272,6 @@ void gb_dma_close (GBDMA *dma, RIO *io) {
r_io_bank_del (io, dma->dma_bank_id);
r_io_fd_close (io, dma->dma_bus_fd);
r_io_fd_close (io, dma->dma_fd);
r_io_fd_close (io, dma->oam_fd);
free (dma);
}