← ST-Computer 09 / 1987

Blitter TOS: Das neue TOS im Atari ST

Grundlagen

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