duskos

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

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:
Mfs/lib/meta.fs | 3+++
Mfs/sys/io.fs | 1-
Mfs/xcomp/bootlo.fs | 20+++++++++++---------
Mposix/vm.c | 16+++++++++++++---
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"));