ca65 - ld65 Speicherconfig

Es gibt 11 Antworten in diesem Thema, welches 1.135 mal aufgerufen wurde. Der letzte Beitrag (3. April 2024 um 14:44) ist von 1570.

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

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

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

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

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

    KI-Verwendung in diesem Posting: Rechtschreibkontrolle des Browsers.
    Abweichungen aufgrund des technischen Fortschritts oder individueller Vorlieben vorbehalten.

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

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

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

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

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

  • Das heisst, wenn ich in der Mitte einen Speicherbereich nicht benutzen oder überschreiben will, komm ich nicht um ein weiteres File und einen Loader herum?

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

    ────────────────────────────────────────────────────────────
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    ────────────────────────────────────────────────────────────

  • Oder einen Packer wie Exomizer zu benutzen, der entweder die Nullen im Füllbereich wegkomprimiert oder dem man direkt die einzelnen Bereiche beim Packen gibt und der dann beim Entpacken auch nur diese Bereiche entpackt.

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.