HomeBIOSEinklinken in den Reset-VektorDie Systemvektoren

3.4 Die Systemvariablen

Da die Systemvariablen und -vektoren die unterste Schicht des Betriebssystems darstellen, sollten Anwenderprogramme nur wenn unbedingt notwendig auf diese zugreifen. Konkret:

Die folgende Liste enthält alle Systemvariablen des TOS:

Variable     Adresse Beschreibung
_autopath    LONG 0x4ca Zeiger auf Zugriffspfad für den AUTO-Ordner (unbenutzt und nicht offiziell dokumentiert).
_bootdev     WORD 0x446 enthält normalerweise die Nummer des Laufwerks, von dem gebootet worden ist. Außerdem wird diese Variable noch beim Booten benutzt, um das Bootlaufwerk zu wählen (das klappt i.a. aber nur dann, wenn kein Festplattentreiber gebootet wird). Wenn man also die Variable auf 1 setzt, keine autobootfähige Festplatte angeschlossen hat und einen Reset auslöst, wird von Laufwerk B gebootet!
_bufl        LONG 0x4b2 zwei Zeiger auf GEMDOS-Pufferlisten.
_cmdload     WORD 0x482 wenn dieses Register nicht 0 ist, wird versucht, anstelle von GEM das Programm COMMAND.PRG zu starten. Das Register kann durch ein Programm in einem ausführbaren Bootsektor gesetzt werden.
_dskbufp     LONG 0x4c6 Zeiger auf einen 1024 Bytes großen Puffer zum Lesen und Schreiben auf Disketten oder Festplatten (z.B. beim Bootversuch). Der Zeiger wird auch vom VDI benutzt.
_drvbits     LONG 0x4c2 Bit-Tabelle über die angemeldeten Laufwerke des BIOS. Es gilt:

Bit-0 = Laufwerk A
Bit-1 = Laufwerk B
Bit-2 = Laufwerk C (usw.)

Die Variable wird in TOS 1.00 beim Reset nicht gelöscht. Eigene Treiber sollten daher bei einem Reset die selbst eingetragenen Bits löschen; anderenfalls kann es passieren, daß Laufwerkskennungen plötzlich "verschwinden".
_frclock     LONG 0x466 analog _vbclock, mit dem Unterschied, daß die Zählung nicht durch vblsem angehalten wird.
_fverify     WORD 0x444 legt fest, ob das BIOS beim Schreiben auf Disketten per Rwabs einen Verify durchführen soll, oder nicht. Dabei gilt:

0 = kein Verify

Im Normalfall ist das Verify eingeschaltet.
_hz_200      LONG 0x4ba bisherige Anzahl der 200-Hz Interrupts.
_longframe   WORD 0x59e Wenn dieses Flag nicht null ist, dann ist eine CPU mit langen Stackframes (also kein 68000er) installiert. Dieser Wert ist z.B. dann von Interesse, wenn eine Routine in einen Exception-Vektor eingeklinkt werden soll, und die zu untersuchenden Werte auf dem Stack übergeben werden. Falls diese Variable den Wert 0 besitzt findet man die Parameter bei Offset 6, anderenfalls bei Offset 8.
_md          LONG 0x49e offiziell nicht dokumentiert, und wohl auch unbenutzt.
_membot      LONG 0x432 Unteres Ende des unter GEMDOS freien ST-kompatiblen Speichers (also der Anfang der ursprünglichen TPA). Die Variable wird von der BIOS-Funktion Getmpb verwendet.
_memtop      LONG 0x436 Analog zu _membot das Ende des freien ST-kompatiblen Speicherbereiches.
_nflops      WORD 0x4a6 Zahl der angeschlossenen Diskettenlaufwerke
_p_cookies   LONG 0x5a0 Zeiger auf den Cookie-Jar.
_prtabt      WORD 0x4f0 Flag für Abbruch des Druckvorgangs. Es ist jedoch ungenutzt.
_shell_p     LONG 0x4f6 Dieser Zeiger wird vom ROM nicht genutzt, d.h. Programme die ihn selbst benutzen, müssen ihn im Falle eines Resets und bei Programm-Ende selbst löschen. Normalerweise wird _shell_p von UNIX-ählichen Shells gesetzt, und zeigt auf eine Routine, die eine Kommandozeile abarbeitet. Die Adresse der Zeichenkette wird auf dem Stack (4(sp)) übergeben, das Ergebnis der Operation erhält man in Register D0.
_sysbase     LONG 0x4f2 zeigt auf eine OSHEADER-Struktur.
_timr_ms     WORD 0x442 Zeit in Millisekunden, die normalerweise zwischen zwei Aufrufen des System-Timers vergeht. Dieser Wert wird auch von der BIOS-Funktion Tickcal zurückgeliefert.
_v_bas_ad    LONG 0x44e Zeiger auf den Anfang des Bildschirmspeicher, der beim ST auf einer 256-Byte-Grenze beginnen muss. Beim STE und TT ist es eine 2- bzw. 8-Byte Grenze.
_vbl_list    LONG 0x4ce ursprüngliche Liste der Vertical-Blank Routinen. Man sollte immer nur über _vqlqueue zugreifen.
_vbclock     LONG 0x462 Anzahl der erfolgten Vertical-Blanks.
_vblqueue    LONG 0x456 Zeiger auf Zeigertabelle für Vertical-Blank-Prozesse.
bell_hook    LONG 0x5ac Zeiger auf eine Routine zur Ausgabe des Ping-Geräusches. Das BIOS sorgt selbsttätig für die Abfrage des Flags in con_term und ruft diese Routine nur dann auf, wenn das Geräusch wirklich erklingen soll. Die Routine wird im Supervisor-Modus aufgerufen per RTS abgeschlossen, und darf die Register D0-D2 und A0-A2 verändern. Auch BIOS Aufrufe vom "innern" der Routine aus sind erlaubt. (ab TOS 1.06, ab KAOS 1.4.2)
colorptr     LONG 0x45a Zeiger auf eine Farbpalette, die beim nächsten Vertical-Blank in die ST-Hardware Farbregister geladen wird (ab Adresse 0xffff8240). Damit wird ein unschönes Zucken auf dem Bildschirm vermieden. Steht in colorptr eine Null, so passiert nichts. Nach Übertragung der Farbwerte wird der Zeiger gelöscht.
con_state    LONG 0x4a8 interner Zeiger für Bildschirm-Ausgaberoutinen (offiziell nicht dokumentiert).
conterm      BYTE 0x484 Attribut-Bits für das BIOS-Gerät "CON:". Es gilt:
Bit-0 = Tastenklick ein/aus
Bit-1 = Tastenwiederholung ein/aus
Bit-2 = Glocke bei Ausgabe von CTRL-G
Bit-3 = bei Bconin den aktuellen Wert von Kbshift in den Bits 24..31 zurückgeben.
criticret    LONG 0x48a offiziell nicht dokumentiert, und auch wohl unbenutzt.
defshiftmd   BYTE 0x44a Standard-Farbgrafik-Auflösung. Schaltet der Computer auf Farbbetrieb um (nach einem Reset, durch Wechseln der Stecker oder durch Einschalten), wird in die angegebene Auflösung geschaltet.
end_os       LONG 0x4fa Zeiger auf das erste, nicht für TOS-interne Variablen benutzte Byte (also das erste Byte des freien Speichers).
etv_critic   LONG 0x404 logischer GEMDOS-Vektor 257. Sollte immer nur per Setexc gesetzt werden.
etv_term     LONG 0x408 logischer GEMDOS-Vektor 258. Sollte immer nur per Setexc gesetzt werden. Programme, die sich in irgendwelche Systemvektoren hängen, sollten sich auch in diesen Vektor einklinken. Falls das Programm abnormal beendet wird, springt das Betriebssystem zunächst über diesen Vektor, so daß man sich in Ruhe aus allen veränderten Vektoren zurückziehen kann. Da MagiC für jede Applikation einen eigenen etv_term-Vektor verwendet, kann es dabei nicht zu Kollisionen kommen.
etv_timer    LONG 0x400 logischer GEMDOS-Vektor 256. Sollte immer nur per Setexc gesetzt werden.
etv_xtra     LONG 0x40c reserviert für die logischen Vektoren 259-263 des GEMDOS, und z.Zt. unbenutzt.
exec_os      LONG 0x4fe Zeiger auf das erste Byte des Textsegmentes des Shell-Programms.
flock        WORD 0x43e wenn hier ein Wert ungleich 0 steht, dann darf nicht auf den DMA-Chip zugegriffen werden. DMA-Gerätetreiber müssen also zunächst abfragen, ob der DMA-Chip blockiert worden ist, und flock dann, wenn sie mit der Arbeit beginnen, selbst setzen.
hdv_boot     LONG 0x47a Vektor zur Routine zum Laden des Bootsektors. Diese Routine wird vom BIOS benutzt, um festzustellen, ob ein Bootsektor vorhanden und ob er ausführbar ist.
hdv_bpb      LONG 0x472 Vektor zur Routine, die den BPB eines BIOS-Laufwerkes ermittelt. Die Gerätenummer wird auf dem Stack (4(sp)) übergeben.
hdv_init     LONG 0x46a Vektor zu den Initialisierungsroutinen für die Diskettenlaufwerke. Wird vor dem Lesen der Bootsektoren ausgelesen, und kann daher nur von reset-residenten Programmen oder ROM-Modulen verändert werden. Zu den Aufgaben gehören:
  • Initialisierung der Diskettenlaufwerke (_nflops wird entsprechend gesetzt).
  • Übertragung von seekrate in die internen Variablen des BIOS.
hdv_mediach  LONG 0x47e Vektor zur Routine zur Bestimmung des Media-Change-Status eines BIOS-Laufwerks. Die BIOS-Gerätenummer wird auf dem Stack (4(sp)) übergeben.
hdv_rw       LONG 0x476 Vektor zur Routine zum Lesen und Schreiben von Blöcken auf BIOS-Laufwerken. Auf dem Stack werden die gleichen Parameter wie bei Rwabs übergeben (beginnend mit 4(sp); rwflag).
kcl_hook     LONG 0x5b0 Zeiger auf eine Routine zur Ausgabe des Tastenklick-Geräusches. Das BIOS sorgt selbsttätig für die Abfrage des Flags in con_term und ruft diese Routine nur dann auf, wenn das Geräusch wirklich erklingen soll. Die Routine wird im Supervisor-Mode aufgerufen, per RTS abgeschlossen und darf die Register D0-D2 und A0-A2 verändern und sollte nicht allzu viel Zeit verbrauchen. (ab TOS 1.06, ab KAOS 1.4.2)
memcntrl     BYTE 0x424 enthält die untersten vier Bits des Speicher-Kontrollregisters (0xffff8001)
Einige bekannte Werte sind:

Speichergröße Wert
128 K 0
512 K 4
256 K (2 Bänke) 0
1 MB 5
memval2      LONG 0x43a sollte den Magic-Wert 0x237698aa enthalten. Haben sowohl memval2 als auch memvalid den geforderten Wert, (und ab TOS 1.02 auch memval3), wird beim nächsten Reset nur ein Warmstart ausgelöst.
memval3      LONG 0x51a siehe auch memval und memval2. In diesem Fall ist der magische Wert 0x5555aaaa. (ab TOS 1.02)
memvalid     LONG 0x420 sollte die magische Zahl 0x752019f3 enthalten.
nvbls        WORD 0x454 Anzahl der Einträge, auf die _vblqueue zeigt. Identisch mit der Maximalzahl von gleichzeitig installierbaren Vertical-Blank-Routinen (Standardwert: 8).
palmode      WORD 0x448 legt laut Atari die Fernsehnorm fest. Es gilt:

0 = NTSC-Modus (60 Hz)
1 = PAL-Modus  (50 Hz)

Tatsächlich wird diese Systemvariable nicht berücksichtigt. Eine Änderung der Bildwiederholfrequenz ist nur über die entsprechenden Hardwareregister möglich.
phystop      LONG 0x42e Zeiger auf das erste Byte über dem physikalischen Ende des ST-kompatiblen RAM-Bereichs.
prt_cnt      WORD 0x4ee Zähler für die Alternate-Help Tastendrücke. Es gilt:
-1 = normaler Status
 0 = Hardcopy beginnen
>0 = Hardcopy abbrechen und auf Wert -1 zurücksetzen.


Diese Variable muss man auch vor einem Aufruf von Prtblk setzen.
prv_aux      LONG 0x512 Zeiger auf eine Routine zur Ausgabe auf dem seriellen Port (ebenfalls für Hardcopy Routine). Das auszugebende Zeichen steht in 6(sp).
prv_auxo     LONG 0x50e Zeiger auf eine Routine zum Feststellen des Status der seriellen Schnittstelle (ebenfalls für Hardcopy-Funktion).
prv_lst      LONG 0x50a Zeiger auf eine Routine zur Ausgabe auf dem parallelen Port (ebenfalls für Hardcopy Routine). Das auszugebende Zeichen steht in 6(sp).
prv_lsto     LONG 0x506 Zeiger auf eine Routine zum Feststellen des Status des parallelen Ports (ebenfalls für Hardcopy-Routine).
pun_ptr      LONG 0x516 zeigt bei erfolgreicher Installation eines AHDI-kompatiblen Festplattentreibers auf eine PUN_INFO-Struktur.
ramtop       LONG 0x5a4 Zeiger auf das Ende des Fast-RAM's im Atari-TT (nicht offiziell dokumentiert).
ramvalid     LONG 0x5a8 Magic-Wert der anzeigt, ob ramtop einen sinnvollen Wert enthält. Muß 0x1357bd13 sein. Nicht offiziell dokumentiert.
resvalid     LONG 0x426 wenn diese Adresse bei einem Reset den Wert 0x31415926 enthält, wird durch resvector gesprungen.
resvector    LONG 0x42a wird bei der Systeminitialisierung benutzt. Enthält den Vektor für einen Reset, falls resvalid den korrekten Wert beinhaltet. Zum Zeitpunkt des Aufrufs sind die Hardwareregister noch nicht gesetzt, und auch der Stackpointer ist noch nicht initialisiert.
sav_context  LONG 0x4ae sollte eigentlich ein Zeiger auf den Speicherbereich sein, in den bei Exceptions die Register und Teile des Stacks gerettet werden. Tatsächlich wird er aber vom TOS nicht benutzt, und daher muß man direkt auf die Variablen bei Adresse 0x380 zugreifen.
sav_row      WORD 0x4ac interner Puffer zur Zwischenspeicherung der Cursor-Position (nicht offiziell dokumentiert).
savptr       LONG 0x4a2 Zeiger auf Register-Zwischenspeicher von BIOS und XBIOS.
scr_dump     LONG 0x502 Zeiger auf die Hardcopy-Routine. Wird von der XBIOS-Funktion Scrdmp benutzt.
screenpt     LONG 0x45e Zeiger auf den Anfang des Bildspeichers. Wird beim nächsten Vertical-Blank in die betreffenden Hardware-Register und nach _v_bas_ad übertragen, anschließend aber nicht gelöscht. Daher sollte man stattdessen immer mit Setscreen arbeiten.
seekrate     WORD 0x440 Seekrate für die beiden Floppies. Es gilt:

0 =  6 ms
1 = 12 ms
2 =  2 ms
3 =  3 ms


Die Variable wird gleich nach dem Systemstart vom BIOS ausgelesen, und danach ignoriert. Zum ändern der tatsächlich benutzten Seekrate muß man die XBIOS-Funktion Floprate verwenden.
sshiftmd     BYTE 0x44c Kopie des Modus-Registers des Shifters. Es gilt:

0 =  320 * 200 (vier Planes)
1 =  640 * 200 (zwei Planes)
2 =  640 * 400 (ein Plane)
3 =  640 * 480 (vier Planes, nur TT)
4 = 1280 * 960 (ein Plane, nur TT)
5 =  320 * 480 (acht Planes, nur TT)

Alle anderen Werte sind für zukünftige Erweiterungen reserviert.
swv_vec      LONG 0x46e Zeiger auf die Routine, die auf das Anschließen eines Schwarz-Weiß bzw. Farbmonitors reagiert (zeigt zu Beginn auf die normale Reset-Routine).
the_env      LONG 0x4be Zeiger auf die Standard-Environment Strings (unbenutzt).
themd        MD   0x48e Zeiger auf MD-Struktur des GEMDOS. Diese wird ein einziges mal bei der Initialisierung des Systems gesetzt, und darf nicht verändert werden (und das würde sie bei Benutzung von Getmpb!).
trp14ret     LONG 0x486 offiziell nicht dokumentiert, und auch wohl unbenutzt.
vblsem       WORD 0x452 ein Wert von 1 bedeutet, daß der Vertical-Blank-Handler aktiviert ist.
xconin       LONG 0x53e Acht Vektoren für Bconin-Routinen. (ab TOS 1.02)
xconout      LONG 0x57e Acht Vektoren für Bconout-Routinen. (ab TOS 1.02)
xconstat     LONG 0x51e Acht Vektoren für Bconstat-Routinen. (ab TOS 1.02)
xcostat      LONG 0x55e Acht Vektoren für Bcostat-Routinen. (ab TOS 1.02)

Querverweis:
Reset-Vektor   Systemvektoren   Programmstart und TPA   Systemvariablen, nummerisch sortiert

3.4.1 Systemvariablen, nummerisch sortiert

Variable Größe Adresse
0x400 LONG etv_timer
0x404 LONG etv_critic
0x408 LONG etv_term
0x40c LONG etv_xtra
0x420 LONG memvalid
0x424 BYTE memcntrl
0x426 LONG resvalid
0x42a LONG resvector
0x42e LONG phystop
0x432 LONG _membot
0x436 LONG _memtop
0x43a LONG memval2
0x43e WORD flock
0x440 WORD seekrate
0x442 WORD _timr_ms
0x444 WORD _fverify
0x446 WORD _bootdev
0x448 WORD palmode
0x44a BYTE defshiftmd
0x44c BYTE sshiftmd
0x44e LONG _v_bas_ad
0x452 WORD vblsem
0x454 WORD nvbls
0x456 LONG _vblqueue
0x45a LONG colorptr
0x45e LONG screenpt
0x462 LONG _vbclock
0x466 LONG _frclock
0x46a LONG hdv_init
0x46e LONG swv_vec
0x472 LONG hdv_bpb
0x476 LONG hdv_rw
0x47a LONG hdv_boot
0x47e LONG hdv_mediach
0x482 WORD _cmdload
0x484 BYTE conterm
0x486 LONG trp14ret
0x48a LONG criticret
0x48e MD themd
0x49e LONG _md
0x4a2 LONG savptr
0x4a6 WORD _nflops
0x4a8 LONG con_state
0x4ac WORD sav_row
0x4ae LONG sav_context
0x4b2 LONG _bufl
0x4ba LONG _hz_200
0x4be LONG the_env
0x4c2 LONG _drvbits
0x4c6 LONG _dskbufp
0x4ca LONG _autopath
0x4ce LONG _vbl_list
0x4ee WORD prt_cnt
0x4f0 WORD _prtabt
0x4f2 LONG _sysbase
0x4f6 LONG _shell_p
0x4fa LONG end_os
0x4fe LONG exec_os
0x502 LONG scr_dump
0x506 LONG prv_lsto
0x50a LONG prv_lst
0x50e LONG prv_auxo
0x512 LONG prv_aux
0x516 LONG pun_ptr
0x51a LONG memval3
0x51e LONG xconstat
0x53e LONG xconin
0x55e LONG xcostat
0x57e LONG xconout
0x59e WORD _longframe
0x5a0 LONG _p_cookies
0x5a4 LONG ramtop
0x5a8 LONG ramvalid
0x5ac LONG bell_hook
0x5b0 LONG kcl_hook

Querverweise: Systemvariablen


HomeBIOSEinklinken in den Reset-VektorDie Systemvektoren