Nachdem wir uns beim letzten Mal mit der Registerbelegung der C128-MMU beschäftigt haben, geht es in diesem Teil wie versprochen um die Betriebssystem-Routinen, die einen beim Arbeiten mit den verschiedenen Speicherkonfigurationen unterstützen. Die Routinen zur Speicherverwaltung verwenden zwei verschiedene Methoden, um die gewünschte Konfiguration anzugeben. Zum einen werden die MMU-Werte benutzt, die den Inhalten des Konfigurations-Registers entsprechen, zum anderen gibt es die Bank-Werte, wie man sie vom gleichnamigen Basic-Befehl her kennt. Ihre Bedeutung ist in Tabelle 1 zusammengefaßt. Die Umrechnung übernimmt die erste der folgenden Routinen. GETCFG($FF6B): Rechnet mittels einer Tabelle einen im X-Register übergebenen Bank-Wert in einen MMU-Wert um. Das Ergebnis erhält man im Akku. Achtung: Da die Umrechnungstabelle($F7F0-$F7FF) im Kernal-ROM liegt, muß beim Aufruf dieser und aller anderen Routinen, die Bank-Werte verwenden, der obere ROM-Bereich(s. Bit 4/5 im CR) aktiv sein! JMPFAR($02E3): Springt zu einer Adresse in einer beliebigen Speicherbank. Parameter: $02: Bank-Wert der Zieladresse $03: High-Byte der Zieladresse $04: Low-Byte der Zieladresse $05-$08: Wert für Statusregister, Akku sowie X- und Y-Register $05 sollte immer vorbereitet werden, weil dessen Inhalt natürlich auch das Interrupt-Flag beeinflußt. JSRFAR($02CD): Ruft ein Unterprogramm in einer beliebigen Speicherbank auf. Die Parameter sind die gleichen wie bei JMPFAR, zusätzlich muß aber in $02DE der MMU-Wert der Rückkehrkonfiguration, die nach Abschluß der Routine gelten soll, gesetzt werden("LDA $FF00:STA $02DE"). Es wird also nicht automatisch die Bank, aus der der Aufruf erfolgt ist, aktiviert! Zurückgegeben werden die Registerinhalte in den gleichen Adressen($05-$08) wie die Ausgangswerte sowie der Stackpointer in $09, Kopien von $08 und $09 findet man auch in Y und X. Danach sollte man $02DE wieder auf $00 setzen, da dies vom Betriebssystem erwartet wird. Benutzt man Bank 15, so kann man auch die ROM-Kopie von JSRFAR bei $F82B verwenden, bei der für die Rückkehrkonfiguration immer der MMU-Wert Null gilt. FETCH($02A2): Entspricht einem "LDA (FETVEC),Y"-Befehl, das Lesen erfolgt aus der im X-Register(MMU-Wert) angegebenen Speicherkonfiguration. Die Adresse von FETVEC wird in $02AA angegeben. STASH($02AF): Führt "STA (STAVEC),Y" aus, der zugehörige MMU-Wert wird wie bei FETCH im X-Register übergeben. STAVEC muß in $02B9 gespeichert werden. CMPARE($02BE): "CMP (CMPVEC),Y". Der MMU-Wert wird wieder im X-Register angegeben, CMPVEC in $02C8. FETCH, STASH und CMPARE verändern jeweils den Inhalt des X-Registers, so daß man dieses vor einem weiteren Aufruf neu initialisieren muß. Zu jeder der drei Routinen gibt es noch eine ROM-Variante(FETCH: $FF74, STASH: $FF77, CMPARE: $FF7A), bei der statt des MMU-Wertes im X-Register der Bank-Wert benutzt wird. Außerdem muß man bei "ROM-FETCH" den FETVEC-Wert im Akku übergeben, anstatt ihn in $02AA zu schreiben. Schließlich existieren noch fünf Routinen, die ähnlich wie FETCH funktionieren, die aber die durch die PCRs vorgegebenen Speicherkonfigurationen verwenden. Sie haben den Vorteil, daß das X-Register hier weder benutzt noch beeinflußt wird. LDAPCRA($039F): Ergibt einen "LDA (Akku),Y"-Befehl, bei dem der Wert aus der in $D501 angegebenen Speicherkonfiguration gelesen wird. Danach wird das in $D503 angegebene Byte in das CR kopiert. LDAPCRB($03AB): Wie LDAPCRA, nur daß die in $D502 angegebene Konfiguration benutzt und danach die in $D504 gespeicherte aktiviert wird. LD24PCRB($03B7): Führt "LDA ($24),Y" unter Benutzung der gleichen PCRs wie LDAPCRB aus. LD26PCRA($03C0): "LDA ($26),Y" mit den gleichen Konfigurations-Werten wie LDAPCRA. LD3DPCRA($03C9): Funktioniert wie LD26PCRA mit $3D statt $26. $3D/$3E ist der Zeiger auf das nächste zu lesende Zeichen im BASIC-Programm. Das Beispielprogramm "FETCH-STASH.OBJ"(Quelltext "FETCH- STASH.SRC" im Hypra-Ass-Format bzw. als ASCII-Datei "FETCH- STASH.TXT") demonstriert die Benutzung der genannten Routinen. Es wird mit BLOAD"FETCH-STASH.OBJ",ON B1 nach $C000 in die RAM-Bank 1 geladen und kopiert nach dem Start mit "BANK 1:SYS 49152" eine im ROM enthaltene Liste aller BASIC-Befehle direkt auf den 40-Zeichen-Bildschirm in Bank 0. Tabelle der Bank-Werte(Tabelle 1): Bank- MMU- $0000- $4000- $8000- $C000- $D000- $E000- Wert Wert $3FFF $7FFF $BFFF $CFFF $DFFF $FFFF ----------------------------------------------------------- 0 $3F RAM 0 RAM 0 RAM 0 RAM 0 RAM 0 RAM 0 1 $7F RAM 1 RAM 1 RAM 1 RAM 1 RAM 1 RAM 1 2 $BF RAM 2 RAM 2 RAM 2 RAM 2 RAM 2 RAM 2 3 $FF RAM 3 RAM 3 RAM 3 RAM 3 RAM 3 RAM 3 4 $16 RAM 0 RAM 0 I-ROM I-ROM I/O I-ROM 5 $56 RAM 1 RAM 1 I-ROM I-ROM I/O I-ROM 6 $96 RAM 2 RAM 2 I-ROM I-ROM I/O I-ROM 7 $D6 RAM 3 RAM 3 I-ROM I-ROM I/O I-ROM 8 $2A RAM 0 RAM 0 E-ROM E-ROM I/O E-ROM 9 $6A RAM 1 RAM 1 E-ROM E-ROM I/O E-ROM 10 $AA RAM 2 RAM 2 E-ROM E-ROM I/O E-ROM 11 $EA RAM 3 RAM 3 E-ROM E-ROM I/O E-ROM 12 $06 RAM 0 RAM 0 I-ROM B-ROM I/O B-ROM 13 $0A RAM 0 RAM 0 E-ROM B-ROM I/O B-ROM 14 $01 RAM 0 B-ROM B-ROM B-ROM CHARS B-ROM 15 $00 RAM 0 B-ROM B-ROM B-ROM I/O B-ROM RAM 0=RAM-Bank 0, RAM 1=RAM-Bank 1 RAM 2=RAM-Bank 2, RAM 3=RAM-Bank 3 I-ROM=internes Funktions-ROM, E-ROM=externes Funktions-ROM B-ROM=Betriebssystem-ROM, CHARS=Zeichensatz-ROM I/O=Ein-/Ausgabebereich Da RAM 2/3 nicht existieren, werden dort RAM 0/1 eingespiegelt. Thomas Klein
Dateien: FETCH-STASH.OBJ: Beispiel zur Anwendung von FETCH und STASH FETCH-STASH.SRC: Quelltext dazu im Hypra-Ass-Format FETCH-STASH.TXT: Quelltext als formatierte ASCII-Datei