From 6167122d8e50e63ee047d979bb88af9a78d434a2 Mon Sep 17 00:00:00 2001 From: condret Date: Wed, 30 Oct 2024 04:46:40 +0100 Subject: [PATCH] more ppu --- include/gb.h | 4 ++-- io/dma.c | 8 ++++---- io/ppu.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/include/gb.h b/include/gb.h index ee384ef..fcc090a 100644 --- a/include/gb.h +++ b/include/gb.h @@ -116,9 +116,9 @@ typedef struct gameboy_t { int cartrigde_fd; } GB; -GBPPU *gb_ppu_open (RIO *io); +GBPPU *gb_ppu_open (RIO *io, SDL_Renderer *renderer); void gb_ppu_update (GB *gb, ut32 cycles); -void gb_ppu_close (GBPPU *ppu); +void gb_ppu_close (GBPPU *ppu, RIO *io); extern RIOPlugin r_io_plugin_gb_timers; extern RIOPlugin r_io_plugin_gb_mbc1; diff --git a/io/dma.c b/io/dma.c index 0fb1b4b..7b3fe6f 100644 --- a/io/dma.c +++ b/io/dma.c @@ -189,15 +189,15 @@ GBDMA *gb_dma_open (RIO *io) { return NULL; } 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); +// strcpy (uri, "malloc://0xa0"); + dma->oam_fd = r_io_fd_open (io, "malloc://0xa0", R_PERM_RWX, 0); if (dma->oam_fd < 0) { r_io_bank_free (bank); free (dma); return NULL; } + char uri[64]; + memset (uri, 0x00, sizeof (char) * 64); sprintf (uri, "gb_dma://%p", dma); RIODesc *desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_dma, uri, R_PERM_RWX, 0); diff --git a/io/ppu.c b/io/ppu.c index 99a373b..07f5597 100644 --- a/io/ppu.c +++ b/io/ppu.c @@ -1,8 +1,9 @@ #include #include -#include #include #include +#include +#include RIOPlugin r_io_plugin_gb_ppu; @@ -93,3 +94,43 @@ RIOPlugin r_io_plugin_gb_ppu = { .seek = __lseek, .write = __write, }; + +GBPPU *gb_ppu_open (RIO *io, SDL_Renderer *renderer) { + GBPPU *ppu = R_NEW0 (GBPPU); + if (!ppu) { + return NULL; + } + ppu->vram_fd = r_io_fd_open (io, "malloc//:0x2000", R_PERM_RWX, 0); + if (ppu->vram_fd < 0) { + free (ppu); + return NULL; + } + char uri[64]; + sprintf (uri, "gb_ppu://%p", ppu); + RIODesc *desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_ppu, uri, R_PERM_RWX, 0); + if (!desc) { + r_io_fd_close (io, ppu->vram_fd); + free (ppu); + return NULL; + } + ppu->reg_fd = desc->fd; + ppu->pixbuf = gb_pix_buf_new (renderer, 160, 144); + if (!ppu->pixbuf) { + r_io_desc_close (desc); + r_io_fd_close (io, ppu->vram_fd); + free (ppu); + return NULL; + } + return ppu; +} + +void gb_ppu_update (GB *gb, ut32 cycles) { + //TODO +} + +void gb_ppu_close (GBPPU *ppu, RIO *io) { + r_io_fd_close (ppu->vram_fd); + r_io_fd_close (ppu->reg_fd); + gb_pix_buf_free (ppu->pixbuf); + free (ppu); +}