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.
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
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.
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.
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.
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
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
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
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