diff --git a/rl02.cpp b/rl02.cpp index 6679195..efd432f 100644 --- a/rl02.cpp +++ b/rl02.cpp @@ -89,7 +89,12 @@ void rl02::writeByte(const uint16_t addr, const uint8_t v) writeWord(addr, vtemp); } -uint32_t rl02::calcOffset(const uint16_t da) +uint32_t rl02::get_bus_address() const +{ + return registers[(RL02_BAR - RL02_BASE) / 2] | (uint32_t((registers[(RL02_CSR - RL02_BASE) / 2] >> 4) & 3) << 16); +} + +uint32_t rl02::calcOffset(const uint16_t da) const { int sector = da & 63; int track = (da >> 6) & 1023; @@ -124,7 +129,7 @@ void rl02::writeWord(const uint16_t addr, uint16_t v) uint32_t temp_disk_offset = disk_offset; - uint32_t memory_address = registers[(RL02_BAR - RL02_BASE) / 2]; + uint32_t memory_address = get_bus_address(); uint32_t count = (65536l - registers[(RL02_MPR - RL02_BASE) / 2]) * 2; @@ -140,7 +145,7 @@ void rl02::writeWord(const uint16_t addr, uint16_t v) } for(uint32_t i=0; iwriteByte(p, xfer_buffer[i]); + b->writeUnibusByte(p, xfer_buffer[i]); temp_disk_offset += cur; @@ -150,7 +155,7 @@ void rl02::writeWord(const uint16_t addr, uint16_t v) if (registers[(RL02_CSR - RL02_BASE) / 2] & 64) { // interrupt enable? DOLOG(debug, false, "RL02 triggering interrupt"); - b->getCpu()->queue_interrupt(5, 0254); + b->getCpu()->queue_interrupt(5, 0160); } *disk_read_acitivity = false; diff --git a/rl02.h b/rl02.h index ea08179..1ca7d4b 100644 --- a/rl02.h +++ b/rl02.h @@ -32,7 +32,8 @@ private: std::atomic_bool *const disk_read_acitivity { nullptr }; std::atomic_bool *const disk_write_acitivity { nullptr }; - uint32_t calcOffset(uint16_t); + uint32_t get_bus_address() const; + uint32_t calcOffset(uint16_t) const; public: rl02(const std::vector & files, bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity);