Hallo Besucher, der Thread wurde 608 mal aufgerufen und enthält 4 Antworten

letzter Beitrag von Harry12345 am

IRQ funktioniert /manchmal/ nicht

  • Alle heiligen Zeiten, wenn ich mein Programm frisch starte, funktioniert die IRQ-Routine nicht. Im Step-Debugger sehe ich, dass sie dann gar nicht aufgerufen wird. Nachdem sich im Falle des "Abstürzens" die Rahmenfarbe gar nicht ändert, gehe ich davon aus, dass die ISR kein einziges Mal aufgerufen wurde. Meistens lauft das Programm aber, wie ich es erwarten würde.


    $ acme test.a

    $ x64sc -autostart test.prg


    Die Fehlstarts passieren auch, wenn ich mit LOAD"TEST.PRG",8 lade und per RUN starte.


    Während des Arbeitens hat sich die Frequenz der "Fehlstarts" immer wieder verändert, wenn ich Code hinzugefügt oder entfernt habe. Das sollte auf Verwendung von nicht-initialisiertem Speicher deuten, also habe ich das Programm reduziert, aber die Fehlstarts passieren nach wie vor, ca. alle 3 bis 50 mal.


    Das Programm soll die komplette Kontrolle über den C64 übernehmen und die ROMs deaktivieren, weshalb ich alle Interruptquellen deaktiviere und einen einzelnen Raster-IRQ einrichte.


    Es scheint mit dem Ausschalten des VIC-Outputs während des "Hochfahrens" zusammenzuhängen, weil ich bisher keine hängende ISR gesehen habe, sobald ich den Output eingeschaltet gelassen habe. Nachdem der Fehler nur selten auftritt, kann ich aber nicht mit Sicherheit sagen, ob das vielleicht nur ein Zufall war.


    Habe ich etwas übersehen oder vergessen, oder ist das ein Problem mit Vice?




  • Der Klassiker wäre ja ein Problem mit Bit 8 der IRQ Rasterline. Du setzt es möglicherweise in Zeile 111, löscht es aber danach in Zeile 119. Das sollte eigentlich funktionieren, aber vielleicht ist es einen Versuch wert, Zeile 108 mal in and #%00001111 zu ändern?


    Vice Bugs sind es erfahrungsgemäß eigentlich nie :).


    EDIT: noch fishier ist Zeile 131, da kann es nämlich gut sein, dass Du Bit 8 setzt! Beim Lesen enthält Bit 8 ja den Wert der aktuellen Rasterzeile, das ist immer wieder ein Quell für Probleme. Daher schreibe ich meist explizite Werte in d011 und vermeide Bitmanipulationen des gelesenen Werts.

  • Mir ist im Code nichts komisches aufgefallen, ich bin aber auch was aus der Übung.

    Wenn ich den Fall hatte, dass keine RasterIRQs gekommen sind, dann war meist was am MSB falsch und eine Rasterzeile >312 gewählt.

    Probier mal Rasterzeile 1 statt Zeile 200.


    EDIT: Ich hab den Tab ziemlich lange im Browser offen gehabt. Claus hat da einen guten Punkt mit dem $d011

  • OMG.

    Ich suche schon seit einer Woche nach der Ursache!


    Es muss das Rasterzeilenbit gewesen sein, der Fehler ist eigentlich ganz klar zu erwarten. Sofern man daran denkt, dass man beim Lesen von $d011 das _aktuelle_ MSB bekommt.


    Danke für die prompte Antwort!


    Nächste Krise: Mein IEC Bustreiber will nicht. Aber das ist eine Geschichte für einen anderen Thread.