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