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

  1.  
  2. ; Lezione9i1.s    Di nuovo il pesce! Ma ancora piu` furbo!
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup1.s"    ; Salva Copperlist Etc.
  10. *****************************************************************************
  11.  
  12.         ;5432109876543210
  13. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  14.  
  15.  
  16. START:
  17. ;    Puntiamo la PIC "vuota"
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  26.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  27.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  28.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  29.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  30.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  31.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  32.  
  33.     moveq    #0,d1            ; coordinata orizzontale a 0
  34.     move.w    #(320-32)-1,d7        ; muove per 320 pixel MENO la larghezza
  35.                     ; reale del BOB, per fare in modo che
  36.                     ; il suo primo pixel a sinistra si
  37.                     ; fermi quando quello a destra arriva
  38.                     ; alla fine dello schermo.
  39. Loop:
  40.     cmp.b    #$ff,$6(a5)    ; VHPOSR - aspetta la linea $ff
  41.     bne.s    loop
  42. Aspetta:
  43.     cmp.b    #$ff,$6(a5)    ; ancora linea $ff?
  44.     beq.s    Aspetta
  45.  
  46. ;     _____________
  47. ;     \____ _ ____/
  48. ;    (¯T¯¯(·X.)¯¯T¯)
  49. ;     ¯T _ ¯u¯ _ T¯
  50. ;     _| `-^---' |_
  51. ;    |¬|   ¯¯¯   |¬|
  52. ;    | l_________| |
  53. ;    |__l `-o-' |__|
  54. ;    (__)       (__)
  55. ;      T_________T
  56. ;       T¯  _  ¯T xCz
  57. ;     __l___l___l__
  58. ;    (______X______)
  59.  
  60.     lea    bitplane,a0    ; destinazione in a0
  61.     move.w    d1,d0
  62.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  63.                 ; inseriti nello shifter del canale A 
  64.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  65.     lsl.w    #4,d0        ; della word...
  66.     or.w    #$09f0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  67.     move.w    d1,d2
  68.     lsr.w    #3,d2        ; (equivalente ad una divisione per 8)
  69.                 ; arrotonda ai multipli di 8 per il puntatore
  70.                 ; allo schermo, ovvero agli indirizzi dispari
  71.                 ; (anche ai byte, quindi)
  72.                 ; x es.: un 16 come coordinata diventa il
  73.                 ; byte 2 
  74.     and.w    #$fffe,d2    ; escludo il bit 0
  75.     add.w    d2,a0        ; somma all'indirizzo del bitplane, trovando
  76.                 ; l'indirizzo giusto di destinazione
  77.     addq.w    #1,d1        ; aggiungi 1 alla coordinata orizzontale
  78.  
  79.     btst    #6,2(a5) ; dmaconr
  80. WBlit1:
  81.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  82.     bne.s    wblit1
  83.  
  84.  
  85. ; Ora, come spiegato nella teoria, cogliamo l' occasione di scrivere i valori
  86. ; in registri ADIACENTI con un singolo 'move.l'
  87.  
  88.     move.l    #$01000000,$40(a5)    ; BLTCON0 + BLTCON1
  89.     move.w    #$0000,$66(a5)        ; BLTDMOD
  90.     move.l    #bitplane,$54(a5)    ; BLTDPT
  91.     move.w    #(64*256)+20,$58(a5)    ; provate a togliere questa linea
  92.                     ; e lo schermo non verra' pulito,
  93.                     ; dunque il pesce lascera' la "scia"
  94.  
  95.     btst    #6,2(a5) ; dmaconr
  96. WBlit2:
  97.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  98.     bne.s    wblit2
  99.  
  100.     move.l    #$ffff0000,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  101.                     ; BLTALWM = $0000 azzera l'ultima word
  102.  
  103.  
  104.     move.w    d0,$40(a5)        ; BLTCON0 (usa A+D)
  105.     move.w    #$0000,$42(a5)        ; BLTCON1 (nessun modo speciale)
  106.     move.l    #$fffe0024,$64(a5)    ; BLTAMOD=$fffe=-2 torna indietro
  107.                     ; all'inizio della riga.
  108.                     ; BLTDMOD=40-4=36=$24 come al solito
  109.     move.l    #figura,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  110.     move.l    a0,$54(a5)        ; BLTDPT  (linee di schermo)
  111.     move.w    #(64*6)+2,$58(a5)    ; BLTSIZE (via al blitter !)
  112.                     ; blittiamo 2 word, la seconda delle
  113.                     ; quali viene azzerata dalla maschera
  114.                     ; per permettere lo shift
  115.  
  116.     btst    #6,$bfe001        ; mouse premuto?
  117.     beq.s    quit
  118.  
  119.     dbra    d7,loop
  120.  
  121. Quit:
  122.     rts
  123.  
  124. ;****************************************************************************
  125.  
  126.     SECTION    GRAPHIC,DATA_C
  127.  
  128. COPPERLIST:
  129.     dc.w    $8E,$2c81    ; DiwStrt
  130.     dc.w    $90,$2cc1    ; DiwStop
  131.     dc.w    $92,$38        ; DdfStart
  132.     dc.w    $94,$d0        ; DdfStop
  133.     dc.w    $102,0        ; BplCon1
  134.     dc.w    $104,0        ; BplCon2
  135.     dc.w    $108,0        ; Bpl1Mod
  136.     dc.w    $10a,0        ; Bpl2Mod
  137.  
  138.     dc.w    $100,$1200    ; BplCon0 - 1 bitplane LowRes
  139.  
  140. BPLPOINTERS:
  141.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  142.  
  143.     dc.w    $0180,$000    ; color0
  144.     dc.w    $0182,$eee    ; color1
  145.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  146.  
  147. ;****************************************************************************
  148.  
  149. ; Il pesciolino: stavolta memorizziamo solo le word che ci interessano
  150. ; la word nulla viene creata dalla maschera.
  151.  
  152. Figura:
  153.     dc.w    %1000001111100000
  154.     dc.w    %1100111111111000
  155.     dc.w    %1111111111101100
  156.     dc.w    %1111111111111110
  157.     dc.w    %1100111111111000
  158.     dc.w    %1000001111100000
  159.  
  160. ;****************************************************************************
  161.  
  162.     SECTION    PLANEVUOTO,BSS_C    
  163.  
  164. BITPLANE:
  165.     ds.b    40*256        ; bitplane azzerato lowres
  166.  
  167.     end
  168.  
  169. ;****************************************************************************
  170.  
  171. Questo esempio e` una modifica dell'esempio lezione9e3.s che, come abbiamo
  172. spiegato nella lezione, ci consente di evitare lo spreco di memoria della
  173. colonna di word in piu`. Infatti la nostra figura e` larga appena una
  174. word. Ciononostante eseguiamo delle blittate larghe 2 words. Per azzerare
  175. la seconda word (cioe` l'ultima della riga) settiamo BLTALWM al valore $0000.
  176. Abbiamo poi il problema che il puntatore della sorgente (canale A) si
  177. sposta di una word di troppo. Per farlo tornare indietro settiamo il modulo
  178. della sorgente (BLTAMOD) al valore $fffe=-2.
  179.  
  180.