From 82d6c1ce18150e6c9457598966d073565c4d2754 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Wed, 17 Apr 2024 10:48:15 +0200 Subject: [PATCH] bus address in rk05 is 18 bit --- rk05.cpp | 16 ++++++++++++++-- rk05.h | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/rk05.cpp b/rk05.cpp index a60915a..1c8f073 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -83,6 +83,18 @@ uint16_t rk05::readWord(const uint16_t addr) return vtemp; } +void rk05::update_bus_address(const uint16_t v) +{ + uint32_t org_v = registers[(RK05_BA - RK05_BASE) / 2] | (uint32_t((registers[(RK05_CS - RK05_BASE) / 2] >> 4) & 3) << 16); + + org_v += v; + + registers[(RK05_BA - RK05_BASE) / 2] = org_v; + + registers[(RK05_CS - RK05_BASE) / 2] &= ~(3 << 4); + registers[(RK05_CS - RK05_BASE) / 2] |= ((org_v >> 16) & 3) << 4; +} + void rk05::writeByte(const uint16_t addr, const uint8_t v) { uint16_t vtemp = registers[(addr - RK05_BASE) / 2]; @@ -137,7 +149,7 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) if (v & 2048) DOLOG(debug, false, "RK05 inhibit BA increase"); else - registers[(RK05_BA - RK05_BASE) / 2] += reclen; + update_bus_address(reclen); if (++sector >= 12) { sector = 0; @@ -178,7 +190,7 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) b->writeUnibusByte(p++, xfer_buffer[i]); if ((v & 2048) == 0) - registers[(RK05_BA - RK05_BASE) / 2] += 2; + update_bus_address(2); } temp -= cur; diff --git a/rk05.h b/rk05.h index e915888..aa85d14 100644 --- a/rk05.h +++ b/rk05.h @@ -34,6 +34,8 @@ private: std::atomic_bool *const disk_read_acitivity { nullptr }; std::atomic_bool *const disk_write_acitivity { nullptr }; + void update_bus_address(const uint16_t v); + public: rk05(const std::vector & files, bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity); virtual ~rk05();