*************************************************************************
* Nome: Key.S                                                           *
*                                                                       *
* Autore: Fabrizio Farenga                                              *
*                                                                       *
* Commento: Routine di scansione della tastiera a livello Hardware      *
*                                                                       *
* Versione: 1.2                                                         *
*                                                                       *
* Ultimo aggiornamento: 27-Apr-92 | 21:45:20                            *
*                                                                       *
* Bugs: Nessuno conosciuto                                              *
*                                                                       *
*************************************************************************

;Registri dei chip custom utlizzati

INTENA          EQU $DFF09A     ;Contiene i bit di abilitazione delle IRQS
INTENAR         EQU $DFF01C     ;Corrispondente in lettura di INTENA
INTREQ          EQU $DFF09C     ;Contiene i bit di richiesta delle IRQS
DMACON          EQU $DFF096     ;Registro di controllo dei canali DMA
VPOSR           EQU $DFF004     ;Bit piu' significativo del registro VHPOSR
VHPOSR          EQU $DFF006     ;Contiene la posizione corrente del BEAM
COLOR00         EQU $DFF180     ;Colore di fondo

;Registri del CIA A utilizzati

CIAAPRA         EQU $BFE001     ;Registro dati periferico A
CIAATALO        EQU $BFE401     ;Registro basso del timer A
CIAATAHI        EQU $BFE501     ;Registro alto del timer A
CIAASDR         EQU $BFEC01     ;Registro dati seriale
CIAAICR         EQU $BFED01     ;Registro di controllo delle CIA IRQ
CIAACRA         EQU $BFEE01     ;Registro di controllo A

Start
        move.w  INTENAR,OldINTENA       ;Preserva il contenuto di INTENA
        move.w  #$7FFF,INTENA           ;Disattiva tutte le IRQ

        move.b  #%01111111,CIAAICR      ;Disabilita tutte le CIA IRQ
        move.b  #%10001000,CIAAICR      ;Attiva solamente la SP CIA IRQ

        move.w  #$0200,DMACON           ;Spegni il MASTER DMA
        move.l  $68,OldPortsIRQ         ;Preserva il vettore di PORTS IRQ
        move.l  #PortsIRQ,$68           ;Punta il PORTS IRQ alla routine
        move.w  #$C008,INTENA           ;Attiva il MASTER IRQ e il PORTS IRQ
Loop
        cmpi.b  #$00,VHPOSR             ;Aspetta che il BEAM COUNTER sia 0
        bne     Loop

        move.w  #$0000,COLOR00          ;Metti il colore NERO nello sfondo

        btst    #6,CIAAPRA              ;Controlla che non sia premuto il
        bne     Loop                    ;tasto sinistro del mouse

        move.l  OldPORTSIRQ,$68         ;Rimetti a posto il vecchio IRQ

        move.b  #%10011111,CIAAICR      ;Riabilita tutte le CIA IRQ

        bset    #15,OldINTENA           ;Attiva il bit di controllo del
        move.w  OldINTENA,INTENA        ;vecchio INTENA e rimettilo a posto
        move.w  #$8200,DMACON           ;Riattiva il MASTER DMA

        rts                             ;Esci

; Qui inizia la routine di PORTS IRQ

PORTSIRQ
        move.w  #$0008,INTREQ           ;Conferma il PORTS IRQ

        move.l  d0,-(a7)                ;Preserva il registro D0

        move.b  CIAAICR,d0              ;Azzera il registro ICR

        or.b    #%01000000,CIAACRA      ;Abbassa l'SP per l'Handshake

        move.b  CIAACRA,d0              ;Predispone il Timer A del CIA A
        and.b   #%11000000,d0           ;nel modo One-Shot
        or.b    #%00001000,d0
        move.b  d0,CIAACRA

TIME85  EQU 61  ; il valore è calcolato dividendo i microsecondi per 1.40968

        move.b  #(TIME85&$ff),CIAATALO  ;Il timer deve attendere
        move.b  #(TIME85>>8),CIAATAHI   ;85 microsecondi

TIME85Wait
        btst    #0,CIAAICR              ;Aspetta che il tempo sia
        beq     TIME85Wait              ;effettivamente trascorso

        and.b   #%10111111,CIAACRA      ;Rialza l'SP

        move.b  CIAASDR,d0              ;Legge il dato arrivato
        not.b   d0                      ;e lo decodifica
        ror.b   #1,d0
        bmi     KeyReleased             ;Se e' positivo il tasto e' premuto
        move.b  d0,key                  ;Lo memorizza in KEY
        move.w  #$0fff,COLOR00          ;Mette il bianco come colore di fondo
        move.l  (a7)+,d0                ;Rimette a posto il registro D0
        rte                             ;Ritorna dall'IRQ

KeyReleased
        move.b  d0,key                  ;Se e' negativo il tasto e' rilasciato
        move.w  #$0f00,COLOR00          ;Lo memorizza in KEY e mette il rosso
                                        ;come colore di fondo. Quindi ritorna
                                        ;dall'IRQ
        move.l  (a7)+,d0                ;Rimette a posto il registro D0
        rte                             ;Ritorna dall'IRQ


OldINTENA       dc.w 0                  ;Buffer per il vecchio INTENA
OldPORTSIRQ     dc.l 0                  ;Buffer per il vecchio IRQ
Key             dc.b 0                  ;Buffer per il tasto correntemente
                                        ;premuto o rilasciato
