Lay down flash support (doesn't work properly yet)
This commit is contained in:
@@ -194,12 +194,22 @@ u32 Mem::Read32(n64::Registers ®s, u32 paddr) {
|
||||
return mmio.Read(paddr);
|
||||
case CART_REGION_1_2:
|
||||
return Util::ReadAccess<u32>(rom.cart, paddr & rom.mask);
|
||||
case CART_REGION_2_2:
|
||||
if(saveType == SAVE_NONE) {
|
||||
return 0;
|
||||
} else if (saveType == SAVE_SRAM_256k) {
|
||||
return 0xffff'ffff;
|
||||
} else if (saveType == SAVE_FLASH_1m) {
|
||||
return flash.Read(paddr - CART_REGION_START_2_2);
|
||||
} else {
|
||||
Util::panic("Cartridge backup Read32 with unknown save type!");;
|
||||
}
|
||||
case PIF_ROM_REGION:
|
||||
return Util::ReadAccess<u32>(si.pif.bootrom, paddr - PIF_ROM_REGION_START);
|
||||
case PIF_RAM_REGION:
|
||||
return be32toh(Util::ReadAccess<u32>(si.pif.ram, paddr - PIF_RAM_REGION_START));
|
||||
case 0x00800000 ... 0x03FFFFFF: case 0x04200000 ... 0x042FFFFF:
|
||||
case 0x04900000 ... 0x0FFFFFFF: case 0x1FC00800 ... 0xFFFFFFFF: return 0;
|
||||
case 0x04900000 ... 0x07FFFFFF: case 0x1FC00800 ... 0xFFFFFFFF: return 0;
|
||||
default:
|
||||
Util::panic("Unimplemented 32-bit read at address {:08X} (PC = {:016X})", paddr, (u64) regs.pc);
|
||||
}
|
||||
@@ -274,8 +284,26 @@ void Mem::Write8(Registers& regs, u32 paddr, u32 val) {
|
||||
Util::WriteAccess<u32>(si.pif.ram, paddr, htobe32(val));
|
||||
si.pif.ProcessCommands(*this);
|
||||
break;
|
||||
case SRAM_REGION:
|
||||
Util::panic("SRAM Write8!");
|
||||
case CART_REGION_2_2:
|
||||
if(flash.saveData) {
|
||||
switch (saveType) {
|
||||
case SAVE_NONE:
|
||||
Util::panic("Accessing cartridge backup with save type SAVE_NONE");
|
||||
break;
|
||||
case SAVE_EEPROM_4k:
|
||||
case SAVE_EEPROM_16k:
|
||||
Util::panic("Accessing cartridge backup with save type SAVE_EEPROM");
|
||||
break;
|
||||
case SAVE_FLASH_1m:
|
||||
flash.Write8(paddr - CART_REGION_START_2_2, val);
|
||||
break;
|
||||
case SAVE_SRAM_256k:
|
||||
flash.saveData[paddr - CART_REGION_START_2_2] = val;
|
||||
flash.saveDataDirty = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x00800000 ... 0x03FFFFFF:
|
||||
case 0x04200000 ... 0x042FFFFF:
|
||||
case 0x04900000 ... 0x07FFFFFF:
|
||||
@@ -284,7 +312,7 @@ void Mem::Write8(Registers& regs, u32 paddr, u32 val) {
|
||||
case 0x80000000 ... 0xFFFFFFFF:
|
||||
break;
|
||||
default:
|
||||
Util::panic("Unimplemented 8-bit write at address {:08X} with value {:0X} (PC = {:016X})", paddr, val,
|
||||
Util::panic("Unimplemented 8-bit write at address {:08X} with value {:02X} (PC = {:016X})", paddr, val,
|
||||
(u64) regs.pc);
|
||||
}
|
||||
}
|
||||
@@ -323,8 +351,8 @@ void Mem::Write16(Registers& regs, u32 paddr, u32 val) {
|
||||
Util::WriteAccess<u32>(si.pif.ram, paddr - PIF_RAM_REGION_START, htobe32(val));
|
||||
si.pif.ProcessCommands(*this);
|
||||
break;
|
||||
case SRAM_REGION:
|
||||
Util::panic("SRAM Write16!");
|
||||
case CART_REGION_2_2:
|
||||
Util::panic("Backup Write16!");
|
||||
case 0x00800000 ... 0x03FFFFFF:
|
||||
case 0x04200000 ... 0x042FFFFF:
|
||||
case 0x04900000 ... 0x07FFFFFF:
|
||||
@@ -333,7 +361,7 @@ void Mem::Write16(Registers& regs, u32 paddr, u32 val) {
|
||||
case 0x80000000 ... 0xFFFFFFFF:
|
||||
break;
|
||||
default:
|
||||
Util::panic("Unimplemented 16-bit write at address {:08X} with value {:0X} (PC = {:016X})", paddr, val,
|
||||
Util::panic("Unimplemented 16-bit write at address {:08X} with value {:04X} (PC = {:016X})", paddr, val,
|
||||
(u64) regs.pc);
|
||||
}
|
||||
}
|
||||
@@ -384,8 +412,20 @@ void Mem::Write32(Registers& regs, u32 paddr, u32 val) {
|
||||
case PIF_ROM_REGION:
|
||||
case 0x1FC00800 ... 0x7FFFFFFF:
|
||||
case 0x80000000 ... 0xFFFFFFFF: break;
|
||||
case 0x08000000 ... 0x0FFFFFFF:
|
||||
Util::panic("SRAM Write32!");
|
||||
case CART_REGION_2_2:
|
||||
if(flash.saveData) {
|
||||
if (saveType == SAVE_FLASH_1m) {
|
||||
flash.Write32(paddr - CART_REGION_START_2_2, val);
|
||||
} else if (saveType == SAVE_SRAM_256k) {
|
||||
break;
|
||||
} else {
|
||||
Util::panic("Invalid cartridge backup Write32 with save type {} (addr {:08X})", static_cast<int>(saveType),
|
||||
paddr);
|
||||
}
|
||||
} else {
|
||||
Util::panic("Invalid write to cartridge backup if save data is not initialized!");
|
||||
}
|
||||
break;
|
||||
default: Util::panic("Unimplemented 32-bit write at address {:08X} with value {:0X} (PC = {:016X})", paddr, val, (u64)regs.pc);
|
||||
}
|
||||
}
|
||||
@@ -426,8 +466,8 @@ void Mem::Write64(Registers& regs, u32 paddr, u64 val) {
|
||||
case 0x1FC00000 ... 0x1FC007BF:
|
||||
case 0x1FC00800 ... 0x7FFFFFFF:
|
||||
case 0x80000000 ... 0xFFFFFFFF: break;
|
||||
case 0x08000000 ... 0x0FFFFFFF:
|
||||
Util::panic("SRAM Write64!");
|
||||
case CART_REGION_2_2:
|
||||
Util::panic("Backup Write64!");
|
||||
default:
|
||||
Util::panic("Unimplemented 64-bit write at address {:08X} with value {:0X} (PC = {:016X})", paddr, val,
|
||||
(u64) regs.pc);
|
||||
|
||||
Reference in New Issue
Block a user