Forth

Radek Hnilica

Všechna práva vyhrazena.

V Budoucnu předpokládám změnu licence na některou z otevřených licencí.

Přehled revizí
Revize 02002-02-21
Nultá pracovní revize.
Revize 0.12002-02-27
Pracovní revize.
Revize 0.22002-03-04
Pracovní revize.
Revize 0.32002-03-10
Reorganizace kapitol do částí, zahájena práce na části PPForth.
Revize 0.42002-03-17
Další reorganizace, analýza QF, další slova a instrukce MC68k
Revize 0.52002-04-01
Drobné úpravy a přidány další slova do slovníku Qurtus Forthu a instrukce MC68k
Revize 0.62002-06-25
Drobné úpravy, vytvořena sekce "Databáze"
Revize 0.72003-12-27
Zahájeno znovuvytvoření knihy od úplného začátku.
Revize 0.82003-12-29
Pracovní výtisk.

Abstrakt

Poznámky k programovacímu jazyku „forth“.

Tento dokument pojednává o programování v programovacím jazyku Forth. A to jak obecně tak se zaměřením na PalmOS/Quartus Forth, Osmibitové počítače Atari a další.

Tento dokument je k dispozici v několika různých formátech. Jako vícestránkový HTML dokument, postscriptový či PDF soubor formátovaný na velikost papíru A4.

Počet stran v Postscriptové a PDF verzi: 417 .

Postscriptová verze má základní velikost písma 12pt.

Radek Hnilica


Věnování tag dedication/title

tag dedication/para

Tuto knihu věnuji tobě.

FIXME: napsat věnování.

Obsah

Předmluva
1. Úvod
1.1. Historie jazyka
1.2. Zdroje, literatura odkazy
1.3. Dostupné implementace
2. Forth hardware
I. Tutoriál
3. Tutorial
3.1. Úvod
3.2. Zásobník dat
3.3. Čísla
3.4. Základní aritmetika
3.5. Operace se zásobníkem
3.6. Definice nových slov
3.7. RPN
3.8. Zásobník
3.9. Zásobník návratových adres
3.10. Větvení programu
3.11. Větvení
3.12. Cykly
4. Forth
4.1. Tipy
4.2. Extreme Programming
4.3. Nejzákladnější slova
4.4. Čísla a slova
4.5. Zásobník a základní operace s ním
4.6. Definice nových slov
4.7. TIB (Terminal Input Buffer)
5. Základy jazyka Forth
5.1. Syntaxe jazyka
5.2. RPN
5.3. Sémantika
5.4. Počítání
5.5. Základní operace nad zásobníkem
5.6. Definice nových slov
5.7. Stack-Comment
5.8. Základní aritmetika
5.9. Konstanty a proměnné
6. Řízení toku
II. Implementace
7. Implementace
7.1. Virtuální procesor
7.2. Implementace slovníku
7.3. Vnitřní interpret
8. Forth na procesoru CDP1802
8.1. FIG-FORTH 1802
8.2. Rc/Forth
8.3. Cosmac 1802 handheld computer
9. Forth na procesoru 6502
9.1. FigForth 65
9.2. Forth 65
9.3. XForth
9.4. FIG6502
9.5. Poznámky
10. ARM
10.1. Pygmy Forth for the ARM
11. Ostatní implemetace
11.1. Z80 Forth
11.2. nanoForth
11.3. Color FORTH
11.4. Implemetace pro 8-mi bitové procesory
11.5. Implemetace pro 16-ti bitové procesory
11.6. Implemetace pro 32-ti bitové procesory
12. Různé
12.1. Adresový register
12.2. Řetězce znaků
III. Palm OS
13. Palm OS
13.1. Obsazení registrů procesoru
14. Analýza několik aprogramů pro Palma
14.1. Keyring
14.2. QED
14.3. Scripts
14.4. SmartDoc
IV. Quartus Forth
15. Quartus Forth
15.1. Startup
15.2. Kostra
15.3. Grafické uživatelske rozhraní
15.4. Automated Test Suite
15.5. select ... end-select
15.6. Moduly
15.7. Práce s pamětí
15.8. Databáze
16. Quartus Forth zevnitř
16.1. Mapa paměti
16.2. Analýza Quartus.PRC version 1.2.1U
16.3. Analýza Quartus.PRC version 2.0.0U
17. Moduly
17.1. DataMgr
17.2. CASE
17.3. csdump
17.4. Disasm
17.5. DocInc
17.6. ezUI
17.7. OnDo
18. Kalkulačka
18.1. První varianta
19. KeyMaster
19.1. Zadání
V. PP Forth
20. PPForth
20.1. Sekce
20.2. ppforthrsrc
20.3. Struktura slovníku a slov
21. PPForth zevnitř
21.1. Analýza binárního kódu
VI. Jiné jazyky inspirované Forthem
22. Factor
VII. Mikroprocesory
23. Motorola MC68000 CPU
23.1. Registry
23.2. Způsoby adresování
VIII. Přílohy
A. Různé zatím nezařazené sekce
A.1. Assembler procesoru 6502
A.2. Forth Objects
A.3. Editor Forth INC.
IX. Slovníky
I. (Veliký) Slovník Forthu
!CSP - sound popis
II. Slovník ANSI forthu
! - store, uložení hodnoty na adresu
number - number-sign, dělení čísle v proměnné
number > - number-sign-greater, ukončení formátování
#S - FIXME: jednořádkový popis
number TIB - t-i-b adresa buňky obsahující velikost tib
' - tick
( - paren, zahájení kometáře
(LOCAL) - popis
* - star, násobení
*/ - FIXME: jednořádkový popis
*/MOD - FIXME: jednořádkový popis
+ - plus, sečte dva prvky na zásobníku
+! - plus-store, přičte hodnotu k buňce na adrese
+LOOP - FIXME: jednořádkový popis
, - comma
- - minus odčítání
-TRAILING - dash-trailing FIXME:
. - dot zobrazí/vytiskne číslo na vrcholu zásobníku
." - dot-quote zobrazí/vytiskne řetězec znaků až do znaku "
.( - dot-paren tisk textu až do znaku )
.R - dot-r zobrazení čísla v poli zadané šířky
.S - dot-s vytiskne obsah celého datového zásobníku bez změny zásobníku
/ - slash, dělení
/MOD - slash-mod, dělení se zbytkem
/STRING - slash-string FIXME:popis
0< - zero-less vrátí true, je-li v TOS záporné číslo
0<> - zero-not-equals test nenulovosti
0= - zero-equals vrátí true, je-li v TOS nula
0> - zero-grater vrátí true, je-li v TOS kladné nenulové číslo
1+ - one-plus zvětší číslo na vrcholu zásobníku o jedničku
1- - one-minus zmenší číslo na vrcholu zásobníku o jedničku
2CONSTANT - two-constant definice konstanty velké dvě buňky
2DROP - two-drop odstranění dvou buňek ze zásobníku
2DUP - Zdvojení dvoubuňky Duplicate cell pair
2OVER - two-over zkopíruje druhý pár buněk pod vrcholem zásobníku na vrchol
2SWAP - FIXME:Exchange the top two cell pairs.
2VARIABLE - two-variable Vytvoření proměnné veliké dvě buňky.
: - colon, překladač, zahájení definice nového slova — DOCON
; - ukončení/uzavření definice slova
< number - FIXME: jednořádkový popis
>IN - offset/posunutí ve vstupním bufferu tib
>R - popis
?DUP - question-dupe podmíněné zdvojení
@ - fetch, uloží na vrchol zásobníku hodnotu určenou adresou (FETCH)
AGAIN - převede řízení na jiné místo
ALSO - jednořádkový popis
BASE - jednořádkový popis
BYE - ukončení práce v prostředí forthu a návrat do systému
CELL+ - cell-plus FIXME: jednořádkový popis
CELLS - FIXME: jednořádkový popis
CREATE - vytvoří hlavičku slova na slovníku
D+ - sčítání v dvojnásobé aritmetice
DEPTH - hloubka zásobníku, počet buněk uložených na zásobník
DO - FIXME: jednořádkový popis
DROP - Odstraní prvek z vrcholu zásobníku
DUP - dupe duplikuj tos
ELSE - else část větvení ...
EXECUTE - Vykoná slovo jehož CFA najde na TOS
FALSE - umístní do zásobníku příznak/logickou hodnotu false
HERE - proměnná obsahující adresu první volné buňky v datovém segmentu
I - FIXME: jednořádkový popis
IF - větvení programu podle podmínky
LEAVE - FIXME: jednořádkový popis
LOOP - FIXME: jednořádkový popis
M* - m-star FIXME:
M+ - m-plus FIXME:popis
NIP - Odstraní položku pod vrcholem zásobníku
OVER - Place a copy of x1 on top of stack
PARSE - čte/parsuje řetězec ve vstupním bufferu (TIB)
PICK - duplikování prvku z hlouby zásobník na vrchol
POSTPONE - FIXME: jednořádkový popis
ROLL - rolování zásobníku, vyjmutí prvku z hlouby zásobníku a uložení na vrchol
ROT - *FIXME:
S>D - rozšíření čísla se znaménkem na dlouhé číslo
SOURCE - adresa a velikost vstupního buferu
SOURCE-ID - identifikuje/popisuje vstupní zdroj
STATE - proměnná obsahující informaci o stavu EXECUTE/COMPILE
SWAP - prohodí mezi sebou dvě buňky na vrcholu zásobníku, TOS a NOS
THEN - ukončení podmíněného větvení ... nebo ......
TIB - popis
TUCK - FIXME:
VARIABLE - vytvoření proměnné
['] - popis
III. Slovník FAKE
evaluate - 7.6.1.1360
exit -
IV. Slovník FIG forthu
Výplň - sound popis
V. Slovník ANSI forthu
BlankFormId - jednořádkový popis
MainFormId - jednořádkový popis
TitledFormId - jednořádkový popis
C@A - přečte znak z absolutní 32bitové adresy
currentx - jednořádkový popis
currenty - jednořádkový popis
event - adresa event struktury obsahující poslední událost obdrženou od PalmOSu
eventhandler - jednořádkový popis
needs - Načtení zdrojového kódu z jiného souboru/memo. Obdoba include.
noop - jednořádkový popis
(bye) - jednořádkový popis
(ekey) - Vyzvednutí události z fronty událostí
(ID) - převádí čtyřznakový identifikátor zdroje na číslo (32-bitové)
>ABS - převod 16-ti bitové adresy datového prostoru na 32-ti bitovou absolutní adresu
>BYTE - refpurpose
>digit - Převod znaku na číslo
window-bounds - jednořádkový popis
VI. Slovník 2
CloseDB - Uzavření databáze určené ovladačem dbr.
CreateDB - vytvoření nové databáze s daným jménem, typem a tvůrcem.
HwrBacklight - refpurpose
OpenDB - Otevření existující databáze.
OpenResDB - otevření databáze zdrojů (resource database) podle tvůrce a typu
UseCard - Nastavení karty se kterou bude pracovat .
docincluded - jednořádkový popis
ekey - Kořenový tag knihy
freeHandle - jednořádkový popis
itemID -
ms - čekání
string>Handle - jednořádkový popis
stringfield - FIXME:
VII. Události PalmOS
appStopEvent - 22 aplikace je informována o tom že bude zastavena
ctlEnterEvent - 7
ctlSelectEvent - 9 aplikace je informována o tom že bude zastavena
fldEnterEvent - 15
nilEvent - prázdná událost, je vytvořena vždy když do zadaného limitu nepřijde jiná událost
penDownEvent -
penMoveEvent -
penUpEvent -
VIII. PalmOS API
DmArchiveRecord - FIXME: jednořádkový popis
DmAttachRecord - FIXME: jednořádkový popis
DmAttachResource - FIXME: jednořádkový popis
DmCloseDatabase - FIXME: jednořádkový popis
DmCreateDatabase - Vytvoří novou databázi na uvedné kartě, s uvedeným názvem, tvůrcem a typem.
DmCreateDatabaseFromImage - FIXME: jednořádkový popis
DmDatabaseInfo - získání atributů databázového souboru
DmDatabaseProtect - FIXME: jednořádkový popis
DmDatabaseSize - FIXME: jednořádkový popis
DmDeleteCategory - FIXME: jednořádkový popis
DmDeleteDatabase - Odstraní databázi se všemi záznamy.
DmDeleteRecord - FIXME: jednořádkový popis
DmDetachRecord - FIXME: jednořádkový popis
DmDetachResource - FIXME: jednořádkový popis
DmFindDatabase - FIXME: jednořádkový popis
DmFindRecordByID - FIXME: jednořádkový popis
DmFindResource - FIXME: jednořádkový popis
DmFindResourceType - FIXME: jednořádkový popis
DmFindSortPosition - FIXME: jednořádkový popis
DmFindSortPositionV10 - FIXME: jednořádkový popis
DmGet1Resource - FIXME: jednořádkový popis
DmGetAppInfoID - FIXME: jednořádkový popis
DmGetDatabase - FIXME: jednořádkový popis
DmGetLastErr - FIXME: jednořádkový popis
DmGetNextDatabaseByTypeCreator - FIXME: jednořádkový popis
DmGetRecord - FIXME: jednořádkový popis
DmGetResource - FIXME: jednořádkový popis
DmGetResourceIndex - FIXME: jednořádkový popis
DmInit - FIXME: jednořádkový popis
DmInsertionSort - FIXME: jednořádkový popis
DmMoveCategory - FIXME: jednořádkový popis
DmMoveOpenDBContext - FIXME: jednořádkový popis
DmMoveRecord - FIXME: jednořádkový popis
DmNewHandle - FIXME: jednořádkový popis
DmNewRecord - vytvoření nového záznamu, vyhrazení místa pro něj
DmNewResource - FIXME: jednořádkový popis
DmNextOpenDatabase - FIXME: jednořádkový popis
DmNextOpenResDatabase - FIXME: jednořádkový popis
DmNumDatabases - FIXME: jednořádkový popis
DmNumRecords - FIXME: jednořádkový popis
DmNumRecordsInCategory - FIXME: jednořádkový popis
DmNumResources - FIXME: jednořádkový popis
DmOpenDatabase - FIXME: jednořádkový popis
DmOpenDatabaseByTypeCreator - FIXME: jednořádkový popis
DmOpenDatabaseInfo - FIXME: jednořádkový popis
DmPositionInCategory - FIXME: jednořádkový popis
DmQueryNextInCategory - FIXME: jednořádkový popis
DmQueryRecord - FIXME: jednořádkový popis
DmQuickSort - FIXME: jednořádkový popis
DmRecordInfo - atributy a informace o záznamu
DmReleaseRecord - FIXME: jednořádkový popis
DmReleaseResource - FIXME: jednořádkový popis
DmRemoveRecord - FIXME: jednořádkový popis
DmRemoveResource - FIXME: jednořádkový popis
DmRemoveSecretRecords - FIXME: jednořádkový popis
DmResetRecordStates - FIXME: jednořádkový popis
DmResizeRecord - FIXME: jednořádkový popis
DmResizeResource - FIXME: jednořádkový popis
DmResourceInfo - FIXME: jednořádkový popis
DmSearchRecord - FIXME: jednořádkový popis
DmSearchResource - FIXME: jednořádkový popis
DmSeekRecordInCategory - FIXME: jednořádkový popis
DmSet - Zapsání speciální hodnoty do části záznamu.
DmSetDatabaseInfo - Nastavení informací o databázi
DmSetRecordInfo - FIXME: jednořádkový popis
DmSetResourceInfo - FIXME: jednořádkový popis
DmStrCopy - FIXME: jednořádkový popis
DmWrite - FIXME: jednořádkový popis
DmWriteCheck - FIXME: jednořádkový popis
MemCardInfo - Vrací informace o paměťové kartě.
MemCmp - Porovnání dvou bloků paměti.
MemHandleFree - Uvolní/rozpustí (dispose) posouvatelný kousek paměti (movable chunk).
MemHandleLock - Allocate a new movable chunk in the dynamic heap and returns a handle to it.
MemHandleNew - Allocate a new movable chunk in the dynamic heap and returns a handle to it.
MemHandleResize - Změní velikost kousku paměti (chunk).
MemHandleSize - Zjistí velikost kousku paměti (chunk).
MemHandleUnlock - Uvolnění/odemčení kousku paměti (chunk).
MemPtrNew - Vyhrazení (alokování) nového neposouvatelného kousku paměti na dynamické haldě.
MemStoreInfo - Return information on either RAM store or the ROM store for memory card.
WinDrawPixel - jednořádkový popis Systrap 0xA383
WinErasePixel - jednořádkový popis Systrap 0xA384
IX. Instrukce rodiny procesorů Motorola MC68000
ADDQ - Add Quick
BEQ - Branch Equal viz.
BRA - Branch Always
BSR - Branch to Subroutine
Bcc - Branch Conditionally
DB - pseudonistrukce pro definování bytu nebo bytové posloupnosti
DW - pseudonistrukce pro definování slova nebo posloupnosti slov
EXT - rozšíření znaménka
JMP - Jump
JSR - Jump to Subroutine
LEA - Load Effective Address
LINK - Link and Allocate
LSL, LSR - Logical Shift
MOVE - Move Data from Source to Destination
MOVEM - Move Multiple Registers
MOVEQ - Move Quick
MULS - násobení se znaménkem
PEA - Push Effective Address
RTS - Return from Subroutine
SUB - Subtract
SWAP - Swap Register Halves
TST - Test an Operand
UNLK - Unlink
B. Seznam lidí jenž se kolem Ruby vyskytovali či vyskytují
C. Různé příklady
C.1. Různe způsoby psaní komentářů

Seznam obrázků

7.1. Virtuální počítač
7.2. Provázaní slov v ITC modelu
8.1. Stav zásobníku při vykonávání slova +
18.1. Grafický návrh formuláře
19.1. Grafický návrh formuláře
23.1. Registry mikroprocessoru MC68000

Seznam tabulek

5.1. Základní manipulace se zásobníkem
8.1. Význam registrů v implementaci FIG-FORTH 1802
9.1. Přidělení registrů
11.1. Tabulka instrukcí
11.2. Význam registrů
13.1. Obsazení registrů procesoru
15.1. Seznam událostí (returned by EKEY) [1:3:7]
15.2. Slova
15.3. Allocating and Freeing Memory
16.1. Použití registrů CPU *:[1:1:5]
16.2. Mapa paměti *:[1:1:1:6]
16.3. Resource code 0 *:[1:2:6]
16.4. Slovník *:[1:1:1:1:1:3]
16.5. Pokračování předešlé tabulky Slovník *:[1:1:1:1:1:3]
17.1. Slova v modulu DataMgr *:[1:3:4]
17.2. Slova v modulu CASE
17.3. Prototypy funkcí definovaných v modulu csdump
17.4. Slova v modulu Disasm [1:2:6]
17.5. Slova v modulu docinc *:[1:2:4][1:3:4]
17.6. Seznam souborů modulu ezUI [1:3]
17.7. Slova v modulu ezUI [1:3:6]
17.8. Slova v modulu string2anyfield
17.9. Slova v modulu OnDo [1:2:7]
19.1. Struktura databáze programu KeyMaster
20.1. Přehled zdrojů souboru ppforthrsrc.prc [1:1:4]
23.1. Adresovací módy MC68k [2:1:1]
23.2. Effective Addressing Modes and Categories [3:2:1:1:1:1:1:1]
23.3. Effective Addressing Modes and Categories
29. Podmínkové kódy *:[2:3:1:7]

Seznam příkladů

3.1. Příklady slov
4.1. Definice nového slova
14.1. Začátek kódu v části code 1
14.2. Procedura $00A0
14.3. code 0
14.4. Začátek části code 1
14.5. Část code 0
14.6. Úvod části code 1 programu Scripts
14.7. Procedura $009C
14.8. Část code 0
14.9. Úvod části code 1
15.1. Kostra aplikace s obsluhou událostí
15.2. Prázdná smyčka obsluhy událostí
15.3. Prázdná smyčka obsluhy událostí
15.4. Rychlejší *FIXME:smyčka/cyklus obsuhy událostí
15.5. Ukázka kódu který reaguje na dotek pera
15.6. Ukázka obsluhy
15.7. EventType
15.8. Zjištění ID zmáčknutého tlačítka
16.1. Resource code 0
16.2. Startovací kód, začátek programu [W:80]
16.3. Funkce PilotMain *:[95]
16.4. Kód 009E - 00DC *:[80]
16.5. Kód následující po BYE, je volán z inicializace instrukcí JSR na adrese 00AE (80B0) *:[72]
16.6. Konec části code 1
16.7. Resource imag 1000
16.8. Disassemblovaný kód aplikace clock.prc
16.9. Clock.PRC: p4ap 1
17.1. Příklad použití docneeds
17.2. Modul CASE
17.3. Příklad použití modulu csdump
17.4. Modul csdump
17.5. Příklad použití docneeds
17.6. Modul Šablona
17.7. Příklad použití on:..do:
17.8. Modul ondo
20.1. Záznam slova
21.1. První část code 1
39. *:[90]
40. #> [80]
41. *:[90]
42. *:[90]
43. *:[90]
44. *:[90]
45. *:[90]
46. *:[90]
47. *:[90]
48. *:[90]
49. *:[90]
50. *:[90]
51. *:[90]
52. *:[90]
53. ." *:[90]
54. Kód slova .s v Qurtus Forthu *:[90]
55. *:[90]
56. 0= *:[90]
57. 0> *:[90]
58. Kód slova 2SWAP *:[80]
59. Kód slova : v Qurtus Forthu *:[90]
60. *:[90]
61. *:[90]
62. *:[90]
63. Kód slova >IN *:[90]
64. *:[72]
65. Kód slova again
66. Kód slova currentx *:[90]
67. Kód slova BASE *:[90]
68. Kód slova bye
69. BYE
70. *:[90]
71. *:[90]
72. CREATE
73. Kód slova DEPTH *:[80]
74. *:[90]
75. Kód slova EXECUTE [80]
76. Kód slova HERE *:[90]
77. *:[90]
78. *:[90]
79. *:[90]
80. m+
81. *:[90]
82. *:[90]
83. Kód slova ROT *:[80]
84. Kód slova S>D
85. Kód slova SOURCE *:[90]
86. Kód slova SOURCE-ID *:[90]
87. Kód slova STATE [80]
88. Kód slova SWAP *:[80]
89. Kód slova BlankFormID *:[80]
90. Kód slova MainFormID *:[80]
91. Kód slova TitledFormID *:[80]
92. Kód slova cs@
93. Kód slova currentx *:[90]
94. *:[90]
95. Kód slova currenty *:[90]
96. Kód slova event *:[90]
97. Kód slova eventhandler *:[80]
98. Kód slova needs *:[90]
99. noop
100. (bye)
101. Příklad použití slova (ID)
102. Kód slova >ABS
103. Kód slova window-bounds *:[90]
104. *:[90]
105. Definice slova freeHandle
106. itemID
107. Definice slova string>Handle
108. *:[90]
109. *:[64]
110. EventType
111. Data události ctlEnterEvent
112. Data události ctlSelectEvent
113. Data události fldEnterEvent
114. Netestovaný rozepsaný příklad použíti DmDatabaseInfo
115. Výpis jmen všech databází
116. Definice slova WinDrawPixel [64]
117. Definice slova WinErasePixel [64]
C.1. Různé způsoby psaní komentářů