So, ich hab mal ein bisschen rumgecoded und folgendes festgestellt:
Von BASIC aus ist der Bereich auf dem +60K von (dezimal):
4096 --> 40959 und
49152 --> 53247
---------------------------
= 40958
gefahrlos "doppelt" zu verwenden!
Es muss aber immer hin und hergeschaltet werden!
Als Zwischenspeicher beim Kopiervorgang hab ich jetzt mal den Kassettenpuffer (828)
verwendet, da dieser weit genug "unten" ist und locker z.B die 64Bytes für z.B. ein Sprite beinhalten kann.
Meine Testkopierroutine war sehr klein, wie das bei längeren Basicprogrammen ist,
muss ich später erst noch testen!
Hallo Besucher, der Thread wurde 17k mal aufgerufen und enthält 101 Antworten
letzter Beitrag von DerSchatten am
+60K Speichererweiterung für C64C (Assy 250469)
- Markaine
- Erledigt
-
-
Von BASIC aus ist der Bereich [...] gefahrlos "doppelt" zu verwenden!
[...]
Meine Testkopierroutine war sehr kleinJa, kein Wunder Solange BASIC Programm und alle Variablen in den "unteren" Speicher passen läuft das natürlich...
Ich versuch mal, eine kleine helper-routine für BASIC Programme zu bauen, mal sehen ob das was wird.
-
Bitte mal angehängtes Maschinenprogramm zum kopieren ausprobieren, "versteckt" sich im Datasetten-Puffer
Aufruf: SYS820,<Zieladresse>,<Größe>,<Quelladresse>,<Quellbank>
Quellbank ist 0 oder 128. Folgendes sollte z.B. 1 kByte von $9000 in der Speichererweiterung zu $c000 im Haupt-RAM kopieren:
Da ich die Hardware nicht habe kann ich es aber nicht selbst testen...
-
Ja, kein Wunder Solange BASIC Programm und alle Variablen in den "unteren" Speicher passen läuft das natürlich...
...und Strings hat das Testprogramm wohl auch nicht verwendet, denn die werden ja am oberen Ende des Speichers abgelegt und wären beim Umschalten also verschwunden.
-
Gibt es irgend wo eine guten Schaltplan? Dann würde ich heute Abend mal versuchen eine Platine zu entwerfen!
-
Gibt es irgend wo eine guten Schaltplan? Dann würde ich heute Abend mal versuchen eine Platine zu entwerfen!
Gibts doch alles schon hier, inkl. gerber Files!
-
Ok dann schau ich mir den mal an!
-
...und Strings hat das Testprogramm wohl auch nicht verwendet, denn die werden ja am oberen Ende des Speichers abgelegt und wären beim Umschalten also verschwunden.
Bis jetzt hab ich erstmal "Werte" in die 60K "gepoked" um diese dann wieder auszulesen und in das normale Basic RAM zu kopieren. Dabei nutze ich z.B. den Kassettepuffer als Zwischenspeicher.
Weitere Tests folgen! -
-
@zrs1 Grad getestet, funktioniert sehr gut und (natürlich) schnell!
Es wäre natürlich schon super wenn man das laden des MS-Programms einfacher
machen könnte, also als Bestandteil in einem Basic Programm, ohne "new" und so!Wenn ich das richtig verstehe, wäre es dann auch "egal" wie gross das Basic Programm ist?
-
Es wäre natürlich schon super wenn man das laden des MS-Programms einfacher
machen könnte, also als Bestandteil in einem Basic Programm, ohne "new" unCode- 0fOa=820to937:rEb:pOa,b:nE
- 1dA32,161,3,133,252,165,20,133,251,32,161,3,133,254,165,20,133,253,32,161,3,32
- 2dA155,183,142,0,209,120,169,52,133,1,160,0,166,254,240,32,177,20,14,0,209,176
- 3dA4,56,110,0,209,145,251,14,0,209,176,4,56,110,0,209,200,208,231,230,21,230
- 4dA252,202,208,224,166,253,177,20,14,0,209,176,4,56,110,0,209,145,251,14,0,209
- 5dA176,4,56,110,0,209,200,202,208,230,169,0,141,0,209,169,55,133,1,88,96,32,253
- 6dA174,32,138,173,76,247,183
(auch im Anhang 60kcopy.bas.prg)
Wenn ich das richtig verstehe, wäre es dann auch "egal" wie gross das Basic Programm ist?
Korrekt, beim verlassen der MC-Routine ist immer Bank 0 (internes RAM) konfiguriert.
Falls es jemanden interessiert, hier der ASM source (nach $0334 assemblieren):
Code- jsr fetchaddr
- sta $fc
- lda $14
- sta $fb
- jsr fetchaddr
- sta $fe
- lda $14
- sta $fd
- jsr fetchaddr
- jsr $b79b
- stx $d100
- sei
- lda #$34
- sta $1
- ldy #$00
- ldx $fe
- beq remainder
- pageloop: lda ($14),y
- asl $d100
- bcs banktoggle1
- sec
- ror $d100
- banktoggle1: sta ($fb),y
- asl $d100
- bcs banktoggle2
- sec
- ror $d100
- banktoggle2: iny
- bne pageloop
- inc $15
- inc $fc
- dex
- bne pageloop
- remainder: ldx $fd
- remloop: lda ($14),y
- asl $d100
- bcs banktoggle3
- sec
- ror $d100
- banktoggle3: sta ($fb),y
- asl $d100
- bcs banktoggle4
- sec
- ror $d100
- banktoggle4: iny
- dex
- bne remloop
- lda #$00
- sta $d100
- lda #$37
- sta $1
- cli
- rts
- fetchaddr:
- jsr $aefd
- jsr $ad8a
- jmp $b7f7
--------edit: Hänge mal noch eine geänderte Fassung an, geringfügig größer, aber sollte schneller laufen -- falls die auch korrekt funktioniert mach ich auch dafür noch einen BASIC loader Achtung: In der Version ist der "Quellbank" parameter entweder 1 oder 0 (nicht 128).
-
Jetzt kann ich leider nicht mehr editieren :o Mein Progrämmchen hat einen fiesen Bug, wird schnellstmöglich behoben!
Hintergrund: Damit sämtliche Speicherbereiche kopiert werden können wird der Prozessorport auf "all RAM" geschalten. Damit ist aber auch I/O weg, das Programm hat also nie wirklich die RAM-Erweiterung umgeschalten, weil ich das nicht bedacht habe :o peinlich ....
-
Ich hab auch grad festgestellt (beim test vom aller ersten 60kcopy.prg aus der Nr.43)
dass der Wert im 60K gelesen wird, aber dann nicht nur ins c64RAM sondern auch in die 60K bei 49152 geschrieben wird. -
Hier eine korrigierte Fassung -- kann auch sämtliches RAM kopieren, jetzt hoffentlich bugfrei -- muss dazu aber pro kopiertem Byte 4 mal den Prozessorport umschalten (natürlich immer noch viel schneller als kopieren in BASIC)
Code- jsr fetchaddr
- sta $fc
- lda $14
- sta $fb
- jsr fetchaddr
- sta $fe
- lda $14
- sta $fd
- jsr fetchaddr
- jsr $b79b
- txa
- lsr
- lda #$80
- ldx #$6e
- ldy #$0e
- bcs start
- ldx #$0e
- ldy #$6e
- asl
- start: stx prepread1
- stx prepread2
- sty prepwrite1
- sty prepwrite2
- sta $d100
- sei
- lda #$34
- sta $1
- ldy #$00
- ldx $fe
- beq remainder
- pageloop: lda ($14),y
- inc $1
- prepwrite1: asl $d100
- dec $1
- sta ($fb),y
- inc $1
- prepread1: ror $d100
- dec $1
- iny
- bne pageloop
- inc $15
- inc $fc
- dex
- bne pageloop
- remainder: ldx $fd
- remloop: lda ($14),y
- inc $1
- prepwrite2: asl $d100
- dec $1
- sta ($fb),y
- inc $1
- prepread2: ror $d100
- dec $1
- iny
- dex
- bne remloop
- lda #$00
- sta $d100
- lda #$37
- sta $1
- cli
- rts
- fetchaddr:
- jsr $aefd
- jsr $ad8a
- jmp $b7f7
Aufruf: SYS820,<Zieladresse>,<Größe>,<Quelladresse>,<Quellbank>
Quellbank ist 0 (von intern auf Erweiterung) oder 1 (umgekehrt).
Im Anhang ein Maschinencode-Programm zum laden mit ,8,1 (danach NEW nicht vergessen) und eine Version als BASIC DATA-Zeilen loader.
-
-
-
@zrs1 Funktioniert nicht so richtig! Hab´s mehrmals gechecked!
Ich habe zu testzwecken auf dem 60k, 20x die "111" gespeichert und dann das
in den C64RAM kopiert, heraus kam sowas:
20180919_212433 Kopie.jpg -
Ich denke ich hatte das so weit per Debugger überprüft, dass ich sicher sein kann, dass es korrekt arbeitet, wenn auch die Umschaltung so funktioniert wie ich denke. Werde das aber später nochnal überprüfen!
Ein Problem wäre, falls dieses Register bei $d100 write only wäre, oder beim lesen etwas anderes tut. Kann jemand dazu was sagen?
@Womak wie befüllst du denn das RAM der Erweiterung für den Test? Wäre vielleicht eine kleine BASIC Testsuite hilfreich?
-
Hat sich glaube ich alles erledigt ...
- VICE kann dieses Ding ja emulieren! Wieso sagt mir das keiner?
- Hatte den quasi gleichen Fehler wieder drin , der war einfach nur, dass die Routine nicht korrekt auf das interne RAM zurückgeschalten hat, wieder wegen falsch konfiguriertem Prozessorport, diesmal eben am Ende -- ansonsten hatte alles funktioniert :o
Also, hier die abermals korrigierte Version, diesmal selbst getestet mit Vice und einer Emulation dieser +60k Erweiterung
Code- jsr fetchaddr
- sta $fc
- lda $14
- sta $fb
- jsr fetchaddr
- sta $fe
- lda $14
- sta $fd
- jsr fetchaddr
- jsr $b79b
- txa
- lsr
- lda #$80
- ldx #$6e
- ldy #$0e
- bcs start
- ldx #$0e
- ldy #$6e
- asl
- start: stx prepread1
- stx prepread2
- sty prepwrite1
- sty prepwrite2
- sta $d100
- sei
- lda #$34
- sta $1
- ldy #$00
- ldx $fe
- beq remainder
- pageloop: lda ($14),y
- inc $1
- prepwrite1: asl $d100
- dec $1
- sta ($fb),y
- inc $1
- prepread1: ror $d100
- dec $1
- iny
- bne pageloop
- inc $15
- inc $fc
- dex
- bne pageloop
- remainder: ldx $fd
- remloop: lda ($14),y
- inc $1
- prepwrite2: asl $d100
- dec $1
- sta ($fb),y
- inc $1
- prepread2: ror $d100
- dec $1
- iny
- dex
- bne remloop
- lda #$37
- sta $1
- lda #$00
- sta $d100
- cli
- rts
- fetchaddr:
- jsr $aefd
- jsr $ad8a
- jmp $b7f7
-
@zrs1 Sorry, jetzt funktioniert es bei mir gar nicht mehr!
Vorher natürlich load und new oder das basic programm gestartet (kann danach ja überschriebne werden!?!)
zum Testen nehme ich folgendes Basicprog:
(entsprechenden Befehl starte ich z.B. mit "RUN4000" usw...)
Das 60K fülle ich hier z.b. mit zahlen von 0 - 63, das kann dann nicht zufällig passieren!!!Code- 100 rem *** 60k fuellen ***
- 200 poke 53504,128
- 300 forn=0to63
- 400 poke 8000+n,n
- 500 nextn
- 600 poke 53504,0
- 700 stop
- 3000 rem *** c64 auslesen ***
- 3100 poke 53504,0
- 3200 forn=0to63
- 3300 printpeek(49152+n)
- 3400 nextn
- 3500 stop
- 4000 rem *** 60k auslesen ***
- 4100 poke 53504,128
- 4200 forn=0to63
- 4300 printpeek(8000+n)
- 4400 nextn
- 4500 poke 53504,0
- 4600 stop
- 5000 rem *** copy 60k-->c64 ***
- 5100 sys 820,49152,64,8000,1
- 5200 stop
- ready.
Hast du irgendwas wichtiges geändert?
Es hat ja schon gut funktioniert!
Stimmt das mit "0" und "1" als "Bank"???Liegt das prog immer noch bei 820?
Oder sind das alte oder falsche Programme?