commit 5e9d3b8fcc67f7c8d7f9e00f219fcb03d66444a2
parent 35151beaa7aca48027994e9918d8683b11b0ba32
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Wed, 1 Jun 2022 13:51:41 -0400
Transition to x86 asm complete
Diffstat:
5 files changed, 25 insertions(+), 79 deletions(-)
diff --git a/Makefile b/Makefile
@@ -6,7 +6,7 @@ xcomp.asm: dusk.asm xcomp.txt f2asm.py aliases.txt
cat dusk.asm >> $@
./f2asm.py xcomp.txt >> $@
-dusk: xcomp.asm boot2.fs
+dusk: xcomp.asm boot.fs
nasm -f elf32 xcomp.asm -o dusk.o
ld -m elf_i386 dusk.o -o $@
diff --git a/README.md b/README.md
@@ -78,22 +78,20 @@ fun...
The roadmap so far is, of course, very fuzzy, but here's what I have in mind:
-1. Have a 32-bit Forth written in C run on top of POSIX.
-2. Tweak the VM to allow arbitrary native binary to be embedded into into words
- (something that isn't possible in Collapse OS' CVM right now).
-3. Add a "CC" word to compile C code into words using the system C compiler.
-4. Integrate a C compiler into the system to replace the system C compiler.
+1. Have a 32-bit Forth written in x86 run on top of of a Linux system.
+2. Add a "CC" word to compile C code into words using the system C compiler.
+3. Integrate a C compiler into the system to replace the system C compiler.
qbe? ack? a Forth one? to be determined.
-5. Self-host.
-6. Run as PID 1 on top of a Linux or BSD kernel.
-7. Target a machine and have it run bare metal on it.
-8. Steal drivers from Linux and/or BSD kernels to widen hardware support.
-9. Port exiting POSIX applications so that Dusk OS fulfills its stated goals.
+4. Self-host.
+5. Run as PID 1 on top of a Linux or BSD kernel.
+6. Target a machine and have it run bare metal on it.
+7. Steal drivers from Linux and/or BSD kernels to widen hardware support.
+8. Port exiting POSIX applications so that Dusk OS fulfills its stated goals.
## Status
-Not much so far. Step 1 of the roadmap above is well underway. Development
-happens on [sourcehut][3].
+We have a functional Forth prompt and currently working on step 2 of the roadmap
+above. Development happens on [sourcehut][3].
Unlike Collapse OS which is a personal effort and doesn't lend itself well to
collaboration, Dusk OS' wider scope makes it fitting for a collaborative effort.
@@ -104,11 +102,13 @@ Let's discuss this on its [public mailing list][4].
To build Dusk OS, you need:
* GNU Make
-* A C99 compiler
+* GNU binutils
+* nasm
* Python 3
+* A x86-compatible Linux kernel to run this on
Run `make` and then run `./dusk`. You'll get a prompt. Look at `xcomp.txt` and
-`boot.fs` to have an idea of the vocabyulary available. Type `bye` to quit.
+`boot.fs` to have an idea of the vocabulary available. Type `bye` to quit.
[1]: http://collapseos.org
[2]: http://collapseos.org/why.html
diff --git a/boot.fs b/boot.fs
@@ -1,18 +1,17 @@
: immediate current 1- dup c@ $80 or swap c! ;
: ['] ' litn ; immediate
: compile ' litn ['] call, call, ; immediate
-: [compile] ' call, ; immediate
-: if [compile] (?br) here 4 allot ; immediate
+: if compile (?br) here 4 allot ; immediate
: then here swap ! ; immediate
-: else [compile] (br) here 4 allot here rot ! ; immediate
+: else compile (br) here 4 allot here rot ! ; immediate
: begin here ; immediate
-: again [compile] (br) , ; immediate
-: until [compile] (?br) , ; immediate
-: next [compile] (next) , ; immediate
+: again compile (br) , ; immediate
+: until compile (?br) , ; immediate
+: next compile (next) , ; immediate
: \ begin in< LF = until ; immediate
\ hello, this is a comment!
: ," begin in< dup '"' = if drop exit then c, again ;
-: S" [compile] (br) here 4 allot here ," tuck here -^ swap
+: S" compile (br) here 4 allot here ," tuck here -^ swap
here swap ! swap litn litn ; immediate
: S= \ sa1 sl1 sa2 sl2 -- f
rot over = if \ same len, s2 s1 l )
@@ -33,6 +32,8 @@
: .S ( -- )
S" SP " stype scnt .x spc> S" RS " stype rcnt .x spc>
S" -- " stype stack? psdump ;
+: create entry compile (cell) ;
+: value entry compile (val) , ;
64 value LNSZ
create in( LNSZ allot
: in) in( 64 + ;
diff --git a/boot2.fs b/boot2.fs
@@ -1,55 +0,0 @@
-: immediate current 1- dup c@ $80 or swap c! ;
-: ['] ' litn ; immediate
-: compile ' litn ['] call, call, ; immediate
-: if compile (?br) here 4 allot ; immediate
-: then here swap ! ; immediate
-: else compile (br) here 4 allot here rot ! ; immediate
-: begin here ; immediate
-: again compile (br) , ; immediate
-: until compile (?br) , ; immediate
-: next compile (next) , ; immediate
-: \ begin in< LF = until ; immediate
-\ hello, this is a comment!
-: ," begin in< dup '"' = if drop exit then c, again ;
-: S" compile (br) here 4 allot here ," tuck here -^ swap
- here swap ! swap litn litn ; immediate
-: S= \ sa1 sl1 sa2 sl2 -- f
- rot over = if \ same len, s2 s1 l )
- []= else drop 2drop 0 then ;
-: waitw \ sa sl --
- begin 2dup word S= until 2drop ;
-: ( S" )" waitw ; immediate
-( hello, another comment! )
-: <> ( n n -- l h ) 2dup > if swap then ;
-: min <> drop ; : max <> nip ;
-: fill ( a u b -- *A* ) rot> >r >A begin dup Ac!+ next drop ;
-: .h $f and tbl-0-f + c@ emit ;
-: .x dup >> >> >> >> .h .h ;
-: nl> CR emit LF emit ; : spc> SPC emit ;
-: psdump scnt not if exit then
- scnt >A begin dup .x spc> >r scnt not until
- begin r> scnt A> = until ;
-: .S ( -- )
- S" SP " stype scnt .x spc> S" RS " stype rcnt .x spc>
- S" -- " stype stack? psdump ;
-: create entry compile (cell) ;
-: value entry compile (val) , ;
-64 value LNSZ
-create in( LNSZ allot
-: in) in( 64 + ;
-: bs? BS over = swap $7f = or ;
-: lntype ( ptr c -- ptr+1 f )
- dup bs? if ( ptr c )
- drop dup in( > if 1- BS emit then spc> BS emit 0
- else ( ptr c ) \ non-BS
- dup SPC < if drop dup in) over - 0 fill 1 else
- tuck emit c!+ dup in) = then then ;
-: rdln S" ok" stype nl> in( begin key lntype until drop nl> ;
-: rdln<? ( -- c-or-0 )
- in> in) < if in> c@+ swap to in> else 0 then ;
-: rdln< ( -- c ) rdln<? ?dup not if
- rdln in( to in> SPC then ;
-: rdln$ ['] rdln< to in< ['] rdln<? to in<?
- in) to in> 'curword 6 0 fill ;
-: init S" Dusk OS" stype rdln$ ;
-init
diff --git a/dusk.asm b/dusk.asm
@@ -1,4 +1,4 @@
-; PSP=ebp RSP=esp
+; This is a STC forth. PSP=ebp RSP=esp
BITS 32
%define PS_SZ 0x1000
%define RS_SZ 0x1000
@@ -110,7 +110,7 @@ ps_top:
herestart: resb MEMSIZE
SECTION .data
-bootsrc: incbin "boot2.fs"
+bootsrc: incbin "boot.fs"
SECTION .text
GLOBAL _start