DER
MONITOR
Der
OS-Monitor ist ein Programm im ROM, das die Einschalt- und SYSTEM-RESET-Sequenz des
Gerätes bearbeitet. Im Bezug auf ihre Funktion sind Einschalt- und SYSTEM-RESET-Sequenz
identisch. In Anhang IV befindet sich ein Flussdiagramm der Einschalt- und SYSTEM-RESET-Routinen.
Die
Einschalt-Routine (auch als Kaltstart-Routine bezeichnet) ist auf zwei Arten ansprechbar:
durch Einschalten des Computers oder einen Sprung nach COLDSV($E477). COLDSV ist
der
System-Routinen-Vektor
zur POWER-UP (Einschalten)-Routine. Wichtige Punkte beim Einschalten sind:
1.
Der gesamte Speicher, ausgenommen die Adressen $0000 bis $000F, wird gelöscht.
2.
Disketten- und Cassetten-BOOT werden versucht. Das Flag BOOT?($0009) signalisiert
den Erfolg oder Misserfolg des BOOTs. Bei einem erfolgreichen Cassetten-BOOT ist
Bit 0=1 bei einem erfolgreichen Disketten-BOOT Bit 1=1.
3.
COLDST($0244) ist ein Flag, das dem Monitor mitteilt, ob ein POWER-UP oder ein SYSTEM-RESET
vorliegt. COLDST=0 bedeutet SYSTEM-RESET, COLDST ungleich 0 bedeutet POWER-UP. Eine
interessante Verwendung dieses Flags wäre das Setzen auf einen Wert ungleich
Null, während ein geBOOTetes Programm ausgeführt wird. Dieses hat zur Folge,
dass ein SYSTEM-RESET zu einem POWER-UP wird. Diese Technik erhöht den Schutz
des Programms, da der Benutzer keine Kontrolle über den Computer erlangen kann,
während es läuft.
Das
Drücken der RESET-Taste verursacht einen SYSTEM-RESET (auch als Warmstart bezeichnet).
Wichtige Punkte beim SYSTEM-RESET sind:
1.
Die RAM-Vektoren des OS werden während des SYSTEM-RESETs und während des
Einschaltens vom ROM übertragen. Möchte der Benutzer einen Vektor ändern,
so müssen einige Vorkehrungen getroffen werden, damit SYSTEM-RESET entsprechend
bearbeitet werden kann. Siehe Kapitel 9 für die Behandlung das SYSTEM-RESETs.
2.
MEMLO, MEMTOP, APPMHI, RAMSIZ und RAMTOP werden beim SYSTEM-RESET zurückgesetzt.
Werden diese Zeiger geändert, um Speicherplatz für Assembler-Routinen in
BASIC freizumachen, so müssen ebenfalls einige Vorkehrungen getroffen werden,
damit SYSTEM-RESET entsprechend bearbeitet werden kann. Abbildung 8.10 ist ein Beispiel
hierfür.
DIE
SYSTEMVARIABLEN
Die
Systemvariablen enthalten viele für den Benutzer interessante Informationen.
Mit Assembler-Routinen oder POKE- und PEEK-Befehlen kann direkt auf diese Adressen
zugegriffen werden.
Die
Systemvariablen liegen auf den RAM-Seiten 0 bis 4 ($0000 bis $03FF). Sie enthalten
System-Flags, I/O-Puffer, I/O-Paramter usw. Der Programmierer kann einige dieser
Speicherstellen benutzen, um Funktionen anzuwenden, die nicht durch das OS oder ein
Programm (z.B. BASIC) bereitgestellt werden. Abbildung 8.11 zeigt einige dieser Elemente:
Speicher-Zeiger
Das
OS benutzt 5 Speicherstellen, um den Benutzer- und Bildschirm-Speicher zu überwachen:
MEMLO, MEMTOP, APPMHI, RAMTOP und RAMSIZ. Ihre Zusammenhänge werden in einer
einfachen Speicherübersicht in Abbildung 8.12 dargestellt.
MEMLO
ist eine 2-Byte Speicherstelle, die das OS verwendet, um anzuzeigen, wo ein Anwendungs-Programm
beginnen kann. Wird MEMLO vorsichtig benutzt, so kann es zum Reservieren von Speicherplatz
für kleine Assembler-Routinen in BASIC verwendet werden. Der BASIC-Interpreter
benutzt den MEMLO-Zeiger um festzulegen, wo ein Programm anfangen kann (siehe Kapitel
7 für die Struktur von BASIC-Programmen). Soll der MEMLO-Zeiger auf eine höhere
Adresse gesetzt werden, so muß dieses geschehen, bevor das BASIC-Modul gestartet
wird. MEMLO muß außerdem sehr vorsichtig verwendet werden, da diese Speicherstelle
beim Einschalten und beim SYSTEM-RESET wieder zurückgesetzt wird.
Wird
von einer Diskette gebootet, so kann die AUTORUN.SYS-Möglichkeit benutzt werden,
um MEMLO auf einen festgelegten Wert zu setzen. Da das DOS den Zeiger auch bei einem
SYSTEM-RESET über den DOSINI-Vektor zurücksetzt, ist es notwendig diesen
zu ändern. DOSINI enthält die Adresse des Initialisierungs-Programms für
das DOS. Es wird durch den Monitor als ein Teil der Initialisierung des Systems aufgerufen.
Der Inhalt von DOSINI muß in eine 2-Byte-Adresse einer JSR-Anweisung übertragen
werden, um ein Teil des POWER-UPs zu werden. DOSINI wird dann auf die Adresse der
JSR-Instruktion für das Initialisierungs-Programm gesetzt. MEMLO enthält
einen festgelegten Wert. Bei einem SYSTEM-RESET wird das neue Initialisierungs-Programm
aufgerufen, wobei dessen erste Instruktion JSR OLDDOSINI, wiederum das DOS initialisiert.
Das neue Init-Programm setzt MEMLO auf den festqelegten Wert und springt zur alten
Init-Sequenz zurück (RTS). Abbildung 8.10 ist hierfür ein Beispiel.
Die
oben beschriebene Technik kann ebenso für MEMTOP
(der Zeiger für das obere RAM-Ende) verwendet werden. Durch Verringern des MEMTOP-Wertes
kann Speicherplatz für Assembler-Routinen reserviert werden. Allerdings ergibt
sich bei der Verwendung von MEMTOP anstelle von MEMLO ein Problem. MEMTOP ändert
sich mit der Größe des freien RAMs und dem Grafik-Modus des Bildschirms.
Dieses macht es schwierig seinen Wert zu bestimmen. Aus diesem Grunde müßen
die Assembler-Routinen frei verschiebbar sein.
APPMHI
ist eine Speicherstelle, die die Adresse enthält, welche wiederum die niedrigste
Adresse angibt, an die das Bildschirm-RAM gelegt werden kann. Diese Variable wird
gesetzt, um Programme oder Daten vor dem ‹berschreiben durch den Display-Handler
zu schützen.
RAMSIZ
kann genau wie MEMTOP zum Sichern von Speicherplatz für kleine Assembler-Routinen
benutzt werden. Der Vorteil von RAMSIZ gegenüber MEMTOP liegt darin, daß
der reservierte Speicherbereich hinter dem Bildschirm-RAM liegt, der durch MEMTOP
gesicherte Speicherbereich liegt unter dem Bildschirmbereich. Letzterer kann sich
durch ƒndern des Grafik-Modus ausdehnen oder zusammenziehen.