ZENTRALE
I/O-SYSTEM-ROUTINE - CIO
Die
Hauptaufgabe der CIO ist das ‹bertragen von Kontrolldaten an den richtigen Geräte-Handler.
Die CIO ist außerdem eine Ausgangsroutine für alle Geräte-Handler,
sowie der normale Einsprungpunkt für die meisten I/O-Funktionen des OS. Die
CIO wird z.B. aufgerufen, wenn der BASIC-Interpreter eine OPEN-Anweisung ausführt.
OPEN
Gerät/Datei öffnen
CLOSE
Gerät/Datei schließen
GET CHARS Lesen
von n Zeichen
READ RECORD Lesen des
nächsten Satzes
PUT CHARS Schreiben
von n Zeichen
WRITE RECORD Schreiben des
nächsten Satzes
STATUS
Abfragen des Geräte-Zustandes
SPECIAL
Handler-spezifisch (z.B. NOTE für FMS)
Der Programmierer
kann natürlich eigene CIO-Aufrufe erstellen.
Die Aufruffolge für
die CIO lautet wie folgt:
; Der Benutzer hat IOCB-Parameter gesetzt
LDX #IOCBNUM ; Setzen des
IOCB-Indexes (IOCB 16)
JSR CIOV
; System-Routinen-Vektor zu CIO
BMI ERROR ;
Wenn kein Fehler auftaucht, wird
; das Programm fortgesetzt, andern-
; falls befindet sich der Fehler-Code
; im Y-Register.
Wie
im oberen Aufruf gezeigt, wird einer der IOCBs benutzt, um die Kontrolldaten zur
CIO zu bringen. Dabei kann irgendeiner der 8 vorhandenen IOCBs verwendet werden.
Die CIO benötigt den IOCB-Index im X-Register. Beim Rücksprung werden die
Status-Bits des 6502-Prozessors gesetzt, um den Erfolg oder Fehler der I/O-Operation
anzuzeigen. Ist das N-Bit gesetzt ("l"), dann tauchte ein Fehler bei der
Ausführung der I/O-Operation auf und der entsprechende Fehler-Code wird im Y-Register
übergeben. Der Fehler/Erfolgs-Wert wird außerdem im IOCB-Byte ICSTA (siehe
IOCB-Definition) gespeichert. Im OS-Benutzer-Manual befindet sich ein Beispielprogramm,
das die CIO anspringt, um ein Disk-File zu öffnen, einige RECORDs einzulesen
und das File zu schließen (OPEN, READ und CLOSE).
Die
CIO übergibt die I/O-Kontrolldaten, indem der IOCB-Index im X-Register zum ‹bertragen
der IOCB-Inhalte zum ZIOCB benutzt wird. Die CIO berechnet dann den Einsprungspunkt
für den Geräte-Handler und springt die entsprechende Handler-Routine an.
Anhang VI zeigt ein Flußdiagramm der CIO-System-Routine.
Der
Eingangspunkt eines Device-Handlers wird von der CIO indirekt berechnet. Während
eines OPEN-Aufrufes bekommt die CIO die Geräte-Spezifikation für die bereit
zu machende Datei. Ist das zu öffnende Gerät z.B. ein Drucker, so würde
die Geräte-Spezifikation "P:" lauten.
01 ; Adresstafel für Handler
E430
02 PRINTV = $E430
E440
03 CASETV = $E440
E400
04 EDITRV = $E400
E410
05 SCRENV = $E410
E420
06 KEYBDV = $E420
07 ;
0000
08 *=
$031A
09
10 HATABS
031A 50
20 .BYTE
¥P¥ Drucker
031B 30 E4
30
.WORD PRINTV Einsprungpunkt-Tafel
031D 43
40
.BYTE ¥C¥" Cassettenstation
03lE 40 E4
50 .WORD
CASETV Einsprungpunkt-Tafel
0320 45
60
.BYTE ¥E¥
Bildschirm-Editor
0321 00 E4
70
.WORD EDITRV Einsprungpunkt-Tafel
0323 53
80
.BYTE ¥S¥
Bildschirm-Handler
0324 10 E4
90
.WORD SCRENV Einsprungpunkt-Tafel
0326 4B
0100 .BYTE
¥K¥ Tastatur
0327 20 E4
0110 .WORD
KEYBDV Einsprungpunkt-Tafel
0329 00
0120 .BYTE
0 Freier
Eintrag 1
032A 00 00
0130 .BYTE
0,0 (DOS)
032C 00
0140 .BYTE
0 Freier
Eintrag 2
032D 00 00
0150 .BYTE
0,0 (850-Modul)
032F 00
0160 .BYTE
0 Freier
Eintrag 3
0330 00 00
0170 .BYTE
0,0
0332 00
0180 .BYTE
0 Freier
Eintrag 4
0333
00 00 0190
.BYTE 0,0
0335 00
0200 .BYTE
0 Freier
Eintrag 5
0336 00 00
0210 .BYTE
0,0
0338 00
0220 .BYTE
0 Freier
Eintrag 6
0339 00 00
0230 .BYTE
0,0
033B 00
0240 .BYTE
0 Freier
Eintrag 7
Abbildung
8.4a:
Adresstafel
für Handler
*= $PRINTV
E430 9E EE
.WORD PHOPEN-1
Gerät öffnen (OPEN)
E432 DB EE
.WORD PHCLOS-1
Gerät schließen (CLOSE)
E434 9D EE
.WORD BADST-1
Gerät lesen - nicht
vorhanden
E436 A6 EE
.WORD PHWRIT-1
Gerät schreiben (WRITE)
E438 80 EE
.WORD PHSTAT-1
Gerätezustand (STATUS)
E33A 9D EE
.WORD BADST-1
Special - nicht vorhanden
E34C 4C 78 EE
JMP PHINIT
Geräte Initialisierung
Abbildung
8.4b:
Einsprungpunkt-Tafel
für Drucker-Handler
Die
CIO benutzt eine mit HATABS (Abbildung 8.4a) bezeichnete Tafel, um den Handler-Einsprungpunkt
indirekt zu berechnen. Diese Tafel verwendet eine Geräte-Spezifikation als Schlüssel
zum Auffinden der Adresse des entsprechenden Handler-Einsprungpunktes. Die Geräte-Spezifikation
wird benutzt, um den HATABS-Eingang des zu eröffnenden Gerätes zu finden.
Die CIO beginnt mit der Suche nach dem ersten Eintrag mit der entsprechenden Geräte-Spezifikation
am Ende von HATABS (in diesem Fall ¥P:¥, der erste Eintrag in die HATABS-Tafel).
Die mit der Geräte-Spezifikation bestimmte Adresse ist ein Zeiger zu einer Liste
von Handler-Einsprungpunkten (die für den Drucker stehen in Abbildung 8.4b).
Die
CIO verwendet ICCOM, das IOCB-Kommando-Byte, um den Einsprungpunkt des anzusprechenden
Handlers zu finden. Die Einsprungpunkt-Tafeln für alle Geräte-Handler sind
im OS-Listing aufgeführt. Die Position in allen Einsprungpunkt-Tafeln der Handler
haben die gleiche Bedeutung. So ist z.B. die erste Position in allen Tafeln der Vektor
zur OPEN-Routine für den Geräte-Handler.
HATABS
liegt im RAM ab der Speicherstelle $031A und enthält Platz für 14 Einträge.
Beim Einschalten und beim Drücken der SYSTEM-RESET-Taste werden die Inhalte
von HATABS entsprechend Abbildung 8.4 initialisiert. HATABS besitzt zu diesem Zeitpunkt
Einträge für alle Handler mit Ausnahme des Disk-Handlers. Der Disk-Handler
wird niemals über HATABS aufgerufen (siehe Kapitel 9 dieses Buches).
Durch
den Programmierer oder das OS können weitere Einträge nach HATABS gebracht
werden. Das OS kann neue Einträge als einen Teil der Einschalt- oder SYSTEM-RESET-Funktion
anfügen. Jeder neue Eintrag würde bei Speicherstelle $0329 beginnen. Anfügungen
an HATABS könnten z.B. Eingänge für die Diskettenstation (der File-Manager
<FMSI> oder für das 850-Modul sein.
Man
kann die flexible Natur HATABS' ausnutzen und das OS um einige neue Fähigkeiten
erweitern. Ein Beispiel (Abbildung 8.5) zeigt einen Null-Handler. Ein Null-Handler
ist genau das, was sein Name sagt: er führt KEINE FUNKTION aus! Ein Null-Handler
kann zum Ausarbeiten von Programmen benutzt werden, welche Geräte verwenden,
die eine langsame Zugriffsgeschwindigkeit besitzen. Anstatt 50.000 Disketten-Zugriffe
abzuwarten, bis ein Fehler gefunden wird, muß die Ausgabe lediglich über
den Null-Handler durchgeführt werden.
Eine
andere Möglichkeit in Verbindung mit HATABS besteht darin, die Funktion eines
bestehenden Eintrags zu ändern. Möchte der Benutzer z.B. einen Drucker
an den Computer anschließen, welcher einige spezielle Fähigkeiten besitzt,
die mit dem normalen Drucker-Handler nicht angesprochen werden können, so kann
dieses durch ƒndern der HATABS Einsprungpunkt-Tafel behoben werden. Alle "P:"
I/O-Anweisungen könnten mit einem neuen Drucker-Handler bearbeitet werden. Anhang
VII zeigt ein Beispiel für einen Drucker-Handler, der die vorhandenen Kontroller-Eingänge
zum schnellen ‹bertragen von zu druckenden Daten benutzt.
0000
10
*= $600
031A
20 HATABS = $031A
30 START
0600 A0 00
40 LDY
#0
50 LOOP
0602 B9 1A 03
60
LDA HATABS,Y
0605 C9 00
70
CMP #0
Freier Eintrag?
0607 F0 09
80
BEQ FOUND
0609 C8
90
INY
060A C8
0100 INY
06OB C8
0110 INY
Zeigt zum nächsten
060C C0 22
0120 CPY
#34 HATABS-Eintrag
am Ende
06OE D0 F2
0130 BNE
LOOP von
HATABS?? - Nein...
0610 38
0140 SEC
Ja, übertrage
ERROR-Status
0611 60
0150 RTS
zum aufrufenden
Programm
0160 ;
0170 FOUND
0612 A9 4E
0180 LDA
#¥N
Device-Name
0614 99 1A 03
0190 STA
HATABS,Y
0617 C8
0200 INY
0618 A9 24
0210 LDA
#NULLTAB&255
061A 99 1A 03
0220 STA
HATABS,Y Null-Handler Ein-
061D C8
0230 INY
sprung-Tafel
06lE A9 06
0240 LDA
#NULLTAB/256
0620 99 1A 03
0250 STA
HATABS,Y
0623 60
0260 RTS
0270 ;
0280 NULLTAB
0624 32 06
0290 .WORD RTHAND-1
OPEN
0626 32 06
0300 .WORD
RTHAND-1 CLOSE
0628 32 06
0310 .WORD
NOFUNC-1 READ
062A 32 06
0320 .WORD
RTHAND-1 WRITE
062C 32 06
0330 .WORD
RTHAND-1 STATUS
062E 34 06
0340 .WORD
NOFUNC-1 SPECIAL
0630 4C 33 06
0350 JMP
RTHAND Initialisierung
0360 ;
0370 RTHAND
0633 A0 01
0380 LDY
#1
Erfolgreiche I/O-Fkt.
0390 NOFUNC
Fkt. nicht vorhanden
0400 ;
0635 60
0410 RTS
Abbildung
8.5:
Null-Handler