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

  1.  
  2. ; Lezione9g2.s    BLITTATA, in cui copiamo un rettangolo da un punto
  3. ;        all'altro dello stesso schermo in formato INTERLEAVED
  4. ;        Tasto sinistro per eseguire la blittata, destro per uscire.
  5.  
  6.     SECTION    CiriCop,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup1.s"    ; Salva Copperlist Etc.
  12. *****************************************************************************
  13.  
  14.         ;5432109876543210
  15. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  16.  
  17.  
  18. START:
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     MOVEQ    #3-1,D1        ; numero di bitplanes (qua sono 3)
  23. POINTBP:
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.     swap    d0
  28.                 ; QUI C'E` LA UNA DIFFERENZA RISPETTO
  29.                 ; ALLE IMMAGINI NORMALI!!!!!!
  30.     ADD.L    #40,d0        ; + LUNGHEZZA DI UNA RIGA !!!!!
  31.     addq.w    #8,a1
  32.     dbra    d1,POINTBP
  33.  
  34.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  35.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  36.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  37.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  38.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  39.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  40.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  41.  
  42. mouse1:
  43.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  44.     bne.s    mouse1        ; se no, aspetta
  45.  
  46.     bsr.s    copia        ; esegui la routine di copia
  47.  
  48. mouse2:
  49.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  50.     bne.s    mouse2        ; se no, torna a mouse2:
  51.  
  52.     rts
  53.  
  54.  
  55. ; ************************ LA ROUTINE DI COPIA ****************************
  56.  
  57.  ; viene copiato un rettangolo con larghezza=160 e altezza=20
  58.  ; dalle coordinate X1=64, Y1=50 (sorgente)
  59.  ; alle coordinate X2=80, Y2=190 (destinazione)
  60.  
  61. ;               _
  62. ;              /¬\
  63. ;             /   \
  64. ;        __  /__ __\  __
  65. ;     .--\/-/ `°u°' \-\/--.
  66. ;     |    /  T¯¯¬   \    |
  67. ;     |   /   `       \   |
  68. ;     |  /_____________\  |
  69. ;     |    _         _    |
  70. ;     |    |         |    |
  71. ;     l____|         l____|
  72. ;     (____)----^----(____)
  73. ;        T      T      T   xCz
  74. ;     ___l______|______|___
  75. ;    `----------^----------'
  76.  
  77. copia:
  78.  
  79. ; Carica gli indirizzi sorgente e destinazione in 2 registri
  80. ; NOTATE LA DIFFERENZA RISPETTO AL CASO NORMALE: NEL CALCOLO DELL'OFFSET
  81. ; DELLA RIGA Y SI MOLTIPLICA ANCHE PER IL NUMERO DI PLANES (cioe` 3)
  82. ; la formula e` OFFSET=(Y*(NUMERO WORDS PER RIGA)*(NUMERO PLANES))*2
  83.  
  84.     move.l    #bitplane+((20*3*50)+64/16)*2,d0    ; ind. sorgente
  85.                             ; notate il fattore *3!
  86.     move.l    #bitplane+((20*3*190)+80/16)*2,d2    ; ind. destinazione
  87.                             ; notate il fattore *3!
  88.  
  89.     btst    #6,2(a5)    ; aspetta che il blitter finisca
  90. waitblit:
  91.     btst    #6,2(a5)
  92.     bne.s    waitblit
  93.  
  94.     move.l    #$09f00000,$40(a5)    ; BLTCON0 e BLTCON1 - copia da A a D
  95.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM e BLTALWM li spieghiamo dopo
  96.  
  97. ; carica i puntatori
  98.     move.l    d0,$50(a5)    ; bltapt
  99.     move.l    d2,$54(a5)    ; bltdpt
  100.  
  101. ; queste 2 istruzioni settano i moduli della sorgente e della destinazione
  102. ; NON CI SONO DIFFERENZE RISPETTO AL CASO NORMALE:
  103. ; il modulo e` calcolato secondo la formula (H-L)*2  (H e` la larghezza del
  104. ; bitplane in words e L e` la larghezza dell'immagine, sempre in words)
  105. ; che abbiamo visto a lezione, (20-160/16)*2=20
  106.  
  107.     move.w    #(20-160/16)*2,$64(a5)    ; bltamod
  108.     move.w    #(20-160/16)*2,$66(a5)    ; bltdmod
  109.  
  110. ; notate anche che poiche` i 2 registri hanno indirizzi consecutivi, si puo`
  111. ; usare una sola istruzione invece che 2 (ricordate che 20=$14):
  112. ; move.l #$00140014,$64(a5)    ; bltamod e bltdmod 
  113.  
  114. ; NOTATE LA DIFFERENZA RISPETTO AL CASO NORMALE: NELLA DIMENSIONE
  115. ; DELLA BLITTATA, L'ALTEZZA DELL'IMMAGINE E` MOLTIPLICATA PER IL NUMERO
  116. ; DI BITPLANES
  117.  
  118.     move.w    #(3*20*64)+160/16,$58(a5)    ; bltsize
  119.                         ; altezza 20 linee e 3 planes
  120.                         ; largo 160 pixel (= 10 words)
  121.                         
  122.     btst    #6,$02(a5)    ; aspetta che il blitter finisca
  123. waitblit2:
  124.     btst    #6,$02(a5)
  125.     bne.s    waitblit2
  126.     rts
  127.  
  128. ;****************************************************************************
  129.  
  130.     SECTION    GRAPHIC,DATA_C
  131.  
  132. COPPERLIST:
  133.     dc.w    $8E,$2c81    ; DiwStrt
  134.     dc.w    $90,$2cc1    ; DiwStop
  135.     dc.w    $92,$38        ; DdfStart
  136.     dc.w    $94,$d0        ; DdfStop
  137.     dc.w    $102,0        ; BplCon1
  138.     dc.w    $104,0        ; BplCon2
  139.  
  140.                 ; QUI C'E` UNA DIFFERENZA RISPETTO
  141.                 ; ALLE IMMAGINI NORMALI!!!!!!
  142.     dc.w    $108,80        ; VALORE MODULO = 2*20*(3-1)= 80
  143.     dc.w    $10a,80        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  144.  
  145.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  146.  
  147. BPLPOINTERS:
  148.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  149.     dc.w $e4,$0000,$e6,$0000
  150.     dc.w $e8,$0000,$ea,$0000
  151.  
  152.     dc.w    $0180,$000    ; color0
  153.     dc.w    $0182,$475    ; color1
  154.     dc.w    $0184,$fff    ; color2
  155.     dc.w    $0186,$ccc    ; color3
  156.     dc.w    $0188,$999    ; color4
  157.     dc.w    $018a,$232    ; color5
  158.     dc.w    $018c,$777    ; color6
  159.     dc.w    $018e,$444    ; color7
  160.  
  161.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  162.  
  163. ;****************************************************************************
  164.  
  165. BITPLANE:
  166.     incbin    "assembler2:sorgenti6/amiga.rawblit"
  167.                     ; qua carichiamo la figura in
  168.                     ; formato RAWBLIT (o interleaved),
  169.                     ; convertita col KEFCON.
  170.     end
  171.  
  172. ;****************************************************************************
  173.  
  174. In questo esempio visualizziamo un'immagine in formato interleaved e ne copiamo
  175. un pezzo da un punto all'altro dello schermo. Si tratta dello stesso programma
  176. dell'esempio lezione9f1.s, ma in formato interleaved.
  177. Vi consigliamo di esaminare questo esempio confrontandolo con lezione9f1.s.
  178. Come abbiamo visto nella lezione, il formato interleaved ci permette di
  179. effettuare la copia mediante una sola blittata. Per questo la routine "Copia"
  180. (che e` la routine che effettua la copia) e` priva di loop, a differenza
  181. dell'omonima routine di lezione9f1.s.
  182. Alcuni valori caricati nei registi del blitter sono diversi:
  183.  
  184. 1) Nel calcolo dell'indirizzo, per ottenere l'offset tra la prima word della
  185.    riga Y e l'inizio del bitplane, bisogna moltiplicare Y per il numero dei
  186.    bitplanes, oltre che per la dimensione della riga; per quanto riguarda la
  187.    X, invece, non ci sono differenze.
  188.  
  189. 2) L'altezza della blittata e` pari all'altezza dell'immagine moltiplicata per
  190.    il numero dei bitplanes; per quanto riguarda la larghezza, invece, non ci
  191.    sono differenze.
  192.  
  193. Anche per quanto riguarda gli altri registri, in particolare per il modulo,
  194. non ci sono differenze.
  195.  
  196.