RP07 support
This commit is contained in:
parent
b4a4606200
commit
38bff121c2
4 changed files with 22 additions and 18 deletions
|
@ -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",
|
||||||
|
|
8
main.cpp
8
main.cpp
|
@ -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)
|
||||||
|
|
16
rp06.cpp
16
rp06.cpp
|
@ -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
6
rp06.h
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue