Einleitung

Im Executable ROS befinden sich zahlreiche komplexere Routinen zur Ansteuerung von I/O-Geräten, wie z.B. das Öffnen einer Datei auf Band oder Diskette, der Ausgabe von Text auf dem Drucker etc. Diesen Routinen ist gemein, daß sie über eine feste Einsprungadresse aufgerufen werden, eine Auswahlroutine, genannt I/O Supervisor, die die Anfrage an die spezialisierte Geräteroutine weitergibt. Die Auswahl des Gerätes und die auszuführende Funktionen werden in einem I/O Control Block, kurz IOCB, als Parameter an die Auswahlroutine übergeben. Je nach Funktionen werden nicht alle Elemente des IOCB benutzt, oder es werden Werte an die aufrufende Prozedur zurückgegeben.

Für die wichtigsten Geräte sind entsprechende Routinen bereits im Executable ROS vorhanden. Diese sind Tastatur, Bildschirm, Bandlaufwerk, Diskettenlaufwerk und Drucker. Andere Geräte benötigen die Routinen in Form von nachzuladenden Programmen, welche mit Hilfe von LOADER (zu finden bei den Verwaltungsprogrammen) von Band oder Diskette in den RWS zu laden sind. Diese Geräte sind alle Kommunikationsgeräte, also Async. Comm., Serial I/O, Parallel I/O und BSC, sowie die Plot-Routinen für den Drucker.

Beschreibung des IOCB

Der IOCB ist eine Datenstruktur, die im RWS abgelegt wird und als Parameter an den I/O Supervisor übergeben wird. Dieser entscheidet anhand der Geräteadresse, welche I/O-Routine aufzurufen ist. Am Ende wird ein Rückgabecode eingetragen, evtl. noch weitere Rückgabewerte.

 
Offset   Größe   Bezeichnung                      Name 
------------------------------------------------------------------------------ 
 0         1     Geräteadresse                    IOCB_DA 
 1         1     Untergeräteadresse (UGA)         IOCB_Sub 
 2         1     Kommandocode                     IOCB_Cmd 
 3         1     Flags                            IOCB_Flags 
 4         2     Adresse des I/O-Puffers          IOCB_BA 
 6         2     Größe des I/O-Puffers in Bytes   IOCB_BS 
 8         2     Steuerinformationen 1            IOCB_CI1 
 A         2     Adresse des I/O-Arbeitsbereichs1 IOCB_WA 
 C         2     Rückgabecode2                    IOCB_Ret 
 E         2     Steuerinformationen 2            IOCB_CI2 
10         2     Gerätestatus                     IOCB_Stat1 
12         2     Gerätestatus                     IOCB_Stat2 
 
1 Ein Bereich von ca. 10 bis 20 Bytes im RWS als sogenannte 
  "scratch area" 
2 Die möglichen Rückgabecodes sind im IBM 5110 MIM Kapitel 
  Error Codes zu finden. 
Für die Geräteadresse sind folgende Werte möglich:
 
Wert   Gerät 
---------------------------------------- 
00     Bildschirm 
01     Common und Language ROS 
03     Sortiervorrichtung 
04     Tastatur 
05     Drucker 
06     BSCA 
07     Parallel I/O 
08     Asynchronous Communications 
0A     Serial I/O 
0C     Print plot 
0D     Diskette 
0E     Band 

Funktionen der einzelnen Geräte

Bildschirm

 
Kommando   Funktion 
--------------------------------------------------------------------- 
00         Schirm einschalten 
01         Schirm ausschalten ("In Betrieb" leuchtet) 
02         Schirm um 1 Zeile nach oben scrollen1 
           IOCB_Flags: letzte zu scrollende Zeile 2
03         Schirm um 1 Zeile nach unten scrollen1 
           IOCB_Flags: letzte zu scrollende Zeile 2
04         Schirm löschen 
05         Alarmton einschalten 
06         Alarmton ausschalten 
07         Alarmton kurz ertönen lassen (Beep) 
08         Zeichensatz ändern
           IOCB_CI1: Zeichensatz (siehe I/O-Funktionen Gerät F)
 
1 Es wird stets eine leere Zeile angefügt. 
2 Die Zeilen werden von unten (Zeile 0) nach oben (Zeile 15) numeriert.
Weitere Angaben im IOCB brauchen nicht gemacht zu werden.

Common/Language ROS

 
IOCB_Cmd   Funktion 
--------------------------------------------------------------------- 
01         Kopiere ROS ins RWS oder prüfe CRC
02         Kopiere RWS ins "ROS"1
 
IOCB_Sub   Funktion 
--------------------------------------------------------------------- 
08         Wähle BASIC ROS aus
04         Wähle APL ROS aus
02         Wähle Common ROS aus
 
IOCB_Flags Funktion (kombinierbar)
--------------------------------------------------------------------- 
40         Prüfe CRC (Befehl 1) ohne Kopieren
20         Prüfe CRC rekursiv
08         Ignoriere CRC beim Lesen (nötig wenn nicht alles gelesen wird)

IOCB_BA:    Pufferadresse im RWS
IOCB_BS:    Anzahl Bytes
IOCB_CI1:   Wortadresse im ROS

1 Dies scheint ein Überbleibsel aus der Entwicklungszeit zu sein.

Rückgabewerte:

 
IOCB_Ret:   $00  - kein Fehler
            '02' - Ungültiger Befehl
            '07' - ROS CRC Fehler
            '14' - Ungültiger UGA (IOCB_Sub)

Die Funktionen, die hier zur Verfügung gestellt werden, dienen hauptsächlich Diagnoseprogrammen, evtl. auch den Interpretern, um Daten ins RWS zu kopieren.

Die Funktion "Prüfe CRC rekursiv" ermöglicht es, mehrere ROS-Bereiche oder ROSse auf einmal zu testen. Die ROSse sind in Bereiche von $1800 Bytes (=6kB) unterteilt, wovon jeder Bereich eine CRC von 0 besitzt. Um mehrere Bereiche zu testen, erzeugt man eine einfach verkettete Liste von IOCBs, die über IOCB_BA verknüpft werden, d.h. IOCB_BA des ersten Bereichs zeigt auf den IOCB des nächsten usw. Dabei muß immer auch Bit 2 in IOCB_Flags gesetzt sein. Das Listenende wird demnach durch ein nichtgesetztes Bit 2 gekennzeichnet.

Tastatur

 
IOCB_Cmd   Funktion 
--------------------------------------------------------------------- 
01         Eingabe von Tastatur 
40         Wechsle zu Großbuchstaben/Sonderzeichen
41         Wechsle zu Klein-/Großbuchstaben
 
IOCB_Sub   Funktion 
--------------------------------------------------------------------- 
00         Eingabe einer Zeichenkette mit Echo, Ediertasten und 
           Angabe der rel. Cursorposition in Schirmecke (siehe 
           Interpreter-Eingabe); Ende bei Sondertaste 
80         Eingabe eines einzigen Zeichens ohne Echo; Rückgabe des 
           Zeichencodes in IOCB_Flags 
 
IOCB_Flags: Anfängliche Cursorposition innerhalb des Puffers 
IOCB_BA:    Adresse innerhalb des Bildschirmspeichers 
IOCB_BS:    Max. Eingabelänge bei IOCB_Sub=$00 

Der gesamte Eingabepuffer muß auf dem Schirm sein ($0200-$05FF), sonst wird der Fehler 02 zurückgeliefert.

Rückgabewerte:

 
IOCB_Flags: Zeichencode der Taste bei IOCB_Sub=$80 
IOCB_CI1:   Bei IOCB_Sub=$00 enthält das High-Byte die Taste, die 
            die Eingabe beendet hat 
            $80 - Pfeil nach oben 
            $40 - Pfeil nach unten 
            $20 - EXECUTE 
            $0X - CMD x (x=Taste 0 bis 9) 
IOCB_Flags enthält die Cursorposition bei Verlassen der Eingabe.

Drucker

 
IOCB_Cmd   Funktion 
--------------------------------------------------------------------- 
00         Sense (vor 1. Write nötig) 
01         Ramp head (Kopf in Parkposition fahren) 
02         Write (Zeile drucken) 
FF         Diagnostic write (normale Kopfbewegung, ohne zu schreiben) 
 
IOCB_BA:    Adresse der zu druckenden Zeile 
IOCB_BS:    Anzahl der zu druckenden Zeichen, bei 0 wird nicht 
            gedruckt, aber evtl. Zeilenvorschübe erfolgen 
IOCB_CI1:   $0000 - kein Zeilenvorschub 
            $0001 bis $000F - Zeilenvorschub 1 bis 15 Zeilen 
IOCB_WA:    Adresse Arbeitsbereich 

Diskette

Es werden hier nur die Kommandos aufgelistet. Die Beschreibung erfolgt auf der Seite Diskettenoperation.

 
IOCB_Cmd   Funktion 
--------------------------------------------------------------------- 
00         Sense - Lies Volume Header (Sektor 7) 
01         Read - Lies einen absoluten oder relativen Sektor 
02         Write - Schreibe einen absoluten oder relativen Sektor 
03         Write last - Schreibe letzten Sektor einer Datei (?) 
04         Find - Suche Verzeichniseintrag bzw. Datei 
05         Mark - Erstelle oder lösche Verzeichniseintrag 
08         (undokumentiert) - (?)
0B         Write header - Überschreibe einen Verzeichniseintrag 
0C         Scan - (?) 
10         Find ID - Finde einen bestimmten Sektor (inkl. Seek etc.)
11         Initialize head - Repositioniert die Köpfe über Spur 0 

Band

Auch hier werden nur die Kommandos gelistet. Die Beschreibung ist auf der Seite Bandoperation zu finden.

 
IOCB_Cmd   Funktion 
--------------------------------------------------------------------- 
00         Sense 
01         Read - Lies Dateiblock von Band
02         Write - Schreibe Dateiblock auf Band
03         Write last - Schreibe letzten Dateiblock auf Band
04         Find - Suche eine Datei
05         Mark - Markiere eine Datei
06         Initialize and mark 
07         Rewind 
08         Forward space record 
09         Backspace record
0A         Find next header 
0B         Write header - Schreibe den Dateikopf auf Band
FD         Translate only - Übersetze Text EBCDIC <-> Bandcode

Aufruf des I/O Supervisors

Nachdem man einen IOCB zur Ausführung einer bestimmten Funktion erstellt hat, wird der I/O Supervisor aufgerufen. Er liegt im Executabe ROS und muß deshalb über die RWS/ROS-Umschaltroutine aufgerufen werden. Die Adresse des Supervisors steht in $AE, die der Umschaltroutine in $AC.
Der I/O Supervisor erwartet die Adresse des IOCB in R3; die Umschaltroutine erwartet in R2 die Rückkehradresse in das eigene Programm (siehe Unterprogrammaufruf). Alle anderen Register müssen ggf. gesichert werden, da sie verändert werden können.
Ein Beispiel, wie der Supervisor aufgerufen werden kann:

 
...              ... 
D301 xxxx        LWI R3, #Beep_IOCB       ; Adresse des IOCB 
2857             MOVE R8, $AE             ; Adresse des I/O Supervisors 
0203             INC2 R2, R0              ; Rückkehradresse nach R2 
2056             JMP ($00AC)              ; Sprung in die Umschaltroutine 
...              ... 
 
Beep_IOCB:       db 4, 0 
                 db 7, 0 
                 dw 0, 0, 0, 0, 0, 0, 0, 0