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

  1.  
  2. ; Lezione9e3.s    Spostamento orizzontale completo con shift + cambiamento di
  3. ;        posizione della destinazione (scatti di 2 bytes = 16 pixel)
  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. ;    Puntiamo la PIC "vuota"
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  27.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  28.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  29.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  30.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  31.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  32.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  33.  
  34.     moveq    #0,d1            ; Coordinata orizzontale a 0
  35.     move.w    #(320-32)-1,d7        ; Muove per 320 pixel MENO la larghezza
  36.                     ; reale del BOB, per fare in modo che
  37.                     ; il suo primo pixel a sinistra si
  38.                     ; fermi quando quello a destra arriva
  39.                     ; alla fine dello schermo.
  40. Loop:
  41.     cmp.b    #$ff,$6(a5)    ; VHPOSR - aspetta la linea $ff
  42.     bne.s    loop
  43. Aspetta:
  44.     cmp.b    #$ff,$6(a5)    ; ancora linea $ff?
  45.     beq.s    Aspetta
  46.  
  47. ;      \\ ,\\  /, ,,//
  48. ;       \\\\\X///////
  49. ;        \¬¯___  __/
  50. ;       _;=(  ©)(®_)
  51. ;      (, _ ¯T¯  \¬\
  52. ;       T /\ '   ,)/
  53. ;       |('/\_____/__
  54. ;       l_¯         ¬\
  55. ;        _T¯¯¯T¯¯¯¯¯¯¯
  56. ;     /¯¯¬l___¦¯¯¬\
  57. ;    /___,  °  ,___\
  58. ;    ¯/¯/¯  °__T\¬\¯
  59. ;    (  \___/ '\ \ \
  60. ;     \_________) \ \
  61. ;        l_____ \  \ \
  62. ;        / ___¬T¯   \ \
  63. ;       / _/ \ l_    ) \
  64. ;       \ ¬\  \  \  ())))
  65. ;      __\__\  \  )  ¯¯¯
  66. ;     (______)  \/\ xCz
  67. ;               / /
  68. ;              (_/
  69.  
  70.     lea    bitplane,a0    ; destinazione in a0
  71.     move.w    d1,d0
  72.     and.w    #$000f,d0    ; Si selezionano i primi 4 bit perche' vanno
  73.                 ; inseriti nello shifter del canale A 
  74.     lsl.w    #8,d0        ; I 4 bit vengono spostati sul nibble alto
  75.     lsl.w    #4,d0        ; della word... (8+4= shift di 12 bit)
  76.     or.w    #$09f0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  77.                 ; Qua mettiamo $f0 nei minterm per copia da
  78.                 ; sorgente A a destinazione D e abilitiamo
  79.                 ; ovviamente i canali A+D con $0900 (bit 8
  80.                 ; per D e 11 per A). Ossia $09f0 + shift.
  81.     move.w    d1,d2
  82.     lsr.w    #3,d2        ; (equivalente ad una divisione per 8)
  83.                 ; arrotonda ai multipli di 8 per il puntatore
  84.                 ; allo schermo, ovvero agli indirizzi dispari
  85.                 ; (anche ai byte, quindi)
  86.                 ; x es.: un 16 come coordinata diventa il
  87.                 ; byte 2
  88.     and.w    #$fffe,d2    ; escludo il bit 0
  89.     add.w    d2,a0        ; Somma all'indirizzo del bitplane, trovando
  90.                 ; l'indirizzo giusto di destinazione
  91.     addq.w    #1,d1        ; Aggiungi 1 alla coordinata orizzontale
  92.  
  93.     btst    #6,2(a5) ; dmaconr
  94. WBlit1:
  95.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  96.     bne.s    wblit1
  97.  
  98. ; ora, come spiegato nella teoria, cogliamo l' occasione per apportare una
  99. ; modifica: scriviamo i valori in registri ADIACENTI con un singolo 'move.l'
  100.  
  101.     move.l    #$01000000,$40(a5)    ; BLTCON0 + BLTCON1
  102.     move.w    #$0000,$66(a5)
  103.     move.l    #bitplane,$54(a5)
  104.     move.w    #(64*256)+20,$58(a5)    ; provate a togliere questa linea
  105.                     ; e lo schermo non verra' pulito,
  106.                     ; dunque il pesce lascera' la "scia"
  107.  
  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)    ; BLTAFWM e BLTALWM li spieghiamo dopo
  114.     move.w    d0,$40(a5)        ; BLTCON0 (usa A+D)
  115.     move.w    #$0000,$42(a5)        ; BLTCON1 (nessun modo speciale)
  116.     move.l    #$00000024,$64(a5)    ; BLTAMOD (=0) + BLTDMOD (=40-4=36=$24)
  117.     move.l    #figura,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  118.     move.l    a0,$54(a5)        ; BLTDPT  (linee di schermo)
  119.     move.w    #(64*6)+2,$58(a5)    ; BLTSIZE (via al blitter !)
  120.                     ; blittiamo 2 word, la seconda delle
  121.                     ; quali e' nulla per permettere
  122.                     ; lo shift
  123.  
  124.     btst    #6,$bfe001        ; mouse premuto?
  125.     beq.s    quit
  126.  
  127.     dbra    d7,loop
  128.  
  129. Quit:
  130.     rts
  131.  
  132. ;****************************************************************************
  133.  
  134.     SECTION    GRAPHIC,DATA_C
  135.  
  136. COPPERLIST:
  137.     dc.w    $8E,$2c81    ; DiwStrt
  138.     dc.w    $90,$2cc1    ; DiwStop
  139.     dc.w    $92,$38        ; DdfStart
  140.     dc.w    $94,$d0        ; DdfStop
  141.     dc.w    $102,0        ; BplCon1
  142.     dc.w    $104,0        ; BplCon2
  143.     dc.w    $108,0        ; Bpl1Mod
  144.     dc.w    $10a,0        ; Bpl2Mod
  145.  
  146.     dc.w    $100,$1200    ; BplCon0 - 1 bitplane LowRes
  147.  
  148. BPLPOINTERS:
  149.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  150.  
  151.     dc.w    $0180,$000    ; color0
  152.     dc.w    $0182,$eee    ; color1
  153.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  154.  
  155. ;****************************************************************************
  156.  
  157. ; Il pesciolino:
  158.  
  159. Figura:
  160.     dc.w    %1000001111100000,0
  161.     dc.w    %1100111111111000,0
  162.     dc.w    %1111111111101100,0
  163.     dc.w    %1111111111111110,0
  164.     dc.w    %1100111111111000,0
  165.     dc.w    %1000001111100000,0
  166.  
  167. ;****************************************************************************
  168.  
  169.     SECTION    PLANEVUOTO,BSS_C    
  170.  
  171. BITPLANE:
  172.     ds.b    40*256        ; bitplane azzerato lowres
  173.  
  174.     end
  175.  
  176. ;****************************************************************************
  177.  
  178. In questo esempio spostiamo la nostra figura di un numero arbitrario di pixel.
  179. La coordinata orizzontale della figura e` memorizzata in D1. Tale coordinata
  180. viene divisa per 8 in modo da calcolare l'indirizzo di memoria della word
  181. a cui essa appartiene. I 4 bit meno significativi della coordianta, invece,
  182. sono il valore di shift, come spiegato nella lezione.
  183.  
  184.