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

  1.  
  2. ; Lezione10e3.s    operazione a 3 canali con copper monitor
  3. ;        Tasto 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    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     MOVEQ    #3-1,D1        ; numero di bitplanes (qua sono 3)
  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 DI UNA PLANE !!!!!
  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.     move.w    #0,ogg_x
  40.     move.w    #0,ogg_y
  41.  
  42. mouse:
  43.  
  44.     addq.w    #1,ogg_y
  45.     cmp.w    #130,ogg_y
  46.     beq.s    fine
  47.  
  48.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  49.     MOVE.L    #$0d000,d2    ; linea da aspettare = $D0
  50. Waity1:
  51.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  52.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  53.     CMPI.L    D2,D0        ; aspetta la linea $D0
  54.     BNE.S    Waity1
  55.  
  56. ;              __
  57. ;             /  \
  58. ;            / ..|\
  59. ;           (_\  |_)
  60. ;           /  \@'
  61. ;          /     \
  62. ;     _   /  `   |
  63. ;     \\/  \  | _\
  64. ;      \   /_ || \\_
  65. ;       \____)|_) \_)
  66.  
  67.     bsr.s    CancellaOggetto        ; cancella il bob
  68.  
  69.     move    #$0b0,$180(a5)        ; schermo verde scuro quando il
  70.                     ; PROCESSORE ha finito la cancellazione
  71.  
  72.     bsr.s    DisegnaOggetto        ; disegna il bob
  73.  
  74.     move    #$b00,$180(a5)        ; schermo verde scuro quando il
  75.                     ; PROCESSORE ha finito il disegno
  76.  
  77.     btst    #6,2(a5)
  78. WBlit_coppermonitor:
  79.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  80.     bne.s    wblit_coppermonitor
  81.  
  82.     move.w    #$000,$180(a5)
  83.  
  84.     bra.s    mouse
  85.  
  86. fine:
  87.     rts
  88.  
  89.  
  90. ;*****************************************************************************
  91. ; Questa routine cancella il BOB mediante il blitter. La cancellazione
  92. ; viene fatta sul rettangolo che racchiude il bob
  93. ;****************************************************************************
  94.  
  95. CancellaOggetto:
  96.     lea    bitplane,a0    ; destinazione in a0
  97.     move.w    ogg_y(pc),d0    ; coordinata Y
  98.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  99.                 ; 40 bytes
  100.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  101.  
  102.     move.w    ogg_x(pc),d1    ; coordinata X
  103.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  104.                 ; arrotonda ai multipli di 8 per il puntatore
  105.                 ; allo schermo, ovvero agli indirizzi dispari
  106.                 ; (anche ai byte, quindi)
  107.                 ; x es.: un 16 come coordinata diventa il
  108.                 ; byte 2 
  109.     and.w    #$fffe,d1    ; escludo il bit 0 del
  110.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  111.                 ; l'indirizzo giusto di destinazione
  112.  
  113.     moveq    #3-1,d7        ; ripeti per ogni plane
  114. PlaneLoop2:
  115.     btst    #6,2(a5)
  116. WBlit3:
  117.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  118.     bne.s    wblit3
  119.  
  120.     move.w    #$0f0,$180(a5)        ; coppermonitor! schermo verde durante
  121.                     ; la cancellazione.
  122.  
  123.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  124.     move.w    #$0004,$66(a5)        ; BLTDMOD=40-36=4
  125.     move.l    a0,$54(a5)        ; BLTDPT
  126.     move.w    #(64*45)+18,$58(a5)    ; BLTSIZE (via al blitter !)
  127.                     ; cancella il rettangolo che racchiude
  128.                     ; il BOB
  129.  
  130.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  131.     dbra    d7,PlaneLoop2
  132.  
  133.     rts                
  134.  
  135. ;****************************************************************************
  136. ; Questa routine disegna il BOB alle coordinate specificate nelle variabili
  137. ; X_OGG e Y_OGG.
  138. ;****************************************************************************
  139.  
  140. DisegnaOggetto:
  141.     lea    bitplane,a0    ; destinazione in a0
  142.     move.w    ogg_y(pc),d0    ; coordinata Y
  143.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  144.                 ; 40 bytes
  145.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  146.  
  147.     move.w    ogg_x(pc),d0    ; coordinata X
  148.     move.w    d0,d1        ; copia
  149.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  150.                 ; inseriti nello shifter del canale A 
  151.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  152.     lsl.w    #4,d0        ; della word...
  153.     or.w    #$0dfc,d0    ; ...giusti per inserirsi nel registro BLTCON0
  154.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  155.                 ; arrotonda ai multipli di 8 per il puntatore
  156.                 ; allo schermo, ovvero agli indirizzi dispari
  157.                 ; (anche ai byte, quindi)
  158.                 ; x es.: un 16 come coordinata diventa il
  159.                 ; byte 2 
  160.     and.w    #$fffe,d1    ; escludo il bit 0 del
  161.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  162.                 ; l'indirizzo giusto di destinazione
  163.  
  164.     lea    figura,a1    ; puntatore sorgente
  165.     moveq    #3-1,d7        ; ripeti per ogni plane
  166. PlaneLoop:
  167.     btst    #6,2(a5)
  168. WBlit2:
  169.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  170.     bne.s    wblit2
  171.  
  172.     move.w    #$f00,$180(a5)
  173.  
  174.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  175.                     ; BLTALWM = $0000 azzera l'ultima word
  176.  
  177.  
  178.     move.w    d0,$40(a5)        ; BLTCON0 (usa A+D)
  179.     move.w    #$0000,$42(a5)        ; BLTCON1 (nessun modo speciale)
  180.     move.l    #$00000004,$64(a5)    ; BLTAMOD=$fffe=-2 torna indietro
  181.                     ; all'inizio della riga.
  182.                     ; BLTDMOD=40-36=4 come al solito
  183.     move    #0,$62(a5)        ; BLTBMOD
  184.  
  185.     move.l    #plane_OR,$4c(a5)    ; BLTBPT
  186.     move.l    a1,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  187.     move.l    a0,$54(a5)        ; BLTDPT  (linee di schermo)
  188.     move.w    #(64*45)+18,$58(a5)    ; BLTSIZE (via al blitter !)
  189.  
  190.     lea    2*18*45(a1),a1        ; punta al prossimo plane sorgente
  191.                     ; ogni plane e` largo 18 words e alto
  192.                     ; 45 righe
  193.  
  194.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  195.     dbra    d7,PlaneLoop
  196.  
  197.     rts
  198.  
  199. OGG_Y:        dc.w    0    ; qui viene memorizzata la Y dell'oggetto
  200. OGG_X:        dc.w    0    ; qui viene memorizzata la X dell'oggetto
  201. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  202. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  203.  
  204. ;****************************************************************************
  205.  
  206.     SECTION    GRAPHIC,DATA_C
  207.  
  208. COPPERLIST:
  209.     dc.w    $8E,$2c81    ; DiwStrt
  210.     dc.w    $90,$2cc1    ; DiwStop
  211.     dc.w    $92,$38        ; DdfStart
  212.     dc.w    $94,$d0        ; DdfStop
  213.     dc.w    $102,0        ; BplCon1
  214.     dc.w    $104,0        ; BplCon2
  215.     dc.w    $108,0        ; VALORE MODULO 0
  216.     dc.w    $10a,0        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  217.  
  218.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  219.  
  220. BPLPOINTERS:
  221.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  222.     dc.w $e4,$0000,$e6,$0000
  223.     dc.w $e8,$0000,$ea,$0000
  224.  
  225.     dc.w    $0180,$000    ; color0
  226.     dc.w    $0182,$475    ; color1
  227.     dc.w    $0184,$fff    ; color2
  228.     dc.w    $0186,$ccc    ; color3
  229.     dc.w    $0188,$999    ; color4
  230.     dc.w    $018a,$232    ; color5
  231.     dc.w    $018c,$777    ; color6
  232.     dc.w    $018e,$444    ; color7
  233.  
  234.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  235.  
  236. ;****************************************************************************
  237.  
  238. ; Questi sono i dati che compongono la figura del bob.
  239. ; Il bob e` in formato normale, largo 288 pixel (18 words)
  240. ; alto 45 righe e formato da 3 bitplanes
  241.  
  242. Figura:
  243.     incbin    copmon.raw
  244.  
  245. ;****************************************************************************
  246.  
  247. ; questo e` il plane fittizio per l'or. Ha dimensioni pari al bob
  248. ; ed e` totalmente azzerato.
  249.  
  250. plane_OR:
  251.     dcb.b    36*45,0
  252.  
  253.     section    gnippi,bss_C
  254.  
  255. BITPLANE:
  256.         ds.b    40*256    ; 3 bitplanes
  257.         ds.b    40*256
  258.         ds.b    40*256
  259.  
  260.     end
  261.  
  262. ;****************************************************************************
  263.  
  264. In questo esempio invece di fare una copia da A a D, facciamo un OR tra i
  265. canali A e B e scriviamo il risultato in D. In pratica otteniamo sempre
  266. la stessa cosa, perche` il canale B legge un plane formato da tutti 0,
  267. ma questo esempio serve per mostrare come una blittata a 3 canali sia
  268. piu` lenta che una a 2
  269.  
  270.