Der folgende Bericht zeigt Ihnen anhand von Beispielen, wie Sie eigene Routinen in den Betriebssystem-ROMs (TOS) unterbringen können. Ferner werden Tips gegeben, um Änderungen, wie z.B. die Umstellung von 50 Hz auf 60 Hz direkt in den ROMs bzw. EPROMs vornehmen zu können.
Viele von Ihnen werden sich schon geärgert haben, daß die ST-Uhr beim Einschalten des Rechners nur dann gestellt wird, wenn sich ein entsprechendes Programm im AUTO-Ordner oder als Accessory auf der Diskette befindet. Das kann man ändern, wenn man das Boot-Programm in die Reset-Routine einbindet und dann mit dem Betriebssystem in entsprechende EPROMs brennt. Das setzt natürlich voraus, daß man in der Lage ist, EPROMs des Typs 27256 zu brennen, aber es sind schon mehrere preisgünstige Programmiergeräte erhältlich, so daß dieser Punkt für Interessierte kein Problem darstellen wird. Einige von Ihnen werden sicherlich auch folgendes Problem kennen: Sie haben einen Star, Epson oder IBM kompatiblen Drucker an Ihren Rechner angeschlossen. Wenn Sie jetzt über Alternate Help eine Hardcopy machen wollen, so geht dies nur wenn Sie vorher das Control-Accessory mitgebootet haben und dort von 1280 auf 960 Punkte/Inch umgeschaltet haben. Diese Einstellung wird zwar mit dem DESKTOP.INF auf Diskette abgespeichert, sie wird jedoch nur vom Kontrollfeld-Accessory gelesen .Ähnlich ist es mit der seriellen Schnittstelle (RS 232), auch diese Parameter werden nur von dem entsprechenden Accessory aus dem DESKTOP.INF gelesen und gesetzt.
Außerdem möchte ich Ihnen noch zeigen, wie man, auch ohne ein DESKTOP.INF auf der Diskette zu haben, entsprechende Änderungen des Bildschirmaufbaus in den TOS-ROMs erreichen kann.
Die Atari ST-Serie besitzt 6 Betriebssystem-ROMs, die mit U2-U7 bezeichnet sind. Die Lage der ROMs im 1040 ST zeigt Bild 1a. Um an die ROMs heranzukommen, muß man jedoch vorher das Netzteil abschrauben, da diese unter besagtem Netzteil liegen. Im 260 ST und im 520 ST, egal ob mit oder ohne Modulator, liegen die ROMs wie im Bild 1b dargestellt. Bei allen 3 Rechnern muß natürlich vorher das Abschirmblech entfernt werden, sonst geht gar nichts.
Wie Ihnen sicher bekannt sein dürfte, gehört die Atari ST-Serie zu den 16 Bit Rechnern. Die ROMs sind aber nur 8 Bit-weise organisiert, so daß jeweils 2 ROMs ein komplettes Wort (16 Bit) darstellen. Die Verteilung der Bytes zeigt Ihnen Bild 2 am Beispiel der ROMs U4 und U7. Für die anderen ROMs gilt das analog. Das Betriebssystem befindet sich im Speicherbereich von Adresse $FC0000 bis Adresse $FEFFFF. Die Zuordnung der einzelnen ROMs zum Speicher ist wie folgt: (siehe Bsp. 1)
U2 = gerade Adresse im Bereich $FE0000 - $FEFFFF
U3 = gerade Adresse im Bereich $FD0000 - $FDFFFF
U4 = gerade Adresse im Bereich $FC0000 - $FCFFFF
U5 = ungerade Adresse im Bereich $FE0000 - $FEFFFF
U6 = ungerade Adresse im Bereich $FD0000 - $FDFFFF
U7 = ungerade Adresse im Bereich $FC0000 - $FCFFFF
Beispiel 1
Im weiteren werde ich nur noch die 16 Bit Schreibweise wählen, also stets höherwertiges und niederwertiges Byte hintereinander, genauso wie die Änderungen später im Speicher stehen, und nicht nach ROMs bzw. geraden/ungeraden Adressen unterteilt. Das ist durchaus sinnvoll, da z.B. ASCII-Texte sonst keinen Sinn ergeben. Außerdem kennen nahezu alle gängigen EPROM-Programmiergeräte, wie z.B. der Easyprommer, eine 16 Bit Verarbeitung. Für alle, die das nicht können, gilt die Aufspaltung nach Bild 2.
Jetzt werden Sie sich sicher fragen: Wie kann man noch eigene Routinen im Betriebssystem unterbringen?
Ganz einfach: Am Ende des Betriebssystems befinden sich noch einige hundert Bytes Platz, die für eigene Routinen genutzt werden können. Man muß lediglich an geeigneter Stelle einen Unterprogrammaufruf aus der Reset-Routine vornehmen. Diesen Aufruf kann man am einfachsten dort einsetzen, wo das TOS-Datum (6.2.86) gesetzt wird. Diese Routine wird ohnehin nicht mehr benötigt, wenn Sie eine ST-Uhr haben und diese in Ihrem Unterprogramm setzen wollen. Wollen Sie jedoch nur die Parameter für den Drucker oder die RS 232 ändern und haben keine ST-Uhr, dann sollten Sie das TOS-Datum in Ihrem Unterprogramm setzen, sonst steht es auf 00:00:80. Leider kommen nach der Setzroutine für das Datum noch 3 Routinen, die Initialisierungsaufgaben übernehmen. Deshalb müssen diese Routinen vorverlegt werden. Anhand der folgenden Gegenüberstellung von alt und neu (Listing 1) sehen Sie, was ich meine:
FC03C4 3F3900FC001E MOVE.W $FC001E,-(A7) ; Datum (6.2.86) holen FC03CA 3F3C002B MOVE.W #S2B,-(A7) ; Set Date FC03CE 4E41 TRAP #1 ; GEMDOS FC03D0 584F ADDQ.W #4,A7 ; Stackpointer korrigieren FC03D2 610800B8 BSR $FC048C ; von Floppy booten FC03D6 618000D0 BSR $FC04A8 ; von DMA-Bus booten FC03DA 61000944 BSR $FC0D20 ; reset-residente Programme ausführen FC03DE hier geht die Original-Reset-Routine weiter
NEU : FC03C4 610000C6 BSR $FC048C ; von Floppy booten FC03C8 610000DE BSR $FC04A8 ; von DMA-Bus booten FC03CC 61000952 BSR $FC0D20 ; reset-residente Programme ausführen FC03D0 4EB900FEFC80 JSR $FEFC80 ; Sprung zum Unterprogramm FC03D6 4E71 NOP ; No Operation - zum Auffüllen FC03D8 4E71 NOP ; des Speichers bis die Original FC03DA 4E71 NOP ; Reset Routine weitergeht FC03DC 4E71 NOP FC03DE hier geht die Original-Reset-Routine weiter
Listing 1
</div>
Wenn Sie die entsprechenden Bytes ändern, so wird, anstatt das TOS-Datum zu setzen, zu einem Unterprogramm nach $FEFC80 verzweigt. Dort müssen nun unsere Ergänzungen und Änderungen hin. Im Original stehen von $FEFC78 bis $FEFFF3 nur Nullen, daher entfällt hier die Angabe des jeweiligen ,alten1 Inhalts. Ich habe hier auch auf die Angabe von Adressen verzichtet, da es egal ist, welche der folgenden Routinen ab der Adresse $FEFC80 stehen. Wichtig ist nur, daß die erste Routine bei $FEFC80 beginnt und zum Schluß aller Routinen ein Return to Sender (RTS) steht.
Die erste Routine liest die ST-Uhr aus der Tastatur und schreibt die Zeit und das Datum in die interne Uhr des ST (Listing 2).
<div class="textkasten bgblue" markdown=1>
Zielcode
3F3C0017 MOVE.W #23,-(SP) ; Gettime XBIOS 4E4E TRAP #14 ; aufrufen 548F ADDQ.L #2,SP ; Stack reparieren 3F00 MOVE.W D0, -(SP) ; LOW Byte = Zeit auf Stack schreiben 4840 SWAP D0 ; LOW Byte mit HIGH Byte tauschen 3F00 MOVE.W D0,-(SP) ; HIGH Byte = Datum auf Stack schreiben 3F3C002B MOVE.W #$2B,-(SP) ; SET DATE GEMDOS 4E41 TRAP #1 ; aufrufen 588F ADDQ.L #4,SP ; Stack reparieren 3F3C002D MOVE.W #$2D,-(SP) ; SET TIME GEMDOS 4E41 TRAP #1 ; aufrufen 588F ADDQ.L #4,SP ; Stack reparieren
Listing 2
</div>
Die zweite Routine setzt die Druckerkonfiguration gemäß Ihren Wünschen (Listing 3). Die Druckerkonfiguration ist ein Bitvektor mit folgender Bedeutung: (siehe Bsp. 2)
<div class="textkasten bgblue" markdown=1>
Bitnummer | 0 | 1
--------- | ----- | ----------
0 | Matrixdrucker | Typenraddrucker
1 | Monochromdrucker | Farbdrucker
2 | Ataridrucker | Epsondrucker (960 DPI)
3 | Test-Modus | Qualitäts-Modus
4 | Centronics-Port | RS232-Port
5 | Endlospapier | Einzelblatt
6,7 | | reserviert
Beispiel 2
</div>
Wenn Sie also den zum Anfang genannten Fehler bei der Hardcopy-Funktion beheben wollen, so müssen sie nur Bit 2 auf 1 setzen, d.h. der Vektor hat den Wert %00000100 = $04. Wollen Sie Ihren Drucker zusätzlich an der RS232 betreiben, so muß außerdem Bit 4 auf 1 gesetzt sein, und Sie erhalten den Wert %00010I00 = $14. Diesen Wert könnte man nun über die XBIOS Funktion 33 dem Rechner übergeben, es ist jedoch kürzer, den Wert gleich an die entsprechende Stelle im RAM zu schreiben.
<div class="textkasten bgblue" markdown=1>
Zielcode
31FC00**0E4A MOVE.W #VEKTOR,$0E4A ; Vektor ins RAM schreiben
Anstelle der Sternchen ** muß der Hexwert des Bitvektors stehen z.B. 04 oder 14 gemäß obigen Beispielen
Listing 3
</div>
Die dritte Routine ermöglicht Ihnen die Baudrate und den Handshake-Modus der RS 232 zu setzen (Listing 4). Hierbei müssen zwei Parameter beachtet werden: (siehe Bsp. 3)
<div class="textkasten bgblue" markdown=1>
Zielcode 3F3CFFFF MOVE.W #-1,-(SP) ; Diese Werte bleiben 3F3CFFFF MOVE.W #-1,-(SP) ; auf -1 , sonst werden 3F3CFFFF MOVE.W #-1,-(SP) ; die MFP-Register 3F3CFFFF MOVE.W #-1,-(SP) ; verändert . 3F3C00** MOVE.W #shake,-(SP) ; ** = Handshake Parameter shake 3F3C00** MOVE.W #baud,-(SP) ; ** = Baudraten Parameter baud 3F3C000F MOVE.W #15,-(SP) ; XBIOS-Routine 4E4E TRAP #14 ; aufrufen DFFC0000000E ADD.L #14,SP ; Stack reparieren
Listing 4
</div>
Folgendes Beispiel stellt Handshake auf XON/XOFF und Baudrate auf 300 Baud (Listing 5):
Wenn Sie wollen, können Sie alle drei Routinen hintereinander hängen. Die Reihenfolge ist egal. Sie sollten jedoch das rechnerinterne DESKTOP.INF mit ändern, wenn Sie die RS232-Parameter oder die Druckerparameter durch eine der obigen Routinen geändert haben, da sonst das Control-bzw. RS232-Accessory diese Änderungen zunichte macht und wieder durch die Werte des rechnerinternen DESKTOP.INF ersetzt. Doch hierzu später mehr.
<div class="textkasten bgblue" markdown=1>
Zielcode 3F3CFFFF MOVE.W #-l,-(SP) 3F3CFFFF MOVE.W #-l,-(SP) 3F3CFFFF MOVE.W #-l,-(SP) 3F3CFFFF MOVE.W #-l,-(SP) 3F3C0001 MOVE.W #1,-(SP) ; XON/XOFF 3F3C0009 MOVE.W #9,-(SP) ; 300 Baud 3F3C000F MOVE.W #15,-(SP) 4E4E TRAP #14 DFFC0000000E ADD.L #14,SP
Listing 5
</div>
# Wichtig: Der letzte Befehl muß RTS sein!
Zum Abschluß Ihrer letzten Routine muß der Code 4E75 stehen, sonst kommt Ihr Rechner nicht mehr in die Reset-Routine zurück.
Zielcode
4E75 RTS
Natürlich gibt es noch vieles, was man ändern könnte: z.B. die Farben, die ebenso im DESKTOP.INF definiert werden können, aber nur vom Kon-trollfeld gelesen werden. Leider setzen diese Unterprogramme Kenntnisse in Maschinensprache voraus und können nicht so einfach als Hexdump angegeben werden. Wer sich in Maschinensprache oder Assembler auskennt, kann dann natürlich auch kompliziertere Unterprogramme mit einbinden.
# Tips für Änderungen am TOS
Nun möchte ich noch einige Tips zum Bildschirmaufbau geben. Dazu gehören: Änderung des rechnerinternen DESKTOP.INF, Änderung der Icons (Disk-Station, Papierkorb, Ordner...) und Beseitigen des Flimmerns auf manchen Farbmonitoren (Umstellung von 50 Hz auf 60 Hz). Für die nun folgenden Änderungen brauchen Sie nicht die Reset-Routine zu verändern, Sie können das zuvor gesagte also getrost vergessen.
shake Bedeutung
$00 kein Handshake (Default)
$01 XON/XOFF
$02 RTS/CTS
$03 XON/XOFF und RTS/CTS
und:
baud | Baudrate | baud | Baudrate | baud | Baudrate
---- | -------- | ---- | -------- | ---- | --------
$00 | 19200 | $01 | 9600 | $02 | 4800
$03 | 3600 | $04 | 2400 | $05 | 2000
$06 | 1800 | $07 | 1200 | $08 | 600
$09 | 300 | $0A | 200 | $0B | 150
$0C | 134 | $0D | 110 | $0E | 75
$0F | 50 | | |
Beispiel 3
# Das DESKTOP.INF
Beginnen wir mit dem rechnerinternen DESKTOP.INF - es steht in den ROMs U3 und U6 im Speicherbereich $FD87BC - $FD89D4 incl., das sind genau 537 Bytes. Alle Änderungen, die Sie machen, dürfen die Länge von 537 Bytes nicht verändern d.h. Sie können nicht beliebig an das Vorhandene anhängen, sondern müssen im Original nicht benötigte Definitionen entfernen und statt dessen Ihre eigenen Definitionen einfügen. Das Original sieht dabei so aus (Abbildung 3):
<figure>
<img src="/stc1987/images/tosmod-3.png">
<figcaption>Abb.3: Das original DESKTOP.INF</figcaption>
</figure>
Über die Bedeutung der einzelnen Zeilen möchte ich mich hier nicht aus-lassen, bitte lesen Sie dazu in der ST Computer Nr. 10/86 auf den Seiten 39 bis 41 nach. Sicher werden Sie sich jetzt fragen: Wenn im Rechner doch eine Hard Disk und ein ROM-Modul definiert sind, warum werden diese Icons nicht dargestellt? Das liegt daran, daß der Rechner beim Einschalten prüft, ob eine Hard Disk bzw. ein ROM-Modul vorhanden ist, und nur dann das entsprechende Icon darstellt. Das ist zumindest für die Hard Disk richtig. Das Icon ROM-Modul hat sich bei mir noch nie gemeldet, egal ob im ROM-Port etwas steckte oder nicht. Wenn Sie keine Hard Disk und kein ROM-Modul haben, dann können Sie diese beiden Zeilen schon für eigene Definitionen verwenden. Wenn Ihnen nur ein paar Bytes fehlen, so können Sie auch die Namen ,DISKSTATION' und ,PAPIERKORB' kürzen, z.B. in ,DISK‘ und .MÜLL' das bringt auch Platz. Als weiteres können Sie die Zeile ,#G03FF *.APP@@' entfernen, da Files mit der Endung .APP nur sehr selten Vorkommen und dann meist aus anderen Programmen aufgerufen werden. Im Zweifelsfall müssen Sie eben auf die entsprechende Diskette (die mit dem .APP File) ein DESKTOP.INF schreiben, welches obige Zeile wieder enthält. In 99% aller Fälle wird diese Zeile aber nicht gebraucht. Auf keinen Fall dürfen Sie die Spaces löschen, die werden meistens benötigt! Wenn Sie im DESKTOP.INF etwas ändern wollen, gehen Sie am besten wie folgt vor: Stellen Sie alle Parameter so ein, wie Sie sie gerne nach dem Einschalten hätten. Öffnen Sie die Fenster, wenn Sie diese gleich nach dem Einschalten geöffnet haben wollen. Schieben Sie die Disk- und Papierkorbicons an die Stelle, wo Sie sie am liebsten haben. Wollen Sie eine zusätzliche Disksstation z.B. für eine RAM-Disk, so melden Sie diese mit an. Ist alles nach Ihren Wünschen, so speichern Sie das ganze mit 'ARBEIT SICHERN' im 'EXTRAS'-Menü ab. Jetzt können Sie an der Lange des Files 'DESKTOP.INF' auf der Diskette sehen, ob Sie Ihre Änderug im Betriebssystem unterkriegen Länge = 537 Bytes) oder nicht (Länge <> 537 Bytes). Ist das File länger, so müssen Sie etwas weglassen oder die Namen kürzen (s.o.). Ist das File zu kurz, so können Sie z.B. die Zeilen mit den Definitionen für die Hard Disk oder das ROM-Modul noch ergänzen. (Diese beiden Zeilen fehlen meist im File .DESKTOP.INF' wenn keine Hard Disk und kein ROM-Modul vorhanden sind, und deshalb wird dann das File zu kurz). Ist das File dann immer noch zu kurz, so kann man vor und hinter die Namen der Icons (z.B. HARD DISK) noch Spaces setzen, jedoch nicht mehr als 12 Zeichen zusammen. Wenn das alles geklappt hat und das File 537 Bytes lang ist, können Sie dann da DESKTOP.INF im ROM einfach durch Ihr DESKTOP.INF auf der Diskette ersetzen. Sie brauchen dann kein DESKTOP.INF mehr auf Ihren Disketten.
<figure>
<img src="/stc1987/images/tosmod-4.png">
<figcaption>Abb. 4: Beispiel für geänderte Icons</figcaption>
</figure>
# Ändern der Icons
Möglicherweise haben Sie Lust, Ihre Icons zu ändern - z.B. wie in Bild 4. Die Icons bestehen aus 2 Teilen: dem Vordergrund und dem Hintergrund. Beide Teile sind je 128 Bytes lang. Die Icons stehen ebenfalls im ROM-Paar U3-U6 und zwar von $FD8286 bis $FD8785 incl. Mit einem Icon Editor kann hier der Interessierte beliebige Bildchen einsetzen. Folgendes kleine GFA-Basic Programm zeigt Ihnen die Icons (Vorder- und Hintergrund) im ROM auf dem Bildschirm (Listing 6):
<div class="textkasten bgblue" markdown=1>
A=16614022 B=0 Do Inc B Dpoke 1017668+B80,Dpeek(A) Dpoke 1017670+B80,Dpeek(A+2) Add A,4 Exit If A>=16615302 Loop
Listing 6 (GFA BASIC)
</div>
# 50-60 Hz Umschaltung
Zum Schluß hier noch die Umstellung von 50 Hz auf 60 Hz, um Flimmern auf manchen Farbmonitoren zu unterdrücken. Dazu muß nur ein Byte im ROM U7 geändert werden. Dieses Byte steht im Speicher in der Adresse $FC0099:
Original ROMs 50 Hz Code : $06
60 Hz Code:$0E
C. Hahn