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);
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",

View file

@ -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)

View file

@ -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<bool>());
r->begin();
return r;

8
rp06.h
View file

@ -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;