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

  1.  
  2. ; Lezione10e4.s    Copia da B a D 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.     bsr.s    CancellaOggetto        ; cancella il bob
  65.  
  66.     move    #$0b0,$180(a5)        ; schermo verde scuro quando il
  67.                     ; PROCESSORE ha finito la cancellazione
  68.  
  69.     bsr.s    DisegnaOggetto        ; disegna il bob
  70.  
  71.     move    #$b00,$180(a5)        ; schermo verde scuro quando il
  72.                     ; PROCESSORE ha finito il disegno
  73.  
  74.     btst    #6,2(a5)
  75. WBlit_coppermonitor:
  76.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  77.     bne.s    wblit_coppermonitor
  78.  
  79.     move.w    #$000,$180(a5)
  80.  
  81.     bra.s    mouse
  82.  
  83. fine:
  84.     rts
  85.  
  86.  
  87. ;*****************************************************************************
  88. ; Questa routine cancella il BOB mediante il blitter. La cancellazione
  89. ; viene fatta sul rettangolo che racchiude il bob
  90. ;****************************************************************************
  91.  
  92. CancellaOggetto:
  93.     lea    bitplane,a0    ; destinazione in a0
  94.     move.w    ogg_y(pc),d0    ; coordinata Y
  95.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  96.                 ; 40 bytes
  97.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  98.  
  99.     move.w    ogg_x(pc),d1    ; coordinata X
  100.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  101.                 ; arrotonda ai multipli di 8 per il puntatore
  102.                 ; allo schermo, ovvero agli indirizzi dispari
  103.                 ; (anche ai byte, quindi)
  104.                 ; x es.: un 16 come coordinata diventa il
  105.                 ; byte 2 
  106.     and.w    #$fffe,d1    ; escludo il bit 0 del
  107.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  108.                 ; l'indirizzo giusto di destinazione
  109.  
  110.     moveq    #3-1,d7        ; ripeti per ogni plane
  111. PlaneLoop2:
  112.     btst    #6,2(a5)
  113. WBlit3:
  114.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  115.     bne.s    wblit3
  116.  
  117.     move.w    #$0f0,$180(a5)        ; coppermonitor! schermo verde durante
  118.                     ; la cancellazione.
  119.  
  120.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  121.     move.w    #$0004,$66(a5)        ; BLTDMOD=40-36=4
  122.     move.l    a0,$54(a5)        ; BLTDPT
  123.     move.w    #(64*45)+18,$58(a5)    ; BLTSIZE (via al blitter !)
  124.                     ; cancella il rettangolo che racchiude
  125.                     ; il BOB
  126.  
  127.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  128.     dbra    d7,PlaneLoop2
  129.  
  130.     rts                
  131.  
  132. ;****************************************************************************
  133. ; Questa routine disegna il BOB alle coordinate specificate nelle variabili
  134. ; X_OGG e Y_OGG.
  135. ;****************************************************************************
  136.  
  137. DisegnaOggetto:
  138.     lea    bitplane,a0    ; destinazione in a0
  139.     move.w    ogg_y(pc),d0    ; coordinata Y
  140.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  141.                 ; 40 bytes
  142.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  143.  
  144.     move.w    ogg_x(pc),d0    ; coordinata X
  145.     move.w    d0,d1        ; copia
  146.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  147.                 ; arrotonda ai multipli di 8 per il puntatore
  148.                 ; allo schermo, ovvero agli indirizzi dispari
  149.                 ; (anche ai byte, quindi)
  150.                 ; x es.: un 16 come coordinata diventa il
  151.                 ; byte 2 
  152.     and.w    #$fffe,d1    ; escludo il bit 0 del
  153.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  154.                 ; l'indirizzo giusto di destinazione
  155.  
  156.     lea    figura,a1    ; puntatore sorgente
  157.     moveq    #3-1,d7        ; ripeti per ogni plane
  158. PlaneLoop:
  159.     btst    #6,2(a5)
  160. WBlit2:
  161.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  162.     bne.s    wblit2
  163.  
  164.     move.w    #$f00,$180(a5)
  165.  
  166.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  167.                     ; BLTALWM = $0000 azzera l'ultima word
  168.  
  169.  
  170.     move.w    #$05CC,$40(a5)        ; BLTCON0 (usa B+D)
  171.     move.w    #$0000,$42(a5)        ; BLTCON1 (nessun modo speciale)
  172.     move.w    #$0000,$62(a5)        ; BLTBMOD=0
  173.     move.w    #$0004,$66(a5)        ; BLTDMOD=40-36=4 come al solito
  174.  
  175.     move.l    a1,$4c(a5)        ; BLTBPT  (fisso alla figura sorgente)
  176.     move.l    a0,$54(a5)        ; BLTDPT  (linee di schermo)
  177.     move.w    #(64*45)+18,$58(a5)    ; BLTSIZE (via al blitter !)
  178.  
  179.     lea    2*18*45(a1),a1        ; punta al prossimo plane sorgente
  180.                     ; ogni plane e` largo 18 words e alto
  181.                     ; 45 righe
  182.  
  183.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  184.     dbra    d7,PlaneLoop
  185.  
  186.     rts
  187.  
  188. OGG_Y:        dc.w    0    ; qui viene memorizzata la Y dell'oggetto
  189. OGG_X:        dc.w    0    ; qui viene memorizzata la X dell'oggetto
  190. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  191. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  192.  
  193. ;****************************************************************************
  194.  
  195.     SECTION    GRAPHIC,DATA_C
  196.  
  197. COPPERLIST:
  198.     dc.w    $8E,$2c81    ; DiwStrt
  199.     dc.w    $90,$2cc1    ; DiwStop
  200.     dc.w    $92,$38        ; DdfStart
  201.     dc.w    $94,$d0        ; DdfStop
  202.     dc.w    $102,0        ; BplCon1
  203.     dc.w    $104,0        ; BplCon2
  204.     dc.w    $108,0        ; VALORE MODULO 0
  205.     dc.w    $10a,0        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  206.  
  207.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  208.  
  209. BPLPOINTERS:
  210.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  211.     dc.w $e4,$0000,$e6,$0000
  212.     dc.w $e8,$0000,$ea,$0000
  213.  
  214.     dc.w    $0180,$000    ; color0
  215.     dc.w    $0182,$475    ; color1
  216.     dc.w    $0184,$fff    ; color2
  217.     dc.w    $0186,$ccc    ; color3
  218.     dc.w    $0188,$999    ; color4
  219.     dc.w    $018a,$232    ; color5
  220.     dc.w    $018c,$777    ; color6
  221.     dc.w    $018e,$444    ; color7
  222.  
  223.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  224.  
  225. ;****************************************************************************
  226.  
  227. ; Questi sono i dati che compongono la figura del bob.
  228. ; Il bob e` in formato normale, largo 288 pixel (18 words)
  229. ; alto 45 righe e formato da 3 bitplanes
  230.  
  231. Figura:
  232.     incbin    copmon.raw
  233.  
  234. ;****************************************************************************
  235.  
  236.     section    gnippi,bss_C
  237.  
  238. BITPLANE:
  239.         ds.b    40*256    ; 3 bitplanes
  240.         ds.b    40*256
  241.         ds.b    40*256
  242.  
  243.     end
  244.  
  245. ;****************************************************************************
  246.  
  247. In questo programma eseguiamo il disegno mediante una copia da B a D.
  248. In questo caso, a differenza del caso in cui la copia era tra A e D, la
  249. routine di disegno e` piu` lenta di quella di cancellazione.
  250.  
  251.