Hallo Besucher, der Thread wurde 3,5k mal aufgerufen und enthält 11 Antworten

letzter Beitrag von polluks am

[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.txt
    test.prg

  • Kann ich nicht nachvollziehen.


    Klassisches helloworld:


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

    gebaut mit


    Code
    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?

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

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

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

  • Zitat

    updaten


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

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


    Zitat

    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!

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

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

  • Der Vollständigkeit halber:

    Wie M.J. schrieb, wird ein zweiter Programmstart aus Effizienzgründen nicht unterstützt, wird vom C Standard auch nicht gefordert (vbcc erlaubt dies mit +c64r).

    Für "int main" habe ich damals eingeführt, dass man mit "PRINT ST" den Wert ausgeben kann.