Georam
Suche
Index
FAQ
Kontakt
Zurück
Mehr Speicher für den C64

Die GeoRAM-Erweiterung wurde Anfang der 1990er-Jahre als Ersatz für die teuere und nicht mehr verfügbare C=-REU entwickelt. Diese neuere Erweiterung nutzt keinen DMA-Transfer, ist demnach langsamer als die originale Commodore-Erweiterung. Hinzu kommt in diesem Zusammenhang die Notwendigkeit von intensiver Programmunterstützung, da die GeoRAM nur über 2 Register zur Adressierung verfügt.
Eigentlich wurde diese Erweiterung für die Geos-Gemeinde entwickelt, dass sollte aber nicht von der Unterstützung in anderen Programmen abhalten.

GeoRAM-Cartridge Interna
    
    $de00 : 256 Byte-Fenster zum Lesen und Schreiben 
    
    $dffe : Auswahl des 256 Byte-Fenster im 16 Kb-Block
    $dfff : Auswahl des 16 Kb-Block
    
             512 Kb = 0- 31, $00-$1f
           1024k Kb = 0- 63, $00-$3f
           2048k Kb = 0-127, $00-$7f 
   
    Die Register $dffe und $dfff können nur geschrieben werden.
   


Programmierung

Die Programmierung ist relativ einfach, sollte aber aus Geschwindigkeitsgründen in Assembler erfolgen.
    
    ; Kopieren des Bereichs $4000-$7fff in GeoRAM $0000-$3fff (16 Kb)
         
    !to"geowrite.prg",cbm

    *=$1000
    
       geobuf = $de00  
  geobuf_sect = $dffe
        block = $dfff    
       membuf = $4000 ; - $7fff
      
         
         
              lda #$00                ; Register auf Block $00 und $0000         
              sta geobuf_sect
              sta block
              ldx #$00               
              ldy #$00
      j0      lda membuf,x            ; 256 Byte in die GEORam kopieren
              sta geobuf,x
              inx
              bne j0
              iny
              sty geobuf_sect
              inc j0+2                ; Hi-Byte erhöhen
              cpy #$40                ; 64 x 256 = 16 Kb 
              bne j0 
              sty j0+2                ; Speicheradresse restaurieren
              rts
              
              
  
  ; Kopieren des Bereichs $0000-$3fff in den Rechner-Speicher $4000-$7fff (16 Kb)

    !to"georead.prg",cbm

    *=$1000
    
       geobuf = $de00  
  geobuf_sect = $dffe
        block = $dfff    
       membuf = $4000 ; - $7fff
      
         
         
              lda #$00                ; Register auf Block $00 und $0000         
              sta geobuf_sect
              sta block
              ldx #$00               
              ldy #$00              
      j1      lda geobuf,x 
      j0      sta membuf,x            ; 256 Byte aus GEORam kopieren              
              inx
              bne j1
              iny
              sty geobuf_sect
              inc j0+2                ; Hi-Byte erhöhen
              cpy #$40                ; 64 x 256 = 16 Kb 
              bne j1 
              sty j0+2                ; Speicheradresse restaurieren
              rts              
   
So einfach kann ein 16 Kb-Block geschrieben und wieder gelesen werden. Das kann leicht mit dem VICE-Emulator getestet werden. Man muss nur unter "Settings/Cartridge/IO Settings/GEORAM Settings" die virtuelle Speichererweiterung aktivieren.
Der Inhalt sollte in eine Datei geschrieben werden. Wenn man vor Ausführung von geowrite.prg den Speicher mit einem Byte-Muster füllt (ALT-M; z.B. F 4000 7FFF 11), sollte sich dieses nach sys 4096 in der GeoRAM ($0000-$3fff) nachweisen lassen.
Bei komplexeren Programmen sollten die Register in (Zeropage-) Adressen zwischengespeichert und immer aktualisiert werden, da man wie schon erwähnt diese nicht lesen kann. So behält man den Überblick.
;
; Ein Auszug einer moeglichen Erkennung des Moduls. Bestehende Daten werden nicht veraendert.
; Fuer eine wirkliche Erkennung muesste man sich aehnlich verhaltende Module einbeziehen. 
;
; Workstage :




                 ldx #00
                 lda #00
                 sta $dfff
                 sta $dffe          ; Georam $0000
p1               lda $de00,x
                 sta cass,x         ; 190 Byte in Cassettenpuffer holen
                 inx
                 cpx #190
                 bne p1
                 ldx #00
                 txa
p2               sta $de00,x        ; 190 Byte in Georam schreiben,
                 lda $de00,x        ; lesen,                  
                 cmp $de00,x        ; und vergleichen ...
                 bne y0             ; nicht gleich, dann keine Speichererweiterung ...   
                 inx
                 cpx #190       
                 bne p2 
                 jmp y1             ; alles ok, Georam wahrscheinlich da         
y0               jmp nogeoram       
y1               ldx #00            ; gepufferte Daten wieder zurueckschreiben
p3               lda cass,x
                 sta $de00,x
                 inx
                 cpx #190
                 bne p3 
                 ....               ; weiter im Programm
                 
                 
nogeoram         ....               ; Textausgabe und Ende  

   


Software

Da das GeoRAM über 15 Jahre alt ist, sollte man die Erweiterung erstmal gründlich testen. Ich habe speziell zu diesem Zweck ein kleines Testprogramm geschrieben. In der vorliegenden Version werden 512 Kb geprüft. Wenn der Programmlauf abgebrochen wird, sollte alles gründlich überprüft werden :

1. Zustand des Expansionsports. Erreichen alle Kontakte die Platine ?
2. Zustand der Kontakte am Modul. Sind die Kontakte veschmutzt oder beschädigt ?


Das Modul wird tatsächlich mit den Bauteilen nach unten eingesteckt. Das ist normalerweise nicht üblich, daher an dieser Stelle eine Erwähnung.

Wenn das Problem mit guter Verbindung zum Expansionsport noch besteht, wird etwas am Erweiterungsmodul defekt sein. Da muss dann der Fachmann ran.


Programmlauf
Fehlermeldung

Links im Bild sieht man den normalen Programmlauf und rechts einen Abbruch nach Fehler.


Download : Download GEO/NEO- AND BBGRAM-TEST 512K v0.2



Mehr Software

Die Erweiterung wird natürlich von GEOS unterstützt. Weitere Programme :     Digital Talk (Diskmag),     Geoutil, ...


Neue Software


Eine neue und sehr vielseitige Version der Test-Software, die speziell für das Chameleon64 programmiert wurde. Es kann aber natürlich auch jede reale Georam-kompatible Speicher-Erweiterung damit getestet werden.
;------------------------------------------------------------
; Geo-/ Neoram-Test Version 1.0
;------------------------------------------------------------
;
; [/] 28. March 2011 , M. Sachse http://www.cbmhardware.de
;
; Detects Geo-/Neoram and runs test.
;
; Yellow Point: Read into buffer and compare
; Green Point: Write back and compare
; Red border and stop: a critical error !
;
; Change-Log: complete rewrite :)
;
; + advanced detection
; + faster routines
; + smaller code : less than 1,3 Kbytes
;
;------------------------------------------------------------
*= $0800
!byte $00,$0c,$08,$0a,$00,$9e,$32,$30,$36,$34,$00,$00,$00,$00
!to "georamport.prg",cbm



bsout         = $ffd2
gport         = $de00
gpage         = $dffe
gwindow16k    = $dfff
set_cursor    = $fff0
get           = $ffe4
check_buf     = $4000
ch64_magic    = $d0fe


*=$0810


                 lda #$93
                 jsr bsout

;------------------------------------------------------------
; ride the chameleon ?
;------------------------------------------------------------

                 lda #$07
                 sta $0286
                 ldx #$ff
                 lda #$2a  
                 sta ch64_magic
                 lda ch64_magic
                 sta temp 
                 stx ch64_magic
                 cmp #$01
                 beq c64_ch64
                 cmp #$a1
                 beq ch64
                 cmp #$ff
                 beq goon
                 ldx #$14                   ; line 
                 ldy #$01                   ; column
                 clc                     
                 jsr set_cursor             ; set cursor
                 ldx #$00 
-                lda nothing,x              ; anything is wrong 
                 jsr bsout     
                 inx           
                 cpx #$28
                 bne  -
                 rts

;-----------------------------------------------------
c64_ch64:     
                 ldx #$14                   ; line 
                 ldy #$01                   ; column
                 clc                     
                 jsr set_cursor             ; set cursor
                 ldx #$00 
-                lda chc64,x                ; text: c64 and Chameleon 64     
                 jsr bsout     
                 inx           
                 cpx #$28
                 bne -
                 beq goon
;-----------------------------------------------------
ch64:     
                 ldx #$14                   ; line 
                 ldy #$01                   ; column
                 clc                     
                 jsr set_cursor             ; set cursor
                 ldx #$00 
-                lda cham,x                 ; text: chameleon 64 alone 
                 jsr bsout     
                 inx           
                 cpx #$28
                 bne -
;-----------------------------------------------------
goon:
                 lda #$40
                 sta m0+2                   ; restore "nerdish" selfmodifying code             
                 sta m1+2                  
                 sta m4+2                  
                 sta m5+2                  
                 lda #$05
                 sta m2+2
                 lda #$d9   
                 sta m3+2                      
                 lda #$44
                 sta m2+1
                 sta m3+1   

                 lda #$17
                 sta 53272
                 ldx #$00
                 lda #$00
                 sta geo_banks   
                 sta geo_hi  
                 sta gwindow16k
                 sta gpage
-                lda gport,x
                 sta check_buf,x
                 inx
                 bne -
                 ldx #$00
-                txa
                 sta dummy,x                 ; write values and compare georam-port
                 sta gport,x
                 lda gport,x
                 cmp dummy,x
                 bne nogr                
                 inx
                 bne - 
                 beq +                  
nogr:
                 ldx #$00                
-                lda not_active,x            ; text: no georam                           
                 jsr bsout               
                 inx                     
                 cpx #$28                                  
                 bne -      
                 jmp end
+               
-                lda check_buf,x            ; restore georam
                 sta gport,x
                 inx
                 bne -

;------------------------------------------------------------
; evaluate banks 
;------------------------------------------------------------

                  ldx #$00
                  stx geo_hi
                  stx gpage   
-                 stx gwindow16k  
                  lda gport
                  sta temp_buffer,x
                  inx
                  bne -                
-                 stx gwindow16k            ; write 256 x $00
                  lda #$00
                  sta gport
                  inx
                  bne -                     
-                 lda gport                 ; check for wrap 
                  cmp #$01
                  beq restore                  
                  lda #$01                  ; write next marker  
                  sta gport                                            
                  inc geo_hi
                  inx
                  stx gwindow16k
                  bne -                  
restore:          inx
-                 lda temp_buffer,x         ; restore buffered bytes
                  sta gport
                  stx gwindow16k
                  inx
                  bne -                                      
                  beq main    
end:              rts 





;------------------------------------------------------------
; main program
;------------------------------------------------------------

main:             
                  ldx #$00 
                  stx counter
                  stx $d020
                  stx $d021
                  inx
                  stx $0286
                  ldy #$01                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  dex  
-                 lda title,x                ; text: title
                  jsr bsout               
                  inx                     
                  cpx #$28                                  
                  bne -      
                  
                  ldx #$03                   ; line 
                  ldy #$04                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  ldx #$00
-                 lda detected,x             ; text: detection evaluated
                  jsr bsout               
                  inx                     
                  cpx #$18                                  
                  bne -      
                  inx
                  lda geo_hi                 ; build hex for output
                  sta geo_banks
                  lsr
                  lsr
                  lsr
                  lsr 
                  jsr add1
                  lda geo_banks
                  jsr add1
                  ldx #$00
-                 lda detected1,x             ; text: banks
                  jsr bsout               
                  inx                     
                  cpx #$6                                  
                  bne -      

                  ldx #$16                   ; line 
                  ldy #$01                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  ldx #$00
-                 lda spckey,x               ; text: press space or x
                  jsr bsout               
                  inx                     
                  cpx #$28                                  
                  bne -      
;------------------------------------------------------------
; keyboard
;------------------------------------------------------------

                  
keys              jsr get
                  cmp #$20                   ; spc-key
                  beq check
                  cmp #$58                   ; x for exit 
                  beq end
                  bne keys 

;------------------------------------------------------------
; check 16k-page
;------------------------------------------------------------


check:            inc geo_hi  
                  ldx #$16                   ; line 
                  ldy #$01                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  ldx #00
-                 lda plzwait,x              ; text: please wait
                  jsr bsout               
                  inx                     
                  cpx #$28                                  
                  bne -      
                  ldx #$00
-                 txa
                  pha
                  sta errpage 

                  lda #$07
                  sta color
                  lda #$7b
                  sta char
                  jsr show_check
                  jsr read16k
                  pla
                  tax
                  pha 
                  lda #$6c 
                  sta char
                  lda #$05
                  sta color
                  jsr show_check
                  jsr write16k
                  lda #$40  
                  sta m0+2 
                  sta m1+2
                  sta m4+2 
                  sta m5+2
                  pla
                  tax
                  inx
                  cpx geo_hi
                  bne -                 
                  ldx #$16                   ; line 
                  ldy #$01                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  ldx #$00
-                 lda finished,x             ; text: finished
                  jsr bsout               
                  inx                     
                  cpx #$28                                  
                  bne -      

                  jmp end

;------------------------------------------------------------
; write 16k from mem to georam
;------------------------------------------------------------



write16k:         ldy #$00
                  ldx #$00
-          
m4                lda check_buf,x
                  sta gport,x
                  lda gport,x
m5                cmp check_buf,x
                  bne error
                  inx
                  bne -             
                  inc m4+2
                  inc m5+2
                  iny
                  tya
                  sta gpage
                  cpy #$40
                  bne -
                  rts

;------------------------------------------------------------
; write 16k from georam to mem
;------------------------------------------------------------

                     
read16k:          ldy #$00
                  ldx #$00
-                 lda gport,x
m0                sta check_buf,x
                  lda gport,x
m1                cmp check_buf,x
                  bne error
                  inx
                  bne -             
                  inc m0+2
                  inc m1+2
                  iny
                  tya
                  sta gpage
                  cpy #$40
                  bne -
                  rts

;------------------------------------------------------------
; drop some chars on screen ... we're working
;------------------------------------------------------------

show_check:                   
                  lda char
m2:               sta $0544,x               ; show char 
                  lda color
m3:               sta $d944,x               ; set color ram  
                  inc counter 
                  lda counter
                  cmp #$40
                  beq next_line
                  rts
next_line:          

                  lda m2+1
                  clc
                  adc #$08
                  sta m2+1
                  bcs scram_hi
                  lda m3+1
                  clc
                  adc #$08
                  sta m3+1
                  bcs cram_hi
                  lda #$00
                  sta counter
                  rts                   
scram_hi:         inc m2   
                  rts  
cram_hi:          inc m3   
                  rts  

;------------------------------------------------------------
; show an error. format: geoport $hhll at 16k-page $ll
;------------------------------------------------------------


error:            lda #$02
                  sta $d020
                  txa 
                  sta temp                   ; store addr-lo 
                  ldx #$05                   ; line 
                  ldy #$01                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  ldx #$00
-                 lda err_txt,x              ; text 
                  jsr bsout               
                  inx                     
                  cpx #$10                                  
                  bne -      

                  ldx #$06                   ; line 
                  ldy #$01                   ; column
                  clc                     
                  jsr set_cursor             ; set cursor
                  ldx #00
-                 lda err_addr,x             ; text 
                  jsr bsout               
                  inx                     
                  cpx #$0e                                  
                  bne -      
                  lda m1+2                   ; get hi for output 
                  sta err_hi                  
                  sec         
                  sbc #$40                     
                  lsr
                  lsr
                  lsr
                  lsr
                  jsr add1
                  lda err_hi
                  jsr add1
                  lda temp                   ; get low for output
                  lsr 
                  lsr
                  lsr
                  lsr 
                  jsr add1
                  lda temp
                  jsr add1
                  ldx #$00
-                 lda err_page,x             ; text
                  jsr bsout               
                  inx                     
                  cpx #$0c                                  
                  bne -      
                  lda errpage                ; get 16k-page
                  lsr 
                  lsr
                  lsr
                  lsr 
                  jsr add1
                  lda errpage
                  jsr add1
                  pla
                  jmp end 
add1              and #$0f                   ; calculate to hex
                  cmp #$0a
                  clc
                  bmi +     
                  adc #$07
+                 adc #$30              
                  jsr bsout
                  rts 


;------------------------------------------------------------
; some text and bytes for working
;------------------------------------------------------------
cham:       !tx "    cHAMELEON c64 eMULATION DETECTED !  "
chc64:      !tx "    c64 AND cHAMELEON 64 DETECTED !     "
nothing:    !tx "    sORRY, dETECTION WAS FAULTY !       "
err_txt:    !tx " vERIFY-eRROR ! "
err_addr:   !tx "AT ADDRESS : $"
err_page:   !tx " IN PAGE : $"
title:      !tx "== gEO- AND nEORAM-tEST vERSION 1.0  =="
detected:   !tx " dETECTION EVALUATED : $"
detected1:  !tx " bANKS"
not_active: !tx " sORRY, NO ACTIVE RAM-EXPANSION FOUND.  "
spckey:     !tx "   - sPACE TO START OR x FOR EXIT -     "
plzwait:    !tx "  -- pLEASE WAIT - iT TAKES A WHILE --  "
finished:   !tx "  -- nO eRROR - hAVE A NICE DAY !   --  "

dummy:       !by $00
geo_banks:   !by $00 
temp:        !by $00
geo_hi:      !by $00
errpage:     !by $00
err_hi:      !by $00
counter:     !by $00
char         !by $00
color        !by $00
temp_buffer: !by $00

Letzte Änderung: 2013-08-13 17:42:36
  Rubrik:  C64
Rubriken-Übersicht
 5 Besucher online 

Valid XHTML 1.0 Transitional Valid CSS!