Hallo Besucher, der Thread wurde 1,9k mal aufgerufen und enthält 15 Antworten

letzter Beitrag von faddie am

Absturz ab gewisser Länge - schon zu groß?

  • Moin,


    ich bin gerade ein wenig irritiert. Mein "Spiel" fängt bei $0801 und geht aktuell bis $3be8 (glaube ich zumindest).
    Aber leider schmiert es komplett ab und wirft mich ins Basic zurück. Mache ich's nur ein wenig kleinner, also z.B bis $3acd läuft alles. Die einzelnen Teile funktionieren losgelöst auch, ein Programmfehler dürfte es nicht sein.


    Kann ich denn nicht den Basic-RAM von $0800 bis $9fff vollstopfen? Da wäre eigentlich noch Luft.


    Jedenfalls weiß ich nicht, was da gerade los ist.


    PRG hängt dran, Code liegt hier:
    https://github.com/dkrey/mafia_asm


    Wenn jemand da einen Blick drauf werfen könnte, würde ich mich freuen :)

  • Ach du meine Güte. Wer soll den diese vielen Seiten Assembler durchschauen? ;)
    Interessanter wäre das vom Assembler erzeugte LST-File (also mit Adressen und Hexcodes). Da sieht man dann meistens schnell, was los ist.

  • Spontane Vermutung: Dein Zeichensatz liegt bei $3800.

    Code
    1. .const VICBANKNO = 0 //Nr. (0 - 3) der 16KB Bank | Standard: 0
    2. .const VICSCREENBLOCKNO = 1 //Nr. (0 -15) des 1KB-Blocks für den Textbildschirm | Standard: 1
    3. .const VICCHARSETBLOCKNO = 7 //Nr. (0 - 7) des 2KB-Blocks für den Zeichensatz | Standard: 2
    4. .const VICBITMAPBBLOCKNO = 0 //Nr. (0 - 1) des 8KB-Blocks für die BITMAP-Grafik | Standard: 0
    5. .const VICBASEADR = VICBANKNO*16384 //Startadresse der gewählten VIC-Bank | Standard: $0000
    6. .const VICCHARSETADR = VICCHARSETBLOCKNO * 2048 + VICBASEADR //Adresse des Zeichensatzes | Standard: $1000 ($d000)

    Daraus ergibt sich:
    VICBASEADR = VICBANKNO * 16384 = 0
    VICCHARSETADR = 7 * 2048 + 0 = $3800.


    Keine gute Idee, dort einen Zeichensatz hinzulegen. Tip: Verschiebe Zeichensatz und Textspeicher in die Bank 3, also ab $c000.
    Mehr kann ich spontan nicht finden, denn leider besteht Dein kleines Programm aus einem Haufen einzelner Quelltexte (24!) und verwendet zudem Macros, was einem Außenstehenden die Orientierung ziemlich erschwert.

  • Ach klar, der Zeichensatz! Das passiert, wenn man ohne nachzudenken, Code übernimmt. Wenn ich die Zeichensatzgeschichte auskommentiere, läuft auch alles wieder - natürlich ohne die Sonderzeichen.
    Das war so eine Aktion, nur schnell mal eben Umlaute einzubauen...


    Vielen Dank euch!

    Mehr kann ich spontan nicht finden, denn leider besteht Dein kleines Programm aus einem Haufen einzelner Quelltexte (24!) und verwendet zudem Macros, was einem Außenstehenden die Orientierung ziemlich erschwert.

    Ja, ich gebe zu Spaghetti-Code und Mafia passt zwar thematisch, aber anonsten ist es wohl nicht sehr hilfreich ;)


    Bei anderen Sprachen fand ich es immer ganz gut, den Code auf viele kleine Files zu verteilen. So unzufrieden bin ich bisher auch nicht, aber ich weiß ja auch, wo was eingebunden wird.


    Gibt es eigentlich irgendwo ein schönes Spieleprojekt, wo man sich einen besseren Stil abschauen kann?

  • Bei komplexeren Projekten ist eine Aufteilung in einzelne Files, welche inkludiert werden, durchaus sinnvoll :)


    Ich würde alle Grafiken (just like M.J.) in Bank 3 verschieben:
    Screen ab $c000 und Font/Sprites ins Ram ab $d000 (beim dorthin kopieren nicht vergessen, $01 entsprechend zu setzen und danach wieder zurückzusetzen).

  • Ach es ist ein Jammer mit mir ;)


    Mir ist zwar schon aufgefallen, dass in der Characterset-Routine die VIC Bank nicht so ohne weiteres gesetzt wird. Aber wenn ich das mache, so sieht man gar nichts mehr bis auf die Overscanfarbe.


    Ich hab noch mal das ganze Teil hier reinkopiert.
    Diese "magische" Zeile hab ich auch mal stehen gelassen, weil ich einfach davon ausgehe, dass sie funktioniert.
    lda #VICSCREENBLOCKNO * 16 + VICCHARSETBLOCKNO * 2


    Jedenfalls habe ich Screen und Charset auch mal per Bitmuster gesetzt, konnte aber trotzdem nichts erkennen.



  • Mir ist nicht ganz klar, wie Du den Textspeicher behandelst. Laut Deklaration soll der Textspeicher ab $c000 beginnen, doch sehe ich keine Routine zum Löschen des Bereichs geschweige denn für die Ausgabe von Zeichen. :gruebel Außerdem kannst Du Zeichen im Zeichensatz nur dann verändern, wenn Du den Bereich von $d000..$d7ff (, wo Dein Zeichensatz liegen soll,) auf Ram geschaltet hast. Da Du das Replace vornimmst, nachdem Du den Wert von $01 restauriert hast, gehen die Schreibzugriffe aber in die IO-Register.
    Tip: Benutz für den Anfang mal den Bereich $c800..$cfff als Speicher für den Zeichensatz. Dann kannst Du darauf zugreifen, ohne auf Ram umschalten und den Interrupt ausschalten zu müssen.

  • Da Du das Replace vornimmst, nachdem Du den Wert von $01 restauriert hast, gehen die Schreibzugriffe aber in die IO-Register.

    Mache ich das wirklich? jsr copyCharROM steht doch an der richtigen Stelle: Zeile 4,5 und 6 deaktiveren das IO und Zeile 10 und 11 aktivieren es wieder - nach meinem Verständnis.

    Momentan würde ich mein Problem eher auf die "Magic-Zeile" schieben - auch ein Nachteil, wenn man das Prinzip nicht verstanden hat ;)
    Ich versuche das noch einmal aufzudröseln und nachzuvollziehen.



    Muss ich den neuen Speicher eigentlich wirklich löschen? Würde das nicht ein Aufruf der Kernal-Routine unter $e544 machen?

  • Mache ich das wirklich? jsr copyCharROM steht doch an der richtigen Stelle...

    Wenn copyCharROM genau das macht, was der Name verspricht, dann gibt es woanders sicher noch ein copyNeueZeichenHinzu.
    das muss ja ebenfalls unter IO schreiben.
    Praktischerweise würde ich das gleich hinter dem copyCharRom machen.

  • Ja, stimmt. Aber bei mir hakt es ja noch an den Grundlagen. Und den Colorram muss ich ja auch noch löschen.
    Wenn ich copyCharROM auskommentiere, sieht es eigentlich fast vernünftig aus. Also bunte 8x8 Blöcke ohne Chars. Sobald copyCharROM wieder drin ist, stehen da leider nur noch @ Zeichen - also so richtig zu funktionieren scheint die Routine auch nicht.
    Ich mache nachher mal einen neuen Thread auf, das hat ja thematisch mit der Ausgangslage nichts mehr zu tun.

  • Bereich unter $d000 ist schon ein kleines bisschen Fortgeschritten :)
    Hast Du auch an $dd00/dd02 gedacht?
    Der VIC sieht nur 16KB, standardmäßig $0000 bis $3fff.
    Nun hast Du die Grafikdaten aber ab $c000, dass muss erst über $dd00 oder $dd02 umgeschaltet werden.

  • hm @ zeichen deuten auf ein nichteinhalten der convertierung zwischen petscii und screencodes hin...


    wenn ich poke 1024,0 schreibe erscheint ja auch nur ein @ wenn ich hingegen poke 1024,32 schreibe ein " ".


    ka welchen assembler du nutzt aber im acme kannst du text auch so definieren... (glaub)

    Code
    1. !scr "Hallo Welt!",0
  • @Mac Bacon hat das Problem schon gefunden. Ich habe den Kernal-Routinen nicht gesagt, wo sich jetzt der Bildschirmspeicher befindet und damit hat dann $ffd2 nur noch Unsinn angezeigt, zumal ich den Speicherbereich um $c000 nie gelöscht hatte.


    Momentan verwende ich übrigens den Kickassembler, weil Sublime-Text damit so schön funktioniert.


    Für die Nachwelt:
    lda #$c0 // Den Kernalroutinen sagen
    sta $0288 // dass der BS Speicher jetzt in C000 liegt