diff --git a/ares/n64/cartridge/cartridge.cpp b/ares/n64/cartridge/cartridge.cpp index 4be91ef257..36d430b197 100644 --- a/ares/n64/cartridge/cartridge.cpp +++ b/ares/n64/cartridge/cartridge.cpp @@ -47,10 +47,12 @@ auto Cartridge::connect() -> void { rtc.load(); - isviewer.ram.allocate(64_KiB); - isviewer.tracer = node->append("ISViewer", "Cartridge"); - isviewer.tracer->setAutoLineBreak(false); - isviewer.tracer->setTerminal(true); + if(rom.size <= 0x03fe'ffff && system.homebrewMode) { + isviewer.ram.allocate(64_KiB); + isviewer.tracer = node->append("ISViewer", "Cartridge"); + isviewer.tracer->setAutoLineBreak(false); + isviewer.tracer->setTerminal(true); + } debugger.load(node); diff --git a/ares/n64/cartridge/cartridge.hpp b/ares/n64/cartridge/cartridge.hpp index 23a2c6d878..9efbf30a4a 100644 --- a/ares/n64/cartridge/cartridge.hpp +++ b/ares/n64/cartridge/cartridge.hpp @@ -42,6 +42,8 @@ struct Cartridge { Memory::Writable ram; //unserialized Node::Debugger::Tracer::Notification tracer; + auto enabled() -> bool { return ram.size; } + //isviewer.cpp auto messageChar(char c) -> void; auto readHalf(u32 address) -> u16; diff --git a/ares/n64/pi/bus.hpp b/ares/n64/pi/bus.hpp index ad9b3348f8..893e855ff6 100644 --- a/ares/n64/pi/bus.hpp +++ b/ares/n64/pi/bus.hpp @@ -43,13 +43,13 @@ inline auto PI::busRead(u32 address) -> u32 { if(cartridge.flash) return cartridge.flash.read(address); return unmapped; } - if(address <= 0x13fe'ffff) { - if(cartridge.rom ) return cartridge.rom.read(address); - return unmapped; + if(cartridge.isviewer.enabled() && address >= 0x13f0'0000 && address <= 0x13ff'ffff) { + return cartridge.isviewer.read(address); + } + if(address <= 0x1000'0000 + cartridge.rom.size - 1) { + return cartridge.rom.read(address); } - if(address <= 0x13ff'ffff) return cartridge.isviewer.read(address); - if(address <= 0x7fff'ffff) return unmapped; - return unmapped; //accesses here actually lock out the RCP + return unmapped; } inline auto PI::writeWord(u32 address, u32 data, Thread& thread) -> void { @@ -93,18 +93,19 @@ inline auto PI::busWrite(u32 address, u32 data) -> void { if(cartridge.flash) return cartridge.flash.write(address, data); return; } - if(address <= 0x13fe'ffff) { - if(cartridge.rom ) return cartridge.rom.write(address, data); - return; - } - if(address <= 0x13ff'ffff) { - if(system.homebrewMode) { + if(address >= 0x13f0'0000 && address <= 0x13ff'ffff) { + if(cartridge.isviewer.enabled()) { writeForceFinish(); //Debugging channel for homebrew, be gentle return cartridge.isviewer.write(address, data); - } else { + } else if (!system.homebrewMode) { debug(unhandled, "[PI::busWrite] attempt to write to ISViewer: enable homebrew mode in settings to enable ISViewer emulation"); + } else { + debug(unhandled, "[PI::busWrite] attempt to write to ISViewer: ROM is too big so ISViewer is disabled"); } } + if(address <= 0x1000'0000 + cartridge.rom.size - 1) { + return cartridge.rom.write(address, data); + } if(address <= 0x7fff'ffff) return; }