Browse Source

Make literal word routines into regular native words

pull/124/head
Virgil Dupras 4 years ago
parent
commit
2be2f74a43
10 changed files with 40 additions and 67 deletions
  1. +4
    -9
      blk/086
  2. +0
    -16
      blk/087
  3. +1
    -1
      blk/283
  4. +10
    -12
      blk/286
  5. +11
    -15
      blk/287
  6. +11
    -11
      blk/288
  7. +1
    -1
      blk/382
  8. +1
    -1
      blk/397
  9. +1
    -1
      blk/399
  10. BIN
      emul/forth.bin

+ 4
- 9
blk/086 View File

@@ -1,4 +1,3 @@
(cont.)
0x2b: doesWord. This word is created by "DOES>" and is followed
by a 2-byte value as well as the address where "DOES>" was
compiled. At that address is an atom list exactly like in a
@@ -6,11 +5,7 @@ compiled word. Upon execution, after having pushed its cell
addr to PSP, it execute its reference exactly like a
compiledWord.

0x20: numberWord. No word is actually compiled with this
routine, but atoms are. Atoms with a reference to the number
words routine are followed, *in the atom list*, of a 2-byte
number. Upon execution, that number is fetched and IP is
avdanced by an extra 2 bytes.

0x24: addrWord. Exactly like a numberWord, except that it is
treated differently by meta-tools. (cont.)
Also note that word routines references in wordrefs are 1b.
This means that all word routine reference must live below
0x100 in boot binary. This is why numberWord and addrWord are
squeezed where they are.

+ 0
- 16
blk/087 View File

@@ -1,16 +0,0 @@
(cont.)
0x22: litWord. Similar to a number word, except that instead of
being followed by a 2 byte number, it is followed by a
null-terminated string. Upon execution, the address of that
null-terminated string is pushed on the PSP and IP is advanced
to the address following the null.

Also note that word routines references in wordrefs are 1b.
This means that all word routine reference must live below
0x100 in boot binary. This is why numberWord and addrWord are
squeezed where they are.






+ 1
- 1
blk/283 View File

@@ -7,7 +7,7 @@ NOP, ( 0a, unused )
0 JPnn, ( 14, popRS )
EXDEHL, JP(HL), NOP, ( 17, nativeWord )
0 JPnn, ( 1a, next ) 0 JPnn, ( unused )
NOP, NOP, ( 20, numberWord ) NOP, NOP, ( 22, litWord )
NOP, NOP, NOP, NOP, ( 20, unused )
NOP, NOP, NOP, NOP, ( 24, unused )
0 JPnn, ( RST 28 )
0 JPnn, ( 2b, doesWord ) NOP, NOP, ( 2e, unused )


+ 10
- 12
blk/286 View File

@@ -1,16 +1,14 @@
CODE 2>R ( 0xa9 )
DE POPqq, HL POPqq,
17 BCALL, ( 17 == pushRS ) EXDEHL, 17 BCALL,
;CODE ( END OF STABLE ABI )
CODE >R
HL POPqq,
17 BCALL, ( 17 == pushRS )
;CODE
CODE R>
20 BCALL, ( 20 == popRS )
HL PUSHqq,
;CODE
CODE 2R>
20 BCALL, ( 20 == popRS ) EXDEHL, 20 BCALL,
HL PUSHqq, DE PUSHqq,
;CODE NOP, NOP, NOP,
CODE (n) ( 0xbf, number literal )
( PF means nothing and the actual number is placed next to
the (n) reference in the compiled word list. What we need
to do to fetch that number is to play with the IP. )
E 0 IY+ LDrIXY,
D 1 IY+ LDrIXY,
IY INCss,
IY INCss,
DE PUSHqq,
;CODE

+ 11
- 15
blk/287 View File

@@ -1,15 +1,11 @@
( See B85 for word routine impl notes )
PC ORG @ 0x20 + ! ( numberWord )
( This is not a word, but a number literal. This works a bit
differently than others: PF means nothing and the actual
number is placed next to the numberWord reference in the
compiled word list. What we need to do to fetch that number
is to play with the IP. )
E 0 IY+ LDrIXY,
D 1 IY+ LDrIXY,
IY INCss,
IY INCss,
DE PUSHqq,
JPNEXT,


CODE (s) ( 0xd4, string literal )
( Like (n) but instead of being followed by a 2 bytes
number, it's followed by a null-terminated string. When
called, puts the string's address on PS )
IY PUSHqq, HL POPqq, ( <-- IP )
E (HL) LDrr, D 0 LDrn,
DE INCss,
DE ADDIYss,
HL PUSHqq,
;CODE
( END OF STABLE ABI )

+ 11
- 11
blk/288 View File

@@ -1,15 +1,15 @@
PC ORG @ 0x22 + ! ( litWord, 0xf7, tight on the 0x100 limit )
( Like numberWord, but instead of being followed by a 2 bytes
number, it's followed by a null-terminated string. When
called, puts the string's address on PS )
IY PUSHqq, HL POPqq, ( <-- IP )
E (HL) LDrr, D 0 LDrn,
DE INCss,
DE ADDIYss,
CODE >R
HL POPqq,
17 BCALL, ( 17 == pushRS )
;CODE
CODE R>
20 BCALL, ( 20 == popRS )
HL PUSHqq,
JPNEXT,


;CODE
CODE 2R>
20 BCALL, ( 20 == popRS ) EXDEHL, 20 BCALL,
HL PUSHqq, DE PUSHqq,
;CODE





+ 1
- 1
blk/382 View File

@@ -3,7 +3,7 @@
C< DUP 34 ( ASCII " ) = IF DROP EXIT THEN C,
AGAIN ;
: LIT"
34 , ( litWord ) H@ 0 C, ,"
COMPILE (s) H@ 0 C, ,"
DUP H@ -^ 1- ( a len ) SWAP C!
; IMMEDIATE
: ." [COMPILE] LIT" COMPILE (print) ; IMMEDIATE


+ 1
- 1
blk/397 View File

@@ -3,7 +3,7 @@
: DO COMPILE 2>R H@ ; IMMEDIATE
: LOOP COMPILE (loop) H@ - _bchk , ; IMMEDIATE
( LEAVE is implemented in low xcomp )
: LITN 32 , , ( 32 == NUMBER ) ;
: LITN COMPILE (n) , ;
( gets its name at the very end. can't comment afterwards )
: _ BEGIN LIT< ) WORD S= UNTIL ; IMMEDIATE
: _ ( : will get its name almost at the very end )


+ 1
- 1
blk/399 View File

@@ -1,4 +1,4 @@
: LIT< WORD 34 , DUP C@ 1+ MOVE, ; IMMEDIATE
: LIT< COMPILE (s) WORD DUP C@ 1+ MOVE, ; IMMEDIATE
: BEGIN H@ ; IMMEDIATE
: AGAIN COMPILE (br) H@ - _bchk , ; IMMEDIATE
: UNTIL COMPILE (?br) H@ - _bchk , ; IMMEDIATE


BIN
emul/forth.bin View File


Loading…
Cancel
Save