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

  1.  
  2. ; Lezione10e2.s    Cancellazione e disegno 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. ;    / \| O   O |
  59. ;    \ / \`___'/
  60. ;     #   _| |_
  61. ;    (#) (     )
  62. ;     #\//|* *|\\
  63. ;     #\/(  *  )/
  64. ;     #   =====
  65. ;     #   ( U )
  66. ;     #   || ||
  67. ;    .#---'| |`----.
  68. ;    `#----' `-----'
  69.  
  70.     bsr.s    CancellaOggetto        ; cancella il bob
  71.  
  72.     move    #$0b0,$180(a5)        ; schermo verde scuro quando il
  73.                     ; PROCESSORE ha finito la cancellazione
  74.  
  75.     bsr.s    DisegnaOggetto        ; disegna il bob
  76.  
  77.     move    #$b00,$180(a5)        ; schermo verde scuro quando il
  78.                     ; PROCESSORE ha finito il disegno
  79.  
  80.     btst    #6,2(a5)
  81. WBlit_coppermonitor:
  82.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  83.     bne.s    wblit_coppermonitor
  84.  
  85.     move.w    #$000,$180(a5)
  86.  
  87.     bra.s    mouse
  88.  
  89. fine:
  90.     rts
  91.  
  92.  
  93. ;*****************************************************************************
  94. ; Questa routine cancella il BOB mediante il blitter. La cancellazione
  95. ; viene fatta sul rettangolo che racchiude il bob
  96. ;****************************************************************************
  97.  
  98. CancellaOggetto:
  99.     lea    bitplane,a0    ; destinazione in a0
  100.     move.w    ogg_y(pc),d0    ; coordinata Y
  101.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  102.                 ; 40 bytes
  103.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  104.  
  105.     move.w    ogg_x(pc),d1    ; coordinata X
  106.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  107.                 ; arrotonda ai multipli di 8 per il puntatore
  108.                 ; allo schermo, ovvero agli indirizzi dispari
  109.                 ; (anche ai byte, quindi)
  110.                 ; x es.: un 16 come coordinata diventa il
  111.                 ; byte 2 
  112.     and.w    #$fffe,d1    ; escludo il bit 0 del
  113.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  114.                 ; l'indirizzo giusto di destinazione
  115.  
  116.     moveq    #3-1,d7        ; ripeti per ogni plane
  117. PlaneLoop2:
  118.     btst    #6,2(a5)
  119. WBlit3:
  120.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  121.     bne.s    wblit3
  122.  
  123.     move.w    #$0f0,$180(a5)        ; coppermonitor! schermo verde durante
  124.                     ; la cancellazione.
  125.  
  126.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  127.     move.w    #$0004,$66(a5)        ; BLTDMOD=40-36=4
  128.     move.l    a0,$54(a5)        ; BLTDPT
  129.     move.w    #(64*45)+18,$58(a5)    ; BLTSIZE (via al blitter !)
  130.                     ; cancella il rettangolo che racchiude
  131.                     ; il BOB
  132.  
  133.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  134.     dbra    d7,PlaneLoop2
  135.  
  136.     rts                
  137.  
  138. ;****************************************************************************
  139. ; Questa routine disegna il BOB alle coordinate specificate nelle variabili
  140. ; X_OGG e Y_OGG.
  141. ;****************************************************************************
  142.  
  143. DisegnaOggetto:
  144.     lea    bitplane,a0    ; destinazione in a0
  145.     move.w    ogg_y(pc),d0    ; coordinata Y
  146.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  147.                 ; 40 bytes
  148.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  149.  
  150.     move.w    ogg_x(pc),d0    ; coordinata X
  151.     move.w    d0,d1        ; copia
  152.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  153.                 ; inseriti nello shifter del canale A 
  154.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  155.     lsl.w    #4,d0        ; della word...
  156.     or.w    #$09f0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  157.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  158.                 ; arrotonda ai multipli di 8 per il puntatore
  159.                 ; allo schermo, ovvero agli indirizzi dispari
  160.                 ; (anche ai byte, quindi)
  161.                 ; x es.: un 16 come coordinata diventa il
  162.                 ; byte 2 
  163.     and.w    #$fffe,d1    ; escludo il bit 0 del
  164.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  165.                 ; l'indirizzo giusto di destinazione
  166.  
  167.     lea    figura,a1    ; puntatore sorgente
  168.     moveq    #3-1,d7        ; ripeti per ogni plane
  169. PlaneLoop:
  170.     btst    #6,2(a5)
  171. WBlit2:
  172.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  173.     bne.s    wblit2
  174.  
  175.     move.w    #$f00,$180(a5)
  176.  
  177.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  178.                     ; BLTALWM = $0000 azzera l'ultima word
  179.  
  180.  
  181.     move.w    d0,$40(a5)        ; BLTCON0 (usa A+D)
  182.     move.w    #$0000,$42(a5)        ; BLTCON1 (nessun modo speciale)
  183.     move.l    #$00000004,$64(a5)    ; BLTAMOD=0
  184.                     ; BLTDMOD=40-36=4 come al solito
  185.     move.l    a1,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  186.     move.l    a0,$54(a5)        ; BLTDPT  (linee di schermo)
  187.     move.w    #(64*45)+18,$58(a5)    ; BLTSIZE (via al blitter !)
  188.  
  189.     lea    2*18*45(a1),a1        ; punta al prossimo plane sorgente
  190.                     ; ogni plane e` largo 18 words e alto
  191.                     ; 45 righe
  192.  
  193.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  194.     dbra    d7,PlaneLoop
  195.  
  196.     rts
  197.  
  198. OGG_Y:        dc.w    0    ; qui viene memorizzata la Y dell'oggetto
  199. OGG_X:        dc.w    0    ; qui viene memorizzata la X dell'oggetto
  200. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  201. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  202.  
  203. ;****************************************************************************
  204.  
  205.     SECTION    GRAPHIC,DATA_C
  206.  
  207. COPPERLIST:
  208.     dc.w    $8E,$2c81    ; DiwStrt
  209.     dc.w    $90,$2cc1    ; DiwStop
  210.     dc.w    $92,$38        ; DdfStart
  211.     dc.w    $94,$d0        ; DdfStop
  212.     dc.w    $102,0        ; BplCon1
  213.     dc.w    $104,0        ; BplCon2
  214.     dc.w    $108,0        ; VALORE MODULO 0
  215.     dc.w    $10a,0        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  216.  
  217.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  218.  
  219. BPLPOINTERS:
  220.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  221.     dc.w $e4,$0000,$e6,$0000
  222.     dc.w $e8,$0000,$ea,$0000
  223.  
  224.     dc.w    $0180,$000    ; color0
  225.     dc.w    $0182,$475    ; color1
  226.     dc.w    $0184,$fff    ; color2
  227.     dc.w    $0186,$ccc    ; color3
  228.     dc.w    $0188,$999    ; color4
  229.     dc.w    $018a,$232    ; color5
  230.     dc.w    $018c,$777    ; color6
  231.     dc.w    $018e,$444    ; color7
  232.  
  233.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  234.  
  235. ;****************************************************************************
  236.  
  237. ; Questi sono i dati che compongono la figura del bob.
  238. ; Il bob e` in formato normale, largo 288 pixel (18 words)
  239. ; alto 45 righe e formato da 3 bitplanes
  240.  
  241. Figura:
  242.     incbin    copmon.raw
  243.  
  244. ;****************************************************************************
  245.  
  246.     section    gnippi,bss_C
  247.  
  248. BITPLANE:
  249.         ds.b    40*256    ; 3 bitplanes
  250.         ds.b    40*256
  251.         ds.b    40*256
  252.  
  253.     end
  254.  
  255. ;****************************************************************************
  256.  
  257. In questo esempio spostiamo un rettangolo sullo schermo, ovvero lo cancelliamo
  258. e lo ridisegnamo. Abbiamo utilizzato una serie di colori diversi per
  259. evidenziare la velocita` delle routine e il lavoro svolto dal blitter e dal
  260. processore. Quando inizia la routine di cancellazione, lo schermo diventa
  261. di colore rosso chiaro. In questo momento, sia il blitter che il processore
  262. sono impegnati nell'operazione di cancellazione. Quando il processore termina
  263. la routine di cancellazione, il blitter non ha ancora finito di eseguire il
  264. suo compito. Il processore pero` e` gia` libero per altri compiti. Questa
  265. situazione e` evidenziata colorando lo schermo di rosso piu` scuro
  266. all'uscita della routine "CancellaOggetto". A questo punto il processore
  267. entra nella routine "DisegnaOggetto". Poiche` il blitter e` ancora impegnato
  268. prima che l'operazione di disegno abbia inizio e` necessario attendere il
  269. blitter. Quando finalmente il blitter si libera lo schermo viene colorato
  270. di verde chiaro. All'uscita della routine "DisegnaOggetto" lo schermo viene
  271. colorato di verde scuro in attesa che il blitter finisca di disegnare.
  272. Quando cio` accade, lo schermo ridiventa nero.
  273.  
  274. Notate inoltre che la cancellazione e la copia richiedono (circa) la stessa
  275. velocita`.
  276.  
  277.