duskos

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

commit 13216e479fecce021ea74142096745b8397b8a9f
parent 9903957f8a8e246ff0f2d14dfa6531abe98de1e0
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Wed, 16 Nov 2022 11:51:44 -0500

app/uxn: add some stuff until a CC bug is hit

Diffstat:
Mfs/app/uxn/vm.c | 61++++++++++++++++++++++++++++++++++++++++++++++++-------------
Mfs/tests/app/uxn/dummy.tal | 1+
Mfs/tests/app/uxn/vm.fs | 3+--
3 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/fs/app/uxn/vm.c b/fs/app/uxn/vm.c @@ -35,26 +35,31 @@ static void error(int code) { abort(); } -void push(unsigned short val) { - if (s->ptr >= $ff-bs) error(2); - if (bs) { +void push8(unsigned char val) { + if (s->ptr == $ff) { error(2); } else { s->dat[s->ptr++] = val; } +} +void push16(unsigned short val) { + if (s->ptr >= $fe) { error(2); } else { s->dat[s->ptr] = val >> 8; s->dat[s->ptr+1] = val; s->ptr += 2 ; - } else { - s->dat[s->ptr++] = val; } } +void push(unsigned short val) { if (bs) push16(val); else push8(val); } -unsigned short pop() { - if (s->ptr <= bs) error(0); - if (bs) { +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 { s->ptr -= 2; - return (s->dat[s->ptr] << 8) | s->dat[s->ptr+1]; - } else { - return s->dat[--s->ptr]; + val = s->dat[s->ptr] << 8; + val |= s->dat[s->ptr+1]; + return val; } } +unsigned short pop() { if (bs) return pop16(); else return pop8(); } void poke(unsigned short addr, unsigned short val) { if (bs) { @@ -73,16 +78,35 @@ unsigned short peek(unsigned short addr) { } } +unsigned char nulldei(Device *d, unsigned char port) { return d->dat[port]; } +void nulldeo(Device *d, unsigned char port) { emit('N'); } + /* Operations */ static void _err() { error(42); } 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 DEO() { + unsigned char port = pop8(); + unsigned short val = pop(); + printf(port>>4, "DEO %x\n"); + Device *d = &dev[port>>4]; + port &= $f; + if (bs) { + d->dat[port] = val >> 8; d->deo(d, port++); + port &= $f; + d->dat[port] = val; d->deo(d, port); + } else { + printf(val, port, "8b %x %x\n"); + // TODO: this doesn't work. the call to console_deo() is never made. + d->dat[port] = val; d->deo(d, port); + } +} 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, - _err, _err, _err, _err, _err, _err, _err, _err, + _err, _err, _err, _err, _err, _err, _err, DEO, ADD, _err, _err, _err, _err, _err, _err, _err}; void uxn_exec() { @@ -92,12 +116,23 @@ void uxn_exec() { op &= $1f; ops[op](); } - bs = 0; // for debugging pop()s +} + +/* Console */ +void console_deo(Device *d, unsigned char port) { + if (port == 8) emit(d->dat[port]); } void uxn_init() { + int i; pc = $100; wst.ptr = 0; rst.ptr = 0; s = &wst; + for (i=0; i<$10; i++) { + dev[i].dei = nulldei; + dev[i].deo = nulldeo; + memset(dev[i].dat, 0, $10); + } + dev[1].deo = console_deo; } diff --git a/fs/tests/app/uxn/dummy.tal b/fs/tests/app/uxn/dummy.tal @@ -1,4 +1,5 @@ |0100 #2a DUP INC ( 2a 2b ) DUP2 ADD2 ( 54 56 ) +( #59 #18 DEO ) BRK diff --git a/fs/tests/app/uxn/vm.fs b/fs/tests/app/uxn/vm.fs @@ -7,6 +7,5 @@ ram $100 + S" /tests/app/uxn/dummy.bin" curpath :find# Path :open tuck File :readall File :close uxn_init uxn_exec -pop $56 #eq -pop $54 #eq +pop16 $5456 #eq testend