commit 82ce8b37400a7bb3abd1706131a065dc3f2331ed
parent 9f9b24696962dfb85158dc363d96fc0ba4d8476b
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Wed, 5 Jul 2023 10:22:11 -0400
emul/uxn: make more debuggable
Diffstat:
M | fs/emul/uxn/vm.c | | | 58 | ++++++++++++++++++++++++++++++++++++++++++---------------- |
1 file changed, 42 insertions(+), 16 deletions(-)
diff --git a/fs/emul/uxn/vm.c b/fs/emul/uxn/vm.c
@@ -174,25 +174,37 @@ static VMOP ops[$20] = {
LDZ, STZ, LDR, STR, LDA, STA, DEI, DEO,
ADD, SUB, MUL, DIV, AND, ORA, EOR, SFT};
+static void uxn_op(uchar op) {
+ bs = (op >> 5) & 1;
+ if(op & $40) {
+ src = &rst; dst = &wst;
+ } else {
+ src = &wst; dst = &rst;
+ }
+ if (op & $80) {
+ kptr = src->ptr;
+ sp = &kptr;
+ } else {
+ sp = &src->ptr;
+ }
+ op &= $1f;
+ ops[op]();
+}
+
+void uxn_step() {
+ uchar op;
+ if (op = ram[pc++]) uxn_op(op);
+ else puts("Break\n");
+}
+
+void uxn_setpc(ushort newpc) {
+ pc = newpc;
+}
+
void uxn_exec(ushort frompc) {
uchar op;
pc = frompc;
- while (op = ram[pc++]) {
- bs = (op >> 5) & 1;
- if(op & $40) {
- src = &rst; dst = &wst;
- } else {
- src = &wst; dst = &rst;
- }
- if (op & $80) {
- kptr = src->ptr;
- sp = &kptr;
- } else {
- sp = &src->ptr;
- }
- op &= $1f;
- ops[op]();
- }
+ while (op = ram[pc++]) uxn_op(op);
}
void uxn_init() {
@@ -209,5 +221,19 @@ void uxn_init() {
}
}
+static void printstack(Stack *s) {
+ int i;
+ for (i=0; i<s->ptr; ++i) printf(s->dat[i], "%b ");
+ puts("\n");
+}
+
+void uxndbg() {
+ printf(pc, "PC: %w\n");
+ puts("W: ");
+ printstack(wst);
+ puts("R: ");
+ printstack(rst);
+}
+
uint* uxn_ram() { return ram; }
Device* uxn_dev(int port) { return &dev[port]; }