Bankgeheimnisse (Teil 2)
C 128-Speicherverwaltung 2: Betriebssystemroutinen
 
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

  Zurück zum Index  
Home | Cat's Eye | Kimagure | Con-Bilder | Computer | NiNuM | TSP | Kontakt