duskos

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

commit 9903957f8a8e246ff0f2d14dfa6531abe98de1e0
parent f1317253f641fb146334bc42fe4a807a5a029a2b
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Wed, 16 Nov 2022 11:08:19 -0500

app/uxn: add byte/short mode support

Diffstat:
Mfs/app/uxn/vm.c | 67+++++++++++++++++++++++++++++++------------------------------------
Mfs/tests/app/uxn/dummy.bin | 0
Mfs/tests/app/uxn/dummy.tal | 4+++-
Mfs/tests/app/uxn/vm.fs | 3++-
4 files changed, 36 insertions(+), 38 deletions(-)

diff --git a/fs/app/uxn/vm.c b/fs/app/uxn/vm.c @@ -28,64 +28,57 @@ static Stack rst; static Stack *s; static Device dev[$10]; static unsigned short pc; // Program Counter +static int bs; // byte/short 0=byte 1=short static void error(int code) { printf(code, "Error %d encountered\n"); abort(); } -void push8(unsigned char val) { - if (s->ptr == $ff) { error(2); } else { s->dat[s->ptr++] = val; } -} - void push(unsigned short val) { - if (s->ptr >= $fe) { error(2); } else { + if (s->ptr >= $ff-bs) error(2); + if (bs) { s->dat[s->ptr] = val >> 8; s->dat[s->ptr+1] = val; s->ptr += 2 ; + } else { + s->dat[s->ptr++] = val; } } -unsigned char pop8() { - if (!s->ptr) { error(0); } else { return s->dat[--s->ptr]; } -} - -unsigned short pop16() { - unsigned short val; - if (s->ptr <= 1) { error(0); } else { +unsigned short pop() { + if (s->ptr <= bs) error(0); + if (bs) { s->ptr -= 2; - val = s->dat[s->ptr] << 8; - val |= s->dat[s->ptr+1]; - return val; + return (s->dat[s->ptr] << 8) | s->dat[s->ptr+1]; + } else { + return s->dat[--s->ptr]; } } -void poke8(unsigned short addr, unsigned char val) { - ram[addr] = val; -} - -void poke16(unsigned short addr, unsigned short val) { - ram[addr] = val >> 8; - ram[addr+1] = val; -} - -unsigned char peek8(unsigned short addr) { - return ram[addr]; +void poke(unsigned short addr, unsigned short val) { + if (bs) { + ram[addr] = val >> 8; + ram[addr+1] = val; + } else { + ram[addr] = val; + } } -unsigned short peek16(unsigned short addr) { - unsigned short val; - val = ram[addr] << 8; - val |= ram[addr+1]; - return val; +unsigned short peek(unsigned short addr) { + if (bs) { + return (ram[addr] << 8) | ram[addr+1]; + } else { + return ram[addr]; + } } /* Operations */ static void _err() { error(42); } -static void LIT() { push8(peek8(pc++)); } -static void INC() { push8(pop8()+1); } -static void DUP() { unsigned char x = pop8(); push8(x); push8(x); } -static void ADD() { push8(pop8() + pop8()); } +static void LIT() { push(peek(pc++)); } +static void INC() { push(pop()+1); } +static void DUP() { unsigned short x = pop(); push(x); push(x); } +static void ADD() { push(pop() + pop()); } static VMOP ops[$20] = { LIT, INC, _err, _err, _err, _err, DUP, _err, _err, _err, _err, _err, _err, _err, _err, _err, @@ -94,10 +87,12 @@ static VMOP ops[$20] = { void uxn_exec() { unsigned char op; - while (op = peek8(pc++)) { + while (op = ram[pc++]) { + bs = (op >> 5) & 1; op &= $1f; ops[op](); } + bs = 0; // for debugging pop()s } void uxn_init() { diff --git a/fs/tests/app/uxn/dummy.bin b/fs/tests/app/uxn/dummy.bin Binary files differ. diff --git a/fs/tests/app/uxn/dummy.tal b/fs/tests/app/uxn/dummy.tal @@ -1,2 +1,4 @@ |0100 -#2a DUP INC ADD BRK +#2a DUP INC ( 2a 2b ) +DUP2 ADD2 ( 54 56 ) +BRK diff --git a/fs/tests/app/uxn/vm.fs b/fs/tests/app/uxn/vm.fs @@ -7,5 +7,6 @@ ram $100 + S" /tests/app/uxn/dummy.bin" curpath :find# Path :open tuck File :readall File :close uxn_init uxn_exec -pop8 85 #eq +pop $56 #eq +pop $54 #eq testend