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

  1.  
  2. ; Lezione7a.s        VISUALIZZAZIONE DI UNO SPRITE
  3.  
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. Inizio:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Nome lib
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  15.  
  16. ;    Puntiamo la PIC "vuota"
  17.  
  18.     MOVE.L    #BITPLANE,d0    ; dove puntare
  19.     LEA    BPLPOINTERS,A1    ; puntatori COP
  20.     move.w    d0,6(a1)
  21.     swap    d0
  22.     move.w    d0,2(a1)
  23.  
  24. ;    Puntiamo lo sprite
  25.  
  26.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  27.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.  
  32.     move.l    #COPPERLIST,$dff080    ; nostra COP
  33.     move.w    d0,$dff088        ; START COP
  34.     move.w    #0,$dff1fc        ; NO AGA!
  35.     move.w    #$c00,$dff106        ; NO AGA!
  36.  
  37. mouse:
  38.     btst    #6,$bfe001    ; mouse premuto?
  39.     bne.s    mouse
  40.  
  41.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  42.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  43.  
  44.     move.l    4.w,a6
  45.     jsr    -$7e(a6)    ; Enable
  46.     move.l    gfxbase(PC),a1
  47.     jsr    -$19e(a6)    ; Closelibrary
  48.     rts
  49.  
  50. ;    Dati
  51.  
  52. GfxName:
  53.     dc.b    "graphics.library",0,0
  54.  
  55. GfxBase:
  56.     dc.l    0
  57.  
  58. OldCop:
  59.     dc.l    0
  60.  
  61.  
  62.     SECTION    GRAPHIC,DATA_C
  63.  
  64. COPPERLIST:
  65. SpritePointers:
  66.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  67.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  68.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  69.     dc.w    $13e,0
  70.  
  71.     dc.w    $8E,$2c81    ; DiwStrt
  72.     dc.w    $90,$2cc1    ; DiwStop
  73.     dc.w    $92,$38        ; DdfStart
  74.     dc.w    $94,$d0        ; DdfStop
  75.     dc.w    $102,0        ; BplCon1
  76.     dc.w    $104,0        ; BplCon2
  77.     dc.w    $108,0        ; Bpl1Mod
  78.     dc.w    $10a,0        ; Bpl2Mod
  79.  
  80.             ; 5432109876543210
  81.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  82.  
  83. BPLPOINTERS:
  84.     dc.w $e0,0,$e2,0    ;primo     bitplane
  85.  
  86.     dc.w    $180,$000    ; color0    ; sfondo nero
  87.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  88.                         ; in questo caso e' vuoto,
  89.                         ; per cui non compare.
  90.  
  91.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  92.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  93.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  94.  
  95.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  96.  
  97.  
  98. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  99.  
  100. MIOSPRITE:        ; lunghezza 13 linee
  101. VSTART:
  102.     dc.b $30    ; Posizione verticale di inizio sprite (da $2c a $f2)
  103. HSTART:
  104.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  105. VSTOP:
  106.     dc.b $3d    ; $30+13=$3d    ; posizione verticale di fine sprite
  107.     dc.b $00
  108.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  109.  dc.w    %0000000000000000,%0000011001100000
  110.  dc.w    %0000000000000000,%0000001001000000
  111.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  112.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  113.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  114.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  115.  dc.w    %0000011111100000,%0000011111100000
  116.  dc.w    %0000011111100000,%0001111001111000
  117.  dc.w    %0000001111000000,%0011101111011100
  118.  dc.w    %0000000110000000,%0011000110001100
  119.  dc.w    %0000000000000000,%1111000000001111
  120.  dc.w    %0000000000000000,%1111000000001111
  121.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  122.  
  123.  
  124.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  125.                     ; perche' per vedere gli sprite
  126.                     ; e' necessario che ci siano bitplanes
  127.                     ; abilitati
  128. BITPLANE:
  129.     ds.b    40*256        ; bitplane azzerato lowres
  130.  
  131.     end
  132.  
  133. Questo e' il primo sprite che controlliamo nel corso, potete facilmente
  134. definirne uno vostro cambiando i suoi 2 piani , che in questo listato sono
  135. definiti in binario; il colore risultante dalle varie sovrapposizioni
  136. binarie puo' essere intuito leggendo il commento a fianco dello sprite.
  137. I colori dello sprite 0 sono definiti dai registri del COLOR 17,18 e 19:
  138.  
  139.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  140.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  141.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  142.  
  143. Per cambiare la posizione dello sprite, agite sui suoi primi byte:
  144.  
  145. MIOSPRITE:        ; lunghezza 13 linee
  146. VSTART:
  147.     dc.b $30    ; Posizione verticale di inizio sprite (da $2c a $f2)
  148. HSTART:
  149.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  150. VSTOP:
  151.     dc.b $3d    ; $30+13=$3d    ; posizione verticale di fine sprite
  152.     dc.b $00
  153.  
  154. Basta ricordarsi queste due cose:
  155.  
  156. 1) L'angolo in alto a sinistra dello schermo non e' la posizione $00,$00
  157. infatti lo schermo con l'overscan puo' essere piu' largo; nel caso dello
  158. schermo di larghezza normale la posizione orizzontale iniziale (HSTART) puo'
  159. andare da $40 a $d8, altrimenti lo sprite viene "tagliato" o va proprio fuori
  160. dallo schermo visibile. Allo stesso modo la posizione verticale iniziale, ossia
  161. il VSTART, va selezionato a partire da $2c, cioe' dall'inizio della finestra
  162. video definita in DIWSTART (che qua e' $2c81). 
  163. Per posizionare nello schermo 320x256 lo sprite, per esempio alla cordinata
  164. centrale 160,128 bisogna tener conto che la prima coordinata in alto a sinistra
  165. e' $40,$2c anziche' 0,0 per cui bisogna sommare $40 alla coordinata X e $2c
  166. alla coordinata Y.
  167. Infatti $40+160, $2c+128, corrispondono alla coordinata 160,128 di uno schermo
  168. 320x256 non overscan.
  169. Non avendo ancora il controllo della posizione orizzontale a livello di 1
  170. pixel, ma ogni 2 pixel, dobbiamo sommare non 160, ma 160/2 all'inizio per
  171. individuare il centro dello schermo:
  172.  
  173. HSTART:
  174.     dc.b $40+(160/2)    ; posizionato al centro dello schermo
  175.  
  176. Cosi' per altre coordinate orizzontali, ad esempio la posizione 50:
  177.  
  178.     dc.b $40+(50/2)
  179.  
  180. Piu' avanti vedremo come posizionare orizzontalmente 1 pixel alla volta.
  181.  
  182. 2) La posizione orizzontale si puo' variare da sola per spostare a destra e a
  183. sinistra uno sprite, mentre se si intende spostare lo sprite in alto o in basso
  184. e' necessario ogni volta agire su due byte, ossia su VSTART e VSTOP, cioe' la
  185. posizione verticale di inizio e di fine sprite. Infatti, mentre la larghezza di
  186. uno sprite e' sempre 16, per cui determinata la posizione orizzontale di inizio
  187. la posizione di fine e' sempre 16 pixel piu' a destra, per quanto riguarda la
  188. lunghezza in verticale, essendo a piacere, e' necessario definirla comunicando
  189. la posizione di inizio e di fine ogni volta, per cui se vogliamo spostare lo
  190. sprite in alto dobbiamo sottrarre 1 sia a VSTART che a VSTOP, se vogliamo
  191. spostarlo in basso e' necessario invece aggiungere 1 ad entrambi.
  192. Se per esempio si vuole modificare il VSTART in $55, per determinare VSTOP
  193. occorrera' sommare la lunghezza dello sprite (questo e' alto 13 linee) a
  194. VSTART, dunque $55+13=$62.
  195.  
  196. Spostate lo sprite in varie posizioni dello schermo per verificare se avete
  197. capito o se avete solo l'illusione di aver capito.
  198. Non dimenticatevi che HSTART fa spostare di 2 pixel ogni volta e non di 1
  199. pixel come potrebbe sembrare.
  200.  
  201.