Hallo Besucher, der Thread wurde 6,4k mal aufgerufen und enthält 20 Antworten

letzter Beitrag von TheRyk am

NeoRAM Programmierung

  • Hi!


    Um den Software-Fred nicht weiter vollzumüllen, bevor wirklich was fertig ist, starte ich mal diesen Fred.


    Stand aktuell: Ich glaube, die Programmierung dank cbmhardware.de grob begriffen zu haben - nach einigen Kämpfen mit VICE2.1 (besser die .IMGs doppelt und dreifach sichern, bevor man sie sich zerschießt...). Habe mittlerweile erfolgreich ein paar VIC-Bänke hin und her kopiert, scheint tatsächlich nicht zu hoch für mich zu sein, das klappte echt gut.


    Was mich jetzt noch interessiert: Wäre ja schon recht elegant, wenn man nicht noch zusätzlich eine Disk braucht, sondern die Software nach dem Bespielen des NeoRAM direkt vom Modul starten kann. Enthusi hat doch bei MMGold geschafft, einen SYS-Start direkt vom Cartridge zu ermöglichen. Wie geht sowas denn?

  • Okay, sowas ähnliches hatte ich schon geahnt, Danke.


    Also Seite/Bank whatever #$00 frei lassen für den eigentlichen Code. Aber hilf mir nochmal auf die Sprünge: Wo genau muss der "Initialcode" dann innerhalb der ersten 16k hin? Vom C64 aus gesehen aus wird der SYS/jmp-Aufruf ja irgendwo zwischen $de00 und $deff liegen müssen, richtig?

  • Wo genau muss der "Initialcode" dann innerhalb der ersten 16k hin?

    Ganz an den Anfang in die ersten 256 Bytes (das meinte ich mit der ersten Page), denn nur diese sind nach dem Einschalten sichtbar.


    Vom C64 aus gesehen aus wird der SYS/jmp-Aufruf ja irgendwo zwischen $de00 und $deff liegen müssen, richtig?

    Ganz genau. ;)


    CU
    Kratznagel

  • 57000 hatte ich auch genommen. Laesst sich mit SYS5E3 starten, hehe.
    Hier einfach mal der launcher.asm code (damals noch im acme format):
    Ich hab das ein wenig kommentiert - frag sonst nach wenn es Unklarheiten gibt.



    Das Options ist einfach ein reservierter Bereich in dem ich z.B. die Einstellung ob man das intro vorher sehen will permanent speichere....
    Gruss,
    enthusi

  • Ja, den Trick mit SYS X E Y habe ich Enthusi schon mal für ein paar Dinge geklaut (geht auch schön, um einen vorhandenen Basic-Sys-Start wegzusägen und platzsparend durch Start in VIC-Bank 3 zu ersetzen).


    Danke fürs Sharen, Enthusi, ACME ist genau, was ich brauche, wenn ich feststecke, werde ich wie gewohnt herumnerven. :)

  • Inzugedessen wäre es ja mal schön wenn jemand ein Tool entwickelt mit dem man dateien ins NEORAM kopieren kann :)

    Gibt's doch schon längst: http://noname.c64.org/csdb/release/?id=61122
    Naja, man kann zumindest BASIC-Programme damit abspeichern. ;)
    Mit ein paar Tricksereien müssten aber auch andere Programme gehen.


    CU
    Kratznagel

  • Hi!


    Ich bin ziemlich weit fortgeschritten. Mir fehlen eigentlich nur noch Launcher und Loader (um schließlich das NeoRAM mit den 32X64 Blocks von Disk zu beschreiben.) Mit Enhusis Source komme ich über Relaunch/ACME 0.93 syntax-mäßig nicht so ganz klar und blicke auch glaube ich noch nicht 100%ig durch.


    Mein eigener Launcher will immerhin teilweise schon, bleibt aber doofer Weise noch nicht im Speicher. Das folgende (bei dem das Auslesen fehlt) funktioniert mit SYS4096 (Bank 0 beschreiben) und SYS56888 (was nichts weiter macht als Verschieben von $4100 nach $800 sowie anschließendes JMP $80d). Das PRG landet wirklich bei $80d und wird decruncht und gestartet. Soweit so gut.


    Es kann aber logischerweise nach einem Hard-Reset nicht mehr funktionieren, weil dafür ein "GeoREAD" fehlt.
    Aber wenn ich den folgenden Code bei $4038 ergänze, kriege ich nach Hard-Reset und SYS56888 immer "JAM at $DE77"


    Warum denn dieses? Wer kann helfen? Danke im Voraus!

  • Loader steht übrigens mittlerweile. Vielleicht nicht sonderlich posh, weil ich die Krill-Sources nur mit zerhackten Zeilenumbrüchen öffnen konnte und deshalb keinen Bock hatte, sie zu studieren, aber meine derzeitige Kombi (paar Zeilen ASM, paar Zeilen Basic, Uralt-Software-Speeder) ist auch funktional und schnell. :) Ich konnte also schonmal auf echter Hardware testen und bin schon sehr zufrieden.


    Wenn mir jetzt noch jemand mit dem Launcher helfen könnte, wäre es perfekt, weil man das Modul autark von jedweder anderen Quelle nutzen könnte. Wenn nicht, nutze ich die letzte Bank einfach noch für andere Sachen, ist notfalls auch okay, wenn auch natürlich nicht 101% comfortable.

  • So, ich habe den ganzen Code mal aufgeräumt, vereinfacht und so gut wie möglich kommentiert. Vielleicht wird dann deutlicher, wie das ganze funktioniert. Wenn nicht, einfach fragen. :)
    Alle benötigten Dateien sowie das ausführbare Programm (Launch.prg) befinden sich im Anhang. Das Programm kann nach einem Reset mit SYS 57000 wieder gestartet werden.



    Viel Spaß beim Ausprobieren. ;)


    CU
    Kratznagel

  • Super, Kratz!


    Vielen Dank! Ein Nach-Vorne-Rücken in den Scroller-Credz ist Dir gewiss. ;)


    Ich werde das morgen studieren und damit rummachen bzw. ggf. nachfragen. Da ich die nächsten 5 Wochen bis zur BCC#5 außer Beta-Testing eh nichts geplant hatte, ist ja auch noch Zeit.

  • Noch ein paar Anmerkungen zu dem Beispielcode:

    • Das so in die GeoRAM kopierte Programm ist "resetfest" und kann jederzeit wieder mit einem SYS 57000 gestartet werden. Bei der batteriegepufferten NeoRAM natürlich auch noch nach einem Stromausfall. ;)
    • Das Hauptprogramm (hier "Freeze.prg") wird vom Assembler zunächst an Adresse $0900 untergebracht. Beim initialen Befüllen (Abschnitt 1) wird es dann im Speicher der GeoRAM ab $000100 abgelegt (die ersten 256 Bytes von $000000 bis $0000ff beinhalten ja den Laucher-Code).
    • Der Launcher selbst (Abschnitt 2) wird dann über SYS 57000 gestartet. Dieser kopiert dann den GeoRAM-Reader nach $c000 und führt ihn dort aus.
    • Der GeoRAM-Reader (Abschnitt 3) letztendlich kopiert den Inhalt der GeoRAM ab Byte $000100 an ihren eigentlichen Bestimmungsort $0800 im C64-RAM. Durch den "jmp $080b" wird das Programm nach dem Kopieren dann ausgeführt.
    • Das "Restaurieren" der Speicheradresse an zwei Stellen ist hier nicht unbedingt notwendig, da beide Routinen eh nur ein einziges Mal aufgerufen werden, wurde aber der Ordnung halber so belassen. Selbstmodifiziernder Code ist eine beliebte Fehlerquelle.


    Folgendes ist zu beachten, wenn man das beispielhafte Hauptprogramm "Freeze.prg" durch ein anderes ersetzen will:

    • Ladeadresse: "Freeze.prg" muss für die Ausführung nach $0801 geladen werden. Da der GeoRAM-Reader die Daten bündig nach $0800 kopiert, wurde beim Assemblieren lediglich das erste Byte des PRG-Headers übersprungen (mit ",,1"). Somit landet am Ende das zweite Byte des PRG-Headers als Füllbyte an $0800 und das eigentliche Programm an $0801, da wo es hingehört. Quick&Dirty, aber funktioniert. ;)
    • Startadresse: Bei "Freeze.prg" ist die Startadresse $080b (siehe den JMP am Ende des GeoRAM-Readers). Muss für ein anderes Programm evtl. angepasst werden.
    • Es werden von diesem Code immer genau 16.128 Bytes kopiert (16 kb minus die 256 Byte für den Launcher). Lässt sich aber im Bedarfsfall leicht ändern.


    Natürlich lässt sich an diesem Code noch eine ganze Menge optimieren. Aber dieses Beispiel soll ja auch einfach nur das Grundprinzip verdeutlichen, wie Programmdaten in die GeoRAM hinein- und für die Ausführung wieder aus ihr herausgeschaufelt werden können. Optimieren kannst Du dann selber immer noch. :)


    CU
    Kratznagel

  • Ich geb mir ja schon wirklich Mühe, möglichst viel selbst auf die Reihe zu kriegen. :)


    War auch schon kurz davor, Dich mit PMs zu terrorisieren. Schätze, Du hättest mir das genauso erklären und servieren können wie Kratz, der einfach schneller war. Trotzdem vielen Dank!


    N8
    Ryk