home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / skip / lezioneskip.s next >
Encoding:
Text File  |  1998-02-15  |  5.2 KB  |  170 lines

  1.  
  2. ; Lezione skip
  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.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  20.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  21.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  22.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  23.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  24.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  25.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  26.  
  27.     move.l    #copperloop,$84(a5)    ; carica l'indirizzo del loop
  28.                     ; in COP2LC
  29.  
  30. mouse:
  31.  
  32.     bsr    MuoviCopper
  33.  
  34. ; notare il doppio controllo sulla sincronia
  35. ; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
  36.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  37.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  38. Waity1:
  39.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  40.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  41.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  42.     BNE.S    Waity1
  43.  
  44. Waity2:
  45.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  46.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  47.     CMPI.L    D2,D0        ; aspetta la fine della linea $130 (304)
  48.     BEQ.S    Waity2
  49.  
  50.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  51.     bne.s    mouse            ; se no, torna a mouse:
  52.  
  53.     rts
  54.  
  55. * Questa routine cicla i colori nella copperlist
  56. MuoviCopper:
  57.     lea    copperloop,a0
  58.  
  59.     move.w    6(a0),d0
  60.  
  61.     moveq    #7-1,d1        ; vengono ciclati solo 8 colori
  62. .loop    move.w    14(a0),6(a0)
  63.     addq.l    #8,a0
  64.     dbra    d1,.loop
  65.  
  66.     move.w    d0,6(a0)
  67.     rts
  68.  
  69.     SECTION    MY_COPPER,CODE_C
  70.  
  71. COPPERLIST:
  72.  
  73. ; barra 1
  74.     dc.l $01800111
  75.     dc.l $2901fffe
  76.     dc.l $01800a0a
  77.     dc.l $2a01fffe
  78.     dc.l $0180011f
  79.     dc.l $2b01fffe
  80.     dc.l $01800000
  81.  
  82.     dc.w    $3007,$FFFE    ; aspetta la linea $30
  83.  
  84. copperloop            ; da qui inizia il loop
  85.     dc.w    $0007,$07fe    ; aspetta inizio linea 0 - poiche` sono
  86.                 ; mascherati i bit da 3 a 7 della posizione
  87.                 ; verticale, questa wait aspettera` tutte le
  88.                 ; linee che hanno i bit da 0 a 2 azzerati
  89.                 ; cioe` le linee $30,$38,$40,$48, ecc
  90.     dc.w    $180,$080
  91.     dc.w    $0107,$07fe    ; aspetta inizio linea 1 - poiche` sono
  92.                 ; mascherati i bit da 3 a 7 della posizione
  93.                 ; verticale, questa wait aspettera` tutte le
  94.                 ; linee che hanno i bit da 0 a 2 al valore %001
  95.                 ; cioe` le linee $31,$39,$41,$49, ecc
  96.     dc.w    $180,$0a0
  97.     dc.w    $0207,$07fe
  98.     dc.w    $180,$0c0
  99.     dc.w    $0307,$07fe
  100.     dc.w    $180,$0e0
  101.     dc.w    $0407,$07FE
  102.     dc.w    $180,$0c0
  103.     dc.w    $0507,$07FE
  104.     dc.w    $180,$0a0
  105.     dc.w    $0607,$07FE
  106.     dc.w    $180,$080
  107.     dc.w    $0707,$07FE
  108.     dc.w    $180,$088
  109.     dc.w    $00e1,$00FE    ; aspetta la fine dell'ultima riga del loop
  110.                 ; questa istruzione e` necessaria, in quanto
  111.                 ; se la WAIT della linea 0 viene eseguita
  112.                 ; prima della fine della linea 7 non blocca
  113.  
  114.     dc.w    $6007,$ffff    ; SKIP alla linea $60
  115.     dc.w    $8a,0        ; scrive in COPJMP2 - salta ad inizio loop
  116.  
  117.     dc.w    $180,$000
  118.     dc.w $FFDF,$FFFE    ; aspetta la linea 255
  119.  
  120. ; barra 2
  121.     dc.l $01800000
  122.     dc.l $1401fffe
  123.     dc.l $0180011f
  124.     dc.l $1501fffe
  125.     dc.l $01800a0a
  126.     dc.l $1601fffe
  127.     dc.l $01800111
  128.  
  129.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  130.  
  131.     end
  132.  
  133. Questo esempio mostra un uso dei copperloop. Vogliamo realizzare una copperlist
  134. che cambi il COLOR00 ad ogni linea di raster. Come avete imparato nelle prime
  135. lezioni del corso, e` sufficente scrivere una copperlist che faccia una wait
  136. ad ogni riga seguita da una coppermove nel registro COLOR00. Se per esempio
  137. vogliamo cambiare il COLOR00 dalla linea $30 alla linea $60 dobbiamo scrivere
  138. le seguenti istruzioni nella copperlist:
  139.  
  140.     dc.w    $3007,$fffe    ; aspetta la linea $30
  141.     dc.w    $180,$345    ; scrive nel color00
  142.     dc.w    $3107,$fffe    ; aspetta la linea $31
  143.     dc.w    $180,$456    ; scrive nel color00
  144.     
  145.     .
  146.     .
  147.  
  148.     dc.w    $6007,$fffe    ; aspetta la linea $60
  149.     dc.w    $180,$000    ; scrive nel color00
  150.  
  151. Questo pezzo di copperlist occupa 4 word per ogni riga di raster, per un
  152. totale di 8*($60-$30)=384 bytes. Se vogliamo far scorrere i colori, dobbiamo
  153. usare una routine 68000 che legga tutti i colori e li riscriva, tipo la routine
  154. MuoviCopper di questo esempio. Tale routine dovra` eseguire un'iterazione per
  155. ogni linea di raster, nel nostro caso dunque $30=48 iterazioni.
  156. Se i colori da scrivere in COLOR00 sono tutti diversi questo e` l'unico metodo
  157. possibile. Se pero` i colori non sono diversi ma si ripetono dopo un po' e`
  158. possibile usare un copperloop. Nel nostro esempio, vogliamo ripetere una
  159. sequenza di 8 colori. Poiche` il nostro effetto va dalla riga $30 alla $60
  160. (48 righe) vuol dire che ripetiamo la stessa sequenza 6 volte. Possiamo 
  161. quindi scrivere un copperloop che ripeta gli 8 colori e farlo ripetere
  162. dalle linee $30 a $60. Il loop (che potete vedere nel listato) occupa 
  163. 4 word per ogni colore che scrive, piu` altre 3 istruzioni che occupano
  164. ciascuna 2 words (la WAIT fino alla fine dell'ultima riga, la SKIP e quella
  165. che scrive in COPJMP2), per un totale di 8*4+3*2=38 words ovvero 56 bytes,
  166. contro i 384 della copperlist senza loop. Inoltre la routine che cicla i
  167. colori deve fare solamente 8 iterazioni contro le 48 del caso "tradizionale",
  168. ovvero va circa 6 volte piu` veloce.
  169.  
  170.