fixes for serialization

This commit is contained in:
folkert van heusden 2024-05-16 10:14:48 +02:00
parent f2ac06b9db
commit bf610e17b2
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
23 changed files with 71 additions and 76 deletions

28
bus.cpp
View file

@ -45,48 +45,34 @@ bus::~bus()
delete dc11_; delete dc11_;
} }
void dump(JsonVariantConst j)
{
std::string temp;
printf("%zu\n", serializeJson(j, temp));
printf("%s\r\n", temp.c_str());
}
JsonDocument bus::serialize() const JsonDocument bus::serialize() const
{ {
JsonDocument doc; JsonDocument j_out;
JsonVariant j_out = doc.to<JsonVariant>();
if (m) if (m)
j_out["memory"] = m->serialize(); j_out["memory"] = m->serialize();
if (kw11_l_) if (kw11_l_)
j_out["kw11-l"] = kw11_l_->serialize(); j_out["kw11-l"] = kw11_l_->serialize();
dump(kw11_l_->serialize());
if (tty_) if (tty_)
j_out["tty"] = tty_->serialize(); j_out["tty"] = tty_->serialize();
dump(tty_->serialize());
if (mmu_) if (mmu_)
j_out["mmu"] = mmu_->serialize(); j_out["mmu"] = mmu_->serialize();
dump(mmu_->serialize());
if (c) if (c)
c->serialize(j_out["cpu"]); j_out["cpu"] = c->serialize();
if (rl02_) if (rl02_)
j_out["rl02"] = rl02_->serialize(); j_out["rl02"] = rl02_->serialize();
dump(rl02_->serialize());
if (rk05_) if (rk05_)
j_out["rk05"] = rk05_->serialize(); j_out["rk05"] = rk05_->serialize();
dump(rk05_->serialize());
// TODO: tm11, dc11 // TODO: tm11, dc11
return doc; return j_out;
} }
bus *bus::deserialize(const JsonDocument j, console *const cnsl, std::atomic_uint32_t *const event) bus *bus::deserialize(const JsonDocument j, console *const cnsl, std::atomic_uint32_t *const event)

11
cpu.cpp
View file

@ -2434,9 +2434,9 @@ void cpu::step()
} }
} }
void cpu::serialize(JsonVariant j_in) JsonDocument cpu::serialize()
{ {
JsonVariant j = j_in["cpu"].to<JsonVariant>(); JsonDocument j;
for(int set=0; set<2; set++) { for(int set=0; set<2; set++) {
for(int regnr=0; regnr<6; regnr++) for(int regnr=0; regnr<6; regnr++)
@ -2463,9 +2463,10 @@ void cpu::serialize(JsonVariant j_in)
JsonVariant j_queued_interrupts; JsonVariant j_queued_interrupts;
for(auto & il: queued_interrupts) { for(auto & il: queued_interrupts) {
JsonArray ja_qi_level; JsonDocument ja_qi_level;
JsonArray ja_qi_level_work = ja_qi_level.to<JsonArray>();
for(auto v: il.second) for(auto v: il.second)
ja_qi_level.add(v); ja_qi_level_work.add(v);
j_queued_interrupts[format("%d", il.first)] = ja_qi_level; j_queued_interrupts[format("%d", il.first)] = ja_qi_level;
} }
@ -2473,6 +2474,8 @@ void cpu::serialize(JsonVariant j_in)
j["queued_interrupts"] = j_queued_interrupts; j["queued_interrupts"] = j_queued_interrupts;
j["any_queued_interrupts"] = bool(any_queued_interrupts); j["any_queued_interrupts"] = bool(any_queued_interrupts);
return j;
} }
cpu *cpu::deserialize(const JsonVariantConst j, bus *const b, std::atomic_uint32_t *const event) cpu *cpu::deserialize(const JsonVariantConst j, bus *const b, std::atomic_uint32_t *const event)

2
cpu.h
View file

@ -114,7 +114,7 @@ public:
explicit cpu(bus *const b, std::atomic_uint32_t *const event); explicit cpu(bus *const b, std::atomic_uint32_t *const event);
~cpu(); ~cpu();
void serialize(JsonVariant j); JsonDocument serialize();
static cpu *deserialize(const JsonVariantConst j, bus *const b, std::atomic_uint32_t *const event); static cpu *deserialize(const JsonVariantConst j, bus *const b, std::atomic_uint32_t *const event);
std::optional<std::string> check_breakpoint(); std::optional<std::string> check_breakpoint();

View file

@ -557,7 +557,7 @@ void serialize_state(console *const cnsl, const bus *const b, const std::string
FILE *fh = fopen(filename.c_str(), "w"); FILE *fh = fopen(filename.c_str(), "w");
if (fh) { if (fh) {
state_writer ws { fh }; state_writer ws { fh };
serializeJson(j, ws); serializeJsonPretty(j, ws);
fclose(fh); fclose(fh);
ok = true; ok = true;

View file

@ -61,15 +61,16 @@ bool disk_backend::store_mem_range_in_overlay(const off_t offset, const size_t n
return false; return false;
} }
JsonVariant disk_backend::serialize_overlay() const JsonDocument disk_backend::serialize_overlay() const
{ {
JsonVariant out; JsonDocument out;
for(auto & id: overlay) { for(auto & id: overlay) {
JsonVariant j_data; JsonDocument j_data;
JsonArray j_data_work = j_data.to<JsonArray>();
for(size_t i=0; i<id.second.size(); i++) for(size_t i=0; i<id.second.size(); i++)
j_data.add(id.second.at(i)); j_data_work.add(id.second.at(i));
out[format("%lu", id.first)] = j_data; out[format("%lu", id.first)] = j_data;
} }

View file

@ -24,14 +24,14 @@ protected:
std::optional<std::vector<uint8_t> > get_object_from_overlay(const off_t id); std::optional<std::vector<uint8_t> > get_object_from_overlay(const off_t id);
std::optional<std::vector<uint8_t> > get_from_overlay(const off_t offset, const size_t sector_size); std::optional<std::vector<uint8_t> > get_from_overlay(const off_t offset, const size_t sector_size);
JsonVariant serialize_overlay() const; JsonDocument serialize_overlay() const;
void deserialize_overlay(const JsonVariantConst j); void deserialize_overlay(const JsonVariantConst j);
public: public:
disk_backend(); disk_backend();
virtual ~disk_backend(); virtual ~disk_backend();
virtual JsonVariant serialize() const = 0; virtual JsonDocument serialize() const = 0;
static disk_backend *deserialize(const JsonVariantConst j); static disk_backend *deserialize(const JsonVariantConst j);
virtual std::string get_identifier() const = 0; virtual std::string get_identifier() const = 0;

View file

@ -21,9 +21,9 @@ disk_backend_file::~disk_backend_file()
close(fd); close(fd);
} }
JsonVariant disk_backend_file::serialize() const JsonDocument disk_backend_file::serialize() const
{ {
JsonVariant j; JsonDocument j;
j["disk-backend-type"] = "file"; j["disk-backend-type"] = "file";

View file

@ -19,7 +19,7 @@ public:
disk_backend_file(const std::string & filename); disk_backend_file(const std::string & filename);
virtual ~disk_backend_file(); virtual ~disk_backend_file();
JsonVariant serialize() const override; JsonDocument serialize() const override;
static disk_backend_file *deserialize(const JsonVariantConst j); static disk_backend_file *deserialize(const JsonVariantConst j);
std::string get_identifier() const override { return filename; } std::string get_identifier() const override { return filename; }

View file

@ -48,9 +48,9 @@ disk_backend_nbd::~disk_backend_nbd()
close(fd); close(fd);
} }
JsonVariant disk_backend_nbd::serialize() const JsonDocument disk_backend_nbd::serialize() const
{ {
JsonVariant j; JsonDocument j;
j["disk-backend-type"] = "nbd"; j["disk-backend-type"] = "nbd";

View file

@ -22,7 +22,7 @@ public:
disk_backend_nbd(const std::string & host, const unsigned port); disk_backend_nbd(const std::string & host, const unsigned port);
virtual ~disk_backend_nbd(); virtual ~disk_backend_nbd();
JsonVariant serialize() const override; JsonDocument serialize() const override;
static disk_backend_nbd *deserialize(const JsonVariantConst j); static disk_backend_nbd *deserialize(const JsonVariantConst j);
std::string get_identifier() const override { return format("%s:%d", host.c_str(), port); } std::string get_identifier() const override { return format("%s:%d", host.c_str(), port); }

2
gen.h
View file

@ -3,8 +3,6 @@
#pragma once #pragma once
#define ARDUINOJSON_DEBUG 1
// #define TURBO // #define TURBO
typedef enum { EVENT_NONE = 0, EVENT_HALT, EVENT_INTERRUPT, EVENT_TERMINATE } stop_event_t; typedef enum { EVENT_NONE = 0, EVENT_HALT, EVENT_INTERRUPT, EVENT_TERMINATE } stop_event_t;

View file

@ -216,9 +216,9 @@ uint8_t kw11_l::get_lf_crs()
return rc; return rc;
} }
JsonVariant kw11_l::serialize() JsonDocument kw11_l::serialize()
{ {
JsonVariant j; JsonDocument j;
j["CSR"] = lf_csr; j["CSR"] = lf_csr;

View file

@ -43,7 +43,7 @@ public:
void show_state(console *const cnsl) const override; void show_state(console *const cnsl) const override;
JsonVariant serialize(); JsonDocument serialize();
static kw11_l *deserialize(const JsonVariantConst j, bus *const b, console *const cnsl); static kw11_l *deserialize(const JsonVariantConst j, bus *const b, console *const cnsl);
void begin(console *const cnsl); void begin(console *const cnsl);

View file

@ -40,15 +40,16 @@ void memory::reset()
memset(m, 0x00, size); memset(m, 0x00, size);
} }
JsonVariant memory::serialize() const JsonDocument memory::serialize() const
{ {
JsonVariant j; JsonDocument j;
j["size"] = size; j["size"] = size;
JsonArray ja; JsonDocument ja;
JsonArray ja_work = ja.to<JsonArray>();
for(size_t i=0; i<size; i++) for(size_t i=0; i<size; i++)
ja.add(m[i]); ja_work.add(m[i]);
j["contents"] = ja; j["contents"] = ja;
return j; return j;

View file

@ -22,7 +22,7 @@ public:
void reset(); void reset();
JsonVariant serialize() const; JsonDocument serialize() const;
static memory *deserialize(const JsonVariantConst j); static memory *deserialize(const JsonVariantConst j);
uint16_t read_byte(const uint32_t a) const { return m[a]; } uint16_t read_byte(const uint32_t a) const { return m[a]; }

18
mmu.cpp
View file

@ -505,26 +505,28 @@ uint32_t mmu::calculate_physical_address(cpu *const c, const int run_mode, const
return m_offset; return m_offset;
} }
JsonVariant mmu::add_par_pdr(const int run_mode, const bool is_d) const JsonDocument mmu::add_par_pdr(const int run_mode, const bool is_d) const
{ {
JsonVariant j; JsonDocument j;
JsonArray ja_par; JsonDocument ja_par;
JsonArray ja_par_work = ja_par.to<JsonArray>();
for(int i=0; i<8; i++) for(int i=0; i<8; i++)
ja_par.add(pages[run_mode][is_d][i].par); ja_par_work.add(pages[run_mode][is_d][i].par);
j["par"] = ja_par; j["par"] = ja_par;
JsonArray ja_pdr; JsonDocument ja_pdr;
JsonArray ja_pdr_work = ja_pdr.to<JsonArray>();
for(int i=0; i<8; i++) for(int i=0; i<8; i++)
ja_pdr.add(pages[run_mode][is_d][i].pdr); ja_pdr_work.add(pages[run_mode][is_d][i].pdr);
j["pdr"] = ja_pdr; j["pdr"] = ja_pdr;
return j; return j;
} }
JsonVariant mmu::serialize() const JsonDocument mmu::serialize() const
{ {
JsonVariant j; JsonDocument j;
for(int run_mode=0; run_mode<4; run_mode++) { for(int run_mode=0; run_mode<4; run_mode++) {
if (run_mode == 2) if (run_mode == 2)

4
mmu.h
View file

@ -57,7 +57,7 @@ private:
memory *m { nullptr }; memory *m { nullptr };
JsonVariant add_par_pdr(const int run_mode, const bool is_d) const; JsonDocument add_par_pdr(const int run_mode, const bool is_d) const;
void set_par_pdr(const JsonVariantConst j_in, const int run_mode, const bool is_d); void set_par_pdr(const JsonVariantConst 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_page_access (cpu *const c, const uint16_t virt_addr, const int run_mode, const bool d, const int apf, const bool is_write);
@ -70,7 +70,7 @@ public:
void begin(memory *const m); void begin(memory *const m);
JsonVariant serialize() const; JsonDocument serialize() const;
static mmu *deserialize(const JsonVariantConst j, memory *const m); static mmu *deserialize(const JsonVariantConst j, memory *const m);
void mmudebug(const uint16_t a); void mmudebug(const uint16_t a);

View file

@ -281,13 +281,14 @@ void rk05::write_word(const uint16_t addr, const uint16_t v)
} }
} }
JsonVariant rk05::serialize() const JsonDocument rk05::serialize() const
{ {
JsonVariant j; JsonDocument j;
JsonArray j_backends; JsonDocument j_backends;
JsonArray j_backends_work = j_backends.to<JsonArray>();
for(auto & dbe: fhs) for(auto & dbe: fhs)
j_backends.add(dbe->serialize()); j_backends_work.add(dbe->serialize());
j["backends"] = j_backends; j["backends"] = j_backends;
for(int regnr=0; regnr<7; regnr++) for(int regnr=0; regnr<7; regnr++)

2
rk05.h
View file

@ -49,7 +49,7 @@ public:
void show_state(console *const cnsl) const override; void show_state(console *const cnsl) const override;
JsonVariant serialize() const; JsonDocument serialize() const;
static rk05 *deserialize(const JsonVariantConst j, bus *const b); static rk05 *deserialize(const JsonVariantConst j, bus *const b);
uint8_t read_byte(const uint16_t addr) override; uint8_t read_byte(const uint16_t addr) override;

View file

@ -72,13 +72,14 @@ void rl02::show_state(console *const cnsl) const
cnsl->put_string_lf(format("sector: %d", sector)); cnsl->put_string_lf(format("sector: %d", sector));
} }
JsonVariant rl02::serialize() const JsonDocument rl02::serialize() const
{ {
JsonVariant j; JsonDocument j;
JsonArray j_backends; JsonDocument j_backends;
JsonArray j_backends_work = j_backends.to<JsonArray>();
for(auto & dbe: fhs) for(auto & dbe: fhs)
j_backends.add(dbe->serialize()); j_backends_work.add(dbe->serialize());
j["backends"] = j_backends; j["backends"] = j_backends;
for(int regnr=0; regnr<4; regnr++) for(int regnr=0; regnr<4; regnr++)

2
rl02.h
View file

@ -56,7 +56,7 @@ public:
void show_state(console *const cnsl) const override; void show_state(console *const cnsl) const override;
JsonVariant serialize() const; JsonDocument serialize() const;
static rl02 *deserialize(const JsonVariantConst j, bus *const b); static rl02 *deserialize(const JsonVariantConst j, bus *const b);
uint8_t read_byte(const uint16_t addr) override; uint8_t read_byte(const uint16_t addr) override;

14
tty.cpp
View file

@ -194,18 +194,20 @@ void tty::write_word(const uint16_t addr, uint16_t v)
registers[(addr - PDP11TTY_BASE) / 2] = v; registers[(addr - PDP11TTY_BASE) / 2] = v;
} }
JsonVariant tty::serialize() JsonDocument tty::serialize()
{ {
JsonVariant j; JsonDocument j;
JsonArray ja_reg; JsonDocument ja_reg;
JsonArray ja_reg_work = ja_reg.to<JsonArray>();
for(size_t i=0; i<4; i++) for(size_t i=0; i<4; i++)
ja_reg.add(registers[i]); ja_reg_work.add(registers[i]);
j["registers"] = ja_reg; j["registers"] = ja_reg;
JsonArray ja_buf; JsonDocument ja_buf;
JsonArray ja_buf_work = ja_buf.to<JsonArray>();
for(auto c: chars) for(auto c: chars)
ja_buf.add(static_cast<signed char>(c)); ja_buf_work.add(static_cast<signed char>(c));
j["input-buffer"] = ja_buf; j["input-buffer"] = ja_buf;
return j; return j;

2
tty.h
View file

@ -52,7 +52,7 @@ public:
tty(console *const c, bus *const b); tty(console *const c, bus *const b);
virtual ~tty(); virtual ~tty();
JsonVariant serialize(); JsonDocument serialize();
static tty *deserialize(const JsonVariantConst j, bus *const b, console *const cnsl); static tty *deserialize(const JsonVariantConst j, bus *const b, console *const cnsl);
void reset(); void reset();