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

  1.  
  2. ; Lezione10a2.s    BLITTATA, in cui copiamo un disegno invertendo un bitplane
  3. ;        Tasto destro per eseguire la blittata, sinistro per uscire.
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16.  
  17. START:
  18.  
  19.     MOVE.L    #BITPLANE1,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     MOVEQ    #2-1,D1        ; numero di bitplanes
  22. POINTBP:
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.     swap    d0
  27.     ADD.L    #40*256,d0    ; + lunghezza bitplane (qua e' alto 256 linee)
  28.     addq.w    #8,a1
  29.     dbra    d1,POINTBP
  30.  
  31.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  32.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  33.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  34.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  35.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  36.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  37.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  38.  
  39. ; copia l'immagine normalmente
  40.  
  41.     lea    FiguraPlane1,a0        ; copia il primo plane
  42.     lea    BITPLANE1,a1
  43.     bsr.s    copia
  44.  
  45.     lea    FiguraPlane2,a0        ; copia secondo plane
  46.     lea    BITPLANE2,a1
  47.     bsr.s    copia
  48.  
  49. mouse1:
  50.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  51.     bne.s    mouse1
  52.  
  53. ; copia l'immagine invertendo il primo bitplane
  54.  
  55.     lea    FiguraPlane1,a0
  56.     lea    BITPLANE1+14,a1
  57.     bsr.s    CopiaInversa        ; copia il primo plane invertendolo
  58.  
  59.     lea    FiguraPlane2,a0
  60.     lea    BITPLANE2+14,a1
  61.     bsr.s    copia            ; copia secondo plane normalmente
  62.  
  63. mouse2:
  64.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  65.     bne.s    mouse2        ; se no, torna a mouse2:
  66.     rts
  67.  
  68. ;****************************************************************************
  69. ; Questa routine copia la figura sullo schermo.
  70. ; Prende come parametri
  71. ; A0 - indirizzo sorgente
  72. ; A1 - indirizzo destinazione
  73. ;****************************************************************************
  74.  
  75. Copia:
  76.     btst    #6,2(a5) ; dmaconr
  77. WBlit1:
  78.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  79.     bne.s    wblit1
  80.  
  81.     move.l    #$ffffffff,$44(a5)    ; maschere
  82.     move.l    #$09f00000,$40(a5)    ; BLTCON0  e BLTCON1 (usa A+D)
  83.                     ; copia normale
  84.     move.w    #0,$64(a5)        ; BLTAMOD (=0)
  85.     move.w    #34,$66(a5)        ; BLTDMOD (40-6=34)
  86.     move.l    a0,$50(a5)        ; BLTAPT  puntatore sorgente
  87.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  88.     move.w    #(64*25)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  89.                     ; larghezza 3 word
  90.     rts                ; altezza 25 linee
  91.  
  92. ;****************************************************************************
  93. ; Questa routine copia la figura sullo schermo invertendola
  94. ; cioe` trasforma 1 in 0 e 0 in 1.
  95. ;
  96. ; A0 - indirizzo sorgente
  97. ; A1 - indirizzo destinazione
  98. ;****************************************************************************
  99.  
  100. ;                   _   _
  101. ;                __/ \_/ \
  102. ;               /  \_ oo_/
  103. ;              /        \/_
  104. ;         ____/_ ___ ____o
  105. ;     ___/      \\  \\ UU
  106.  
  107. CopiaInversa:
  108.     btst    #6,2(a5) ; dmaconr
  109. WBlit2:
  110.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  111.     bne.s    wblit2
  112.  
  113.     move.l    #$ffffffff,$44(a5)    ; maschere
  114.     move.l    #$090f0000,$40(a5)    ; BLTCON0  e BLTCON1
  115.                     ; copia invertendo i bit, cioe`
  116.                     ; D=NOT A
  117.     move.w    #0,$64(a5)        ; BLTAMOD (=0)
  118.     move.w    #34,$66(a5)        ; BLTDMOD (40-6=34)
  119.     move.l    a0,$50(a5)        ; BLTAPT  puntatore sorgente
  120.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  121.     move.w    #(64*25)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  122.                     ; larghezza 3 word
  123.     rts                ; altezza 25 linee
  124.  
  125. ;****************************************************************************
  126.  
  127.     SECTION    GRAPHIC,DATA_C
  128.  
  129. COPPERLIST:
  130.     dc.w    $8E,$2c81    ; DiwStrt
  131.     dc.w    $90,$2cc1    ; DiwStop
  132.     dc.w    $92,$38        ; DdfStart
  133.     dc.w    $94,$d0        ; DdfStop
  134.     dc.w    $102,0        ; BplCon1
  135.     dc.w    $104,0        ; BplCon2
  136.     dc.w    $108,0        ; Bpl1Mod
  137.     dc.w    $10a,0        ; Bpl2Mod
  138.  
  139.     dc.w    $100,$2200    ; bplcon0 - 1 bitplane lowres
  140.  
  141. BPLPOINTERS:
  142.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  143.     dc.w    $e4,$0000,$e6,$0000
  144.  
  145.     dc.w    $0180,$000    ; color0
  146.     dc.w    $0182,$aaa    ; color1
  147.     dc.w    $0184,$55f    ; color2
  148.     dc.w    $0186,$f80    ; color3
  149.  
  150.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  151.  
  152. ;****************************************************************************
  153.  
  154. FiguraPlane1:
  155.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$c000,$0000,$0003,$c000
  156.     dc.w    $0000,$0003,$c000,$0000,$0003,$c000,$0000,$0003,$c000,$0000
  157.     dc.w    $0003,$c000,$0000,$0003,$c000,$0000,$0003,$c000,$0000,$0003
  158.     dc.w    $c25c,$3bbb,$bb83,$c354,$22aa,$a283,$c2d4,$22bb,$b303,$c254
  159.     dc.w    $22a2,$2283,$c25c,$3ba2,$3a83,$c000,$0000,$0003,$c000,$0000
  160.     dc.w    $0003,$c000,$0000,$0003,$c000,$0000,$0003,$c000,$0000,$0003
  161.     dc.w    $c000,$0000,$0003,$c000,$0000,$0003,$c000,$0000,$0003,$ffff
  162.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff
  163.  
  164. FiguraPlane2:
  165.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  166.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  167.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  168.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  169.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  170.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  171.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
  172.     dc.w    $ffff,$ffff,$ffff,$ffff,$ffff
  173.  
  174. ;****************************************************************************
  175.  
  176.     SECTION    bitplane,BSS_C
  177. BITPLANE1:
  178.     ds.b    40*256
  179. BITPLANE2:
  180.     ds.b    40*256
  181.  
  182.     end
  183.  
  184. ;****************************************************************************
  185.  
  186. In questo esempio vediamo un'applicazione dell'operazione logica di NOT.
  187. Abbiamo un disegno sullo schermo, che potrebbe rappresentare un pulsante.
  188. Supponiamo ora di voler disegnare lo stesso pulsante, ma invertendo i
  189. colori, per simulare la pressione.
  190. Un metodo e` quello di scambiare i colori nella copperlist.
  191. In questo modo, pero` si scambiano i colori in tutto lo schermo e quindi se
  192. vogliamo avere contemporaneamente 2 pulsanti, uno con i colori normali e
  193. l'altro con i colori invertiti, questa tecnica non va bene.
  194. Allora non ci resta che modificare i bitplane che formano l'immagine.
  195. Il pulsante e` disegnato con i colori 2 e 3.
  196. Per scambiare i colori dobbiamo trasformare il colore 2 in 3 e viceversa.
  197. I pixel colorati con il colore 2:
  198. Si ha il colore 2 quando il plane 1 e` settato a 0 e il plane 2 e` settato a 1.
  199. Si ha il colore 3 quando il plane 1 e` settato a 1 e il plane 2 e` settato a 1.
  200. Poiche` entrambi i colori hanno il plane 2 settato a 1, dobbiamo cambiare
  201. solo il plane 1.
  202. Se nel plane 1 invertiamo tutti i bit (cioe` trasformiamo tutti gli 0 in 1
  203. e tutti gli 1 in 0) scambieremo i colori 2 e 3.
  204. L'inversione dei bit e` l'operazione logica NOT che possiamo realizzare con il
  205. blitter mediante un opportuno minterm. Se per leggere usiamo il canale A,
  206. dobbiamo porre l'uscita D a 1 ogni volta che l'ingresso vale 0 e viceversa.
  207. Cio` si ottiene settando a 1 tutti i minterms che corrispondono a combinazioni
  208. con A=0, ovvero (come potete verificare dalla tabella nella lezione) con
  209. LF=$0F.
  210.  
  211.