Beiträge von ogd im Thema „Sammelthread: Lernen aus Fehlern“

    Wegen 2) denke ich, dass ich den BRK gar nicht sicher erkennen kann.

    Bin noch nicht sicher, was die beste Lösung ist.

    Entweder damit rechnen, dass BRK nicht verlässlich ist, was aber das Problem mit Stable Raster nicht löst.

    Einfach mal ins Blaue: Geht das vielleicht auch, wenn man statt BRK ein NMI manuell per Software auslöst? IRQ- und NMI-Vektoren sind ja getrennt.

    EDIT: Um on-topic zu bleiben: Ein beliebter vermeidbarer Fehler ist, mit "+1" bei manchen Variablen das Low- und bei manchen das High-Byte zu referenzieren. :D

    Da bin ich ja der Meinung: IMMER little-endian, ausnahmslos :biggrin: Die CPU selbst macht das so. BASIC macht es wohl an ein paar wenigen Stellen big-endian, schlimm genug :biggrin:

    Auch Rodnay Zaks empfielt das in seinem bekannten Buch "Programmierung des 6502":

    Zitat

    In der Tat werden Adressen durch den 6502 gerade umgekehrt gespeichert. Zuerst kommt der niederwertige Teil, in der nächsten Speicherstelle dann der höherwertige. Um für Daten und Adresse dieselbe Vereinbarung zu haben, ist zu empfehlen, auch bei Daten die höherwertige Hälfte nach der niederwertigen Hälfte im Speicher zu halten.

    Also gilt auch hier: Konsistenz immer vor Schönheit!

    Interrupt - Initialisierung

    In manchen, besonders älteren Anleitungen steht folgender Beispielcode:

    (*) In der Zeit zwischen Interruptsperre durch SEI und Ausschalten der CIA-Interrupts kann ein nicht behandelter Timer-Interrupt aber zum Programmabsturz führen.

    Die sicherere Lösung ist eine andere Reihenfolge der Befehle:

    Falls die CIA-Timer die einzigen Interruptquellen sind, können hier SEI und CLI sogar ganz entfallen.

    (Hier sollen typische Fehler, Stolperfallen und Missverständnisse beim Programmieren gesammelt werden:)

    Assembler - Tippfehler

    Code
    LDA #0 ; Der konstante Wert 0 wird in den Akku geladen
    
    vs.
    
    LDA $0 ; Der Wert aus der Speicherstelle 0 wird in den Akku geladen

    Im Akku befindet sich u.U. ein anderer Wert als erwartet, weil sich der Inhalt einer Speicherstelle im Programmverlauf verändern kann.