This chapter presents the listing of the file wfroth.wft which contains many forth definitions defined above the kernel..
|
Last update: |
7-February-1999 |
|
State (estimation) |
55% |
/* ===========================================================================
wfroth.wft Oliver Singla
Description: This file defines words for wfroth which are not defined into the kernel.Remember: The primary usage of wfroth is to write forth cross-compilers
for targets such DSP and Microcontrolers. =========================================================================== */// *************
// *** STACK ***
// *************
: under ( n1 n2 --- n2 ) swap drop ;' under alias nip
: below ( n1 n2 n3 --- n2 n3 ) rot drop ;: above ( n1 n2 n3 --- n1 n2 n3 n1 ) 3 pick ;' above alias pluck
: tuck ( n1 n2 --- n2 n1 n2 ) swap over ;: -rot ( n1 n2 n3 --- n3 n1 n2 ) rot rot ;: ddrop ( n1 n2 --- ) drop drop ;' ddrop alias 2drop
: ddup ( n1 n2 --- n1 n2 n1 n2 ) over over ;' ddup alias 2dup
: 3dup ( n1 n2 n3 --- n1 n2 n3 n1 n2 n3 ) above above above ;: 3drop ( n1 n2 n3 --- ) 2drop drop ;// *************
// *** ARITH ***
// *************
: decimal base 10 ! ;
: hex base 16 ! ;
: binary base 2 ! ;: octal base 8 ! ;: 1+ ( n --- n+1 ) 1 + ;: 2+ ( n --- n+2 ) 2 + ;: - ( n1 n2 --- n3 ) negate + ;: 1- ( n --- n-1 ) 1 - ;: 2- ( n --- n-2 ) 2 - ;: 2* ( n --- n*2 ) 1 shl ;: 2/ ( n --- n/2 ) 1 shr ;// **************
// *** MEMORY ***
// **************
: -A ( n --- ) negate +A ;: -! ( n --- ) negate +! ;: 1+! ( --- ) 1 +! ;' 1+! alias incr
: 1-! ( --- ) -1 +! ;' 1-! alias decr
: 0!
0 ! ;: peek ( a --- ) A> >R >A @ R> >A ;: poke ( n a --- ) A> >R >A ! R> >A ;// *****************
// *** UTILITIES ***
// *****************
: exit
[compile] (;) ; immediate: cellsize+
cellsize + ;: cellsize-
cellsize + ;: cellsize*
cellsize * ;: space ( --- ) 32 emit ;: cr ( --- ) 13 emit 10 emit ;: type
A> >R >A [ here ] C@ (0branch) [ here ] noop C@+ emit (branch) noop [ swap here - 1 + here 1 - !code here over - swap !code ] R> >A ;: ?enought ( n --- ) depth 1- > " Not enought parameters on stack" ?"error ;: split ( hilo --- lo hi ) dup $FF and swap 8 shr ;: join ( n1 n2 --- n3 ) 8 shl swap + ;// **************************
// *** CONTROL STRUCTURES ***
// *** IF..[ELSE]..ENDIF ***// **************************
: create_control_stack
build> dup 2 * 2 + allot !+ 0 !
does> ;64 create_control_stack control_stack
: dummy 1000 ;
: >control ( addr mark --- ) control_stack @+ drop 1+! @+ 1- cellsize * 2 * A> + >A swap !+ ! ;: control> ( --- addr mark ) control_stack @+ drop 1-! @+ cellsize * 2 * A> + >A @+ @ ;: control ( --- addr mark ) control_stack @+ drop @+ 1- cellsize * 2 * A> + >A @+ @ ;: IF
compile (0branch) here 'IFFI >control dummy code, ; immediate: if? ( mark --- ) 'IFFI == 0 == " IF not called before" ?"error ;: ELSE
control> if? compile (branch) here 'IFFI >control dummy code, here over - swap !code ; immediate: ENDIF
control> if? here over - swap !code ; immediate' ENDIF alias THEN
// ***************
// *** LOGICAL ***
// ***************
: true ( --- tf ) -1 ;: false ( --- ff ) 0 ;: true! ( --- ) true ! ;: false! ( --- ) false ! ;: not ( f1 --- f2 ) IF false ELSE true ENDIF ;: 0!= ( n --- f ) IF true ELSE false ENDIF ;' 0!= alias 0<>
: && ( n1 n2 --- f ) 0!= swap 0!= AND ;: || ( n1 n2 --- f ) 0!= swap 0!= OR ;: = == ;
' == alias =
: != ( n1 n2 --- f ) == not ;' != alias <>
: 0= ( n --- f ) 0 == ;: < ( n1 n2 --- f ) ddup > -rot == or not ;: >= ( n1 n2 --- f ) ddup > -rot == or ;: <= ( n1 n2 --- f ) > not ;: U< ( u1 u2 --- f ) ddup U> -rot == or not ;: U>= ( u1 u2 --- f ) ddup U> -rot == or ;: U<= ( u1 u2 --- f ) U> not ;// **************************
// *** CONTROL STRUCTURES ***
// *** BEGIN..UNTIL ***
// **************************
: BEGIN
here 'BEGI >control ; immediate: begin? ( mark --- ) 'BEGI != " BEGIN not called before" ?"error ;: break?
dup 'BREA == IF drop here over - 1+ swap !code control> myself ENDIF ;: begin_or_break? ( addr mark --- ) under dup 'BEGI != swap dup 'BREA != swap 'WHIL != and and " BREAK not allowed here" ?"error ;: ?break
compile (1branch) control begin_or_break? here 'BREA >control dummy code, ; immediate: ?continue
compile (1branch) control over -rot begin_or_break? here - code, ; immediate: AGAIN
compile (branch) control> break? begin? here - code, ; immediate: UNTIL
compile (0branch) control> break? begin? here - code, ; immediate: WHILE
compile (0branch) control begin_or_break? here 'WHIL >control dummy code, ; immediate: while? ( mark --- ) 'WHIL != " WHILE not called before" ?"error ;: REPEAT
compile (branch) control> break? while? here over - 1+ swap !code control> break? begin? here - code, ; immediate: CASE
here 'CASE >control ; immediate: case? ( mark --- ) dup 'CASE != swap 'ENDO != and " CASE not called before" ?"error ;: of? ( mark --- ) 'OFFO != " OF not called before" ?"error ;: tipof? ( addr mark --- addr mark ) dup 'TIPO == IFdrop here over - 2+ swap !code
control> ddrop control myself
ENDIF ;: OF
control tipof? under case? compile (of) here 'OFFO >control dummy code, ; immediate: ENDOF
control> of? compile (branch) here 'ENDO >control here over - 1+ swap !code dummy code, ; immediate: TIPOF
control> of? compile (branch) here 'TIPO >control here over - 1+ swap !code dummy code, ; immediate: ENDCASE
control> 'ENDO == IFhere over - swap !code
myself
ENDIF drop ; immediate: DO
compile (do) here 'DOOD >control ; immediate: do? ( mark --- ) 'DOOD == 0 == " DO not called before" ?"error ;: LOOP
compile (loop) control> break? do? here - code, ; immediate' LOOP alias ENDDO
: +LOOP
compile (+loop) control> break? do? here - code, ; immediate' +LOOP alias +ENDDO
: TIMES
compile (times) here 'TIME >control dummy code, ; immediate: times? ( mark --- ) 'TIME == 0 == " TIMES not called before" ?"error ;: ENDTIMES
compile (endtimes) control> break? times? dup here - 1+ code, here over - swap !code; immediate
: :
[compile] : ; immediate flush: ;
?named IFA> >R
control_stack @+ drop @ 0 > " Control Structure not endded" ?"error
R> >A
ENDIF [compile] ; ; immediate flush// ***********************
// *** BASIC VARIABLES ***
// ***********************
// Create an uninitialized integer variable
// Example of creation: int myVar// Examples of utilization: 90 myVar !
// myVar @: int
build> 1 allot does> ;' int alias integer
' int alias variable
// Create an initialized integer variable
// Example of creation: 123 int myVar// Examples of utilization: 90 myVar !
// myVar @: iint
build> , does> ;// Create a constant integer
// Example of creation: 10 const ten// Examples of utilization: ten
: const
build> , does> @ ;' const alias constant
// *****************
// *** PLATFORMS ***
// *****************
1 const WINDOWS
2 const QNXPHOTON
3 const CONSOLE
// *******************
// *** TARGET/HOST ***
// *******************
int target_mode
: host target_mode false! ;' host alias ok
: target target_mode true! ;' target alias tok
: host? A> target_mode @ not swap >A ;: target? A> target_mode @ swap >A ;// ******************
// *** ARITHMETIC ***
// ******************
: min ( n1 n2 --- n3 ) over over > IF under ELSE drop ENDIF ;: max ( n1 n2 --- n3 ) over over > IF drop ELSE under ENDIF ;// **************
// *** STRING ***
// **************
: $len ( sz --- n ) >A 0 BEGIN C@+ WHILE 1+ REPEAT ;// *******************
// *** NUMERIC I/O ***
// *******************
int hld
: hold ( c --- ) hld decr @ >A C! ;: digit ( n --- c ) dup 9 > IF 55 ELSE 48 ENDIF + ;: <# ( n --- n ) pad A> hld ! ;: # ( n1 --- n2 ) base @ /mod swap digit hold ;: #> ( n --- ) drop hld @ >A ;: #S ( n --- ) BEGIN # dup 0 == UNTIL ;: <#S> ( n --- sz ) <# #S #> A> ;: . ( n --- ) A> >R <# #S #> A> type space R> >A ;: .R ( n1 n2 --- ) A> >R swap <#S> dup $len rot 2dup < IF swap DO space ENDDO ELSE 2drop ENDIF type R> >A ;: .L ( n1 n2 --- ) A> >R swap <#S> dup type $len 2dup > IF DO space ENDDO ELSE 2drop ENDIF R> >A ;: h. ( n --- ) A> >R base @ >R hex . R> base ! R> >A ;: h02. ( n --- ) A> >R base @ >R hex A> >R <# # # #> A> type R> >A R> base ! R> >A ;: h04. ( n --- ) A> >R base @ >R hex A> >R <# # # # # #> A> type R> >A R> base ! R> >A ;: h04.(.) ( n --- ) dup '$ emit h04. space '( emit A> >R base @ >R decimal A> >R <#S> type R> >A R> base ! R> >A ') emit ;: h08. ( n --- ) A> >R base @ >R hex A> >R <# # # # # # # # # #> A> type R> >A R> base ! R> >A ;// ************************
// *** TEXT TERMINAL IO ***
// ************************
: wherex ( --- x ) wherexy drop ;: wherey ( --- y ) wherexy under ;: gotox ( x --- ) wherey gotoxy ;: gotoy ( y --- ) wherex swap gotoxy ;: spaces ( n --- )BEGIN space 1- dup not UNTIL drop ;
// ***************
// *** VARIOUS ***
// ***************
: ? ( --- ) @ . ;: drops ( n --- ) TIMES drop ENDTIMES ;// *****************
// *** UTILITIES ***
// *****************
32 constant BL
27 constant ESC
: [within] ( n1 n2 n3 --- f ) -rot over <= -rot >= and ;: [within[ ( n1 n2 n3 --- f ) -rot over <= -rot > and ;: ]within] ( n1 n2 n3 --- f ) -rot over < -rot >= and ;: ]within[ ( n1 n2 n3 --- f ) -rot over < -rot > and ;: words
0 -1 BEGINnextword
under under swap
rot over $len + 1+ dup #cols >= IF
cr drop dup $len 1+
ENDIF
-rot type space
DUP -1 ==
UNTIL drop drop ; immediate// *******************
// *** SERIAL COMM ***
// *******************
0 const NOPARITY
1 const ODDPARITY
2 const EVENPARITY
0 const NOFLOWCTRL
1 const HFLOW
2 const XONXOFF
1 const COM1:
2 const COM2:
3 const COM3:
4 const COM4:
// *************************************
// *** TOOLS ***// *************************************
// Stack dump
: .S
cr " Stack: " type depth 0 == IF " empty" type ELSE0 depth 1- DO I pick . -1 +ENDDO
ENDIF ; immediate// Information on a definition
// Example: WHAT dup: what
[compile] 'nfa dup not " Definition not found" ?"error >R R >A @+ IF cr " Is an alias of " type cellsize -A @+ 10 cellsize* + type
ENDIF cr @+ IF" 'C' definition - Token = " type
@ h. space " (-" type @+ negate . ') emit
ELSE" Colon definition - Begin=" type
cellsize +A @+ h. space " End=" type @+ h.
@ IF
cr " BUILD> " type @+ h. 2 spaces
" DOES> " type @+ h.
ENDIF
ENDIF cr " Flags: " type R> >A 7 cellsize* +A @ dup 1 AND IF " IMMEDIATE " type ENDIF dup 2 AND IF " FLUSH " type ENDIF dup 4 AND IF " DEFW" type ENDIF drop ; immediate: help
cr " words list all definitions" type
cr " infos show nb of words and memory use" type
cr " what <def> basic infos on a given definition" typecr " see <def> decompilation of the given definition" type
cr " *** All these words are immediate and therefore do not need ; ***" type cr " Do not forget ; (semicolon) to execute the current compiled definition" type ; immediate
: infos
meminfos cr . " rt words - " type . " words" type cr 3dup " Code: " type dup h08. '- emit + h08. 2 spaces " cp=" type h08. 2 spaces " (Used=" type above over - 5 .L " Free=" type + - negate 5 .L ') emit cr 3dup " Data: " type dup h08. '- emit + h08. 2 spaces " dp=" type h08. 2 spaces " (Used=" type above over - 5 .L " Free=" type + - negate 5 .L ') emit ; immediate' infos alias ??
// *************************************
// *** Compile the user file startup ***
// *************************************
" /wfroth/startup.wft" "load ;