20apr2006
Albert Nijhof
12jul2005
MSEE ( adr -- )
Decompileer vanaf adr (dit mag ieder adres zijn).
: SEE ( <naam> -- ) ' MSEE ;
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.
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
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:
- Voor getallen
DECIMAL [rtn] OK
HX 10 . [rtn] 16 OK
BN 10 . [rtn] 2 OK
: TEN HX A . ; TEN [rtn] 10 OK
Bovenstaande werkt altijd, zowel binnen als buiten definities.
- Voor Forth woorden
HX DM en BN zijn ook zinvol onmiddellijk voor woorden die getallen afdrukken (of inlezen).
DECIMAL 10 20 [rtn] OK
.S [rtn] ( 10 20 ) OK
HX .S [rtn] ( A 14 ) OK
BN .S [rtn] ( 1010 10100 ) OK
HX . BN . [rtn] 14 1010 ok
Dit werkt alleen interactief en niet voor woorden die gecompileerd worden.
HX DM en BN zijn immediate en laten geen sporen na in een definitie.
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".
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)
: ?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
?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.
'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
!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
|
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 , ;
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.
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
|
" ( <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'.
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
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.
|
: ?NEGATE ( x y -- x2 ) 0< IF NEGATE THEN ;
: ?DNEGATE ( dx y -- dx2 ) 0< IF DNEGATE THEN ;
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
DU* ( ud1 u2 -- ud3 )
32bit * 16bit >> prod=32bit
DU/MOD ( ud1 u2 -- u3 ud4 )
32bit / 16bit >> rest=16bit, quot=32bit
: BODY> ( body -- xt ) 3 - ;
>NAME ( xt -- nfa )
NAME> ( nfa -- xt )
In MaisForth geldt: xt = cfa
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
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
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 ;
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
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
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 ! ;