📄 eforth.asm
字号:
; RP0 ( -- a )
; Pointer to bottom of the return stack.
$USER 3,'RP0',RZERO
; '?KEY ( -- a )
; Execution vector of ?KEY.
$USER 5,"'?KEY",TQKEY
; 'EMIT ( -- a )
; Execution vector of EMIT.
$USER 5,"'EMIT",TEMIT
; 'EXPECT ( -- a )
; Execution vector of EXPECT.
$USER 7,"'EXPECT",TEXPE
; 'TAP ( -- a )
; Execution vector of TAP.
$USER 4,"'TAP",TTAP
; 'ECHO ( -- a )
; Execution vector of ECHO.
$USER 5,"'ECHO",TECHO
; 'PROMPT ( -- a )
; Execution vector of PROMPT.
$USER 7,"'PROMPT",TPROM
; BASE ( -- a )
; Storage of the radix base for numeric I/O.
$USER 4,'BASE',BASE
; tmp ( -- a )
; A temporary storage location used in parse and find.
$USER COMPO+3,'tmp',TEMP
; SPAN ( -- a )
; Hold character count received by EXPECT.
$USER 4,'SPAN',SPAN
; >IN ( -- a )
; Hold the character pointer while parsing input stream.
$USER 3,'>IN',INN
; #TIB ( -- a )
; Hold the current count and address of the terminal input buffer.
$USER 4,'#TIB',NTIB
_USER = _USER+CELLL
; CSP ( -- a )
; Hold the stack pointer for error checking.
$USER 3,'CSP',CSP
; 'EVAL ( -- a )
; Execution vector of EVAL.
$USER 5,"'EVAL",TEVAL
; 'NUMBER ( -- a )
; Execution vector of NUMBER?.
$USER 7,"'NUMBER",TNUMB
; HLD ( -- a )
; Hold a pointer in building a numeric output string.
$USER 3,'HLD',HLD
; HANDLER ( -- a )
; Hold the return stack pointer for error handling.
$USER 7,'HANDLER',HANDL
; CONTEXT ( -- a )
; A area to specify vocabulary search order.
$USER 7,'CONTEXT',CNTXT
_USER = _USER+VOCSS*CELLL ;vocabulary stack
; CURRENT ( -- a )
; Point to the vocabulary to be extended.
$USER 7,'CURRENT',CRRNT
_USER = _USER+CELLL ;vocabulary link pointer
; CP ( -- a )
; Point to the top of the code dictionary.
$USER 2,'CP',CP
; NP ( -- a )
; Point to the bottom of the name dictionary.
$USER 2,'NP',NP
; LAST ( -- a )
; Point to the last name in the name dictionary.
$USER 4,'LAST',LAST
;; Common functions
; doVOC ( -- )
; Run time action of VOCABULARY's.
$COLON COMPO+5,'doVOC',DOVOC
DW RFROM,CNTXT,STORE,EXIT
; FORTH ( -- )
; Make FORTH the context vocabulary.
$COLON 5,'FORTH',FORTH
DW DOVOC
DW 0 ;vocabulary head pointer
DW 0 ;vocabulary link pointer
; ?DUP ( w -- w w | 0 )
; Dup tos if its is not zero.
$COLON 4,'?DUP',QDUP
DW DUPP
DW QBRAN,QDUP1
DW DUPP
QDUP1: DW EXIT
; ROT ( w1 w2 w3 -- w2 w3 w1 )
; Rot 3rd item to top.
$COLON 3,'ROT',ROT
DW TOR,SWAP,RFROM,SWAP,EXIT
; 2DROP ( w w -- )
; Discard two items on stack.
$COLON 5,'2DROP',DDROP
DW DROP,DROP,EXIT
; 2DUP ( w1 w2 -- w1 w2 w1 w2 )
; Duplicate top two items.
$COLON 4,'2DUP',DDUP
DW OVER,OVER,EXIT
; + ( w w -- sum )
; Add top two items.
$COLON 1,'+',PLUS
DW UPLUS,DROP,EXIT
; D+ ( d d -- d )
; Double addition, as an example using UM+.
;
; $COLON 2,'D+',DPLUS
; DW TOR,SWAP,TOR,UPLUS
; DW RFROM,RFROM,PLUS,PLUS,EXIT
; NOT ( w -- w )
; One's complement of tos.
$COLON 3,'NOT',INVER
DW DOLIT,-1,XORR,EXIT
; NEGATE ( n -- -n )
; Two's complement of tos.
$COLON 6,'NEGATE',NEGAT
DW INVER,DOLIT,1,PLUS,EXIT
; DNEGATE ( d -- -d )
; Two's complement of top double.
$COLON 7,'DNEGATE',DNEGA
DW INVER,TOR,INVER
DW DOLIT,1,UPLUS
DW RFROM,PLUS,EXIT
; - ( n1 n2 -- n1-n2 )
; Subtraction.
$COLON 1,'-',SUBB
DW NEGAT,PLUS,EXIT
; ABS ( n -- n )
; Return the absolute value of n.
$COLON 3,'ABS',ABSS
DW DUPP,ZLESS
DW QBRAN,ABS1
DW NEGAT
ABS1: DW EXIT
; = ( w w -- t )
; Return true if top two are equal.
$COLON 1,'=',EQUAL
DW XORR
DW QBRAN,EQU1
DW DOLIT,0,EXIT ;false flag
EQU1: DW DOLIT,-1,EXIT ;true flag
; U< ( u u -- t )
; Unsigned compare of top two items.
$COLON 2,'U<',ULESS
DW DDUP,XORR,ZLESS
DW QBRAN,ULES1
DW SWAP,DROP,ZLESS,EXIT
ULES1: DW SUBB,ZLESS,EXIT
; < ( n1 n2 -- t )
; Signed compare of top two items.
$COLON 1,'<',LESS
DW DDUP,XORR,ZLESS
DW QBRAN,LESS1
DW DROP,ZLESS,EXIT
LESS1: DW SUBB,ZLESS,EXIT
; MAX ( n n -- n )
; Return the greater of two top stack items.
$COLON 3,'MAX',MAX
DW DDUP,LESS
DW QBRAN,MAX1
DW SWAP
MAX1: DW DROP,EXIT
; MIN ( n n -- n )
; Return the smaller of top two stack items.
$COLON 3,'MIN',MIN
DW DDUP,SWAP,LESS
DW QBRAN,MIN1
DW SWAP
MIN1: DW DROP,EXIT
; WITHIN ( u ul uh -- t )
; Return true if u is within the range of ul and uh.
$COLON 6,'WITHIN',WITHI
DW OVER,SUBB,TOR ;ul <= u < uh
DW SUBB,RFROM,ULESS,EXIT
;; Divide
; UM/MOD ( udl udh u -- ur uq )
; Unsigned divide of a double by a single. Return mod and quotient.
$COLON 6,'UM/MOD',UMMOD
DW DDUP,ULESS
DW QBRAN,UMM4
DW NEGAT,DOLIT,15,TOR
UMM1: DW TOR,DUPP,UPLUS
DW TOR,TOR,DUPP,UPLUS
DW RFROM,PLUS,DUPP
DW RFROM,RAT,SWAP,TOR
DW UPLUS,RFROM,ORR
DW QBRAN,UMM2
DW TOR,DROP,DOLIT,1,PLUS,RFROM
DW BRAN,UMM3
UMM2: DW DROP
UMM3: DW RFROM
DW DONXT,UMM1
DW DROP,SWAP,EXIT
UMM4: DW DROP,DDROP
DW DOLIT,-1,DUPP,EXIT ;overflow, return max
; M/MOD ( d n -- r q )
; Signed floored divide of double by single. Return mod and quotient.
$COLON 5,'M/MOD',MSMOD
DW DUPP,ZLESS,DUPP,TOR
DW QBRAN,MMOD1
DW NEGAT,TOR,DNEGA,RFROM
MMOD1: DW TOR,DUPP,ZLESS
DW QBRAN,MMOD2
DW RAT,PLUS
MMOD2: DW RFROM,UMMOD,RFROM
DW QBRAN,MMOD3
DW SWAP,NEGAT,SWAP
MMOD3: DW EXIT
; /MOD ( n n -- r q )
; Signed divide. Return mod and quotient.
$COLON 4,'/MOD',SLMOD
DW OVER,ZLESS,SWAP,MSMOD,EXIT
; MOD ( n n -- r )
; Signed divide. Return mod only.
$COLON 3,'MOD',MODD
DW SLMOD,DROP,EXIT
; / ( n n -- q )
; Signed divide. Return quotient only.
$COLON 1,'/',SLASH
DW SLMOD,SWAP,DROP,EXIT
;; Multiply
; UM* ( u u -- ud )
; Unsigned multiply. Return double product.
$COLON 3,'UM*',UMSTA
DW DOLIT,0,SWAP,DOLIT,15,TOR
UMST1: DW DUPP,UPLUS,TOR,TOR
DW DUPP,UPLUS,RFROM,PLUS,RFROM
DW QBRAN,UMST2
DW TOR,OVER,UPLUS,RFROM,PLUS
UMST2: DW DONXT,UMST1
DW ROT,DROP,EXIT
; * ( n n -- n )
; Signed multiply. Return single product.
$COLON 1,'*',STAR
DW UMSTA,DROP,EXIT
; M* ( n n -- d )
; Signed multiply. Return double product.
$COLON 2,'M*',MSTAR
DW DDUP,XORR,ZLESS,TOR
DW ABSS,SWAP,ABSS,UMSTA
DW RFROM
DW QBRAN,MSTA1
DW DNEGA
MSTA1: DW EXIT
; */MOD ( n1 n2 n3 -- r q )
; Multiply n1 and n2, then divide by n3. Return mod and quotient.
$COLON 5,'*/MOD',SSMOD
DW TOR,MSTAR,RFROM,MSMOD,EXIT
; */ ( n1 n2 n3 -- q )
; Multiply n1 by n2, then divide by n3. Return quotient only.
$COLON 2,'*/',STASL
DW SSMOD,SWAP,DROP,EXIT
;; Miscellaneous
; CELL+ ( a -- a )
; Add cell size in byte to address.
$COLON 5,'CELL+',CELLP
DW DOLIT,CELLL,PLUS,EXIT
; CELL- ( a -- a )
; Subtract cell size in byte from address.
$COLON 5,'CELL-',CELLM
DW DOLIT,0-CELLL,PLUS,EXIT
; CELLS ( n -- n )
; Multiply tos by cell size in bytes.
$COLON 5,'CELLS',CELLS
DW DOLIT,CELLL,STAR,EXIT
; ALIGNED ( b -- a )
; Align address to the cell boundary.
$COLON 7,'ALIGNED',ALGND
DW DUPP,DOLIT,0,DOLIT,CELLL
DW UMMOD,DROP,DUPP
DW QBRAN,ALGN1
DW DOLIT,CELLL,SWAP,SUBB
ALGN1: DW PLUS,EXIT
; BL ( -- 32 )
; Return 32, the blank character.
$COLON 2,'BL',BLANK
DW DOLIT,' ',EXIT
; >CHAR ( c -- c )
; Filter non-printing characters.
$COLON 5,'>CHAR',TCHAR
DW DOLIT,07FH,ANDD,DUPP ;mask msb
DW DOLIT,127,BLANK,WITHI ;check for printable
DW QBRAN,TCHA1
DW DROP,DOLIT,'_' ;replace non-printables
TCHA1: DW EXIT
; DEPTH ( -- n )
; Return the depth of the data stack.
$COLON 5,'DEPTH',DEPTH
DW SPAT,SZERO,AT,SWAP,SUBB
DW DOLIT,CELLL,SLASH,EXIT
; PICK ( ... +n -- ... w )
; Copy the nth stack item to tos.
$COLON 4,'PICK',PICK
DW DOLIT,1,PLUS,CELLS
DW SPAT,PLUS,AT,EXIT
;; Memory access
; +! ( n a -- )
; Add n to the contents at address a.
$COLON 2,'+!',PSTOR
DW SWAP,OVER,AT,PLUS
DW SWAP,STORE,EXIT
; 2! ( d a -- )
; Store the double integer to address a.
$COLON 2,'2!',DSTOR
DW SWAP,OVER,STORE
DW CELLP,STORE,EXIT
; 2@ ( a -- d )
; Fetch double integer from address a.
$COLON 2,'2@',DAT
DW DUPP,CELLP,AT
DW SWAP,AT,EXIT
; COUNT ( b -- b +n )
; Return count byte of a string and add 1 to byte address.
$COLON 5,'COUNT',COUNT
DW DUPP,DOLIT,1,PLUS
DW SWAP,CAT,EXIT
; HERE ( -- a )
; Return the top of the code dictionary.
$COLON 4,'HERE',HERE
DW CP,AT,EXIT
; PAD ( -- a )
; Return the address of a temporary buffer.
$COLON 3,'PAD',PAD
DW HERE,DOLIT,80,PLUS,EXIT
; TIB ( -- a )
; Return the address of the terminal input buffer.
$COLON 3,'TIB',TIB
DW NTIB,CELLP,AT,EXIT
; @EXECUTE ( a -- )
; Execute vector stored in address a.
$COLON 8,'@EXECUTE',ATEXE
DW AT,QDUP ;?address or zero
DW QBRAN,EXE1
DW EXECU ;execute if non-zero
EXE1: DW EXIT ;do nothing if zero
; CMOVE ( b1 b2 u -- )
; Copy u bytes from b1 to b2.
$COLON 5,'CMOVE',CMOVE
DW TOR
DW BRAN,CMOV2
CMOV1: DW TOR,DUPP,CAT
DW RAT,CSTOR
DW DOLIT,1,PLUS
DW RFROM,DOLIT,1,PLUS
CMOV2: DW DONXT,CMOV1
DW DDROP,EXIT
; FILL ( b u c -- )
; Fill u bytes of character c to area beginning at b.
$COLON 4,'FILL',FILL
DW SWAP,TOR,SWAP
DW BRAN,FILL2
FILL1: DW DDUP,CSTOR,DOLIT,1,PLUS
FILL2: DW DONXT,FILL1
DW DDROP,EXIT
; -TRAILING ( b u -- b u )
; Adjust the count to eliminate trailing white space.
$COLON 9,'-TRAILING',DTRAI
DW TOR
DW BRAN,DTRA2
DTRA1: DW BLANK,OVER,RAT,PLUS,CAT,LESS
DW QBRAN,DTRA2
DW RFROM,DOLIT,1,PLUS,EXIT ;adjusted count
DTRA2: DW DONXT,DTRA1
DW DOLIT,0,EXIT ;count=0
; PACK$ ( b u a -- a )
; Build a counted string with u characters from b. Null fill.
$COLON 5,'PACK$',PACKS
DW ALGND,DUPP,TOR ;strings only on cell boundary
DW OVER,DUPP,DOLIT,0
DW DOLIT,CELLL,UMMOD,DROP ;count mod cell
DW SUBB,OVER,PLUS
DW DOLIT,0,SWAP,STORE ;null fill cell
DW DDUP,CSTOR,DOLIT,1,PLUS ;save count
DW SWAP,CMOVE,RFROM,EXIT ;move string
;; Numeric output, single precision
; DIGIT ( u -- c )
; Convert digit u to a character.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -