[cc65] Programm erneut starten

  • [cc65] Programm erneut starten

    Ein (beliebiges) cc65-Programm läßt sich nach dem es beendet wurde hier nicht mehr mit "run" starten, alles was passiert ist, daß der Bildschirm gelöscht wird und "ready." erscheint, was so aussieht wie wenn ein BRK ausgeführt wurde.
    Anbei ein kleines Programm zu selbsttesten (kompilieren mit cl65 -o test.prg test.c).
    test.c
    test.prg
  • Kann ich nicht nachvollziehen.

    Klassisches helloworld:

    Quellcode

    1. #include <stdio.h>
    2. int main(void)
    3. {
    4. printf("Hello, world.");
    5. }
    gebaut mit

    Quellcode

    1. cc65 -ohello.s -tc64 hello.c
    2. ca65 -ohello.o -tc64 hello.s
    3. cl65 -ohello.prg -tc64 hello.o
    lässt sich hier beliebig oft ausführen ohne Probleme. Vielleicht mal den cc65 aktualisieren? Oder hast du irgendwo das Zielsystem (-tc64) vergessen?
  • Seine Version definiert keinen Rückgabetypen. Wenn jetzt bei Programmende ein INT vom Stack geholt wird, dass dort gar nicht hingepackt wurde, was passiert dann?

    KORREKTUR: er definiert VOID statt INT. Wird auch dann der Stack verändeert?
    Life's good! :thumbup:
  • Also ich habe keine Ahnung, was cc65 mit dem rückgabewert von main() überhaupt anfängt. void main(void) ist jedenfalls keine Standard-Signatur (standard sind nur int main(void) und int main(int, char**)). Aber wenn der Compiler sie "frisst" muss er daraus auch korrekten Code erzeugen, nur um sicherzugehen hab ich das auch noch ausprobiert mit dem gleichen Resultat -> funktioniert wie erwartet.

    Der Vollständigkeit halber:
    • Optimierungen (-O) machen hier auch nichts kaputt
    • Fehlendes target system (ohne -tc64) macht nur die Übersetzung ASCII->PETSCII kaputt, der Code läuft trotzdem noch korrekt und lässt sich beliebig oft starten
    Vorschlag: cc65 aktualisieren.
  • Die INT MAIN Variante wird eigentlich bei Shell-Programmen benötigt, um in Skripten den Rückgabewert eines Programms auszuwerten. Dieser KANN, MUSS aber nicht ausgewertet werden. Zurückgegeben wird in jedem Fall ein INT. Bei VOID wird kein Wert zurückgeben.

    Wie zrs1 somit korrekt bemerkte, müsste der Compiler für beide Fälle korrekten Code generieren.

    Muss also tatsächlich eine defekte cc65 installation oder ein Fehler in der tool chain sein.
    Life's good! :thumbup:
  • Mal kurz die Doku gewälzt -> hier wird void main(void) nicht verwendet, auf der Seite zu cc65 ist sogar die Rede davon, dass im Standard-Modus ein int von main() zurückgegeben werden muss. Wie gesagt ist void main() nur als implementation-defined Signatur möglich, im Standard gibt es das nicht. Vielleicht ist der Support dafür erst "kürzlich" in cc65 hinzugekommen.

    Wenn alles nichts hilft, updaten. Die Versionen, die es auf cc65.org zum Download gibt sind hoffnungslos veraltet, hier gibt's die aktuellen Versionen.
  • Hab mir das Programm kurz angesehen. Dabei entsteht folgender Eindruck:
    $0819: Ziemlich direkt nach Start des Programms wird eine Unterroutine bei $1291 zur Initialisierung aufgerufen.
    $081f: Im Anschluß wird eine weitere Initialisierungsroutine aufgerufen, die den Variablenspeicher löscht. Wohl aus Speicherplatzgründen wird hierbei die nun nicht mehr gebrauchte Routine von $1291 dem Variablenspeicher zugerechnet und ebenfalls mit dem Wert 0 überschrieben.

    Wenn man nun das Programm ein zweites Mal startet, fehlt die Routine bei $1291, und der Prozessor trifft nur auf ein BRK.
  • M. J. schrieb:

    Hab mir das Programm kurz angesehen. Dabei entsteht folgender Eindruck:
    $0819: Ziemlich direkt nach Start des Programms wird eine Unterroutine bei $1291 zur Initialisierung aufgerufen.
    $081f: Im Anschluß wird eine weitere Initialisierungsroutine aufgerufen, die den Variablenspeicher löscht. Wohl aus Speicherplatzgründen wird hierbei die nun nicht mehr gebrauchte Routine von $1291 dem Variablenspeicher zugerechnet und ebenfalls mit dem Wert 0 überschrieben.

    Wenn man nun das Programm ein zweites Mal startet, fehlt die Routine bei $1291, und der Prozessor trifft nur auf ein BRK.
    Das wäre dann eindeutig ein Fehler im Compiler, wenn korrekt compiliert wurde...
    Life's good! :thumbup:
  • updaten

    Das war das erste, was ich gemacht habe. :*)

    Quellcode

    1. $ cl65 -V
    2. cl65 V2.16 - Git 811424cc1

    void main() vs. int main()

    Das war das zweite was ich ausprobiert habe. Leider kein Unterschied. (╯°□°)╯︵ ┻━┻

    Ich habe das Problem nun gelöst, indem ich den cc65 wieder auf die Version 2.13.9 von 2011 herunterdatiert habe.
    Danke für eure Tips!
  • [cc65] CIA TOD AM/PM-Flag verkehrt?

    Wenn ich 0x12 (BCD für 12 Uhr Nachts) in das Stundenregister schreibe, lese ich 0x92 -- also 12Uhr Nachmittags (0x12 + 0x80).
    Wenn ich 0x92 (BCD für 12 Uhr Nachmittags) in das Stundenregister schreibe, lese ich 0x12 -- also 12Uhr Nachts.
    Dateien
  • moiree schrieb:

    Wenn ich 0x12 (BCD für 12 Uhr Nachts) in das Stundenregister schreibe, lese ich 0x92 -- also 12Uhr Nachmittags (0x12 + 0x80).
    Wenn ich 0x92 (BCD für 12 Uhr Nachmittags) in das Stundenregister schreibe, lese ich 0x12 -- also 12Uhr Nachts.
    Ja, das ist völlig normal. Immer wenn 12:00 Uhr erreicht wird, wird das AM/PM-Flag invertiert, das ist eine Eigenschaft (bzw. Bug) des CIA-Chips.
    Yes, I'm the guy responsible for the ACME cross assembler