add lifecycle functions for GB
This commit is contained in:
parent
326006255a
commit
9d578edf4d
5
Makefile
5
Makefile
|
@ -1,7 +1,7 @@
|
||||||
LDFLAGS = $(shell pkg-config --libs sdl2 r_util r_io)
|
LDFLAGS = $(shell pkg-config --libs sdl2 r_util r_io)
|
||||||
CFLAGS = -Wall -I include/ $(shell pkg-config --cflags sdl2 r_util r_io r_arch r_esil r_anal r_reg)
|
CFLAGS = -Wall -I include/ $(shell pkg-config --cflags sdl2 r_util r_io r_arch r_esil r_anal r_reg)
|
||||||
|
|
||||||
all: sdl/pixbuf.o io/timers.o io/mbc1.o io/mbc2.o io/joypad.o io/dma.o io/ppu.o io/interrupts.o gb/esil.o
|
all: sdl/pixbuf.o io/timers.o io/mbc1.o io/mbc2.o io/joypad.o io/dma.o io/ppu.o io/interrupts.o gb/esil.o gb/gb.o
|
||||||
|
|
||||||
sdl/pixbuf.o:
|
sdl/pixbuf.o:
|
||||||
gcc -c sdl/pixbuf.c -o sdl/pixbuf.o $(CFLAGS)
|
gcc -c sdl/pixbuf.c -o sdl/pixbuf.o $(CFLAGS)
|
||||||
|
@ -30,5 +30,8 @@ io/interrupts.o:
|
||||||
gb/esil.o:
|
gb/esil.o:
|
||||||
gcc -c gb/esil.c -o gb/esil.o $(CFLAGS)
|
gcc -c gb/esil.c -o gb/esil.o $(CFLAGS)
|
||||||
|
|
||||||
|
gb/gb.o:
|
||||||
|
gcc -c gb/gb.c -o gb/gb.o $(CFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm sdl/*.o && rm io/*.o && rm gb/*.o
|
rm sdl/*.o && rm io/*.o && rm gb/*.o
|
||||||
|
|
|
@ -75,11 +75,17 @@ bool gb_esil_setup (GB *gb) {
|
||||||
if (!gb) {
|
if (!gb) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
gb->esil = r_esil_new (4096, 0, 1);
|
gb->esil = r_esil_new (4096, 0, 1);
|
||||||
if (!gb->esil) {
|
if (!gb->esil) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
gb->esil = gb->anal->esil;
|
||||||
|
#endif
|
||||||
|
gb->anal->arch->esil = gb->anal->esil;
|
||||||
r_esil_setup (gb->esil, gb->anal, false, false, false);
|
r_esil_setup (gb->esil, gb->anal, false, false, false);
|
||||||
|
r_arch_esilcb (gb->anal->arch, R_ARCH_ESIL_ACTION_INIT);
|
||||||
gb->esil->user = gb;
|
gb->esil->user = gb;
|
||||||
r_esil_set_op (gb->esil, "halt", gb_custom_op_halt, 0, 0, R_ESIL_OP_TYPE_CUSTOM);
|
r_esil_set_op (gb->esil, "halt", gb_custom_op_halt, 0, 0, R_ESIL_OP_TYPE_CUSTOM);
|
||||||
r_esil_set_op (gb->esil, "stop", gb_custom_op_stop, 0, 0, R_ESIL_OP_TYPE_CUSTOM);
|
r_esil_set_op (gb->esil, "stop", gb_custom_op_stop, 0, 0, R_ESIL_OP_TYPE_CUSTOM);
|
||||||
|
|
64
gb/gb.c
Normal file
64
gb/gb.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include <gb.h>
|
||||||
|
|
||||||
|
bool gb_init(GB *gb, SDL_Renderer *renderer) {
|
||||||
|
gb->io = r_io_new ();
|
||||||
|
if (!gb->io) {
|
||||||
|
goto fail_io;
|
||||||
|
}
|
||||||
|
gb->io->va = true;
|
||||||
|
gb->io->autofd = false;
|
||||||
|
gb->io->overlay = false;
|
||||||
|
gb->io->cachemode = false;
|
||||||
|
gb->io->p_cache = 0;
|
||||||
|
gb->anal = r_anal_new ();
|
||||||
|
if (!gb->anal) {
|
||||||
|
goto fail_anal;
|
||||||
|
}
|
||||||
|
r_io_bind (gb->io, &gb->anal->iob);
|
||||||
|
r_anal_use (gb->anal, "gb");
|
||||||
|
if (!gb_dma_init (&gb->dma, gb->io)) {
|
||||||
|
goto fail_dma;
|
||||||
|
}
|
||||||
|
if (!(gb_timers_init (&gb->timers, gb->io) &&
|
||||||
|
gb_joypad_init (&gb->joypad, gb->io) &&
|
||||||
|
gb_interrupts_init (&gb->interrupts, gb->io, gb->anal->reg))) {
|
||||||
|
goto fail_gb;
|
||||||
|
}
|
||||||
|
gb->ppu = gb_ppu_open (gb->io, renderer);
|
||||||
|
if (!gb->ppu) {
|
||||||
|
goto fail_gb;
|
||||||
|
}
|
||||||
|
gb_esil_setup (gb);
|
||||||
|
return true;
|
||||||
|
fail_gb:
|
||||||
|
gb_dma_fini (&gb->dma, gb->io);
|
||||||
|
fail_dma:
|
||||||
|
r_anal_free (gb->anal);
|
||||||
|
fail_anal:
|
||||||
|
r_io_free (gb->io);
|
||||||
|
fail_io:
|
||||||
|
gb[0] = (const GB){0};
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gb_fini(GB *gb) {
|
||||||
|
if (!gb) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (gb->anal) {
|
||||||
|
r_arch_esilcb (gb->anal->arch, R_ARCH_ESIL_ACTION_FINI);
|
||||||
|
r_anal_free (gb->anal);
|
||||||
|
}
|
||||||
|
if (gb->ppu && gb->io) {
|
||||||
|
gb_ppu_close (gb->ppu, gb->io);
|
||||||
|
}
|
||||||
|
if (!gb->io) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gb_interrupts_fini (&gb->interrupts, gb->io);
|
||||||
|
gb_joypad_fini (&gb->joypad, gb->io);
|
||||||
|
gb_timers_fini (&gb->timers, gb->io);
|
||||||
|
gb_dma_fini (&gb->dma, gb->io);
|
||||||
|
r_io_free (gb->io);
|
||||||
|
gb[0] = (const GB){0};
|
||||||
|
}
|
|
@ -233,7 +233,7 @@ enum {
|
||||||
|
|
||||||
typedef struct gameboy_t {
|
typedef struct gameboy_t {
|
||||||
RIO *io;
|
RIO *io;
|
||||||
RArch *arch;
|
// RArch *arch;
|
||||||
RAnal *anal;
|
RAnal *anal;
|
||||||
REsil *esil;
|
REsil *esil;
|
||||||
GBTimers timers;
|
GBTimers timers;
|
||||||
|
@ -257,11 +257,13 @@ GBPPU *gb_ppu_open (RIO *io, SDL_Renderer *renderer);
|
||||||
void gb_ppu_continue (GB *gb, ut32 cycles);
|
void gb_ppu_continue (GB *gb, ut32 cycles);
|
||||||
void gb_ppu_close (GBPPU *ppu, RIO *io);
|
void gb_ppu_close (GBPPU *ppu, RIO *io);
|
||||||
|
|
||||||
|
bool gb_esil_setup (GB *gb);
|
||||||
|
bool gb_init (GB *gb, SDL_Renderer *renderer);
|
||||||
|
void gb_fini (GB *gb);
|
||||||
|
|
||||||
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;
|
||||||
extern RIOPlugin r_io_plugin_gb_joypad;
|
extern RIOPlugin r_io_plugin_gb_joypad;
|
||||||
|
|
||||||
bool gb_esil_setup (GB *gb);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user