mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-26 10:38:07 +11:00
Compare commits
4 Commits
abb4dc8bd7
...
3383a00040
Author | SHA1 | Date | |
---|---|---|---|
|
3383a00040 | ||
|
1d468d2168 | ||
|
2be2f74a43 | ||
|
ea9833d4ff |
1
blk/040
1
blk/040
@ -11,6 +11,5 @@ CONSTANT x n -- Creates cell x that when called pushes its
|
||||
DOES> -- See B17.
|
||||
IMMED? a -- f Checks whether wordref at a is immediate.
|
||||
IMMEDIATE -- Flag the latest defined word as immediate.
|
||||
LITA n -- Write address n as a literal.
|
||||
LITN n -- Write number n as a literal.
|
||||
VARIABLE c -- Creates cell x with 2 bytes allocation.
|
||||
|
16
blk/086
16
blk/086
@ -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,12 @@ 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.
|
||||
Also note that word routines references in wordrefs are 1b.
|
||||
This means that all word routine reference must live below
|
||||
0x100 in boot binary.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
0x24: addrWord. Exactly like a numberWord, except that it is
|
||||
treated differently by meta-tools. (cont.)
|
||||
|
16
blk/087
16
blk/087
@ -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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
2
blk/243
2
blk/243
@ -5,7 +5,7 @@
|
||||
|
||||
: JPNEXT, 26 BJP, ; ( 26 == next )
|
||||
|
||||
: chkPS, L4 @ BCALL, ; ( chkPS, B305 )
|
||||
: chkPS, L4 @ CALLnn, ; ( chkPS, B305 )
|
||||
|
||||
: CODE ( same as CREATE, but with native word )
|
||||
(entry)
|
||||
|
4
blk/263
4
blk/263
@ -8,9 +8,9 @@ VARIABLE XCURRENT
|
||||
: _xapply ( a -- a-off )
|
||||
DUP ORG @ > IF ORG @ - BIN( @ + THEN ;
|
||||
: X' XCON ' XCOFF ;
|
||||
: X['] XCON ' _xapply LITA XCOFF ;
|
||||
: X['] XCON ' _xapply LITN XCOFF ;
|
||||
: XCOMPILE
|
||||
XCON ' _xapply LITA
|
||||
XCON ' _xapply LITN
|
||||
LIT< , FIND DROP _xapply , XCOFF ;
|
||||
: X[COMPILE] XCON ' _xapply , XCOFF ;
|
||||
|
||||
|
4
blk/283
4
blk/283
@ -7,8 +7,8 @@ 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, ( 24, addrWord ) NOP, NOP, ( 26, unused )
|
||||
NOP, NOP, NOP, NOP, ( 20, unused )
|
||||
NOP, NOP, NOP, NOP, ( 24, unused )
|
||||
0 JPnn, ( RST 28 )
|
||||
0 JPnn, ( 2b, doesWord ) NOP, NOP, ( 2e, unused )
|
||||
0 JPnn, ( RST 30 )
|
||||
|
22
blk/286
22
blk/286
@ -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 )
|
||||
( Literal value to push to stack is next to (n) reference
|
||||
in the atom list. That is where IP is currently pointing.
|
||||
Read, push, then advance IP. )
|
||||
E 0 IY+ LDrIXY,
|
||||
D 1 IY+ LDrIXY,
|
||||
IY INCss,
|
||||
IY INCss,
|
||||
DE PUSHqq,
|
||||
;CODE
|
||||
|
27
blk/287
27
blk/287
@ -1,16 +1,11 @@
|
||||
( See B85 for word routine impl notes )
|
||||
PC ORG @ 0x20 + ! ( numberWord )
|
||||
PC ORG @ 0x24 + ! ( addrWord )
|
||||
( 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 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 )
|
||||
|
22
blk/288
22
blk/288
@ -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
|
||||
|
||||
|
||||
|
||||
|
2
blk/303
2
blk/303
@ -3,7 +3,7 @@ PC ORG @ 0x0f + ! ( compiledWord )
|
||||
2. Set new IP to the second atom of the list
|
||||
3. Execute the first atom of the list. )
|
||||
IY PUSHqq, HL POPqq, ( <-- IP )
|
||||
L4 @ ( pushRS ) BCALL,
|
||||
L4 @ ( pushRS ) CALLnn,
|
||||
EXDEHL, ( HL points to PFA )
|
||||
( While we inc, dereference into DE for execute call later. )
|
||||
LDDE(HL),
|
||||
|
2
blk/382
2
blk/382
@ -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
|
||||
|
2
blk/397
2
blk/397
@ -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 )
|
||||
|
5
blk/399
5
blk/399
@ -1,11 +1,10 @@
|
||||
: 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
|
||||
: [ INTERPRET ; IMMEDIATE
|
||||
: ] R> DROP ;
|
||||
: LITA 36 , , ;
|
||||
: COMPILE ' LITA ['] , , ; IMMEDIATE
|
||||
: COMPILE ' LITN ['] , , ; IMMEDIATE
|
||||
: [COMPILE] ' , ; IMMEDIATE
|
||||
|
||||
|
||||
|
2
blk/400
2
blk/400
@ -5,7 +5,7 @@
|
||||
['] EXIT ,
|
||||
R> DROP ( exit : )
|
||||
; IMMEDIATE
|
||||
: ['] ' LITA ; IMMEDIATE
|
||||
: ['] ' LITN ; IMMEDIATE
|
||||
';' X' _ 4 - C! ( give ; its name )
|
||||
':' X' _ 4 - C! ( give : its name )
|
||||
'(' X' _ 4 - C!
|
||||
|
BIN
emul/forth.bin
BIN
emul/forth.bin
Binary file not shown.
Loading…
Reference in New Issue
Block a user