Erstellt: 18. April 2013 (zuletzt geändert: 1. November 2021)

GeoRAM

Wie nutzt man den GeoRAM Zusatzspeicher?

C64 Studio, AMCE & TASM

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.

VICE: GeoRAM aktivieren.
VICE: GeoRAM aktivieren.

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:

Ausgabe des GeoRAM Beispielprogramms.
Ausgabe des GeoRAM Beispielprogramms.

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.


Nachtrag vom 24.04.2013:

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.

Der GeoRAM Checker in Aktion...
Der GeoRAM-Checker in Aktion…

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.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (1 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


Zurück

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Protected by WP Anti Spam