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:
parent
509972b08c
commit
d08a9711c5
@ -29,7 +29,7 @@ $(BIN2C):
|
|||||||
forth/forth0.bin: $(SLATEST)
|
forth/forth0.bin: $(SLATEST)
|
||||||
cp forth/z80c.bin $@
|
cp forth/z80c.bin $@
|
||||||
$(SLATEST) $@
|
$(SLATEST) $@
|
||||||
cat forth/emul.fs >> $@
|
cat forth/pre.fs forth/emul.fs >> $@
|
||||||
|
|
||||||
forth/forth0-bin.h: forth/forth0.bin $(BIN2C)
|
forth/forth0-bin.h: forth/forth0.bin $(BIN2C)
|
||||||
$(BIN2C) KERNEL < forth/forth0.bin | tee $@ > /dev/null
|
$(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
|
# 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.
|
# don't mistakenly break our code with that tool. It's easier to debug here.
|
||||||
forth/core.bin: $(FORTHSRC_PATHS) forth/stage1
|
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)
|
forth/forth1.bin: forth/core.bin $(SLATEST)
|
||||||
cat forth/z80c.bin forth/core.bin > $@
|
cat forth/z80c.bin forth/core.bin > $@
|
||||||
$(SLATEST) $@
|
$(SLATEST) $@
|
||||||
|
|
||||||
forth/forth1-bin.h: forth/forth1.bin $(BIN2C)
|
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
|
forth/stage2: forth/stage.c $(OBJS) forth/forth1-bin.h
|
||||||
$(CC) -DSTAGE2 forth/stage.c $(OBJS) -o $@
|
$(CC) -DSTAGE2 forth/stage.c $(OBJS) -o $@
|
||||||
|
2
emul/forth/pre.fs
Normal file
2
emul/forth/pre.fs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
CURRENT @ HERE !
|
||||||
|
|
@ -1 +1 @@
|
|||||||
: INIT RDLN$ Z80A$ INTERPRET ;
|
: INIT CURRENT @ HERE ! RDLN$ Z80A$ INTERPRET ;
|
||||||
|
Binary file not shown.
@ -118,12 +118,14 @@ PC ORG @ 1 + ! ( main )
|
|||||||
SP 0xfffa LDddnn,
|
SP 0xfffa LDddnn,
|
||||||
RAMSTART SP LD(nn)dd, ( RAM+00 == INITIAL_SP )
|
RAMSTART SP LD(nn)dd, ( RAM+00 == INITIAL_SP )
|
||||||
IX RS_ADDR LDddnn,
|
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
|
( LATEST is a label to the latest entry of the dict. It is
|
||||||
written at offset 0x08 by the process or person building
|
written at offset 0x08 by the process or person building
|
||||||
Forth. )
|
Forth. )
|
||||||
0x08 LDHL(nn),
|
0x08 LDHL(nn),
|
||||||
RAMSTART 0x02 + LD(nn)HL, ( RAM+02 == CURRENT )
|
RAMSTART 0x02 + LD(nn)HL, ( RAM+02 == CURRENT )
|
||||||
RAMSTART 0x04 + LD(nn)HL, ( RAM+04 == HERE )
|
|
||||||
EXDEHL,
|
EXDEHL,
|
||||||
HL L1 @ LDddnn,
|
HL L1 @ LDddnn,
|
||||||
0x03 CALLnn, ( 03 == find )
|
0x03 CALLnn, ( 03 == find )
|
||||||
|
19
notes.txt
19
notes.txt
@ -170,8 +170,11 @@ advanced to the address following the null.
|
|||||||
*** Initialization sequence
|
*** Initialization sequence
|
||||||
|
|
||||||
On boot, we jump to the "main" routine in boot.fs which does very few things.
|
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:
|
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
|
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.
|
one before your load core.fs and its higher levels.
|
||||||
|
|
||||||
Also note that this initialization code is fighting for space with HERE: New
|
In the "/emul" binaries, "HERE" is readjusted to "CURRENT @" so that we don't
|
||||||
entries to the dict will overwrite that code! Also, because we're barebone, we
|
have to relocate compiled dicts. Note that in this context, the initialization
|
||||||
can't have comments. This leads to peculiar code in this area. If you see weird
|
code is fighting for space with HERE: New entries to the dict will overwrite
|
||||||
whitespace usage, it's probably because not using those whitespace would result
|
that code! Also, because we're barebone, we can't have comments. This can lead
|
||||||
in dict entry creation overwriting the code before it has the chance to be
|
to peculiar code in this area where we try to "waste" space in initialization
|
||||||
interpreted.
|
code.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
TARGET = os.bin
|
TARGET = stage1.bin
|
||||||
BASEDIR = ../..
|
BASEDIR = ../..
|
||||||
FDIR = $(BASEDIR)/forth
|
FDIR = $(BASEDIR)/forth
|
||||||
EDIR = $(BASEDIR)/emul/forth
|
EDIR = $(BASEDIR)/emul/forth
|
||||||
@ -13,7 +13,7 @@ BOOTSRCS = conf.fs \
|
|||||||
$(FDIR)/icore.fs \
|
$(FDIR)/icore.fs \
|
||||||
$(EDIR)/xstop.fs
|
$(EDIR)/xstop.fs
|
||||||
|
|
||||||
PATHS = pre.fs \
|
PATHS = \
|
||||||
$(FDIR)/core.fs \
|
$(FDIR)/core.fs \
|
||||||
$(FDIR)/cmp.fs \
|
$(FDIR)/cmp.fs \
|
||||||
$(FDIR)/str.fs \
|
$(FDIR)/str.fs \
|
||||||
|
@ -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
|
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
|
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!
|
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,
|
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
|
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
|
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
|
`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
|
Here's a little cheatsheet, but seriously, you should figure most of it
|
||||||
yourself. Tough love they call it.
|
yourself. Tough love they call it.
|
||||||
|
|
||||||
* `cat stage2.bin pre.fs ../../forth/readln.fs run.fs > stage2r.bin`
|
* `cat stage2.bin ../../forth/readln.fs ../../forth/adev.fs run.fs > stage2r.bin`
|
||||||
* Don't forget `(c<$)`.
|
* Don't forget `RDLN$` and `ADEV$`.
|
||||||
* `RLDICT` is like `RLCORE` but with a chosen target.
|
* `RLDICT` is like `RLCORE` but with a chosen target.
|
||||||
|
|
||||||
[rc2014]: https://rc2014.co.uk
|
[rc2014]: https://rc2014.co.uk
|
||||||
|
@ -1 +0,0 @@
|
|||||||
128 RAM+ HERE !
|
|
Loading…
Reference in New Issue
Block a user