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