From 38bff121c236e811335792d6e33ca33711daca9a Mon Sep 17 00:00:00 2001 From: Folkert van Heusden Date: Mon, 14 Apr 2025 10:03:05 +0200 Subject: [PATCH] RP07 support --- debugger.cpp | 8 ++++---- main.cpp | 8 ++++---- rp06.cpp | 16 ++++++++++------ rp06.h | 8 ++++---- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/debugger.cpp b/debugger.cpp index c20bbee..79c3ce8 100644 --- a/debugger.cpp +++ b/debugger.cpp @@ -978,7 +978,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto b->getTM11()->show_state(cnsl); else if (parts[1] == "kw11l") b->getKW11_L()->show_state(cnsl); - else if (parts[1] == "rp06") + else if (parts[1] == "rp06" || parts[1] == "rp07") b->getRP06()->show_state(cnsl); else cnsl->put_string_lf(format("Device \"%s\" is not known", parts[1].c_str())); @@ -1116,7 +1116,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto set_boot_loader(b, BL_RK05); else if (parts.at(1) == "rl02") set_boot_loader(b, BL_RL02); - else if (parts.at(1) == "rp06") + else if (parts.at(1) == "rp06" || parts[1] == "rp07") set_boot_loader(b, BL_RP06); else cnsl->put_string_lf("???"); @@ -1313,7 +1313,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto "strace x - start tracing from address - invoke without address to disable", "trl x - set trace run-level (0...3), empty for all", "regdump - dump register contents", - "state x - dump state of a device: rl02, rk05, rp06, mmu, tm11, kw11l or dc11", + "state x - dump state of a device: rl02, rk05, rp06, rp07, mmu, tm11, kw11l or dc11", "mmures x - resolve a virtual address", "qi - show queued interrupts", "setpc x - set PC to value (octal)", @@ -1335,7 +1335,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto "ult - unload tape", "stats - show run statistics", "ramsize x - set ram size (page (8 kB) count, decimal)", - "bl - set bootloader (rl02, rk05 or rp06)", + "bl - set bootloader (rl02, rk05, rp06 or rp07)", "cdc11 - configure DC11 device", "serdc11 - store DC11 device settings", "dserdc11 - load DC11 device settings", diff --git a/main.cpp b/main.cpp index 926e55e..c272132 100644 --- a/main.cpp +++ b/main.cpp @@ -253,7 +253,7 @@ void help() printf("-B run tape file as a unit test (for .BIC files)\n"); printf("-r d.img load file as a disk device\n"); printf("-N host:port use NBD-server as disk device (like -r)\n"); - printf("-R x select disk type (rk05, rl02 or rp06)\n"); + printf("-R x select disk type (rk05, rl02, rp06 or rp07)\n"); printf("-p 123 set CPU start pointer to decimal(!) value\n"); printf("-b enable bootloader (builtin)\n"); printf("-n ncurses UI\n"); @@ -385,7 +385,7 @@ int main(int argc, char *argv[]) case 'R': disk_type = optarg; - if (disk_type != "rk05" && disk_type != "rl02" && disk_type != "rp06") + if (disk_type != "rk05" && disk_type != "rl02" && disk_type != "rp06" && disk_type != "rp07") error_exit(false, "Disk type not known"); break; @@ -489,7 +489,7 @@ int main(int argc, char *argv[]) rl02_dev->begin(); b->add_rl02(rl02_dev); - auto rp06_dev = new rp06(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()); + auto rp06_dev = new rp06(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag(), disk_type == "rp07"); rp06_dev->begin(); b->add_RP06(rp06_dev); @@ -505,7 +505,7 @@ int main(int argc, char *argv[]) for(auto & file: disk_files) rl02_dev->access_disk_backends()->push_back(file); } - else if (disk_type == "rp06") { + else if (disk_type == "rp06" || disk_type == "rp07") { bootloader = BL_RP06; for(auto & file: disk_files) diff --git a/rp06.cpp b/rp06.cpp index f603860..fa0217a 100644 --- a/rp06.cpp +++ b/rp06.cpp @@ -14,18 +14,22 @@ #include "utils.h" -constexpr const unsigned NSECT = 22; // sectors per track -constexpr const unsigned NTRAC = 19; // tracks per cylinder -constexpr const unsigned SECTOR_SIZE = 512; +unsigned NSECT = 22; // sectors per track +unsigned NTRAC = 19; // tracks per cylinder +unsigned SECTOR_SIZE = 512; constexpr const uint16_t default_DS = uint16_t(rp06::ds_bits::DPR) /* drive present */ | uint16_t(rp06::ds_bits::MOL) /* medium on-line */ | uint16_t(rp06::ds_bits::VV) /* volume valid */ | uint16_t(rp06::ds_bits::DRY) /* drive ready */; constexpr const char *regnames[] { "Control", "Status", "Error register 1", "Maintenance", "Attention summary", "Desired sector/track address", "Error register 1", "Look ahead", "Drive type", "Serial no", "Offset", "Desired cylinder address", "Current cylinder address", "Error register 2", "Error register 3", "ECC position", "ECC pattern" }; -rp06::rp06(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity) : +rp06::rp06(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity, const bool is_rp07) : b(b), disk_read_activity (disk_read_activity ), disk_write_activity(disk_write_activity) { + if (is_rp07) { + NSECT = 50; + NTRAC = 32; + } } rp06::~rp06() @@ -51,13 +55,13 @@ void rp06::show_state(console *const cnsl) const JsonDocument rp06::serialize() const { JsonDocument j; - + j["is-rp07"] = is_rp07; return j; } rp06 *rp06::deserialize(const JsonVariantConst j, bus *const b) { - rp06 *r = new rp06(b, nullptr, nullptr); + rp06 *r = new rp06(b, nullptr, nullptr, j["is-rp07"].as()); r->begin(); return r; diff --git a/rp06.h b/rp06.h index f95d2a1..8945764 100644 --- a/rp06.h +++ b/rp06.h @@ -38,9 +38,9 @@ class bus; class rp06: public disk_device { private: - bus *const b; - - uint16_t registers[32] { }; + bus *const b { nullptr }; + bool is_rp07 { false }; + uint16_t registers[32] { }; std::atomic_bool *const disk_read_activity { nullptr }; std::atomic_bool *const disk_write_activity { nullptr }; @@ -50,7 +50,7 @@ private: uint32_t compute_offset() const; public: - rp06(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity); + rp06(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity, const bool is_rp07); virtual ~rp06(); void begin() override;