Hallo Besucher, der Thread wurde 2,1k mal aufgerufen und enthält 12 Antworten

letzter Beitrag von hannenz am

Interupt - mal will er, mal nicht...

  • habe hier noch ein etwas älteres recht umfangreiches Programm rumliegen, desen Hauptaufgabe es ist, Text in einer Scrollbar auszugeben. Das ganze ist recht schönund ich will mich ehrlich gesagt nicht mehr in den schon älteren Code wieder reinlesen. Es ist eben so, daß alles bestens funktioniert, nur eben muß man oft das Prog mehrmals starten, bis der Interrupt "anspringt", jedes zweite, dritte mal nur klappt das, dann ist aber alles bestens, die anderen Male hängt sich der c64 auf (Bildsschirm aus, R/S-Restore geht noch)


    Woran kann das liegen, was hab ich inder IRQ-Einrichtung vielleicht übersehen?



    den Code hab ich glaub von irgendwo übernommen damals und angepasst, weiß ich aber nicht mehr so genau...

  • Ja, in dem Falle sind sie beschreibbar. Aber ich ging jetzt davon aus, daß hier das Kernal nicht ausgeblendet wird... obwohl, wenn ich den Code nochmal genauer gucke... hm... $35 in $01. Jup, da wird's ausgeblendet. Hatte ich nicht gesehen.

  • also so billig isses leider nicht, natürlich hab ich ein SEI am Anfang stehen, genau hinsehen!
    Daran liegt es nicht...
    LordNikon: CLD heisst Clear Decimal Flag, damit wird der Prozessor angewiesen "normal" binär zu rechnen nud nicht dezimal; was dieser Dezimalmodus allerdings genau soll, weiß ich ehrlich gesagt auch nicht, dass CLD ist eher "so zur Sicherheit", falls das Decimal-Flag aus irgendeinem seltsamen Grund gesetzt sein sollte...

  • Normalerweise könnte man auf das CLD verzichten, wenn du vorher nirgends in deinem Programm ein SED drin hattest. Wenn du vom Basic aus ein Programm startest, ist das Dezimal Flag eigentlich immer gelöscht, wenn nicht würde Basic ganz schön rumspinnen.


    Das Dezimal Flag eignet sich wunderbar um Scores zu coden, da der Prozessor bei einem...


    sed
    lda #$09
    adc #$01


    ...ein #$10 im Akku hat, und nicht ein #$0a. Der Dezimal Mode wirkt sich aber nur auf ADC & SBC aus. Nicht auf INX, INC und dergleichen!


    Achtgeben muss man aber bei der verwendung des Dezimal Flags mit gleichzeitig laufendem IRQ. Wenn im normalem Code (nicht IRQ ausgeführt) das Dezimal Flag geändert wird, muss gleich beim einspringen in den IRQ den Processorstatus gerettet und kurz vor dem beenden des IRQs wieder restauriert werden -> Stichwort PHP & PLP

  • Hab keinen Fehler gefunden. Hab dann folgendes um Deinen Code herumgebaut:




    das Klappt. Dürfte der Fehler also eher im Rest des Programms stecken. Wundert mich, daß Runstop/Restore noch funktioniert, könnte ein Zeichen sein, daß der NMI-Vektor noch auf die übliche Routine zeigt.


    $fffc/d brauchst Du nicht zu setzen, das ldx#255, txs hat nichts mit Interrupten zu tun, und ein normales Programm braucht das in der Regel nicht.

  • auch das wurde bedacht, alle Register wurden ordnungsgemäß "gerettet"...
    inzwischen hab ich das Programm nochmal neu geschrieben und dabei gleich verbessert. (mit eigentlich derselben Initialisierung und denselben Interrupt-Routinen) und siehe da: Es läuft tadellos und "springt immer an".
    Also muß irgendwo im Hauptprogramm irgendwas den IRQ durcheinandergebracht haben... aber na gut - jetzt ist ja alles in Ordnung.