duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

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:
Mfs/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]; }