mask rom reads outside of range instead of returning 0xFF. clean up some other archaic memory map cruft
This commit is contained in:
parent
7be2b0da6e
commit
042e584b20
|
@ -82,8 +82,6 @@ u32 _MMU_MAIN_MEM_MASK = 0x3FFFFF;
|
||||||
u32 _MMU_MAIN_MEM_MASK16 = 0x3FFFFF & ~1;
|
u32 _MMU_MAIN_MEM_MASK16 = 0x3FFFFF & ~1;
|
||||||
u32 _MMU_MAIN_MEM_MASK32 = 0x3FFFFF & ~3;
|
u32 _MMU_MAIN_MEM_MASK32 = 0x3FFFFF & ~3;
|
||||||
|
|
||||||
#define ROM_MASK 3
|
|
||||||
|
|
||||||
//#define _MMU_DEBUG
|
//#define _MMU_DEBUG
|
||||||
|
|
||||||
#ifdef _MMU_DEBUG
|
#ifdef _MMU_DEBUG
|
||||||
|
@ -174,7 +172,7 @@ u8 * MMU_struct::MMU_MEM[2][256] = {
|
||||||
/* 7X*/ DUP16(MMU.ARM9_OAM),
|
/* 7X*/ DUP16(MMU.ARM9_OAM),
|
||||||
/* 8X*/ DUP16(NULL),
|
/* 8X*/ DUP16(NULL),
|
||||||
/* 9X*/ DUP16(NULL),
|
/* 9X*/ DUP16(NULL),
|
||||||
/* AX*/ DUP16(MMU.CART_RAM),
|
/* AX*/ DUP16(NULL),
|
||||||
/* BX*/ DUP16(MMU.UNUSED_RAM),
|
/* BX*/ DUP16(MMU.UNUSED_RAM),
|
||||||
/* CX*/ DUP16(MMU.UNUSED_RAM),
|
/* CX*/ DUP16(MMU.UNUSED_RAM),
|
||||||
/* DX*/ DUP16(MMU.UNUSED_RAM),
|
/* DX*/ DUP16(MMU.UNUSED_RAM),
|
||||||
|
@ -195,7 +193,7 @@ u8 * MMU_struct::MMU_MEM[2][256] = {
|
||||||
/* 7X*/ DUP16(MMU.UNUSED_RAM),
|
/* 7X*/ DUP16(MMU.UNUSED_RAM),
|
||||||
/* 8X*/ DUP16(NULL),
|
/* 8X*/ DUP16(NULL),
|
||||||
/* 9X*/ DUP16(NULL),
|
/* 9X*/ DUP16(NULL),
|
||||||
/* AX*/ DUP16(MMU.CART_RAM),
|
/* AX*/ DUP16(NULL),
|
||||||
/* BX*/ DUP16(MMU.UNUSED_RAM),
|
/* BX*/ DUP16(MMU.UNUSED_RAM),
|
||||||
/* CX*/ DUP16(MMU.UNUSED_RAM),
|
/* CX*/ DUP16(MMU.UNUSED_RAM),
|
||||||
/* DX*/ DUP16(MMU.UNUSED_RAM),
|
/* DX*/ DUP16(MMU.UNUSED_RAM),
|
||||||
|
@ -832,7 +830,6 @@ void MMU_Init(void) {
|
||||||
memset(&MMU, 0, sizeof(MMU_struct));
|
memset(&MMU, 0, sizeof(MMU_struct));
|
||||||
|
|
||||||
MMU.CART_ROM = MMU.UNUSED_RAM;
|
MMU.CART_ROM = MMU.UNUSED_RAM;
|
||||||
MMU.CART_ROM_MASK = 3;
|
|
||||||
|
|
||||||
//MMU.DTCMRegion = 0x027C0000;
|
//MMU.DTCMRegion = 0x027C0000;
|
||||||
//even though apps may change dtcm immediately upon startup, this is the correct hardware starting value:
|
//even though apps may change dtcm immediately upon startup, this is the correct hardware starting value:
|
||||||
|
@ -876,10 +873,6 @@ void MMU_DeInit(void) {
|
||||||
Mic_DeInit();
|
Mic_DeInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Card rom & ram
|
|
||||||
|
|
||||||
u32 rom_mask = 0;
|
|
||||||
|
|
||||||
void MMU_Reset()
|
void MMU_Reset()
|
||||||
{
|
{
|
||||||
memset(MMU.ARM9_DTCM, 0, sizeof(MMU.ARM9_DTCM));
|
memset(MMU.ARM9_DTCM, 0, sizeof(MMU.ARM9_DTCM));
|
||||||
|
@ -988,15 +981,11 @@ void MMU_Reset()
|
||||||
void MMU_setRom(u8 * rom, u32 mask)
|
void MMU_setRom(u8 * rom, u32 mask)
|
||||||
{
|
{
|
||||||
MMU.CART_ROM = rom;
|
MMU.CART_ROM = rom;
|
||||||
MMU.CART_ROM_MASK = mask;
|
|
||||||
rom_mask = mask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MMU_unsetRom()
|
void MMU_unsetRom()
|
||||||
{
|
{
|
||||||
MMU.CART_ROM=MMU.UNUSED_RAM;
|
MMU.CART_ROM=MMU.UNUSED_RAM;
|
||||||
MMU.CART_ROM_MASK = 3;
|
|
||||||
rom_mask = ROM_MASK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void execsqrt() {
|
static void execsqrt() {
|
||||||
|
|
|
@ -361,8 +361,6 @@ struct MMU_struct
|
||||||
|
|
||||||
//Card rom & ram
|
//Card rom & ram
|
||||||
u8 * CART_ROM;
|
u8 * CART_ROM;
|
||||||
u32 CART_ROM_MASK;
|
|
||||||
u8 CART_RAM[0x10000];
|
|
||||||
|
|
||||||
//Unused ram
|
//Unused ram
|
||||||
u8 UNUSED_RAM[4];
|
u8 UNUSED_RAM[4];
|
||||||
|
|
|
@ -330,7 +330,7 @@ struct GameInfo
|
||||||
|
|
||||||
//now, we actually need to over-allocate, because bytes from anywhere protected by that mask
|
//now, we actually need to over-allocate, because bytes from anywhere protected by that mask
|
||||||
//could be read from the rom
|
//could be read from the rom
|
||||||
allocatedSize = mask+1;
|
allocatedSize = mask+4;
|
||||||
|
|
||||||
romdata = new char[allocatedSize];
|
romdata = new char[allocatedSize];
|
||||||
romsize = size;
|
romsize = size;
|
||||||
|
|
|
@ -120,14 +120,20 @@ static u32 read32_GCDATAIN(u8 PROCNUM)
|
||||||
card.address = (0x8000 + (card.address&0x1FF));
|
card.address = (0x8000 + (card.address&0x1FF));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(card.address >= gameInfo.romsize)
|
//it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.
|
||||||
|
//but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision
|
||||||
|
//but there is no test case yet
|
||||||
|
u32 address = card.address & (gameInfo.mask);
|
||||||
|
|
||||||
|
//as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms)
|
||||||
|
//we need to protect ourselves by returning 0xFF for things still out of range
|
||||||
|
if(address >= gameInfo.romsize)
|
||||||
{
|
{
|
||||||
DEBUG_Notify.ReadBeyondEndOfCart(card.address,gameInfo.romsize);
|
DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize);
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
//but, this is actually handled by the cart rom buffer being oversized and full of 0xFF.
|
|
||||||
//is this a good idea? We think so.
|
return T1ReadLong(MMU.CART_ROM, address);
|
||||||
return T1ReadLong(MMU.CART_ROM, card.address & MMU.CART_ROM_MASK);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -191,7 +191,6 @@ SFORMAT SF_MMU[]={
|
||||||
{ "M7RG", 1, sizeof(MMU.ARM7_REG), MMU.ARM7_REG},
|
{ "M7RG", 1, sizeof(MMU.ARM7_REG), MMU.ARM7_REG},
|
||||||
{ "M7WI", 1, sizeof(MMU.ARM7_WIRAM), MMU.ARM7_WIRAM},
|
{ "M7WI", 1, sizeof(MMU.ARM7_WIRAM), MMU.ARM7_WIRAM},
|
||||||
{ "MSWI", 1, sizeof(MMU.SWIRAM), MMU.SWIRAM},
|
{ "MSWI", 1, sizeof(MMU.SWIRAM), MMU.SWIRAM},
|
||||||
{ "MCRA", 1, sizeof(MMU.CART_RAM), MMU.CART_RAM},
|
|
||||||
{ "M9RW", 1, 1, &MMU.ARM9_RW_MODE},
|
{ "M9RW", 1, 1, &MMU.ARM9_RW_MODE},
|
||||||
{ "MDTC", 4, 1, &MMU.DTCMRegion},
|
{ "MDTC", 4, 1, &MMU.DTCMRegion},
|
||||||
{ "MITC", 4, 1, &MMU.ITCMRegion},
|
{ "MITC", 4, 1, &MMU.ITCMRegion},
|
||||||
|
@ -680,64 +679,6 @@ void loadstate_slot(int num)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 sram_read (u32 address) {
|
|
||||||
address = address - SRAM_ADDRESS;
|
|
||||||
|
|
||||||
if ( address > SRAM_SIZE )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return MMU.CART_RAM[address];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void sram_write (u32 address, u8 value) {
|
|
||||||
|
|
||||||
address = address - SRAM_ADDRESS;
|
|
||||||
|
|
||||||
if ( address < SRAM_SIZE )
|
|
||||||
MMU.CART_RAM[address] = value;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int sram_load (const char *file_name) {
|
|
||||||
|
|
||||||
FILE *file;
|
|
||||||
size_t elems_read;
|
|
||||||
|
|
||||||
file = fopen ( file_name, "rb" );
|
|
||||||
if( file == NULL )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
elems_read = fread ( MMU.CART_RAM, SRAM_SIZE, 1, file );
|
|
||||||
|
|
||||||
fclose ( file );
|
|
||||||
|
|
||||||
osd->setLineColor(255, 255, 255);
|
|
||||||
osd->addLine("Loaded SRAM");
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int sram_save (const char *file_name) {
|
|
||||||
|
|
||||||
FILE *file;
|
|
||||||
size_t elems_written;
|
|
||||||
|
|
||||||
file = fopen ( file_name, "wb" );
|
|
||||||
if( file == NULL )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
elems_written = fwrite ( MMU.CART_RAM, SRAM_SIZE, 1, file );
|
|
||||||
|
|
||||||
fclose ( file );
|
|
||||||
|
|
||||||
osd->setLineColor(255, 255, 255);
|
|
||||||
osd->addLine("Saved SRAM");
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// note: guessSF is so we don't have to do a linear search through the SFORMAT array every time
|
// note: guessSF is so we don't have to do a linear search through the SFORMAT array every time
|
||||||
// in the (most common) case that we already know where the next entry is.
|
// in the (most common) case that we already know where the next entry is.
|
||||||
|
|
|
@ -127,6 +127,7 @@ static MemSpan MemSpan_TexMem(u32 ofs, u32 len)
|
||||||
currofs += curr.len;
|
currofs += curr.len;
|
||||||
u8* ptr = MMU.texInfo.textureSlotAddr[slot];
|
u8* ptr = MMU.texInfo.textureSlotAddr[slot];
|
||||||
|
|
||||||
|
//TODO - dont alert if the masterbrightnesses are max or min
|
||||||
if(ptr == MMU.blank_memory) {
|
if(ptr == MMU.blank_memory) {
|
||||||
PROGINFO("Tried to reference unmapped texture memory: slot %d\n",slot);
|
PROGINFO("Tried to reference unmapped texture memory: slot %d\n",slot);
|
||||||
}
|
}
|
||||||
|
@ -158,6 +159,7 @@ static MemSpan MemSpan_TexPalette(u32 ofs, u32 len)
|
||||||
currofs += curr.len;
|
currofs += curr.len;
|
||||||
u8* ptr = MMU.texInfo.texPalSlot[slot];
|
u8* ptr = MMU.texInfo.texPalSlot[slot];
|
||||||
|
|
||||||
|
//TODO - dont alert if the masterbrightnesses are max or min
|
||||||
if(ptr == MMU.blank_memory) {
|
if(ptr == MMU.blank_memory) {
|
||||||
PROGINFO("Tried to reference unmapped texture palette memory: 16k slot #%d\n",slot);
|
PROGINFO("Tried to reference unmapped texture palette memory: 16k slot #%d\n",slot);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue