20apr2006
  MaisForth an601  
Albert Nijhof
12jul2005
EXTRA en ONLY woorden (niet-standaard)
EXTRA
!USART
!VECTOR

"

'FIRQ
'IRQ
'NMI
'SWI
'SWI2
'SWI3

+TO

.MSG
.VOC

1+!

>NAME
>OK

?BASE
?COMP
?EXIT
?DNEGATE
?NEGATE
?PAIR
?RE
?STACK @+ ALLWORDS ANEW BACKSPACE BINARY BYTESWAP BODY>
C+!
CELL
CELL-
COLD
CTRL

D.STRING
DIGIT>
DISABLE
DNUMBER?
DOER:
DOERCODE
DOT?
DU*
DU/MOD 
DU.
DU.R
DU.STRING
DU2/

ENABLE
HIDE
HIMEM
HOR

INCR

MANY
MSEE
MSG"

NAME>

OK

PARSE,
PLACE

RDROP
RE
REMOVE
REVEAL
RE}
RTYPE
S<>
SCAN
SKIP
STOP?
STRING

TIMES

U.S
UMAX
UMIN
UPPER

VARIABLES
VER
VOCABULARY

WORD>
WORD,


ONLY
BN
DM
HX
FRESH
EXTRA
INSIDE

MSEE ( adr -- )

Decompileer vanaf adr (dit mag ieder adres zijn).
: SEE ( <naam> -- ) ' MSEE ;
top
^

VOCABULARY ( <ccc> -- )

Definieer een nieuwe woordenlijst met de naam ccc
Als ccc uitgevoerd wordt, vervangt hij de top-woordenlijst van de zoekvolgorde door zichzelf.

.VOC ( wid -- )

Druk de naam die bij wid hoort af. Is er geen naam, druk dan een vraagteken af.
Alleen een even getal 0..126 kan een geldige wid zijn.
top
^

EXTRA ( -- )

Een vocabulary met niet-standaard woorden voor programmeurs.

INSIDE ( -- )

Een vocabulary met niet-standaard hulpwoorden voor Forth zelf. Programmeurs zouden die niet nodig moeten hebben.

FRESH ( -- )

zet de zoekvolgorde op FORTH FORTH EXTRA ONLY
Forth start op met FRESH DEFINITIONS

ALLWORDS ( -- )

Geef alle woorden van alle woordenlijsten.

ONLY ( -- )

Een speciaal vocabulary dat, indien het uitgevoerd wordt, de zoekvolgorde keihard op ONLY ONLY zet. Het bevat de volgende woorden:
 [AHEAD]  [IF]  [ELSE]  [THEN]  BN  DM  HX  WORDS  FRESH  ORDER 
 SET-CURRENT  GET-CURRENT  DEFINITIONS  PREVIOUS  ALSO  ASSEMBLER 
 EXTRA  INSIDE  FORTH
top
^

HX ( <ccc> -- )

Handel het volgende getal of woord in de invoerstroom af. Tijdens die actie is BASE tijdelijk 16.

DM ( <ccc> -- )

BASE is tijdelijk 10.

BN ( <ccc> -- )

BASE is tijdelijk 2.

Voorbeelden:

top
^

ANEW ( <ccc> -- )

Definieer een marker met de naam ccc
Als ccc al bestaat, voer hem dan eerst uit en definieer dan de nieuwe marker.

REMOVE ( -- )

Wis de nieuwste definitie, indien "onvindbaar", en druk zijn naam daarbij af. Is hij "vindbaar", dan gebeurt er niets.

REVEAL ( -- )

Maak de nieuwste definitie "vindbaar".

HIDE ( -- )

Maak de nieuwste definitie "onvindbaar".
top
^

MSG" ( msg# <ccc"> -- )

Definieer een THROW boodschap (message).

.MSG ( msg# -- )

Druk de boodschap af die hoort bij msg#.

Vb:

-100 MSG" tsssss" [rtn] OK
-100 .MSG [rtn] tsssss (Message # -100)  OK
-100 THROW [rtn]
THROW  tsssss (Message # -100) 
top
^

: ?COMP ( -- ) STATE @ ?EXIT -14 THROW ;
: ?PAIR ( x y -- ) = ?EXIT -22 THROW ;

?STACK ( -- )

Test op Data Stack Overflow en Underflow.

?BASE ( -- )

Voer DECIMAL uit als BASE buiten [2..72] ligt.

STOP? ( -- vlag )

Test op een ingedrukte toets:
toets           effect            vlag

geen toets      -                 false

[spatie]        wacht
    en daarna
[spatie]        ga door           false

[esc]           -28 THROW         -        al dan niet na spatie
anders          ga door           true     al dan niet na spatie
top
^

?EXIT

is een afkorting voor IF EXIT THEN

}

is een afkorting voor EXIT THEN

RE

RE compileert een sprong terug naar het begin van de definitie en trekt zich daarbij niets aan van eventuele controlestructuren om hem heen.

?RE

is een afkorting voor IF RE THEN

RE}

is een afkorting voor RE THEN

RE ?RE en RE} zijn alleen geschikt voor colon definities (niet voor :NONAME woorden of Does-code).

RE is handig voor lussen met een reeks voorwaarden, al dan niet genest, waarbij je
1) soms de lus wilt herhalen en
2) soms het woord wilt verlaten.
In dat geval bespaar je je met RE en EXIT de paired-conditionals-gymnastiek voor het maken van geneste constructies met UNTILs, WHILEs en REPEATs. Evenals LEAVE hebben EXIT en RE tijdens het compileren geen last van controlestructuren waar ze tussen staan.

top
^

'NMI 'SWI 'IRQ 'FIRQ 'SWI2 'SWI3 ( -- adr )

6809 interrupt vectoren

DISABLE ( 'vector -- )

Vb: 'SWI3 DISABLE

!VECTOR ( adr 'vector -- )

Vb: 47AE 'SWI3 !VECTOR

ENABLE ( 'vector -- )

Vb: 'SWI3 ENABLE
top
^

!USART ( baudfactor -- )

Stel met behulp van de baudfactor de Baud Rate in waarmee MaisForth communiceert.
 
baudfactor,  Baud
HX/DM          Rate

7F/127      19200 (opstartwaarde)  
7E/126       9600  
7D/125       7200  
7C/124       4800  
7B/123       3600  
7A/122       2400  
79/121       2000  
78/120       1800  
baudfactor   Baud 
HX/DM          Rate  

77/119       1200  
76/118        600  
75/117        300  
74/116        150  
73/115        134.5  
72/114        110  
71/113         75  
70/112         50  
top
^

DOER: ( <ccc> -- )

DOER: ccc ... ; staat voor
: ccc DOES> ... ;

DOERCODE ( <ccc> -- )

DOERCODE ccc ... END-CODE staat voor
: ccc ;CODE ... END-CODE

Vb:

DOER: DOKON  @ ;
: KONSTANT   CREATE , DOKON ;
 of 
: KONSTANT   CREATE DOKON , ;
top
^

HOR ( -- q )

q is de horizontale output positie (kolom#).

VER ( -- q )

q is de verticale output positie (rij#).

BACKSPACE ( -- )

Doe een backspace als HOR groter dan nul is.

HOR en VER zijn nul na PAGE.
CR maakt HOR nul en telt 1 bij VER op.

top
^

VALUE ( x <ccc> -- )
TO ( x <ccc> -- )
+TO ( y <ccc> -- )
INCR ( <ccc> -- )

 

STRING ( maxlen <ccc> -- )
TO ( a1 n <name> -- )
+TO ( a2 n <ccc> -- )
INCR ( char <ccc> -- )

Vb:

10 VALUE N N . [rtn] 10  OK
7     TO N N . [rtn] 7  OK
8    +TO N N . [rtn] 15  OK
    INCR N N . [rtn] 16  OK
N    +TO N N . [rtn] 32  OK
N 2/  TO N N . [rtn] 16  OK

Vb:

12   STRING NN NN TYPE [rtn] OK
S" Mad"  TO NN NN TYPE [rtn] Mad OK
S" rid" +TO NN NN TYPE [rtn] Madrid OK
CHAR - INCR NN NN TYPE [rtn] Madrid- OK
NN      +TO NN NN TYPE [rtn] Madrid-Madri OK
NN 2/    TO NN NN TYPE [rtn] Madrid OK
top
^

" ( <ccc"> -- adr len | -- )

Zelfde als S"
Compilerend: compileer de string.
Executerend: zet de string (adr,len) op stack.

PARSE, ( ch <ccc> -- )

Parse een string met ch en zet hem als counted string in het woordenboek.

WORD, ( ch <ccc> -- )

Doe ch WORD en zet het resultaat als counted string in het woordenboek.

WORD> ( ch <ccc> -- adr )

Doe ch WORD
Doe een REFILL als dat de nul-string oplevert en probeer opnieuw.
-16 THROW volgt als de REFILL niet lukt.

CTRL ( <ccc> -- q | -- )

AND het eerste karakter van ccc met hx 1F en
(uitvoerend:) zet het resultaat op stack;
(compilerend:) compileer het resultaat als een 'literal'.
top
^

DIGIT> ( char -- x true | char false )

Zet een cijfer (karakter) om in zijn waarde als dat kan. Een vlag geeft aan of dit gelukt is. BASE wordt hierbij gebruikt.

DNUMBER? ( adr len -- xlo xhi true | ? ? false )

Zet de string adr len om in een dubbelgetal met behulp van BASE
Er wordt een vlag toegevoegd. Bij 'false' is de omzetting mislukt. Een minteken wordt geaccepteerd als het voorop staat en één punt wordt geaccepteerd, waar die ook staat. Zie DOT?).

DOT? ( -- q )

Na uitvoering van DNUMBER? geeft DOT? de positie van een punt in de string.

Vb:

string    DOT?
1234      0        (geen punt)
1234.     1
123.4     2
.1234     5
top
^

OK ( -- q )

q bevat de prompt eigenschappen.

>OK ( q -- )

Leg de prompt eigenschappen vast.

Bij q=0 is er alleen een CR.
Als bit n van q gezet is:
 
bit 0: Druk OK (uitvoerend) of ok (compilerend) af, gevolgd door een CR.
bit 1: Voer .S (signed getallen) uit na de CR.
bit 2: Als bit 1 niet gezet is: voer U.S (unsigned getallen) uit.
bit 3: Druk BASE af (indien ongelijk aan tien) in het tientallig stelsel.
bit 4..7:   n.v.t.

top
^

: ?NEGATE ( x y -- x2 ) 0< IF NEGATE THEN ;
: ?DNEGATE ( dx y -- dx2 ) 0< IF DNEGATE THEN ;

top
^

VARIABLES ( n -- )

: VARIABLES
  CREATE CELLS ALLOT
  DOES> ( index -- adr ) SWAP CELLS + ;

\ Vb:
3 VARIABLES Z ( index -- adr )
111 0 Z !
555 2 Z !              \ Index moet <3 zijn, geen beveiliging.
0 Z @ . [rtn] 111  OK
top
^

DU* ( ud1 u2 -- ud3 )

32bit * 16bit >> prod=32bit

DU/MOD ( ud1 u2 -- u3 ud4 )

32bit / 16bit >> rest=16bit, quot=32bit
top
^

: BODY> ( body -- xt ) 3 - ;

>NAME ( xt -- nfa )
NAME> ( nfa -- xt )

In MaisForth geldt: xt = cfa

top
^

SCAN ( adr len ch -- adr2 len2 )

Vb:
S" AAABC" CHAR B SCAN TYPE [rtn] BC OK
S" AAABC" CHAR F SCAN TYPE [rtn] OK

SKIP ( adr len ch -- adr2 len2 )

Vb:
S" AAABC" CHAR A SKIP TYPE [rtn] BC OK
S" AAABC" CHAR B SKIP TYPE [rtn] AAABC OK
top
^

MANY ( -- )

Interpreteer de tekst vanaf het begin van de regel tot aan MANY steeds opnieuw. Ga verder met de tekst achter MANY als er een toets ingedrukt wordt.

Vb:

0 [rtn] OK
1+ DUP . MANY 0 . [rtn] 1 2 3 4 5 6 ...

TIMES ( q -- )

Interpreteer de tekst vanaf het begin van de regel q maal tot aan TIMES
Ga daarna verder met de tekst achter TIMES

Vb:

0 [rtn] OK
1+ DUP . 5 TIMES 0 . [rtn] 1 2 3 4 5 0  OK
top
^

DU. ( xlo xhi -- )
DU.R ( xlo xhi r -- )

D.STRING ( xlo xhi -- adr len )

Zet signed dubbelgetal om in string.

DU.STRING ( xlo xhi -- adr len )

Zet unsigned dubbelgetal om in string.

De levensduur van het resultaat van D.STRING of DU.STRING is kort, het wordt overschreven bij de volgende omzetting.

RTYPE ( adr len r -- )

Druk de string (adr,len) af, rechtsgericht in een veld van r posities.
: D.   ( d -- )    D.STRING  TYPE SPACE ;
: .R   ( n r -- )  >R S>D D.STRING  R> RTYPE ;
top
^

UPPER ( adr len -- )

Zet de kleine letters in de string om naar hoofdletters.

PLACE ( adr len dest -- )

Plaats de string (adr,len) als counted string op dest

S<> ( adr1 adr2 len -- q )

Stel de alfabetische volgorde vast van string1 (adr1,len) en string2 (adr2,len).
string1  =   string2:    q =  0
string1 voor string2:    q = -1
string1  na  string2:    q =  1
top
^

RDROP ( -- )

staat voor R> DROP

2RDROP ( -- )

staat voor RDROP RDROP

UMAX ( u1 u2 -- u )
UMIN ( u1 u2 -- u )

CELL ( -- 2 )
CELL- ( x -- x-2 )

: 1+! ( a -- ) 1 SWAP +! ;
: C+! ( x a -- ) TUCK C@ + SWAP C! ;

@+ ( adr -- adr+cell x )

De 16 bit variant van COUNT.

: DU2/ ( du1 -- du2 ) D2/ HX 7FFF AND ;

logical shift right over een dubbelgetal

BYTESWAP ( xy -- yx )

Verwissel het hoge en lage byte van een 16-bits patroon.

Vb:

HEX 1234 BYTESWAP . [rtn] 3412  OK
top
^

HIMEM ( -- q )

q is de hoeveelheid RAM, of: het laagste niet bestaande RAM adres.

COLD ( ? -- )

Doe een koude start.

U.S ( -- )

Een variant van .S die unsigned getallen afdrukt.

: BINARY ( -- ) 2 BASE ! ;

top
^