fixes for serialization
This commit is contained in:
parent
f2ac06b9db
commit
bf610e17b2
23 changed files with 71 additions and 76 deletions
20
bus.cpp
20
bus.cpp
|
@ -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
11
cpu.cpp
|
@ -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
2
cpu.h
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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";
|
||||||
|
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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";
|
||||||
|
|
||||||
|
|
|
@ -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
2
gen.h
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
2
kw11-l.h
2
kw11-l.h
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
2
memory.h
2
memory.h
|
@ -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
18
mmu.cpp
|
@ -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
4
mmu.h
|
@ -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);
|
||||||
|
|
9
rk05.cpp
9
rk05.cpp
|
@ -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
2
rk05.h
|
@ -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;
|
||||||
|
|
9
rl02.cpp
9
rl02.cpp
|
@ -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
2
rl02.h
|
@ -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
14
tty.cpp
|
@ -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
2
tty.h
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue