From ed3083db8ad1ed54aeadbcf670a2c69175015ae0 Mon Sep 17 00:00:00 2001 From: Giovanni Bajo Date: Thu, 14 Dec 2023 12:13:55 +0100 Subject: [PATCH] Implement N64 register mirroring (#1344) Also slightly improve PI latch emulation. --- ares/n64/ai/io.cpp | 4 ++-- ares/n64/mi/io.cpp | 4 ++-- ares/n64/pi/bus.hpp | 3 ++- ares/n64/pi/io.cpp | 12 ++++++++++-- ares/n64/rdp/io.cpp | 4 ++-- ares/n64/ri/io.cpp | 4 ++-- ares/n64/rsp/io.cpp | 9 ++++----- ares/n64/si/io.cpp | 4 ++-- ares/n64/vi/io.cpp | 4 ++-- 9 files changed, 28 insertions(+), 20 deletions(-) diff --git a/ares/n64/ai/io.cpp b/ares/n64/ai/io.cpp index 56b21853df..ce4694685b 100644 --- a/ares/n64/ai/io.cpp +++ b/ares/n64/ai/io.cpp @@ -1,5 +1,5 @@ auto AI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address != 3) { @@ -22,7 +22,7 @@ auto AI::readWord(u32 address, Thread& thread) -> u32 { } auto AI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/ares/n64/mi/io.cpp b/ares/n64/mi/io.cpp index 9806d558d2..5555b0e2ea 100644 --- a/ares/n64/mi/io.cpp +++ b/ares/n64/mi/io.cpp @@ -1,5 +1,5 @@ auto MI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0xf) >> 2; n32 data; if(address == 0) { @@ -43,7 +43,7 @@ auto MI::readWord(u32 address, Thread& thread) -> u32 { } auto MI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0xf) >> 2; n32 data = data_; if(address == 0) { diff --git a/ares/n64/pi/bus.hpp b/ares/n64/pi/bus.hpp index a75650bb03..ad9b3348f8 100644 --- a/ares/n64/pi/bus.hpp +++ b/ares/n64/pi/bus.hpp @@ -6,7 +6,8 @@ inline auto PI::readWord(u32 address, Thread& thread) -> u32 { return io.busLatch; } thread.step(250 * 2); - return busRead(address); + io.busLatch = busRead(address); + return io.busLatch; } template diff --git a/ares/n64/pi/io.cpp b/ares/n64/pi/io.cpp index 86e866036e..0884439b67 100644 --- a/ares/n64/pi/io.cpp +++ b/ares/n64/pi/io.cpp @@ -1,5 +1,5 @@ auto PI::ioRead(u32 address) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data; if(address == 0) { @@ -70,12 +70,20 @@ auto PI::ioRead(u32 address) -> u32 { data.bit(0,7) = bsd2.releaseDuration; } + if(address == 13) { + data.bit(0,31) = io.busLatch; + } + + if(address == 14) { + data.bit(0,31) = io.busLatch; + } + debugger.io(Read, address, data); return data; } auto PI::ioWrite(u32 address, u32 data_) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data = data_; //only PI_STATUS can be written while PI is busy diff --git a/ares/n64/rdp/io.cpp b/ares/n64/rdp/io.cpp index 992554bbc0..ead06fcde6 100644 --- a/ares/n64/rdp/io.cpp +++ b/ares/n64/rdp/io.cpp @@ -1,5 +1,5 @@ auto RDP::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -57,7 +57,7 @@ auto RDP::readWord(u32 address, Thread& thread) -> u32 { } auto RDP::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/ares/n64/ri/io.cpp b/ares/n64/ri/io.cpp index 6c88fbaac0..f6c37c8f1c 100644 --- a/ares/n64/ri/io.cpp +++ b/ares/n64/ri/io.cpp @@ -1,5 +1,5 @@ auto RI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = 0; if(address == 0) { @@ -59,7 +59,7 @@ auto RI::readWord(u32 address, Thread& thread) -> u32 { } auto RI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/ares/n64/rsp/io.cpp b/ares/n64/rsp/io.cpp index e8f2d6529e..b776f9d485 100644 --- a/ares/n64/rsp/io.cpp +++ b/ares/n64/rsp/io.cpp @@ -7,7 +7,7 @@ auto RSP::readWord(u32 address, Thread& thread) -> u32 { } auto RSP::ioRead(u32 address, Thread &thread) -> u32 { - address = (address & 0x3ffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -76,8 +76,7 @@ auto RSP::writeWord(u32 address, u32 data, Thread& thread) -> void { } auto RSP::ioWrite(u32 address, u32 data_, Thread& thread) -> void { - - address = (address & 0x3ffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { @@ -162,7 +161,7 @@ auto RSP::ioWrite(u32 address, u32 data_, Thread& thread) -> void { } auto RSP::Status::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0x7ffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -183,7 +182,7 @@ auto RSP::Status::readWord(u32 address, Thread& thread) -> u32 { } auto RSP::Status::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0x7ffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/ares/n64/si/io.cpp b/ares/n64/si/io.cpp index 7ea698fd7d..7b3e29dd93 100644 --- a/ares/n64/si/io.cpp +++ b/ares/n64/si/io.cpp @@ -9,7 +9,7 @@ auto SI::readWord(u32 address, Thread& thread) -> u32 { } auto SI::ioRead(u32 address) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data; if(address == 0) { @@ -68,7 +68,7 @@ auto SI::writeWord(u32 address, u32 data, Thread& thread) -> void { } auto SI::ioWrite(u32 address, u32 data_) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x1f) >> 2; n32 data = data_; if(address == 0) { diff --git a/ares/n64/vi/io.cpp b/ares/n64/vi/io.cpp index 01b5a5fafc..8fff654b33 100644 --- a/ares/n64/vi/io.cpp +++ b/ares/n64/vi/io.cpp @@ -1,5 +1,5 @@ auto VI::readWord(u32 address, Thread& thread) -> u32 { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data; if(address == 0) { @@ -96,7 +96,7 @@ auto VI::readWord(u32 address, Thread& thread) -> u32 { } auto VI::writeWord(u32 address, u32 data_, Thread& thread) -> void { - address = (address & 0xfffff) >> 2; + address = (address & 0x3f) >> 2; n32 data = data_; #if defined(VULKAN)