diff --git a/ESP32/main.ino b/ESP32/main.ino index 1d581cd..517bd84 100644 --- a/ESP32/main.ino +++ b/ESP32/main.ino @@ -305,13 +305,19 @@ void setup() { cnsl = new console_esp32(&stop_event, serial_ports, 80, 25); #endif cnsl->set_bus(b); + cnsl->begin(); running = cnsl->get_running_flag(); - Serial.println(F("Connect RK05 and RL02 to BUS")); - b->add_rk05(new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); + Serial.println(F("Connect RK05 and RL02 devices to BUS")); + auto rk05_dev = new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()); + rk05_dev->begin(); + b->add_rk05(rk05_dev); + + auto rl02_dev = new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()); + rl02_dev->begin(); + b->add_rl02(rl02_dev); - b->add_rl02(new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); Serial.println(F("Init TTY")); tty_ = new tty(cnsl, b); diff --git a/bus.cpp b/bus.cpp index 232d82d..1ab4cc6 100644 --- a/bus.cpp +++ b/bus.cpp @@ -24,6 +24,7 @@ bus::bus() { mmu_ = new mmu(); + mmu_->begin(); kw11_l_ = new kw11_l(this); diff --git a/console.cpp b/console.cpp index f656aed..efb8001 100644 --- a/console.cpp +++ b/console.cpp @@ -46,6 +46,10 @@ console::~console() delete [] screen_buffer; } +void console::begin() +{ +} + void console::start_thread() { assert(b); diff --git a/console.h b/console.h index 6101602..3b8d7bd 100644 --- a/console.h +++ b/console.h @@ -61,6 +61,8 @@ public: console(std::atomic_uint32_t *const stop_event, const int t_width = 80, const int t_height = 25); virtual ~console(); + virtual void begin(); + void set_bus(bus *const b) { this->b = b; } void start_thread(); diff --git a/console_ncurses.cpp b/console_ncurses.cpp index c8803db..9988d46 100644 --- a/console_ncurses.cpp +++ b/console_ncurses.cpp @@ -16,10 +16,6 @@ console_ncurses::console_ncurses(std::atomic_uint32_t *const stop_event): console(stop_event) { init_ncurses(true); - - resize_terminal(); - - th_panel = new std::thread(&console_ncurses::panel_update_thread, this); } console_ncurses::~console_ncurses() @@ -51,6 +47,13 @@ console_ncurses::~console_ncurses() endwin(); } +void console_ncurses::begin() +{ + resize_terminal(); + + th_panel = new std::thread(&console_ncurses::panel_update_thread, this); +} + int console_ncurses::wait_for_char_ll(const short timeout) { struct pollfd fds[] = { { STDIN_FILENO, POLLIN, 0 } }; diff --git a/console_ncurses.h b/console_ncurses.h index 99ca686..ac34082 100644 --- a/console_ncurses.h +++ b/console_ncurses.h @@ -32,6 +32,8 @@ public: console_ncurses(std::atomic_uint32_t *const stop_event); virtual ~console_ncurses(); + void begin() override; + void put_string_lf(const std::string & what) override; void resize_terminal() override; diff --git a/disk_device.h b/disk_device.h index 266fe84..4aa4db3 100644 --- a/disk_device.h +++ b/disk_device.h @@ -18,5 +18,7 @@ public: virtual ~disk_device() { } + virtual void begin() = 0; + std::vector * access_disk_backends() { return &fhs; } }; diff --git a/main.cpp b/main.cpp index c816370..537f56e 100644 --- a/main.cpp +++ b/main.cpp @@ -534,9 +534,13 @@ int main(int argc, char *argv[]) if (enable_bootloader) set_boot_loader(b, bootloader); - b->add_rk05(new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); + auto rk05_dev = new rk05(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()); + rk05_dev->begin(); + b->add_rk05(rk05_dev); - b->add_rl02(new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag())); + auto rl02_dev = new rl02(b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()); + rl02_dev->begin(); + b->add_rl02(rl02_dev); } else { FILE *fh = fopen(deserialize.c_str(), "r"); @@ -566,6 +570,7 @@ int main(int argc, char *argv[]) } cnsl->set_bus(b); + cnsl->begin(); running = cnsl->get_running_flag(); diff --git a/mmu.cpp b/mmu.cpp index dddacca..b0cf558 100644 --- a/mmu.cpp +++ b/mmu.cpp @@ -9,13 +9,17 @@ mmu::mmu() { - reset(); } mmu::~mmu() { } +void mmu::begin() +{ + reset(); +} + void mmu::reset() { memset(pages, 0x00, sizeof pages); @@ -265,6 +269,7 @@ void mmu::set_par_pdr(const json_t *const j_in, const int run_mode, const bool i mmu *mmu::deserialize(const json_t *const j) { mmu *m = new mmu(); + m->begin(); for(int run_mode=0; run_mode<4; run_mode++) { if (run_mode == 2) diff --git a/mmu.h b/mmu.h index 4b2b4ad..ee8ba4f 100644 --- a/mmu.h +++ b/mmu.h @@ -50,6 +50,8 @@ public: mmu(); virtual ~mmu(); + void begin(); + #if IS_POSIX json_t *serialize() const; static mmu *deserialize(const json_t *const j); diff --git a/rk05.cpp b/rk05.cpp index 2398e54..a824bcb 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -28,7 +28,6 @@ rk05::rk05(bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomi disk_read_acitivity(disk_read_acitivity), disk_write_acitivity(disk_write_acitivity) { - reset(); } rk05::~rk05() @@ -37,6 +36,11 @@ rk05::~rk05() delete fh; } +void rk05::begin() +{ + reset(); +} + void rk05::reset() { memset(registers, 0x00, sizeof registers); diff --git a/rk05.h b/rk05.h index e9b1d3d..f422347 100644 --- a/rk05.h +++ b/rk05.h @@ -42,6 +42,7 @@ public: rk05(bus *const b, std::atomic_bool *const disk_read_acitivity, std::atomic_bool *const disk_write_acitivity); virtual ~rk05(); + void begin() override; void reset() override; uint8_t readByte(const uint16_t addr) override; diff --git a/rl02.cpp b/rl02.cpp index 3b56cce..4411e16 100644 --- a/rl02.cpp +++ b/rl02.cpp @@ -36,7 +36,6 @@ rl02::rl02(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic disk_read_activity (disk_read_activity ), disk_write_activity(disk_write_activity) { - reset(); } rl02::~rl02() @@ -45,6 +44,11 @@ rl02::~rl02() delete fh; } +void rl02::begin() +{ + reset(); +} + void rl02::reset() { memset(registers, 0x00, sizeof registers ); @@ -85,6 +89,7 @@ rl02 *rl02::deserialize(const json_t *const j, bus *const b) std::vector backends; rl02 *r = new rl02(b, nullptr, nullptr); + r->begin(); json_t *j_backends = json_object_get(j, "backends"); for(size_t i=0; i