home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / skip / lezioneskip2.s < prev    next >
Encoding:
Text File  |  1995-12-06  |  4.5 KB  |  189 lines

  1.  
  2. ; Lezione skip2
  3. ;        Tasto sinistro per uscire.
  4.  
  5.     SECTION    bau,code
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup2.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001010000000    ; copper,bitplane,blitter DMA
  15.  
  16. Waitdisk    EQU    10
  17.  
  18. START:
  19.  
  20.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  21.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  22.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  23.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  24.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  25.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  26.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  27.  
  28.     move.l    #copperloop,d0
  29.     move    d0,cpptr1+6
  30.     swap    d0
  31.     move    d0,cpptr1+2
  32.  
  33.     move.l    #copperloop2,d0
  34.     move    d0,cpptr2+6
  35.     swap    d0
  36.     move    d0,cpptr2+2
  37.  
  38. mouse:
  39.  
  40.     bsr    MuoviCopper
  41.  
  42.     moveq    #20-1,d7
  43.  
  44.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  45.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  46. Waity1:
  47.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  48.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  49.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  50.     BNE.S    Waity1
  51.  
  52. Waity2:
  53.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  54.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  55.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  56.     BEQ.S    Waity2
  57.  
  58.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  59.     bne.s    mouse            ; se no, torna a mouse:
  60.  
  61.     rts
  62.  
  63. MuoviCopper:
  64.     lea    copperloop,a0
  65.  
  66.     move.w    6(a0),d0
  67.  
  68.     moveq    #7-1,d1
  69. .loop    move.w    14(a0),6(a0)
  70.     addq.l    #8,a0
  71.     dbra    d1,.loop
  72.  
  73.     move.w    d0,6(a0)
  74.  
  75.     lea    copperloop2,a0
  76.  
  77.     move.w    6(a0),d0
  78.  
  79.     moveq    #7-1,d1
  80. muoviloop2
  81.     move.w    14(a0),6(a0)
  82.     addq.l    #8,a0
  83.     dbra    d1,muoviloop2
  84.  
  85.     move.w    d0,6(a0)
  86.     rts
  87.  
  88.     SECTION    MY_COPPER,CODE_C
  89.  
  90. COPPERLIST:
  91.  
  92. ; barra 1
  93.     dc.l $01800111
  94.     dc.l $2901fffe
  95.     dc.l $01800a0a
  96.     dc.l $2a01fffe
  97.     dc.l $0180011f
  98.     dc.l $2b01fffe
  99.     dc.l $01800000
  100.  
  101.     dc.w    $3007,$FFFE    ; aspetta la linea $30
  102.  
  103. cpptr1
  104.     dc.w    $084,0
  105.     dc.w    $086,0
  106.  
  107. copperloop            ; questo loop viene eseguito al di sopra 
  108.     dc.w    $0007,$07fe    ; della riga $80. Tutte le WAIT hanno
  109.     dc.w    $180,$080    ; il bit piu` significativo della posizione
  110.     dc.w    $0107,$07fe    ; verticale a 0
  111.     dc.w    $180,$0a0
  112.     dc.w    $0207,$07fe    ; WAIT alla riga 2 con bit + significativo a 0
  113.     dc.w    $180,$0c0
  114.     dc.w    $0307,$07fe
  115.     dc.w    $180,$0e0
  116.     dc.w    $0407,$07FE
  117.     dc.w    $180,$0c0
  118.     dc.w    $0507,$07FE
  119.     dc.w    $180,$0a0
  120.     dc.w    $0607,$07FE
  121.     dc.w    $180,$080
  122.     dc.w    $0707,$07FE
  123.     dc.w    $180,$088
  124.     dc.w    $00e1,$00FE
  125.     dc.w    $8007,$ffff
  126.     dc.w    $8a,0
  127.  
  128. cpptr2
  129.     dc.w    $084,0
  130.     dc.w    $086,0
  131.  
  132. copperloop2            ; questo loop viene eseguito al di sotto 
  133.     dc.w    $8007,$07fe    ; della riga $80. Tutte le WAIT hanno
  134.     dc.w    $180,$080    ; il bit piu` significativo della posizione
  135.     dc.w    $8107,$07fe    ; verticale a 1
  136.     dc.w    $180,$0a0
  137.     dc.w    $8207,$07fe    ; WAIT alla riga 2 con bit + significativo a 1
  138.     dc.w    $180,$0c0
  139.     dc.w    $8307,$07fe
  140.     dc.w    $180,$0e0
  141.     dc.w    $8407,$07FE
  142.     dc.w    $180,$0c0
  143.     dc.w    $8507,$07FE
  144.     dc.w    $180,$0a0
  145.     dc.w    $8607,$07FE
  146.     dc.w    $180,$080
  147.     dc.w    $8707,$07FE
  148.     dc.w    $180,$088
  149.     dc.w    $80e1,$00FE
  150.     dc.w    $b007,$ffff
  151.     dc.w    $8a,0
  152.  
  153.     dc.w    $180,$000
  154.     dc.w $FFDF,$FFFE    ; aspetta la linea 255
  155.  
  156. ; barra 2
  157.     dc.l $01800000
  158.     dc.l $1401fffe
  159.     dc.l $0180011f
  160.     dc.l $1501fffe
  161.     dc.l $01800a0a
  162.     dc.l $1601fffe
  163.     dc.l $01800111
  164.  
  165.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  166.  
  167.     end
  168.  
  169. Questo esempio mostra la necessita` di usare 2 copper loop a causa
  170. dell'impossibilita` di mascherare il bit piu` significativo della posizione
  171. verticale. Usiamo 2 loop che sono assolutamente identici, salvo per il
  172. valore del bit piu` significativo delle WAIT, che vale 0 per il loop eseguito
  173. al di sopra della linea $80 e invece 1 nell'altro.
  174. La necessita` di usare 2 loop ci costringe naturalemte a variare l'indirizzo
  175. contenuto in COP2LC, che deve essere ogni volta l'indirizzo del loop
  176. giusto. Poiche` bisogna caricare COP2LC in maniera sincronizzata al video,
  177. lo facciamo tramite il copper. Carichiamo COP2LC esattamente allo stesso
  178. modo degli altri registri puntatori (BPLxPT, SPRxPT, ecc.) tramite la
  179. copperlist. PRIMA di entrare in un loop, l'indirizzo del loop viene scritto
  180. in COP2LC.
  181. Notate che poiche` usiamo 2 loop la routine processore deve far ruotare i
  182. colori in entrambi i loop. Nonostante cio`, questa tecnica risulta sempre
  183. vantaggiosa rispetto alla tecnica che non fa uso di loop: in questo esempio
  184. realizziamo l'effetto dalla riga $30 alla $b0, per un totale di 128 righe,
  185. che con la tecnica "tradizionale" richiederebbero 128 iterazioni alla routine
  186. che cicla i colori. Grazie ai loop ce la caviamo con 16 iterazioni (8 per ogni
  187. loop), andando quindi ben 8 volte piu` veloci.
  188.  
  189.