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:
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