Add a safe memory read API
This commit is contained in:
parent
33090a5cc0
commit
bdbe02b043
@ -1335,7 +1335,7 @@ static unsigned *multiplication_table_for_frequency(unsigned frequency)
|
||||
- (uint8_t) readMemory:(uint16_t)addr
|
||||
{
|
||||
while (!GB_is_inited(&gb));
|
||||
return GB_read_memory(&gb, addr);
|
||||
return GB_safe_read_memory(&gb, addr);
|
||||
}
|
||||
|
||||
- (void) writeMemory:(uint16_t)addr value:(uint8_t)value
|
||||
|
@ -1451,7 +1451,7 @@ static bool examine(GB_gameboy_t *gb, char *arguments, char *modifiers, const de
|
||||
while (count) {
|
||||
GB_log(gb, "%02x:%04x: ", addr.bank, addr.value);
|
||||
for (unsigned i = 0; i < 16 && count; i++) {
|
||||
GB_log(gb, "%02x ", GB_read_memory(gb, addr.value + i));
|
||||
GB_log(gb, "%02x ", GB_safe_read_memory(gb, addr.value + i));
|
||||
count--;
|
||||
}
|
||||
addr.value += 16;
|
||||
@ -1464,7 +1464,7 @@ static bool examine(GB_gameboy_t *gb, char *arguments, char *modifiers, const de
|
||||
while (count) {
|
||||
GB_log(gb, "%04x: ", addr.value);
|
||||
for (unsigned i = 0; i < 16 && count; i++) {
|
||||
GB_log(gb, "%02x ", GB_read_memory(gb, addr.value + i));
|
||||
GB_log(gb, "%02x ", GB_safe_read_memory(gb, addr.value + i));
|
||||
count--;
|
||||
}
|
||||
addr.value += 16;
|
||||
|
@ -742,6 +742,7 @@ struct GB_gameboy_internal_s {
|
||||
/* Temporary state */
|
||||
bool wx_just_changed;
|
||||
bool tile_sel_glitch;
|
||||
bool disable_oam_corruption; // For safe memory reads
|
||||
|
||||
GB_gbs_header_t gbs_header;
|
||||
);
|
||||
|
@ -444,7 +444,7 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr)
|
||||
}
|
||||
|
||||
if (gb->oam_read_blocked) {
|
||||
if (!GB_is_cgb(gb)) {
|
||||
if (!GB_is_cgb(gb) && !gb->disable_oam_corruption) {
|
||||
if (addr < 0xFEA0) {
|
||||
uint16_t *oam = (uint16_t *)gb->oam;
|
||||
if (gb->accessed_oam_row == 0) {
|
||||
@ -702,6 +702,18 @@ uint8_t GB_read_memory(GB_gameboy_t *gb, uint16_t addr)
|
||||
return data;
|
||||
}
|
||||
|
||||
uint8_t GB_safe_read_memory(GB_gameboy_t *gb, uint16_t addr)
|
||||
{
|
||||
gb->disable_oam_corruption = true;
|
||||
uint8_t data = read_map[addr >> 12](gb, addr);
|
||||
gb->disable_oam_corruption = false;
|
||||
GB_apply_cheat(gb, addr, &data);
|
||||
if (gb->read_memory_callback) {
|
||||
data = gb->read_memory_callback(gb, addr, data);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value)
|
||||
{
|
||||
switch (gb->cartridge_type->mbc_type) {
|
||||
|
@ -7,6 +7,7 @@ typedef uint8_t (*GB_read_memory_callback_t)(GB_gameboy_t *gb, uint16_t addr, ui
|
||||
void GB_set_read_memory_callback(GB_gameboy_t *gb, GB_read_memory_callback_t callback);
|
||||
|
||||
uint8_t GB_read_memory(GB_gameboy_t *gb, uint16_t addr);
|
||||
uint8_t GB_safe_read_memory(GB_gameboy_t *gb, uint16_t addr); // Without side effects
|
||||
void GB_write_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value);
|
||||
#ifdef GB_INTERNAL
|
||||
internal void GB_dma_run(GB_gameboy_t *gb);
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <stdbool.h>
|
||||
#include "gb.h"
|
||||
|
||||
#define GB_read_memory GB_safe_read_memory
|
||||
|
||||
typedef void opcode_t(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user