Start working on ppu
This commit is contained in:
parent
13685b7903
commit
21875865c4
51
include/gb.h
51
include/gb.h
|
@ -7,6 +7,7 @@ enum {
|
||||||
GB_TIMERS_TIMA,
|
GB_TIMERS_TIMA,
|
||||||
GB_TIMERS_TMA,
|
GB_TIMERS_TMA,
|
||||||
GB_TIMERS_TAC,
|
GB_TIMERS_TAC,
|
||||||
|
GB_TIMERS_N_REGS,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct gb_timers_t {
|
typedef struct gb_timers_t {
|
||||||
|
@ -47,6 +48,7 @@ typedef struct gb_dma_t {
|
||||||
ut64 seek; //17 bit seek and some flags
|
ut64 seek; //17 bit seek and some flags
|
||||||
int dma_fd; //fd representing the dma register
|
int dma_fd; //fd representing the dma register
|
||||||
int dma_bus_fd; //fd representing the memory bus while dma occupies it
|
int dma_bus_fd; //fd representing the memory bus while dma occupies it
|
||||||
|
int oam_fd; //fd representing oam
|
||||||
ut32 dma_bank_id;
|
ut32 dma_bank_id;
|
||||||
ut32 default_bank_id;
|
ut32 default_bank_id;
|
||||||
// ut16 bus_occupancy_size;
|
// ut16 bus_occupancy_size;
|
||||||
|
@ -60,11 +62,58 @@ typedef struct gb_dma_t {
|
||||||
#define GB_DMA_LAUNCH 0x20000
|
#define GB_DMA_LAUNCH 0x20000
|
||||||
#define GB_DMA_RUNNING 0x40000
|
#define GB_DMA_RUNNING 0x40000
|
||||||
#define GB_DMA_ACTIVE 0x60000
|
#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_update(GBDMA *dma, RIO *io, ut32 cycles, bool pre_exec);
|
||||||
void gb_dma_close(GBDMA *dma, RIO *io);
|
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_timers;
|
||||||
extern RIOPlugin r_io_plugin_gb_mbc1;
|
extern RIOPlugin r_io_plugin_gb_mbc1;
|
||||||
extern RIOPlugin r_io_plugin_gb_mbc2;
|
extern RIOPlugin r_io_plugin_gb_mbc2;
|
||||||
|
|
18
io/dma.c
18
io/dma.c
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <gb.h>
|
#include <gb.h>
|
||||||
#include <r_io.h>
|
#include <r_io.h>
|
||||||
#include <r_util.h>
|
#include <r_util.h>
|
||||||
|
@ -171,7 +172,7 @@ RIOPlugin r_io_plugin_gb_dma = {
|
||||||
.write = __write,
|
.write = __write,
|
||||||
};
|
};
|
||||||
|
|
||||||
GBDMA *gb_dma_open (RIO *io, bool cgb) {
|
GBDMA *gb_dma_open (RIO *io) {
|
||||||
GBDMA *dma = R_NEW0 (GBDMA);
|
GBDMA *dma = R_NEW0 (GBDMA);
|
||||||
if (!dma) {
|
if (!dma) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -190,10 +191,18 @@ GBDMA *gb_dma_open (RIO *io, bool cgb) {
|
||||||
dma->dma_bank_id = bank->id;
|
dma->dma_bank_id = bank->id;
|
||||||
char uri[64];
|
char uri[64];
|
||||||
memset (uri, 0x00, sizeof (char) * 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);
|
sprintf (uri, "gb_dma://%p", dma);
|
||||||
RIODesc *desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_dma,
|
RIODesc *desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_dma,
|
||||||
uri, R_PERM_RWX, 0);
|
uri, R_PERM_RWX, 0);
|
||||||
if (!desc) {
|
if (!desc) {
|
||||||
|
r_io_fd_close (io, dma->oam_fd);
|
||||||
r_io_bank_free (bank);
|
r_io_bank_free (bank);
|
||||||
free (dma);
|
free (dma);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -202,6 +211,7 @@ GBDMA *gb_dma_open (RIO *io, bool cgb) {
|
||||||
sprintf (uri, "gb_dma_bus://%p", dma);
|
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);
|
desc = r_io_desc_open_plugin (io, &r_io_plugin_gb_dma_bus, uri, R_PERM_RWX, 0);
|
||||||
if (!desc) {
|
if (!desc) {
|
||||||
|
r_io_fd_close (io, dma->oam_fd);
|
||||||
r_io_fd_close (io, dma->dma_fd);
|
r_io_fd_close (io, dma->dma_fd);
|
||||||
r_io_bank_free (bank);
|
r_io_bank_free (bank);
|
||||||
free (dma);
|
free (dma);
|
||||||
|
@ -236,8 +246,13 @@ void gb_dma_update (GBDMA *dma, RIO *io, ut32 cycles, bool pre_exec) {
|
||||||
dma->frontrun = ((st32)cycles) * (-1);
|
dma->frontrun = ((st32)cycles) * (-1);
|
||||||
}
|
}
|
||||||
if (cycles) {
|
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,
|
r_io_bank_write_at (io, dma->default_bank_id, 0xfe00 | dma->dst,
|
||||||
&dma->buf[dma->dst], cycles);
|
&dma->buf[dma->dst], cycles);
|
||||||
|
#endif
|
||||||
dma->dst += cycles;
|
dma->dst += cycles;
|
||||||
}
|
}
|
||||||
if (pre_exec) {
|
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_bank_del (io, dma->dma_bank_id);
|
||||||
r_io_fd_close (io, dma->dma_bus_fd);
|
r_io_fd_close (io, dma->dma_bus_fd);
|
||||||
r_io_fd_close (io, dma->dma_fd);
|
r_io_fd_close (io, dma->dma_fd);
|
||||||
|
r_io_fd_close (io, dma->oam_fd);
|
||||||
free (dma);
|
free (dma);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user