Assemblierproblem mit ACME

Es gibt 42 Antworten in diesem Thema, welches 9.525 mal aufgerufen wurde. Der letzte Beitrag (30. Juli 2016 um 00:09) ist von Mac Bacon.

  • Hallo,

    ich habe auf C64 Wiki ein ACME-Codebeispiel für einen Sprite-Sternenhimmel gefunden.
    Mit der Anweisung acme -o programm.prg source.a kommt aber kein lauffähiges Programm raus obwohl ACME keine Fehler wirft.

    Bitte melde dich an, um diesen Link zu sehen.

    Weiß jemand woran es liegt? Ich nutze ACME 0.95.6 unter Windows.

  • !to"sternenhimmel.prg",cbm in den Source und mit acme sternenhimmel.asm kompilieren ?


    Edit: bei mir klappte es aber auch mit "-o" anstatt "!to" im Source.

    So läuft es:

    Code
    !to"stars.prg",cbm
    *=$0800
    !byte $00,$0c,$08,$0a,$00,$9e,$32,$30,$36,$33,$00,$00,$00,$00
    *=$080f
    ; ----- @Hauptprogramm@ -----

    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. |

    2 Mal editiert, zuletzt von cbmhardware (15. Juli 2016 um 15:45) aus folgendem Grund: Nachtrag, Nachtrag, Nachtrag ...

  • Mit der Anweisung acme -o programm.prg source.a kommt aber kein lauffähiges Programm raus obwohl ACME keine Fehler wirft.

    Wenn da kein Fehler kommt, wurde die Datei erstellt. Hast Du die Anweisung selbst im Command-Fenster eingegeben oder über irgend ein Klickibunti-Tool gestartet?

    EDIT: Ach so, die Datei wird zwar erstellt, aber läuft nicht. Bitte noch den Schalter "-f cbm" benutzen, damit auch eine Ladeadresse davorhängt.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • CBM Hardware's Weg klappt auch bei mir. Super, danke.
    Die Anweisung habe ich in einer Dosbox gestartet. Acme ist im Path, die ACME Lib in der ACME Umgebungsvariable.

    Edit:

    Die Code-Beispiele aus dem ACME Archiv (Intros, Demos) klappten alle von vornherein. Nur das C64 Wiki Beispiel wollte nicht.

  • So läuft es:

    Code
    !to"stars.prg",cbm
    *=$0800
    !byte $00,$0c,$08,$0a,$00,$9e,$32,$30,$36,$33,$00,$00,$00

    Bitte bring fragenden Anfängern nicht diesen Mist bei. Programme mit Basic-Header beginnen bei $0801.
    Ja, ich kann mir denken, welchen Vorteil Du Dir davon versprichst, aber das wiegt die Verwirrung bei Anfängern nicht auf.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Nur das C64 Wiki Beispiel wollte nicht.

    Ich hab's im Wiki korrigiert. Das Problem ist das Dateiformat: Ganz früher hat ACME standardmäßig Dateien im Commodore-Format erzeugt, also mit einer Ladeadresse vor dem Binary. Da die 6502-Familie deutlich mehr Plattformen umfasst, habe ich das irgendwann geändert, und seitdem muss das Format explizit gewählt werden, sonst bekommt man eine Datei ohne Ladeadresse. Man braucht also entweder den Switch "-f cbm" (oder lang "--format cbm") oder das "cbm"-Anhängsel wenn man "!to" benutzt.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Hi,
    danke. Dann brauche ich es nicht zu tun. :)

    Gruß höp

    8 Bit sind genug, sonst komme ich morgens nicht aus dem Bett. %)

    „Nous sommes dans un pot de chambre et nous y serons emmerdés.“
    („Wir sitzen in einem Nachttopf und wir werden darin zugeschissen werden“)
    2.9.1870, Auguste-Alexandre Ducrot

    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen. The home of ACME win32 compile.

  • Ja, ich kann mir denken, welchen Vorteil Du Dir davon versprichst

    Welchen denn?

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

  • Falls ein Decruncher oder schiefgegangene eigene Maschinenspracheversuche Grütze in Speicherstelle 2048 zurückgelassen haben (nämlich irgendwas ungleich Null), so ergibt RUN immer nur SYNTAX ERROR. Das kann nervig sein, da STOP+RESTORE das Problem nicht beseitigt. Ein Programm mit Ladeadresse 2048 zu laden behebt das Problem, aber das tut eben auch ein POKE2048,0 oder, am einfachsten, ein Reset.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Oha. Naja, dafür würde ich auch nicht das Laden mit ,8: opfern ^^ . Vielen Dank für die Info!

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

  • Oha. Naja, dafür würde ich auch nicht das Laden mit ,8: opfern .

    wieso, das gepackte file ist doch per ,8 zu laden :bgdev

    Viele Grüße,
    GI-Joe
    Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.

  • Bitte bring fragenden Anfängern nicht diesen Mist bei. Programme mit Basic-Header beginnen bei $0801.


    Man kann die eine $00 bei $0800 wegwerfen und alles ein Byte verschieben. Dann ist die Basic-Header wieder schön.
    Ich verwende das schon ewig so, auch vor Jahren mit Packer. Beim Laden mit Jiffy "%" machte sich das bisher nicht negativ bemerkbar. Aber ich werde mich bessern ... :saint: Die Aufdröselung im Wiki ist für Anfänger auch transparenter als die Byte-Kette.

    Code
    !to"stars.prg",cbm
    *=$0801
    !byte $0d,$08,$0a,$00,$9e,$32,$30,$36,$32,$00,$00,$00,$00
    *=$080e
    ; ----- @Hauptprogramm@ -----

    If we're evil or divine - we're the last in line. - Ronnie James Dio (1984) -
    Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. |

  • Beim Laden mit Jiffy "%" machte sich das bisher nicht negativ bemerkbar.

    ja logisch, weil ein % bei JiffyDOS gleichzusetzen ist mit LOAD"...",8,1
    versuche mal unter Jiffy ein , dann wirste schon sehn, was de davon hast :bgdev

    und genau das mit dem ,8: laden meine MacBacon wohl ..... ;)

    Viele Grüße,
    GI-Joe
    Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.

  • Also ich hätte da gerne ein gutes Tutorial, das einen Schritt-Für-Schritt in die Materie des ACME einführt! Das wäre bestimmt für viele hilfreich. Und keinen Link auf ein Wiki, sondern ein gutes Tutorial, dass die ganzen tollen Dinge des ACME schön kleinschrittig erklärt, damit auch so Deppen wie ich damit klar kommen können...

  • ACME macht glaube ich das Einbinden von Binaries an bestimmten Adressen und das Starten des Basic Programms an anderen Stellen als $0801 angenehmer möglich als ca65.

    Da muss man nämlich gleich die Konfig File Keule rausholen und für den Linker Segmente definieren die leer bleiben wenn man nicht von Hand ein Binary kopiert. Incbin klappt dann nicht mehr. Das Segment Prinzip wird als überlegener Vorteil beschrieben obwohl man es mit org und res als Direktiven viel einfacher hat.

    Ich habe gerade meine Probleme damit ein nicht re allokierbares SID Stück mit ca65 dort einzubinden wo es hin muss. Das klappt bei mir nur mit res und org als Ausnahme die der ca65 Programmierer eigentlich nicht mag. Ich muss dann sys 2064 machen damit es klappt und warum es nur mit Adresse $810 aber nicht $801 geht ist mir auch schleierhaft.

    Mit Segment und incbin geht es gar nicht weil ich nicht weiß wie ich von Hand das Sid File kopieren muss. Incbin klappt nur an die Stelle wo ich im Source gerade bin. Das SID File will da aber nicht hin.

    Ich überlege daher den Cross Assembler zu wechseln weil er mir zu "fortschrittlich" ist.

  • Ich habe gerade meine Probleme damit ein nicht re allokierbares SID Stück mit ca65 dort einzubinden wo es hin muss. Das klappt bei mir nur mit res und org als Ausnahme die der ca65 Programmierer eigentlich nicht mag. Ich muss dann sys 2064 machen damit es klappt und warum es nur mit Adresse $810 aber nicht $801 geht ist mir auch schleierhaft.


    Wie versuchst du es denn genau?

  • Das Segment Prinzip wird als überlegener Vorteil beschrieben

    Das ist es auch, weil man damit Dinge wie "der Code soll halt da anfangen, wo der andere Code zuende ist" ohne händische rumrechnerei (am besten kombiniert mit meinem Lieblings-Workaround: Sprungtabellen :odo ) lösen kann. In der Tat ist das Schreiben der Linker-Configfiles erstmal gewöhnungsbedürftig, aber wenn man mal weiß wie es geht, ist es kinderleicht.

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

    2 Mal editiert, zuletzt von Claus (19. Juli 2016 um 01:26)

  • Klappen tut es nur mit

    .org
    .code

    (...)

    .res
    .incbin

    und man MUSS die Basic Zeile auf $810 setzen. Bei $801 klappt es nicht (siehe erste auskommentierte Zeile. Man startet dann mit sys 2064. Ich weiß nicht warum nur $810 klappt - das mit $810 stand in einem Tutorial für einen IRQ-gestützten SID-File-Player schon fest. Ich habe nur das SID-File, die Adressen im SID-File geändert und das Geschehen drumherum ergänzt.

    Der C64 spielt das Stück ab, wechselt die Rahmenfarbe (langsam) und es steht Text auf dem zuvor gelöschten Bildschirm - den ich mit einer eigenen Routine löschen muss, denn die ROM-Routine macht den IRQ (warum auch immer) kaputt.

    .segment und .incbin, wie es "fortschrittlich" sein muss, sind im Sourced auskommentiert weil ich nicht weiß wie ich es mit diesen Direktiven zum Laufen bringen soll.

    Edit:

    Hier Ulrich v. Bassewitzs Erklärung zum Incbin/Segment-Thema:


    Please note that it is your job to make sure the resulting data is loaded to$5000. Anything the linker will do for you is to relocate the data in thesegment named "SOUND" to the address $5000 and write it to the given file. Forexample, if you just have this segment in your config file, and then load theresulting binary to $1000, it won't work. While the linker can prepare thedata so it is able to run at the given address, it cannot load it to thataddress. The standard setup for the C64 is to load the generated program at$801 (the BASIC start). The linker is used to relocate the data for thisaddress, and the startup code will take all necessary steps to initialize allnecessary stuff so the program can run. If you want something special (likeloading something to $5000), you will have to do that yourself.


    Das Zitat ist verlinkt, da steht dann auch der Rest drin.

  • Hi,

    hm, da geht noch einiges durcheinander. cl65 ist das Link&Build-Tool für C-Code, für Assembly solltest Du den ld65 (den reinen Linker) benutzen. Das Linker-Configfile kann viel simpler aufgebaut sein, da Du in Deinem Fall nur ein einziges Segment brauchst. So etwa:

    MEMORY {
    BYTEBREAKERMEM:
    start = $0801-2,
    size = $1000,
    file = "sid2.prg";
    }

    SEGMENTS {
    BYTEBREAKER:
    load = BYTEBREAKERMEM,
    define = yes;
    }

    Für das SID brauchst Du kein Segment, da es nicht assembliert wird (ist es ja schon). Also kannst Du es einfach am Ende Deine Programms includen, musst es aber zur Laufzeit an die richtige Stelle kopieren. So wie es im Moment ist, erzeugst Du ein riesiges Loch mit Nullen mitten im Programm, damit das SID an die richtige Stelle geladen wird.

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

  • Und genau das macht ACME als default so was ich ebenfalls (persoenlich) nicht mag.

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