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

  1.  
  2. ; Lezione11c.s - Utilizzo di interrupts COPER e VERTB dell livello 3 ($6c).
  3.  
  4.     Section    Interrupt,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  10. *****************************************************************************
  11.  
  12.  
  13. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  14.  
  15.         ;5432109876543210
  16. DMASET    EQU    %1000001010000000    ; copper DMA abilitato
  17.  
  18. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  19.  
  20. START:
  21.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  22.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  23.  
  24.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  25.                     ; e sprites.
  26.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  27.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  28.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  29.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  30.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  31.  
  32.     movem.l    d0-d7/a0-a6,-(SP)
  33.     bsr.w    mt_init        ; inizializza la routine musicale
  34.     movem.l    (SP)+,d0-d7/a0-a6
  35.  
  36.     move.w    #$c030,$9a(a5)    ; INTENA - abilito interrupt "VERTB" e "COPER"
  37.                 ; del livello 3 ($6c)
  38.  
  39. mouse:
  40.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  41.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  42.                 ; nonche' ogni WAIT della linea raster $a0
  43.                 ; lo interrompe per suonare la musica!).
  44.  
  45.     bsr.w    mt_end        ; fine del replay!
  46.  
  47.     rts            ; esci
  48.  
  49. *****************************************************************************
  50. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.
  51. *****************************************************************************
  52.  
  53. ;    ,;)))(((;,
  54. ;    ¦'__  __`¦
  55. ;    |,-.  ,-.l
  56. ;    ( © )( © )
  57. ;    ¡`-'_)`-'¡
  58. ;    |  ___   |
  59. ;    l__ ¬  __!
  60. ;     T`----'T xCz
  61. ;     '      `
  62.  
  63. MioInt6c:
  64.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  65.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  66.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  67.     bsr.w    mt_music        ; suono la musica
  68.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  69. nointVERTB:
  70.     btst.b    #4,$dff01f    ; INTREQR - COPER azzerato?
  71.     beq.s    NointCOPER    ; se si, non e' un int COPER!
  72.     move.w    #$F00,$dff180    ; int COPER, allora COLOR0 = ROSSO
  73. NointCOPER:
  74.          ;6543210
  75.     move.w    #%1110000,$dff09c ; INTREQ - cancello rich. BLIT e COPER
  76.                 ; dato che il 680x0 non la cancella da solo!!!
  77.     rte    ; uscita dall'int COPER/BLIT/VERTB
  78.  
  79. *****************************************************************************
  80. ;    Routine di replay del protracker/soundtracker/noisetracker
  81. ;
  82.     include    "assembler2:sorgenti4/music.s"
  83. *****************************************************************************
  84.  
  85.     SECTION    GRAPHIC,DATA_C
  86.  
  87. COPPERLIST:
  88.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  89.     dc.w    $180,$00e    ; color0 BLU
  90.     dc.w    $a007,$fffe    ; WAIT - attendi la linea $a0
  91.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, il
  92.                 ; quale fa agire sul color0 con un "MOVE.W".
  93.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  94.  
  95. *****************************************************************************
  96. ;                MUSICA
  97. *****************************************************************************
  98.  
  99. mt_data:
  100.     dc.l    mt_data1
  101.  
  102. mt_data1:
  103.     incbin    "assembler2:sorgenti4/mod.yellowcandy"
  104.  
  105.     end
  106.  
  107. Questa volta abbiamo sfruttato anche l'interrupt del copper, detto COPER,
  108. utile per eseguire operazioni ad una certa linea video.
  109. Da Copperlist infatti si puo' accedere anche al registro INTREQ ($dff09c),
  110. e in questo caso non facciamo altro che settare il bit 4, COPER, assieme al
  111. bit 15 Set/Clr.
  112. In questo caso abbiamo messo solo un "MOVE.W #$f00,$dff180", che non e' un
  113. gran che di routine, ma considerate l'utilita' se le cose da fare sono molte,
  114. e non conviene perdere tempo a comparare il vertical blank con un loop del
  115. processore in modo user...
  116.