Die beiden spannenden Register dazu aus der AAY64 rauskopiert:
$DC0D/56333/CIA1+13: Interrupt (IRQ) Control Register
+-------+------------------------------------------------------+
| Bit 7 | On Read: 1 = Interrupt occured |
| | On Write: 1 = Set Int.-Flags, 0 = Clear Int-.Flags |
| Bit 4 | FLAG1 IRQ (Cassette Read / Serial Bus SRQ Input) |
| Bit 3 | Serial Port Interrupt ($DC0C full/empty) |
| Bit 2 | Time-of-Day Clock Alarm Interrupt |
| Bit 1 | Timer B Interrupt (Tape, Serial Port) |
| Bit 0 | Timer A Interrupt (Kernal-IRQ, Tape) |
+-------+------------------------------------------------------+
Your CIA does NOT clear this register! You have to do this by
simply reading it.
Default Value: $81/129 (%10000001)
$DC0E/56334/CIA1+14: Control Register A
+-------+--------------------------------------------------------+
| Bit 7 | Time-of-Day Clock Frequency: 1 = 50 Hz, 0 = 60 Hz |
| Bit 6 | Serial Port ($DC0C) I/O Mode: 1 = Output, 0 = Input |
| Bit 5 | Timer A Counts: 1 = CNT Signals, 0 = System 02 Clock |
| Bit 4 | Force Load Timer A: 1 = Yes |
| Bit 3 | Timer A Run Mode: 1 = One-Shot, 0 = Continuous |
| Bit 2 | Timer A Output Mode to PB6: 1 = Toggle, 0 = Pulse |
| Bit 1 | Timer A Output on PB6: 1 = Yes, 0 = No |
| Bit 0 | Start/Stop Timer A: 1 = Start, 0 = Stop |
+-------+--------------------------------------------------------+
Default Value: $11/17 (%00010001)
Normal ist also, dass Timer A automatisch durchlaufend eingestellt ist, und Timer A ist standardmäßig auch die einzige Funktion dieser CIA, die IRQs auslöst. Das Kernal muss das also nur einmal so einrichten, danach bleibt das so. Was aber jedesmal passieren muss: Die CIA braucht eine Quittung, dass der IRQ erkannt wurde. Bei der CIA wird diese Quittung durch das Auslesen des $dc0d gegeben, und das passiert jedesmal am Ende der IRQ-Routine.