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. |
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. Links im Bild sieht man den normalen Programmlauf und rechts einen Abbruch nach Fehler. 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: 2019-01-03 12:06:27