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

206 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-08-25 16:55:21 +00:00
* =con! ( 8b -- )= "con-store" - Gibt =8b= auf die CONsole
(Bildschirm) aus. Ascii-Werte < $20 werden als Steuercodes
interpretiert.
* =curleft ( -- )= "cur-left" - Bewegt den Cursor ein Zeichen nach
links. Eine der vordefinierten 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" - Bewegt den Cursor ein Zeichen nach
rechts. Eine der vordefinierten Terminalfunktionen.
* =dark ( -- )= - "dark" - Löscht den Bildschirm. Eine der
vordefinierten Terminalfunktionen.
* =display ( -- )= "display" - Ein mit =OUTPUT:= definiertes Wort,
das den Bildschirm als Ausgabegerät anwählt, wenn es ausgeführt
wird. Die Worte =EMIT=, =CR=, =TYPE=, =DEL=, =PAGE=, =AT=, und
=AT?= beziehen sich dann auf das aktuelle Terminal. Siehe
TERMINAL:.
* =dma! ( addr -- )= "d-m-a-store" - =addr= ist die Adresse des
Diskettenpuffers, der beim nächsten Diskettenzugriff verwendet
werden soll.
* =drive ( n -- )= "drive" - Wählt =n= als aktuelles Laufwerk an.
Ändert =OFFSET= entsprechend. Siehe =BLK/DRV=.
* =drv! ( drv f -- dph )= "drive-store" - =drv= ist die Nummer des
Diskettenlaufwerks, das als nächstes verwendet 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 Disk-Parameter-Headders.
(Siehe CP/M Operating System Manual) Ist =dph= = 0, so ist das
angesprochene Laufwerk in diesem Computersystem nicht unterstützt.
* =drv? ( blk -- drv )= "drive-question" - =blk= gibt die absolute
Nummer eines FORTH-Blocks an, =DRV?= berechnet daraus das Laufwerk
(=drv=) auf dem er zu finden ist. Siehe =/DRIVE=, =>DRIVE=.
* =drv0 ( -- )= "drive-zero" - Wählt Laufwerk 0 (A) als aktuelles
Laufwerk für =R/W= an. Siehe =DRIVE= und =>DRIVE=.
* =drv1 ( -- )= "drive-one" - Wählt Laufwerk 1 (B) als aktuelles
Laufwerk für =R/W= an. Siehe =DRIVE= und =>DRIVE=.
* =drvinit ( -- )= "drive-init" - Initialisiert das
volksFORTH-Disk-System. Die im Komputer-System vorhandenen
Laufwerke werden der Reihe nach selektiert und deren Kapazität
berechnet. Dann wird das CP/M Default-Laufwerk selektiert.
* =dumb ( -- )= "dumb" - Ein mit =TERMINAL:= definiertes Wort, das
ein ignorantes Terminal anwählt, wenn es ausgeführt wird. =CURON=,
=CUROFF=, =CURLEFT=, =CURRITE=, =RVSON=, =RVSOFF=, =DARK= und
=LOCATE= haben dann keine Wirkung. Mit ihnen auch die sie
benutzenden Worte =(PAGE=, =(AT=, =(DEL=. Wenn =DISPLAY=
eingeschaltet ist, sind also auch =PAGE=, =AT= und =DEL=
wirkungslos. DUMB ist als aktuelles Terminal angewählt, bis die
Installierung eines leistungsfähigeren Terminals abgeschlossen ist.
* =getkey ( -- char )= "getkey" - 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=.
* =home ( -- )= "home" - Der Kopf des momentan selektierte
Diskettenlaufwerks wird auf Spur null gefahren. Spur null wird als
nächste Spur angewählt, die verwendet werden soll. Siehe =TRK!=,
=DRV!=.
* =index ( from to -- )= "index" - Liest die Blocks from bis to
einschlielich 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 chararkterisieren.
2020-06-28 14:19:40 +00:00
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.