(1)
  MaisForth an507  
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 ;
^
^
^

VOCABULARY ( <ccc> -- )

Definieer een nieuwe woordenlijst met de naam ccc. Wanneer ccc uitgevoerd wordt vervangt hij de eerste 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 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:

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.

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.
^
^
^

U.S ( -- )

Een variant van .S die unsigned getallen afdrukt.
^
^
^

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 ( -- )

: ?COMP   STATE @ ?EXIT -14 THROW ;

?STACK ( -- )

Test op Data Stack Overflow en Underflow.

?PAIR ( x y -- )

: ?PAIR   = ?EXIT -22 THROW ; 

?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 ( vlag -- )

doet hetzelfde als IF EXIT THEN maar dan sneller.

} ( -- )

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 ( -- )

doet hetzelfde als IF RE THEN maar dan sneller.

RE} ( -- )

is een afkorting voor RE THEN

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 , ;
DOKON moet natuurlijk wel na CREATE komen.
^
^
^

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 WORD. Als dat de nul-string oplevert: doe een REFILL en probeer opnieuw. -16 THROW wordt uitgevoerd als de REFILL niet gelukt is.

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.

^
^
^

BINARY ( -- )

staat voor 2 BASE !
^
^
^

?NEGATE ( x y -- x2 )

staat voor IF NEGATE THEN

?DNEGATE ( dx y -- dx2 )

staat voor IF DNEGATE THEN
^
^
^

HIMEM ( -- q )

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

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 )
DU/MOD ( ud1 u2 -- u3 ud4 )

^
^
^

BODY> ( body -- xt )
>NAME ( xt -- nfa )
NAME> ( nfa -- xt )

Opm.: 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
^
^
^

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

^
^
^

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.

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 ;
De levensduur van het resultaat van D.STRING of DU.STRING is kort, het wordt overschreven bij de volgende omzetting.
^
^
^

UPPER ( adr len -- )

Zet de kleine letters in de string om naar hoofdletters.

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

CELL ( -- 2 )

1+! ( adr -- )

Tel 1 op bij de celinhoud van adr.

C+! ( q adr -- )

Tel q op bij de byteinhoud van adr.

@+ ( adr -- adr+cell x )

De 16 bit variant van COUNT.

DU2/ ( du1 -- du2 )

logical shift right over een dubbelgetal

PLACE ( adr len dest -- )

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

BYTESWAP ( xy -- yx )

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

Vb:

HEX 1234 BYTESWAP . [rtn] 3412  OK

COLD ( ? -- )

Doe een koude start.
^
^
^