From b44c6ffa31aa003521b39d458ef71308f7f1c079 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Fri, 18 Mar 2022 19:28:13 +0100 Subject: [PATCH 1/5] wip --- cpu.cpp | 19 +++++++++---------- cpu.h | 1 + rk05.cpp | 14 +++++++++----- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/cpu.cpp b/cpu.cpp index f097165..363269e 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -1104,18 +1104,17 @@ void cpu::busError() { fprintf(stderr, "BUS ERROR\n"); - // PSW = 177776 - // mov @#PSW, -(sp) + trap(4); +} + +void cpu::trap(const uint16_t vector) +{ + fprintf(stderr, "TRAP %o\n", vector); + pushStack(getPSW()); - - // mov pc, -(sp) pushStack(getPC()); - - // mov @#VEC+2, @#PSW - setPSW(b -> readWord(6)); - - // mov @#VEC, pc - setPC(b -> readWord(4)); + setPSW(b -> readWord(vector + 2)); + setPC(b -> readWord(vector + 0)); } std::pair cpu::addressing_to_string(const uint8_t mode_register, const uint16_t pc) diff --git a/cpu.h b/cpu.h index 4344a6f..843b50b 100644 --- a/cpu.h +++ b/cpu.h @@ -58,6 +58,7 @@ public: uint16_t popStack(); void busError(); + void trap(const uint16_t vector); void setEmulateMFPT(const bool v) { emulateMFPT = v; } diff --git a/rk05.cpp b/rk05.cpp index d9b5e91..c727ea3 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -4,6 +4,7 @@ #include #include "bus.h" +#include "cpu.h" #include "error.h" #include "gen.h" #include "rk05.h" @@ -222,9 +223,9 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) while(temp > 0) { uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), temp); +#if defined(ESP32) yield(); -#if defined(ESP32) if (fh.read(xfer_buffer, cur) != size_t(cur)) D(fprintf(stderr, "RK05 fread error: %s\n", strerror(errno));) #else @@ -265,11 +266,14 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) fprintf(stderr, "RK05 command %d UNHANDLED\n", func); } - if (v & 64) { // bit 6, invoke interrupt when done vector address 220, see http://www.pdp-11.nl/peripherals/disk/rk05-info.html - fprintf(stderr, "RK05 HIER\n"); // FIXME - } - registers[(RK05_WC - RK05_BASE) / 2] = 0; + + registers[(RK05_DS - RK05_BASE) / 2] |= 64; // drive ready + registers[(RK05_CS - RK05_BASE) / 2] |= 128; // control ready + + if (v & 64) { // bit 6, invoke interrupt when done vector address 220, see http://www.pdp-11.nl/peripherals/disk/rk05-info.html + b->getCpu()->trap(0220); + } } } From 171afe7af9c1ae3396c5961a984c68298fd5e33b Mon Sep 17 00:00:00 2001 From: Folkert van Heusden Date: Sat, 19 Mar 2022 09:03:17 +0100 Subject: [PATCH 2/5] debug log new PC address after trap --- cpu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpu.cpp b/cpu.cpp index 363269e..e049bd6 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -1109,12 +1109,12 @@ void cpu::busError() void cpu::trap(const uint16_t vector) { - fprintf(stderr, "TRAP %o\n", vector); - pushStack(getPSW()); pushStack(getPC()); setPSW(b -> readWord(vector + 2)); setPC(b -> readWord(vector + 0)); + + fprintf(stderr, "TRAP %o: PC is now %06o\n", vector, getPC()); } std::pair cpu::addressing_to_string(const uint8_t mode_register, const uint16_t pc) From 44f08ad6e907811186233a34b1c01765e7d98359 Mon Sep 17 00:00:00 2001 From: Folkert van Heusden Date: Sat, 19 Mar 2022 09:04:15 +0100 Subject: [PATCH 3/5] rk05: update register first to not overwrite it at function exit --- rk05.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rk05.cpp b/rk05.cpp index c727ea3..0a717c2 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -150,6 +150,9 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) const int reg = (addr - RK05_BASE) / 2; fprintf(stderr, "RK05 write %s/%o: %o\n", regnames[reg], addr, v); + D(fprintf(stderr, "set register %o to %o\n", addr, v);) + registers[reg] = v; + if (addr == RK05_CS) { if (v & 1) { // GO const int func = (v >> 1) & 7; // FUNCTION @@ -277,9 +280,6 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) } } - D(fprintf(stderr, "set register %o to %o\n", addr, v);) - registers[reg] = v; - #if defined(ESP32) digitalWrite(LED_BUILTIN, HIGH); #endif From b3fd4994a81dd283559754b1f349543ff7dc735b Mon Sep 17 00:00:00 2001 From: Folkert van Heusden Date: Sat, 19 Mar 2022 09:03:17 +0100 Subject: [PATCH 4/5] debug log new PC address after trap --- cpu.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cpu.cpp b/cpu.cpp index f097165..72a2bd5 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -1104,18 +1104,18 @@ void cpu::busError() { fprintf(stderr, "BUS ERROR\n"); - // PSW = 177776 - // mov @#PSW, -(sp) - pushStack(getPSW()); + trap(4); +} - // mov pc, -(sp) +void cpu::trap(const uint16_t vector) +{ + pushStack(getPSW()); pushStack(getPC()); - // mov @#VEC+2, @#PSW - setPSW(b -> readWord(6)); + setPSW(b->readWord(vector + 2)); + setPC (b->readWord(vector + 0)); - // mov @#VEC, pc - setPC(b -> readWord(4)); + fprintf(stderr, "TRAP %o: PC is now %06o\n", vector, getPC()); } std::pair cpu::addressing_to_string(const uint8_t mode_register, const uint16_t pc) From edf94487af4f3a8f687c17affdf8c10375b59c0c Mon Sep 17 00:00:00 2001 From: Folkert van Heusden Date: Sat, 19 Mar 2022 09:04:15 +0100 Subject: [PATCH 5/5] rk05: update register first to not overwrite it at function exit --- rk05.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rk05.cpp b/rk05.cpp index d9b5e91..d725769 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -149,6 +149,9 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) const int reg = (addr - RK05_BASE) / 2; fprintf(stderr, "RK05 write %s/%o: %o\n", regnames[reg], addr, v); + D(fprintf(stderr, "set register %o to %o\n", addr, v);) + registers[reg] = v; + if (addr == RK05_CS) { if (v & 1) { // GO const int func = (v >> 1) & 7; // FUNCTION @@ -273,9 +276,6 @@ void rk05::writeWord(const uint16_t addr, uint16_t v) } } - D(fprintf(stderr, "set register %o to %o\n", addr, v);) - registers[reg] = v; - #if defined(ESP32) digitalWrite(LED_BUILTIN, HIGH); #endif