commit 641390828256ef7764374bf3f377c6b31c1a7502
parent 35f1a9ecb0db01b16287a2392e27afdcd7012058
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Fri, 10 Mar 2023 12:58:33 -0500
hal: Dusk OS prompt!
Now let's get those tests passing...
Diffstat:
4 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/fs/lib/meta.fs b/fs/lib/meta.fs
@@ -15,6 +15,9 @@
4 &+@ emetatype
8 &+ 'emetadata
+: findmeta ( id ll -- ll )
+ begin dup while 2dup CELLSZ + @ <> while repeat then nip ;
+
\ Docstring
: .doc ( w -- ) w>e emeta begin ( ll )
EMETA_DOCLINE swap findmeta ?dup while ( ll )
diff --git a/fs/sys/io.fs b/fs/sys/io.fs
@@ -35,7 +35,6 @@ struct+[ IO
]struct
: _consoleemit console :putc ;
-: prompt ." hello HAL!\n" ; prompt bye
' _consoleemit ' emit realias
: stdin stdio :getc ;
: stdout stdio :putc ;
diff --git a/fs/xcomp/bootlo.fs b/fs/xcomp/bootlo.fs
@@ -87,12 +87,6 @@ code ?dup =0>Z, 0 Z) branchC, dup, then exit,
1+ c@ ')' = if exit then else drop then
again ; immediate
( hello, another comment! )
-\ Stack
-: rdrop 4 rs+, ; immediate
-: 2rdrop 8 rs+, ; immediate
-: r@ dup, RSP) @, ; immediate
-: r> [compile] r@ [compile] rdrop ; immediate
-: >r -4 rs+, RSP) !, drop, ; immediate
\ Arithmetic
code + PSP) +, nip, exit,
@@ -115,6 +109,15 @@ code ^ -1 xorn, exit,
: or? or bool ;
: upcase ( c -- c ) dup 'a' - 26 < if $df and then ;
+\ Stack
+: rdrop 4 rs+, ; immediate
+: 2rdrop 8 rs+, ; immediate
+: r@ dup, RSP) @, ; immediate
+: r> [compile] r@ [compile] rdrop ; immediate
+: >r -4 rs+, RSP) !, drop, ; immediate
+code scnt dup, PSP) lea, ] PSTOP -^ >> >> 1- ;
+code rcnt dup, RSP) lea, ] RSTOP -^ >> >> ;
+
: while [compile] if swap ; immediate
: repeat [compile] again [compile] then ; immediate
@@ -239,7 +242,6 @@ alias execute | immediate
\ Emitting
$20 const SPC $0d const CR $0a const LF $08 const BS $1b const ESC
alias drop emit
-alias (emit) emit
: nl> LF emit ; : spc> SPC emit ;
: _ ( a u ) for c@+ emit next drop ;
current ' rtype realias
@@ -277,10 +279,10 @@ $01 const EMETA_DOCLINE \ a doc strings that ends with LF
code move ( src dst u -- )
W>A, begin \ A=u
- PSP) 4 +) [@], PSP) [!],
+ PSP) 4 +) 8b [@], 8b PSP) [!],
1 PSP) 4 +) [+n], 1 PSP) [+n],
-1 A+n, NZ) branchC, drop
- 12 ps+, exit,
+ 8 ps+, drop, exit,
: move, ( src u -- ) here swap dup allot move ;
diff --git a/posix/vm.c b/posix/vm.c
@@ -409,7 +409,9 @@ static void CODE8() { addmeta(EMETA_8B); }
static void SUB() { vm.W = pnip() - vm.W; } // 0x48
static void MUL() { vm.W *= pnip(); }
// ( a b -- r q )
-static void DIVMOD() { dword n = pnip(); ppush(n%vm.W); vm.W = n / vm.W; }
+static void DIVMOD() { dword b = vm.W; dword a = pnip(); vm.W = a % b; ppush(a / b); }
+static void LSHIFT() { vm.W <<= pnip(); }
+static void RSHIFT() { vm.W >>= pnip(); }
static void LT() { vm.W = pnip() < vm.W; }
static void AND() { vm.W &= pnip(); } // 0x50
@@ -429,8 +431,13 @@ static void ABORT_() {
sd(NEXTMETA, 0);
QUIT();
}
+static void _stackdump(dword a, dword top) {
+ while (a < top) { printf("%08x ", gd(a)); a += 4; } printf("\n");
+}
static void DBG() {
printf("W %08x A %08x PC %08x PSP %08x RSP %08x MOD %08x\n", vm.W, vm.A, vm.PC, vm.PSP, vm.RSP, gd(MOD));
+ printf("PS "); _stackdump(vm.PSP, PSTOP);
+ printf("RS "); _stackdump(vm.RSP, RSTOP);
}
static void USLEEP() { usleep(ppop()); }
@@ -732,7 +739,7 @@ static void (*ops[OPCNT])() = {
MAYBEWORD, WORD, PARSE, FIND, WNF, FINDMOD, NULL, NULL,
STACKCHK, COMPWORD, RUNWORD, COMPILING, STARTCOMP, STOPCOMP, RSADDWR, NULL,
ALIGN4, ENTRY, CODE, CODE16, CODE8, NULL, NULL, NULL,
- SUB, MUL, DIVMOD, LT, NULL, NULL, NULL, NULL,
+ SUB, MUL, DIVMOD, LSHIFT, RSHIFT, LT, NULL, NULL,
AND, OR, XOR, NULL, NULL, NULL, NULL, NULL,
BYE, BYEFAIL, QUIT, ABORT_, DBG, USLEEP, NULL, NULL,
SHLN, SHRN, ANDN, ORN, XORN, CHECKZ, STOREZ, NULL,
@@ -776,7 +783,7 @@ static char *opnames[OPCNT-0x28] = {
"maybeword", "word", "parse", "find", "(wnf)", "findmod", NULL, NULL,
"stack?", "compword", "runword", "compiling", "]", NULL, "rs+,", NULL,
"align4", "entry", "code", "code16b", "code8b", NULL, NULL, NULL,
- "-", "*", "/mod", "<", NULL, NULL, NULL, NULL,
+ "-", "*", "/mod", "lshift", "rshift", "<", NULL, NULL,
"and", "or", "xor", NULL, NULL, NULL, NULL, NULL,
"bye", "byefail", "quit", "(abort)", "dbg", "_usleep", NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -798,6 +805,8 @@ static void buildsysdict() {
sysconst("CALLSZ", 5);
sysconst("BRSZ", 5);
sysconst("?BRSZ", 5);
+ sysconst("PSTOP", PSTOP);
+ sysconst("RSTOP", RSTOP);
sysconst("curword", CURWORD);
sysconst("sysdict", SYSDICT);
sysconst("nextmeta", NEXTMETA);
@@ -862,6 +871,7 @@ static void buildsysdict() {
sysalias("abort", "byefail");
abortaddr = find("abort");
inrdaddr = find("in<");
+ entry("main");
mainaddr = here();
callwr(find("word"));
callwr(find("runword"));