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