home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / develop / as65 / demo / s1 / irq.asm < prev    next >
Assembly Source File  |  1995-02-27  |  5KB  |  224 lines

  1. ;**************************************************************************
  2. ;
  3. ; Filename : IRQ.ASM
  4. ; -------------------
  5. ;
  6. ; (c) 1990 by Thomas Lehmann
  7. ;
  8. ;
  9. ; Jackophone V5.00
  10. ;
  11. ;
  12. ; Interrupt Routine
  13. ;
  14. ;
  15. ;**************************************************************************
  16.  
  17. MODUL_START    set    *    ; Größe des Moduls berechnen
  18.  
  19. ; =========================================================================
  20. ;
  21. ; Type    : IRQ
  22. ;    : Interruptroutine
  23. ;
  24. ; Eingang    : bei Timer oder CA1 Interrupt
  25. ;
  26. ; Ausgang    : Interruptprogramme abgelaufen
  27. ;
  28. ; Register    : ------
  29. ;
  30. ; (c) by Thomas Lehmann Feb. 1990
  31. ;
  32. ; =========================================================================
  33.  
  34. irq    inc interrupt    ; Merker das IRQ aktiv ist
  35.  
  36.     phx        ; Register retten
  37.     tsx        ; aktuellen Stackpointer retten
  38.     stx stk_merk
  39.  
  40.     ldx #STK_INIT    ; Stack für IRQ-Prg.
  41.     txs        ; Stackpointer für IRQ-Routine setzen
  42.     pha
  43.     phy
  44.  
  45.  
  46.     ; ACIA IRQ ?
  47.     ; ----------
  48.     jsr acia_irq    ; ACIA 6551 IRQ Routine
  49.  
  50.  
  51.     ; Interrupt Quelle 6522 ermitteln
  52.     ; -------------------------------
  53.     lda Via+IFR    ; IRQ Flag Register
  54.  
  55.     ; CA1 ? (externer Reset)
  56.     ; ----------------------
  57.     bit #IFR_CA1    ; CA1 Interrupt ?
  58.     beq irq_1    ; nein
  59.  
  60.     jmp init_stk    ; Prg. Neustart
  61.  
  62.  
  63.     ; CB1 ? (Gebührenimpuls)
  64.     ; ----------------------
  65. irq_1    bit #IFR_CB1    ; CB1 Interrupt ?
  66.     beq irq_2    ; nein
  67.  
  68.     lda Via+IORB    ; clear CB1 Interrupt
  69.     ?inc16 geb_cnt    ; Anzahl Gebührenimpulse erhöhen
  70.     smb GEB_IMP,hgeb_stat    ; Impuls wurde erkannt
  71.     bra irq_end    ; IRQ Ende
  72.  
  73.  
  74.  
  75.     ; Timer ermitteln
  76.     ; ---------------
  77. irq_2    bit #IFR_TIM1    ; Timer1 Interrupt ?
  78.     beq time2_irq    ; nein, Timer2 testen
  79.  
  80.  
  81.  
  82.     ; ================
  83.     ; Timer1 IRQ 800uS
  84.     ; ================
  85.  
  86.     lda Via+T1C_L    ; Interrupt quittieren
  87.  
  88.     ; =================
  89.     ; Software Watchdog
  90.     ; =================
  91.  
  92.     jsr watchdog_i    ; testen ob Hauptprg. läuft, IRQ nachtriggern
  93.  
  94.     ; ======================
  95.     ; Refresh der Led-Matrix
  96.     ; ======================
  97.  
  98.     jsr led_update
  99.  
  100.     ; ========================
  101.     ; Uhr Port, 100Hz abfragen
  102.     ; ========================
  103.  
  104.     lda #UHR    ; Port für 100Hz Uhr Impuls, (10mS)
  105.     bit Via_portb    ; positive Flanke ?
  106.     bne t1_irq_1    ; ja, kein Impuls
  107.  
  108.     bbs UHR_FLAG,allg_stat,t1_irq_2    ; negative war Flanke erkannt
  109.  
  110.     smb UHR_FLAG,allg_stat    ; Flanke ist erkannt eintragen
  111.     smb UHR_NOT,allg_stat    ; Notbetrieb der Uhr ausschalten
  112.     dec uhr_tim    ; Anzahl der Impulse nachführen
  113.     bne t1_irq_2    ; Sekunde noch nicht erreicht
  114.  
  115.     inc sekunde    ; Sekunde +1
  116.     lda #UHR_TIM    ; Timerwert laden
  117.     sta uhr_tim    ; Timer aufziehen
  118.     bra t1_irq_2
  119.  
  120. t1_irq_1    rmb UHR_FLAG,allg_stat    ; positive Flanke eintragen
  121.  
  122. t1_irq_2    bra irq_end
  123.  
  124.  
  125.  
  126.     ; Timer2 testen
  127.     ; -------------
  128. time2_irq    bit #IFR_TIM2    ; Timer2 Interrupt ?
  129.     beq irq_end    ; nö, komisch wer wars denn sonst noch ???
  130.  
  131.  
  132.     ; ===============
  133.     ; Timer2 IRQ 10mS
  134.     ; ===============
  135.  
  136.     lda #>IRQ_TIM2    ; IRQ quittieren, Timer Reload
  137.     sta Via+T2C_H
  138.  
  139.  
  140.     ; ======================
  141.     ; 100mS Timer nachführen
  142.     ; ======================
  143.     dec tim_100ms_t
  144.     bne t2_irq    ; nicht abgelaufen
  145.  
  146.     lda #10        ; Anzahl der 10mS IRQ`s bis 100mS erreicht
  147.     sta tim_100ms_t    ; Timer neu starten
  148.  
  149.     ; ======================================
  150.     ; 100mS Timer in der Struktur nachführen
  151.     ; ======================================
  152.  
  153.     ldx #ANZ_TIM100-1    ; Anzahl der 100mS Timer laden
  154. t2_irq100_0    lda struct_tim100,x    ; Timer abgelaufen ?
  155.     beq t2_irq100_1    ; ja, nächsten Timer testen
  156.  
  157.     dec struct_tim100,x    ; Timer nachführen
  158. t2_irq100_1    dex        ; nächsten Timer einstellen
  159.     bpl t2_irq100_0    ; und Timer testen
  160.  
  161.  
  162.     ; =====================================
  163.     ; 10mS Timer in der Struktur nachführen
  164.     ; =====================================
  165.  
  166. t2_irq    ldx #ANZ_TIM-1    ; Anzahl der Timer laden
  167. t2_irq_0    lda struct_tim,x    ; Timer abgelaufen ?
  168.     beq t2_irq_1    ; ja, nächsten Timer testen
  169.  
  170.     dec struct_tim,x    ; Timer nachführen
  171. t2_irq_1    dex        ; nächsten Timer einstellen
  172.     bpl t2_irq_0    ; und Timer testen
  173.  
  174.  
  175.     ; =========================
  176.     ; anstehende Ziffern wählen
  177.     ; =========================
  178.  
  179.     jsr wahl    ; Ziffern wählen
  180.  
  181.     ; ================
  182.     ; Hörtonauswertung
  183.     ; ================
  184.  
  185.     jsr tst_hton    ; Hörton testen
  186.  
  187.  
  188.     ; ==================================
  189.     ; Blink BIT für LED`s weiterschalten
  190.     ; ==================================
  191.  
  192.     lda struct_tim+BLK_TIM_O    ; Blinkfrequenz Timer für LED`s
  193.     bne irq_end    ; noch nicht abgelaufen
  194.  
  195.     lda #BLINK_TIM    ; Timerwert laden
  196.     sta struct_tim+BLK_TIM_O    ; und neu starten
  197.     asl blink_bit    ; nächstes BIT einstellen
  198.     bcc irq_end    ; noch nicht alle durchlaufen, Ende
  199.     rol blink_bit    ; 1.Bit setzen, Carry=1
  200.  
  201.  
  202.     ; =====================
  203.     ; IRQ-Routine verlassen
  204.     ; =====================
  205.  
  206. irq_end    ply        ; Register zurück
  207.     pla
  208.     ldx stk_merk    ; Stackptr. der unterbrochenen Routine setzen
  209.     txs        ; Main Stack wieder setzen
  210.     plx
  211.  
  212.     stz interrupt    ; Merker das IRQ beendet
  213.     cli        ; Interrupt freigeben
  214.     rti        ; und verlassen
  215.  
  216.  
  217.  
  218.  
  219. ; --------------------------------------------------------------------------
  220.  
  221. HLP    set    *
  222. _IRQ    equ    HLP-MODUL_START        ; Größe des Moduls
  223.  
  224.