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)

  • 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!

  • Von BASIC aus ist der Bereich [...] gefahrlos "doppelt" zu verwenden!
    [...]
    Meine Testkopierroutine war sehr klein

    Ja, 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:


    Code
    1. LOAD"60KCOPY",8,1
    2. NEW
    3. SYS820,49152,1024,36864,128

    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.

  • ...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! :)

  • 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" un

    Code
    1. 0fOa=820to937:rEb:pOa,b:nE
    2. 1dA32,161,3,133,252,165,20,133,251,32,161,3,133,254,165,20,133,253,32,161,3,32
    3. 2dA155,183,142,0,209,120,169,52,133,1,160,0,166,254,240,32,177,20,14,0,209,176
    4. 3dA4,56,110,0,209,145,251,14,0,209,176,4,56,110,0,209,200,208,231,230,21,230
    5. 4dA252,202,208,224,166,253,177,20,14,0,209,176,4,56,110,0,209,145,251,14,0,209
    6. 5dA176,4,56,110,0,209,200,202,208,230,169,0,141,0,209,169,55,133,1,88,96,32,253
    7. 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):


    --------


    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 ....

  • 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)

    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.

  • 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 :honk: , 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 :)

  • @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!!!




    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?