home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11g5.s < prev    next >
Text File  |  1995-07-11  |  5KB  |  161 lines

  1.  
  2. ; Lezione11g5.s -  Uso della caratteristica del copper di richiedere 8 pixel
  3. ;           orizzontali per eseguire un suo "MOVE".
  4. ;           Tasto destro per far scendere la "corda".
  5.  
  6.     SECTION    Spago,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s" ; Salva Copperlist Etc.
  12. *****************************************************************************
  13.  
  14.         ;5432109876543210
  15. DMASET    EQU    %1000001010000000    ; solo copper DMA
  16.  
  17. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  18.  
  19. START:
  20.     bsr.w    FaiCopper    ; Crea la copperlist...
  21.  
  22.     lea    $dff000,a6
  23.     MOVE.W    #DMASET,$96(a6)        ; DMACON - abilita bitplane, copper
  24.                     ; e sprites.
  25.  
  26.     move.l    #COPLIST,$80(a6)    ; Puntiamo la nostra COP
  27.     move.w    d0,$88(a6)        ; Facciamo partire la COP
  28.     move.w    #0,$1fc(a6)        ; Disattiva l'AGA
  29.     move.w    #$c00,$106(a6)        ; Disattiva l'AGA
  30.     move.w    #$11,$10c(a6)        ; Disattiva l'AGA
  31.  
  32. mouse:
  33.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  34.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  35. Waity1:
  36.     MOVE.L    4(A6),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 $130 (304)
  39.     BNE.S    Waity1
  40.  
  41.     btst    #2,$16(a6)    ; tasto destro del mouse premuto?
  42.     bne.s    NonScendere
  43.     addq.b    #1,WaitLine    ; Se si, fai scendere il tutto!
  44. NonScendere:
  45.  
  46.     bsr.w    MuoviCopper    ; rolla lo spago...
  47.  
  48.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  49.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  50. Aspetta:
  51.     MOVE.L    4(A6),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 $130 (304)
  54.     BEQ.S    Aspetta
  55.  
  56.     btst    #6,$bfe001    ; mouse premuto?
  57.     bne.s    mouse
  58.     rts            ; esci
  59.  
  60.  
  61. ******************************************************************************
  62. ;    Routine che crea la copperlist. Per fare una linea orizzontale
  63. ;    completa occorrono 52 MOVE del copper. In questo caso prendiamo
  64. ;    alternativamente 32 MOVE per colore, per cui non terminano una
  65. ;    linea esatta, ma i 2 colori si "incrociano" in punti orizzontali
  66. ;    diversi. Questo crea una senzazione di "intreccio".
  67. ******************************************************************************
  68. ;                   ______________
  69. ;                  /              \
  70. ;      ..::;::..  /  HaI CaPiTo?!  \
  71. ;     ¡ ________) \_ ______________/
  72. ;     l_`--°'\°¬)  / /
  73. ;     /______·)¯\  \/
  74. ;    ( \±±±±±)  /
  75. ;     \________/
  76. ;       T____T xCz
  77.  
  78. NumeroIntrecci    EQU    8
  79. IngombroCopEf    EQU    NumeroIntrecci*(32*2)
  80.  
  81.  
  82. FaiCopper:
  83.     LEA    CopBuf,A0        ; Indirizzo buffer in CopList
  84.     MOVEQ    #NumeroIntrecci-1,D6    ; numero intrecci
  85. MAIN0:
  86.     LEA    COLORS1(PC),A1    ; tab COLORS1
  87.     MOVEQ    #32-1,D7    ; 32 color0 per colori da COLORS1
  88. COP0:
  89.     MOVE.W    #$0180,(A0)+    ; registro COLOR0
  90.     MOVE.W    (A1)+,(A0)+    ; valore del color dalla tabella COLORS1
  91.     DBRA    d7,COP0        ; fai tutta la "linea" (non 1 intera...)
  92.     LEA    COLORS2(PC),A1    ; tab COLORS2
  93.     MOVEQ    #32-1,D7    ; 32 color0 per colori da COLORS2
  94. COP1:
  95.     MOVE.W    #$0180,(A0)+    ; registro COLOR0
  96.     MOVE.W    (A1)+,(A0)+    ; valore del color0 dalla tabella COLORS2
  97.     DBRA    d7,COP1        ; fai tutta la "linea" (non 1 intera...)
  98.     DBRA    d6,MAIN0    ; Fai tutti gli "intrecci".
  99.     RTS
  100.  
  101.  
  102. COLORS1:
  103.  DC.W    $003,$001,$002,$003,$004,$005,$006,$007
  104.  DC.W    $008,$009,$00A,$00B,$00C,$00D,$00E,$10F
  105.  DC.W    $10F,$00E,$00D,$00C,$00B,$00A,$009,$008
  106.  DC.W    $007,$006,$005,$004,$003,$002,$001,$003
  107.  
  108. COLORS2:
  109.  DC.W    $010,$010,$020,$030,$040,$050,$060,$070
  110.  DC.W    $080,$090,$0A0,$0B0,$0C0,$0D0,$0E0,$0F0
  111.  DC.W    $0F0,$0E0,$0D0,$0C0,$0B0,$0A0,$090,$080
  112.  DC.W    $070,$060,$050,$040,$030,$020,$010,$010
  113.  
  114.  
  115. ******************************************************************************
  116. ; Routine che "rotea" i colori...
  117. ******************************************************************************
  118.  
  119. ;       _
  120. ;     _( )_
  121. ;    (_-O-_)
  122. ;      (_)
  123.  
  124. MuoviCopper:
  125.     LEA    CopBuf,A0    ; Buffer in copperlist
  126.     MOVE.w    #IngombroCopEf-1,D7
  127.     move.w    #(IngombroCopEf*4)-2,d6    ; offset per trovare l'ultimo colore
  128.     MOVE.W    0(A0,D6.W),D0    ; ultimo colore in d0 (a0+offset!)
  129.     MOVE.W    D6,D5
  130.     SUBQ.W    #4,D5        ; offset colore precedente in d5
  131. SYNC0:
  132.     MOVE.W    0(A0,D5.W),0(A0,D6.W)    ; colore precedente in quello "dopo"
  133.     SUBQ.W    #4,D6            ; calcola offset prossimo colore
  134.     SUBQ.W    #4,D5            ; calcola offset prossimo colore
  135.     dbra    d7,SYNC0        ; Esegui per tutto il "nodo"
  136.     MOVE.W    D0,2(A0) ; metti l'ultimo colore, che avevamo salvato, come
  137.              ; primo colore, per non interrompere il ciclo.
  138.     RTS
  139.  
  140. ******************************************************************************
  141.  
  142.     section    coop,data_C
  143.  
  144. COPLIST:
  145.     DC.W    $100,$200    ; BplCon0 - no bitplanes
  146.     DC.W    $180,$003    ; Color0 - blu scuro
  147. WaitLine:
  148.     DC.W    $4001,$FFFE    ; Wait linea $40.
  149. CopBuf:
  150.     DCB.L    IngombroCopEf,0 ; Spazio per l'effetto cop
  151.     DC.W    $180,3        ; Color0 - blu scuro
  152.     DC.w    $ffff,$fffe    : Fine della Copperlist
  153.  
  154.     END
  155.  
  156. Un'altro utilizzo della peculiarita' dei move del copper per cui ognuno fa
  157. "scattare" in avanti di 8 pixel. Si puo' notare che tutto l'effetto e'
  158. composto solamente da decine di COLOR0 messi di seguito, per cui basta
  159. cambiare il wait che li precede per far spostare "tutto" in basso.
  160.  
  161.