Frage zu CIA 1 Timer

Es gibt 3 Antworten in diesem Thema, welches 1.368 mal aufgerufen wurde. Der letzte Beitrag (24. Januar 2016 um 00:05) ist von Bytebreaker.

  • Hallo,

    Ich lese, dass der CIA1 bei einem Timer A Unterlauf der CPU einen IRQ anbietet den sie annehmen oder ablehnen kann.

    Durch Umbiegen der IRQ Vektoren im RAM können wir dann sozusagen zaubern, wie das in Demos und Intros gern geschieht.

    Meine Frage: Heißt Timer Unterlauf, dass irgend eine Kernal Routine den Timer auf 1/60 Sekunden setzt und jedes Mal wenn diese Frist herunter gezählt ist, kommt der IRQ und der Kernal stellt sozusagen den Wecker im CIA 1 erneut?

  • Letzteres läuft CIA-intern ab, per CPU werden vorab nur die Rahmenbedingungen gesetzt, wie z.B. ob ein Unterlauf überhaupt einen Interrupt auslösen soll oder nicht, die Einstellung des Zählerintervalls (üblicherweise in Taktzyklen, ggf. auch Reaktion auf externe Signaländerungen um irgendwas auswärtiges zu messen) und den Betriebsmodus: Entweder einmal runterzählen und fertig, oder (wie vom Kernal z.B. fürs Cursorblinken genutzt) bei Unterlauf immer wieder ab den voreingestellten Werten runterzählen.

    Die CPU muss dann nur noch im IRQ-Handler das Latchregister des CIA auslesen, um dessen IRQ-Ausgang bis zum nächsten Unterlauf wieder auf inaktiv zu schalten, ansonsten würd die CPU nur noch pausenlos den IRQ-Handler abarbeiten.

  • 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.