[cc65] Problem mit cprintf()

Es gibt 4 Antworten in diesem Thema, welches 1.935 mal aufgerufen wurde. Der letzte Beitrag (29. Januar 2018 um 12:57) ist von ogd.

  • Ich bin gerade dabei meinen glorreichen letzten Platz der tenliner competition 2017 noch einmal in C und optisch ein bisschen ansprechender zu programmieren.
    Leider kommt es bei der Benutzung von cprintf() dazu, dass mir nach dem Start des Programms nur der Basic Schirm angezeigt wird, das aber mit meinem custom charset.
    Es werden wohl irgendwelche Speicherbereiche überschrieben. Kann es etwas damit zu tun haben dass ich den Bildschirmspeicher verschoben habe?

    Ich hab den momentanen Stand mal angehangen.

    die Speicherbereiche definiere ich in globals.h, das Problem tritt in der Funktion ingame() in der game.c auf (da wo cprintf() auskommentieren).

    Der Code ist noch nicht sonderlich schön, ich benutze z.B. int's wo uchars angebracht wären und einiges könnte noch in Funktionen ausgelagert werden, aber aufräumen wollte ich später.

    irgendwelche Tipps? Danke schonmal Bitte melde dich an, um dieses Bild zu sehen.

  • Es werden wohl irgendwelche Speicherbereiche überschrieben.


    Ja, das passiert ziemlich schnell. Wenn ich das richtig sehe, versuchst du sowohl Bildschirm-/Zeichensatz-Speicher und -Daten, als auch das eigentliche Programm mit zusätzlich eingebunden Laufzeitroutinen wie cprintf() in die erste Videobank (0x0000-0x3FFF) reinzuquetschen. Kriegst du es hin, zum Beispiel die letzte Videobank (0xC000-0xFFFF) zu aktivieren und als Bildschirm-/Zeichensatz-Speicher 0xC400 bzw. 0xC800 zu benutzen? Dabei nicht vergessen, das High-Byte (0xC4) des neues Bildschirmspeichers in die Speicheradress 648 (0x288) zu schreiben..

    Per Default nutzt cc65 allerdings den gesammten Speicherbereich von 0x0801bis 0xCFFF. (Das Basic-Rom wird ausgeblendet.) Damit nicht in die Videobank reingepfuscht wird, müsstest du also noch das Speicherende mit Hilfe einer angepassten c64.cfg-Datei auf 0xBFFF runtersetzen. Ob das auch mit dem benutzten generischen Makefile geht, kann ich aber nicht sagen.

    Falls du noch mehr Hilfestellung brauchst, einfach nachfragen.

  • In der obersten VIC-Bank hast Du aber keinen Zugriff auf den ROM-Zeichensatz. Den gibt es aus VIC-Sicht nur bei $1000 und $9000, dafür kann er auf das RAM an diesen Adressen nicht zugreifen. Oder schaltet cprintf auf den Textbildschirm zurück, läßt den Zeichengenerator aber auf dem ex-Hires-Screen stehen?

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

  • Vielen lieben Dank erstmal. Es klappt soweit.

    Ich hoffe, dass in der c64.cfg den Wert von __HIMEM__ von d000 auf c000 zu ändern, korrekt war.

    Das mit dem highbyte hatte ich erst irgendwie ignoriert und enttäuschenderweise zwar ein laufendes Programm, aber letztendlich gar keine Textausgabe gehabt. Nach ewigen hin und her probieren hab ich geforscht was diese Speicherstelle bewirkt und dachte mir anschließend ich idiot. :D

    Danke für diesen Selbstlernprozess.

    :thnks::)

  • Vielen lieben Dank erstmal. Es klappt soweit.


    Gerne, freut mich auch :)

    Ich hoffe, dass in der c64.cfg den Wert von __HIMEM__ von d000 auf c000 zu ändern, korrekt war.


    Wie gesagt, kann ich nicht sagen, inwieweit das generische Makefile das berücksichtigt. Aber falls du mir das neue Programm per PN zusenden magst, schaue ich mir das gerne mal an.

    Das mit dem highbyte hatte ich erst irgendwie ignoriert ...


    Wer nicht hören will, der ... Nein, war nur Spaß :)

    In der obersten VIC-Bank hast Du aber keinen Zugriff auf den ROM-Zeichensatz.


    Hier wird ja nur ein selbstdefinierter Zeichensatz benutzt. Der eingebaute Zeichensatz muss daher für den VIC-II nicht sichtbar sein.

    Oder schaltet cprintf auf den Textbildschirm zurück, läßt den Zeichengenerator aber auf dem ex-Hires-Screen stehen?


    cprintf() benutzt nur die Kernelroutinen zur Zeichenausgabe. Deshalb muss man auch das High-Byte (0xC4) des neues Bildschirmspeichers in die Speicheradress 648 (0x288) schreiben.