home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11m1.s < prev    next >
Text File  |  1995-09-29  |  7KB  |  191 lines

  1.  
  2. ; Lezione11m1.s - Utilizzo dell'interrupt di livello 2 ($68) per leggere i
  3. ;          codici dei tasti premuti sulla tastiera.
  4. ;          PREMERE LO SPAZIO PER USCIRE
  5.  
  6.     Section    InterruptKey,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  12. *****************************************************************************
  13.  
  14.  
  15. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  16.  
  17.         ;5432109876543210
  18. DMASET    EQU    %1000001010000000    ; copper DMA abilitato
  19.  
  20. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  21.  
  22. START:
  23.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  24.  
  25.     MOVE.L    #MioInt68KeyB,$68(A0)    ; Routine per la tastiera int. liv. 2
  26.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3
  27.  
  28.         ; 76543210
  29.     move.b    #%01111111,$bfed01    ; CIAAICR - Disabilita tutte le CIA IRQ
  30.     move.b    #%10001000,$bfed01    ; CIAAICR - Attiva solo la SP CIA IRQ
  31.  
  32.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  33.                     ; e sprites.
  34.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  35.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  36.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  37.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  38.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  39.  
  40.     movem.l    d0-d7/a0-a6,-(SP)
  41.     bsr.w    mt_init        ; inizializza la routine musicale
  42.     movem.l    (SP)+,d0-d7/a0-a6
  43.  
  44.         ; 5432109876543210
  45.     move.w    #%1100000000101000,$9a(a5)    ; INTENA - abilito solo VERTB
  46.                           ; del livello 3 e il livello2
  47.  
  48. AttendiSpazio:
  49.     move.b    ActualKey(PC),d0 ; Prendi il codice dell'ultimo tasto premuto.
  50.     move.b    d0,Color0+1    ; Metti il cod. del carattere attuale come
  51.                 ; color0... giusto per test..
  52.     cmp.b    #$40,d0        ; BARRA SPAZIO PREMUTA? (basta col mouse!)
  53.     bne.s    AttendiSpazio
  54.  
  55.     bsr.w    mt_end           ; fine del replay!
  56.     move.b    #%10011111,$bfed01 ; CIAAICR - Riabilita tutte le CIA IRQ
  57.     rts               ; esci
  58.  
  59. ; Variabile dove e' salvato il carattere attuale
  60.  
  61. ActualKey:
  62.     dc.b    0
  63.  
  64.     even
  65.  
  66. *****************************************************************************
  67. *    ROUTINE IN INTERRUPT $68 (livello 2) - gestione TASTIERA
  68. *****************************************************************************
  69.  
  70. ;03    PORTS    2 ($68)    Input/Output Porte e timers, connesso alla linea INT2
  71.  
  72. MioInt68KeyB:    ; $68
  73.     movem.l d0/a0,-(sp)    ; salva i registri usati nello stack
  74.     lea    $dff000,a0    ; reg. custom per offset
  75.  
  76.     MOVE.B    $BFED01,D0    ; Ciaa icr - in d0 (leggendo l'icr causiamo
  77.                 ; anche il suo azzeramento, per cui l'int e'
  78.                 ; "disdetto" come in intreq).
  79.     BTST.l    #7,D0    ; bit IR, (interrupt cia autorizzato), azzerato?
  80.     BEQ.s    NonKey    ; se si, esci
  81.     BTST.l    #3,D0    ; bit SP, (interrupt della tastiera), azzerato?
  82.     BEQ.s    NonKey    ; se si, esci
  83.  
  84.     MOVE.W    $1C(A0),D0    ; INTENAR in d0
  85.     BTST.l    #14,D0        ; Bit Master di abilitazione azzerato?
  86.     BEQ.s    NonKey        ; Se si, interrupt non attivi!
  87.     AND.W    $1E(A0),D0    ; INREQR - in d1 rimangono settati solo i bit
  88.                 ; che sono settati sia in INTENA che in INTREQ
  89.                 ; in modo da essere sicuri che l'interrupt
  90.                 ; avvenuto fosse abilitato.
  91.     btst.l    #3,d0        ; INTREQR - PORTS?
  92.     beq.w    NonKey        ; Se no, allora esci!
  93.  
  94. ; Dopo i controlli, se siamo qua significa che dobbiamo prendere il carattere!
  95.  
  96.     moveq    #0,d0
  97.     move.b    $bfec01,d0    ; CIAA sdr (serial data register - connesso
  98.                 ; alla tastiera - contiene il byte inviato dal
  99.                 ; chip della tastiera) LEGGIAMO IL CHAR!
  100.  
  101. ; abbiamo il char in d0, lo "lavoriamo"...
  102.  
  103.     NOT.B    D0        ; aggiustiamo il valore invertendo i bit
  104.     ROR.B    #1,D0        ; e riportando la sequenza a 76543210.
  105.     move.b    d0,ActualKey    ; salviamo il carattere
  106.  
  107. ; Ora dobbiamo comunicare alla tastiera che abbiamo preso il dato!
  108.  
  109.     bset.b    #6,$bfee01    ; CIAA cra - sp ($bfec01) output, in modo da
  110.                 ; abbassare la linea KDAT per confermare che
  111.                 ; abbiamo ricevuto il carattere.
  112.  
  113.     st.b    $bfec01        ; $FF in $bfec01 - ue'! ho ricevuto il dato!
  114.  
  115. ; Qua dobbiamo mettere una routine che aspetti 90 microsecondi perche' la
  116. ; linea KDAT deve stare bassa abbastanza tempo per essere "capita" da tutti
  117. ; i tipi di tastiere. Si possono, per esempio, aspettare 3 o 4 linee raster.
  118.  
  119.     moveq    #4-1,d0    ; Numero di linee da aspettare = 4 (in pratica 3 piu'
  120.             ; la frazione in cui siamo nel momento di inizio)
  121. waitlines:
  122.     move.b    6(a0),d1    ; $dff006 - linea verticale attuale in d1
  123. stepline:
  124.     cmp.b    6(a0),d1    ; siamo sempre alla stessa linea?
  125.     beq.s    stepline    ; se si aspetta
  126.     dbra    d0,waitlines    ; linea "aspettata", aspetta d0-1 linee
  127.  
  128. ; Ora che abbiamo atteso, possiamo riportare $bfec01 in modo input...
  129.  
  130.     bclr.b    #6,$bfee01    ; CIAA cra - sp (bfec01) input nuovamente.
  131.  
  132. NonKey:        ; 3210
  133.     move.w    #%1000,$9c(a0)    ; INTREQ togli richiesta, int eseguito!
  134.     movem.l (sp)+,d0/a0    ; ripristina i registri dallo stack
  135.     rte
  136.  
  137. *****************************************************************************
  138. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.        *
  139. *****************************************************************************
  140.  
  141. ;06    BLIT    3 ($6c)    Se il blitter ha finito una blittata si setta ad 1
  142. ;05    VERTB    3 ($6c)    Generato ogni volta che il pennello elettronico e'
  143. ;            alla linea 00, ossia ad ogni inizio di vertical blank.
  144. ;04    COPER    3 ($6c)    Si puo' settare col copper per generarlo ad una certa
  145. ;            linea video. Basta richiederlo dopo un certo WAIT.
  146.  
  147. MioInt6c:
  148.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  149.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  150.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  151.     bsr.w    mt_music        ; suono la musica
  152.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  153. nointVERTB:
  154. NointCOPER:
  155. NoBLIT:         ;6543210
  156.     move.w    #%1110000,$dff09c ; INTREQ - cancello rich. BLIT,VERTB e COPER
  157.     rte    ; uscita dall'int COPER/BLIT/VERTB
  158.  
  159. *****************************************************************************
  160. ;    Routine di replay del protracker/soundtracker/noisetracker
  161. ;
  162.     include    "assembler2:sorgenti4/music.s"
  163. *****************************************************************************
  164.  
  165.     SECTION    GRAPHIC,DATA_C
  166.  
  167. COPPERLIST:
  168.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  169.     dc.w    $180
  170. Color0:
  171.     dc.w    $000        ; color0 - sara' cambiato a seconda del tasto
  172.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  173.  
  174. *****************************************************************************
  175. ;                MUSICA
  176. *****************************************************************************
  177.  
  178. mt_data:
  179.     dc.l    mt_data1
  180.  
  181. mt_data1:
  182.     incbin    "assembler2:sorgenti4/mod.fairlight"
  183.  
  184.     end
  185.  
  186. Immettendo il byte del codice di tastiera nel color0 si nota bene il fatto
  187. che quando un tasto e' PREMUTO il bit 7 e' azzerato, mentre quando e'
  188. RILASCIATO tale bit e' settato: infatti quando si preme un tasto il colore
  189. e' piu' scuro di quando si rilascia, avendo il bit alto del verde azzerato.
  190.  
  191.