5.2.3 ** I/O Trap #3
iob.test
|
IO.PEND
|
3 / 0
|
|
|
Prüfung auf noch laufenden Eingabevorgang
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
A1
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.EF -10
Daten werden nicht gelesen, der Kanal nicht geändert.
Bei PIPEs Test der Lese-Seite.
iob.fbyt
|
IO.FBYTE
|
1 / 3
|
|
|
Ein Byte holen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
geholtes Byte
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.EF -10
Bei fehlerhaftem Aufruf bleibt D1 im allgemeinen unverändert.
iob.flin
|
IO.FLINE
|
3 / 2
|
|
|
Holt eine Zeile Zeichen begrenzt durch {NL} in einen Puffer
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1.W
|
Anzahl empfangene Zeichen
|
|
D2.W
|
Länge des Puffers
|
D2
|
|
|
A1
|
Adresse des Puffers
|
A1
|
Ptr hinter letztes Zeichen
|
ERR.NC -1
ERR.EF -10
ERR.BO -5
Die Wartezeit gilt bis zum Abschluß des ganzen Prozesses - s. IO.EDLIN.
Bei Konsolkanälen erscheinen die Daten im Bildschirm und können editiert
werden. Ein <NL>-Zeichen vor Pufferende zählt bei der zurückgegebenen
Stringlänge mit.
D1 bleibt bei fehlerhaftem Aufruf unverändert, bei Fehler ERR.NC (-1) wird die
bis zum Abbruch evtl. empfangene Anzahl zu einem schon vorhandenen Wert
addiert.
iob.fmul
|
IO.FSTRG
|
3 / 3
|
|
|
Holt einen String
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1
|
(s. IO.FLINE)
|
D1.W
|
Anzahl empfangene Zeichen
|
|
D2.W
|
Länge des Puffers
|
D2
|
|
|
A1
|
Adresse des Puffers
|
A1
|
Ptr hinter letztes Zeichen
|
ERR.NC -1
ERR.EF -10
iob.elin
|
IO.EDLIN
|
3 / 4
|
|
|
Editieren einer Zeile (nur bei CON_)
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1
|
Cursor.W | Zeilenlänge.W
|
D1
|
Cursor.W | Zeilenlänge.W
|
|
D2.W
|
Länge des Puffers
|
|
|
|
A1
|
Ptr auf Zeilenende
|
A1
|
Ptr auf Zeilenende
|
ERR.NC -1
ERR.BO -5
Aufruf bricht auch bei laufender Eingabe bei Überschreitung der Wartezeit ab.
Der zu editierende String darf kein <NL>-Zeichen enthalten;
bei MINERVA (ab 1.97) kann über mehrere Zeilen hinweg editiert werden.
<CTRL/J>, <ENTER>, Cursor hoch oder Cursor runter gelten als Endzeichen.
D1.hi.w bezieht sich auf den Stringanfang.
Das Endzeichen zählt nicht zur Länge, kann aber auf Position (A1) gelesen
werden - in MINERVA, sonst wegen Fehlern darin nicht in allen QDOS-Systemen.
iob.sbyt
|
IO.SBYTE
|
3 / 5
|
|
|
Ein Byte senden
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.B
|
zu sendendes Byte
|
D1
|
verdorben
|
|
A1
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.DF -11
ERR.OR -4
Fehlermeldungen erfassen die Pufferung von Daten nicht.
iob.suml
|
IOB.SUML
|
3 / 6
|
NUR
SQ
|
|
Gruppe Zeichen vom TRA-Zustand unabhängig senden
|
iob.smul
|
IO.SSTRG
|
3 / 7
|
|
|
Gruppe von Zeichen senden
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1.W
|
Zahl der gesendeten Zeichen
|
|
D2.W
|
Anzahl Zeichen
|
|
|
|
A1
|
Anfang des Puffers
|
A1
|
Neuer Zeiger auf Puffer
|
ERR.NC -1
ERR.DF -11
IOB.SUML (nur SQ) unterliegt nicht dem Einfluß der TRA-Einstellungen.
Gleichartiges liefert die SIMSER-Erweiterung
für alle QDOS-Systeme ab JM. Damit
können auch einzelnen Kanälen voneinander unabhängig jeweils eigene
TRA-Tabellen und Umsetzungsmodi eingeprägt werden.
Bei JM ist nur hiermit (oder mit ähnlichen Erweiterungen) die Nutzung der dort
im System erst vorbereiteten Ausgabe-Umsetzung möglich.
iow.xtop
|
SD.EXTOP
|
3 / 9
|
|
|
Bildschirmhandler erweiternde Operation
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
D0
|
Fehlercode
|
|
D1
|
Datenübergabe
|
D1
|
Datenrückgabe
|
|
D2
|
dto.
|
|
|
|
A1
|
dto.
|
A1
|
Datenrückgabe
|
|
A2
|
Ptr auf Routine der Operation
|
A2
|
|
ERR.NC -1
Der Aufruf wird abgearbeitet, als sei er Teil des Bildschirmhandlers.
Innerhalb der Routine (A2) gilt für die Register:
|
IN:
|
|
OUT:
|
|
|
|
|
D0
|
Fehlercode
|
|
D1
|
eingebrachte Daten
|
D1
|
Rückgabe an den Aufruf
|
|
D2
|
eingebrachte Daten
|
|
|
|
A0
|
Basis der Kanalparameter
|
|
|
|
A1
|
eingebrachte Daten
|
A1
|
Rückgabe an den Aufruf
|
|
A3
|
Handler-Basisadresse (CH.LXINT)
|
|
|
|
A6
|
Basisadresse der Systemvariablen
|
|
|
|
A7
|
SSP
|
|
|
A0 kommt PIF-bereinigt in den Aufruf, sodaß die standardmäßigen Kanalparameter
der cdt stets in derselben Relation zum Registerwert stehen. Was zugleich aber
heißt, daß die wirkliche Basis der cdt nicht von A0 hergeleitet werden kann,
sie muß ggf. direkt aus den QDOS-Tabellen ermittelt werden.
ERR.xx frei wählbar
ow.pixq
|
SD.PXENQ
|
3 / 10
|
|
|
Fenstergröße und Cursorposition in Pixelmaßen holen
|
|
|
|
|
|
iow.chrq
|
SD.CHENQ
|
3 / 11
|
|
|
Fenstergröße und Cursorposition im Zeichenraster holen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
A1
|
Ptr auf Zwischenspeicher
|
A1
|
verdorben
|
ERR.NC -1
Rückagbedaten im Puffer:
0(A1) Breite des Fensters
2(A1) Höhe dto.
4(A1) X-Position des Cursors bezogen auf 0,0 links oben
6(A1) Y dto.
iow.defb
|
SD.BORDR
|
3 / 12
|
|
|
Randbreite und -Farbe definieren
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.B
|
Farbe
|
D1
|
verdorben
|
|
D2.W
|
Breite
|
|
|
ERR.NC -1
Die Breite gilt vertikal verdoppelt. Der Cursor wird auf 0,0 gestellt.
128 = $80 in D1 erhält die alte Farbe. Nach Breite D2 = 0 gilt Schwarz.
iow.defw
|
SD.WDEF
|
3 / 13
|
|
|
Umdefinieren eines Fensters
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.B
|
Borderfarbe
|
D1
|
verdorben
|
|
D2.W
|
Borderbreite
|
|
|
|
A1
|
Ptr zum Datenblock
|
A1
|
verdorben
|
ERR.NC -1
ERR.OR -4
Bildschirminhalt unbeeinflußt. Cursor auf Position 0,0 gestellt.
Der Datenblock enthält:
0(A1) Breite
2(A1) Höhe
4(A1) X-Ursprung
6(A1) Y-Ursprung
iow.ecur
|
SD.CURE
|
3 / 14
|
|
|
Aktivieren des Cursors.
|
iow.dcur
|
SD.CURS
|
3 / 15
|
|
|
Cursor abschalten
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
iow.scur
|
SD.POS
|
3 / 16
|
|
|
Cursor auf Position im Zeichenraster setzen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Spalte
|
D1
|
verdorben
|
|
D2.W
|
Zeile
|
|
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.OR -4 Position wäre außerhalb des Fensters
Bei Fehlermeldung wurde die Position nicht verändert.
iow.scol
|
SD.TAB
|
3 / 17
|
|
|
Cursor auf Spaltenposition einstellen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Spalte
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.OR -4 Position wäre außerhalb des Fensters
Die Trap hebt bevorstehende <NL>-Aktionen auf.
iow.newl
|
SD.NL
|
3 / 18
|
|
|
Cursor in neue Zeile bringen - Sequenz CR LF
|
iow.pcol
|
SD.PCOL
|
3 / 19
|
|
|
Cursor ein Zeichen zurückziehen
|
iow.ncol
|
SD.NCOL
|
3 / 20
|
|
|
Cursor eine Spalte weiterrücken
|
iow.prow
|
SD.PROW
|
3 / 21
|
|
|
Positioniert den Cursor eine Zeile höher
|
iow.nrow
|
SD.NROW
|
3 / 22
|
|
|
Positioniert den Cursor eine Zeile tiefer
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.OR -4 Position wäre außerhalb des Fensters
iow.spix
|
SD.PIXP
|
3 / 23
|
|
|
Positioniert den Cursor auf Pixelkoordinaten
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
X-Koordinate
|
D1
|
verdorben
|
|
D2.W
|
Y-Koordinate
|
|
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
ERR.OR -4 Position wäre außerhalb des Fensters
Die Trap hebt bevorstehende <NL>-Aktionen auf.
iow.scra
|
SD.SCROL
|
3 / 24
|
|
|
Scrollt das ganze Fenster
|
iow.scrt
|
SD.SCRTP
|
3 / 25
|
|
|
Scrollt Teilfenster oberhalb der Cursorzeile
|
iow.sceb
|
SD.SCRBT
|
3 / 26
|
|
|
Scrollt Teilfenster unterhalb der Cursorzeile
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Anzahl Bildlinien
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
Scrollen - SCReen ROLL - mit positiven Werten D1 nach oben.
Cursorposition bleibt bestehen.
iow.pana
|
SD.PAN
|
3 / 27
|
|
|
Fensterinhalt seitwärts schieben
|
iow.panl
|
SD.PANLN
|
3 / 30
|
|
|
Inhalt der Cursorzeile verschieben
|
iow.panr
|
SD.PANRT
|
3 / 31
|
|
|
Inhalt der Cursorzeile rechts ab einschl. Cursor verschieben
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Anzahl senkr. Linien
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
Bei positivem Wert D1 wird nach rechts geschoben.
iow.clra
|
SD.CLEAR
|
3 / 32
|
|
|
Ganzes Fenster löschen
|
iow.clrt
|
SD.CLRTP
|
3 / 33
|
|
|
Teilfenster über der Cursorzeile löschen
|
iow.clrb
|
SD.CLRBT
|
3 / 34
|
|
|
Teilfenster unter der Cursorzeile löschen
|
iow.clrl
|
SD.CLRLN
|
3 / 35
|
|
|
Löscht die Cursorzeile
|
iow.clrr
|
SD.CLRRT
|
3 / 36
|
|
|
Löscht Cursorzeile ab Cursor nach rechts
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
iow.font
|
SD.FOUNT
|
3 / 37
|
|
|
Zeichensatz für ein Fenster angeben
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
A1
|
Ptr auf 1. Zeichensatz
|
A1
|
verdorben
|
|
A2
|
Ptr auf 2. Zeichensatz
|
|
|
ERR.NC -1
Null statt der Ptr restauriert die Grundeinstellung aus dem Rom, rsp bei
MINERVA aus SX.F0 und SX.F1, wo dann auch frei definierte Zeichensätze
vorgegeben werden können.
iow.rclr
|
SD.RECOL
|
3 / 38
|
|
|
Fensterinhalt umfärben
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
A1
|
Ptr auf Farbenliste
|
A1
|
verdorben
|
ERR.NC -1
Die Farbenliste gibt in 8 Bytes der Reihe nach die neuen Farben an.
iow.spap
|
SD.SETPA
|
3 / 39
|
|
|
Farbe für PAPER festlegen
|
iow.sstr
|
SD.SETST
|
3 / 40
|
|
|
Farbe für STRIP festlegen
|
iow.sink
|
SD.SETIN
|
3 / 41
|
|
|
Farbe für INK festlegen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.B
|
Farbe
|
|
|
|
|
|
D2
|
SQ: verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
iow.sfla
|
SD.SETFL
|
3 / 42
|
|
|
Blinken schalten
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.B
|
=/=0 zum Blinken
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
iow.sula
|
SD.SEUFL
|
3 / 43
|
|
|
Unterstreichung schalten
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.B
|
=/=0 Unterstreichen
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
iow.sova
|
SD.SETMD
|
3 / 44
|
|
|
Art der Zeichendarstellung einstellen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Typ -1, 0 oder 1
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
iow.ssiz
|
SD.SETSZ
|
3 / 45
|
|
|
Zeichengröße einstellen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Zeichenbreite
|
D1
|
verdorben
|
|
D2.W
|
Zeichenhöhe
|
|
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
Angabe zu Breite und Höhe entsprechen dem Basicbefehl CSIZE.
iow.blok
|
SD.FILL
|
3 / 46
|
|
|
Rechteck einfärben
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Farbe
|
D1
|
verdorben
|
|
A1
|
Ptr auf Blockdefinition
|
A1
|
verdorben
|
ERR.NC -1
ERR.OR -4
Blockmaße:
0(A1) Blockbreite in Pixel.
2(A1) Höhe dto.
4(A1) X-Ursprung des Blockes relativ zum Fensterursprung
6(A1) Y dto.
iog.dot
|
SD.POINT
|
3 / 48
|
|
|
Einen Punkt im scalierten Fenster zeichnen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
A1
|
Arithmetikstack
|
A1
|
verdorben
|
ERR.NC -1
Die Parameter sind im Fließkommaformat in einem Stackbereich auf A1
bereitzuhalten, wo in Richtung niedriger Adressen Platz für mindestens 40
f.p.-Zahlen frei ist.
Übergabe im Stack:
00(A1) Y-Koordinate
06(A1) X dto.
iog.line
|
SD.LINE
|
3 / 49
|
|
|
Linie zeichnen
|
|
|
|
|
|
Parameter wie SD.POINT
00(A1) Y-Koordinate des Endpunktes
06(A1) X dto.
$0C(A1) Y-Koordinate des Startpunktes
$12(A1) X dto.
iog.arc
|
SD.ARC
|
3 / 50
|
|
|
Bogen zeichnen
|
|
|
|
|
|
Parameter wie SD.POINT
$00(A1) Winkelspanne des Bogens
$06(A1) Y-Koordinate des Endpunktes
$0C(A1) X dto.
$12(A1) Y-Koordinate des Startpunktes
$18(A1) X dto.
iog.elip
|
SD.ELIPS
|
3 / 51
|
|
|
Ellipse zeichnen
|
|
|
|
|
|
Parameter wie SD.POINT
$00(A1) Winkelstellung
$06(A1) Kleine Halbachse (Senkrechte bei Winkel 0)
$0C(A1) Halbachsenverhältnis der Ellipse
$12(A1) Y-Koordinate des Mittelpunktes
$18(A1) X dto.
iog.scal
|
SD.SCALE
|
3 / 52
|
|
|
Maßstab und Ursprung der scalierten Graphik angeben
|
|
|
|
|
|
Parameter wie SD.POINT
$00(A1) Y-Koordinate der unteren Zeile des Fensters
$06(A1) X-Koordinate der linken Spalte im Fenster
$0C(A1) scalierte Fensterhöhe
iog.fill
|
SD.FLOOD
|
3 / 53
|
|
|
Füllen konkav umschlossener Flächen schalten
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.L
|
Schalterflag
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
D1 = 0 schaltet Füllen aus, D1 = 1 veranlaßt Füllen (erneut).
Der Befehl malt die Fläche mit der Farbe von INK aus.
Es ist auch die Angabe einer frei definierten Routine vorgesehen, deren
Adresse mit D1(?) übergeben wird. Hier soll es jedoch je nach System
gravierende Fehler geben.
iow.sgcr
|
SD.GCUR
|
3 / 54
|
|
|
Pixelkoordinaten relativ zur Position des Graphikcursors
|
|
|
|
|
|
Parameter wie SD.POINT
$00(A1) Graphik X-Koordinate
$06(A1) Y dto.
$0C(A1) Pixelversatz nach rechts
$12(A1) dto. nach unten
|
SD.ROP
|
3 / 61
|
|
|
Operation im Pixelraster
|
|
SD.DOT
|
3 / 62
|
|
|
Punkt(e) im Pixelraster zeichnen
|
|
SD.LIN
|
3 / 63
|
|
|
Linie(n) im Pixelraster zeichnen
|
|
|
|
|
|
Anwendung ist nicht dokumentiert, Funktion ungewiß {4}.
iof.chek
|
FS.CHECK
|
3 / 64
|
|
|
Prüfen eines File auf noch laufende Bearbeitung
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
Arbeit an File oder Slave Blocks nicht abgeschlossen
iof.flsh
|
FS.FLUSH
|
3 / 65
|
|
|
Slave Blöcke des File senden, dann auflösen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
|
|
A1
|
verdorben
|
ERR.NC -1
Zum sicheren Abschluß eines File ohne Datenverfälschung oder -Verlust. Mit TK2
werden zur zusätzlichen Sicherheit Map und Directory aktualisiert {in LV2
unsicher}.
iof.posa
|
FS.POSAB
|
3 / 66
|
|
|
Zugriffs-Ptr eines File einstellen
|
iof.posr
|
FS.POSRE
|
3 / 67
|
|
|
Zugriffs-Ptr eines File weiterstellen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1
|
aufzusuchende Position
|
D1
|
erreichte Fileposition
|
|
|
|
A1
|
verdorben
|
ERR.NC -1 neue Position wird eingestellt
ERR.EF -10
Wenn D1 in eine Position außerhalb des File weist, wird die nächstgelegene
Grenze aufgesucht.
FS.POSRE:
Neue Stelle im File mit Abstand D1 (vorzeichenbehaftet) zur aktuellen Position
aufsuchen. Bei Übergabe D1 = 0 wird aktueller Ptr zurückgegeben.
Für MDV-Positionierung soll D1 im Integer-Bereich liegen (16-Bit-Zahlen).
iof.minf
|
FS.MDINF
|
3 / 69
|
|
|
Holt Informationen über den Datenträger
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1.hi.w
|
Freie Sectoren
|
|
|
|
D1.lo.w
|
gute Sectoren
|
|
A1
|
Ptr auf 10 Bytes
|
A1
|
Ptr hinter den Namen
|
|
|
Puffer für den Namen
|
A2
|
verdorben
|
|
|
|
A3
|
verdorben
|
Im SMSQ bleiben nach {15} A2 und A3 erhalten
ERR.NC -1
iof.shdr
|
FS.HEADS
|
3 / 70
|
|
|
Setzt Kopfzeile - File Header. In TK2 u.U. unsicher
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1.W
|
Länge d. gesetzten Headers
|
|
A1
|
Ptr auf die Headerdaten
|
A1
|
Ende der Headereintragung
|
ERR.NC -1
Die ersten 14 Bytes des Fileheaders werden besetzt:
$00 .l Filelänge : vom System ggf. überschrieben
$04 .b Fileverwendung : Null in QDOS V1.03
$05 .b Filetyp : 0 allgemein, 1 Job, 2 Sinclair Object File., -1 Directory
$06 8.b Angabe typenabhängig:
$06 .l Größe des einem Job einzurichtenden Datenspeichers
$0A .l Extra - z.B. mit FXTRA des TK2 lesbar
Bei rein seriellen Kanälen wird zuvor ein Byte $FF gesendet.
Das File-Datum kann mit Hilfe der QDOS-Uhr verändert werden - s. FS.DATE.
Directory-Filetyp bei Thor-Geräten ist 3 (?).
Mit der Bitte, auch dies zu berücksichtigen:
File-Typ 5 im F6-Forth des Verfassers kennzeichnet vorcompilierte
Codepassagen.
iof.rhdr
|
FS.HEADR
|
3 / 71
|
|
|
Kopfzeile lesen. Setzt FPOS auf Null {3.5.1}
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1.W
|
Länge d. gelesenen Headers
|
|
D2.W
|
Pufferlänge
|
|
|
|
A1
|
Ptr zum Puffer
|
A1
|
Ptr hinter die Daten
|
ERR.NC -1
ERR.BO -5
Der Pufferlänge 13 < D1 < 65 entsprechende maximale Anzahl Daten aus dem
Header werden in den Puffer geholt.
Bei seriellen Kanälen ist für ein zusätzliches Flagbyte Platz zu
reservieren.
Der Fileptr wird NUR bei den QL-Systemen anschließend auf Null gestellt, bei
MINERVA und SQ bleibt er erhalten. Darum, und weil die Dokomente hierzu unklar
rsp. widersprüchlich sind, sollten andere Einstellungen stets erneuert
werden.
Nähere Angaben hierzu im Text {3.5.1}.
iof.load
|
FS.LOAD
|
3 / 72
|
|
|
Ganzes File in den Speicher holen
|
iof.save
|
FS.SAVE
|
3 / 73
|
|
|
Daten aus dem Speicher in ein File schreiben
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
D2
|
Filelänge
|
|
|
|
A1
|
Ptr auf Datenbereich
|
A1
|
Endadresse nach dem Laden/Sichern
|
Die Wartezeit in D3 ist mit -1 anzugeben, sonst wird der Vorgang womöglich
unvollständig abgewickelt.
A1 muß geradzahlig sein.
Die QDOS-Systeme laden unterschiedllich stets ab Fileanfang oder ab dem
aktuellen Filepointer. Dies ist nicht eindeutig dokumentiert, also
einigermaßen unsicher. Der Filepointer sollte darum ggf. zuvor auf Null
gestellt werden.
Der Wert von A1 kommt nicht immer richtig zurück (auch SQ),
Fortsetzung mit den zurückgelieferten Daten ist unsicher.
Je nach System wird mit Fixdaten gearbeitet, ungeachtet der wirklichen
Struktur z.B. auf Discetten, woraus tiefgreifende Fehler resultieren
können.
In der Literatur wird das Verfahren gelegentlich auch "scatter load/save"
genannt:
FS.SAVE/LOAD bilden eine Art DMA nach, Daten werden direkt zwischen dem
Speicher des Rechners und einem (peripheren) Datenträger übertragen.
Wirklicher DMA ist sehr schnell, im QDOS jedoch ist die schrittweise
Übertragung mittels der String-Traps meist sicherer, insbes. auch über
das QDOS-Netzwerk (die unseligen Störungen bei SQ/QXL einmal außer acht
gelassen), und dank der überaus wirkungsvollen Slaveblock-Verwaltung auch
schneller. Nur, wo der Rechner ansonsten ruhen würde, oder wenn der
Arbeitsspeicher knapp ist, werden FS.SAVE/LOAD effektiv schneller sein.
Bei allen folgenden Aufrufen sind sämtliche
Fehlercodes des IOSS möglich.
Mit Toolkit II oder MINERVA:
iof.rnam
|
FS.RENAME
|
3 / 74
|
|
|
File umbenennen - TK, MINERVA
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
|
|
D1
|
verdorben
|
|
A1
|
Ptr zum neuen Namen
|
A1
|
verdorben
|
Mit MINERVA bleibt die Update-Eintragung im Directory unverändert.
Neu eingerichtete Files lassen sich nicht umbenennen. Sie müssen ggf.
geschlosssen und dafür erneut geöffnet werden (festgestellt bei QL/GC mit
MGG/MINERVA, QXL/SMSQ).
iof.trnc
|
FS.TRUNC
|
3 / 75
|
|
|
File an aktueller Position kappen - TK, MINERVA
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
-/-
|
|
|
Weitere Aufrufe sind mit Level 2
Device-Handler (einzeln, GoldCard, SMSQ) verfügbar. Auch dort
können alle Fehlercodes des IOSS zurückkommen.
iof.date
|
FS.DATE
|
3 / 76
|
|
|
Lesen/Eintragen des Update- oder Backup-Datums
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1
|
-1: Lesen
|
D1
|
eingestelltes Datum
|
|
|
0: aktuelles Datum
|
|
|
|
|
Zahl: Sekunden für Datum
|
|
|
|
D2.B
|
0 Update
|
|
|
|
|
bleibt beim Schließen des File erhalten.
|
|
|
2 Backup
|
|
|
|
|
Auch bei OPEN_IN geöffnetem File änderbar.
|
Die Datumseintragung kann sonst z.B. durch vorübergehendes Einstellen der
QDOS-Uhr (bis nach dem Schließen des betr. File) auf das gewünschte Datum
beeinflußt werden - was so aber immerhin in allen Systemen gleichermaßen
verwendbar ist (Beispiel CDISK).
iof.mkdr
|
FS.MKDR
|
3 / 77
|
|
|
leeres(!) File zum Directory machen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1
|
0
|
|
|
|
D3.W
|
-1
|
|
|
Macht ein leeres File zum Directory. Es übernimmt sofort alle bereits
vorhandenen und später bei deren Anlegen alle neuen Namen, deren mit einem
Unterstrich ("_") begrenzter Anfangsteil sich mit dem Namen des hierzu
geöffneten Kanals decken.
iof.vers
|
FS.VERS
|
3 / 78
|
|
|
Lesen/Eintragen einer 16-Bit-Zahl für die File-Version
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1
|
0 Lesen,
|
D1
|
aktuelle Versionsnummer
|
|
|
>0 neue Nummer
|
|
|
|
|
-1 Lesen und eins weiterzählen
|
|
|
Eine gerade eingetragene Nummer bleibt nach CLOSE oder FLUSH unverändert.
Außerdem, ohne Namensangabe:
"Watermark" (was auch immer das sein soll) für Thor-Geräte {SNG}:
iof.xinf
|
FS.XINF
|
3 / 79
|
|
|
erweiterte Angaben zu Device und Datenträger holen
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
A1
|
Ptr 64 Bytes Datenpuffer
|
A1
|
unverändert
|
Media-Daten im Puffer:
|
|
IOI.NAME
|
00
|
.w
|
|
count-w
|
|
02
|
.b
|
20 *
|
Name des Datenträgers
|
IOI.DNAM
|
22 $16
|
.w
|
|
count-w
|
|
24 $18
|
.b
|
4 *
|
bis zu 4 Zeichen Gerätename
|
IOI.DNUM
|
28 $1c
|
.b
|
|
Lauferksnummer
|
IOI.RDON
|
29 $1d
|
.b
|
|
=/= 0 schreibgeschützt (nicht QXL)
|
IOI.ALLC
|
30 $1e
|
.w
|
|
Größe einer Zuweisungseinheit
|
IOI.TOTL
|
32 $20
|
|
|
Gesamtanzahl Zuweisungseinheiten
|
IOI.FREE
|
36 $24
|
|
|
Anzahl freier Zuweisungseinheiten
|
IOI.HDRL
|
40 $28
|
|
|
Länge des physischen Fileheaders
|
IOI.xxxx
|
44 $2c
|
.b
|
20 *
|
mit $ff auf 64 Bytes aufgefüllt
|
Die Ur-Definition endet hier. Mehr nur in SQ,
jüngeren "level 2" etc., nach {15}:
|
IOI.FTYP
|
44 $2c
|
.b
|
|
Format-Typ 1:QDOS, 2:MDOS
|
IOI.STYP
|
45 $2d
|
.b
|
|
Format-Variante
|
IOI.DENS
|
46 $2e
|
.b
|
|
Aufzeichnungsdichte
|
IOI.MTYP
|
47 $2f
|
.b
|
|
Medium 0:RAM 1:FLP 2:HD 3:CD
|
IOI.REMV
|
48 $30
|
.b
|
|
=/= 0 bei Wechselmedium
|
IOI.xxxx
|
49 $31
|
.b
|
15 *
|
mit $ff auf 64 Bytes aufgefüllt
|
In {15} heißt es:
"Ausführbarkeit dieser Trap ist Kriterium für
Vorhandensein eines ´level 2´-Handlers.
"Dann ist garantiert, daß alle anderen Traps des Filing-Systems verfügbar
sind.
FEHLER mit (älteren) TK2:
Aufgrund eines Fehlers in manchen LV2-Versionen werden vom Aufruf u.U. 100
Bytes in den Speicher geholt.
FEHLER bei SQ/QXL:
IOI.RDO wird in der QXL nicht rsp. falsch besetzt.
Erkennen dieses Zustandes ist auf ordentlichem Wege nicht möglich.
Ein physisch schreibgeschütztes Medium ist immerhin sicher, nicht aber das
System des Rechners! Reaktion auf Schreibversuche ist bestenfalls endloses
Gejaule des Tongenerators, das nicht nur an den Nerven des Benutzers zerrt,
sondern auch sonst wegen seiner Unzuverlässigkeit eher schädlich ist:
Die eigentliche Gefahr liegt darin, daß Files vielfach ganz ohne Reaktion
vermeintlich gesichert werden und selbst im Directory erscheinen, sodaß sie im
Vetrauen darauf und auf ein Getön im Fehlerfalle dann unversehens und
unrettbar verlorengehen.
Die sorglose Behandlung des DIR-Befehls im SQ-Basic kann ferner durch Anzeige
völlig verdorbener überlanger Fehl-Eintragungen selbst zum Zusammenbruch des
ganzen Systems und schließlich auch so zum Verlust sämtlicher Daten führen.
Nur mit der "SYSTEM"-Erweiterung
{Schiemann}:
iof.attr
|
IOF.ATTR
|
3 / 80
|
|
|
File-Attribut(e) setzen/löschen, "SYSTEM"
|
|
|
|
|
|
|
IN:
|
|
OUT:
|
|
|
|
|
|
|
|
D1.W
|
Schalter
|
D1
|
verdorben
|
|
D2.B
|
Attribut(e)
|
D2
|
verdorben
|
Schalter:
|
D1=0
|
Löschen der angegebenen Attribute
|
|
|
sonst Attribut(e) setzen
|
Attribute in D2.B:
|
Bit
|
gesetzt
|
|
7
|
Scheibschutz
|
|
6
|
File unsichtbar machen
|
|
0-5
|
Benutzernummer
|
|
|
111111 mit D1:=0 für Benutzer 0
|
Files mit der User-Nummer 0 können jederzeit gelesen werden, andere nur, wenn
die Nummern übereinstimmen. Setzen der Benutzernummer ("user"..) und weitere
Eingriffe sind nur mit dem richtigen Passwort dem "Super-User" möglich.
Durch Veränderungen an den Systemvariablen wurde "SYSTEM" für SQ unbrauchbar.