More interrupt stuff
This commit is contained in:
parent
e40c6ef069
commit
27bc6bcc39
22
include/gb.h
22
include/gb.h
|
@ -32,7 +32,6 @@ typedef struct gb_timers_t {
|
|||
} GBTimers;
|
||||
|
||||
bool gb_timers_init(GBTimers *timers, RIO *io);
|
||||
void gb_timers_continue(GBTimers *timers, ut32 cycles);
|
||||
void gb_timers_fini(GBTimers *timers, RIO *io);
|
||||
|
||||
typedef struct gb_joypad_t {
|
||||
|
@ -51,7 +50,6 @@ typedef struct gb_joypad_t {
|
|||
} GBJoypad;
|
||||
|
||||
bool gb_joypad_init(GBJoypad *joypad, RIO *io);
|
||||
void gb_joypad_continue(GBJoypad *joypad);
|
||||
void gb_joypad_fini(GBJoypad *joypad, RIO *io);
|
||||
|
||||
typedef struct gb_interrupts_t {
|
||||
|
@ -60,11 +58,11 @@ typedef struct gb_interrupts_t {
|
|||
} GBInterrupts;
|
||||
|
||||
enum {
|
||||
GB_INTERRUPTS_VBLANK_PENDING = 0,
|
||||
GB_INTERRUPTS_STAT_PENDING,
|
||||
GB_INTERRUPTS_TIMER_PENDING,
|
||||
GB_INTERRUPTS_SERIAL_PENDING,
|
||||
GB_INTERRUPTS_JOYPAD_PENDING,
|
||||
GB_INTERRUPTS_VBLANK = 0,
|
||||
GB_INTERRUPTS_STAT,
|
||||
GB_INTERRUPTS_TIMER,
|
||||
GB_INTERRUPTS_SERIAL,
|
||||
GB_INTERRUPTS_JOYPAD,
|
||||
GB_INTERRUPTS_N, //number of interrupts
|
||||
GB_INTERRUPTS_VBLANK_ENABLED = GB_INTERRUPTS_N,
|
||||
GB_INTERRUPTS_STAT_ENABLED,
|
||||
|
@ -74,10 +72,9 @@ enum {
|
|||
GB_INTERRUPTS_ENABLED, //general enable of all interrupts
|
||||
GB_INTERRUPTS_ENABLE_WAIT, //wait 1 instruction befor enabling interrupts
|
||||
GB_INTERRUPTS_SEEK, //2 bits for seek
|
||||
}
|
||||
;
|
||||
};
|
||||
|
||||
bool gb_interrupts_init(GBInterrupts *ints, RIO *io);
|
||||
void gb_interrupts_continue(GBInterrupts *ints);
|
||||
void gb_interrupts_fini(GBInterrupts *ints, RIO *io);
|
||||
|
||||
typedef struct gb_dma_t {
|
||||
|
@ -227,6 +224,11 @@ typedef struct gameboy_t {
|
|||
bool double_speed;
|
||||
} GB;
|
||||
|
||||
void gb_interrupts_request(GB *gb, int interrupt);
|
||||
void gb_interrupts_continue(GB *gb);
|
||||
void gb_timers_continue(GB *gb, ut32 cycles);
|
||||
void gb_joypad_continue(GB *gb);
|
||||
|
||||
GBPPU *gb_ppu_open (RIO *io, SDL_Renderer *renderer);
|
||||
void gb_ppu_continue (GB *gb, ut32 cycles);
|
||||
void gb_ppu_close (GBPPU *ppu, RIO *io);
|
||||
|
|
|
@ -114,6 +114,21 @@ void gb_interrupts_fini(GBInterrupts *ints, RIO *io) {
|
|||
r_io_fd_close (io, ints->fd);
|
||||
}
|
||||
|
||||
void gb_interrupts_continue(GBInterrupts *ints) {
|
||||
void gb_interrupts_continue(GB *gb) {
|
||||
|
||||
//TODO
|
||||
}
|
||||
|
||||
void gb_interrupts_request (GB *gb, int interrupt) {
|
||||
switch (interrupt) {
|
||||
case GB_INTERRUPTS_VBLANK:
|
||||
case GB_INTERRUPTS_STAT:
|
||||
case GB_INTERRUPTS_TIMER:
|
||||
case GB_INTERRUPTS_SERIAL:
|
||||
case GB_INTERRUPTS_JOYPAD:
|
||||
gb->interrupts.flags |= interrupt;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -107,7 +107,8 @@ bool gb_joypad_init (GBJoypad *joypad, RIO *io) {
|
|||
return true;;
|
||||
}
|
||||
|
||||
void gb_joypad_continue(GBJoypad *joypad) {
|
||||
void gb_joypad_continue(GB *gb) {
|
||||
GBJoypad *joypad = &gb->joypad;
|
||||
joypad->odata &= 0xc0;
|
||||
joypad->odata |= joypad->data & 0x3f;
|
||||
SDL_PumpEvents ();
|
||||
|
@ -134,7 +135,7 @@ void gb_joypad_continue(GBJoypad *joypad) {
|
|||
}
|
||||
joypad->data = (joypad->data & 0x30) | (ndata ^ 0xf);
|
||||
if (joypad->odata & ndata) {
|
||||
//TODO: request interrupt
|
||||
gb_interrupts_request (gb, GB_INTERRUPTS_JOYPAD);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,8 @@ void gb_timers_fini (GBTimers *timers, RIO *io) {
|
|||
r_io_fd_close (io, timers->fd);
|
||||
}
|
||||
|
||||
void gb_timers_continue (GBTimers *timers, ut32 cycles) {
|
||||
void gb_timers_continue (GB *gb, ut32 cycles) {
|
||||
GBTimers *timers = &gb->timers;
|
||||
bool request_interrupt = false;
|
||||
do {
|
||||
//ensure all falling edges are detected
|
||||
|
@ -173,6 +174,6 @@ void gb_timers_continue (GBTimers *timers, ut32 cycles) {
|
|||
cycles -= _cycles;
|
||||
} while (cycles);
|
||||
if (request_interrupt) {
|
||||
//TODO
|
||||
gb_interrupts_request (gb, GB_INTERRUPTS_TIMER);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user