Blitter TOS: Das neue TOS im Atari ST

Allgemeines

Gleichzeitig mit der Auslieferung des MEGA ST hat Atari auch eine neue Version des Betriebssystems vorgestellt. Die sechs Roms aus dem MEGA ST enthalten in 192 KByte das komplette TOS. Um eine weite Verbreitung des neuen TOS zu ermöglichen, ist es auch im alten ST-Modell einsetzbar, da es automatisch erkennt, um welchen Rechner es sich handelt. Wir wollen näher darauf eingehen, in welchen Teilen das Betriebssystem Änderungen erfahren hat und welche Teile neu hinzugekommen sind.

Das TOS hat die Versionsnummer 1.2 mit Datum vom 22.4.1987. In den ausgelieferten Geräten in der Bundesrepublik befindet sich die deutsche Version, die sich durch einen modifizierten Tastaturtreiber und deutsche Texte von der amerikanischen Version unterscheidet. Es ist (fast) kompatibel zum alten TOS, d. h., alle sauber geschriebenen Programme sollten auch laufen.

Auf den ersten Blick gibt es folgende Neuerungen: Verbesserte Benutzerfreundlichkeit des Desktop, Beschleunigung der Grafik durch den Blitter, Verwaltung der residenten Uhr, Erweiterung von Betriebssystem-Funktionen, Beseitigung einiger Fehler, Optimierung in Bezug auf Programmlänge und Geschwindigkeit.

Dieser Artikel stützt sich im wesentlichen auf eigene Untersuchungen und nicht auf das von Atari herausgegebene Dokumentationsblättchen, da es Atari scheinbar nicht möglich ist, vollständige Informationen über das Betriebssystem zur Verfügung zu stellen.

Wir werden hauptsächlich über das BIOS und das GEMDOS berichten. Die Erweiterungen und Ergänzungen des BIOS (ausgenommen der Bildschirm-Treiber) sind (hoffentlich) vollständig beschrieben. Am GEMDOS wurden außer den bei „Uhrzeit und Datum“ und „Optimierungen“ beschriebenen Kleinigkeiten keine Änderungen vorgenommen. Am GEM und Desktop wurde erheblich mehr geändert, doch liegen hier erst wenige Erkenntnisse über die internen Veränderungen vor. Die detaillierteren Informationen richten sich hauptsächlich an solche Leser, die schon über Programmierkenntnisse des TOS verfügen. Zum vollen Verständnis der Erklärungen zur Speicher- und Programmverwaltung sei auf den Artikel „TOS intern“ im neuen ST-Sonderheft verwiesen.

Speicherbelegung

Das neue TOS reserviert sich vom RAM zusätzliche 10496 Byte für den eigenen Bedarf, wovon allein 10000 Byte für die Vergrößerung des internen GEMDOS-Speichers gebraucht werden. AES und Desktop benötigen 256 Bytes zusätzlich, der Rest wird für einige zusätzliche BlOS-Variablen für die neuen Fähigkeiten des TOS gebraucht. Im einzelnen zeigt die Systemvariable savptr ($4A2) nach dem Reset weiterhin auf $93A, die BIOS- und GEMDOS-Variablen gehen bis $88A2 (dies wurde auf $8900 aufgerundet) und die AES/Desktop-Variablen reichen bis $CA00.

Die Aufteilung der 192 kB ROM hat sich ebenfalls geändert. Um im ROM Platz für die neuen Blitter- und Uhrzeit-Routinen zu bekommen, mußte irgendwo gespart werden. Die naheliegenden Möglichkeiten wie Verwendung der „Short-Adressierung“ beim Zugriff auf die Systemvariablen und die Peripherie-Bausteine, das Streichen überflüssiger, d. h. nicht benutzter Routinen, Neuprogrammierung der verschwenderischen Hardcopy-Routine usw. wurden nicht genutzt. Einige BIOS-Routinen wurden ein klein wenig umgeschrieben, aber das macht nur wenige Bytes Ersparnis aus. BIOS und GEMDOS sind durch die kleinen Ergänzungen um einige Bytes länger geworden.

Doch woher stammt der benötigte Platz? Zum einen wurden der BIOS-Bildschirm-Treiber, Line A und das VDI gründlich überarbeitet. Dabei wurde teilweise optimaler programmiert, viele Routinen sind kaum wiederzuerkennen. Außerdem wird jetzt beim Zugriff auf die BIOS/Line A/VDI-Variablen platzsparender verfahren (Registerindirekt- statt Absolut-Adressierung), dies spart pro Zugriff immerhin 2 Bytes. Da in diesem Teil die sehr langen Blitter-Routinen untergebracht sind, sind Line A und VDI trotz der Optimierungsmaßnahmen noch 4,4 kB länger geworden. Erstaunlicherweise wurden im AES/Desktop ca. 3,6 kB eingespart. Wie das erreicht wurde, ist noch unbekannt. Hier wurden aber offensichtlich ebenfalls größere Änderungen vorgenommen, wie man an den sichtbaren Auswirkungen sieht.

Optimierungen

Neben der Verkürzung des TOS wurden auch einige zeitliche Optimierungen vorgenommen:

Das Löschen des Speichers beim Einschalten des Rechners wurde um 19 % beschleunigt, bei 4 MB dauert dies aber immer noch ca. 1,7 Sekunden.

Beim Laden eines Programms wird der restliche freie Speicher gelöscht. Dies war sehr langsam, aber die dadurch entstandene Pause von 1,9 s (bei einem „leeren“ ST) fiel wegen der Nachlaufzeit der Floppy nicht so auf. Bei 4 MB-Rechnern traten allerdings unangenehm lange Pausen beim Starten eines Programms auf. Das TOS hat jetzt eine sehr schnelle, 6 mal schnellere Speicher-Löschroutine, so daß die Zeit für das Speicherlöschen bei einem „leeren“ 4 MB-ST „nur“ 1,4 s dauert. Bei künftigen TOS-Versionen und „Super-STs“ mit noch mehr RAM sollte sich Atari allerdings überlegen, ob das Löschen des Speichers nicht ganz weggelassen werden sollte, da es eigentlich überflüssig ist (bei sauber geschriebenen Programmen); es reicht nämlich, nur das BSS-Segment des geladenen Programms zu löschen.

Das Bildschirm-Löschen des BIOS und VDI wurde mit der gleichen Routine beschleunigt (11,3 ms statt 18 ms).

Durch die Überarbeitung des Bildschirm-Treibers und des GEM sind die meisten Bildschirmausgaben schneller geworden.

Beseitigung von Fehlern

Mit der Erstellung einer neuen TOS-Version hatte Atari eine gute Gelegenheit, Fehler zu beseitigen. Dies wurde leider nur teilweise genutzt, es wurden nämlich nur einige Fehler im BIOS (und wohl auch im GEM) behoben. An das von Digital Research stammende GEMDOS haben sich die Programmierer von Atari wohl nicht herangetraut, denn dort wurde kein einziger Fehler beseitigt, obwohl es mehr als genug davon gibt. Auch im BIOS gibt es noch Fehler, die nicht beseitigt wurden.

Zum GEMDOS gibt es nur zu sagen, daß die Größe des internen GEMDOS-Speichers von 3000 auf 8000 Words erhöht wurde. Dies hat zur Folge, daß die „Fehler“ in der Speicherverwaltung und im Zusammenhang mit vielen Ordnern, die ja eigentlich gar keine Programmierfehler sind, sondern „nur“ aus Speicherplatzmangel entstehen, behoben sind.

Doch nun zu den Änderungen im BIOS:

In der Reset-Routine wurde die fehlerhafte Abfrage des PAL/NTSC-Flags aus dem TOS-Header korrigiert. Bei Farbdarstellung ist der Default-Wert für die Bildwiederholfrequenz bei der deutschen TOS-Version jetzt also 50 Hz.

Der Bildschirm wird jetzt zu Beginn des Speicherlöschens beim Einschalt-Reset gelöscht und nicht erst danach.

Die nicht benutzten Auto-Interrupt-Vektoren 1,3,5 und 7 waren bisher Undefiniert. Nun werden solche Interrupts, die eigentlich gar nicht auftreten können, ignoriert.

Wenn beim Lesen oder Schreiben ein Fehler auftritt, wird die Operation mehrmals wiederholt, bevor mit einer Fehlermeldung abgebrochen wird. Wenn eine ganze Gruppe von Sektoren hintereinander geschrieben oder gelesen wird, war bisher die Anzahl der Versuche auf die ganze Gruppe bezogen. Konnte also der erste Sektor z. B. erst nach dem dritten Versuch gelesen werden, so wurde beim zweiten Sektor schon nach dem ersten Versuch abgebrochen. Nun gibt es bei jedem Sektor drei Versuche. Die Korrektur dieses Fehlers hat weiterhin zur Folge, daß das BIOS den Floppy-Controller nun alle Sektoren einzeln lesen läßt und den „multiple read“-Befehl nicht mehr verwendet.

Beim Lesen eines Sektors von Diskette werden jetzt zusätzlich vom Floppy-Controller gemeldete CRC-Fehler erkannt, sie wurden bisher ignoriert.

Wenn bei einem Diskettenzugriff ein CRC-Fehler erkannt wurde, lieferte das BIOS die Default-Fehlermeldung, das sind -10 (Schreibfehler) oder -11 (Lesefehler), anstelle der eigentlich vorgesehenen Fehlermeldung -4 (CRC-Fehler). Umgekehrt lieferte es einen CRC-Fehler, wenn der Default-Fehler auftreten sollte. Dieser Fehler ist nun behoben.

Die RS232-Routinen waren wohl so fehlerhaft, daß sich kleine Korrekturen nicht mehr lohnten. Sie wurde nämlich komplett neu programmiert. Ob die RS232-Schnittstelle jetzt richtig funktioniert, konnte noch nicht eindeutig festgestellt werden.

Beim Reset wird der Tastaturprozessor nur noch mit der Byte-Folge $80, $01 statt $80, $01, $12, $1A initialisiert. Außerdem wird danach eine Pause von ca. 0,18 s eingelegt.

Beim Senden eines Bytes an den Tastaturprozessor wird ca. 5,2 ms lang gewartet, nachdem er als empfangsbereit erkannt wurde.

Die Systemvariable drvbits ($4C2) wird nun in der Reset-Routine gelöscht. Damit werden alle zusätzlichen Laufwerke wie RAM-Disks usw. beim Reset ordnungsgemäß abgemeldet.

;Änderungen des ATARI ST-ROMS vom 22.4.1987 (US-Version)
;in BIOS (außer Bildschirmtreiber) und GEMDOS
;
;ROM-Header
FC0000 BRA      $FC0030
FC0002 dc.b     1,2         ;Version 1.2
FC0004 dc.l     $FC0030     ;Reset-Adresse
FC0008 dc.l     $FC0000     ;Beginn TOS
FC00OC dc.l     $008900     ;Beginn freies RAM
FC0010 dc.l     $FC0030     ;Default-Shell
FC0014 dc.l     $FEFFF4     ;Adresse GEM-MAGIC
FC0018 dc.l     $04221987   ;Default-Systemdatum
FC001C dc.w     0           ;NTSC-Flag
FC001E dc.w     $0E96       ;Default-Systemdatum im GEMDOS-Format
FC0020 dc.l     $007e9c     ;Adresse GEMDOS-Variable ’mifl'
FC0024 dc.l     $000E61     ;Adresse BIOS-Tastaturvarieblen
FC0028 dc.l     $0087CE     ;Adresse GEMDOS-Variable 'act_pd'
FC002C dc.l     0           ;reserviert ?
;
FC0030 ...                  ;Beginn Reset-Routine: unverändert
FC009E BTST     #0,$FC001D(PC) ; PAL/NTSC-Flag richtig abgefragt
FC0154 MOVE.B   D6,$FF8001  ;unverändert
FC015A LEA      $008000,A7  ;SP setzen, wozu ?
FC0160 ...                  ;unverändert
FC01A2 MOVE.L   A4,$000008  ;unverändert
FC01A8 MOVE.L   D5,D0       ;Speicherobergrenze
FC01AA SUB.L    #$00008000,D0 ;- 32 KB
FC01B0 LSR.W    #8,D0       ;als Bildschirm-Adresse setzen
FC01B2 MOVE.B   D0,$FF8203
FC01B8 SWAP     D0
FC01BA MOVE.B   D0,$FF8201
FC01C0 MOVE.L   D5,A0       ;Speicher löschen (19% schneller-
FC01C2 MOVE.L   #$00000400,D4 ;0,43 statt 0.52 Sek. pro MB
FC01C8 MOVEQ    #$00,D0
FC01CA MOVEQ    #$00,D1
FC01CC MOVEQ    #$00,D2
FC01CE MOVEQ    #$00,D3
FC01D0 MOVEM.L  D0-D3,-(A0)
FC01D4 MOVEM.L  D0-D3,-(A0)
FC01D8 MOVEM.L  D0-D3,-(A0)
FC01DC MOVEM.L  D0-D3,-(A0)
FC01E0 CMPA.L   D4,A0
FC01E2 BNE      $FC01D0
FC01E4 SUBA.L   A5,A5                   ;unverändert
FC01E6 MOVE.B   D6,$0424(A5)
FC01EA MOVE.L   D5,$042E(A5)
FC01EE MOVE.L   #$752019F3,$0420(A5)
FC01F6 MOVE.L   #$237698AA,$043A(A5)
FC01FE MOVE.L   #$5555AAAA,$051A(A5)    ;neues memvalid, wozu ?
FC0206 ...                              ;unverändert
FC02FA MOVE.L   #$00FC0670, $046E (A5)  ;unverändert: swv_vec setz-z
FC0302 CLR.L    $0004C2                 ;alle Laufwerke abmelden
FC0308 BSR      $FC0EBA                 ;ROM-Header im RAM anleger.
FC030C ...                              ;unverändert
FC0340 MOVE.L   A3,$000014              ;unverändert: Division by Zero-Trap
FC0346 MOVEQ    #$06,D0                 ; Auto-Vektoren 1...7 auf F7E setzer.
FC0348 LEA      $0064(A5),A1
FC034C MOVE.L   #$00FC07CE,(A1)+
FC0352 DBF      D0,$FC034C
FC0356 ...                              ;unverändert
                                        ;nach vblqueue-Initialisierung 
FC03A4 LEA      $FC09AE,A0              ;BIOS-Device-Vektoren setzen
FC03AA MOVE.W   #$051E,A1 
FC03AE MOVEQ    #$1F,D0 
FC03B0 MOVE.L   (A0)+,(A1)+
FC03B2 DBF      D0,$FC03B0
FC03B6 BSR      $FC2408                 ;MFP init. (außer IKBD-Reset)
FC03BA MOVE.L   #$00FC053A,-(A7)        ;IKBD-Reset: $80,$01 senden
FC03C0 MOVE.W   #$0001,-(A7)            ;Mouse+Joystick disable fehlt
FC03C4 JSR      $FC2212
FC03CA ADDQ.L   #6,A7
FC03CC MOVE.L   #$00007FFF,D0           ;ca. 0,18 Sek. warten
FC03D2 BSR      $FC0556                 ;-> RTS
FC03D6 DBF      D0,$FC03D2
FC03DA MOVEQ    #$02,D0                 ;unverändert: Bildschirmauflösung setzen
FC03DC ...
FC0418 BSR      $FC0F1A                 ;Test ob Blitter vorhanden
FC041C JSR      $FCA99E                 ;Blitter-Vektoren und -Status init.
FC0422 JSR      $FCA914                 ;unverändert: Bildschirmausgabe init
FC0428 ...
FC045C BSR      $FC4A9E                 ;unverändert: GEMDOS init.
FC0460 MOVE.W   $FC001E,$008840         ;Systemzeit init.
FC046A BSR      $FC4BE8                 ;Systemzeit von Uhrenchip übernehmen
FC046E BSR      $FC053C                 ;unverändert: Floppy-Boot
FC0472 BSR      $FC0558                 ; DMA-Boot
FC0476 BSR      $FC0E56                 ; reset-residente Programme
FC047A TST.W    $000482                 ;
FC0480 BEQ      $FC04A0
                                        ;cmdload: Cursor einschalten fehlt 
FC0482 BSR      $FC0C4A                 ;Auto—Ordner ausführen
FC0486 MOVE.L   #$00FC0000,$0004F2      ;sysbase wieder auf ROM-Header
FC0490 PEA      $FC0537(PC)             ;unverändert
FC0494 PEA      $FC0537(PC)
FC0498 PEA      $FC0524(PC)
FC049C CLR.W    -(A7)
FC049E BRA      $FC0508
FC04A0 BSR      $FC0C4A
FC04A4 MOVE.L   #$00FC0000,$0004F2      ;sysbase wieder auf ROM-Header
FC04AE ...                              ;unverändert
                                        ;Strings bis 'GEM.PRG',0,0,0
FC053A dc.b     $80,$01                 ;String für IKBD-Reset
FC053C ...                              ;unverändert
;
;
;neue Routinen
;
;neue BIOS-Routine Gettime
FC0E96 LEA      $FC4C44,A3              ;für Uhrenchip
FC0E9C LEA      $FC1F52,A4              ;für IKBD (altes Gettime)
FC0EA2 BRA      $FC0EB0
;neue XBIOS-Routine Settime
FC0EA4 LEA      $FC4D02,A3              ;für Uhrenchip
FC0EAA LEA      $FC1F6C,A4              ;für IKBD (altes Settime)
FC0EB0 BSR      $FC4C0C                 ;Uhrenchip vorhanden ?
FC0EB4 BCC      $FC0EB8                 ;-> ja
FC0EB6 MOVE.L   A4,A3
FC0EB8 JMP      (A3)
;
;ROM-Header im RAM anlegen
FC0EBA LEA      $FC0000(PC),A0          ;48 Byte kopieren
FC0EBE LEA      $000940,A1
FC0EC4 MOVEQ    #$2F,D0
FC0EC6 MOVE.B   $00(A0,D0.W),$00(A1,D0.W)
FC0ECC DBF      D0,$FC0EC6
FC0ED0 MOVE.W   $FC0EEE(PC),$FFFA(A1)   ;JMP-Befehl vor Header-Kopie
FC0ED6 MOVE.L   $0004(A1),$FFFC(A1)     ;nach Reset-Adresse auf Header
FC0EDC MOVE.W   $FC0EF4(PC),(A1)        ;Branch auf JMP—Befehl an Header-Anfang
FC0EE0 MOVE.W   $001E(A1),$001C(A1)     ;Default-Datum nach PAL-Flag
FC0EE6 MOVE.L   A1,$0004F2              ;sysbase auf Header-Kopie setzen
FC0EEC RTS
FC0EEE JMP $000000
FC0EF4 BRA $FC0EEE

Neue TOS-Funktionen

Das BIOS wurde um eine Funktion für den Blitter erweitert. Der Funktionsumfang von GEMDOS, VDI und AES wurde nicht vergrößert, insbesondere die im alten TOS nicht implementierten VDI-Funktionen des PC-DOS-GEM fehlen weiterhin. Allerdings ist es nicht auszuschließen, daß einzelne Funktionen erweitert wurden, ähnlich wie die Formatier-Funktion des BIOS (s. u.).

Die von der GEMDOS-Funktion Sversion gelieferte GEMDOS-Versionsnummer ist weiterhin $1300.

Der Blitter

Der Blitter ist bekanntlich ein in die MEGA-STs eingebauter neuer Custom-Chip, der die Grafik erheblich beschleunigt. Die Treiber-Routinen sind in den Grafik-Kern des ST (Line A und BIOS-Bildschirm-Treiber) integriert, so daß alle Programme, die ihre Grafik durch die vorgesehenen TOS-Funktionen (die letztlich alle auf den Grafik-Kern zurückgreifen) auf den Bildschirm bringen, automatisch in den „Genuß“ des Blitters kommen. Programme, die die Grafik ohne Unterstützung durch das TOS erzeugen, werden also durch den Blitter nicht beschleunigt.

Der Blitter belegt die Adressen ab $FF8A00. Da bei den alten STs ein Zugriff auf diesen Bereich zu einem Bus Error führt, kann das TOS erkennen, ob ein Blitter eingebaut ist, indem es Blitter-Register ausliest und sich merkt, ob ein Bus Error auftritt.

Intern hat das TOS eine Liste mit 10 Sprungvektoren für 10 elementare Grafik-Funktionen wie z. B. „ein Zeichen auf dem Bildschirm ausgeben“. Jede BIOS-Bildschirm-Treiber- oder Line A-Funktion führt nun indirekte Sprünge über diese 10 Sprungvektoren aus, wann immer eine elementare Grafik-Funktion gebraucht wird. Die 10 Funktionen existieren je zweimal, einmal mit und einmal ohne Verwendung des Blitters. So kann durch einfaches Auswechseln der Sprungliste der Blitter aktiviert und deaktiviert werden.

Um den Grafik-Kern von Programmen aus „umzuschalten“, wurde die XBIOS-Funktion 64 namens Blitmode implementiert. Ihr wird ein Word-Parameter übergeben, der folgende Werte annehmen darf:

Parameter = -1:
Die Funktion gibt den Blitter-Status zurück. Ein gesetztes Bit 1 gibt an, daß überhaupt ein Blitter vorhanden ist, es sich also um einen MEGA-ST handelt. Ein gesetztes Bit 0 zeigt an, daß der Blitter auch tatsächlich aktiv ist, d. h. vom Grafik-Kern des TOS benutzt wird. Bei den alten STs sind Bit 0 und 1 dementsprechend immer Null. Die anderen Bits haben keine Bedeutung.

Parameter = 0:
Der Blitter wird ab jetzt nicht mehr vom TOS benutzt. Außerdem gibt die Funktion den Blitter-Status vor dem Abschalten des Blitters zurück.

Parameter = 1:
Der Blitter wird aktiviert. Falls gar keiner vorhanden ist, ändert sich natürlich nichts. Hier wird ebenfalls der Blitter-Status vor der Aktivierung zurückgeliefert.

Das BIOS schaltet den Blitter übrigens beim Reset in jedem Fall ab.

Es bleibt zu hoffen, daß diese neue Funktion möglichst bald in die Bin-dings der Compiler aufgenommen wird.

Uhrzeit und Datum

Bekanntlich sind die neuen Mega-Ataris mit einer residenten Uhr ausgerüstet. Dabei handelt es sich aber nicht um die Uhr des Tastaturprozessors, sondern Atari hat einen eigenen Uhrenchip eingebaut.

;XBIOS-Routine #64 (Blitter an-/ausschalten)
;Parameter: neuer Blitter-Status oder -1 für Abfrage
FC0EF6 BSR      $FC0F1A             ;Test ob Blitter vorhanden
FC0EF8 MOVE.W   D0,D4
FC0EFA MOVE.W   D0,D5
FC0EFC LSR.W    #1,D5               ;Blitter-vorhanden-Flag nach Bit 0
FC0EFE OR.W     #$FFFE,D5           ;Maske für ‘Blitter an'
FC0F02 BSR      $FC4E06             ;Blitter-Status holen
FC0F06 MOVE.W   D0,D3               ;und merken
FC0F08 MOVE.W   $0004(A7),D0        ;Parameter
FC0FOC BMI      $FC0F16             ;-> Blitter-Status zurückgeben
FC0FOE AND.W    D5,D0               ;Blitter an nur wenn Blitter vorhanden
FC0F10 OR.W     D4,D0               ;Blitter-vorhanden-Flag dazu
FC0F12 BSR      $FC4DDE             ;Blitter-Vektoren setzen
FC0F16 MOVE.W   D3,D0               ;Status zurückgeben
FC0F18 RTS
;
;Test ob Blitter vorhanden 
FC0F1A MOVE.W   SR,D1
FC0F1C MOVE.W   #$0000,D0           ;Status: kein Blitter
FC0F20 SUBA.L   A0,A0
FC0F22 MOVE.L   A7,A2
FC0F24 ORI.W    #$0700,SR           ;IPL 7
FC0F28 MOVE.L   $0008(A0),A1
FC0F2C MOVE.L   #$00FC0F3A,$0008(A0) ;Bus Error abfangen
FC0F34 TST.W    $8A00(A0)           ;versuchter Zugriff auf Blitter
FC0F38 MOVEQ    #$02,D0             ;ok: Status: Blitter vorhanden
FC0F3A MOVE.L   A1,$0008(A0)        ;Zustand vor Bus Error wieder hersteilen
FC0F3E MOVE.W   D1,SR
FC0F40 MOVE.L   A2,A7
FC0F42 RTS

geänderte BIOS-Routinen

FC0688 Test auf gültige Speicherkonfiguration
        zusätzlich memvalid #3 bei $51A abfragen 
FC0984 BIOS-Device-Funktionen
        Sprung über neue RAM-Vektoren 
FC1782 floprd
        Sektoren einzeln von FDC lesen (kein multiple read mehr)
        3 Versuche bei jedem Sektor statt für ganze Sektorgruppe zusätzlich 
        führt Bit2 des FDC-SR zu Fehler (wozu das?)
FC1858 flopwr
        3 Versuche bei jedem Sektor statt für ganze Sektorgruppe 
FC1916 flopfmt + fmtrack
        Bei interleave * -1 ist 'filler' Zeiger auf Liste mit 
        Sektornummern (beliebige Sektornummern möglich)
FC1C48 floplock
        Berechnung von 'edma' aus 'cdma' und 'ccount* fehlt 
FC1F08 Diskflags 
        fehlen
FC1FDA Binär<->BCD-Konvertierungen für IKBD-Zeit-Umwandlungen kürzer programmmiert 
FC2150 RS232-Ein-/Ausgabe
        komplett neu programmiert 
FC21EE ikbdwc (Byte an IKBD senden)
        Pause von ca. 5,2 ms zwischen 'ACIA bereit' und 'Byte senden*
FC2408 initmfp
        CTS auf High setzen
        IKBD-Initialisierung fehlt (s. Reset)
FC26E6 bselect
        kürzer programmiert 
FC26F6 RS232
        komplett neu programmiert 
FC290E rsconf
        geändert

Er liegt an den ungeraden Adressen ab $FFFC21. Bei den alten STs ergibt ein Zugriff keinen Bus Error, sondern $FF. Das TOS erkennt das Vorhandensein des Uhrenchips, indem es Register auf bestimmte Werte überprüft.

Diese Hardware-Uhr muß nun mit der softwaremäßigen, interruptgesteuerten Systemuhr des GEMDOS, die für die in Diskettenverzeichnissen eingetragene und von Programmen angezeigte Zeit zuständig ist, ständig übereinstimmen.

Beim Reset wird die Systemuhr nach der Hardware-Uhr gestellt, falls sie vorhanden ist.

Wenn die Systemuhr mit den GEMDOS-Funktionen Tsettime oder Tsetdate gestellt wird, wird die Hardware-Uhr ebenfalls gestellt. Bei den alten STs wird dabei die Uhr des Tastaturprozessors auf die neue Zeit gesetzt. Dies war beim alten TOS nicht der Fall, dort wurde die Tastaturprozessor-Uhr von GEMDOS überhaupt nicht benutzt. Diese kleine Inkompatibilität wird allerdings bei bestehenden Programmen kaum etwas ausmachen.

Tgettime und Tgetdate lesen in jedem Fall die Systemuhr aus. Die XBIOS-Funktion #22 (Settime) bzw. #23 (Gettime) setzt bzw. liest bei den MEGA-STs nun die neue Hardware-Uhr, bei den alten STs wird wie beim alten TOS die Tastaturprozessor-Uhr angesprochen. Bei-den neuen STs kann die Tastaturprozessor-Uhr also gar nicht mehr benutzt werden, außer natürlich mit direkten Kommandos an den Tastaturprozessor. Bei den alten STs hat Settime beim alten und neuen TOS keinerlei Einfluß auf die Systemuhr, bei den neuen STs wird bei jedem Programmende (Pterm) die Hardware-Uhr in die Systemuhr übertragen. Programme, die die über das XBIOS angesprochene Uhr bisher für eigene Zwecke gebraucht haben, verstellen also bei den neuen STs die Systemuhr!

Erweiterte Disk-Formatier-Funktion

Die XBIOS-Funktion 10 (Spur formatieren) wurde erweitert. Die folgende neue Aufrufmöglichkeit ist:

Flopfmt (puffer, sectlist, dev, spt, track, seite, -1, magic, virgin)

Die Parameter puffer, dev, spt, track, Seite, magic, virgin haben die übliche Bedeutung. Der „Interleaving-Faktor“ -1 führt dazu, daß ’sectlist’ (nomalerweise unbenutzt) als Zeiger auf eine Tabelle mit soviel Sektornummern (words), wie ’spt’ angibt, interpretiert wird. Die Spur wird aus den in dieser Fiste angegebenen Sektoren in der spezifizierten Reihenfolge zusammengesetzt. Man kann also die Nummern und Reihenfolge der Sektoren vollkommen frei wählen. Wenn die Diskette später mit den normalen BIOS-Funktionen gelesen werden soll, muß man natürlich darauf achten, daß jede Sektornummer von 1 bis spt genau einmal vorkommt.

Erweiterter TOS-Header

Der TOS-Header, der gleich am Anfang des TOS liegt, enthält 4 zusätzliche Adressen, so daß der Rest des TOS um 16 Byte verschoben ist. Er sieht nun folgendermaßen aus:

FC0000 BRA  $FC0030     ;Sprung auf Beginn Reset-Routine
FC0002 dc.b 1,2         ;Version 1.2
FC0004 dc.l $FC0030     ;Reset-Adresse
FC0008 dc.l $FC0000     ;Beginn des TOS
FC00OC dc.l $008900     ;Beginn freies RAM
FC0010 dc.l $FC0030     ;Default-Shell (falls kein GEM da)
FC0014 dc.l $FEFFF4     ;Adresse des GEM-Magic 
FC0018 dc.l $04221987   ;Default-Systemdatum 22.4.1987 
FC001C dc.w 0           ;NTSC-Flag (beim amerikanischen TOS)
FC001E dc.w $0E96       ;Default-Systemdatum im GEMDOS-Format 
FC0020 dc.l $007E9C     ;Zeiger auf den internen Speicher des GEMDOS’mifl

Bei Version 1.0 sind Schwierigkeiten mit dem internen GEMDOS-Speicher aufgetreten, da nur 6000 Bytes dafür reserviert waren. Deshalb ist das Problem mit Festplatten aufgetreten, wenn diese sehr viele Ordner enthielten, und auch die Funktion Malloc konnte nur sehr sparsam benutzt werden, da jedes Anlegen eines Speicherbereichs einen Eintrag in der internen GEMDOS-Speicherliste benötigt, die schnell überfüllt war. Beim TOS 1.2 besitzt der GEMDOS-Speicher nun eine Größe von 16000 Bytes, was für normale Anwendungen ausreichend sein sollte.

’mifl’ dient der Erweiterung des internen GEMDOS-Speicherbereichs, falls 8000 Words immer noch nicht genug sein sollten. Interessanter wäre die Adresse des Memory Parameter Block gewesen, da dann Programme die legale Möglichkeit gehabt hätten, die Speicherverwaltung zu manipulieren.

FC0024 dc.l $000E61 Adresse der BIOS-Variablen 'kb_shift'

’kb__shift’ (Byte) enthält den Status der Sondertasten der Tastatur, wie ihn auch die BIOS-Funktion 11 (Kbshift) liefert. Damit ist es möglich, eigene Tastatur-Interrupt-Routinen zu schreiben, die den Tasten-Status benötigen und ändern wollen. Direkt im Anschluß an ’kb_shift’ liegen noch weitere Tastatur-Variablen, allerdings ist nicht bekannt, ob deren relative Adressen zu ’kb__shift’ von Atari für spätere TOS-Versionen garantiert sind. Deswegen werden sie hier nicht angegeben.

FC0028 dc.l $0087CE Adresse der GEMDOS-Variablen ’act_pd’

’act_pd’ ist der Zeiger auf den Prozeß-Deskriptor des aktiven Prozesses. Hiermit bieten sich neue Möglichkeiten, Multi-Tasking zu realisieren, da GEM-DOS dies prinzipiell ermöglicht. Beim Umschalten zwischen zwei Programmen müßte ’act_pd’ immer auf den aktiven Prozeß gesetzt werden, dann würden sich alle GEMDOS-Kommandos für Speicherverwaltung, Diskettenoperationen usw. automatisch immer auf den richtigen Prozeß beziehen! Verschiedene Programme können gleichzeitig Speicherbereiche belegen, eigene Dateipfade und Dateien haben usw. Nur die Zeichen-orientierte Peripherie wäre allen gemeinsam. Dann müßte man nur noch GEM die gleichzeitige Verwaltung mehrerer Haupt-Applikationen beibringen...

FC002C dc.l 0 ;reserviert?

Beim Reset wird eine Kopie des TOS-Headers im RAM angelegt. Diese Kopie wird so modifiziert, daß beim Sprung auf ihren Beginn ein Reset im ROM ausgeführt wird, genau wie wenn man den TOS-Header im ROM direkt anspringt. Dies wird erreicht, indem der BRA-Befehl des Headers auf einen JMP-nach-Reset-Befehl (unmittelbar vor dem Header) führt. Weiterhin wird das PAL/NTSC-Flag (relative Adresse $1C) mit dem Default-Systemdatum (relative Adresse $1E) überschrieben, es fragt sich nur, wozu. Außerdem sind nach dem Header noch 16 Bytes freigelassen worden.

Die BIOS-Variablen sysbase ($4F2) wird ebenfalls beim Reset auf diese TOS-Header-Kopie gesetzt. Damit haben Module im EPROM-Port die Möglichkeit, den TOS-Header zu verändern und anschließend in die normale Reset-Routine zurückzuspringen. In der Reset-Routine werden nämlich verschiedene Daten aus dem Header benutzt. Es ist allerdings zwecklos, die drei neuen Variablen-Adressen zu manipulieren, da BIOS und GEMDOS direkt auf die durch sie bezeichneten Variablen zugreifen. Erst nach dem Abarbeiten des AUTO-Ordners und vor dem Start des GEM oder eines C OMMAND.PRG mittels der cmdload-Option des Bootsektors, wird sysbase wieder auf den TOS-Header im ROM gesetzt. Somit haben also auch Programme im AUTO-Ordner die Möglichkeit, den TOS-Header zu manipulieren, es fragt sich nur, was das an dieser Stelle noch nutzt. Weiterhin wird vor dem Laden eines COMMAND.PRG der Cursor nicht mehr eingeschaltet.

Neue Systemvariablen

Es sind einige neue „legale“ Systemvariablen hinzugekommen, die ohne weiteres benutzt werden dürfen, da deren Adressen auch bei zukünftigen TOS-Versionen gleich bleiben.

$51A ist ein dritter ’memvalid’-Wert. Er wird genau wie ’memvalid’ ($420) und ’memval2’ ($43A) beim Ermitteln der Speicherkonfiguration gesetzt (hier auf $5555AAAA). Wenn beim Reset alle drei Variablen ihren festen „Magie-Wert“ noch enthalten, wird nicht mehr der ganze Speicher gelöscht, und die Speicherkonfiguration wird übernommen. Wozu diese dritte Variable gut sein soll, ist unklar.

Die BIOS-Funktionen Bconstat, Bconin, Bcostat und Bconout werden jetzt über indirekte Sprünge aufgerufen. Die Sprungvektoren liegen für die vier Funktionen in der obigen Reihenfolge ab $51E, $53E, $55E bzw. $57E. Dabei sind bei jeder Funktion 8 (statt bisher 6) Geräte erlaubt. So springt das BIOS z. B. bei einem Bconin (2) über den Vektor $546. Die neuen Geräte 6 und 7 tun nichts, denn die Vektoren zeigen auf Leer-Funktionen. Durch die Einführung dieser Vektoren erleichtert sich z. B. die Programmierung von Drucker-Spoolern o. ä. Außerdem besteht die Möglichkeit, neue Geräte in eigenen Programmen zu definieren.

Änderungen des Desktop (AES)

Auf dem MEGA ST mit Blitter besitzt der DESKTOP einen Menüeintrag, mit dem der Blitter wahlweise ein-oder ausgeschaltet werden kann. Beim normalen Atari sieht der DESKTOP bis auf die Copyrightzeile genauso aus wie beim TOS 1.0. Die Änderungen, die wir bisher festgestellt haben, sind folgende:

Beim Kopieren eines Files auf gleicher Ebene in sich selbst (klingt kompliziert, passiert aber leicht, wenn man ein ICON ein bißchen bewegt und wieder losläßt, so daß der DESKTOP kopieren will) war bisher das File zerstört. Bei der neuen Version bleibt das File erhalten.

Die Pfeile, mit denen die Slider bewegt werden, besitzen jetzt eine automatische Wiederholfunktion, wenn man mit der Maus auf sie zeigt und den linken Mausknopf gedrückt hält. Diese Änderung ist auch bei anderen Programmen, die mit Fenstern arbeiten, aktiv, so daß wahrscheinlich der Eventmanager des AES jetzt etwas anders funktioniert.

Die witzigen Fehler, wie Aufhängen des Event Managers, wenn man ein Icon schnell mit Doppelklick in die Menüzeile schiebt oder die Umschaltung in den vergrößerten 6A6 Font bei Benutzung eines angemeldeten Laufwerks mit der Kennung (Paragraph) sind noch mit in die neue Version gewandert.

Verbessert wurde wahrscheinlich die Auswertung der Rechteckliste beim Redraw. Der Redraw erfolgt im allgemeinen flüssiger als bisher.

Die Benutzung eines Unterstrichs ist jetzt bei allen Dialogboxen ohne Probleme möglich. Je nachdem, wie ein Edit-Feld definiert war, führte es bisher zum Absturz.

Ein Wermutstropfen zum Schluß: Beim Arbeiten mit dem neuen TOS wurde ein selbst geschriebener Harddisktreiber verwendet (der von Atari fragt zwecks Erweiterung der Speicherliste das TOS-Datum ab). Innerhalb dieser Zeit wurde dreimal das Inhaltsverzeichnis einer Partition mit dem Inhaltsverzeichnis einer normalen Diskette aus dem Laufwerk A: überschrieben. Die Ursache ist bisher noch nicht geklärt, die Wirkung war die Zerstörung einer Woche Arbeit. Bleibt zu hoffen, daß dies nicht an dem neuen TOS liegt...

Alex Esser/Oliver Joppich (a little bit)

FC2ED8 RS232-Routinen
        fehlen teilweise

;neue Routinen 
;schnelles Speicherlöschen
;Aufruf: GEMDOS-pload, VDI-clear Workstation 
FC4B7C MOVE.L   $0004(A7),A0        ;Anfangsadresse
FC4B80 MOVE.L   $0008(A7),A1        ;Endadresse
FC4B84 MOVEM.L  D3-D7/A3,-(A7)
FC4B88 MOVEQ    #$00,D1             ;8 Register löschen
FC4B8A MOVEQ    #$00,D2
FC4B8C MOVEQ    #$00,D3
FC4B8E MOVEQ    #$00,D4
FC4B90 MOVEQ    #$00,D5
FC4B92 MOVEQ    #$00,D6
FC4B94 MOVEQ    #$00,D7
FC4B96 MOVE.W   D7,A3               ;wird auf L erweitert
FC4B98 MOVE.L   A0,D0
FC4B9A BTST     #0,D0
FC4B9E BEQ      $FC4BA2             ;-> gerade Startadresse
FC4BA0 MOVE.B   D1,(A0)+            ;1 Byte löschen, jetzt gerade Adresse
FC4BA2 MOVE.L   A1,D0
FC4BA4 SUB.L    A0,D0               ;Länge
FC4BA6 AND.L    #$FFFFFF00,D0       ;ganze Pages
FC4BAC BEQ      $FC4BDA             ;-> weniger als 1 Page
FC4BAE LEA      $00(A0,D0.L),A0     ;Ende des Bereichs ganzer Pages
FC4BB2 MOVE.L   A0,A2
FC4BB4 LSR.L    #8,D0
FC4BB6 MOVEM.L  D1-D7/A3,-(A2)      ;256 Byte löschen
FC4BBA MOVEM.L  D1-D7/A3,-(A2)
FC4BBE MOVEM.L  D1-D7/A3,-(A2)
FC4BC2 MOVEM.L  D1-D7/A3,-(A2)
FC4BC6 MOVEM.L  D1-D7/A3,-(A2)
FC4BCA MOVEM.L  D1-D7/A3,-(A2)
FC4BCE MOVEM.L  D1-D7/A3,-(A2)
FC4BD2 MOVEM.L  D1-D7/A3,-(A2)
FC4BD6 SUBQ.L   #1,D0
FC4BD8 BNE      $FC4BB6             ;-> nächste Page
FC4BDA CMPA.L   A0,A1               ;Rest bis Bereichsanfang löschen
FC4BDC BEQ      $FC4BE2             ;-> fertig
FC4BDE MOVE.B   D1,(A0)+
FC4BE0 BRA      $FC4BDA
FC4BE2 MOVEM.L  (A7)+,D3-D7/A3
FC4BE6 RTS
;
;Default-Systemzeit aus Uhrenchip übernehmen 
;Aufruf: Reset-Routine
FC4BE8 BSR      $FC4C0C             ;Uhrencip vorhanden ?
FC4BEA BCS      $FC4C08             ;-> nein: fertig
FC4BEC BSR      $FC4C44             ;Zeit aus Uhrenchip lesen
FC4BEE CMP.L    #$FFFFFFFF,D0
FC4BF4 BEQ      $FC4C08             ;-> Fehler: fertig
FC4BF6 MOVE.W   D0,$0075B0          ;Lower Word nach System-Uhrzeit
FC4BFC SWAP     D0
FC4BFE MOVE.W   D0,$008840          ;Upper Word nach System-Datum
FC4C04 MOVEQ    #$00,D0             ;OK
FC4C06 RTS
FC4C08 MOVEQ    #$FF,D0             ;Fehler
FC4C0A RTS
;
;Test ob Uhrenchip vorhanden
FC4C0C MOVE.W   #$FC20,A0           ;Adresse Uhrenchip
FC4C10 MOVE.B   #$09,$001B(A0)
FC4C16 MOVE.W   #$0A05,D0
FC4C1A MOVEP.W  D0,$0005(A0)
FC4C1E MOVEP.W  $0005(A0),D1


Aus: ST-Computer 09 / 1987, Seite 116

Links

Copyright-Bestimmungen: siehe Über diese Seite