RP07 support

This commit is contained in:
Folkert van Heusden 2025-04-14 10:03:05 +02:00
parent b4a4606200
commit 38bff121c2
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
4 changed files with 22 additions and 18 deletions

View file

@ -978,7 +978,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto
b->getTM11()->show_state(cnsl); b->getTM11()->show_state(cnsl);
else if (parts[1] == "kw11l") else if (parts[1] == "kw11l")
b->getKW11_L()->show_state(cnsl); b->getKW11_L()->show_state(cnsl);
else if (parts[1] == "rp06") else if (parts[1] == "rp06" || parts[1] == "rp07")
b->getRP06()->show_state(cnsl); b->getRP06()->show_state(cnsl);
else else
cnsl->put_string_lf(format("Device \"%s\" is not known", parts[1].c_str())); 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); set_boot_loader(b, BL_RK05);
else if (parts.at(1) == "rl02") else if (parts.at(1) == "rl02")
set_boot_loader(b, BL_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); set_boot_loader(b, BL_RP06);
else else
cnsl->put_string_lf("???"); 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", "strace x - start tracing from address - invoke without address to disable",
"trl x - set trace run-level (0...3), empty for all", "trl x - set trace run-level (0...3), empty for all",
"regdump - dump register contents", "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", "mmures x - resolve a virtual address",
"qi - show queued interrupts", "qi - show queued interrupts",
"setpc x - set PC to value (octal)", "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", "ult - unload tape",
"stats - show run statistics", "stats - show run statistics",
"ramsize x - set ram size (page (8 kB) count, decimal)", "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", "cdc11 - configure DC11 device",
"serdc11 - store DC11 device settings", "serdc11 - store DC11 device settings",
"dserdc11 - load DC11 device settings", "dserdc11 - load DC11 device settings",

View file

@ -253,7 +253,7 @@ void help()
printf("-B run tape file as a unit test (for .BIC files)\n"); 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("-r d.img load file as a disk device\n");
printf("-N host:port use NBD-server as disk device (like -r)\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("-p 123 set CPU start pointer to decimal(!) value\n");
printf("-b enable bootloader (builtin)\n"); printf("-b enable bootloader (builtin)\n");
printf("-n ncurses UI\n"); printf("-n ncurses UI\n");
@ -385,7 +385,7 @@ int main(int argc, char *argv[])
case 'R': case 'R':
disk_type = optarg; 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"); error_exit(false, "Disk type not known");
break; break;
@ -489,7 +489,7 @@ int main(int argc, char *argv[])
rl02_dev->begin(); rl02_dev->begin();
b->add_rl02(rl02_dev); 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(); rp06_dev->begin();
b->add_RP06(rp06_dev); b->add_RP06(rp06_dev);
@ -505,7 +505,7 @@ int main(int argc, char *argv[])
for(auto & file: disk_files) for(auto & file: disk_files)
rl02_dev->access_disk_backends()->push_back(file); rl02_dev->access_disk_backends()->push_back(file);
} }
else if (disk_type == "rp06") { else if (disk_type == "rp06" || disk_type == "rp07") {
bootloader = BL_RP06; bootloader = BL_RP06;
for(auto & file: disk_files) for(auto & file: disk_files)

View file

@ -14,18 +14,22 @@
#include "utils.h" #include "utils.h"
constexpr const unsigned NSECT = 22; // sectors per track unsigned NSECT = 22; // sectors per track
constexpr const unsigned NTRAC = 19; // tracks per cylinder unsigned NTRAC = 19; // tracks per cylinder
constexpr const unsigned SECTOR_SIZE = 512; 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 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" }; 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), b(b),
disk_read_activity (disk_read_activity ), disk_read_activity (disk_read_activity ),
disk_write_activity(disk_write_activity) disk_write_activity(disk_write_activity)
{ {
if (is_rp07) {
NSECT = 50;
NTRAC = 32;
}
} }
rp06::~rp06() rp06::~rp06()
@ -51,13 +55,13 @@ void rp06::show_state(console *const cnsl) const
JsonDocument rp06::serialize() const JsonDocument rp06::serialize() const
{ {
JsonDocument j; JsonDocument j;
j["is-rp07"] = is_rp07;
return j; return j;
} }
rp06 *rp06::deserialize(const JsonVariantConst j, bus *const b) 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<bool>());
r->begin(); r->begin();
return r; return r;

6
rp06.h
View file

@ -38,8 +38,8 @@ class bus;
class rp06: public disk_device class rp06: public disk_device
{ {
private: private:
bus *const b; bus *const b { nullptr };
bool is_rp07 { false };
uint16_t registers[32] { }; uint16_t registers[32] { };
std::atomic_bool *const disk_read_activity { nullptr }; std::atomic_bool *const disk_read_activity { nullptr };
@ -50,7 +50,7 @@ private:
uint32_t compute_offset() const; uint32_t compute_offset() const;
public: 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(); virtual ~rp06();
void begin() override; void begin() override;