connect rp06 to bus & bootloader
This commit is contained in:
parent
f967d63913
commit
68539ac29f
8 changed files with 67 additions and 6 deletions
|
@ -348,6 +348,10 @@ void setup() {
|
||||||
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());
|
||||||
|
rp06_dev->begin();
|
||||||
|
b->add_rp06(rp06_dev);
|
||||||
|
|
||||||
cs->println("* Adding TTY");
|
cs->println("* Adding TTY");
|
||||||
tty_ = new tty(cnsl, b);
|
tty_ = new tty(cnsl, b);
|
||||||
b->add_tty(tty_);
|
b->add_tty(tty_);
|
||||||
|
|
1
ESP32/rp06.cpp
Symbolic link
1
ESP32/rp06.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../rp06.cpp
|
1
ESP32/rp06.h
Symbolic link
1
ESP32/rp06.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../rp06.h
|
23
bus.cpp
23
bus.cpp
|
@ -43,6 +43,7 @@ bus::~bus()
|
||||||
delete mmu_;
|
delete mmu_;
|
||||||
delete m;
|
delete m;
|
||||||
delete dc11_;
|
delete dc11_;
|
||||||
|
delete rp06_;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonDocument bus::serialize() const
|
JsonDocument bus::serialize() const
|
||||||
|
@ -73,6 +74,9 @@ JsonDocument bus::serialize() const
|
||||||
if (dc11_)
|
if (dc11_)
|
||||||
j_out["dc11"] = dc11_->serialize();
|
j_out["dc11"] = dc11_->serialize();
|
||||||
|
|
||||||
|
if (rp06_)
|
||||||
|
j_out["rp06"] = rp06_->serialize();
|
||||||
|
|
||||||
// TODO: tm11
|
// TODO: tm11
|
||||||
|
|
||||||
return j_out;
|
return j_out;
|
||||||
|
@ -109,6 +113,9 @@ bus *bus::deserialize(const JsonDocument j, console *const cnsl, std::atomic_uin
|
||||||
if (j.containsKey("dc11"))
|
if (j.containsKey("dc11"))
|
||||||
b->add_DC11(dc11::deserialize(j["dc11"], b));
|
b->add_DC11(dc11::deserialize(j["dc11"], b));
|
||||||
|
|
||||||
|
if (j.containsKey("rp06"))
|
||||||
|
b->add_RP06(rp06::deserialize(j["rp06"], b));
|
||||||
|
|
||||||
// TODO: tm11
|
// TODO: tm11
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
|
@ -153,6 +160,14 @@ void bus::reset()
|
||||||
kw11_l_->reset();
|
kw11_l_->reset();
|
||||||
if (dc11_)
|
if (dc11_)
|
||||||
dc11_->reset();
|
dc11_->reset();
|
||||||
|
if (rp06_)
|
||||||
|
rp06_->reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bus::add_RP06(rp06 *const rp06_)
|
||||||
|
{
|
||||||
|
delete this->rp06_;
|
||||||
|
this->rp06_ = rp06_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bus::add_KW11_L(kw11_l *const kw11_l_)
|
void bus::add_KW11_L(kw11_l *const kw11_l_)
|
||||||
|
@ -465,6 +480,9 @@ uint16_t bus::read(const uint16_t addr_in, const word_mode_t word_mode, const rm
|
||||||
if (dc11_ && a >= DC11_BASE && a < DC11_END && !peek_only)
|
if (dc11_ && a >= DC11_BASE && a < DC11_END && !peek_only)
|
||||||
return word_mode == wm_byte ? dc11_->read_byte(a) : dc11_->read_word(a);
|
return word_mode == wm_byte ? dc11_->read_byte(a) : dc11_->read_word(a);
|
||||||
|
|
||||||
|
if (rp06_ && a >= RP06_BASE && a < RP06_END && !peek_only)
|
||||||
|
return word_mode == wm_byte ? rp06_->read_byte(a) : rp06_->read_word(a);
|
||||||
|
|
||||||
// LO size register field must be all 1s, so subtract 1
|
// LO size register field must be all 1s, so subtract 1
|
||||||
uint32_t system_size = m->get_memory_size() / 64 - 1;
|
uint32_t system_size = m->get_memory_size() / 64 - 1;
|
||||||
|
|
||||||
|
@ -721,6 +739,11 @@ write_rc_t bus::write(const uint16_t addr_in, const word_mode_t word_mode, uint1
|
||||||
return { false };
|
return { false };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rp06_ && a >= RP06_BASE && a < RP06_END) {
|
||||||
|
word_mode == wm_byte ? rp06_->write_byte(a, value) : rp06_->write_word(a, value);
|
||||||
|
return { false };
|
||||||
|
}
|
||||||
|
|
||||||
if (a >= 0172100 && a <= 0172137) { // MM11-LP parity
|
if (a >= 0172100 && a <= 0172137) { // MM11-LP parity
|
||||||
TRACE("WRITE-I/O MM11-LP parity (%06o): %o", a, value);
|
TRACE("WRITE-I/O MM11-LP parity (%06o): %o", a, value);
|
||||||
return { false };
|
return { false };
|
||||||
|
|
3
bus.h
3
bus.h
|
@ -15,6 +15,7 @@
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
#include "rk05.h"
|
#include "rk05.h"
|
||||||
#include "rl02.h"
|
#include "rl02.h"
|
||||||
|
#include "rp06.h"
|
||||||
#include "tm-11.h"
|
#include "tm-11.h"
|
||||||
|
|
||||||
#if defined(BUILD_FOR_RP2040)
|
#if defined(BUILD_FOR_RP2040)
|
||||||
|
@ -70,6 +71,7 @@ private:
|
||||||
mmu *mmu_ { nullptr };
|
mmu *mmu_ { nullptr };
|
||||||
memory *m { nullptr };
|
memory *m { nullptr };
|
||||||
dc11 *dc11_ { nullptr };
|
dc11 *dc11_ { nullptr };
|
||||||
|
rp06 *rp06_ { nullptr };
|
||||||
|
|
||||||
uint16_t microprogram_break_register { 0 };
|
uint16_t microprogram_break_register { 0 };
|
||||||
|
|
||||||
|
@ -107,6 +109,7 @@ public:
|
||||||
void add_DC11 (dc11 *const dc11_ );
|
void add_DC11 (dc11 *const dc11_ );
|
||||||
// required to release devices when doing a reload
|
// required to release devices when doing a reload
|
||||||
void del_DC11 ();
|
void del_DC11 ();
|
||||||
|
void add_RP06 (rp06 *const rp06_ );
|
||||||
|
|
||||||
memory *getRAM() { return m; }
|
memory *getRAM() { return m; }
|
||||||
cpu *getCpu() { return c; }
|
cpu *getCpu() { return c; }
|
||||||
|
|
22
debugger.cpp
22
debugger.cpp
|
@ -346,7 +346,7 @@ std::optional<disk_backend *> select_disk_backend(console *const cnsl)
|
||||||
|
|
||||||
void configure_disk(bus *const b, console *const cnsl)
|
void configure_disk(bus *const b, console *const cnsl)
|
||||||
{
|
{
|
||||||
int type_ch = wait_for_key("1. RK05, 2. RL02, 9. abort", cnsl, { '1', '2', '3', '9' });
|
int type_ch = wait_for_key("1. RK05, 2. RL02, 3. RP06, 9. abort", cnsl, { '1', '2', '3', '9' });
|
||||||
|
|
||||||
bootloader_t bl = BL_NONE;
|
bootloader_t bl = BL_NONE;
|
||||||
disk_device *dd = nullptr;
|
disk_device *dd = nullptr;
|
||||||
|
@ -359,6 +359,10 @@ void configure_disk(bus *const b, console *const cnsl)
|
||||||
dd = b->getRL02();
|
dd = b->getRL02();
|
||||||
bl = BL_RL02;
|
bl = BL_RL02;
|
||||||
}
|
}
|
||||||
|
else if (type_ch == '3') {
|
||||||
|
dd = b->getRP06();
|
||||||
|
bl = BL_RP06;
|
||||||
|
}
|
||||||
else if (type_ch == '9') {
|
else if (type_ch == '9') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -878,6 +882,8 @@ 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")
|
||||||
|
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()));
|
||||||
|
|
||||||
|
@ -1000,8 +1006,14 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (parts[0] == "bl" && parts.size() == 2) {
|
else if (parts[0] == "bl" && parts.size() == 2) {
|
||||||
set_boot_loader(b, parts.at(1) == "rk05" ? BL_RK05 : BL_RL02);
|
if (parts.at(1) == "rk05")
|
||||||
cnsl->put_string_lf("Bootloader set");
|
set_boot_loader(b, BL_RK05);
|
||||||
|
else if (parts.at(1) == "rl02")
|
||||||
|
set_boot_loader(b, BL_RL02);
|
||||||
|
else if (parts.at(1) == "rp06")
|
||||||
|
set_boot_loader(b, BL_RP06);
|
||||||
|
else
|
||||||
|
cnsl->put_string_lf("???");
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1195,7 +1207,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, mmu, tm11, kw11l or dc11",
|
"state x - dump state of a device: rl02, rk05, rp06, 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",
|
"setpc x - set PC to value",
|
||||||
|
@ -1209,7 +1221,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 or rk05)",
|
"bl - set bootloader (rl02, rk05 or rp06)",
|
||||||
"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",
|
||||||
|
|
17
loaders.cpp
17
loaders.cpp
|
@ -137,6 +137,23 @@ void set_boot_loader(bus *const b, const bootloader_t which)
|
||||||
|
|
||||||
bl = rl02_code;
|
bl = rl02_code;
|
||||||
}
|
}
|
||||||
|
else if (which == BL_RP6) {
|
||||||
|
start = offset = 01000;
|
||||||
|
|
||||||
|
static const uint16_t rp06_code[] = {
|
||||||
|
0012700, // MOV #0176704,R0
|
||||||
|
0176704,
|
||||||
|
0012740, // MOV #177000,-(R0)
|
||||||
|
0177000,
|
||||||
|
0012740, // MOV #071, -(R0)
|
||||||
|
0000071,
|
||||||
|
00, // HALT
|
||||||
|
};
|
||||||
|
|
||||||
|
size = sizeof(rp06_code)/sizeof(rp06_code[0]);
|
||||||
|
|
||||||
|
bl = rp06_code;
|
||||||
|
}
|
||||||
|
|
||||||
for(uint16_t i=0; i<size; i++)
|
for(uint16_t i=0; i<size; i++)
|
||||||
b->write_word(uint16_t(offset + i * 2), bl[i]);
|
b->write_word(uint16_t(offset + i * 2), bl[i]);
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#include "bus.h"
|
#include "bus.h"
|
||||||
|
|
||||||
|
|
||||||
typedef enum { BL_NONE, BL_RK05, BL_RL02 } bootloader_t;
|
typedef enum { BL_NONE, BL_RK05, BL_RL02, BL_RP06 } bootloader_t;
|
||||||
|
|
||||||
void loadbin(bus *const b, uint16_t base, const char *const file);
|
void loadbin(bus *const b, uint16_t base, const char *const file);
|
||||||
void set_boot_loader(bus *const b, const bootloader_t which);
|
void set_boot_loader(bus *const b, const bootloader_t which);
|
||||||
|
|
Loading…
Add table
Reference in a new issue