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:19:40 +00:00
|
|
|
|
|
|
|
|
|
(cr ( -- ) "paren-c-r"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
Setzt den Cursor in die erste Spalte der n{chsten Zeile. PAUSE wird
|
|
|
|
|
ausgeführt.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
|
|
|
|
|
(decode ( addr pos1 key --- addr pos2 ) "paren-decode"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
Wertet key aus. key wird in der Speicherzelle addr+pos1 abgelegt und
|
2020-06-28 14:19:40 +00:00
|
|
|
|
als Echo auf dem Bildschirm ausgegeben. Die Variable SPAN und pos1
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
|
|
|
|
|
(del ( -- ) "paren-del"
|
|
|
|
|
L|scht ein Zeichen links vom Cursor. Benutzt dabei CURLEFT.
|
|
|
|
|
Vergleiche auch DEL.
|
|
|
|
|
|
|
|
|
|
(emit ( 8b -- ) "paren-emit"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
Vergleiche CON! und EMIT.
|
|
|
|
|
|
|
|
|
|
(expect ( addr len -- ) "paren-expect"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
Erwartet len Zeichen vom Eingabeger{t, die ab addr im Speicher
|
2020-06-28 14:19:40 +00:00
|
|
|
|
abgelegt werden. Ein Echo der Zeichne wird ausgegeben. Return be
|
2020-06-28 14:26:46 +00:00
|
|
|
|
endet 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 14:19:40 +00:00
|
|
|
|
.PA
|
|
|
|
|
(key ( -- char ) "paren-key"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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,
|
2020-06-28 14:19:40 +00:00
|
|
|
|
sondern unver{ndert abgeliefert. Vergleiche KEY.
|
|
|
|
|
|
|
|
|
|
(key? ( -- flag ) "paren-key-question"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
flag ist TRUE, wenn eine Taste gedrückt wurde, sonst false.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
Vergleiche auch KEY?.
|
|
|
|
|
|
|
|
|
|
(page ( -- ) "paren-page"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
L|scht den Bildschirm, positioniert den Cursor in die linke obere
|
2020-06-28 14:19:40 +00:00
|
|
|
|
Ecke und setzt OUT auf null. Siehe auch LOCATE und PAGE.
|
|
|
|
|
|
|
|
|
|
(r/w ( adr blk file r/wf -- flag ) "paren-r-w"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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
|
2020-06-28 14:19:40 +00:00
|
|
|
|
Diskettenfehler vorlag.
|
|
|
|
|
|
|
|
|
|
(type ( addr len -- ) "paren-type"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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
|
|
|
|
|
ausgführt. Vergleiche TYPE, OUTPUT: und (EMIT.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
|
|
|
|
|
/drive ( blk -- blk' drv ) "per-drive"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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.
|
|
|
|
|
|
2020-06-28 14:19:40 +00:00
|
|
|
|
>drive ( blk drv -- block' ) "to-drive"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
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 14:19:40 +00:00
|
|
|
|
|
|
|
|
|
?drive-error ( f -- ) "question-drive-error"
|
|
|
|
|
Ist f=FALSE, so wird "beyond capacity" als Fehlermeldung ausgegeben.
|
|
|
|
|
|
|
|
|
|
?drive ( n -- n ) "question-drive"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
]berprüft, ob das Laufwerk n existiert, und gibt "beyond capacity"
|
2020-06-28 14:19:40 +00:00
|
|
|
|
als Fehlermeldung aus, wenn dies nicht der Fall ist.
|
|
|
|
|
|
|
|
|
|
b/blk ( -- b/blk ) "bytes-per-block"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
Eine Konstante die angibt, wieviele Bytes in einen Forth-Block
|
|
|
|
|
passen. Nach dem Forth-83 Standard ist B/BLK = &1024.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
|
|
|
|
|
bios ( -- addr ) "bios"
|
|
|
|
|
Adresse eines 8080-Unterprogramms, das einen Sprung ins BIOS aus
|
2020-06-28 14:26:46 +00:00
|
|
|
|
führt. Das Low-Byte der Einsprungadresse steht dabei in HL. Wird von
|
2020-06-28 14:19:40 +00:00
|
|
|
|
con!, (key?, getkey und read/write benutzt.
|
|
|
|
|
|
|
|
|
|
blk/drv ( -- #blk ) "blocks-per-drive"
|
2020-06-28 14:26:46 +00:00
|
|
|
|
#blk gibt die Kapazit{t des aktuellen Laufwerks (bestimmt durch
|
2020-06-28 14:19:40 +00:00
|
|
|
|
OFFSET) in Forth-Bl|cken (1kB) an. Siehe (BLK/DRV.
|
|
|
|
|
.PA
|
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 14:26:46 +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 14:26:46 +00:00
|
|
|
|
ger{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.
|
2020-06-28 14:19:40 +00:00
|
|
|
|
Siehe TERMINAL:.
|
|
|
|
|
|
|
|
|
|
dma! ( addr -- ) "d-m-a-store"
|
|
|
|
|
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"
|
|
|
|
|
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 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 14:26:46 +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 14:26:46 +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
|
|
|
|
|
selektiert und deren Kapazit{t berechnet. Dann wird das CP/M
|
|
|
|
|
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
|
|
|
|
|
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
|
2020-06-28 14:19:40 +00:00
|
|
|
|
eingeschaltet ist, sind also auch PAGE, AT und DEL wirkungslos.
|
2020-06-28 14:26:46 +00:00
|
|
|
|
DUMB ist als aktuelles Terminal angew{hlt, bis die Installierung
|
2020-06-28 14:19:40 +00:00
|
|
|
|
eines leistungsf{higeren Terminals abgeschlossen ist.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
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 14:26:46 +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
|
|
|
|
|
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 14:19:40 +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"
|
|
|
|
|
sec ist der beim n{chsten Diskettenzugriff zu verwendende Sektor.
|
|
|
|
|
.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
|
|
|
|
|
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"
|
|
|
|
|
trk ist die beim n{chsten Diskettenzugriff zu verwendende Spur.
|
|
|
|
|
|
2020-06-28 14:26:46 +00:00
|
|
|
|
|