Wie nutzt man den GeoRAM Zusatzspeicher?
Was das GeoRAM eigentlich ist und ein paar allgemeine Infos dazu findet ihr unter Module.
Da man es aber auch mit VICE oder dem Turbo Chameleon 64 emulieren kann, ohne ein echtes Modul zu besitzen, versuchen wir doch einfach mal es zu verwenden.
GeoRAM aktivieren
VICE: Startet VICE und wählt den Menüpunkt „Einstellungen -> Erweiterungsmodul I/O Einstellungen -> GEO-RAM Einstellungen…“ aus. Setzt hier den Haken, um das GeoRAM-Modul zu aktivieren und stellt die Größe auf 512KB, abschließend bestätigt das Fenster mit OK. Für unseren Test solltet ihr die Einstellungen speichern, sonst ist beim nächsten Start von VICE das GeoRAM wieder deaktiviert.
Turbo Chameleon 64: Startet den C64-Core und geht in die „Options“, hier etwas nach unten scrollen und unter „GeoRAM size“ 512KB einstellen. Im Hauptmenü wirkt sich der Punkt [F2] Clear ALL Memory auf das GeoRAM-Modul aus, sein Speicher wird hier, ebenso wie der Speicher einer REU, gelöscht. Auch beim TC64 solltet ihr für unseren Test die Einstellungen evtl. speichern.
Funktionsweise
Das GeoRAM-Modul verfügt nicht über den DMA-Chip einer REU, daher können Speicherbereiche nicht automatisch gefüllt / kopiert werden, dies muss manuell mit der CPU geschehen. Das GeoRAM blendet dazu jeweils die gewünschten 256 Bytes (also eine Page) an den Adressen $de00 bis $deff ein. Auf welchen 256 Byte-Block (welche Bank) man zugreifen möchte wird über die Speicherstellen $dffe / $dfff festgelegt.
Um das GeoRAM anzusprechen, benötigt man nur die zwei eben erwähnten Register:
$dfff : Nr. des 16KB-Blocks bei 512KB : $00 - $1f -> 32 * 16KB = 512KB bei 1024KB : $00 - $3f -> 64 * 16KB = 1024KB bei 2048KB : $00 - $7f -> 128 * 16KB = 2048KB $dffe : Nr. des 256 Byte-Blocks im gewählten 16KB-Block $00 bis $3f -> 40 * 256 Byte = 16KB
Achtung: Diese beiden Register können nur geschrieben und nicht ausgelesen werden. Ihr könnt sie daher auch nicht mit adc oder inc erhöhen!
Das Programm
Setzen wir das jetzt mal in die Tat um:
GEOPAGE = $de00 ;Inhalt der gewählten Page GEO16KB = $dfff ;Nr. des gewählten 16KB Blocks GEO256BYTE = $dffe ;Nr. der gewünschten Page im 16KB Block ZP_COPYDESC = $fb ;Ziel Adresse fürs Kopieren ;*** Startadresse *=$0801 ;** BASIC-Zeile: 2018 SYS 2062 !word main-2, 2018 !byte $9e !text " 2062" !byte $00,$00,$00 main jsr fillGeoRAM ;die ersten 16KB des GeoRAMs füllen lda #$00 ;Der BS ist unser Ziel fürs Zurückkopieren sta ZP_COPYDESC ;also $0400 in die Zero-Page lda #$04 sta ZP_COPYDESC+1 ldx #$00 ;1. 16KB-Block ldy #$00 ;1. 256Byte Block jsr copyGeoRAM ;in den BS kopieren inc ZP_COPYDESC+1 ;Ziel (BS) für die nächsten 256Byte erhöhen ldx #$00 ;immer noch der 1. 16KB-Block ldy #$14 ;aber jetzt der 20. 256Byte-Block jsr copyGeoRAM ;in den BS kopieren inc ZP_COPYDESC+1 ;nochmal unser Ziel erhöhen ldx #$00 ;es bleibt beim 1. 16KB-Block ldy #$3f ;der letzte 256Byte Block jsr copyGeoRAM ;und wieder auf den BS kopieren rts ;zurück zum BASIC ;************************************************************ ;*** Nr. der gewünschten Page im GeoRAM setzen ;************************************************************ ;*** Übergabe: X = 16KB-Block im GeoRAM ;*** Y = Nr. das 256Byte-Blocks im 16KB-Block ;************************************************************ ;*** Rückgabe: - ;************************************************************ ;*** ändert: - ;************************************************************ setGeoPageNo stx GEO16KB ;gewünschter 16KB-Block sty GEO256BYTE ;gewünschter 256Byte-Block rts ;************************************************************ ;*** Die ersten 16KB im GeoRAM mit dummy Daten füllen. ;************************************************************ ;*** Übergabe: - ;************************************************************ ;*** Rückgabe: - ;************************************************************ ;*** ändert: A, X, Y, SR ;************************************************************ fillGeoRAM ldx #$00 ;1. 16KB-Block (Zählung beginnt bei 0) ldy #$00 ;1. 256Byte-Block (Zählung beginnt bei 0) jsr setGeoPageNo ;gewünschten Bereich auswählen fillGeoRAMStart txa ;X->Akku für dummy Werte stx GEO256BYTE ;mit X den 256Byte-Block auswählen fillGeoRAMLoop sta GEOPAGE,Y ;Akku in GeoRAM speichern dey ;Schleifenzähler verringern bne fillGeoRAMLoop ;wenn nicht Null nächstes Byte kopieren inx ;sonst, nächste 256Bytes im GeoRAM wählen cpx #$40 ;wurden 64 mal 256Bytes geschrieben? bne fillGeoRAMStart ;wenn nein, nächste 256 Bytes rts ;sonst zurück ;************************************************************ ;*** Kopiert die übergebene GeoRAM Page an die in ;*** ZP_COPYDESC angegebene Adresse. ;************************************************************ ;*** Übergabe: X = 16KB-Block ;*** Y = 256Byte-Block ;************************************************************ ;*** Rückgabe: - ;************************************************************ ;*** ändert: A, Y, SR ;************************************************************ copyGeoRAM jsr setGeoPageNo ;gewünschten Bereich im GeoRAM wählen ldy #$00 ;Schleifenzähler copyGeoRAMLoop lda GEOPAGE,Y ;Wert vom GeoRAM in den Akku sta (ZP_COPYDESC),Y ;Akku an ZP_COPYDESC speichern dey ;Schleifenzähler verringern bne copyGeoRAMLoop ;wenn nicht Null, nächstes Byte rts ;sonst zurück
Unser Programm füllt zunächst die ersten 16KB im GeoRAM mit jeweils 256 identischen Zeichen (s. fillGeoRAM). Wir verwenden hier einfach die Zeichen 0 bis 63 aus dem Char-ROM, somit können wir, durch eine Ausgabe des jeweiligen Blocks auf den BS, direkt das Ergebnis kontrollieren.
Anschließend legen wir die Adresse des BS-Speichers $0400 als Ziel für unsere Kopierfunktion an ZP_COPYDESC ab.
Dann legen wir über das X– und Y-Register den gewünschten Bereich im GeoRAM fest und kopieren über copyGeoRAM den gewählten 256Byte Block vom GeoRAM in den BS-Speicher. Damit wir etwas mehr sehen, erhöhen wir das MSB der Adresse des BS-Speichers an ZP_COPYDESC+1 um eins und geben den nächsten Bereich aus dem GeoRAM aus. Das Ganze machen wir zum Schluß noch ein drittes Mal.
Startet ihr das Programm sollte euer BS ungefähr so aussehen:
Die Anzeige erklärt sich so:
Wir haben ja im GeoRAM in den ersten 16KB jeden 256 Byte-Block mit dem jeweiligen Zeichen aus dem Char-ROM gefüllt. Daher sehen wir zu erst lauter @ (da mit ldy #$00 der erste 256 Byte Block gewählt wurde), danach folgt T (ldy #$14 entspricht dem 21. 256er-Block) und zum Schluß ?, das dem 40. Block entspricht ldy #$3f). Vergesst nicht, dass die Zählung mit 0 beginnt. Schaut ihr ins Char-ROM dann findet ihr an den Stellen $00 (0), $14 (20) und $3f (63) unsere Zeichen @, T und ?.
Falls ihr jetzt nicht glaubt, dass wir den Speicher des GeoRAMs verwenden könnt ihr diesen ja mal entfernen / deaktivieren und das Programm erneut starten.
Wer VICE nutzt und kontrollieren will, ob wir tatsächlich die ersten 16KB im GeoRAM beschrieben haben, der kann im Dialog wo man das GeoRAM aktiviert den Haken fürs Speichern setzen. Gebt dann noch ein Verzeichnis und Dateinamen an und schließt den Dialog mit OK. VICE speichert beim Beenden nun den Inhalt des GeoRAMs in der angegebenen Datei und ihr könnt diese dann mit einem HEX-Editor kontrollieren.
In der Praxis wird das GeoRAM eher selten verwendet. Speziell darauf ausgerichtete Programme würde ich auch nicht unbedingt entwickeln. Man könnte aber z. B. prüfen ob ein GeoRAM im System steckt und wenn das der Fall ist, es zur Beschleunigung verwenden, indem man z. B. den Inhalt der Diskette dort ablegen und somit die Nachladezeiten verringern.
Da ich mittlerweile ein echtes GeoRAM besitze und sichergehen wollte, dass es auch funktioniert, habe ich auf Basis des eben vermittelten Wissens ein Check-Programm geschrieben.
GeoRAM-Checker V1.0
Das Programm ermittelt zunächst, ob ein GeoRAM vorhanden ist und welche Größe es hat. Da es kein eindeutiges Zeichen gibt, muss dazu in die zum GeoRAM gehörenden Adressen geschrieben werden. Dies kann zu Problemen führen, wenn eine andere Erweiterung im C64 steckt. Daher sollte das Programm nur ausgeführt werden, wenn man auch ein GeoRAM verwendet. Wurde ein GeoRAM gefunden, dann werden sämtliche Bytes im Speicher des GeoRAMs einmal beschrieben und gelesen, dabei wird geprüft, ob der Inhalt korrekt ist. Auf dem BS könnt ihr verfolgen, wo die Prüfroutine gerade ist und ob die bisherigen Blöcke funktionieren oder defekt sind. Um ein defektes GeoRAM zu simulieren, könnt ihr das Programm z. B. unter VICE mit 512KB GeoRAM starten. Habt ihr ein paar grüne Kästchen dann könnt ihr übers Menü das GeoRAM einfach deaktivieren und sofort erhaltet ihr Fehler. Es kann euch passieren, dass VICE beim Deaktivieren des GeoRAMs (das ja vom Check-Programm gerade verwendet wird) komplett absemmelt, probiert es dann einfach nochmal.
Ein Erfolg oder Scheitern des Tests, wird durch eine dezente Bildschirmausgabe verdeutlicht.
Der Source ist echt gruselig, daher möchte ich den niemanden zumuten. Sollte dennoch Interresse daran bestehen, bitte ich um eine Info. Ich werde ihn dann nochmal überarbeiten, kommentieren und anschließend zur Verfügung stellen.
Vorerst findet ihr hier ein D64-Image mit dem fertigen Programm.
GeoRAM-Checker