From ccf4b6268f284b0e1f738cae527f29bb282d8e80 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Tue, 14 May 2024 19:44:32 +0200 Subject: [PATCH] a few compile fixes --- CMakeLists.txt | 5 ----- README.md | 1 - bus.cpp | 14 +++++++------- cpu.cpp | 8 ++++---- cpu.h | 4 ++-- debugger.cpp | 2 +- disk_backend.cpp | 29 +++++++++++++---------------- disk_backend.h | 8 ++++---- disk_backend_file.cpp | 8 ++++---- disk_backend_file.h | 4 ++-- disk_backend_nbd.cpp | 18 ++++++++---------- disk_backend_nbd.h | 6 ++---- kw11-l.cpp | 6 +++--- kw11-l.h | 4 ++-- main.cpp | 21 +++++++++++++-------- memory.cpp | 6 +++--- memory.h | 4 ++-- mmu.cpp | 18 +++++++++--------- mmu.h | 8 ++++---- rk05.cpp | 8 ++++---- rk05.h | 4 ++-- rl02.cpp | 8 ++++---- rl02.h | 4 ++-- tty.cpp | 10 +++++----- tty.h | 4 ++-- 25 files changed, 102 insertions(+), 110 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bc82ad..258c488 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,11 +62,6 @@ target_link_libraries(kek ${PANEL_LIBRARIES}) target_include_directories(kek PUBLIC ${PANEL_INCLUDE_DIRS}) target_compile_options(kek PUBLIC ${PANEL_CFLAGS_OTHER}) -pkg_check_modules(JANSSON REQUIRED jansson) -target_link_libraries(kek ${JANSSON_LIBRARIES}) -target_include_directories(kek PUBLIC ${JANSSON_INCLUDE_DIRS}) -target_compile_options(kek PUBLIC ${JANSSON_CFLAGS_OTHER}) - endif (NOT WIN32) if (WIN32) diff --git a/README.md b/README.md index 4bc8fbc..52da4db 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ To build for e.g. linux: Required: * libncursesw5-dev - * libjansson-dev To build for e.g. windows: diff --git a/bus.cpp b/bus.cpp index 49f203c..3adf02d 100644 --- a/bus.cpp +++ b/bus.cpp @@ -81,27 +81,27 @@ bus *bus::deserialize(const JsonDocument j, console *const cnsl, std::atomic_uin memory *m = nullptr; if (j.containsKey("memory")) { - m = memory::deserialize(j["memory"].as()); + m = memory::deserialize(j["memory"].as()); b->add_ram(m); } if (j.containsKey("kw11-l")) - b->add_KW11_L(kw11_l::deserialize(j["kw11-l"].as(), b, cnsl)); + b->add_KW11_L(kw11_l::deserialize(j["kw11-l"].as(), b, cnsl)); if (j.containsKey("tty")) - b->add_tty(tty::deserialize(j["tty"].as(), b, cnsl)); + b->add_tty(tty::deserialize(j["tty"].as(), b, cnsl)); if (j.containsKey("mmu")) - b->add_mmu(mmu::deserialize(j["mmu"].as(), m)); + b->add_mmu(mmu::deserialize(j["mmu"].as(), m)); if (j.containsKey("cpu")) - b->add_cpu(cpu::deserialize(j["cpu"].as(), b, event)); + b->add_cpu(cpu::deserialize(j["cpu"].as(), b, event)); if (j.containsKey("rl02")) - b->add_rl02(rl02::deserialize(j["rl02"].as(), b)); + b->add_rl02(rl02::deserialize(j["rl02"].as(), b)); if (j.containsKey("rk05")) - b->add_rk05(rk05::deserialize(j["rk05"].as(), b)); + b->add_rk05(rk05::deserialize(j["rk05"].as(), b)); // TODO: tm11, dc11 diff --git a/cpu.cpp b/cpu.cpp index 508a9e1..a4d06bd 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -2434,9 +2434,9 @@ void cpu::step() } } -JsonDocument cpu::serialize() +JsonVariant cpu::serialize() { - JsonDocument j; + JsonVariant j; for(int set=0; set<2; set++) { for(int regnr=0; regnr<6; regnr++) @@ -2461,7 +2461,7 @@ JsonDocument cpu::serialize() if (trap_delay.has_value()) j["trap_delay"] = trap_delay.value(); - JsonDocument j_queued_interrupts; + JsonVariant j_queued_interrupts; for(auto & il: queued_interrupts) { JsonArray ja_qi_level; for(auto v: il.second) @@ -2477,7 +2477,7 @@ JsonDocument cpu::serialize() return j; } -cpu *cpu::deserialize(const JsonDocument j, bus *const b, std::atomic_uint32_t *const event) +cpu *cpu::deserialize(const JsonVariant j, bus *const b, std::atomic_uint32_t *const event) { cpu *c = new cpu(b, event); diff --git a/cpu.h b/cpu.h index 1de9a60..4ea5d97 100644 --- a/cpu.h +++ b/cpu.h @@ -115,8 +115,8 @@ public: explicit cpu(bus *const b, std::atomic_uint32_t *const event); ~cpu(); - JsonDocument serialize(); - static cpu *deserialize(const JsonDocument j, bus *const b, std::atomic_uint32_t *const event); + JsonVariant serialize(); + static cpu *deserialize(const JsonVariant j, bus *const b, std::atomic_uint32_t *const event); std::optional check_breakpoint(); int set_breakpoint(breakpoint *const bp); diff --git a/debugger.cpp b/debugger.cpp index 5948b69..4c4c16c 100644 --- a/debugger.cpp +++ b/debugger.cpp @@ -548,7 +548,7 @@ struct state_writer { void serialize_state(console *const cnsl, const bus *const b, const std::string & filename) { - JsonDocument j = b->serialize(); + JsonVariant j = b->serialize(); bool ok = false; diff --git a/disk_backend.cpp b/disk_backend.cpp index 3c10d0f..bb00df5 100644 --- a/disk_backend.cpp +++ b/disk_backend.cpp @@ -58,12 +58,12 @@ bool disk_backend::store_mem_range_in_overlay(const off_t offset, const size_t n return false; } -JsonDocument disk_backend::serialize_overlay() const +JsonVariant disk_backend::serialize_overlay() const { - JsonDocument out; + JsonVariant out; for(auto & id: overlay) { - JsonDocument j_data; + JsonVariant j_data; for(size_t i=0; i()) { + uint32_t id = std::atoi(kv.key().c_str()); std::vector data; - for(size_t i=0; i()) + data.push_back(v); store_object_in_overlay(id, data); } } -disk_backend *disk_backend::deserialize(const json_t *const j) +disk_backend *disk_backend::deserialize(const JsonVariant j) { - std::string type = json_string_value(json_object_get(j, "disk-backend-type")); + std::string type = j["disk-backend-type"]; disk_backend *d = nullptr; @@ -105,7 +102,7 @@ disk_backend *disk_backend::deserialize(const json_t *const j) else if (type == "nbd") d = disk_backend_nbd::deserialize(j); - // should not be reached + // should not be triggered assert(d); d->deserialize_overlay(j); diff --git a/disk_backend.h b/disk_backend.h index 6fa1da7..3b3faa1 100644 --- a/disk_backend.h +++ b/disk_backend.h @@ -25,15 +25,15 @@ protected: std::optional > get_object_from_overlay(const off_t id); std::optional > get_from_overlay(const off_t offset, const size_t sector_size); - JsonDocument serialize_overlay() const; - void deserialize_overlay(const JsonDocument j); + JsonVariant serialize_overlay() const; + void deserialize_overlay(const JsonVariant j); public: disk_backend(); virtual ~disk_backend(); - virtual JsonDocument serialize() const = 0; - static disk_backend *deserialize(const JsonDocument j); + virtual JsonVariant serialize() const = 0; + static disk_backend *deserialize(const JsonVariant j); virtual std::string get_identifier() const = 0; diff --git a/disk_backend_file.cpp b/disk_backend_file.cpp index 56dfd42..0141037 100644 --- a/disk_backend_file.cpp +++ b/disk_backend_file.cpp @@ -21,9 +21,9 @@ disk_backend_file::~disk_backend_file() close(fd); } -JsonDocument disk_backend_file::serialize() const +JsonVariant disk_backend_file::serialize() const { - JsonDocument j; + JsonVariant j; j["disk-backend-type"] = "file"; @@ -36,11 +36,11 @@ JsonDocument disk_backend_file::serialize() const return j; } -disk_backend_file *disk_backend_file::deserialize(const JsonDocument j) +disk_backend_file *disk_backend_file::deserialize(const JsonVariant j) { // TODO verify checksum of backend // TODO overlay - return new disk_backend_file(j["filename"]); + return new disk_backend_file(j["filename"].as()); } bool disk_backend_file::begin(const bool snapshots) diff --git a/disk_backend_file.h b/disk_backend_file.h index 9fe4978..a05720a 100644 --- a/disk_backend_file.h +++ b/disk_backend_file.h @@ -18,8 +18,8 @@ public: disk_backend_file(const std::string & filename); virtual ~disk_backend_file(); - JsonDocument serialize() const override; - static disk_backend_file *deserialize(const JsonDocument j); + JsonVariant serialize() const override; + static disk_backend_file *deserialize(const JsonVariant j); std::string get_identifier() const override { return filename; } diff --git a/disk_backend_nbd.cpp b/disk_backend_nbd.cpp index 24ea78f..aaa470f 100644 --- a/disk_backend_nbd.cpp +++ b/disk_backend_nbd.cpp @@ -48,28 +48,26 @@ disk_backend_nbd::~disk_backend_nbd() close(fd); } -#if IS_POSIX -json_t *disk_backend_nbd::serialize() const +JsonVariant disk_backend_nbd::serialize() const { - json_t *j = json_object(); + JsonVariant j; - json_object_set(j, "disk-backend-type", json_string("nbd")); + j["disk-backend-type"] = "nbd"; - json_object_set(j, "overlay", serialize_overlay()); + j["overlay"] = serialize_overlay(); // TODO store checksum of backend - json_object_set(j, "host", json_string(host.c_str())); - json_object_set(j, "port", json_integer(port)); + j["host"] = host.c_str(); + j["port"] = port; return j; } -disk_backend_nbd *disk_backend_nbd::deserialize(const json_t *const j) +disk_backend_nbd *disk_backend_nbd::deserialize(const JsonVariant j) { // TODO verify checksum of backend - return new disk_backend_nbd(json_string_value(json_object_get(j, "host")), json_integer_value(json_object_get(j, "port"))); + return new disk_backend_nbd(j["host"], j["port"]); } -#endif bool disk_backend_nbd::begin(const bool snapshots) { diff --git a/disk_backend_nbd.h b/disk_backend_nbd.h index fb369b9..bfab93d 100644 --- a/disk_backend_nbd.h +++ b/disk_backend_nbd.h @@ -22,10 +22,8 @@ public: disk_backend_nbd(const std::string & host, const unsigned port); virtual ~disk_backend_nbd(); -#if IS_POSIX - json_t *serialize() const override; - static disk_backend_nbd *deserialize(const json_t *const j); -#endif + JsonVariant serialize() const override; + static disk_backend_nbd *deserialize(const JsonVariant j); std::string get_identifier() const override { return format("%s:%d", host.c_str(), port); } diff --git a/kw11-l.cpp b/kw11-l.cpp index 4fb7c74..b11e7ef 100644 --- a/kw11-l.cpp +++ b/kw11-l.cpp @@ -216,16 +216,16 @@ uint8_t kw11_l::get_lf_crs() return rc; } -JsonDocument kw11_l::serialize() +JsonVariant kw11_l::serialize() { - JsonDocument j; + JsonVariant j; j["CSR"] = lf_csr; return j; } -kw11_l *kw11_l::deserialize(const json_t *const j, bus *const b, console *const cnsl) +kw11_l *kw11_l::deserialize(const JsonVariant j, bus *const b, console *const cnsl) { uint16_t CSR = j["CSR"]; diff --git a/kw11-l.h b/kw11-l.h index d0e418c..4898679 100644 --- a/kw11-l.h +++ b/kw11-l.h @@ -43,8 +43,8 @@ public: void show_state(console *const cnsl) const override; - JsonDocument serialize(); - static kw11_l *deserialize(const JsonDocument j, bus *const b, console *const cnsl); + JsonVariant serialize(); + static kw11_l *deserialize(const JsonVariant j, bus *const b, console *const cnsl); void begin(console *const cnsl); void operator()(); diff --git a/main.cpp b/main.cpp index 4a13257..2ee998f 100644 --- a/main.cpp +++ b/main.cpp @@ -567,27 +567,32 @@ int main(int argc, char *argv[]) if (enable_bootloader) set_boot_loader(b, bootloader); } -#if IS_POSIX else { FILE *fh = fopen(deserialize.c_str(), "r"); if (!fh) error_exit(true, "Failed to open %s", deserialize.c_str()); - json_error_t je { }; - json_t *j = json_loadf(fh, 0, &je); + std::string j_in; + char buffer[4096]; + for(;;) { + char *rc = fgets(buffer, sizeof buffer, fh); + if (!rc) + break; + + j_in += buffer; + } fclose(fh); - if (!j) - error_exit(true, "State file %s is corrupt: %s", deserialize.c_str(), je.text); + JsonDocument j; + DeserializationError error = deserializeJson(j, j_in); + if (error) + error_exit(true, "State file %s is corrupt: %s", error.c_str()); b = bus::deserialize(j, cnsl, &event); - json_decref(j); - myusleep(251000); } -#endif if (b->getTty() == nullptr) { tty *tty_ = new tty(cnsl, b); diff --git a/memory.cpp b/memory.cpp index ffded43..3c2a852 100644 --- a/memory.cpp +++ b/memory.cpp @@ -40,9 +40,9 @@ void memory::reset() memset(m, 0x00, size); } -JsonDocument memory::serialize() const +JsonVariant memory::serialize() const { - JsonDocument j; + JsonVariant j; j["size"] = size; @@ -54,7 +54,7 @@ JsonDocument memory::serialize() const return j; } -memory *memory::deserialize(const JsonDocument j) +memory *memory::deserialize(const JsonVariant j) { size_t size = j["size"]; memory *m = new memory(size); diff --git a/memory.h b/memory.h index 740fbd8..968e978 100644 --- a/memory.h +++ b/memory.h @@ -22,8 +22,8 @@ public: void reset(); - JsonDocument serialize() const; - static memory *deserialize(const JsonDocument j); + JsonVariant serialize() const; + static memory *deserialize(const JsonVariant j); uint16_t read_byte(const uint32_t a) const { return m[a]; } void write_byte(const uint32_t a, const uint16_t v) { if (a < size) m[a] = v; } diff --git a/mmu.cpp b/mmu.cpp index 8b7a222..d36169a 100644 --- a/mmu.cpp +++ b/mmu.cpp @@ -504,9 +504,9 @@ uint32_t mmu::calculate_physical_address(cpu *const c, const int run_mode, const return m_offset; } -JsonDocument mmu::add_par_pdr(const int run_mode, const bool is_d) const +JsonVariant mmu::add_par_pdr(const int run_mode, const bool is_d) const { - JsonDocument j; + JsonVariant j; JsonArray ja_par; for(int i=0; i<8; i++) @@ -521,9 +521,9 @@ JsonDocument mmu::add_par_pdr(const int run_mode, const bool is_d) const return j; } -JsonDocument mmu::serialize() const +JsonVariant mmu::serialize() const { - JsonDocument j; + JsonVariant j; for(int run_mode=0; run_mode<4; run_mode++) { if (run_mode == 2) @@ -544,20 +544,20 @@ JsonDocument mmu::serialize() const return j; } -void mmu::set_par_pdr(const JsonDocument j_in, const int run_mode, const bool is_d) +void mmu::set_par_pdr(const JsonVariant j_in, const int run_mode, const bool is_d) { JsonArray j_par = j_in["par"]; int i_par = 0; - for(auto & v: j_par) + for(auto v: j_par) pages[run_mode][is_d][i_par++].par = v; JsonArray j_pdr = j_in["pdr"]; int i_pdr = 0; - for(auto & v: j_pdr) + for(auto v: j_pdr) pages[run_mode][is_d][i_pdr++].pdr = v; } -mmu *mmu::deserialize(const JsonDocument j, memory *const mem) +mmu *mmu::deserialize(const JsonVariant j, memory *const mem) { mmu *m = new mmu(); m->begin(mem); @@ -567,7 +567,7 @@ mmu *mmu::deserialize(const JsonDocument j, memory *const mem) continue; for(int is_d=0; is_d<2; is_d++) - m->set_par_pdr(j[format("runmode_%d_d_%d", run_mode, is_d)].as(), run_mode, is_d); + m->set_par_pdr(j[format("runmode_%d_d_%d", run_mode, is_d)].as(), run_mode, is_d); } m->MMR0 = j["MMR0"]; diff --git a/mmu.h b/mmu.h index 4384237..6695310 100644 --- a/mmu.h +++ b/mmu.h @@ -58,8 +58,8 @@ private: memory *m { nullptr }; - JsonDocument add_par_pdr(const int run_mode, const bool is_d) const; - void set_par_pdr(const JsonDocument j_in, const int run_mode, const bool is_d); + JsonVariant add_par_pdr(const int run_mode, const bool is_d) const; + void set_par_pdr(const JsonVariant j_in, const int run_mode, const bool is_d); void verify_page_access (cpu *const c, const uint16_t virt_addr, const int run_mode, const bool d, const int apf, const bool is_write); void verify_access_valid(cpu *const c, const uint32_t m_offset, const int run_mode, const bool d, const int apf, const bool is_io, const bool is_write); @@ -71,8 +71,8 @@ public: void begin(memory *const m); - JsonDocument serialize() const; - static mmu *deserialize(const JsonDocument j, memory *const m); + JsonVariant serialize() const; + static mmu *deserialize(const JsonVariant j, memory *const m); void mmudebug(const uint16_t a); diff --git a/rk05.cpp b/rk05.cpp index ab4ee0d..152ed70 100644 --- a/rk05.cpp +++ b/rk05.cpp @@ -281,9 +281,9 @@ void rk05::write_word(const uint16_t addr, const uint16_t v) } } -JsonDocument rk05::serialize() const +JsonVariant rk05::serialize() const { - JsonDocument j; + JsonVariant j; JsonArray j_backends; for(auto & dbe: fhs) @@ -296,12 +296,12 @@ JsonDocument rk05::serialize() const return j; } -rk05 *rk05::deserialize(const JsonDocument j, bus *const b) +rk05 *rk05::deserialize(const JsonVariant j, bus *const b) { rk05 *r = new rk05(b, nullptr, nullptr); r->begin(); - for(auto j_backend: j["backends"]) + for(auto j_backend: j["backends"].as()) r->access_disk_backends()->push_back(disk_backend::deserialize(j_backend)); for(int regnr=0; regnr<7; regnr++) diff --git a/rk05.h b/rk05.h index 9d2f6c9..f025870 100644 --- a/rk05.h +++ b/rk05.h @@ -49,8 +49,8 @@ public: void show_state(console *const cnsl) const override; - JsonDocument serialize() const; - static rk05 *deserialize(const JsonDocument j, bus *const b); + JsonVariant serialize() const; + static rk05 *deserialize(const JsonVariant j, bus *const b); uint8_t read_byte(const uint16_t addr) override; uint16_t read_word(const uint16_t addr) override; diff --git a/rl02.cpp b/rl02.cpp index 83480a4..69a64c0 100644 --- a/rl02.cpp +++ b/rl02.cpp @@ -72,9 +72,9 @@ void rl02::show_state(console *const cnsl) const cnsl->put_string_lf(format("sector: %d", sector)); } -JsonDocument rl02::serialize() const +JsonVariant rl02::serialize() const { - JsonDocument j; + JsonVariant j; JsonArray j_backends; for(auto & dbe: fhs) @@ -94,13 +94,13 @@ JsonDocument rl02::serialize() const return j; } -rl02 *rl02::deserialize(const JsonDocument j, bus *const b) +rl02 *rl02::deserialize(const JsonVariant j, bus *const b) { rl02 *r = new rl02(b, nullptr, nullptr); r->begin(); JsonArray j_backends = j["backends"]; - for(auto & v: j_backends) + for(auto v: j_backends) r->access_disk_backends()->push_back(disk_backend::deserialize(v)); for(int regnr=0; regnr<4; regnr++) diff --git a/rl02.h b/rl02.h index b9b27e0..f9ef998 100644 --- a/rl02.h +++ b/rl02.h @@ -56,8 +56,8 @@ public: void show_state(console *const cnsl) const override; - JsonDocument serialize() const; - static rl02 *deserialize(const JsonDocument j, bus *const b); + JsonVariant serialize() const; + static rl02 *deserialize(const JsonVariant j, bus *const b); uint8_t read_byte(const uint16_t addr) override; uint16_t read_word(const uint16_t addr) override; diff --git a/tty.cpp b/tty.cpp index bdd0f2e..74091d5 100644 --- a/tty.cpp +++ b/tty.cpp @@ -194,9 +194,9 @@ void tty::write_word(const uint16_t addr, uint16_t v) registers[(addr - PDP11TTY_BASE) / 2] = v; } -JsonDocument tty::serialize() +JsonVariant tty::serialize() { - JsonDocument j; + JsonVariant j; JsonArray ja_reg; for(size_t i=0; i<4; i++) @@ -205,13 +205,13 @@ JsonDocument tty::serialize() JsonArray ja_buf; for(auto c: chars) - ja_buf.add(c); + ja_buf.add(static_cast(c)); j["input-buffer"] = ja_buf; return j; } -tty *tty::deserialize(const json_t *const j, bus *const b, console *const cnsl) +tty *tty::deserialize(const JsonVariant j, bus *const b, console *const cnsl) { tty *out = new tty(cnsl, b); @@ -222,7 +222,7 @@ tty *tty::deserialize(const json_t *const j, bus *const b, console *const cnsl) JsonArray ja_buf = j["input-buffer"]; for(auto v: ja_buf) - out->chars.push_back(v); + out->chars.push_back(v.as()); return out; } diff --git a/tty.h b/tty.h index 008304f..0c98ade 100644 --- a/tty.h +++ b/tty.h @@ -52,8 +52,8 @@ public: tty(console *const c, bus *const b); virtual ~tty(); - JsonDocument serialize(); - static tty *deserialize(const JsonDocument j, bus *const b, console *const cnsl); + JsonVariant serialize(); + static tty *deserialize(const JsonVariant j, bus *const b, console *const cnsl); void reset();