Hello, Guest the thread was viewed461 times and contains 11 replies

last post from 1570 at the

ca65 - ld65 Speicherconfig

  • Hi,
    ich programmiere mit ca65 und habe ein Problem mit der Speicherconfig. Ich möchte ein SID-File binär bei $c000 ablegen. Ich hab folgende c64-asm.cfg:

    Die Musik wird aber nur richtig abgelegt, wenn ich die size von BG bis zum Beginn von $c000 auf $9bc0 vergrössere und fill = yes setze. Kann ich das irgendwie konfigurieren, dass die Lücke bleibt und die Musik trotzdem bei $cooo abgelegt wird?

  • Das Problem ist, dass Du alles in einem Outputfile haben willst, aber in der Mitte einen Bereich hast, der gar nicht definiert ist und in dem der Linker gar nicht weiß, was er für Daten schreiben soll. Entweder musst Du also dem Linker sagen, was dahin soll (wie Du mit Vergrößern des vorigen Bereichs und setzen von fill getan hast), oder Du hängst das SID direkt hinter den BG-Bereich und kopierst es zur Laufzeit nach $c000.

  • Ja, das ist so. Es ist aber auch durchaus üblich, wenn Dinge an bestimmten Stellen im Speicher landen sollen, diese zur Laufzeit dorthin zu kopieren. Sonst wird das File ja unnötig groß (wobei ein Packer das wiederum vermeidet).

  • Ich würde es anders formulieren: Man _kann_ keine Lücken in der Datei haben, weil das Kernal keine Idee davon hat wie es damit umgehen soll. Es gibt ja außer Startadresse und Dateilänge auch keinerlei Informationen über die einzelnen Blöcke in der erstellten Datei. Lösung, wie gesagt: Den Programmblock beim Start selbst an die gewünschte Stelle kopieren; ich bilde mir sogar ein, daß manche Cruncher-Tools das automatisieren können, wenn man ihnen mehrere Binärdateien verfüttert.

    Bonuspunkte gibt es, wenn der Startcode beim erneuten Aufruf erkennt, daß er schon kopiert hat und ein weiterer Kopierdurchgang zu Datenverlust führt.

  • Man _kann_ keine Lücken in der Datei haben, weil das Kernal keine Idee davon hat wie es damit umgehen soll.

    Oder so :). In jedem Fall muss irgendeiner (sei es Linker oder Kernal) wissen, was in dieser Lücke sein soll.

  • Nein, wie mc71 schon sagt: ein File entspricht auf dem Cevi einem kontinuierlichen Speicherbereich. BSS irgendwo in der Mitte würde nur gehen, wenn man eine virtuelle Speicherverwaltung o.ä. hätte, die virtuelle Speicheradressen beliebig den realen Adressen zuordnet. So modernes Teufelszeugs ist dem Cevi fremd :D.

  • Aber man kann doch bestimmt diese Bereiche als BSS definieren, um Filegrösse zu sparen.

    Das Speicherformat ist einfach ein Speicherabbild, wie es halt in den Speicher geladen werden soll. Die einzige Verwaltungsinformation ist die Ladeadresse in den ersten beiden Bytes.


    Daher gibt es auch keine Segmente, also erst recht auch kein BSS-Segment. Dafür bräuchtest du einen extra Lader (oder Packer), was wurde schon oben beschrieben.


    Stell dir das C64-Format einfach wie eine .COM Datei vor, die allerdings - anders als richtige .COM unter DOS - nicht nur nach $0100 geladen werden kann, sondern an jede beliebige Adresse. Da konntest du ja auch keine Lücken lassen, ohne die Lücken zu füllen.


    EDIT: Claus war schneller.

  • Der beste Weg ist in diesem Fall, einfach zur Laufzeit die Daten an die gewünschte Position zu verschieben. Also Deine Music direkt hinter den BG-Bereich zu tun, und dann beim Start Deines Programms von da nach $c000 zu kopieren.