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

  1.  
  2. ;  Lezione11i6.s - effetto sfumato copper "pseudo 3d"
  3.  
  4.     SECTION    Barrex,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup2.s" ; Salva Copperlist Etc.
  10. *****************************************************************************
  11.  
  12.         ;5432109876543210
  13. DMASET    EQU    %1000001010000000    ; solo copper DMA
  14.  
  15. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  16.  
  17. START:
  18.     bsr.s    makerast    ; Fai la copperlist
  19.  
  20.     lea    $dff000,a5
  21.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  22.                     ; e sprites.
  23.  
  24.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  25.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  26.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  27.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  28.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  29.  
  30. mouse:
  31.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  32.     MOVE.L    #$12c00,d2    ; linea da aspettare = $12c
  33. Waity1:
  34.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  35.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  36.     CMPI.L    D2,D0        ; aspetta la linea $12c
  37.     BNE.S    Waity1
  38. Aspetta:
  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 $12c
  42.     BEQ.S    Aspetta
  43.  
  44.     bsr.s    MakeRast    ; rulla i colori
  45.  
  46.     btst    #6,$bfe001    ; mouse premuto?
  47.     bne.s    mouse
  48.     rts
  49.  
  50. *****************************************************************************
  51. ;    Routine che crea la copperlist
  52. *****************************************************************************
  53.  
  54. ;      Oo 
  55. ;     `--'
  56.  
  57. MakeRast:
  58.     lea Offsets(PC),a2    ; tabella con 8*20 valori degli offset tra le
  59.                 ; linee wait
  60.     sub.w    #1*20,ContatoreWaitAnim
  61.     bpl.s    nocolscroll
  62.     addq.b    #1,ContatoreColore
  63.     move.w    #7*20,ContatoreWaitAnim
  64. nocolscroll:
  65.     moveq    #0,d0        ; azzera d0
  66.     move.w    ContatoreWaitAnim(PC),d0
  67.     add.w    d0,a2        ; trova l'offset giusto nella tabella Offsets
  68.     lea    CopBuffer,a0
  69.  
  70.     moveq    #0,d0
  71.     move.b    ContatoreColore(PC),d0
  72.  
  73.     moveq    #20,d3        ; numero loops FaiCopper
  74.     lea Colors(PC),a1    ; tabella con i colori
  75. FaiCopper:
  76.     and.w    #%01111111,d0    ; servono solo i primi 7 bit di d0
  77.     move.w    d0,d2        ; rimetti in d2 l'ultimo valore del colore
  78.                 ; salvato
  79.     asl.l    #1,d2        ; e spostalo a sinistra di 1 bit, il che
  80.                 ; significa moltiplicare il valore per 2, dato
  81.                 ; che i valori nella tabella sono .w (2 bytes)
  82.                 ; in questo modo il valore di d2 e' pronto
  83.                 ; per il "move.w (a1,d2),(a0)+" finale
  84.  
  85.     addq.b    #1,d0        ; prossimo colore per il prossimo loop
  86.  
  87.     moveq    #0,d1        ; azzera d1
  88.     move.b    (a2)+,d1    ; prendi il prossimo offset dalla tabella
  89.  
  90.     add.b    #$0f,d1        ; offset dalla linea $00, ossia dall'inizio
  91.                 ; dello schermo, da aggiungere ai valori
  92.                 ; letti nella TAB
  93.     asl.w    #8,d1        ; sposta il valore a sinistra di 8 bit,dato che
  94.                 ; si tratta della coordinata verticale
  95.                 ; es: prima era $0019, allora diventa $1900
  96.  
  97.     or.w    #$07,d1        ; linea orizzontale dei wait: 07 (con l'OR si
  98.                 ; aggiunge lo 07 finale, es: $1907,$fffe...)
  99.     move.w    d1,(a0)+    ; prima word del wait con linea e colonna
  100.     move.w    #$fffe,(a0)+    ; seconda word del WAIT
  101.     move.w    #$0180,(a0)+    ; COLOR0
  102.     move.w    (a1,d2),(a0)+    ; copia il colore giusto dalla tabella alla
  103.                 ; copperlist
  104.     dbra    d3,FaiCopper
  105.     rts
  106.  
  107.  
  108.  
  109. ;    tabella con i colori della sfumatura. 128 valori.w
  110.  
  111. Colors:
  112.     dc.w $111,$444,$222,$777,$333,$aaa,$333,$aaa    ; prima parte grigia
  113.     dc.w $333,$aaa,$333,$aaa,$333,$aaa,$333,$aaa
  114.     dc.w $222,$777,$222,$444,$111,$000
  115.  
  116.     dc.w $000,$100,$200,$300,$400,$500,$600,$700    ; parte colorata
  117.     dc.w $800,$900,$a00,$b00,$c00,$d00,$e00
  118.     dc.w $f00,$f10,$f20,$f30,$f40,$f50,$f60,$f70
  119.     dc.w $f80,$f90,$fa0,$fb0,$fc0,$fd0,$fe0
  120.     dc.w $ff0,$ef0,$df0,$cf0,$bf0,$af0,$9f0,$8f0
  121.     dc.w $7f0,$6f0,$5f0,$4f0,$3f0,$2f0,$1f0
  122.     dc.w $0f0,$0f1,$0f2,$0f3,$0f4,$0f5,$0f6,$0f7
  123.     dc.w $0f8,$0f9,$0fa,$0fb,$0fc,$0fd,$0fe
  124.     dc.w $0ff,$0ef,$0df,$0cf,$0bf,$0af,$09f,$08f
  125.     dc.w $07f,$06f,$05f,$04f,$03f,$02f,$01f
  126.     dc.w $00f,$10f,$20f,$30f,$40f,$50f,$60f,$70f
  127.     dc.w $80f,$90f,$a0f,$b0f,$c0f,$d0f,$e0f
  128.     dc.w $f0f,$e0e,$d0d,$c0c,$b0b,$a0a,$909,$808
  129.     dc.w $707,$606,$505,$404,$303,$202,$101,$000
  130.     
  131.  
  132. ; Tabella per distanze tra una linea e l'altra.
  133. ; Sono 8 linee di 20 valori, per un totale di 20*8=160 bytes
  134. ; Da notare che mentre i primi valori di ogni linea sono molto distanti fra
  135. ; loro (0,16,28,37...) gli ultimi arrivano ad essere consecutivi (77,78,79)
  136. ; Questo e' per rendere una specie di prospettiva:
  137. ;
  138. ;    ------------------------------------------------------------
  139. ;
  140. ;    ------------------------------------------------------------
  141. ;    ____________________________________________________________
  142. ;    ____________________________________________________________
  143. ;    ------------------------------------------------------------
  144. ;
  145. ; Ci sono 8 linee di 20 valori, in quanto ogni fotogramma i wait "si spostano"
  146. ; scorrendo in alto (si noti: 0,16.. prima linea, 2,18... la seconda, 6,21 la
  147. ; terza). In questo modo, oltre ad essere disposti in "pseudo-prospettiva",
  148. ; scorrono verso l'alto rendendo l'effetto piu' credibile. Potremmo dire che
  149. ; questa e' una tabella con 8 "fotogrammi" di animazione dei wait!!!
  150.  
  151. Offsets:
  152.     dc.b  0,16,28,37,44,50,54,58,61,64,66,68,70,72,74,75,76,77,78,79
  153.     dc.b  2,18,29,38,45,50,55,58,61,64,66,68,70,72,74,75,76,77,78,79
  154.     dc.b  4,20,31,39,45,51,55,58,62,64,67,69,71,72,74,75,76,77,78,79
  155.     dc.b  6,21,32,40,46,51,56,59,62,65,67,69,71,72,74,75,76,77,78,79
  156.     dc.b  8,23,33,41,47,52,56,60,62,65,67,69,71,72,74,75,76,77,78,79
  157.     dc.b 10,24,34,42,48,52,56,60,63,65,68,69,71,73,74,75,76,77,78,79
  158.     dc.b 12,25,35,42,48,53,57,60,63,66,68,70,71,73,74,75,76,77,78,79
  159.     dc.b 14,27,36,43,49,54,57,61,63,66,68,70,71,73,74,75,76,77,78,79
  160.  
  161. ContatoreWaitAnim:
  162.      dc.w    7*20
  163.  
  164. ContatoreColore:
  165.     dc.b    0
  166.  
  167.     even
  168.  
  169. *****************************************************************************
  170. ;    Copperlist
  171. *****************************************************************************
  172.  
  173.     Section    Grafica,data_C
  174.  
  175. copperlist:
  176.     dc.w    $8e,$2c81    ; DiwStrt
  177.     dc.w    $90,$2cc1    ; DiwStop
  178.     dc.w    $92,$38        ; DdfStart
  179.     dc.w    $94,$d0        ; DdfStop
  180.     dc.w    $102,0        ; BplCon1
  181.     dc.w    $104,0        ; BplCon2
  182.     dc.w    $108,40        ; Bpl1Mod
  183.     dc.w    $10a,40        ; Bpl2Mod
  184.  
  185.     dc.w    $180,$000    ; Color0 nero
  186.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  187.  
  188. CopBuffer:
  189.     dcb.w    21*4,0        ; spazio dove viene creato l'effetto
  190.  
  191.     dc.w    $6007,$fffe    ; "pavimentazione" grigia
  192.     dc.w    $0180,$0444
  193.     dc.w    $6207,$fffe
  194.     dc.w    $0180,$0666
  195.     dc.w    $6507,$fffe
  196.     dc.w    $0180,$0888
  197.     dc.w    $6907,$fffe
  198.     dc.w    $0180,$0aaa
  199.  
  200.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  201.  
  202.  
  203.     end
  204.  
  205.