VolksForth/8080/CPM/DOC/DE/CPMSPECI.ORG

233 lines
12 KiB
Plaintext
Raw Normal View History

2020-06-28 14:26:46 +00:00
#+Title: CP/M 2.2 - spezifische Worte
2020-06-28 14:19:40 +00:00
2020-06-28 14:30:36 +00:00
* =#bs ( -- n )= "number-backspace" - =n= ist der Ascii-Wert für Backspace.
* =#cr ( -- n )= "number-c-r" - =n= ist der Ascii-Wert für Carriage-Return.
* =#esc ( -- n )= "number-escape" - =n= ist der Ascii-Wert für Escape.
* =#lf ( -- n )= "number-linefeed" - =n= ist der Ascii-Wert für Linefeed.
* =(at ( row col -- )= "paren-at" - Positioniert den Cursor in die
Zeile =row=, Spalte =col= und setzt =OUT=. Benutzt dabei =LOCATE=.
Siehe auch =AT=.
* =(at? ( -- row col )= "paren-at-question" - =row= ist die aktuelle
Zeilennummer, =col= die aktuelle Spaltennummer. Vergleiche =AT?=
* =(blk/drv ( drv -- blocks )= "paren-blocks-per-drive" - =blocks=
gibt an wieviele Forth-Blöcke (1kB) auf dem Laufwerk =drv= sind.
Ist =blocks=0=, dann existiert dieses Laufwerk nicht. Siehe
=BLK/DRV=.
2020-06-28 14:55:54 +00:00
* =(cr ( -- )= "paren-c-r" - Setzt den Cursor in die erste Spalte der
nächsten Zeile. =PAUSE= wird ausgeführt.
* =(decode ( addr pos1 key --- addr pos2 )= "paren-decode" - Wertet
=key= aus. =key= wird in der Speicherzelle =addr+pos1= abgelegt und
als Echo auf dem Bildschirm ausgegeben. Die Variable =SPAN= und
=pos1= werden inkrementiert. Folgende Tasten werden besonders
behandelt:
- =Control-S= und =Control-D= beeinflussen nur =pos1= und den
Cursor.
- =Ctrl-G= löscht das Zeichen unter dem Cursor und dekrementiert
=SPAN=.
- Backspace (=Control-H=) und Delete (=$7F=) löschen das Zeichen
links vom Cursor und dekrementieren =pos1= und =SPAN=.
- =Control T= fügt an der Cursorposition ein Leerzeichen ein.
=SPAN= wird inkrementiert.
- =Return= positioniert den Cursor auf das letzte Zeichen.
Vergleiche =INPUT:= und =(EXPECT=.
* =(del ( -- )= "paren-del" - Löscht ein Zeichen links vom Cursor.
Benutzt dabei =CURLEFT=. Vergleiche auch =DEL=.
* =(emit ( 8b -- )= "paren-emit" - Gib =8b= auf dem Bildschirm aus.
Ein =PAUSE= wird ausgeführt. Alle Werte werden als Zeichen
ausgegeben. Steuercodes sind nicht möglich, d.h. alle Werte < $20
werden als Punkt "." ausgegeben. Vergleiche =CON!= und =EMIT=.
* =(expect ( addr len -- )= "paren-expect" - Erwartet =len= Zeichen
vom Eingabegerät, die ab =addr= im Speicher abgelegt werden. Ein
Echo der Zeichen wird ausgegeben. =Return= beendet die Eingabe
vorzeitig. Ein abschließendes Leerzeichen wird immer ausgegeben.
Die Länge der Zeichenkette wird in der Variablen =SPAN= übergeben.
Vergleiche =EXPECT=.
2020-06-28 15:10:02 +00:00
* =(key ( -- char )= "paren-key" - Wartet auf einen Tastendruck.
Während der Wartezeit wird =PAUSE= ausgeführt. Die untersten 7 Bit
von =char= enthalten den Ascii-Code der gedrückten Taste.
Steuerzeichen werden nicht ausgewertet, sondern unverändert
abgeliefert. Vergleiche =KEY=.
* =(key? ( -- flag )= "paren-key-question" - =flag= ist =TRUE=, wenn
eine Taste gedrückt wurde, sonst false. Vergleiche auch =KEY?=.
* =(page ( -- )= "paren-page" - Löscht den Bildschirm, positioniert
den Cursor in die linke obere Ecke und setzt =OUT= auf null. Siehe
auch =LOCATE= und =PAGE=.
* =(r/w ( adr blk file r/wf -- flag )= "paren-r-w" - Ist =r/wf= !=
FALSE, wird der Forth-Block mit der absoluten Blocknummer =blk= von
der Diskette gelesen. Ist =r/wf= = FALSE so wird er geschrieben.
=adr= gibt die Addresse des Block-Puffers an. =file= muß null sein,
da =(r/w= den Zugriff auf Files nicht unterstützt. =flag= ist
=TRUE= wenn ein Diskettenfehler vorlag.
* =(type ( addr len -- )= "paren-type" - Gibt den String, der im
Speicher bei =addr= beginnt und die Länge =len= hat, auf dem
Blidschirm aus. Genau ein =PAUSE= wird nach der Ausgabe ausgeführt.
Vergleiche =TYPE=, =OUTPUT:= und =(EMIT=.
* =/drive ( blk -- blk' drv )= "per-drive" - =blk= gibt die absolute
Nummer eines Forth-Blocks an. =/DRIVE= berechnet, auf welchem
Laufwerk (=drv=) dieser Block zu finden ist, und welche relative
Blocknummer (=blk'=) er zum Anfang dieses Laufwerks hat. Siehe
=DRV?=, =>DRIVE=.
* =>drive ( blk drv -- block' )= "to-drive" - =blk= gibt die relative
Blocknummer eine Forth-Blocks bezüglich des Anfangs von Laufwerk
=drv= an. =>DRIVE= berechnet daraus, unter welcher Blocknummer
dieser Block beim momentanen Stand von =OFFSET= erreicht werden
kann (=block'=). In gewisser Weise Umkehrung von =/DRIVE=.
2020-06-28 15:19:46 +00:00
* =?drive-error ( f -- )= "question-drive-error" - Ist =f= = FALSE,
so wird "beyond capacity" als Fehlermeldung ausgegeben.
* =?drive ( n -- n )= "question-drive" - Überprüft, ob das Laufwerk
=n= existiert, und gibt "beyond capacity" als Fehlermeldung aus,
wenn dies nicht der Fall ist.
* =b/blk ( -- b/blk )= "bytes-per-block" - Eine Konstante die angibt,
wieviele Bytes in einen Forth-Block passen. Nach dem Forth-83
Standard ist =B/BLK= = &1024.
* =bios ( -- addr )= "bios" - Adresse eines 8080-Unterprogramms, das
einen Sprung ins BIOS ausführt. Das Low-Byte der Einsprungadresse
steht dabei in =HL=. Wird von =con!=, =(key?=, =getkey= und
=read/write= benutzt.
* =blk/drv ( -- #blk )= "blocks-per-drive" - =#blk= gibt die
Kapazität des aktuellen Laufwerks (bestimmt durch =OFFSET=) in
Forth-Blöcken (1kB) an. Siehe =(BLK/DRV=.
2020-06-28 14:19:40 +00:00
2020-06-28 14:26:46 +00:00
con! ( 8b -- ) "con-store"
Gibt 8b auf die CONsole (Bildschirm) aus. Ascii-Werte < $20 werden
2020-06-28 14:19:40 +00:00
als Steuercodes interpretiert.
curleft ( -- ) "cur-left"
2020-06-28 14:26:46 +00:00
Bewegt den Cursor ein Zeichen nach links. Eine der vordefinierten
2020-06-28 14:19:40 +00:00
Terminalfunktionen.
curoff ( -- ) "cur-off"
Schaltet den Cursor aus. Eine der vordefinierten Terminalfunktionen.
curon ( -- ) "cur-on"
Schaltet den Cursor an. Eine der vordefinierten Terminalfunktionen.
currite ( -- ) "cur-right"
2020-06-28 14:26:46 +00:00
Bewegt den Cursor ein Zeichen nach rechts. Eine der vordefinierten
Terminalfunktionen.
2020-06-28 14:19:40 +00:00
dark ( -- ) "dark"
2020-06-28 15:10:02 +00:00
Löscht den Bildschirm. Eine der vordefinierten Terminalfunktionen.
2020-06-28 14:19:40 +00:00
display ( -- ) "display"
Ein mit OUTPUT: definiertes Wort, das den Bildschirm als Ausgabe
2020-06-28 15:10:02 +00:00
gerät anwählt, wenn es ausgeführt wird. Die Worte EMIT, CR, TYPE,
2020-06-28 14:26:46 +00:00
DEL, PAGE, AT, und AT? beziehen sich dann auf das aktuelle Terminal.
2020-06-28 14:19:40 +00:00
Siehe TERMINAL:.
dma! ( addr -- ) "d-m-a-store"
2020-06-28 15:10:02 +00:00
addr ist die Adresse des Diskettenpuffers, der beim nächsten Dis
2020-06-28 14:26:46 +00:00
kettenzugriff verwendet werden soll.
2020-06-28 14:19:40 +00:00
drive ( n -- ) "drive"
2020-06-28 15:10:02 +00:00
Wählt n als aktuelles Laufwerk an. [ndert OFFSET entsprechend.
2020-06-28 14:19:40 +00:00
Siehe BLK/DRV.
drv! ( drv f -- dph ) "drive-store"
2020-06-28 15:10:02 +00:00
drv ist die Nummer des Diskettenlaufwerks, das als nächstes ver
2020-06-28 14:26:46 +00:00
wendet werden soll. f=0 gibt an, ob es sich um den erste Zugriff
nach einem CP/M Warmstart handelt. dph ist die Adresse des CP/M
2020-06-28 14:19:40 +00:00
Disk-Parameter-Headders. (Siehe CP/M Operating System Manual)
Ist dph=0, so ist das angesprochene Laufwerk in diesem Komputer
2020-06-28 14:26:46 +00:00
system nicht unterstützt.
2020-06-28 14:19:40 +00:00
drv? ( blk -- drv ) "drive-question"
2020-06-28 14:26:46 +00:00
blk gibt die absolute Nummer eines FORTH-Blocks an, DRV? berechnet
2020-06-28 14:19:40 +00:00
daraus das Laufwerk (drv) auf dem er zu finden ist.
Siehe /DRIVE, >DRIVE.
drv0 ( -- ) "drive-zero"
2020-06-28 15:10:02 +00:00
Wählt Laufwerk 0 (A) als aktuelles Laufwerk für R/W an. Siehe DRIVE
2020-06-28 14:19:40 +00:00
und >DRIVE.
drv1 ( -- ) "drive-one"
2020-06-28 15:10:02 +00:00
Wählt Laufwerk 1 (B) als aktuelles Laufwerk für R/W an. Siehe DRIVE
2020-06-28 14:19:40 +00:00
und >DRIVE.
drvinit ( -- ) "drive-init"
2020-06-28 14:26:46 +00:00
Initialisiert das volksFORTH-Disk-System.
Die im Komputer-System vorhandenen Laufwerke werden der Reihe nach
2020-06-28 15:10:02 +00:00
selektiert und deren Kapazität berechnet. Dann wird das CP/M
2020-06-28 14:26:46 +00:00
default-Laufwerk selektiert.
2020-06-28 14:19:40 +00:00
dumb ( -- ) "dumb"
2020-06-28 14:26:46 +00:00
Ein mit TERMINAL: definiertes Wort, das ein ignorantes Terminal
2020-06-28 15:10:02 +00:00
anwählt, wenn es ausgeführt wird. CURON, CUROFF, CURLEFT, CURRITE,
2020-06-28 14:26:46 +00:00
RVSON, RVSOFF, DARK und LOCATE haben dann keine Wirkung. Mit ihnen
auch die sie benutzenden Worte (PAGE, (AT, (DEL. Wenn DISPLAY
2020-06-28 14:19:40 +00:00
eingeschaltet ist, sind also auch PAGE, AT und DEL wirkungslos.
2020-06-28 15:10:02 +00:00
DUMB ist als aktuelles Terminal angewählt, bis die Installierung
eines leistungsfähigeren Terminals abgeschlossen ist.
2020-06-28 14:19:40 +00:00
getkey ( -- char ) "getkey"
2020-06-28 14:26:46 +00:00
die unteren 7 Bit von char enthalten den Ascii-Code des letzten
Tastendrucks. Ist noch keine Taste gedrückt, dann wartet getkey.
Siehe auch KEY? und KEY.
2020-06-28 14:19:40 +00:00
home ( -- ) "home"
2020-06-28 14:26:46 +00:00
Der Kopf des momentan selektierte Diskettenlaufwerks wird auf Spur
2020-06-28 15:10:02 +00:00
null gefahren. Spur null wird als nächste Spur angewählt, die
2020-06-28 14:19:40 +00:00
verwendet werden soll. Siehe TRK!, DRV!.
index ( from to -- ) "index"
2020-06-28 14:26:46 +00:00
Liest die Blocks from bis to einschlie~lich und gibt deren erste
Zeilen aus. Index kann mit einer beliebigen Taste angehalten werden
und mit RETURN abgebrochen werden. (Siehe STOP?) Die ersten Zeilen
von Screens enthalten typischer Weise Kommentare, die den Inhalt
2020-06-28 14:19:40 +00:00
chararkterisieren.
keyboard ( -- ) "keyboard"
2020-06-28 15:10:02 +00:00
Ein mit INPUT: definiertes Wort, das die Tastatur als Eingabegerät
anwählt. Die Worte KEY, KEY?, DECODE und EXPECT beziehen sich nun
2020-06-28 14:19:40 +00:00
auf die Tastatur. Siehe (KEY, (KEY? (DECODE, (EXPECT.
locate ( row col -- ) "locate"
Bewegt den Cursor absolut auf Spalte col, Zeile row.
2020-06-28 14:26:46 +00:00
Eine der vordefinierten Terminalfunktionen.
2020-06-28 14:19:40 +00:00
out ( -- addr ) "out"
2020-06-28 14:26:46 +00:00
Adresse einer Variablen, die die Anzahl der ausgegebenen Zeichen
2020-06-28 15:10:02 +00:00
enthält.
2020-06-28 14:19:40 +00:00
read/write ( r/wf sponti -- f ) "read-write"
2020-06-28 14:26:46 +00:00
Bewirkt das physikalische Lesen (r/wf = FALSE) und Schreiben
(r/wf=TRUE) eines Sektors (=128 Bytes) von der/auf die Diskette. Das
Laufwerk, die Spur , der Sektor sowie der Sektor-Puffer sind vorher
2020-06-28 15:10:02 +00:00
mit DRV!, TRK!, SEC! und DMA! gewählt worden.
2020-06-28 14:26:46 +00:00
sponti gibt an, ob beim Schreiben unmittelbar auf die Diskette
geschrieben werden soll (sponti=TRUE) oder, ob der geschriebene
Sektor im BIOS zwischengepuffert werden darf (sponti=FALSE).
2020-06-28 14:19:40 +00:00
rvsoff ( -- ) "reverse-off"
2020-06-28 14:26:46 +00:00
Schaltet die Inversdarstellung aus. Eine der vordefinierten
2020-06-28 14:19:40 +00:00
Terminalfunktionen.
2020-06-28 14:26:46 +00:00
2020-06-28 14:19:40 +00:00
rvson ( -- ) "reverse-on"
2020-06-28 14:26:46 +00:00
Schaltet die Inversedarstellung ein. Eine der vordefinierten
2020-06-28 14:19:40 +00:00
Terminalfunktionen.
sec! ( sec -- ) "sec-store"
2020-06-28 15:10:02 +00:00
sec ist der beim nächsten Diskettenzugriff zu verwendende Sektor.
2020-06-28 14:19:40 +00:00
.PA
2020-06-28 14:26:46 +00:00
Term: ( offset -- offset' ) "term-colon"
Ein definierendes Wort für Terminalfunktionen. Wird benutzt um die
einzelnen Komponenten eines Terminal-Vektors zu definieren.
Vordefinierte Terminalfunktionen sind CURON, CUROFF, CURLEFT,
2020-06-28 14:19:40 +00:00
CURRITE, RVSON, RVSOFF, DARK und LOCATE. Siehe auch TERMINAL:
Terminal: ( -- ) "terminal-colon"
2020-06-28 14:26:46 +00:00
Ein definierendes Wort für Terminals. Benutzt in der Form:
2020-06-28 14:19:40 +00:00
Terminal: <name>
2020-06-28 14:26:46 +00:00
newCURON newCUROFF newCURLEFT newCURRITE
2020-06-28 14:19:40 +00:00
newRVSON newRVSOFF newDARK newLOACTE ;
2020-06-28 14:26:46 +00:00
TERMINAL: erzeugt einen Kopf für <name> im Dictionary und kompiliert
einen Vektor von Zeigern auf Worte die für die Ausführung von Ter
2020-06-28 15:10:02 +00:00
minalfunktionen zuständig sind. Wird <name> ausgeführt, so werden
2020-06-28 14:19:40 +00:00
die Terminalfunktionen von <name> zu den aktuellen Terminal
funktionen gemacht, das Terminal <name> ist damit aktiv. Terminal
2020-06-28 14:26:46 +00:00
funktionen werden von AT, PAGE, DEL ausgeführt, wenn die Ausgabe auf
2020-06-28 14:19:40 +00:00
DISPLAY geschaltet ist. Siehe OUTPUT:, DISPLAY, DUMB.
trk! ( trk -- ) "track-store"
2020-06-28 15:10:02 +00:00
trk ist die beim nächsten Diskettenzugriff zu verwendende Spur.