KW11-L state

This commit is contained in:
folkert van heusden 2024-05-10 20:35:35 +02:00
parent 7077074160
commit 9a858fbe7a
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
5 changed files with 39 additions and 3 deletions

View file

@ -33,6 +33,7 @@ add_executable(
cpu.cpp
dc11.cpp
debugger.cpp
device.cpp
disk_backend.cpp
disk_backend_file.cpp
disk_backend_nbd.cpp
@ -84,6 +85,7 @@ add_executable(
cpu.cpp
dc11.cpp
debugger.cpp
device.cpp
disk_backend.cpp
disk_backend_file.cpp
disk_backend_nbd.cpp

View file

@ -26,6 +26,7 @@
#include "disk_backend_esp32.h"
#endif
#include "disk_backend_nbd.h"
#include "kw11-l.h"
#include "loaders.h"
#include "log.h"
#include "memory.h"
@ -730,6 +731,8 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto
b->getDC11()->show_state(cnsl);
else if (parts[1] == "tm11")
b->getTM11()->show_state(cnsl);
else if (parts[1] == "kw11l")
b->getKW11_L()->show_state(cnsl);
else
cnsl->put_string_lf(format("Device \"%s\" is not known", parts[1].c_str()));
@ -1012,7 +1015,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",
"trl x - set trace run-level (0...3), empty for all",
"regdump - dump register contents",
"state x - dump state of a device: rl02, rk05, mmu, tm11 or dc11",
"state x - dump state of a device: rl02, rk05, mmu, tm11, kw11l or dc11",
"mmures x - resolve a virtual address",
"qi - show queued interrupts",
"setpc x - set PC to value",

View file

@ -15,7 +15,7 @@ public:
virtual void show_state(console *const cnsl) const = 0;
virtual uint8_t read_byte(const uint16_t addr) = 0;
virtual uint8_t read_byte(const uint16_t addr);
virtual uint16_t read_word(const uint16_t addr) = 0;
virtual void write_byte(const uint16_t addr, const uint8_t v) = 0;

View file

@ -42,6 +42,11 @@ kw11_l::~kw11_l()
#endif
}
void kw11_l::show_state(console *const cnsl) const
{
cnsl->put_string_lf(format("CSR: %06o", lf_csr));
}
void kw11_l::begin(console *const cnsl)
{
this->cnsl = cnsl;
@ -131,6 +136,27 @@ uint16_t kw11_l::read_word(const uint16_t a)
return temp;
}
void kw11_l::write_byte(const uint16_t addr, const uint8_t value)
{
if (addr != ADDR_LFC) {
TRACE("KW11-L write_byte not for us (%06o to %06o)", value, addr);
return;
}
uint16_t vtemp = lf_csr;
if (addr & 1) {
vtemp &= ~0xff00;
vtemp |= value << 8;
}
else {
vtemp &= ~0x00ff;
vtemp |= value;
}
write_word(addr, vtemp);
}
void kw11_l::write_word(const uint16_t a, const uint16_t value)
{
if (a != ADDR_LFC) {

View file

@ -6,10 +6,11 @@
#include "bus.h"
#include "console.h"
#include "device.h"
#include "gen.h"
class kw11_l
class kw11_l: public device
{
private:
bus *const b { nullptr };
@ -36,6 +37,8 @@ public:
void reset();
void show_state(console *const cnsl) const override;
#if IS_POSIX
json_t *serialize();
static kw11_l *deserialize(const json_t *const j, bus *const b, console *const cnsl);
@ -45,5 +48,7 @@ public:
void operator()();
uint16_t read_word (const uint16_t a);
void write_byte(const uint16_t addr, const uint8_t v);
void write_word(const uint16_t a, const uint16_t v);
};