From a2f164ecc362110ecae89a7bf01bf758d4d835dd Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 26 Apr 2020 10:15:35 -0400 Subject: [PATCH] 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. --- blk/262 | 2 +- emul/Makefile | 45 ++++++++++++---------------------------- emul/forth.c | 2 +- emul/stage.c | 12 +++-------- emul/stage0.bin | Bin 0 -> 7310 bytes emul/stage1.fs | 32 ++++++++++++++++++++++++---- emul/xcomp.fs | 5 +++++ emul/z80c.bin | Bin 2236 -> 0 bytes recipes/rc2014/Makefile | 4 +--- recipes/rc2014/xcomp.fs | 2 ++ tools/Makefile | 4 +--- tools/slatest.c | 29 -------------------------- 12 files changed, 55 insertions(+), 82 deletions(-) create mode 100644 emul/stage0.bin delete mode 100644 emul/z80c.bin delete mode 100644 tools/slatest.c diff --git a/blk/262 b/blk/262 index bb7e6d5..d657f75 100644 --- a/blk/262 +++ b/blk/262 @@ -1 +1 @@ -263 LOAD 265 LOAD 268 LOAD +263 LOAD 265 LOAD 268 LOAD 269 LOAD diff --git a/emul/Makefile b/emul/Makefile index 94a01b5..7f4e648 100644 --- a/emul/Makefile +++ b/emul/Makefile @@ -1,10 +1,5 @@ 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 -SLATEST = ../tools/slatest -STRIPFC = ../tools/stripfc BIN2C = ../tools/bin2c BLKPACK = ../tools/blkpack BLKUNPACK = ../tools/blkunpack @@ -15,40 +10,26 @@ all: $(TARGETS) $(BLKPACK): $(MAKE) -C ../tools -.PHONY: $(STRIPFC) $(SLATEST) $(BIN2C) -$(STRIPFC): $(BLKPACK) -$(SLATEST): $(BLKPACK) +.PHONY: $(BIN2C) $(BLKUNPACK) $(BIN2C): $(BLKPACK) $(BLKUNPACK): $(BLKPACK) -# z80c.bin is not in the prerequisites because it's a bootstrap -# binary that should be updated manually through make updatebootstrap. -forth0.bin: - cp z80c.bin $@ - cat stage1.fs >> $@ +stage0-bin.h: $(BIN2C) + $(BIN2C) KERNEL < stage0.bin > $@ -forth0-bin.h: forth0.bin $(BIN2C) - $(BIN2C) KERNEL < forth0.bin | tee $@ > /dev/null - -stage1: stage.c $(OBJS) forth0-bin.h +stage1: stage.c $(OBJS) stage0-bin.h $(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 $@ -# We don't really need to use stripfc, but we do it anyway to test that we -# don't mistakenly break our code with that tool. It's easier to debug here. -core.bin: $(FORTHSRC_PATHS) stage1 - cat $(FORTHSRC_PATHS) stop.fs | $(STRIPFC) | ./stage1 > $@ +stage1.bin: stage1.fs stage1 + ./stage1 < stage1.fs > $@ -forth1.bin: core.bin $(SLATEST) - cat z80c.bin core.bin > $@ - $(SLATEST) $@ +stage1-bin.h: stage1.bin $(BIN2C) + $(BIN2C) KERNEL < stage1.bin > $@ -forth1-bin.h: forth1.bin $(BIN2C) - $(BIN2C) KERNEL < forth1.bin > $@ - -stage2: stage.c $(OBJS) forth1-bin.h blkfs-bin.h +stage2: stage.c $(OBJS) stage1-bin.h blkfs-bin.h $(CC) -DSTAGE2 stage.c $(OBJS) -o $@ blkfs: $(BLKPACK) @@ -57,7 +38,7 @@ blkfs: $(BLKPACK) blkfs-bin.h: blkfs $(BIN2C) $(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 $@ libz80/libz80.o: libz80/z80.c @@ -70,7 +51,7 @@ emul.o: emul.c .PHONY: updatebootstrap updatebootstrap: stage2 - cat xcomp.fs | ./stage2 > z80c.bin + cat xcomp.fs | ./stage2 > stage0.bin .PHONY: pack pack: @@ -82,5 +63,5 @@ unpack: .PHONY: 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 diff --git a/emul/forth.c b/emul/forth.c index 4677eac..cd10bbb 100644 --- a/emul/forth.c +++ b/emul/forth.c @@ -3,7 +3,7 @@ #include #include #include "emul.h" -#include "forth1-bin.h" +#include "stage1-bin.h" #include "blkfs-bin.h" // in sync with glue.asm diff --git a/emul/stage.c b/emul/stage.c index b6cef1d..27d4aea 100644 --- a/emul/stage.c +++ b/emul/stage.c @@ -3,10 +3,10 @@ #include #include "emul.h" #ifdef STAGE2 -#include "forth1-bin.h" +#include "stage1-bin.h" #include "blkfs-bin.h" #else -#include "forth0-bin.h" +#include "stage0-bin.h" #endif /* 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. //#define DEBUG -// in sync with glue.asm -#define RAMSTART 0x840 +#define RAMSTART 0 #define STDIO_PORT 0x00 // 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) @@ -112,11 +111,6 @@ int main(int argc, char *argv[]) #ifndef DEBUG // We're done, now let's spit dict data - if (start_here == 0) { - // No starting offset? Let's use LATEST - start_here = m->mem[0x08]; - start_here += m->mem[0x09] << 8; - } for (int i=start_here; imem[i]); } diff --git a/emul/stage0.bin b/emul/stage0.bin new file mode 100644 index 0000000000000000000000000000000000000000..2a0637969ca41cc73a32a1974f074ea87f7b11df GIT binary patch literal 7310 zcmcIoUu;v?89&!?O!yZ9bc8mobey!tMNE(ePI);)+*aHZ9*vz2q6urY*MQ{L~W*YnWw5Ro7QF7@B7ZVzSoBK zZ3N}s^PTVS@B4Gk&HPWq{O^Pizi$xpqsDx}nEy)5dyJLO#eBCh|D17I{6JjB{(NqE z{=A`{S@ldG&lH7lH{X9kEUhliKPCKUrvr^3tezIDBgX2JMA{G9R#D%)c>fu3?F0X3 zt8J@oplcQ^9@1)Qap~5{R@d^1_s8OX zotW7AsPNOgWBZEmqB51BNaNgi$@5_s-CckhY5T-$*a!~lOk-f55t|McX=ivh3j zG%u!x`r3-8g2D1{K#!2ECn#SeOZGw=g{v8|Iaio-e=ajO_#ROJdkFluvmPKJ(0an!vX2-qz;wcgkkS z_2lNJFAp-zUaw_mrfnKxgPUm$wMY~JoAfqXk<8F?a1$-DKe0=Ync<{&3xc{$r1AwO z3^o!0>s_M!67ginS5;lS^lgTYg^B+zjIYu95XH7I@t=k9Ra(YO+9rJ{Ags+8t*O7T zNSsJ-g!b>^)jxf1rZ61XB-S;TuZm?&F$;k$piswvQW&6IF>dIE`nk64@}D-w$)Vw= zt%LwpZ20TzdR-eg-hpUo{KCZ8(^LdhWM~0@1N9nhJv0n{`Y*f^4oI++N4^3%)POiN zOL#rKE4Gd>7t9(58xGQfqHCjg!bq%I25A`yTFW-xj&xX91bN?#4+T-?jZ%o^cU%eK zpE@%=bFLl3r2(`J;#cm3cp+`3H#3i$*U6)%na&m470(eTtx2qFTy}4%gCdGHuvvH- zzruRXcp8e19L*HT*n_%5ZYdfdxaMjVnOre#4x8zs*jRtlxMCzkJdrnxyF`8CAM2i} zPly4)(70OneYh7@ucPiGpvN{aeS{aGC^`x*uU)@@t)e1C|@co;u?15J$kj4O*w% zpVS|6zh%7ZnuGU;+;hec>u(rjv6-cB8gt+wxwr79_Wr&`e!pehgoM%_coE=zQvZF| zdEpiZ5JWP%9|H?9d4LpQnv5cOSQBzv-~+L4f_;hKL?P^UOMvnb7Hcm0{Ui5B02!jY zzXegE$U6ExrRm2C`**MnuUG|>n>Bf$Cn2WX1@SlNI(cs5()4SmS`j&U zHD_#IN6+g3i~ODgq_n0Ide`-a=WUN#QAB$+oJFopFrP}-nrj42K&e$tfK#8mYGAJjr8f~%HdD+^u}LZ3@Vwzc zltV-5)c&o=&UN=5n0iyh;o9?!;(LwHiUgQ`T1No)V?s8*vW_zGwuittFLt2HM;j~) zZmF7LqU8DBud@F(CsY;B{jbE%6^$1$`oZtVl>O=u{@kU!K*=Dy`UM@iv7#P zi)m@=33o^wzA`x|!;xN@HzggnQY$+tD+2)PZ1H}1N}4fACnuW$6b0GUEq6;QD~lAB zRF0B2tEEAT%dQ^q?`CG7;#6}<@(oI!l%(&Jq&pYsh)VzEiSdBcOl(_UEm+4%-zn)M z#yFNvSCjdn;Y>DdZ4#fd>ts5qxkv~3FSw%+e9_>Ohb-%*_B{LE?Gw}q< zT5Gisrfeqjxk53XD_VQIrLv%=z#d7rMO6=#4kikdE0k2e5~>;rb~-EwkQwB!I>-_Y z2K)~Pxk|v2@yP*YjWgLVvw4gSOGl~lrrMsW10h=5wSa#ez1oRvIzE!tj&ML3i8%-J z+5}Lx2dDQQd_?7`*P;(r}n+MZH3_lW6?7HGup;e1&TBL`Dizn1fF3r3)V~u1DCf^Vp zb3z?dH5xF~y^=<;eZbhAhotMQVKxk+dejK4lxA{J6&E65;E*(aQmC;38RgccMRY*M zDvJ=dLXN%IRT*Y`3b9Ii%W`> zku#-Tj}y_LDY4KaV$?gZb!`Bt!P_pmi{4^Pi>Wuz=q<{$sCok}3X}e+=?fE=0{UFB zV5>4|mp)%4thv=Mceh$%Q7#G`?*o;2XiH&)*)pB2>J|W5%x}AkEkCNelnbTRF_s~2 z^|vabYJT;13aQ0rE}a>DS-v_kc5Zt7;^gI4#yC-sz3N6ph-VMTFd(H15-pRa40kz~ z*ar>2X}2((lwA>fTi-S`g0!m*U!I&ElM|Dd*;-b6o??CtA-o$u@zU<8;pyJfg0%1HXv%a2SYgMsI$^H#~-N; zzc!Y$RxFXdVO&EWo00!hEOeeYL(v~8XjS^SN1;?@vjY8Ns0iXQ)Ug`sqc>+3Qj?7D zL8{ewR6URBQSDHB03R7W-RMhwrO4zGM-LQUM8lY=Y;Gt$gp|+j#i52jR$x{Kxjr+w z7z&}nK<$;u`DLV*1Yfl}pk2l8zc4X=F#shbM>S0UQ2@C1*mlthX%HcW*&W=(mB^S=tx{TX9iKl67#KsfD%f8i;sJ;?7&L+pG@pV8q9Sa>{ zw4*wu_1q$We0_ApB5gHBYEH=gsJ>1;k4dag3Bi>P={rL%FuKYc-CzB(b5=(7_TcW9 zqPfOSmy|R5L0RiO&P==u0sJRwi9_)9Yv;)(cBs6&ff}xnM8O9Y)Z1VvabiM`@ztB7 z>QxffgpT4i6q=2M=-z;`KPRunB;AWF5PY3Jg%e|-Zt&I_mpVE$OsA;I5#LzDY67cq zZfB{avP@?epAU9+64}GnEZJ8*ORzK84reV60s`;ec8rr68or@wNhw@ZduoY(ToP(T zt*X|>(Uc)v22?p?`t4Q@kTx$B4WwxtS-zoPzUz(uG^Hk&CFSr=6y7Z1LXf)YZ+ zh>4#;XF#7HWo%vF_*TQYC!-~)|8T};^zG2jxb~blv-x<6bkVrR7Z|2Nua#r9)I&z^ zM$S2QDO}|T%2RKsFNcyt5e4rYR`yo~F7Hl3UfM$~%}!R|1TY+G4J z$!sFFfm|mh+!heoqm+$^?0Tj;z*UmbmRQ+D@7{7f$U3u5@Ocw}HAcxqa(-_hb3>2g z4Ftl}{C6%hNvXJl9yuf}_tnd+oe+VL^17%27vEhbUMeCEdaOjnz0d%%-ivv2ry z=3AxIZtt{vHvFJS*1uL0u9~FXZeL3ubw(1?U%Lz$HJwoI%(o^Mmf}wQpQHF$u@oPr z_>hQu;+`efxuMfjZgNzL%wZ{|r%KjS%7edXW+L%Z?E|zDPbMnqQ8c6O{P}4s>7zB2 zu6~GaRw{`zI?+$7&2GlCpXyskFH8y=yBM%1D>i)6KQ&)1|?!<%kg<{Wm_8W8A~N#Yg{%4`ms)tGvzeFhIa+ zJ7d0I0Nz9XQbd0nOV`Ay$xzT;Mn$&F1xn=^HRP@U!#4&@sEyA`(+zjQ73^29QjsMkR~Qh8yLFe7 z$?^m^DmEfe|3G(`ldT$hWQELd%t>|B-52(&LDe6oQsbPM7GCP~2GsBtGFpB#Y%+SO z4Ki4=hRZ0gRbLLu{ovb6G(Mt%rdHf2l$@Ix!Pc?ylg9@KE0BFwC>ZG1jl;+{CnBgq zp(eU6&5Ef!HwcccifQB-CJLs6qS7^~2m87#C*1+aGAkMlY~Miru&+YYarvIHN4_Gi zOHowcBS*!D##zA`ZJPI-h{A^bu3)9_{hs5xuZTH#=+WJ;LA-m$%hE8(vlff@*+=&{>XWWckS9ZSdewmv?OxUxUAa_)8m{? zQiylF6!HZRZH1+-*i|i(330qME{Eth#5#Ox^z6j>BX#JUtBQ*9B7V<6EUr5WNg4A9 zU6(GJu9|ej9l11D_fELpH?K% zpbFQCv9YtQ?iUeCq3wBb8&OR}zJ_L);f(wPiVq-cBrqv$c=Jc6jqYtQTxr4M*&)xT z(CqZ%%1IGi0zO*(65v;#t1@d+kBQ#Och)jYxHg zI#Jpy7JA?EJb7XCseuK48DB`tnIb-kt0op>m})TPgXTg88KxmjxGqn?9HP5W;@A!n F{{j0=eTM)5 diff --git a/recipes/rc2014/Makefile b/recipes/rc2014/Makefile index e53bdc8..0825dd6 100644 --- a/recipes/rc2014/Makefile +++ b/recipes/rc2014/Makefile @@ -14,14 +14,12 @@ PATHS = \ $(FDIR)/fmt.fs \ $(FDIR)/link.fs \ run.fs -SLATEST = $(BASEDIR)/tools/slatest STRIPFC = $(BASEDIR)/tools/stripfc .PHONY: all all: $(TARGET) -$(TARGET): z80c.bin $(SLATEST) $(PATHS) +$(TARGET): z80c.bin $(PATHS) cp z80c.bin $@ - $(SLATEST) $@ cat $(PATHS) | $(STRIPFC) >> $@ z80c.bin: xcomp.fs diff --git a/recipes/rc2014/xcomp.fs b/recipes/rc2014/xcomp.fs index c6adf40..a3fbebe 100644 --- a/recipes/rc2014/xcomp.fs +++ b/recipes/rc2014/xcomp.fs @@ -22,4 +22,6 @@ H@ XOFF ! 372 LOAD ( sdc.z80 ) 393 LOAD ( icore ) (entry) _ +( Update LATEST ) +H@ XOFF @ - XOFF @ 8 + ! H@ 256 /MOD 2 PC! 2 PC! diff --git a/tools/Makefile b/tools/Makefile index d1e88fc..96609a5 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -4,14 +4,13 @@ UPLOAD_TGT = upload FONTCOMPILE_TGT = fontcompile TTYSAFE_TGT = ttysafe PINGPONG_TGT = pingpong -SLATEST_TGT = slatest STRIPFC_TGT = stripfc BIN2C_TGT = bin2c EXEC_TGT = exec BLKPACK_TGT = blkpack BLKUNPACK_TGT = blkunpack 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) OBJS = common.o @@ -27,7 +26,6 @@ $(UPLOAD_TGT): $(UPLOAD_TGT).c $(FONTCOMPILE_TGT): $(FONTCOMPILE_TGT).c $(TTYSAFE_TGT): $(TTYSAFE_TGT).c $(PINGPONG_TGT): $(PINGPONG_TGT).c -$(SLATEST_TGT): $(SLATEST_TGT).c $(STRIPFC_TGT): $(STRIPFC_TGT).c $(BIN2C_TGT): $(BIN2C_TGT).c $(EXEC_TGT): $(EXEC_TGT).c diff --git a/tools/slatest.c b/tools/slatest.c deleted file mode 100644 index 06af597..0000000 --- a/tools/slatest.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include - -/* 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); -}