511 lines
11 KiB
FortranFixed
511 lines
11 KiB
FortranFixed
|
CR .( UTILS_.F)
|
|||
|
REQUIRE [IF] ~MAK\CompIF.f
|
|||
|
\ WINAPI: GetCurrentDirectoryA KERNEL32.DLL
|
|||
|
\ WINAPI: MoveFileA KERNEL32.DLL
|
|||
|
|
|||
|
: DEFER VECT ;
|
|||
|
|
|||
|
80 CONSTANT MAXSTRING
|
|||
|
|
|||
|
C" PLACE" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
|
|||
|
255 CONSTANT MAXCOUNTED \ maximum length of contents of a counted string
|
|||
|
|
|||
|
|
|||
|
: "CLIP" ( a1 n1 -- a1 n1' ) \ clip a string to between 0 and MAXCOUNTED
|
|||
|
MAXCOUNTED MIN 0 MAX ;
|
|||
|
|
|||
|
: PLACE ( addr len dest -- )
|
|||
|
SWAP "CLIP" SWAP
|
|||
|
2DUP 2>R
|
|||
|
CHAR+ SWAP MOVE
|
|||
|
2R> C! ;
|
|||
|
|
|||
|
: +PLACE ( addr len dest -- ) \ append string addr,len to counted
|
|||
|
\ string dest
|
|||
|
>R "CLIP" MAXCOUNTED R@ C@ - MIN R>
|
|||
|
\ clip total to MAXCOUNTED string
|
|||
|
2DUP 2>R
|
|||
|
|
|||
|
COUNT CHARS + SWAP MOVE
|
|||
|
2R> +! ;
|
|||
|
|
|||
|
: C+PLACE ( c1 a1 -- ) \ append char c1 to the counted string at a1
|
|||
|
DUP 1+! COUNT + 1- C! ;
|
|||
|
[THEN]
|
|||
|
: OFF 0! ;
|
|||
|
|
|||
|
: BLANK ( addr len -- ) \ fill addr for len with spaces (blanks)
|
|||
|
BL FILL ;
|
|||
|
|
|||
|
: START/STOP ( -- )
|
|||
|
KEY?
|
|||
|
IF KEY 27 = IF ABORT THEN
|
|||
|
THEN ;
|
|||
|
|
|||
|
: .S ( -- )
|
|||
|
S0 @ SP@ CELL+ 2DUP =
|
|||
|
IF ." EMPTY" 2DROP
|
|||
|
ELSE DO I @ . START/STOP 1 CELLS +LOOP
|
|||
|
THEN ;
|
|||
|
|
|||
|
C" TUCK" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: TUCK ( n1 n2 -- n2 n1 n2 ) \ copy top data stack to under second item
|
|||
|
SWAP OVER ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
|
|||
|
128 CONSTANT SPCS-MAX ( optimization for SPACES )
|
|||
|
|
|||
|
CREATE SPCS
|
|||
|
SPCS-MAX ALLOT
|
|||
|
SPCS SPCS-MAX BLANK
|
|||
|
|
|||
|
: (D.) ( d -- addr len ) TUCK DABS <# #S ROT SIGN #> ;
|
|||
|
|
|||
|
C" WITHIN" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: WITHIN ( n1 low high -- f1 ) \ f1=true if ((n1 >= low) & (n1 < high))
|
|||
|
OVER - >R - R> U< ;
|
|||
|
[THEN]
|
|||
|
: BETWEEN 1+ WITHIN ;
|
|||
|
|
|||
|
80 VALUE COLS
|
|||
|
|
|||
|
: H.R ( n1 n2 -- ) \ display n1 as a hex number right
|
|||
|
\ justified in a field of n2 characters
|
|||
|
BASE @ >R HEX >R
|
|||
|
0 <# #S #> R> OVER - SPACES TYPE
|
|||
|
R> BASE ! ;
|
|||
|
|
|||
|
: H.N ( n1 n2 -- ) \ display n1 as a HEX number of n2 digits
|
|||
|
BASE @ >R HEX >R
|
|||
|
0 <# R> 0 ?DO # LOOP #> TYPE
|
|||
|
R> BASE ! ;
|
|||
|
: COL ( N -- )
|
|||
|
DROP 9 EMIT ;
|
|||
|
|
|||
|
: UPC [ CHAR A CHAR a XOR INVERT ] LITERAL AND ;
|
|||
|
|
|||
|
: 2, ( D -- )
|
|||
|
HERE 2! 2 CELLS ALLOT ;
|
|||
|
|
|||
|
: VOC-STATE,
|
|||
|
CONTEXT @ ,
|
|||
|
CONTEXT @ @ ,
|
|||
|
VOC-LIST @ VOC-LIST 2,
|
|||
|
CURRENT @ CURRENT 2,
|
|||
|
LAST @ LAST 2,
|
|||
|
VOC-LIST @
|
|||
|
BEGIN ?DUP
|
|||
|
WHILE DUP CELL+ DUP @ SWAP 2, @
|
|||
|
REPEAT
|
|||
|
;
|
|||
|
: INCLUDE BL WORD COUNT INCLUDED ;
|
|||
|
|
|||
|
: CELLS+ CELLS + ;
|
|||
|
|
|||
|
: ? @ . ;
|
|||
|
: DEFINED ( -- str 0 | cfa flag )
|
|||
|
BL WORD FIND ;
|
|||
|
|
|||
|
: [IFUNDEF] DEFINED NIP 0= POSTPONE [IF] ;
|
|||
|
\ C" CELL-" FIND NIP 0=
|
|||
|
1
|
|||
|
[IF] : CELL- 1 CELLS - ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
\ C" LCOUNT" FIND NIP 0=
|
|||
|
1
|
|||
|
[IF] : LCOUNT CELL+ DUP CELL- @ ;
|
|||
|
[THEN]
|
|||
|
: INCR 1 SWAP +! ;
|
|||
|
: FIELD+ -- ;
|
|||
|
0 [IF]
|
|||
|
: CUR_DIR PAD 256 GetCurrentDirectoryA PAD SWAP ;
|
|||
|
CREATE FIRST-PATH-BUF CUR_DIR NIP 1+ ALLOT
|
|||
|
CUR_DIR FIRST-PATH-BUF PLACE
|
|||
|
: FIRST-PATH" FIRST-PATH-BUF COUNT ;
|
|||
|
: RENAME-FILE ( adr1 len adr2 len -- ior )
|
|||
|
4DUP + DUP @ 2>R + DUP @ 2>R
|
|||
|
4DUP + 0! + 0!
|
|||
|
DROP NIP SWAP MoveFileA
|
|||
|
2R> SWAP ! 2R> SWAP !
|
|||
|
;
|
|||
|
|
|||
|
[THEN]
|
|||
|
: FILE-APPEND ( fileid -- ior )
|
|||
|
DUP >R FILE-SIZE DROP
|
|||
|
R> RESIZE-FILE ;
|
|||
|
|
|||
|
C" U>" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: U> ( U1 U2 -- FLAG )
|
|||
|
SWAP U< ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" FOLLOWER" FIND NIP
|
|||
|
[IF]
|
|||
|
: 2, ( D -- )
|
|||
|
HERE 2! 2 CELLS ALLOT ;
|
|||
|
|
|||
|
: VOC-STATE,
|
|||
|
CONTEXT @ ,
|
|||
|
CONTEXT @ @ ,
|
|||
|
VOC-LIST @ VOC-LIST 2,
|
|||
|
CURRENT @ CURRENT 2,
|
|||
|
LAST @ LAST 2,
|
|||
|
VOC-LIST @
|
|||
|
BEGIN ?DUP
|
|||
|
WHILE DUP CELL+ DUP @ SWAP 2, @
|
|||
|
REPEAT
|
|||
|
;
|
|||
|
|
|||
|
: MARKER, ( -- ADDR )
|
|||
|
HERE
|
|||
|
VOC-STATE,
|
|||
|
FOLLOWER @ FOLLOWER 2,
|
|||
|
HERE 4 CELLS + DP 2, 0. 2,
|
|||
|
;
|
|||
|
: MARKER! ( ADDR -- )
|
|||
|
DUP @ CONTEXT ! CELL+
|
|||
|
DUP @ CONTEXT @ ! CELL+
|
|||
|
BEGIN DUP 2@ DUP
|
|||
|
WHILE ! 2 CELLS +
|
|||
|
REPEAT 2DROP DROP ;
|
|||
|
[ELSE]
|
|||
|
: MARKER ( "<spaces>name" -- ) \ 94 CORE EXT
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> name, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
\ name <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ( -- )
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
\ <20> <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> name. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> name <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
\ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
|||
|
\ <20><><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
HERE
|
|||
|
\ [C]HERE , [E]HERE ,
|
|||
|
GET-CURRENT ,
|
|||
|
GET-ORDER DUP , 0 ?DO DUP , @ , LOOP
|
|||
|
CREATE ,
|
|||
|
DOES> @ DUP \ ONLY
|
|||
|
\ DUP @ [C]DP ! CELL+
|
|||
|
\ DUP @ [E]DP ! CELL+
|
|||
|
DUP @ SET-CURRENT CELL+
|
|||
|
DUP @ >R R@ CELLS 2* + 1 CELLS - R@ 0
|
|||
|
?DO DUP DUP @ SWAP CELL+ @ OVER ! SWAP 2 CELLS - LOOP
|
|||
|
DROP R> SET-ORDER
|
|||
|
DP !
|
|||
|
;
|
|||
|
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" BODY>" FIND NIP 0=
|
|||
|
[IF] : BODY> 5 - ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" >NAME" FIND NIP 0=
|
|||
|
[IF] : >NAME 4 - DUP BEGIN 1- 2DUP COUNT + U< 0= UNTIL NIP ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" CELL/" FIND NIP 0=
|
|||
|
[IF] : CELL/ ( N - N1 ) 2 RSHIFT ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" IMAGE-BEGIN" FIND NIP
|
|||
|
[IF]
|
|||
|
: ?NAME ( ADDR - FLAG )
|
|||
|
DUP IMAGE-BEGIN U>
|
|||
|
OVER HERE U< AND
|
|||
|
IF DUP >NAME COUNT + CELL+ =
|
|||
|
ELSE DROP FALSE
|
|||
|
THEN ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
H-STDOUT CONSTANT FORTH-OUT
|
|||
|
|
|||
|
: FORTH-IO
|
|||
|
FORTH-OUT H-STDOUT <>
|
|||
|
IF H-STDOUT CLOSE-FILE DROP
|
|||
|
FORTH-OUT TO H-STDOUT
|
|||
|
THEN
|
|||
|
;
|
|||
|
: H. BASE @ HEX SWAP U. BASE ! ;
|
|||
|
: 3DROP DROP 2DROP ;
|
|||
|
: 4DUP 2OVER 2OVER ;
|
|||
|
: 0.0 0 DUP ;
|
|||
|
: IS POSTPONE TO ; IMMEDIATE
|
|||
|
|
|||
|
C" -ROT" FIND NIP 0=
|
|||
|
[IF] : -ROT ROT ROT ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
|
|||
|
: SCAN ( adr len char -- adr' len' )
|
|||
|
\ Scan for char through addr for len, returning addr' and len' of char.
|
|||
|
>R 2DUP R> -ROT
|
|||
|
OVER + SWAP
|
|||
|
?DO DUP I C@ =
|
|||
|
IF LEAVE
|
|||
|
ELSE >R 1 -1 D+ R>
|
|||
|
THEN
|
|||
|
LOOP DROP ;
|
|||
|
|
|||
|
: SSKIP ( adr len char -- adr' len' )
|
|||
|
\ Skip char through addr for len, returning addr' and len' of char+1.
|
|||
|
>R 2DUP R> -ROT
|
|||
|
OVER + SWAP
|
|||
|
?DO DUP I C@ <>
|
|||
|
IF LEAVE
|
|||
|
ELSE >R 1 -1 D+ R>
|
|||
|
THEN
|
|||
|
LOOP DROP ;
|
|||
|
|
|||
|
1 CELLS CONSTANT CELL
|
|||
|
|
|||
|
C" LSCAN" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: LSCAN ( adr len long -- adr' len' )
|
|||
|
\ Scan for char through addr for len, returning addr' and len' of char.
|
|||
|
>R 2DUP CELLS R> -ROT \ adr len long adr len
|
|||
|
OVER + SWAP \ adr len long adr+len adr
|
|||
|
?DO DUP I @ =
|
|||
|
IF LEAVE
|
|||
|
ELSE >R 1- >R CELL+ R> R>
|
|||
|
THEN CELL
|
|||
|
+LOOP DROP ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" /STRING" FIND NIP 0=
|
|||
|
[IF] : /STRING DUP >R - SWAP R> + SWAP ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
: "TO-PATHEND" ( a1 n1 --- a2 n2 ) \ return a2 and count=n1 of filename
|
|||
|
OVER 1+ C@ [CHAR] : = \ second char is ':'
|
|||
|
OVER 2 > AND \ and name is longer than two characters
|
|||
|
IF 2 /STRING \ then remove first two characters
|
|||
|
THEN \ now scan to end of last '\' in filename
|
|||
|
BEGIN 2DUP [CHAR] \ SCAN ?DUP
|
|||
|
WHILE 2SWAP 2DROP 1 /STRING
|
|||
|
REPEAT DROP ;
|
|||
|
|
|||
|
: ON TRUE SWAP ! ;
|
|||
|
C" -ROT" FIND NIP 0=
|
|||
|
[IF] : -ROT ROT ROT ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" BOUNDS" FIND NIP 0=
|
|||
|
[IF] : BOUNDS OVER + SWAP ;
|
|||
|
[THEN]
|
|||
|
: >= < INVERT ;
|
|||
|
: 4DROP 2DROP 2DROP ;
|
|||
|
|
|||
|
C" RECURSE" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: RECURSE ( -- ) \ cause current definition to execute itself
|
|||
|
?COMP LAST @ NAME> COMPILE, ; IMMEDIATE
|
|||
|
[THEN]
|
|||
|
C" DUP>R" FIND NIP 0=
|
|||
|
[IF] : DUP>R POSTPONE DUP POSTPONE >R ; IMMEDIATE
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" PICK" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: PICK ( n -- n' )
|
|||
|
1+ CELLS SP@ + @ ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" ROLL" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
|
|||
|
: ROLL ( n1 n2 .. nk k -- n2 n3 .. nk n1 )
|
|||
|
\ Rotate k values on the stack, bringing the deepest to the top.
|
|||
|
\ ?DUP IF 1- SWAP >R RECURSE R> SWAP THEN ;
|
|||
|
DUP>R PICK SP@ DUP CELL+ R> 1+ CELLS MOVE DROP ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" AHEAD" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: AHEAD POSTPONE FALSE POSTPONE IF ; IMMEDIATE
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" NOT" FIND NIP 0=
|
|||
|
[IF] : NOT 0= ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" ?EXIT" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: ?EXIT POSTPONE IF
|
|||
|
POSTPONE EXIT
|
|||
|
POSTPONE THEN ; IMMEDIATE
|
|||
|
\ : ?EXIT IF RDROP THEN ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
: BEEP 7 EMIT ;
|
|||
|
|
|||
|
16 CONSTANT #VOCS
|
|||
|
-1 CELLS CONSTANT -CELL
|
|||
|
C" D2*" FIND NIP 0=
|
|||
|
[IF] : D2* 2DUP D+ ;
|
|||
|
[THEN]
|
|||
|
: ," [CHAR] " WORD C@ 1+ ALLOT 0 C, ;
|
|||
|
: TAB 9 EMIT ;
|
|||
|
|
|||
|
: (D.) ( d -- addr len ) TUCK DABS <# #S ROT SIGN #> ;
|
|||
|
: D.R ( d w -- ) >R (D.) R> OVER - SPACES TYPE ;
|
|||
|
: U.R ( u w -- ) 0 SWAP D.R ;
|
|||
|
: $ SOURCE TYPE CR ; IMMEDIATE
|
|||
|
: +NULL ( a1 -- ) \ append a NULL just beyond the counted chars
|
|||
|
COUNT + 0 SWAP C! ;
|
|||
|
|
|||
|
C" CELLS+" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: CELLS+ CELLS + ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" +CELLS" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: +CELLS SWAP CELLS+ ;
|
|||
|
[THEN]
|
|||
|
C" PERFORM" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: PERFORM @ EXECUTE ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" UPPER" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: UPPER ( A L -- )
|
|||
|
OVER + SWAP
|
|||
|
?DO I C@ DUP [CHAR] Z U>
|
|||
|
IF 0xDF AND
|
|||
|
THEN I C!
|
|||
|
LOOP ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" RESET-STACKS" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: RESET-STACKS S0 @ SP! ;
|
|||
|
[THEN]
|
|||
|
C" D-" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: D- ( D1 D2 -- FLAG )
|
|||
|
DNEGATE D+ ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" D=" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: D= ( D1 D2 -- FLAG )
|
|||
|
D- D0= ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" D<>" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: D<> ( D1 D2 -- FLAG )
|
|||
|
D= INVERT ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" <=" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: <= ( D1 D2 -- FLAG )
|
|||
|
> INVERT ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" UMAX" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: UMAX ( D1 D2 -- FLAG )
|
|||
|
2DUP U< IF NIP ELSE DROP THEN ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" D2/" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: D2/ ( d1 -- d2 ) \ divide the double number d1 by two
|
|||
|
DUP 1 AND 0x1F RSHIFT ROT 2/ OR SWAP 2/ ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" D0<" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: D0< ( d1 -- f1 )
|
|||
|
\ Signed compare d1 double number with zero. If d1 < 0, RETNurn TRUE.
|
|||
|
0< NIP ;
|
|||
|
[THEN]
|
|||
|
C" \S" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: \S \ comment to end of file
|
|||
|
BEGIN REFILL 0= UNTIL
|
|||
|
|
|||
|
\ SOURCE-ID FILE-SIZE DROP
|
|||
|
\ SOURCE-ID REPOSITION-FILE DROP
|
|||
|
[COMPILE] \ ; IMMEDIATE
|
|||
|
[THEN]
|
|||
|
|
|||
|
\ C" NEEDS" FIND NIP 0=
|
|||
|
0
|
|||
|
[IF]
|
|||
|
: NEEDS
|
|||
|
BL WORD FIND NIP
|
|||
|
BL WORD SWAP 0=
|
|||
|
IF COUNT INCLUDED
|
|||
|
ELSE DROP
|
|||
|
THEN
|
|||
|
;
|
|||
|
[THEN]
|
|||
|
C" 0MIN" FIND NIP 0=
|
|||
|
[IF] : 0MIN 0 MIN ;
|
|||
|
[THEN]
|
|||
|
C" 0MAX" FIND NIP 0=
|
|||
|
[IF] : 0MAX 0 MIN ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" H." FIND NIP 0=
|
|||
|
[IF] : H. BASE @ SWAP HEX U. BASE ! ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" .HS" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: .HS ( N -- N1 )
|
|||
|
BASE @ >R HEX .S R> BASE ! ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
|
|||
|
C" MS" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
C" PAUSE" FIND NIP
|
|||
|
[IF] : MS ( N -- ) PAUSE ;
|
|||
|
[THEN]
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" 0>" FIND NIP 0=
|
|||
|
[IF]
|
|||
|
: 0> ( N -- ) NEGATE 0< ;
|
|||
|
[THEN]
|
|||
|
C" CS-DUP" FIND NIP 0=
|
|||
|
[IF] : CS-DUP 2DUP ;
|
|||
|
[THEN]
|
|||
|
C" M_WL" FIND NIP 0=
|
|||
|
[IF] : M_WL CS-DUP POSTPONE WHILE ; IMMEDIATE
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" AHEAD" FIND NIP 0=
|
|||
|
[IF] : AHEAD ?COMP HERE BRANCH, >MARK 1 ; IMMEDIATE
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" CS-DUP" FIND NIP 0=
|
|||
|
[IF] : CS-DUP 2DUP ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" CS-!" FIND NIP 0=
|
|||
|
[IF] : CS-! 2! ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" CS-@" FIND NIP 0=
|
|||
|
[IF] : CS-@ 2@ ;
|
|||
|
[THEN]
|
|||
|
|
|||
|
C" CS-CELLS" FIND NIP 0=
|
|||
|
[IF] : CS-CELLS CELLS 2* ;
|
|||
|
[THEN]
|