Compare commits

...

3 Commits

Author SHA1 Message Date
Virgil Dupras
a2f164ecc3 emul: bootstrap to stage2 from within Collapse OS!
Big bootstrapping change which greatly reduces the role of the modern
operating system in the bootstrapping process.
2020-04-26 10:24:09 -04:00
Virgil Dupras
0e3cf7fa02 Add word ," 2020-04-26 09:01:49 -04:00
Virgil Dupras
4b7247a971 emul: use LATEST instead of binary size as start addr in stage
More reliable.
2020-04-26 08:37:12 -04:00
16 changed files with 71 additions and 95 deletions

View File

@ -1,3 +1,4 @@
," xxx" -- Write xxx to HERE
." xxx" -- *I* Compiles string literal xxx followed by a ." xxx" -- *I* Compiles string literal xxx followed by a
call to (print). call to (print).
C<? -- f Returns whether there's a char waiting in buf. C<? -- f Returns whether there's a char waiting in buf.
@ -11,6 +12,5 @@ IN> -- a Address of variable containing current pos in
KEY -- c Get char c from direct input KEY -- c Get char c from direct input
PC! c a -- Spit c to port a PC! c a -- Spit c to port a
PC@ a -- c Fetch c from port a PC@ a -- c Fetch c from port a
WORD -- a Read one word from buffered input and push its
addr.
(cont.) (cont.)

View File

@ -1,4 +1,5 @@
(cont.) WORD -- a Read one word from buffered input and push its
addr.
There are also ascii const emitters: There are also ascii const emitters:
BS BS
CR CR
@ -13,4 +14,3 @@ SPC

View File

@ -1 +1 @@
263 LOAD 265 LOAD 268 LOAD 263 LOAD 265 LOAD 268 LOAD 269 LOAD

11
blk/443
View File

@ -1,11 +1,12 @@
: ." : ,"
34 , ( 34 == litWord )
BEGIN BEGIN
C< C<
( 34 is ASCII for " ) ( 34 is ASCII for " )
DUP 34 = IF DROP 0 THEN DUP 34 = IF DROP EXIT THEN C,
DUP C, AGAIN ;
NOT UNTIL
: ."
34 , ( 34 == litWord ) ," 0 C,
COMPILE (print) COMPILE (print)
; IMMEDIATE ; IMMEDIATE

View File

@ -1,10 +1,5 @@
TARGETS = forth stage2 TARGETS = forth stage2
# Those Forth source files are in a particular order
FORTHSRCS = core.fs cmp.fs print.fs parse.fs readln.fs fmt.fs blk.fs
FORTHSRC_PATHS = ${FORTHSRCS:%=../forth/%} run.fs
OBJS = emul.o libz80/libz80.o OBJS = emul.o libz80/libz80.o
SLATEST = ../tools/slatest
STRIPFC = ../tools/stripfc
BIN2C = ../tools/bin2c BIN2C = ../tools/bin2c
BLKPACK = ../tools/blkpack BLKPACK = ../tools/blkpack
BLKUNPACK = ../tools/blkunpack BLKUNPACK = ../tools/blkunpack
@ -15,40 +10,26 @@ all: $(TARGETS)
$(BLKPACK): $(BLKPACK):
$(MAKE) -C ../tools $(MAKE) -C ../tools
.PHONY: $(STRIPFC) $(SLATEST) $(BIN2C) .PHONY: $(BIN2C) $(BLKUNPACK)
$(STRIPFC): $(BLKPACK)
$(SLATEST): $(BLKPACK)
$(BIN2C): $(BLKPACK) $(BIN2C): $(BLKPACK)
$(BLKUNPACK): $(BLKPACK) $(BLKUNPACK): $(BLKPACK)
# z80c.bin is not in the prerequisites because it's a bootstrap stage0-bin.h: $(BIN2C)
# binary that should be updated manually through make updatebootstrap. $(BIN2C) KERNEL < stage0.bin > $@
forth0.bin:
cp z80c.bin $@
cat stage1.fs >> $@
forth0-bin.h: forth0.bin $(BIN2C) stage1: stage.c $(OBJS) stage0-bin.h
$(BIN2C) KERNEL < forth0.bin | tee $@ > /dev/null
stage1: stage.c $(OBJS) forth0-bin.h
$(CC) stage.c $(OBJS) -o $@ $(CC) stage.c $(OBJS) -o $@
stage1dbg: stage.c $(OBJS) forth0-bin.h stage1dbg: stage.c $(OBJS) stage0-bin.h
$(CC) -DDEBUG stage.c $(OBJS) -o $@ $(CC) -DDEBUG stage.c $(OBJS) -o $@
# We don't really need to use stripfc, but we do it anyway to test that we stage1.bin: stage1.fs stage1
# don't mistakenly break our code with that tool. It's easier to debug here. ./stage1 < stage1.fs > $@
core.bin: $(FORTHSRC_PATHS) stage1
cat $(FORTHSRC_PATHS) stop.fs | $(STRIPFC) | ./stage1 > $@
forth1.bin: core.bin $(SLATEST) stage1-bin.h: stage1.bin $(BIN2C)
cat z80c.bin core.bin > $@ $(BIN2C) KERNEL < stage1.bin > $@
$(SLATEST) $@
forth1-bin.h: forth1.bin $(BIN2C) stage2: stage.c $(OBJS) stage1-bin.h blkfs-bin.h
$(BIN2C) KERNEL < forth1.bin > $@
stage2: stage.c $(OBJS) forth1-bin.h blkfs-bin.h
$(CC) -DSTAGE2 stage.c $(OBJS) -o $@ $(CC) -DSTAGE2 stage.c $(OBJS) -o $@
blkfs: $(BLKPACK) blkfs: $(BLKPACK)
@ -57,7 +38,7 @@ blkfs: $(BLKPACK)
blkfs-bin.h: blkfs $(BIN2C) blkfs-bin.h: blkfs $(BIN2C)
$(BIN2C) BLKFS < blkfs > $@ $(BIN2C) BLKFS < blkfs > $@
forth: forth.c $(OBJS) forth1-bin.h blkfs-bin.h forth: forth.c $(OBJS) stage1-bin.h blkfs-bin.h
$(CC) forth.c $(OBJS) -o $@ $(CC) forth.c $(OBJS) -o $@
libz80/libz80.o: libz80/z80.c libz80/libz80.o: libz80/z80.c
@ -70,7 +51,7 @@ emul.o: emul.c
.PHONY: updatebootstrap .PHONY: updatebootstrap
updatebootstrap: stage2 updatebootstrap: stage2
cat xcomp.fs | ./stage2 > z80c.bin cat xcomp.fs | ./stage2 > stage0.bin
.PHONY: pack .PHONY: pack
pack: pack:
@ -82,5 +63,5 @@ unpack:
.PHONY: clean .PHONY: clean
clean: clean:
rm -f $(TARGETS) emul.o *-bin.h forth?.bin blkfs rm -f $(TARGETS) emul.o *-bin.h stage{1,2}.bin blkfs
$(MAKE) -C ../tools clean $(MAKE) -C ../tools clean

View File

@ -3,7 +3,7 @@
#include <unistd.h> #include <unistd.h>
#include <termios.h> #include <termios.h>
#include "emul.h" #include "emul.h"
#include "forth1-bin.h" #include "stage1-bin.h"
#include "blkfs-bin.h" #include "blkfs-bin.h"
// in sync with glue.asm // in sync with glue.asm

View File

@ -3,10 +3,10 @@
#include <unistd.h> #include <unistd.h>
#include "emul.h" #include "emul.h"
#ifdef STAGE2 #ifdef STAGE2
#include "forth1-bin.h" #include "stage1-bin.h"
#include "blkfs-bin.h" #include "blkfs-bin.h"
#else #else
#include "forth0-bin.h" #include "stage0-bin.h"
#endif #endif
/* Staging binaries /* Staging binaries
@ -29,8 +29,7 @@ trouble of compiling defs to binary.
// By the way: there's a double-echo in stagedbg. It's normal. Don't panic. // By the way: there's a double-echo in stagedbg. It's normal. Don't panic.
//#define DEBUG //#define DEBUG
// in sync with glue.asm #define RAMSTART 0
#define RAMSTART 0x840
#define STDIO_PORT 0x00 #define STDIO_PORT 0x00
// To know which part of RAM to dump, we listen to port 2, which at the end of // To know which part of RAM to dump, we listen to port 2, which at the end of
// its compilation process, spits its HERE addr to port 2 (MSB first) // its compilation process, spits its HERE addr to port 2 (MSB first)
@ -112,9 +111,6 @@ int main(int argc, char *argv[])
#ifndef DEBUG #ifndef DEBUG
// We're done, now let's spit dict data // We're done, now let's spit dict data
if (start_here == 0) {
start_here = sizeof(KERNEL);
}
for (int i=start_here; i<end_here; i++) { for (int i=start_here; i<end_here; i++) {
putchar(m->mem[i]); putchar(m->mem[i]);
} }

BIN
emul/stage0.bin Normal file

Binary file not shown.

View File

@ -1,5 +1,28 @@
CURRENT @ HERE ! : EFS@
HERE @ 256 /MOD 2 PC! 2 PC! 256 /MOD 3 PC! 3 PC!
: EMIT 0 PC! ; 1024 0 DO
: KEY 0 PC@ ; 4 PC@
CURRENT @ 12 RAM+ ! BLK( I + C!
LOOP
;
: EFS!
256 /MOD 3 PC! 3 PC!
1024 0 DO
BLK( I + C@ 4 PC!
LOOP
;
: INIT
CURRENT @ HERE !
BLK$
['] EFS@ BLK@* !
['] EFS! BLK!* !
RDLN$
LIT< _sys [entry]
." Collapse OS" CRLF
INTERPRET
;
(entry) _
H@ 256 /MOD 2 PC! 2 PC!
H@ 0x08 ! ( update LATEST )

View File

@ -16,4 +16,9 @@ H@ XOFF !
(entry) _ (entry) _
( Update LATEST ) ( Update LATEST )
H@ XOFF @ - XOFF @ 8 + ! H@ XOFF @ - XOFF @ 8 + !
," CURRENT @ HERE ! "
," : EMIT 0 PC! ; "
," : KEY 0 PC@ ; "
422 470 XPACKR
," ' KEY 12 RAM+ ! "
H@ 256 /MOD 2 PC! 2 PC! H@ 256 /MOD 2 PC! 2 PC!

Binary file not shown.

View File

@ -12,14 +12,15 @@
AGAIN AGAIN
; ;
: ." : ,"
34 , ( 34 == litWord )
BEGIN BEGIN
C< C<
( 34 is ASCII for " ) ( 34 is ASCII for " )
DUP 34 = IF DROP 0 THEN DUP 34 = IF DROP EXIT THEN C,
DUP C, AGAIN ;
NOT UNTIL
: ."
34 , ( 34 == litWord ) ," 0 C,
COMPILE (print) COMPILE (print)
; IMMEDIATE ; IMMEDIATE

View File

@ -14,14 +14,12 @@ PATHS = \
$(FDIR)/fmt.fs \ $(FDIR)/fmt.fs \
$(FDIR)/link.fs \ $(FDIR)/link.fs \
run.fs run.fs
SLATEST = $(BASEDIR)/tools/slatest
STRIPFC = $(BASEDIR)/tools/stripfc STRIPFC = $(BASEDIR)/tools/stripfc
.PHONY: all .PHONY: all
all: $(TARGET) all: $(TARGET)
$(TARGET): z80c.bin $(SLATEST) $(PATHS) $(TARGET): z80c.bin $(PATHS)
cp z80c.bin $@ cp z80c.bin $@
$(SLATEST) $@
cat $(PATHS) | $(STRIPFC) >> $@ cat $(PATHS) | $(STRIPFC) >> $@
z80c.bin: xcomp.fs z80c.bin: xcomp.fs

View File

@ -22,4 +22,6 @@ H@ XOFF !
372 LOAD ( sdc.z80 ) 372 LOAD ( sdc.z80 )
393 LOAD ( icore ) 393 LOAD ( icore )
(entry) _ (entry) _
( Update LATEST )
H@ XOFF @ - XOFF @ 8 + !
H@ 256 /MOD 2 PC! 2 PC! H@ 256 /MOD 2 PC! 2 PC!

View File

@ -4,14 +4,13 @@ UPLOAD_TGT = upload
FONTCOMPILE_TGT = fontcompile FONTCOMPILE_TGT = fontcompile
TTYSAFE_TGT = ttysafe TTYSAFE_TGT = ttysafe
PINGPONG_TGT = pingpong PINGPONG_TGT = pingpong
SLATEST_TGT = slatest
STRIPFC_TGT = stripfc STRIPFC_TGT = stripfc
BIN2C_TGT = bin2c BIN2C_TGT = bin2c
EXEC_TGT = exec EXEC_TGT = exec
BLKPACK_TGT = blkpack BLKPACK_TGT = blkpack
BLKUNPACK_TGT = blkunpack BLKUNPACK_TGT = blkunpack
TARGETS = $(MEMDUMP_TGT) $(BLKDUMP_TGT) $(UPLOAD_TGT) $(FONTCOMPILE_TGT) \ TARGETS = $(MEMDUMP_TGT) $(BLKDUMP_TGT) $(UPLOAD_TGT) $(FONTCOMPILE_TGT) \
$(TTYSAFE_TGT) $(PINGPONG_TGT) $(SLATEST_TGT) $(STRIPFC_TGT) \ $(TTYSAFE_TGT) $(PINGPONG_TGT) $(STRIPFC_TGT) \
$(BIN2C_TGT) $(EXEC_TGT) $(BLKPACK_TGT) $(BLKUNPACK_TGT) $(BIN2C_TGT) $(EXEC_TGT) $(BLKPACK_TGT) $(BLKUNPACK_TGT)
OBJS = common.o OBJS = common.o
@ -27,7 +26,6 @@ $(UPLOAD_TGT): $(UPLOAD_TGT).c
$(FONTCOMPILE_TGT): $(FONTCOMPILE_TGT).c $(FONTCOMPILE_TGT): $(FONTCOMPILE_TGT).c
$(TTYSAFE_TGT): $(TTYSAFE_TGT).c $(TTYSAFE_TGT): $(TTYSAFE_TGT).c
$(PINGPONG_TGT): $(PINGPONG_TGT).c $(PINGPONG_TGT): $(PINGPONG_TGT).c
$(SLATEST_TGT): $(SLATEST_TGT).c
$(STRIPFC_TGT): $(STRIPFC_TGT).c $(STRIPFC_TGT): $(STRIPFC_TGT).c
$(BIN2C_TGT): $(BIN2C_TGT).c $(BIN2C_TGT): $(BIN2C_TGT).c
$(EXEC_TGT): $(EXEC_TGT).c $(EXEC_TGT): $(EXEC_TGT).c

View File

@ -1,29 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
/* Update the "LATEST" offset of target Forth binary according to filesize. */
#define OFFSET 0x08
int main(int argc, char **argv)
{
if (argc != 2) {
fprintf(stderr, "Usage: ./slatest fname\n");
return 1;
}
FILE *fp = fopen(argv[1], "r+");
if (!fp) {
fprintf(stderr, "Can't open %s.\n", argv[1]);
return 1;
}
fseek(fp, 0, SEEK_END);
unsigned int bytecount = ftell(fp);
fseek(fp, OFFSET, SEEK_SET);
char buf[2];
buf[0] = bytecount & 0xff;
buf[1] = bytecount >> 8;
fwrite(buf, 2, 1, fp);
fclose(fp);
}