mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-11-22 20:34:07 +00:00
787 lines
35 KiB
Plaintext
787 lines
35 KiB
Plaintext
VolksForth Readme
|
||
|
||
Version 1.0
|
||
10. August 2005 (cas)
|
||
|
||
VolksForth ist ein 16bit Forthsystem der Forth Gesellschaft e.V. Die
|
||
Hauptentwicklung am VolksForth fand von 1985 bis 1989 statt. Das
|
||
VolksForth Projekt wurde 2005 wiederbelebt, um ein ueberschaubares
|
||
Forth-System fuer Systeme mit begrenzten Systemresourcen zur Verfuegung
|
||
zu stellen.
|
||
|
||
Einige moderne Forth Systeme sind von VolksForth beeinflusst worden oder
|
||
von VolksForth abgeleitet worden (GNU-Forth, bigForth).
|
||
|
||
Die aktuelle VolksForth Version ist 3.81. Die Arbeit an der Version 3.90
|
||
hat begonnen.
|
||
|
||
Derzeit stehen VolksForth Versionen fuer folgende
|
||
Rechner/Betriebssysteme zur Verfuegung:
|
||
|
||
VolksForth MS-DOS (Intel x86 Architektur i8086-ia64)
|
||
VolksForth 6502 (Commodore 64, Commodore Plus 4)
|
||
VolksForth Z80 (CP/M, Schneider CPC)
|
||
VolksForth 68000 (Atari ST)
|
||
|
||
Hinweis zum Copyright
|
||
|
||
Die VolksForth Quelldateien unterliegen der
|
||
BSD Lizenz - http://www.opensource.org/licenses/bsd-license.php
|
||
|
||
Das Handbuch unterliegt dem Copyright (c) 1985 - 2005 Forth Gesellschaft
|
||
e.V. ( Klaus Schleisiek, Ulrich Hoffmann, Bernd Pennemann, Georg Rehfeld
|
||
und Dietrich Weineck).
|
||
|
||
Handbuecher, Programmdateien und Quellcode zum VolksFORTH sowie
|
||
Informationen zur Forth Gesellschaft finden Sie auf dem Webserver der
|
||
Forth Gesellschaft
|
||
|
||
http://www.forth-ev.de/
|
||
|
||
Informationen und Hilfestellung zur Programmiersprache Forth finden Sie
|
||
im Internet, ausgehend von der Webseite der Forthgesellschaft, oder im
|
||
Usenet im Forum de.comp.lang.forth (ueber Google Groups:
|
||
http://groups.google.de/group/de.comp.lang.forth )
|
||
|
||
Hinweise zum VolksForth MS-DOS
|
||
|
||
* Voraussetzungen
|
||
PC kompatibler MS-DOS/PC-DOS Rechner mit min. 64KB Speicher
|
||
MS-DOS/PC-DOS ab 2.11
|
||
|
||
* Installation
|
||
Kopieren Sie die Dateien im Verzeichnis "Files" in ein beliebiges Verzeichnis auf
|
||
dem PC.
|
||
|
||
In der Distribution finden sich folgende Files:
|
||
|
||
KERNEL COM Der volksFORTH Kern, der von KERNEL.SCR erzeugt wurde
|
||
MINIMAL COM Minimalsystem fuer die Anpassung an "Fastkompatible"
|
||
VOLKS4TH COM Normale Softwareentwicklungsumgebung, mit VOLKS4TH.SYS erzeugt
|
||
|
||
ANSI VID Videodisplaytreiber auf der Basis des ANSI.SYS MS-DOS Treibers
|
||
BIOS VID Videodisplaytreiber durch BIOS-call $10
|
||
MULTI VID Multitasking Videodisplaytreiber durch BIOS-call $10
|
||
|
||
MINIMAL SYS Loadfile, um aus KERNEL.COM MINIMAL.COM zu erzeugen
|
||
VOLKS4TH SYS Loadfile, um aus KERNEL.COM VOLKS4TH.COM zu erzeugen
|
||
|
||
GRAPHIC PRN Druckerinterface fuer den IBM-Graphic Printer
|
||
M130I PRN Druckerinterface fuer den M130i
|
||
NEC8023 PRN Druckerinterface fuer den NEC 8023a
|
||
|
||
DISKS CFG Konfigurationsfile fuer die Speicheraufteilung
|
||
SYSTEM CFG Konfigurationsfile fuer die Floppylaufwerke
|
||
|
||
ASM SCR 8088/86 Postfix-Assembler
|
||
BLOCKING SCR Hilfsprogramm, um physikalische Bloecke in Files zu uebertragen
|
||
DOUBLE SCR Definitionen fuer doppeltgenaue (32 bit) Zahlen
|
||
EDITOR SCR Full Screen Editor
|
||
EXTEND SCR Allgemeine Systemerweiterungen
|
||
F83ASM SCR Der Assembler aus F83
|
||
INSTALL SCR Definition der Befehlstasten des Editors
|
||
KERNEL SCR Sourcecode des volksFORTH Kerns
|
||
PRIMED SCR Primitivsteditor zur Anpassung an "Fastkompatible" Rechner
|
||
SEE SCR Der automatische Decompiler
|
||
SERIAL SCR Die serielle Schnittstelle
|
||
TASKER SCR Der Multitasker
|
||
TIMER SCR Der Timer im IBM-PC
|
||
TOOLS SCR Der manuelle Decompiler, der Tracer und DUMP-Utility
|
||
|
||
Zuerst sollte versucht werden, das Programm VOLKS4TH.COM zu starten. Meldet
|
||
sich das System auf dem Bildschirm mit einer Statuszeile in der 25ten Zeile,
|
||
so ist der Rechner kompatibel genug fuer den Multitasking Videotreiber
|
||
MULTI.VID. Sollte jedoch keine Meldung auf dem Bildschirm erscheinen, so
|
||
handelt es sich leider nur um einen "Fastkompatiblen" Rechner und es ist
|
||
etwas Arbeit erforderlich, das volksFORTH anzupassen.
|
||
|
||
Der naechste Versuch, MINIMAL.COM zu starten, sollte eigentlich erfolgreich
|
||
sein. Wenn das nicht der Fall ist, dann handelt es sich noch nicht einmal um
|
||
ein ordentliches MS-DOS Betriebssystem, da von dieser FORTH-Version
|
||
keinerlei Routinen im ROM des Rechners direkt - unter Umgehung des MS-DOS -
|
||
benutzt werden.
|
||
|
||
MINIMAL listet nach dem Starten eine kurze Beschreibung des Primitivst-
|
||
editors, der nun dazu benutzt werden kann, das Loadfile VOLKS4TH.SYS so zu
|
||
veraendern, da<64> damit ein System mit weniger anspruchsvollem Videodisplay-
|
||
treiber erzeugt werden kann.
|
||
|
||
Voraussetzung dazu ist, dass durch das Systemfile CONFIG.SYS (siehe MS-DOS
|
||
Handbuch) der Devicetreiber ANSI.SYS beim Booten des Systems installiert
|
||
wurde. Existiert auch dieser nicht, so ist die Benutzung des Full-Screen
|
||
Editors in der ausgelieferten Form nicht moeglich. Ist ANSI.SYS ins System
|
||
integriert, so kann mit der Anpassung des Forthsystems fortgefahren werden.
|
||
Nach starten von MINIMAL.COM ist folgendes einzugeben:
|
||
|
||
USE VOLKS4TH.SYS 1 LIST
|
||
|
||
Danach kann durch das NEW Kommando (siehe Beschreibung des Primitivst-
|
||
editors) im File VOLKS4TH.SYS die Zeile, die
|
||
|
||
"include multi.vid" enthaelt, durch "include ansi.vid" ersetzt werden.
|
||
|
||
Dann muss auch noch im File EDITOR.SCR auf Screen 1 eine entsprechende
|
||
Aenderung vorgenommen werden, indem die Ladeanweisung fuer das Multitasking
|
||
Display "auskommentiert" wird und entsprechend die Ladeanweisung fuer das
|
||
ANSI-Display aktiviert wird dadurch, da<64> in der ersten Spalte der "\"
|
||
(siehe: Interpreter-Worte) umgesetzt wird.
|
||
|
||
Danach wird mit BYE ins Betriebssystem zurueckgekehrt. Die Befehlszeile
|
||
|
||
KERNEL INCLUDE VOLKS4TH.SYS
|
||
|
||
erstellt dann ein neues File VOLKS4TH.COM, das nun die ANSI.SYS Steuer-
|
||
sequenzen fuer die Cursorsteuerung benutzt. Dies dauert einige Zeit, da
|
||
insgesamt ca. 15kByte Objectcode compiliert werden muessen.
|
||
|
||
Nach dem Ende des Ladevorgangs meldet sich das System mit einem Piep und es
|
||
sollte auch in der 25. Zeile eine inverse Statuszeile angezeigt werden.
|
||
|
||
Nun kann noch mit Eingabe von INCLUDE DISKS.CFG die aktuelle Speicher-
|
||
kapazitaet der Diskettenlaufwerke festgelegt werden. Dies ist jedoch nur dann
|
||
notwendig, wenn im DIRECT-Modus (siehe: Fileinterface) auf die Disketten
|
||
zugegriffen werden soll. Danach evtl. mit SAVESYSTEM VOLKS4TH.COM die
|
||
Aenderungen permanent auf die Disk zurueckschreiben.
|
||
|
||
Damit ist die Anpassung an den Rechner beendet.
|
||
|
||
Der Videodisplaytreiber BIOS.VID benutzt - wie auch MULTI.VID - den BIOS-
|
||
call $10. Da jedoch keine Ruecksicht auf Multitaskingbetrieb genommen wird
|
||
(Nur eine Task kann den Bildschirm steuern), ist die Bildschirmausgabe
|
||
schneller.
|
||
|
||
Als letztes bleibt dann noch die Anpassung an den Drucker vorzunehmen. Dafuer
|
||
gibt es im System bereits die drei Files
|
||
|
||
GRAPHIC.PRN M130I.PRN NEC8023.PRN.
|
||
|
||
Sollten Sie einen Drucker haben, der noch andere Steuersequenzen benoetigt,
|
||
so muessen Sie sich fuer Ihren Drucker auch ein entsprechendes .PRN File
|
||
schaffen. Als Vorbild kann dabei jedes der drei vordefinierten Files dienen;
|
||
es sind lediglich die jeweils aktuellen Werte fuer die Steuersequenzen an
|
||
passender Stelle einzutragen - dies erfordert jedoch schon einige
|
||
Vertrautheit mit Forth. Sollten Sie dazu nicht in der Lage sein, so hilft
|
||
Ihnen vielleicht ein alter Forth-Hase in ihrer Naehe, mit dem Sie viel-
|
||
leicht die Forth Gesellschaft eV ( http://www.forth-ev.de) in
|
||
Verbindung bringen kann. Bitte denken Sie auch daran, neue Druckertreiber an
|
||
die Forth Gesellschaft einzusenden, damit diese in das volksFORTH-Paket
|
||
aufgenommen werden koennen.
|
||
|
||
Der passende Druckertreiber muss dann in dem Loadfile VOLKS4TH.SYS
|
||
so eingetragen werden, wie das beim Videodisplaytreiber beschrieben wurde.
|
||
|
||
* Emulator
|
||
* Windows 9x, ME
|
||
VolksForth 3.81 funktioniert sollte in der reinen DOS Umgebung dieser Betriesb-
|
||
systeme ohne Probleme funktionieren
|
||
|
||
* Windows NT, 2000, XP, Vista
|
||
VolksForth MS-DOS sollte auch in der Dos Umgebung moderner Windows Systeme laufen.
|
||
Wenn Sie Probleme mit dem VolksForth unter Windows NT, 2000, XP oder Vista bemerken,
|
||
empfehlen wir den Einsatz eines DOS-Emulators wie Dos-Box
|
||
(http://dosbox.sourceforge.net/)
|
||
|
||
* OS/2 / eComStation
|
||
VolksForth 3.81 funktioniert ohne Probleme in der Dos-Umgebung von OS/2 und eComStation
|
||
|
||
* Unix / Linux
|
||
Unter Linux / Unix Systemen auf x86 Hardware Basis kann VolksForth unter der DosEmu
|
||
Umgebung ( http://www.dosemu.org ) ausgefuehrt werden. Auch der kommerzielle PC-Emulator
|
||
VMWare eignet sich gut um eine MS-DOS/PC-DOS Umgebung zu erstellen. Unter anderen System-
|
||
Platformen (MacOS X PowerPC, Solaris, HP/UX) sind die PC-Emulatoren Qemu
|
||
(http://fabrice.bellard.free.fr/qemu/) und DosBox (http://dosbox.sourceforge.net/) zu
|
||
empfehlen.
|
||
|
||
Als freie Alternative zu MS-DOS / PC-DOS empfielt sich FreeDOS ( http://www.freedos.org/ ).
|
||
|
||
Die Forth Live-Linux CD-ROM (erhaeltlich im Downloadbereich der Forth
|
||
Gesellschaft Webseite) enthaelt die aktuellen Versionen des VolksForth direkt
|
||
ausfuerbar auf der Linux CD-ROM, inkl. der VolksForth Handbuecher.
|
||
|
||
Viel Spass mit VolksForth
|
||
wuenscht das VolksForth Team
|
||
|
||
|
||
---------------
|
||
|
||
Weitere Informationen:
|
||
|
||
volksFORTH 3.81 fuer den IBM-PC und Kompatible wurde aus dem volksFORTH 3.80
|
||
fuer CP/M Rechner entwickelt.
|
||
|
||
Es wurden wenige Aenderungen am Kern des Systems vorgenommen, diese beziehen
|
||
sich hauptsaechlich auf Stellen, die in der Version 3.80 unelegant waren und
|
||
fuer die inzwischen bessere Loesungen in der Forth-Community erarbeitet worden
|
||
waren.
|
||
|
||
Grundlegend Ueberarbeitet wurde das File-Interface. Auf der Benutzerebene
|
||
stehen die gleichen Worte, wie im volksFORTH 3.80 fuer den ATARI und CP/M zur
|
||
Verfuegung, die darunterliegende Implementation wurde jedoch grundlegend
|
||
geaendert, so dass jetzt endlich in Forth auch sequentielle Files, die nicht
|
||
die starre BLOCKstruktur haben, manipuliert werden koennen. Damit ist es
|
||
endlich moeglich, auch volksFORTH fuer kleine Hilfsprogramme zu verwenden, die
|
||
mit anderen Programmen erstellte Files "bearbeiten" und durch den Befehl
|
||
SAVESYSTEM als "standalone"-Programm abgespeichert wurden.
|
||
|
||
Besonders weitreichende Moeglichkeiten erschliessen sich dadurch, dass beim
|
||
Aufruf von volksFORTH auf der Betriebssystemebene noch eine ganze
|
||
Kommandozeile mit Uebergeben werden kann, die dann unmittelbar nach dem
|
||
Booten von Forth ausgefuehrt wird. Durch die Systemvariable RETURN_CODE kann
|
||
nach Verlassen des Forthprogramms ein Wert an MS-DOS zurueckgegeben werden,
|
||
der mit dem Batch-Befehl ERRORLEVEL abgefragt werden kann.
|
||
|
||
Darueberhinaus ist es auch moeglich, mit dem Befehl MSDOS aus dem Forth heraus
|
||
eine weitere COMMAND.COM shell aufzurufen und spaeter mit EXIT wieder ins
|
||
Forth zurueckzukehren, wobei der Bildschirm, der zum Zeitpunkt des Aufrufs
|
||
bestand, wiederhergestellt wird. Selbstverstaendlich kann neben MSDOS selber
|
||
auch jedes andere beliebige Anwendungsprogramm aufgerufen werden - auch eine
|
||
weitere Inkarnation des Forth Systems - so da<64> sich mit diesen Moeglichkeiten
|
||
die Begrenzungen, die in dem beschraenkten Adressraum von 64k liegen,
|
||
ueberwinden lassen. Auch komplizierte Overlaystrukturen sind nicht mehr
|
||
notwendig, es werden einfach aus einem zentralen "Verwaltungsprogramm"
|
||
heraus spezielle Forth-Anwendungsprogramme aufgerufen.
|
||
|
||
=============================================================================
|
||
|
||
Das Handbuch unterliegt dem Copyright
|
||
(c) 1985/1986 Ulrich Hoffmann, Georg Rehfeld und Dietrich Weineck.
|
||
(c) 1988/1989 Klaus Schleisiek, Joerg Staben, Klaus Kohl
|
||
|
||
|
||
Informationen zu <20>nderungen genueber frueheren VolksForth Versionen und
|
||
Aenderungen gegenueber dem Handbuch:
|
||
|
||
ONLY
|
||
Dieses Wort wurde bisher nur durch einen undurchsichtigen "patch" im
|
||
System realisiert. In dieser Version 3.81 ist ONLY nun eine ganz
|
||
gewoehnliche :-Definition. Dazu wurde das Vokabular ROOT im Kern neu
|
||
definiert, das alle die Definitionen enthaelt, die frueher im Vokabular ONLY
|
||
enthalten waren. Jetzt koennen einfach durch ROOT DEFINITIONS in dieses
|
||
Vokabular - das immer als letztes zu durchsuchendes Vokabular in die
|
||
Suchreihenfolge eingefuegt ist - weitere Worte hineindefiniert werden.
|
||
|
||
INTERPRET
|
||
Auch INTERPRET benoetigte bisher zur Implementation einen sehr mysterioesen
|
||
Systempatch. Dank einer Idee von Mike Perry ist auch diese letzte Ecke nun
|
||
abgeschliffen: Das deferred Wort PARSER enthaelt entweder den Code fuer den
|
||
Interpreter oder den Compiler (durch [ und ] umzuschalten) und Interpret
|
||
ist nun eine BEGIN ... REPEAT Schleife, in der das naechste Wort aus dem
|
||
Quelltext geholt wird. Ist der Quelltext erschoepft, so wird die Schleife
|
||
verlassen, andernfalls wird PARSER aufgerufen und dadurch das Wort ent-
|
||
weder interpretiert oder compiliert. Nun ist es auch sehr viel einfacher
|
||
als vorher, selber eigene Worte zu definieren, die in PARSER eingehuengt
|
||
werden. Dies ist immer dann sinnvoll, wenn der Interpreter in einem
|
||
Anwendungsprogramm anders als der uebliche Forth-Interpreter arbeiten soll.
|
||
|
||
>INTERPRET
|
||
Konnte gluecklicherweise gestrichen werden.
|
||
|
||
QUIT QUERY
|
||
Bisher enthielt QUERY ein BLK OFF. Das war an dieser Stelle aber am
|
||
falschen Platz und gehoert ins QUIT, wo es aber vorher nicht war. Das war
|
||
bisher kaum aufgefallen, da QUERY eigentlich nur in der QUIT-Loop benutzt
|
||
worden war.
|
||
|
||
CAPITALIZE
|
||
War von den Parametern her so spezialisiert auf die Benutzung in NAME
|
||
zugeschnitten, dass es darueber hinaus eigentlich sinnlos war. CAPITALIZE
|
||
ist nun durch UPPER ersetzt worden. Es kann jetzt folgendermassen definiert
|
||
werden:
|
||
: CAPITALIZE ( adr -- adr ) DUP COUNT UPPER ;
|
||
|
||
NUMBER?
|
||
Ist ein ganz uebles Beispiel dafuer, dass in verschiedenen Faellen
|
||
unterschiedliche Anzahlen von Parametern als Ergebnis auf dem Stack
|
||
liegen. Es ist jedesmal eine Pein, wenn das Wort benutzt werden soll.
|
||
Wir haben daraus gelernt, dass das ein grosser Fehler war, aber aus
|
||
portabilitaetsgruenden alles so gelassen.
|
||
|
||
DOES>
|
||
Auf Grund des Maschinencodes des 8086 compiliert DOES> keine absolute
|
||
Adresse zur Routine DODO, sondern einen relativen Sprung. Dies ist zum
|
||
Beispiel beim Decompiler zu beachten.
|
||
|
||
WARNING
|
||
Die Logik wurde "herumgedreht" und nun schaltet WARNING OFF die Meldung
|
||
"exists" aus und WARNING ON wieder ein.
|
||
|
||
(COLD
|
||
Bei der Ausfuehrung wird der gecountete String, der an der absoluten
|
||
Adresse 80h steht, in den Texteingabepuffer uebertragen. Dieser Text, der
|
||
von MS-DOS bei Aufruf des .COM-Files aus der Eingabezeile dorthin
|
||
uebertragen wurde, wird dann als allererstes von Forth interpretiert.
|
||
Dadurch ist es sehr einfach moeglich, Forth Programme in Batch-Files zu
|
||
benutzen und mit Parametern zu versorgen. Zu beachten ist, dass immer dann,
|
||
wenn ein COLD ausgefuehrt wird, gleichfalls der gecountete String an dieser
|
||
Stelle interpretiert wird. Da MS-DOS die gleiche Stelle dazu benutzt,
|
||
Namen von Files waehrend Directoryoperationen abzulegen, steht dort oft ein
|
||
fuer Forth "unsinniger" Textstring.
|
||
|
||
TRACE'
|
||
Im TOOLS-Vokabular wurde in TRACE umbenannt.
|
||
|
||
VIEW
|
||
Zeigt nun nur noch den Screen auf dem Bildschirm, auf dem die ge"viewte"
|
||
Definition steht. Soll gleichzeitig der Editor "angeworfen" werden, so ist
|
||
das Wort FIX zu benutzen.
|
||
|
||
Zusaetzliche Worte im Kern
|
||
|
||
0=EXIT
|
||
Ist komplementaer zu ?EXIT und wurde in den Kern aufgenommen.
|
||
|
||
FIX <name>
|
||
Mit FIX <name> wird das File, in dem <name> definiert wurde, zum aktuellen
|
||
File gemacht. Dann wird der Full-Screen-Editor aktiviert, der Screen ange-
|
||
zeigt, auf dem <name> definiert wurde und der Cursor stellt sich hinter
|
||
die auf dem Screen hinter <name>. Durch diese Funktion ist es im
|
||
allgemeinen ueberfluessig, waehrend der Programmentwicklung noch Quelltexte
|
||
auszudrucken.
|
||
|
||
FLIP ( u1 -- u2 )
|
||
Das Byteswap des obersten Stackelements. u1 ist eine 16-bit Zahl mit den
|
||
Bits B15 .. B8 B7 .. B0, wobei B15 .. B8 als das "high-Byte", B8 .. B0 als
|
||
das "low-Byte" bezeichnet wird. Durch FLIP wird das High- mit dem Low-Byte
|
||
ausgetauscht, so dass u2 als Ergebnis die Bits in der Reihenfolge
|
||
B7 .. B0 B15 .. B8 angeordnet hat.
|
||
|
||
PROMPT
|
||
Ein deferred Wort, das fuer die Ausgabe des "ok" verantwortlich ist. Es
|
||
wurde auch das Wort (QUIT neu implementiert. Nun ist es moeglich, den Forth
|
||
Interpreter auch wie ein "klassisches" Betriebssystem arbeiten zu lassen,
|
||
in dem eine Meldung nicht NACH jeder Aktion HINTER der Eingabe-zeile
|
||
ausgegeben wird, sondern VOR einer Aktion am ANFANG der Eingabezeile. Ein
|
||
entsprechendes Beispiel befindet sich im Quelltext hinter der Definition
|
||
von QUIT.
|
||
|
||
PARSER
|
||
siehe INTERPRET.
|
||
|
||
Die INTEL-Prozessoren haben eine verkomplizierte Art, den Adressraum jenseits
|
||
von 64kBytes zu adressieren - naemlich mit sogenannten "Segmentregistern".
|
||
|
||
Am besten kommt man damit noch zurecht, wenn man diese Prozessoren als 16-
|
||
bit Prozessoren betrachtet, die in der Lage sind, mehrere Programme, die
|
||
jeweils hoechstens 64k Programmspeicherbereich haben, gleichzeitig im
|
||
Speicher zu halten. Es ist deshalb auch unvernuenftig, auf diesen Prozessoren
|
||
ein Forthsystem mit 32-bit Adressen zu installieren - es handelt sich eben
|
||
nicht um 32-bit Prozessoren.
|
||
|
||
Statt dessen ist in volksFORTH die Moeglichkeit gegeben, aus dem Forth heraus
|
||
mit dem Wort CALL (im DOS-Vokabular) ein weiteres .COM oder .EXE-Programm
|
||
aufzurufen. Dies koennen natuerlich ihrerseits Forth-Programme sein, denen
|
||
dann auch noch eine ganze Eingabezeile als Parameter mit "auf den Weg"
|
||
gegeben werden koennen. Ueber die Systemvariable RETURN_CODE ist es auch noch
|
||
moeglich, einen Errorcode bei Beendigung des Forth Programms an MS-DOS zu
|
||
uebergeben, der dann in Batch-Files getestet werden kann. Damit waere es zum
|
||
Beispiel moeglich, den Full-Screen Editor aus dem System auszulagern und mit
|
||
den Befehlen FIX, EDIT, ED usw. jeweils ein .COM-Programm aufzurufen, das
|
||
den Forth-Editor als "stand-alone" Programm enthaelt und damit keinen
|
||
Adressraum im Entwicklungssystem mehr verbraucht.
|
||
|
||
Die Intel-Prozessoren setzen die Speicheradressen aus zwei Teilen zusammen,
|
||
dem SEGMENT und dem OFFSET. Dies ist jedoch nicht mit "echten" 32-bit
|
||
Adressen zu verwechseln. Diese werden auf einem 16-bit Stack in der
|
||
Reihenfolge "low-word" unter dem "high-word" abgelegt. Uebertraegt man diese
|
||
Philosophie auf die "seg:addr" Adressen des 8086, dann blockiert dauernd die
|
||
Segmentadresse den Stack. Deshalb wird bei den Operatoren, die im
|
||
erweiterten Adressraum des 8086 operieren, die Segmentadresse UNTER der
|
||
Offsetadresse auf den Stack gelegt.
|
||
|
||
Der Stackkommentar dafuer lautet "seg:addr"
|
||
|
||
Operatoren, die als Adressargument eine "erweiterte" Adresse benoetigen, haben
|
||
ein "l" im Namen vorangestellt.
|
||
|
||
|
||
|
||
B/SEG ( -- n )
|
||
Eine Konstante, die angibt, wieviele Bytes zwischen zwei Segmenten
|
||
liegen. Dies sind beim 8086 16 Bytes, beim 80286 im 286-Modus
|
||
jedoch 64 Bytes. volksFORTH auf dem 80286 setzt zur Zeit voraus,
|
||
dass der 8086-Emulationsmodus eingeschaltet ist.
|
||
|
||
DS@ ( -- seg )
|
||
Legt die Segmentadresse des Segments auf den Stack, in dem sich das
|
||
maximal 64kByte grosse Forthsystem gerade befindet. Das Daten-,
|
||
Extra-, Stack- und Codesegment werden durch Forth alle auf den
|
||
gleichen Wert gesetzt.
|
||
|
||
L@ ( seg:addr -- n )
|
||
Entspricht dem @, jedoch im erweiterten Adressraum.
|
||
|
||
L! ( n seg:addr -- )
|
||
Entspricht dem !, jedoch im erweiterten Adressraum.
|
||
|
||
LALLOCATE ( #pages -- seg ff / rest err# ) EXTEND
|
||
Es koennen hiermit im erweiterten Adre<72>raum die Anzahl #pages
|
||
Speicherplatz angefordert werden. Die Groesse einer "Page" in Bytes
|
||
entspricht der Konstanten B/SEG. Wenn die Speicheranforderung
|
||
erfaellt werden kann, dann wird unter einer 0 als Flag fuer den
|
||
Erfolg der Operation die Segmentadresse des ersten Segments
|
||
innerhalb eines zusammenhaengenden Speicherbereichs von #page Pages
|
||
auf den Stack gelegt. Ansonsten liegt unter einem Fehlercode die
|
||
maximale Anzahl von Pages, die noch als zusammenhaengender Bereich
|
||
verfuegbar sind. Diese Funktion ist in dem Wort SAVEVIDEO benutzt,
|
||
um den Bildschirminhalt in den Speicher zu kopieren. Die
|
||
komplementaeren Funktionen sind LFREE und RESTOREVIDEO.
|
||
|
||
LC@ ( seg:addr -- 8b )
|
||
Entspricht dem C@, jedoch im erweiterten Adressraum.
|
||
|
||
LC! ( 8b seg:addr -- )
|
||
Entspricht dem C!, jedoch im erweiterten Adressraum.
|
||
|
||
LDUMP ( seg:addr quan -- ) TOOLS
|
||
Entspricht dem DUMP, jedoch im erweiterten Adressraum.
|
||
|
||
LFREE ( seg -- err# )
|
||
Der Speicherbereich, der an der Segmentadresse SEG beginnt, wird
|
||
wieder an das Betriebssystem zurueckgegeben. Diese Operation ist nur
|
||
definiert, wenn zu einem vorherigen Zeitpunkt eine LALLOCATE-
|
||
Operation durchgefuehrt worden war, die als Ergebnis die Segment-
|
||
adresse SEG gehabt hatte. Als Ergebnis liegt ein Fehlercode auf dem
|
||
Stack, der im Erfolgsfall Null ist.
|
||
|
||
LMOVE ( from.seg:addr to.seg:addr quan -- )
|
||
Entspricht dem MOVE, jedoch im erweiterten Adressraum. Es koennen
|
||
hiermit maximal 64kBytes auf einmal bewegt werden.
|
||
|
||
LTYPE ( seg:addr len -- )
|
||
Entspricht dem TYPE, jedoch im erweiterten Adressraum. Es ist zu
|
||
beachten, dass TYPE in den Videodisplaytreibern BIOS.VID und
|
||
MULTI.VID so implementiert ist, dass bei Erreichen des Zeilenendes
|
||
nicht automatisch ein CR ausgefuehrt wird. Statt dessen werden alle
|
||
Zeichen, die "jenseits" des rechten Rands liegen, nicht ausgegeben.
|
||
|
||
PC@ ( port.addr -- 8b )
|
||
Holt ein Byte von port.addr aus einem Peripheriebaustein des 8086-
|
||
Systems auf den Stack.
|
||
|
||
PC! ( 8b port.addr -- )
|
||
Speichert ein Byte in einen Peripheriebaustein des 8086-Systems bei
|
||
port.addr.
|
||
|
||
Drei wichtige Worte: USE, LIST, LOAD und INCLUDE
|
||
|
||
volksFORTH bearbeitet seine Quelltexte in sogenannten Screen Files, die
|
||
ueblicherweise die Endung .SCR haben. Das sind Files, die in 1 kB grosse
|
||
Screens aufgeteilt sind, jeweils in 16 Zeilen zu je 64 Zeichen strukturiert.
|
||
|
||
Soll ein File, das schon existiert, bearbeitet werden, so wird es durch
|
||
USE <filename> zum sogenannten "aktuellen" File gemacht. Zum Beispiel macht
|
||
USE KERNEL.SCR das File KERNEL.SCR zum aktuellen File, auf das sich alle
|
||
weiteren Fileoperationen beziehen, bis ein anderes File zum aktuellen File
|
||
gemacht wird.
|
||
|
||
Mit <nn> LIST wird Screen nn auf dem Bildschirm angezeigt - also zum
|
||
Beispiel mit 1 LIST der Screen 1 des Files KERNEL.SCR.
|
||
|
||
Mit <nn> LOAD wird ein Screen nn geladen, d.h. durch den Forth-Compiler
|
||
in das Woerterbuch compiliert.
|
||
|
||
Ueblicherweise enthaelt Screen 0 eines jeden Files eine kurze Erklaerung ueber
|
||
den Inhalt des Files - dies ist auch deshalb sinnvoll, da der Screen 0 eines
|
||
Files nicht geladen werden kann. Screen 1 enthaelt ueblicherweise den
|
||
sogenannten "loadscreen". Dieser steuert den Ladevorgang des gesamten Files.
|
||
In Zeile 0 eines jeden Screens ist ein Kommentar ueber den Inhalt des Screens
|
||
und das Datum der letzten Aenderung enthalten.
|
||
|
||
Mit INCLUDE <filename> kann man unkompliziert ein ganzes Screenfile laden.
|
||
Diese Operation ist der Sequenz "USE <filename> 1 LOAD" Aequivalent.
|
||
|
||
#DRIVES ( -- n )
|
||
Eine Konstante, die die moegliche Anzahl von logischen Laufwerken im
|
||
System definiert. Diese Anzahl ist nur im DIRECT-Modus von
|
||
Bedeutung. So, wie der Kern compiliert ist, sind maximal 6
|
||
Laufwerke zugelassen.
|
||
|
||
(BLOCK ( blk file -- addr )
|
||
Liest den Block BLK aus dem File, dessen FCB bei der Adresse FILE
|
||
beginnt und legt diesen in einen Puffer bei der Adresse ADDR ab.
|
||
|
||
(BUFFER ( blk file -- addr )
|
||
Reserviert einen 1kByte grossen Puffer im Adressbereich des Forth-
|
||
Systems fuer den Block BLK. FILE ist die Adresse des FCB's, in dem
|
||
sich der Block befindet. Ist FILE = 0, dann handelt es sich um
|
||
einen DIRECTen physikalischen Zugriff. ADDR ist die Anfangsadresse
|
||
des Puffers.
|
||
|
||
(R/W ( addr blk fcb r/w -- *f )
|
||
Die Standardroutine fuer das deferred Wort R/W.
|
||
|
||
(DISKERROR ( #err -- ) DOS
|
||
Die Standard-System Fehlerbehandlungsroutine fuer Fehler beim
|
||
Diskzugriff. Hiermit ist das deferred Wort ?DISKERROR
|
||
initialisiert.
|
||
|
||
(FSEARCH ( string -- asciz *f ) DOS
|
||
Das File, dessen Name als String bei STRING steht, wird in der
|
||
Directory gesucht. Enthaelt der Filename keine Suchpfadinformation,
|
||
dann wird im aktuellen Directory gesucht. Bei Erfolg liegt eine
|
||
Null auf dem Stack, sonst eine Fehlernummer.
|
||
|
||
*BLOCK ( blk -- d ) DOS
|
||
Die doppeltgenaue Zahl D ist die Byteadresse des ersten Bytes im
|
||
1024-Byte gro<72>en Block BLK.
|
||
|
||
.FILE ( fcb -- ) DOS
|
||
Druckt den Forth-Filenamen des Files, dessen FCB-Adresse auf dem
|
||
Stack liegt.
|
||
|
||
/BLOCK ( d -- rest blk ) DOS
|
||
Die doppeltgenaue Zahl D wird umgerechnet in die REST-Anzahl von
|
||
Bytes innerhalb des 1024-Byte gro<72>en Blocks BLK.
|
||
|
||
/DRIVE ( blk1 -- blk2 drive )
|
||
Fuer den DIRECT-Modus beim Diskzugriff. Aus der absoluten
|
||
Blocknummer BLK1 wird (siehe: CAPACITIES) die relative Blocknummer
|
||
BLK2 auf Laufwerk DRIVE berechnet. Dabei ist Laufwerk A: Drive 0
|
||
etc.
|
||
|
||
>ASCIZ ( string addr -- asciz )
|
||
Mit diesem Operator wird der gecountete String an der Adresse
|
||
STRING umgewandelt in einen nullterminierten String, der an der
|
||
Adresse ADDR abgelegt wird. ASCIZ ist die Adresse, an der der neue
|
||
String liegt.
|
||
|
||
>DRIVE ( blk1 +n -- blk2 )
|
||
Dient zum "umrechnen" von Blocknummern im DIRECT-Modus. BLK2 ist
|
||
die absolute Blocknummer, die dem relativen Block BLK1 auf Drive +N
|
||
entspricht.
|
||
|
||
?DISKERROR ( -- )
|
||
Ein deferred Wort, dass die Fehlerbehandlungsroutine fuer Disk- und
|
||
Filezugriffe enthaelt. Standardmaessig ist die Routine (DISKERROR
|
||
zugewiesen.
|
||
|
||
A: B: C: D: E: F: G: H:
|
||
Wie bei MS-DOS, macht das dadurch bezeichnete logische Laufwerk zum
|
||
aktuellen Laufwerk.
|
||
|
||
ASCIZ ( -- asciz )
|
||
Holt das naechste Wort im Quelltext in den Speicher und legt es als
|
||
nullterminierten String bei der Adresse ASCIZ ab.
|
||
|
||
ASSIGN ( -- )
|
||
Benutzt in der Form:
|
||
|
||
ASSIGN <filename>
|
||
|
||
Weist dem aktuellen File den physikalischen Filenamen <filename>
|
||
zu.
|
||
|
||
ATTRIBUT ( -- addr ) DOS
|
||
Eine Variable, die die Fileattribute enthaelt, die bei der Suche
|
||
nach Files in einem Directory beruecksichtigt werden. Standardmaessig
|
||
mit 7 initialisiert, so da<64> in die Suche read-only, hidden und
|
||
systemfiles eingeschlossen sind.
|
||
|
||
CAPACITIES ( -- addr )
|
||
Die Adresse eines Vektors, der die Kapazitaeten der angeschlossenen
|
||
logischen Laufwerken in 1kByte-Bloecken enthaelt. Dafuer sind maximal
|
||
6 Eintraege (siehe: #DRIVES) vorgesehen. Mit dem Hilfsprogramm
|
||
DISKS.CFG koennen die Kapazitaeten fuer die Diskettenlaufwerke
|
||
eingestellt werden. Die Kapazitaet der angeschlossenen Diskdrives
|
||
sollten eigentlich von der Bootroutine aus dem System selber
|
||
erschlossen werden.
|
||
|
||
CLOSE ( -- )
|
||
Schliesst das aktuelle File.
|
||
|
||
COUNTED ( asciz -- addr len )
|
||
Wird benutzt, um die Laenge eines mit einer Null terminierten
|
||
Strings zu bestimmen. ASCIZ ist die Anfangsadresse dieses Strings
|
||
(MS-DOS verwaltet Strings so), ADDR und LEN sind die
|
||
Stringparameter, die zB. von TYPE verarbeitet werden wuerde.
|
||
|
||
DIRECT ( -- )
|
||
Die Filevariablen werden auf Null gesetzt und damit beziehen sich
|
||
die Diskzugriffe durch BLOCK auf physikalische Blocks.
|
||
|
||
ERROR# ( -- addr )
|
||
Eine Variable, die die Fehlernummer des letzten Fehlers beim
|
||
Zugriff auf ein File enthaelt.
|
||
|
||
FBLOCK! ( addr blk fcb -- ) DOS
|
||
1024 Bytes, die ab der Adresse ADDR innerhalb des
|
||
Forthadressbereichs stehen, werden auf den Block BLK innerhalb des
|
||
Files geschrieben, das durch FCB characterisiert ist.
|
||
|
||
BLOCK@ ( addr blk fcb -- ) DOS
|
||
1024 Bytes, die im File FCB in Block BLK stehen, werden ab der
|
||
Adresse ADR im Forthadressbereich abgelegt.
|
||
|
||
CAPACITY ( -- n )
|
||
N ist die Kapazitaet in 1024-Byte Bloecken des aktuellen Files bzw.
|
||
des aktuellen Laufwerks bei DIRECT-Zugriff.
|
||
|
||
DRIVE ( n -- )
|
||
Macht N zum aktuellen Laufwerk.
|
||
|
||
DRV ( -- n )
|
||
N ist die Nummer des aktuellen Laufwerks.
|
||
|
||
FCLOSE ( fcb -- ) DOS
|
||
Das File, dessen FCB-Adresse auf dem Stack liegt, wird geschlossen.
|
||
|
||
FGETC ( fcb -- 8b / eof ) DOS
|
||
Aus dem File, dessen FCB-Adresse auf dem Stack liegt, wird das
|
||
naechste Byte gelesen und der Schreib/Lesezeiger um eine Position
|
||
weitergerueckt. Wenn das letzte Byte bereits gelesen war, wird die
|
||
EndOfFile-Markierung -1 zurueckgegeben.
|
||
|
||
FILE ( -- )
|
||
siehe ATARI Fileinterface.
|
||
|
||
FILE?
|
||
Zeigt den Forth-Filenamen des aktuellen Files an.
|
||
|
||
FILE-LINK ( -- addr )
|
||
Eine Variable zur Verwaltung der File-Control-Bloecke (FCB). Der
|
||
Inhalt von FILE-LINK zeigt auf den Anfang des Parameterfeldes des
|
||
zuletzt definierten FCB's - und an dieser Stelle steht dann die
|
||
Adresse des davor definierten FCB's usw., so da<64> dadurch alle FCB's
|
||
aufgefunden werden koennen.
|
||
|
||
FILE! ( 8b dfaddr fcb -- ) DOS
|
||
Das Byte 8B wird an die Position DFADDR des Files FCB geschrieben.
|
||
|
||
FILE@ ( dfaddr fcb -- 8b / eof ) DOS
|
||
Das Byte an der 32-bit Position DFADDR im File, dass durch FCB
|
||
charakterisiert ist, wird gelesen. Liegt DFADDR jenseits des
|
||
letzten Bytes im File, so wird -1 zurueckgegeben. Nach erfolgreichem
|
||
Lesen steht der Lese/Schreibzeiger hinter dem gelesenen Byte.
|
||
|
||
FILENAME ( -- addr ) DOS
|
||
Die Anfangsadresse eines 62-Byte gro<72>en Speicherbereichs, der zum
|
||
ablegen von Filenamen waehrend DOS-Fileoperationen dient.
|
||
|
||
FNAMELEN ( -- n ) DOS
|
||
Eine Konstante, die die maximale Laenge von logischen Filenamen,
|
||
bestehend aus Drive, Path und Name, die in den FCB's abgespeichert
|
||
werden koennen, bestimmt. Wird dieser Wert veraendert, so kann die
|
||
neue Laenge erst in den FCB's verwendet werden, die nach der
|
||
Aenderung angelegt werden.
|
||
|
||
FPUTC ( 8b fcb -- ) DOS
|
||
Das Byte 8B wird an der aktuellen Position des Schreib/Lesezeigers
|
||
in das File FCB geschrieben. Dabei wird der Zeiger um eine Position
|
||
weitergerueckt.
|
||
|
||
FRESET ( fcb -- ) DOS
|
||
FCB ist die Adresse eines FileControlBlocks. Das dadurch
|
||
charakterisierte File wird "zurueckgesetzt", d.h. das File wird
|
||
geoeffnet (wenn es noch nicht geoeffnet war) und der Schreib/Lese-
|
||
zeiger wird auf den Anfang des Files gesetzt.
|
||
|
||
FROM Siehe ATARI Fileinterface.
|
||
|
||
FSEARCH ( string -- asciz *f ) DOS
|
||
Ein deferred Wort. Es enthaelt die Suchstrategie (siehe: (FSEARCH),
|
||
die beim oeffnen eines Files verwendet wird, um das File auf der
|
||
Disk zu lokalisieren.
|
||
|
||
FSEEK ( dfaddr fcb -- ) DOS
|
||
Der Schreib/Lesezeiger des Files, das durch FCB charakterisiert
|
||
ist, wird auf die Position DFADDR gesetzt. Dabei ist DFADDR eine
|
||
doppeltgenaue Zahl, so dass maximal Files von 4-GByte Groesse
|
||
verwaltet werden koennen.
|
||
|
||
INCLUDE siehe ATARI Fileinterface.
|
||
|
||
LFGETS ( seg:addr quan fcb -- #read ) DOS
|
||
siehe: ~READ. Lediglich wird statt der Handlenummer die Adresse des
|
||
FCB's des gewuenschten Files angegeben.
|
||
|
||
LFPUTS ( seg:addr quan fcb -- )
|
||
Die Anzahl QUAN von Bytes ab der erweiterten Adresse SEG:QUAN
|
||
werden ab der aktuellen Position des Schreib/Lesezeigers in das
|
||
File geschrieben, das durch FCB charakterisiert ist. Danach steht
|
||
der Schreib/Lesezeiger hinter dem letzten geschriebenen Byte.
|
||
|
||
LFSAVE ( seg:addr quan string -- )
|
||
Erzeugt ein File mit dem Namen, der als gecounteter String an der
|
||
Adresse STRING abgelegt ist und schreibt die Anzahl QUAN Bytes ab
|
||
der erweiterten Adresse SEG:ADDR in dieses neue File.
|
||
|
||
LOADFROM Siehe ATARI Fileinterface.
|
||
|
||
OPEN ( -- )
|
||
Oeffnet das aktuelle File.
|
||
|
||
PUSHFILE ( -- ) C
|
||
Wird in :-definitionen benutzt, um den aktuellen Zustand des
|
||
Filevariablen ISFILE und FROMFILE nach dem Ende der :-Definition
|
||
wiederherzustellen. Siehe: PUSH
|
||
|
||
SAVEFILE ( addr len -- )
|
||
Wird in der Form:
|
||
|
||
SAVEFILE <name>
|
||
|
||
benutzt und schreibt die Anzahl von LEN Bytes ab der Adresse ADDR
|
||
in das neu erzeugte File mit dem Namen <name>.
|
||
|
||
SAVESYSTEM <name>
|
||
Schreibt eine bootbare Form des jetzt laufenden Forthsystems unter
|
||
dem Namen <name> auf die Disk. Dabei muss <name> die Endung .COM
|
||
haben, wenn dieses System spaeter wieder unter MS-DOS gestartet
|
||
werden soll.
|
||
|
||
USE ( -- )
|
||
siehe ATARI Fileinterface.
|
||
|
||
VIEW ( -- )
|
||
Wird in der Form:
|
||
|
||
VIEW <name>
|
||
|
||
benutzt. Wenn <name> im Woerterbuch gefunden wird, so wird das File
|
||
geoeffnet, in dem der Quelltext von <name> steht und der Block wird
|
||
gelistet, auf dem <name> definiert ist. Siehe: LIST
|
||
|
||
~CLOSE ( handle -- ) DOS
|
||
Der MS-DOS Systemaufruf, um das File, das durch HANDLE
|
||
characterisiert ist, zu schliessen.
|
||
|
||
~CREAT ( asciz attribut -- handle ff / err# ) DOS
|
||
Der MS-DOS Systemaufruf, um ein neues File zu erzeugen.
|
||
|
||
~DIR ( addr drive -- err# ) DOS
|
||
Der MS-DOS Systemaufruf, mit dem das aktuelle Directory an der
|
||
Adresse ADDR als nullterminierter String abgelegt wird.
|
||
|
||
~DISK? ( -- n ) DOS
|
||
Der MS-DOS Systemaufruf, mit dem das aktuelle Laufwerk abgefragt
|
||
wird.
|
||
|
||
~FIRST ( asciz attr -- err# ) DOS
|
||
Der MS-DOS Systemaufruf, um erstmalig nach einem File zu suchen.
|
||
|
||
~NEXT ( -- err# ) DOS
|
||
Der MS-DOS Systemaufruf, der nach ~FIRST benutzt wird, um weitere
|
||
passende Filenamen aufzufinden.
|
||
|
||
~OPEN ( asciz mode -- handle ff / err# ) DOS
|
||
Der MS-DOS Systemaufruf fuer das Oeffnen eines Files. ASCIZ ist die
|
||
Adresse des vollen Namensstrings und MODE bezeichnet die Art des
|
||
Files (read-only, write-only, read-write). Bei Erfolg liegt eine
|
||
HANDLE-nummer unter einer Null auf dem Stack, ansonsten eine
|
||
Fehlernummer.
|
||
|
||
~SELECT ( n -- ) DOS
|
||
Der MS-DOS Systemaufruf, mit dem das aktuelle Laufwerk selektiert
|
||
wird.
|
||
|
||
~READ ( seg:addr quan handle -- #read ) DOS
|
||
Die Anzahl QUAN von Bytes werden aus dem File gelesen, dass durch
|
||
die Zahl HANDLE charakterisiert ist. Sie werden im erweiterten
|
||
Speicherbereich bei SEG:ADDR abgelegt. Nach Ende der Leseoperation
|
||
liegt die Anzahl der Bytes auf dem Stack, die tatsaechlich bis zum
|
||
Ende des Files gelesen werden konnten. Es koennen jedoch nur maximal
|
||
64kByte auf einmal gelesen werden.
|
||
|
||
~UNLINK ( asciz -- err# ) DOS
|
||
Der MS-DOS Systemaufruf, um einen Fileeintrag zu loeschen.
|