Improve EEPROM reads/writes and ROM reads

Unmapped areas read a value closer to what hardware produces.
Ensure that 32MB games can do EEPROM reads.
This commit is contained in:
David Guillen Fandos 2023-09-14 00:22:55 +02:00
parent c0d8ffaa38
commit 6e59ca6795
2 changed files with 29 additions and 15 deletions

View File

@ -469,6 +469,12 @@ u8 read_backup(u32 address)
#define read_backup32() \
value = 0 \
#define write_eeprom8(addr, value)
#define write_eeprom16(addr, value) \
write_eeprom(addr, value)
#define write_eeprom32(addr, value)
// EEPROM is 512 bytes by default; it is autodetecte as 8KB if
// 14bit address DMAs are made (this is done in the DMA handler).
@ -561,6 +567,16 @@ void function_cc write_eeprom(u32 unused_address, u32 value)
\
value = readaddress##type(map, address & 0x7FFF) \
#define unmapped_rom_read8(addr) \
(((addr) >> 1) >> (((addr) & 1) * 8)) & 0xFF
#define unmapped_rom_read16(addr) \
((addr) >> 1) & 0xFFFF
#define unmapped_rom_read32(addr) \
((((addr) & ~3) >> 1) & 0xFFFF) | (((((addr) & ~3) + 2) >> 1) << 16)
#define read_open8() \
if(!(reg[REG_CPSR] & 0x20)) \
value = read_memory8(reg[REG_PC] + 8 + (address & 0x03)); \
@ -671,6 +687,12 @@ u32 function_cc read_eeprom(void)
value = readaddress##type(oam_ram, address & 0x3FF); \
break; \
\
case 0x0D: \
if (backup_type == BACKUP_EEPROM) { \
value = read_eeprom(); \
break; \
} \
/* fallthrough */ \
case 0x08: \
case 0x09: \
case 0x0A: \
@ -678,23 +700,13 @@ u32 function_cc read_eeprom(void)
case 0x0C: \
/* gamepak ROM */ \
if((address & 0x1FFFFFF) >= gamepak_size) \
value = 0; \
value = unmapped_rom_read##type(address); \
else \
{ \
read_memory_gamepak(type); \
} \
break; \
\
case 0x0D: \
if((address & 0x1FFFFFF) < gamepak_size) \
{ \
read_memory_gamepak(type); \
} \
else \
value = read_eeprom(); \
\
break; \
\
case 0x0E: \
case 0x0F: \
read_backup##type(); \
@ -1464,7 +1476,7 @@ void function_cc write_rtc(u32 address, u32 value)
break; \
\
case 0x0D: \
write_eeprom(address, value); \
write_eeprom##type(address, value); \
break; \
\
case 0x0E: \

View File

@ -223,6 +223,8 @@ ext_store_rtc8: # No RTC writes on byte or word access
ext_store_rtc32:
ext_store_backup16: # Backup (flash) accessed via byte writes
ext_store_backup32:
ext_store_eeprom8: # EEPROM accesses are performed using 16 bit DMA
ext_store_eeprom32:
ext_store_ignore:
ret # ignore these writes
@ -277,7 +279,7 @@ cpu_sleep_loop:
jmp lookup_pc # pc changes after a halt
ext_store_eeprom:
ext_store_eeprom16:
CALL_FUNC(write_eeprom) # perform eeprom write
ret
@ -568,7 +570,7 @@ return_to_main:
ADDR_TYPE ext_store_ignore /* 0x0A gamepak, ignore */;\
ADDR_TYPE ext_store_ignore /* 0x0B gamepak, ignore */;\
ADDR_TYPE ext_store_ignore /* 0x0C gamepak, ignore */;\
ADDR_TYPE ext_store_eeprom /* 0x0D EEPROM (possibly) */;\
ADDR_TYPE ext_store_eeprom##asize /* 0x0D EEPROM (possibly) */;\
ADDR_TYPE ext_store_backup##asize /* 0x0E Flash ROM/SRAM */;\
ADDR_TYPE ext_store_ignore /* 0x0F ignore */;\
@ -599,7 +601,7 @@ defsymbl(x86_table_data)
ADDR_TYPE ext_store_ignore # 0x0A gamepak, ignore
ADDR_TYPE ext_store_ignore # 0x0B gamepak, ignore
ADDR_TYPE ext_store_ignore # 0x0C gamepak, ignore
ADDR_TYPE ext_store_eeprom # 0x0D EEPROM (possibly)
ADDR_TYPE ext_store_eeprom32 # 0x0D EEPROM (possibly)
ADDR_TYPE ext_store_ignore # 0x0E Flash ROM/SRAM must be 8bit
ADDR_TYPE ext_store_ignore # 0x0F ignore