interrupt: first-pass implementation of interrupts
Only manual and V-blank interrupts work, for now. This implements enough to make the EI and DI parts of Blargg's Interrupt test pass.
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "gbemu/memory.h"
|
||||
#include "gbemu/video.h"
|
||||
#include "gbemu/cpu.h"
|
||||
|
||||
#include "common/common.h"
|
||||
|
||||
@@ -19,6 +20,7 @@
|
||||
#define UNMAP_BOOTROM_ADDR 0xff50
|
||||
|
||||
static struct gb_video *video;
|
||||
static struct gb_interrupt *interrupt;
|
||||
|
||||
static uint8_t ram[MAX_RAM_LEN];
|
||||
static unsigned char bootrom[0x100] = {0};
|
||||
@@ -47,9 +49,10 @@ static void load_file_to_buffer(const char *filename, uint8_t *buffer, size_t si
|
||||
fclose(prog_file);
|
||||
}
|
||||
|
||||
void gb_mem_init(struct gb_memory *memory, struct gb_video *v,
|
||||
void gb_mem_init(struct gb_memory *memory, struct gb_video *v, struct gb_interrupt *i,
|
||||
const char *bootrom_file, const char *rom_file)
|
||||
{
|
||||
interrupt = i;
|
||||
video = v;
|
||||
memset(&ram, 0, MAX_RAM_LEN);
|
||||
bootrom_mapped = 1;
|
||||
@@ -107,6 +110,10 @@ uint8_t gb_mem_read(struct gb_memory *memory, uint16_t addr)
|
||||
return gb_serial_read(memory, addr);
|
||||
case 0xFF40 ... 0xFF4B:
|
||||
return gb_video_mem_read(video, addr);
|
||||
case 0xFF0F:
|
||||
return gb_interrupt_if_read(interrupt);
|
||||
case 0xFFFF:
|
||||
return gb_interrupt_ie_read(interrupt);
|
||||
default:
|
||||
return ram[addr];
|
||||
}
|
||||
@@ -136,8 +143,12 @@ void gb_mbc3_write(struct gb_memory *memory, uint16_t addr, uint8_t val)
|
||||
case 0xFF40 ... 0xFF4B:
|
||||
gb_video_mem_write(video, addr, val);
|
||||
break;
|
||||
case 0xFF0F:
|
||||
gb_interrupt_if_write(interrupt, val);
|
||||
break;
|
||||
case 0xFFFF:
|
||||
gb_log("Writing to interrupt mask: 0x%02x\n", val);
|
||||
gb_interrupt_ie_write(interrupt, val);
|
||||
break;
|
||||
default:
|
||||
ram[addr] = val;
|
||||
}
|
||||
@@ -164,6 +175,12 @@ void gb_mem_write(struct gb_memory *memory, uint16_t addr, uint8_t val)
|
||||
case 0xFF40 ... 0xFF4B:
|
||||
gb_video_mem_write(video, addr, val);
|
||||
return;
|
||||
case 0xFF0F:
|
||||
gb_interrupt_if_write(interrupt, val);
|
||||
return;
|
||||
case 0xFFFF:
|
||||
gb_interrupt_ie_write(interrupt, val);
|
||||
return;
|
||||
case 0x8000 ... 0x87FF:
|
||||
case 0x9800 ... 0x9BFF:
|
||||
break;
|
||||
@@ -172,9 +189,6 @@ void gb_mem_write(struct gb_memory *memory, uint16_t addr, uint8_t val)
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 0xFFFF:
|
||||
gb_log("Writing to interrupt mask: 0x%02x\n", val);
|
||||
break;
|
||||
}
|
||||
|
||||
ram[addr] = val;
|
||||
|
||||
Reference in New Issue
Block a user