home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti5 / lezione9e2.s < prev    next >
Text File  |  1995-10-23  |  5KB  |  167 lines

  1.  
  2. ; Lezione9e2.s        SHIFTAMENTO CON oggetto largo 2 word (una azzerata)
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup1.s"    ; Salva Copperlist Etc.
  10. *****************************************************************************
  11.  
  12.         ;5432109876543210
  13. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  14.  
  15.  
  16. START:
  17. ;    Puntiamo la PIC "vuota"
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  26.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  27.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  28.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  29.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  30.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  31.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  32.  
  33.     moveq    #0,d4            ; coordinata orizzontale a 0
  34.  
  35. Loop:
  36.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  37.     MOVE.L    #$10800,d2    ; linea da aspettare = $108
  38. Waity1:
  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 $108
  42.     BNE.S    Waity1
  43. Waity2:
  44.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  45.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  46.     CMPI.L    D2,D0        ; aspetta la linea $108
  47.     Beq.S    Waity2
  48.  
  49. ;                .
  50. ;               .¦.¦:.:¦:.:¦
  51. ;              .;/'____  `;l
  52. ;              ;/ /   ¬\  __\
  53. ;              / /    ° \/o¬\\
  54. ;             /  \______/\__//
  55. ;            / ____       \  \
  56. ;            \ \   \    ,  )  \
  57. ;            /\ \   \_________/
  58. ;           /    \   l_l_|/ /
  59. ;          /    \ \      / /
  60. ;       __/    _/\ \/\__/ /
  61. ;      / ¬`----'¯¯\______/
  62. ;     /  __      __ \
  63. ;    /   /        T  \
  64.  
  65.     move.w    d4,d5    ; coordinata orizzontale attuale in d5
  66.  
  67.     and.w    #$000f,d5    ; Si selezionano i primi 4 bit perche' vanno
  68.                 ; inseriti nello shifter del canale A
  69.     lsl.w    #8,d5        ; i 4 bit vengono spostati sul nibble alto
  70.     lsl.w    #4,d5        ; della word... (8+4 = shift di 12 bit!)
  71.     or.w    #$09f0,d5    ; ...giusti per inserirsi nel registro BLTCON0
  72.                 ; Qua mettiamo $f0 nei minterm per copia da
  73.                 ; sorgente A a destinazione D e abilitiamo
  74.                 ; ovviamente i canali A+D con $0900 (bit 8
  75.                 ; per D e 11 per A). Ossia $09f0 + shift.
  76.  
  77.     addq.w    #1,d4        ; Aggiungi 1 alla coordinata orizzontale per
  78.                 ; andare a destra di 1 pixel la prossima volta
  79.  
  80.     move.w    #$ffff,$44(a5)        ; BLTAFWM lo spieghiamo dopo
  81.     move.w    #$ffff,$46(a5)        ; BLTALWM lo spieghiamo dopo
  82.     move.w    d5,$40(a5)        ; BLTCON0 (usa A+D) - nel registro
  83.                     ; abbiamo messo lo shift! (bits 12,13
  84.                     ; 14 e 15, ossia nibble alto!)
  85.     move.w    #$0000,$42(a5)        ; BLTCON1 lo spieghiamo dopo
  86.     move.w    #0,$64(a5)        ; BLTAMOD (=0)
  87.     move.w    #36,$66(a5)        ; BLTDMOD (40-4=36)
  88.     move.l    #figura,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  89.     move.l    #bitplane,$54(a5)    ; BLTDPT  (linee di schermo)
  90.     move.w    #(64*6)+2,$58(a5)    ; BLTSIZE (via al blitter !)
  91.                     ; blittiamo 2 word, la seconda delle
  92.                     ; quali e' nulla per permettere
  93.                     ; lo shift
  94.     btst    #6,$bfe001        ; mouse premuto?
  95.     bne.s    loop
  96.  
  97.     btst    #6,2(a5) ; dmaconr
  98. WBlit2:
  99.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  100.     bne.s    wblit2
  101.  
  102.     rts
  103.  
  104. ;****************************************************************************
  105.  
  106.     SECTION    GRAPHIC,DATA_C
  107.  
  108. COPPERLIST:
  109.     dc.w    $8E,$2c81    ; DiwStrt
  110.     dc.w    $90,$2cc1    ; DiwStop
  111.     dc.w    $92,$38        ; DdfStart
  112.     dc.w    $94,$d0        ; DdfStop
  113.     dc.w    $102,0        ; BplCon1
  114.     dc.w    $104,0        ; BplCon2
  115.     dc.w    $108,0        ; Bpl1Mod
  116.     dc.w    $10a,0        ; Bpl2Mod
  117.  
  118.     dc.w    $100,$1200
  119.  
  120. BPLPOINTERS:
  121.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  122.  
  123.     dc.w    $0180,$000    ; color0
  124.     dc.w    $0182,$eee    ; color1
  125.  
  126.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  127.  
  128. ;****************************************************************************
  129.  
  130. ; ecco il pesce... questa volta abbiamo una seconda word azzerata per ogni riga
  131. ; dimensioni: 32*6
  132.  
  133. Figura:
  134.     dc.w    %1000001111100000,%000000000000000
  135.     dc.w    %1100111111111000,%000000000000000
  136.     dc.w    %1111111111101100,%000000000000000
  137.     dc.w    %1111111111111110,%000000000000000
  138.     dc.w    %1100111111111000,%000000000000000
  139.     dc.w    %1000001111100000,%000000000000000
  140.  
  141. ;****************************************************************************
  142.  
  143.     SECTION    PLANEVUOTO,BSS_C    
  144.  
  145. BITPLANE:
  146.     ds.b    40*256        ; bitplane azzerato lowres
  147.  
  148.     end
  149.  
  150. ;****************************************************************************
  151.  
  152. In questo esempo spostiamo una figura verso destra di un pixel alla volta
  153. con lo shift, utilizzando una word azzerata a destra di ogni riga per
  154. milgiorare l'effetto rispetto a Lezione9e1.s
  155. Poiche` non incrementiamo mai l'indirizzo destinazione, la figura si sposta
  156. solo usando lo shifter del blitter.
  157. In questo modo e` possibile spostarsi al massimo di 15 pixel, poiche` 15 e` il
  158. massimo valore di shift consentito.
  159. Dopo aver raggiunto 15, il valore di shift (che e` ottenuto prendendo i 4 bit
  160. meno significativi della posizione della figura) ritorna al valore 0 e pertanto
  161. la figura ritornera` alla posizione di partenza per ricominciare a muoversi.
  162. Per fare uno scroll "serio", ogni 15 pixel di scorrimento ottenuto con lo
  163. shift occorrerebbe far scattare l'immagine di 16 pixel aggiungendo 2 alla
  164. destinazione, e ripartendo con lo shift a zero, eccetera, in modo analogo a
  165. quanto visto per lo scroll con bplcon1 ($dff102) e bplpointers in copperlist.
  166.  
  167.