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

  1.  
  2. ; Lezione11h3.s    - Effetto copper PRECALCOLATO!!! 50 copperlist precalcolate
  3. ;          e visualizzate in sequenza usando COP2LC ($dff084).
  4.  
  5.     SECTION    BarrexPrecalc,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    ; solo copper DMA
  15.  
  16. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  17.  
  18. START:
  19.     bsr.w    precalcop    ; Routine che precalcola 50 copperlist per
  20.                 ; fare un "loop" completo dell'effetto
  21.  
  22.     lea    $dff000,a5
  23.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  24.                     ; e sprites.
  25.  
  26.     move.l    #OURCOPPER,$80(a5)    ; Puntiamo la nostra COP
  27.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  28.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  29.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  30.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  31.  
  32. mouse:
  33.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  34.     MOVE.L    #$12000,d2    ; linea da aspettare = $120
  35. Waity1:
  36.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  37.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  38.     CMPI.L    D2,D0        ; aspetta la linea $120
  39.     BNE.S    Waity1
  40.  
  41.     btst    #2,$dff016    ; tasto destro premuto?
  42.     beq.s    Mouse2        ; se si non eseguire SwappaCoppero
  43.  
  44.     bsr.w    SwappaCoppero    ; Fai puntare alla prossima copperlist per
  45.                 ; la corretta "animazione" dell'effetto.
  46.  
  47. mouse2:
  48.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  49.     MOVE.L    #$12000,d2    ; linea da aspettare = $120
  50. Aspetta:
  51.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  52.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  53.     CMPI.L    D2,D0        ; aspetta la linea $120
  54.     BEQ.S    Aspetta
  55.  
  56.     btst    #6,$bfe001    ; mouse premuto?
  57.     bne.s    mouse
  58.     rts
  59.  
  60.  
  61. ******************************************************************************
  62. ; Routine di SWAP delle copperlist precalcolate.. (un'animazione!!!)
  63. ******************************************************************************
  64.  
  65. ;          \||||/
  66. ;          (·)(·)
  67. ;       ___\ \/ /___
  68. ;      (_   \__/   _)
  69. ;      /   .        \
  70. ;     /    |Stz!\_   \
  71. ;    (_____| ___(_____)
  72. ;     (___)      (___)
  73. ;       ¡   \_    ¡
  74. ;       |_   |   _|
  75. ;       |    ;    |
  76. ;       |    |    |
  77. ;     __(____|____)__
  78. ;    (_______:_______)
  79.  
  80.  
  81. SwappaCoppero:
  82.     MOVE.L    copbufpunt(PC),D0
  83.     lea    coppajumpa,a0    ; indirizzo puntatori al cop2 in coplist
  84.     MOVE.W    D0,6(A0)    ; fai puntare all'attuale fotogramma
  85.     SWAP    D0
  86.     MOVE.W    D0,2(A0)
  87.     ADD.L    #(linee*8)+AGGIUNTE,COPBUFPUNT    ; punta alla PROSSIMA COP
  88.     MOVE.L    copbufpunt(PC),D0
  89.     cmp.l    #finebuffoni,d0        ; Siamo all'ultima copper?
  90.     bne.w    NonRibuffona        ; Se non ancora, ok
  91.     move.l    #copbuf1,copbufpunt    ; altrimenti riparti dalla prima!
  92. NonRibuffona:
  93.     rts
  94.  
  95. ******************************************************************************
  96. ;         routine di precalc dell'effetto copper
  97. ******************************************************************************
  98.  
  99. ;    /\____/\
  100. ;    \(O..O)/
  101. ;     (----)
  102. ;      TTTT Mo!
  103.  
  104. LINEE        equ    211
  105. AGGIUNTE    equ    20    ; LUNGHEZZA PARTI AGGIUNTE IN FONDO...
  106. NUMBUFCOPPERI    equ    50    ; numero fotogrammi/copperlist!!!
  107.  
  108. PrecalCop:
  109.  
  110. ; Ora creiamo le copperlist.
  111.  
  112.     lea    copbuf1,a0        ; Indirizzo buffers dove fare cops
  113.     move.w    #NUMBUFCOPPERI-1,d7    ; numero di copperlist da precalcolare
  114. FaiBuf:
  115.     bsr.w    FaiCopp1        ; Fai una copperlist
  116.     add.w    #(linee*8)+AGGIUNTE,a0    ; punta a quella dopo
  117.     dbra    d7,FaiBuf        ; fai tutti i fotogrammi
  118.  
  119. ; Ora le "riempiamo", come se eseguissimo l'effetto in real-time.
  120.  
  121.     move.w    #NUMBUFCOPPERI-1,d7    ; numero cops da "riempire"
  122.     lea    copbuf1,a0        ; indirizzo prima copper precalcolata
  123. ribuf:
  124.      BSR.s    changecop    ; chiama la routine che cambia il copper
  125.     add.w    #(linee*8)+AGGIUNTE,a0 ; salta alla prossima da riempire
  126.     dbra    d7,riBuf    ; riempi tutte le copperlists
  127.  
  128.  
  129. ; Infine puntiamo le copperlists nei puntatori in copperlist!!!
  130.  
  131.     MOVE.L    #copbuf1,D0    ; primo "fotogramma" copper2
  132.     lea    coppajumpa,a0    ; puntatore alla fine di copper1
  133.     MOVE.W    D0,6(A0)    ; puntiamo...
  134.     SWAP    D0
  135.     MOVE.W    D0,2(A0)
  136.  
  137.     MOVE.L    #ourcopper,D0    ; copper1 INIZIO
  138.     lea    coppajumpa2,a0    ; puntatore alla fine della "pezzofinale"
  139.     MOVE.W    D0,6(A0)    ; a cui salta la copper2.
  140.     SWAP    D0
  141.     MOVE.W    D0,2(A0)
  142.     rts
  143.  
  144. ******************************************************************************
  145. ; routine che crea una copperlist
  146. ******************************************************************************
  147.  
  148. FaiCopp1:
  149.     move.l    a0,-(SP)
  150.     MOVE.L    #$2c07fffe,d1    ; istruzione copper wait, che inizia
  151.                 ; attendendo alla linea $2c
  152.     MOVE.L    #$1800000,d2    ; $dff180 = colore 0 per il copper
  153.     MOVE.w    #LINEE-1,d0    ; numero di linee per il loop
  154.     MOVEQ    #$000,d3    ; colore da mettere = nero
  155. coploop:
  156.     MOVE.L    d1,(a0)+    ; Metti il WAIT
  157.     MOVE.L    d2,(a0)+    ; Metti il $180 (color0) azzerato al NERO
  158.     ADD.L    #$01000000,d1    ; Fai aspettare il WAIT 1 linea dopo
  159.     DBRA    d0,coploop    ; ripeti fino alla fine delle linee
  160.     move.l    finPunt(PC),d0    ; pezzofinale, a cui saltano tutte le copper2
  161.                 ; usate come fotogrammi.
  162.     MOVE.w    #$82,(A0)+    ; PARTEFINALE da puntare - COP1LC
  163.     move.w    d0,(a0)+
  164.     swap    d0
  165.     MOVE.w    #$80,(A0)+
  166.     move.w    d0,(a0)+
  167.     move.l    #$880000,(a0)+    ; COPJMP1 - salto al pezzo finale, il quale
  168.                 ; poi ristabilira' copper1 come prima cop!
  169.     move.l    (SP)+,a0
  170.     rts
  171.  
  172. CopBufPunt:
  173.     dc.l    copbuf1
  174. FinPunt:
  175.     dc.l    pezzofinale
  176.  
  177. ******************************************************************************
  178. ; routine che cambia i colori in una copperlist
  179. ******************************************************************************
  180.  
  181. changecop:
  182.     move.l    a0,-(SP)    ; salva a0 nello stack
  183.     MOVE.w    #LINEE-1,d0    ; numero linee per il loop
  184.     MOVE.L    PuntatoreTABCol(PC),a1    ; inizio della tabella colori in a1
  185.     move.l    a1,PuntatTemporaneo    ; salvato nel PuntatoreTemporaneo
  186.     moveq    #0,d1            ; azzero d1
  187. LineeLoop:
  188.     move.w    (a1)+,6(a0)    ; copia il colore dalla tabella alla copperlist
  189.     addq.w    #8,a0        ; prossimo color0 in copperlist
  190.     addq.b    #1,d1        ; annoto in d1 la lunghezza della sotto-barra
  191.      cmp.b    #9,d1        ; fine della sotto-barra?
  192.     bne.s    AspettaSottoBarra
  193.  
  194.     MOVE.L    PuntatTemporaneo(PC),a1
  195.     addq.w    #2,a1            ; punto al colore dopo
  196.     cmp.l    #FINETABColBarra,PuntatTemporaneo    ; siamo a fine tab?
  197.     bne.s    NonRipartire        ; se non ancora, vai a NonRipartire
  198.     lea    TABColoriBarra(pc),a1    ; altrimenti riparti dal primo col!
  199. NonRipartire:
  200.     move.l    a1,PuntatTemporaneo    ; e salva il valore nel Pun. temporaneo
  201.     moveq    #0,d1            ; azzero d1
  202. AspettaSottoBarra:
  203.     dbra d0,LineeLoop    ; fai tutte le linee
  204.  
  205.     addq.l    #2,PuntatoreTABCol         ; prossimo colore
  206.     cmp.l    #FINETABColBarra+2,PuntatoreTABCol ; siamo alla fine della
  207.                          ; tabella colori?
  208.     bne.s FineRoutine             ; se no, esci, altrimenti...
  209.     move.l #TABColoriBarra,PuntatoreTABCol     ; riparti dal primo valore di
  210.                          ; TABColoriBarra
  211. FineRoutine:
  212.     move.l    (SP)+,a0    ; riprendi a0 dallo stack
  213.     rts
  214.  
  215. ;    Tabella con i valori RGB dei colori. in questo caso sono toni di BLU
  216.  
  217. TABColoriBarra:
  218.     dc.w    $000,$001,$002,$003,$004,$005,$006,$007
  219.     dc.w    $008,$009,$00A,$00B,$00C,$00D,$00D,$00E
  220.     dc.w    $00E,$00F,$00F,$00F,$00E,$00E,$00D,$00D
  221.     dc.w    $00C,$00B,$00A,$009,$008,$007,$006,$005
  222.     dc.w    $004,$003,$002,$001,$000,$000,$000,$000
  223.     dcb.w    10,$000
  224. FINETABColBarra:
  225.     dc.w    $000,$001,$002,$003,$004,$005,$006,$007    ; questi valori servono
  226.     dc.w    $008,$009,$00A,$00B,$00C,$00D,$00D,$00E ; per le sotto-barre
  227.     dc.w    $00E,$00F,$00F,$00F,$00E,$00E,$00D,$00D
  228.     dc.w    $00C,$00B,$00A,$009,$008,$007,$006,$005
  229.     dc.w    $004,$003,$002,$001,$000,$000,$000,$000
  230.  
  231.  
  232. PuntatTemporaneo:
  233.      dc.l    TABColoriBarra
  234.  
  235. PuntatoreTABCol:
  236.      DC.L    TABColoriBarra
  237.  
  238. ***************************************************************************
  239.  
  240.     SECTION    GRAPH,DATA_C
  241.  
  242. ourcopper:
  243. Copper2:
  244.     dc.w    $180,$000    ; Color0 - nero
  245.     dc.w    $100,$200    ; BplCon0 - no bitplanes
  246.  
  247. ; qua potete mettere spritepointers, colori, bplpointers eccetera...
  248.  
  249.  
  250. coppajumpa:
  251.     dc.w    $84        ; COP2LCh
  252.     DC.W    0
  253.     dc.w    $86        ; COP2LCl
  254.     DC.W    0
  255.     DC.W    $8a,0        ; COPJMP2 - fai partire la cop2 (fotogramma)
  256.  
  257. * * * * * * 
  258.  
  259. pezzofinale:            ; a questo pezzo salta la copper2 alla sua
  260.     dc.w    $ffdf,$fffe    ; fine, ogni fotogramma di animazione...
  261.     dc.w    $0107,$fffe
  262.     dc.w    $180,$010
  263.     dc.w    $0207,$fffe
  264.     dc.w    $180,$020
  265.     dc.w    $0307,$fffe
  266.     dc.w    $180,$030
  267.     dc.w    $0507,$fffe
  268.     dc.w    $180,$040
  269.     dc.w    $0707,$fffe
  270.     dc.w    $180,$050
  271.     dc.w    $0907,$fffe
  272.     dc.w    $180,$060
  273.     dc.w    $0c07,$fffe
  274.     dc.w    $180,$070
  275.     dc.w    $0f07,$fffe
  276.     dc.w    $180,$080
  277.     dc.w    $1207,$fffe
  278.     dc.w    $180,$090
  279.     dc.w    $1607,$fffe
  280.     dc.w    $180,$0a0
  281.     dc.w    $1a07,$fffe
  282.     dc.w    $180,$0b0
  283.     dc.w    $1f07,$fffe
  284.     dc.w    $180,$0c0
  285.     dc.w    $2607,$fffe
  286.     dc.w    $180,$0d0
  287.     dc.w    $2c07,$fffe
  288.     dc.w    $180,$0e0
  289.  
  290. coppajumpa2:
  291.     dc.w    $80    ; COP1lc per far ripartire la copperlist dall'ourcopper
  292.     DC.W    0
  293.     dc.w    $82    ; COP2Lcl
  294.     DC.W    0
  295.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  296. finepezzofinale:
  297.  
  298.  
  299.     section    bufcopperi,bss_C
  300.  
  301. copcols:
  302. copbuf1:
  303.     ds.b    ((linee*8)+AGGIUNTE)*NUMBUFCOPPERI    ; 50 copperlist!
  304. finebuffoni:
  305.  
  306.     end
  307.  
  308. Se vi precalcolate l'effetto copper, le moltiplicazioni, le coordinate dei
  309. 3d vectors, la musica... potete fare una demo che lascia libero il processore
  310. per fare aleno 1 effetto non precalcolato!!!! HAHAHAHA!
  311.  
  312. Da notare che dalla copper1 si salta alla copper2, alla cui fine si salta
  313. alla copper "pezzofinale", che ripunta come copper di partenza la copper1!
  314. Dunque facciamo saltare 2 volte il copper, e non 1 come in Lezione11h.s
  315.  
  316.