boot: make HERE point to RAMEND instead of CURRENT

The former was only used in the peculiar context of "/emul". The
regular case is actually HERE pointing to RAMEND on boot.
This commit is contained in:
Virgil Dupras 2020-04-13 11:35:47 -04:00
parent 509972b08c
commit d08a9711c5
9 changed files with 28 additions and 21 deletions

View File

@ -29,7 +29,7 @@ $(BIN2C):
forth/forth0.bin: $(SLATEST)
cp forth/z80c.bin $@
$(SLATEST) $@
cat forth/emul.fs >> $@
cat forth/pre.fs forth/emul.fs >> $@
forth/forth0-bin.h: forth/forth0.bin $(BIN2C)
$(BIN2C) KERNEL < forth/forth0.bin | tee $@ > /dev/null
@ -43,14 +43,14 @@ forth/stage1dbg: forth/stage.c $(OBJS) forth/forth0-bin.h
# 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.
forth/core.bin: $(FORTHSRC_PATHS) forth/stage1
cat $(FORTHSRC_PATHS) ./forth/stop.fs | $(STRIPFC) | ./forth/stage1 | tee $@ > /dev/null
cat $(FORTHSRC_PATHS) ./forth/stop.fs | $(STRIPFC) | ./forth/stage1 > $@
forth/forth1.bin: forth/core.bin $(SLATEST)
cat forth/z80c.bin forth/core.bin > $@
$(SLATEST) $@
forth/forth1-bin.h: forth/forth1.bin $(BIN2C)
$(BIN2C) KERNEL < forth/forth1.bin | tee $@ > /dev/null
$(BIN2C) KERNEL < forth/forth1.bin > $@
forth/stage2: forth/stage.c $(OBJS) forth/forth1-bin.h
$(CC) -DSTAGE2 forth/stage.c $(OBJS) -o $@

2
emul/forth/pre.fs Normal file
View File

@ -0,0 +1,2 @@
CURRENT @ HERE !

View File

@ -1 +1 @@
: INIT RDLN$ Z80A$ INTERPRET ;
: INIT CURRENT @ HERE ! RDLN$ Z80A$ INTERPRET ;

Binary file not shown.

View File

@ -118,12 +118,14 @@ PC ORG @ 1 + ! ( main )
SP 0xfffa LDddnn,
RAMSTART SP LD(nn)dd, ( RAM+00 == INITIAL_SP )
IX RS_ADDR LDddnn,
( HERE begins at RAMEND )
HL RAMSTART 0x80 + LDddnn,
RAMSTART 0x04 + LD(nn)HL, ( RAM+04 == HERE )
( LATEST is a label to the latest entry of the dict. It is
written at offset 0x08 by the process or person building
Forth. )
0x08 LDHL(nn),
RAMSTART 0x02 + LD(nn)HL, ( RAM+02 == CURRENT )
RAMSTART 0x04 + LD(nn)HL, ( RAM+04 == HERE )
EXDEHL,
HL L1 @ LDddnn,
0x03 CALLnn, ( 03 == find )

View File

@ -170,8 +170,11 @@ advanced to the address following the null.
*** Initialization sequence
On boot, we jump to the "main" routine in boot.fs which does very few things.
It sets up the SP register, CURRENT and HERE to LATEST (saved in stable ABI),
then look for the BOOT word and calls it.
1. Set SP to 0x10000-6
2. Sets HERE to RAMEND (RAMSTART+0x80).
3. Sets CURRENT to value of LATEST field in stable ABI.
4. Look for the word "BOOT" and calls it.
In a normal system, BOOT is in icore and does a few things:
@ -192,9 +195,9 @@ as such until you set a new (c<).
Note that there is no EMIT in a bare system. You have to take care of supplying
one before your load core.fs and its higher levels.
Also note that this initialization code is fighting for space with HERE: New
entries to the dict will overwrite that code! Also, because we're barebone, we
can't have comments. This leads to peculiar code in this area. If you see weird
whitespace usage, it's probably because not using those whitespace would result
in dict entry creation overwriting the code before it has the chance to be
interpreted.
In the "/emul" binaries, "HERE" is readjusted to "CURRENT @" so that we don't
have to relocate compiled dicts. Note that in this context, the initialization
code is fighting for space with HERE: New entries to the dict will overwrite
that code! Also, because we're barebone, we can't have comments. This can lead
to peculiar code in this area where we try to "waste" space in initialization
code.

View File

@ -1,4 +1,4 @@
TARGET = os.bin
TARGET = stage1.bin
BASEDIR = ../..
FDIR = $(BASEDIR)/forth
EDIR = $(BASEDIR)/emul/forth
@ -13,7 +13,7 @@ BOOTSRCS = conf.fs \
$(FDIR)/icore.fs \
$(EDIR)/xstop.fs
PATHS = pre.fs \
PATHS = \
$(FDIR)/core.fs \
$(FDIR)/cmp.fs \
$(FDIR)/str.fs \

View File

@ -202,9 +202,9 @@ using our hex editor.
Now are we ready yet? ALMOST! There's one last thing we need to do: add runtime
source. In our case, because we have a compiled dict, the only source we need
to include is `pre.fs` and `run.fs`:
to include is `run.fs`:
cat stage2.bin pre.fs run.fs > stage2r.bin
cat stage2.bin run.fs > stage2r.bin
That's it! our binary is ready to run!
@ -212,7 +212,8 @@ That's it! our binary is ready to run!
And there you have it, a stage2 binary that you've assembled yourself. Now,
here's for your homework: use the same technique to add the contents of
`readln.fs` to stage2 so that you have a full-featured interpreter.
`readln.fs` and `adev.fs` to stage2 so that you have a full-featured
interpreter.
Name it `stage3.bin` (the version without any source code appended and no
`INIT` word defined), you'll need this binary for sub-recipes written for the
@ -221,8 +222,8 @@ RC2014.
Here's a little cheatsheet, but seriously, you should figure most of it
yourself. Tough love they call it.
* `cat stage2.bin pre.fs ../../forth/readln.fs run.fs > stage2r.bin`
* Don't forget `(c<$)`.
* `cat stage2.bin ../../forth/readln.fs ../../forth/adev.fs run.fs > stage2r.bin`
* Don't forget `RDLN$` and `ADEV$`.
* `RLDICT` is like `RLCORE` but with a chosen target.
[rc2014]: https://rc2014.co.uk

View File

@ -1 +0,0 @@
128 RAM+ HERE !