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