Topic : TOS - das Betriebssystem
Author :
Version : tos.hyp (5. März 2013)
Subject : Programmieren/Atari
Nodes : 3001
Index Size : 93602
HCP-Version : 5
Compiled on : Atari
@charset : atarist
@lang :
@default : Titel
@help :
@options : +g -i -s +x +zz -t4
@width : 70
View Ref-File3.4 Die Systemvariablen TOSDa die Systemvariablen und -vektoren die unterste Schicht des
Betriebssystems darstellen, sollten Anwenderprogramme nur wenn
unbedingt notwendig auf diese zugreifen. Konkret: ∙ keine Systemvariablen verändern, die nicht verändert werden
dürfen.
∙ keine Systemvariablen benutzen, wenn statt dessen auch eine
Funktion des Betriebssystems aufgerufen werden könnte (Beispiel:
Mfpint).
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-VektorSystemvektorenProgrammstart und TPASystemvariablen, nummerisch sortiert