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á 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á 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á 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 Ä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 Mit FIX wird das File, in dem definiert wurde, zum aktuellen File gemacht. Dann wird der Full-Screen-Editor aktiviert, der Screen ange- zeigt, auf dem definiert wurde und der Cursor stellt sich hinter die auf dem Screen hinter . 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á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 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 LIST wird Screen nn auf dem Bildschirm angezeigt - also zum Beispiel mit 1 LIST der Screen 1 des Files KERNEL.SCR. Mit 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 kann man unkompliziert ein ganzes Screenfile laden. Diese Operation ist der Sequenz "USE 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á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á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 Weist dem aktuellen File den physikalischen Filenamen 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á 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á 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á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 benutzt und schreibt die Anzahl von LEN Bytes ab der Adresse ADDR in das neu erzeugte File mit dem Namen . SAVESYSTEM Schreibt eine bootbare Form des jetzt laufenden Forthsystems unter dem Namen auf die Disk. Dabei muss 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 benutzt. Wenn im Woerterbuch gefunden wird, so wird das File geoeffnet, in dem der Quelltext von steht und der Block wird gelistet, auf dem 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.