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

  1.  
  2. ; Lezione7y1.s    UNO SPRITE VISUALIZZATO SCRIVENDO DIRETTAMENTE I REGISTRI
  3. ;        (SENZA DMA)
  4. ;       Questo esempio mostra uno sprite ottenuto usando direttamente i
  5. ;       registri. Lo sprite tra l'altro viene visualizzato a due diverse
  6. ;    posizioni orizzontali, in modo analogo al riutilizzo.
  7.  
  8.  
  9.     SECTION    CiriCop,CODE
  10.  
  11. Inizio:
  12.     move.l    4.w,a6        ; Execbase
  13.     jsr    -$78(a6)    ; Disable
  14.     lea    GfxName(PC),a1    ; Nome lib
  15.     jsr    -$198(a6)    ; OpenLibrary
  16.     move.l    d0,GfxBase
  17.     move.l    d0,a6
  18.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  19.  
  20. ;    Puntiamo la PIC "vuota"
  21.  
  22.     MOVE.L    #BITPLANE,d0    ; dove puntare
  23.     LEA    BPLPOINTERS,A1    ; puntatori COP
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.  
  28. ;    NON Puntiamo lo sprite !!!!!!!!!!!!!!!!!!!!
  29.  
  30.     move.l    #COPPERLIST,$dff080    ; nostra COP
  31.     move.w    d0,$dff088        ; START COP
  32.     move.w    #0,$dff1fc        ; NO AGA!
  33.     move.w    #$c00,$dff106        ; NO AGA!
  34.  
  35. mouse:
  36.     btst    #6,$bfe001    ; mouse premuto?
  37.     bne.s    mouse
  38.  
  39.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  40.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  41.  
  42.     move.l    4.w,a6
  43.     jsr    -$7e(a6)    ; Enable
  44.     move.l    gfxbase(PC),a1
  45.     jsr    -$19e(a6)    ; Closelibrary
  46.     rts
  47.  
  48. ;    Dati
  49.  
  50. GfxName:
  51.     dc.b    "graphics.library",0,0
  52.  
  53. GfxBase:
  54.     dc.l    0
  55.  
  56. OldCop:
  57.     dc.l    0
  58.  
  59.  
  60.     SECTION    GRAPHIC,DATA_C
  61.  
  62. COPPERLIST:
  63. SpritePointers:
  64.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  65.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  66.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  67.     dc.w    $13e,0
  68.  
  69.     dc.w    $8E,$2c81    ; DiwStrt
  70.     dc.w    $90,$2cc1    ; DiwStop
  71.     dc.w    $92,$38        ; DdfStart
  72.     dc.w    $94,$d0        ; DdfStop
  73.     dc.w    $102,0        ; BplCon1
  74.     dc.w    $104,0        ; BplCon2
  75.     dc.w    $108,0        ; Bpl1Mod
  76.     dc.w    $10a,0        ; Bpl2Mod
  77.  
  78.             ; 5432109876543210
  79.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  80.  
  81. BPLPOINTERS:
  82.     dc.w $e0,0,$e2,0    ;primo     bitplane
  83.  
  84.     dc.w    $180,$000    ; color0    ; sfondo nero
  85.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  86.                         ; in questo caso e' vuoto,
  87.                         ; per cui non compare.
  88.  
  89.     dc.w    $1A2,$FF0    ; color17, ossia COLOR1 dello sprite0 - GIALLO
  90.     dc.w    $1A4,$a00    ; color18, ossia COLOR2 dello sprite0 - ROSSO
  91.     dc.w    $1A6,$F70    ; color19, ossia COLOR3 dello sprite0 - ARANCIO
  92.  
  93.  
  94.     dc.w    $4007,$fffe    ; aspetta la linea $40
  95.     dc.w    $140,$0080    ; SPR0POS - posizione orizzontale
  96.     dc.w    $142,$0000    ; SPR0CTL
  97.     dc.w    $146,$0e70    ; SPR0DATB
  98.     dc.w    $144,$03c0    ; SPR0DATA - attiva lo sprite
  99.  
  100.     dc.w    $6007,$fffe    ; aspetta la linea $60
  101.     dc.w    $142,$0000    ; SPR0CTL - "spegne" lo sprite 
  102.  
  103.     dc.w    $140,$00a0    ; SPR0POS - nuova posizione orizz.
  104.     dc.w    $146,$2ff4    ; SPR0DATB
  105.     dc.w    $8007,$fffe    ; aspetta la linea $80
  106.     dc.w    $144,$13c8    ; SPR0DATA - attiva lo sprite
  107.  
  108.     dc.w    $b407,$fffe    ; aspetta la linea $b4
  109.     dc.w    $142,$0000    ; SPR0CTL - "spegne" lo sprite 
  110.  
  111.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  112.  
  113.  
  114.  
  115.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  116.                     ; perche' per vedere gli sprite
  117.                     ; e' necessario che ci siano bitplanes
  118.                     ; abilitati
  119. BITPLANE:
  120.     ds.b    40*256        ; bitplane azzerato lowres
  121.  
  122.     end
  123.  
  124. In questo esempio vediamo come usare uno sprite manipolando direttamente i
  125. registri SPRxPOS, SPRxCTL, SPRxDATA, SPRxDATB.
  126. Per prima cosa notate che NON puntiamo lo sprite nella copperlist. Anzi, per
  127. di piu` NON esiste la struttura sprite nella memoria chip. Infatti questa
  128. struttura e` usata dal DMA, che, quando e` usato,in pratica non fa altro che
  129. copiare i dati dalla struttura nei registri SPRxPOS, SPRxCTL, SPRxDATA,
  130. SPRxDATB. Se scriviamo noi i dati direttamente in quei registri, non abbiamo
  131. bisogno del DMA. Vediamo in dettaglio come si usano i registri.
  132. In SPRxPOS, viene scritta la posizione dello sprite. Il contenuto di questo
  133. registro e` in pratica lo stesso della prima word di controllo della
  134. struttura sprite che usiamo con il DMA. La differenza, pero` e` che VSTART
  135. non influenza la posizione verticale degli sprite. Gli sprite infatti vengono
  136. attivati scrivendo nel registro SPRxDATA. Una volta attivato, uno
  137. sprite, viene disegnato ad ogni riga, alla posizione orizzontale che abbiamo
  138. scritto in SPRxPOS, e per ogni riga esso ha sempre la stessa "forma".
  139. La "forma" dello sprite viene scritta nei due registri SPRxDATB e SPRxDATA
  140. che funzionano esattamente come le coppie di word che descrivono la forma
  141. dello sprite nella struttura che si usa con il DMA. I bit piu` significativi
  142. sono contenuti in SPRxDATB e i meno significativi in SPRxDATA. Questi due
  143. registri vengono riutilizzati per ogni riga. Se quindi si desidera che la
  144. forma dello sprite cambi da una riga ad un'altra e` necessario modificare i
  145. due registri SPRxDATx ad ogni riga.
  146. Il registro SPRxCTL, invece ha lo stesso contenuto della seconda word di
  147. controllo della struttura. Anche qui la posizione verticale non serve a
  148. niente. In pratica, di tutto il registro gli unici bit che hanno un
  149. significato, sono il bit 0, che e` il bit basso di HSTART e il bit 7 che
  150. serve per "attaccare" gli sprite. Scrivendo nel registro SPRxCTL, inoltre, si
  151. disabilita lo sprite.
  152.  
  153. Usare gli sprite senza DMA e` molto scomodo per il fatto di dover cambiare ad
  154. ogni riga SPRxDATx. Infatti di solito non viene usato. Puo` diventare
  155. vantaggioso, pero` nel caso in cui si voglia uno sprite che sia uguale per
  156. ogni riga: in pratica per fare delle colonne. In questo caso infatti non e`
  157. necessario cambiare ad ogni riga SPRxDATx, perche` quello che si vuole e`
  158. appunto che ad ogni riga lo sprite abbia la stessa forma. Inoltre con questo
  159. metodo risparmiamo molta memoria: se dovessimo fare uno sprite-colonna alto 
  160. 100 righe con il DMA, saremmo infatti costretti a utilizzare una struttura
  161. lunga 100 longword, escluse le word di controllo!
  162.  
  163. La procedura per fare una colonna con gli sprite senza DMA, quindi,
  164.  e` la seguente:
  165. 1) si scrivono i giusti valori in SPRxPOS, SPRxCTL e SPRxDATB
  166. 2) si attende la posizione verticale nella quale si vuole far iniziare lo
  167. sprite.
  168. 3) si scrive il valore di SPRxDATA. A questo punto lo sprite verra`
  169. disegnato, sempre uguale ad ogni riga.
  170. 4) si attende la posizione verticale nella quale si vuole far finire lo
  171. sprite.
  172. 5) si scrive un qualsiasi valore in SPRxCTL
  173.  
  174. E` possibile, come facciamo in questo esempio, visualizzare piu` colonne a 
  175. diverse altezze, ripetendo la procedura precedentemente descritta piu` volte 
  176. nella stessa copperlist. Si potrebbe anche cambiare la palette tra una
  177. colonna e l'altra.
  178.  
  179.