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

  1.  
  2. ; Lezione9e1.s        * SHIFTAMENTO * del blitter.
  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. ;    |.· _ ·· _ ·.|
  52. ;    l_ ¯_¯  ¯_¯  |
  53. ;     | (°),.(°)  T
  54. ;     | _________ |
  55. ;     |  \_l_l_/  |
  56. ;     l___`---'___|xCz
  57. ;        `------'
  58.  
  59.     move.w    d4,d5    ; coordinata orizzontale attuale in d5
  60.  
  61.     and.w    #$000f,d5    ; Si selezionano i primi 4 bit perche' vanno
  62.                 ; inseriti nello shifter del canale A
  63.     lsl.w    #8,d5        ; i 4 bit vengono spostati sul nibble alto
  64.     lsl.w    #4,d5        ; della word... (8+4 = shift di 12 bit!)
  65.     or.w    #$09f0,d5    ; ...giusti per inserirsi nel registro BLTCON0
  66.                 ; Qua mettiamo $f0 nei minterm per copia da
  67.                 ; sorgente A a destinazione D e abilitiamo
  68.                 ; ovviamente i canali A+D con $0900 (bit 8
  69.                 ; per D e 11 per A). Ossia $09f0 + shift.
  70.  
  71.     addq.w    #1,d4        ; Aggiungi 1 alla coordinata orizzontale per
  72.                 ; andare a destra di 1 pixel la prossima volta
  73.  
  74.     btst    #6,2(a5) ; dmaconr
  75. WBlit1:
  76.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  77.     bne.s    wblit1
  78.  
  79.     move.w    #$ffff,$44(a5)        ; BLTAFWM lo spieghiamo dopo
  80.     move.w    #$ffff,$46(a5)        ; BLTALWM lo spieghiamo dopo
  81.     move.w    d5,$40(a5)        ; BLTCON0 (usa A+D) - nel registro
  82.                     ; abbiamo messo lo shift! (bits 12,13
  83.                     ; 14 e 15, ossia nibble alto!)
  84.     move.w    #$0000,$42(a5)        ; BLTCON1 lo spieghiamo dopo
  85.     move.w    #0,$64(a5)        ; BLTAMOD (=0)
  86.     move.w    #38,$66(a5)        ; BLTDMOD (40-2=38)
  87.     move.l    #figura,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  88.     move.l    #bitplane,$54(a5)    ; BLTDPT  (linee di schermo)
  89.     move.w    #(64*6)+1,$58(a5)    ; BLTSIZE (via al blitter !)
  90.                     ; la figura e` larga 1 word e alta
  91.                     ; 6 linee
  92.     btst    #6,$bfe001        ; mouse premuto?
  93.     bne.s    loop
  94.  
  95.     btst    #6,2(a5) ; dmaconr
  96. WBlit2:
  97.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  98.     bne.s    wblit2
  99.  
  100.     rts
  101.  
  102. ;****************************************************************************
  103.  
  104.     SECTION    GRAPHIC,DATA_C
  105.  
  106. COPPERLIST:
  107.     dc.w    $8E,$2c81    ; DiwStrt
  108.     dc.w    $90,$2cc1    ; DiwStop
  109.     dc.w    $92,$38        ; DdfStart
  110.     dc.w    $94,$d0        ; DdfStop
  111.     dc.w    $102,0        ; BplCon1
  112.     dc.w    $104,0        ; BplCon2
  113.     dc.w    $108,0        ; Bpl1Mod
  114.     dc.w    $10a,0        ; Bpl2Mod
  115.  
  116.     dc.w    $100,$1200
  117.  
  118. BPLPOINTERS:
  119.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  120.  
  121.     dc.w    $0180,$000    ; color0
  122.     dc.w    $0182,$eee    ; color1
  123.  
  124.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  125.  
  126. ;****************************************************************************
  127.  
  128. ; Ecco il pesce... largo 16 pixel (1 word) e alto 6 linee.
  129.  
  130. Figura:
  131.     dc.w    %1000001111100000
  132.     dc.w    %1100111111111000
  133.     dc.w    %1111111111101100
  134.     dc.w    %1111111111111110
  135.     dc.w    %1100111111111000
  136.     dc.w    %1000001111100000
  137.  
  138. ;****************************************************************************
  139.  
  140.     SECTION    PLANEVUOTO,BSS_C    
  141.  
  142. BITPLANE:
  143.     ds.b    40*256        ; bitplane azzerato lowres
  144.  
  145.     end
  146.  
  147. ;****************************************************************************
  148.  
  149. In questo esempio potete vedere come opera lo shift. Abbiamo una figura larga
  150. 1 word e alta 6 linee.
  151. Questa figura viene blittata sempre allo stesso indirizzo destinazione, ossia
  152. viene messo sempre lo stesso indirizzo in BLTDPT ($dff054).
  153. Ogni volta, pero` viene aumentato di 1 il valore di shift nel BLTCON0.
  154. In questo modo la figura si sposta ogni volta di 1 pixel a destra.
  155. Notate bene il fenomeno descritto nella lezione: i bit che vengono shiftati
  156. fuori dalla word rientrano a sinistra nella word successiva.
  157. Nel nostro caso questo non va bene, perche` il muso del pesce esce a destra e
  158. rientra a sinistra, dietro alla coda.
  159. Nel prossimo esempio vedremo come risolvere il problema.
  160.  
  161.