Beiträge von Mike im Thema „Kurze Frage Zu IRQ“

    Auf jeden Fall könnte sich für dich da ein Blick in den Thread "Bitte melde dich an, um diesen Link zu sehen." lohnen.

    Und das "Austimen" von Raster-Routinen mit NOPs ist wohl mehr oder weniger unvermeidlich. Ob da (beim Ausblenden vom KERNAL) noch zwei dutzend Zyklen am Anfang wegfallen ist eher unwichtig. Es sei denn, Du willst tausende Interrupts pro Sekunde nutzen. :)

    Nein, das ist erstmal grundsätzlich kein Problem. Sobald ein Interrupt von einem der I/O Chips oder dem VIC angefordert wird, sperrt die CPU erstmal weitere IRQs - es wird also 'automatisch' ein SEI ausgeführt, noch bevor das Statusregister und Programmzähler auf dem Stack landen.

    In deinem genannten Beispiel kann also die CIA ohne weiteres einen IRQ auslösen während die Bearbeitung deines Raster-IRQs noch läuft; die Abarbeitung der Interruptroutine wird dadurch nicht beeinträchtigt.

    "Ärger" entsteht erst, wenn die Abarbeitung des Raster-IRQs beendet wird. Die CIA hält die Interrupt-Forderung solange aufrecht, wie kein ACK gegeben wurde. Sobald die CPU in das Hauptprogramm zurückkehrt, geht sie direkt wieder in den Interrupt - und wenn dann die Interruptroutine nichts von verschiedenen Interrupt-Quellen weiß, führt sie - wieder bezogen auf dein Beispiel - die Raster-Routinen (erneut) aus, obwohl sie dort nichts zu suchen haben. Schlimmer noch: nach dieser irrtümlichen Ausführung geht's aus dem Interrupt heraus - und wieder hinein, da der IRQ von CIA immer noch nicht bestätigt wurde. Damit "hängt" der C64 dann in der Interrupt-Routine.

    Die gängigste Methode, diesen Ärger zu vermeiden ist erstmal, die Interrupts vom CIA auszuschalten. Damit gibt's nur noch eine Interrupt-Quelle, den VIC. Dann muß die Interrupt-Routine sich ggfs. selbst um die Aufgaben kümmern, die vorher der CIA-Interrupt wahrgenommen hat, und dann z.B. die KERNAL-Routinen für den Tastaturscan selbst regelmäßig aufrufen. Vorzugsweise am Ende des Raster-Interrupts, da die Ausführungszeit vom Tastaturscan recht unterschiedlich sein kann.

    Es besteht auch die Möglichkeit, am Anfang der Interrupt-Routine die IRQ-Bits von VIC und CIA abzufragen, je nachdem (mit Priorität für VIC) die eine oder andere Interrupt-Quelle zu bedienen, und dann auch nur diese Aufforderung beim Chip zu bestätigen. Damit kann dann automatisch auch ein Interrupt während eines Interrupts bedient werden. Problematisch an dieser Variante ist nur, daß dann ein Raster-IRQ verzögert abgearbeitet wird, wenn er auftritt, während sich die Interrupt-Routine gerade um den CIA-Interrupt kümmert. Mit vorschobenen/flackernden Raster-Balken ist natürlich keinem gedient, darum kommt diese Variante eher selten zum Einsatz.

    ROM ausblenden macht nur dann Sinn, wenn Du den Anfang der Interrupt-Routine im KERNAL optimieren willst um noch ein paar Taktzyklen herauszuholen. Das hat aber primär nichts mit der Behandlung mehrerer Interrupt-Quellen zu tun.