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:
2018-09-20 20:55:51 -07:00
parent 593d9d3600
commit 1076d02638
10 changed files with 240 additions and 23 deletions

View File

@@ -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;