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

  1.  
  2. ; Lezione11g4.s    - Effetto di scorrimento orizzontale dei colori col Copper
  3.  
  4.     SECTION    Supercar,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.     lea    $dff000,a5
  19.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  20.                     ; e sprites.
  21.  
  22.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  23.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  24.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  25.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  26.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  27.  
  28. mouse:
  29.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  30.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  31. Waity1:
  32.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  33.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  34.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  35.     BNE.S    Waity1
  36.  
  37.     btst    #2,$dff016    ; tasto destro premuto?
  38.     beq.s    Mouse2        ; se si non eseguire Linecop
  39.  
  40.     bsr.s    LineCop        ; Effetto "supercar"
  41.  
  42. mouse2:
  43.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  44.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  45. Aspetta:
  46.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  47.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  48.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  49.     BEQ.S    Aspetta
  50.  
  51.     btst    #6,$bfe001    ; mouse premuto?
  52.     bne.s    mouse
  53.     rts
  54.  
  55. ; Questa routine immette i colori ciclicamente dalla tabella alle due linee
  56. ; formate da 54 "dc.w $1800000". L'effetto e' possibile in quanto ogni volta
  57. ; che il copper legge una istruzione, formata da 2 words, il tempo necessario
  58. ; per arrivare a leggere quella seguente corrisponde a 4 pixel per word, ossia
  59. ; 8 pixel per ogni istruzione completa. Facendo un calcolo, in uno schermo
  60. ; largo 320 pixel si puo' cambiare il colore orizzontalmente 40 volte, infatti
  61. ; 320/8=40. In questo caso si parte dalla posizione verticale overscan,
  62. ; ossia fuori dai bordi del monitor (il wait e' dc.w $2901,$FFFE), e si arriva
  63. ; fuori al bordo destro dall'altra parte. In teoria faremmo 54*8=432 pixel
  64. ; di larghezza (monitor permettendo). Da notare che ci si riferisce a 8 pixel
  65. ; LOWRES, in caso di HIRES la dimensione rimane invariata, ed apparira' di
  66. ; 16 pixel hires, naturalmente.
  67.  
  68. ;          /////////
  69. ;         /       /_____________________
  70. ;        / ___ __//                     \
  71. ;       / ______//  eY! fig sta rutin!   \
  72. ;     _/ /  ® \©\\_ _____________________/
  73. ;    (_  \____/_/ / /
  74. ;     \ _       \ \/
  75. ;      \/    (·__)
  76. ;      /        |
  77. ;     /_____ (o)|
  78. ;       T T`----'
  79. ;       l_! xCz
  80.  
  81. LineCop:
  82.     lea    TabellaColori(PC),a0
  83.     lea    FineTabColori(PC),a3
  84.     lea    EffInCop,a1    ; Indirizzo barra orizzontale 1
  85.     lea    EffInCop2,a2    ; Indirizzo barra orizzontale 2
  86.     moveq    #54-1,d3    ; Numero di colori orizzontali
  87.     addq.l    #2,ColBarraAltOffset    ; Barra bassa - scorr. colori
  88.                     ; verso sinistra
  89.     subq.l    #2,ColBarraBassOffset    ; Barra alta - scorrimento colori
  90.                     ; verso destra
  91.     move.l    ColBarraAltOffset(PC),d0    ; Start Offset (1)
  92.     add.l    d0,a0        ; trova il colore giusto nella tabella colori
  93.                 ; secondo l'offset attuale
  94.     cmp.w    #-1,(a0)    ; siamo alla fine della tabella? (indicata
  95.                 ; con un dc.w -1)
  96.     bne.s    CSalta        ; se no, vai avanti
  97.     clr.l    ColBarraAltOffset    ; altrimenti riparti
  98.     lea    TabellaColori(PC),a0    ; dal primo colore
  99. CSalta:
  100.     move.l    ColBarraBassOffset(PC),d1    ; Start Offset (2)
  101.     sub.l    d1,a3                ; trova il colore giusto
  102.     cmp.w    #-1,-(a3)        ; siamo alla fine della tabella
  103.     bne.s    MettiColori        ; se non ancora vai avanti
  104.     move.l    #FineTabColori-TabellaColori,ColBarraBassOffset ; altrimenti
  105.                     ; fai ripartire dalla fine della
  106.                     ; tabella (dato che questa barra
  107.                     ; scorre all'indietro!)
  108.     lea    FineTabColori-2(PC),a3
  109. MettiColori:
  110.     addq.w    #2,a1        ; salta il dc.w $180
  111.     addq.w    #2,a2        ; salta il dc.w $180
  112.     move.w    (a0)+,(a1)+    ; Immetti il colore in coplist (barra1)
  113.     move.w    (a3),(a2)+    ; Immetti il col. nella barra 2
  114.  
  115.     cmp.w    #-1,(a0)    ; siamo alla fine della tabella colori? (bar1)
  116.     bne.s    NonFine        ; se non ancora vai avanti
  117.     lea     TabellaColori(PC),a0    ; altrimenti riparti da capo (bar1)
  118. NonFine:
  119.     cmp.w    #-1,-(a3)    ; siamo all'inizio della tab colori? (bar2)
  120.     bne.s    NonFine2    ; se non ancora vai avanti
  121.     lea     FineTabColori-2(PC),a3    ; altrimenti riparti dalla fine (bar2)
  122. NonFine2:
  123.     dbra    d3,MettiColori
  124.     rts
  125.  
  126. *** *** *** *** *** *** *** *** *** ***
  127.  
  128.  
  129. ColBarraAltOffset:
  130.     dc.l    0
  131.  
  132. ColBarraBassOffset:
  133.     dc.l    0
  134.  
  135.  
  136.  
  137. ; NOTA: per indicare la fine ( e l'inizio) della tabella, viene controllato
  138. ;    se si e' arrivati al dc.w -1.
  139.  
  140.     dc.w     -1    ; fine tabella
  141. TabellaColori:
  142.     DC.W    $F0F,$F0E,$F0D,$F0C,$F0B,$F0A,$F09,$F08,$F07,$F06
  143.     DC.W    $F05,$F04,$F03,$F02,$F01,$F00,$F10,$F20,$F30,$F40
  144.     DC.W    $F50,$F60,$F70,$F80,$F90,$FA0,$FB0,$FC0,$FD0,$FE0
  145.     DC.W    $FF0,$EF0,$DF0,$CF0,$BF0,$AF0,$9F0,$8F0,$7F0,$6F0
  146.     DC.W    $5F0,$4F0,$3F0,$2F0,$1F0,$0F0,$0F1,$0F2,$0F3,$0F4
  147.     DC.W    $0F5,$0F6,$0F7,$0F8,$0F9,$0FA,$0FB,$0FC,$0FD,$0FE
  148.     DC.W    $0FF,$0EF,$0DF,$0CF,$0BF,$0AF,$09F,$08F,$07F,$06F
  149.     DC.W    $05F,$04F,$03F,$02F,$01F,$00F,$10F,$20F,$30F,$40F
  150.     DC.W    $50F,$60F,$70F,$80F,$90F,$A0F,$B0F,$C0F,$D0F,$E0F
  151. FineTabColori:
  152.     dc.w    -1    ; fine tabella
  153.  
  154.  
  155.     section CList,code_c
  156.  
  157. CopperList:
  158.     dc.w    $100,$200    ; BPLCON0 - 0 bitplanes
  159.     dc.w    $180,$000    ; Color0 nero
  160.  
  161.     dc.w    $2901,$FFFE    ; Wait linea $29
  162. EffInCop2:
  163.     dcb.l    54,$1800000    ; 54 Color0 di seguito, che a scatti di 8
  164.                 ; pixel in avanti ogni volta riempiono la
  165.                 ; linea interamente
  166.  
  167.     dc.w    $2a01,$FFFE    ; Wait linea $2a
  168.     dc.w    $180,$000    ; Color0 nero
  169.  
  170.  
  171.     dc.w    $FFDF,$FFFE    ; Wait speciale per andare in zona PAL
  172.  
  173.     dc.w    $2A01,$FFFE    ; Attendi la linea $2a+$ff
  174. EffInCop:
  175.     dcb.l    54,$1800000    ; 54 Color0 di seguito, che a scatti di 8
  176.                 ; pixel in avanti ogni volta riempiono la
  177.                 ; linea interamente
  178.  
  179.     dc.w    $2B07,$FFFE    ; Wait linea $ff+$2b
  180.     dc.w    $180,$000    ; Color0 nero
  181.  
  182.     dc.w    $FFFF,$FFFE    ; Fine copperlist
  183.  
  184.     end
  185.  
  186.