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

  1.  
  2. ; Lezione10e6.s    Versione ottimizzata di lezione10c4.s (Effetto riflettore)
  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    #BITPLANE1,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     MOVEQ    #5-1,D1        ; numero di bitplanes
  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 bitplane (qua e' alto 256 linee)
  28.     addq.w    #8,a1
  29.     dbra    d1,POINTBP
  30.  
  31.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  32.  
  33. ; qui il blitter e` sicuramente fermo perche` ha provveduto la startup
  34. ; quindi possiamo tranquillamente settare i registri.
  35. ; I seguenti registri sono usati sempre con gli stessi valori, quindi
  36. ; li inizializziamo una volta per tutte all'inizio del programma.
  37.  
  38.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM/BLTALWM
  39.     move.w    #$0000,$42(a5)        ; BLTCON1 modo ascendente
  40.     move.l    #$00200000,$62(a5)    ; BLTBMOD (40-8=32=$20)
  41.                     ; BLTAMOD (=0)
  42.  
  43.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  44.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  45.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  46.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  47.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  48.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  49.  
  50. mouse2:
  51.  
  52. Loop:
  53.     cmp.b    #$ff,$6(a5)    ; VHPOSR - aspetta la linea $ff
  54.     bne.s    loop
  55. Aspetta:
  56.     cmp.b    #$ff,$6(a5)    ; ancora linea $ff?
  57.     beq.s    Aspetta
  58.  
  59.     bsr.s    ClearScreen    ; pulisci schermo
  60.     bsr.w    SpostaMaschera    ; sposta posizione riflettore
  61.     bsr.s    Riflettore    ; routine effetto
  62.  
  63.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  64.     bne.s    mouse2        ; se no, torna a mouse2:
  65.  
  66.     rts
  67.  
  68. ;***************************************************************************
  69. ; Questa routine cancella la porzione di schermo interessata dalla blittata
  70. ;***************************************************************************
  71.  
  72. ClearScreen:
  73.     moveq    #5-1,d7            ; 5 bit-planes
  74.     lea    BITPLANE1+100*40,a1    ; indirizzo zona da cancellare (plane1)
  75.  
  76.     move.w    #(64*39)+20,d5        ; valore da scrivere in BLTSIZE
  77.                     ; lo mettiamo in D5 per ottimizzare
  78.                     ; la scrittura
  79.  
  80.     btst    #6,2(a5)         ; dmaconr
  81. WBlit1a:
  82.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  83.     bne.s    wblit1a            ; prima di modificare i registri
  84.  
  85.     move.w    #$0100,$40(a5)        ; BLTCON0. Cancellazione
  86.     move.w    #$0000,$66(a5)        ; BLTDMOD questi 2 registri sono usati
  87.                     ; con valori diversi nella routine
  88.                     ; Riflettore, quindi devono essere
  89.                     ; reinizializzati ogni volta
  90.                     ; e` comunque necessario farlo una
  91.                     ; volta sola, fuori dal loop.
  92.  
  93. ClearLoop:
  94.     btst    #6,2(a5)         ; dmaconr
  95. WBlit1b:
  96.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  97.     bne.s    wblit1b            ; prima di blittare
  98.  
  99.     move.l    a1,$54(a5)
  100.     move.w    d5,$58(a5)        ; scrivi BLTSIZE
  101.                     ; il valore e` stato precedentemente
  102.                     ; scritto in D5
  103.  
  104.     add.l    #256*40,a1        ; indirizzo prossimo plane
  105.     dbra    d7,Clearloop
  106.     rts
  107.  
  108. ;*****************************************************************************
  109. ; Questa routine realizza l'effetto riflettore. Viene effettuata un'operazione
  110. ; di AND tra la figura e una maschera
  111. ;*****************************************************************************
  112.  
  113. ;       |\_._/|        |,\__/|        |\__/,|  
  114. ;       | o o |        |  o o|        |o o  |  
  115. ;       (  T  )        (   T )        ( T   )  
  116. ;      .^`-^-'^.      .^`--^'^.      .^`^--'^. 
  117. ;      `.  ;  .'      `.  ;  .'      `.  ;  .' 
  118. ;      | | | | |      | | | | |      | | | | | 
  119. ;     ((_((|))_))    ((_((|))_))    ((_((|))_))
  120.  
  121. Riflettore:
  122.     moveq    #5-1,d7            ; 5 bit-planes
  123.     lea    Figura+40,a0        ; ind. figura
  124.     lea    BITPLANE1+100*40,a1    ; ind. destinazione
  125.  
  126.     move.w    MascheraX(PC),d0 ; posizione riflettore
  127.     move.w    d0,d2        ; copia
  128.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  129.                 ; inseriti nello shifter del canale A 
  130.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  131.     lsl.w    #4,d0        ; della word...
  132.     or.w    #$0dc0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  133.                 ; notate LF=$C0 (cioe` AND tra A e B)
  134.     lsr.w    #3,d2        ; (equivalente ad una divisione per 8)
  135.                 ; arrotonda ai multipli di 8 per il puntatore
  136.                 ; allo schermo, ovvero agli indirizzi dispari
  137.                 ; (anche ai byte, quindi)
  138.                 ; x es.: un 16 come coordinata diventa il
  139.                 ; byte 2 
  140.     and.w    #$fffe,d2    ; escludo il bit 0 del
  141.     add.w    d2,a0        ; somma all'indirizzo del bitplane, trovando
  142.                 ; l'indirizzo giusto nella figura
  143.     add.w    d2,a1        ; somma all'indirizzo del bitplane, trovando
  144.                 ; l'indirizzo giusto di destinazione
  145.  
  146.     move.l    #Maschera,a2        ; valore da scrivere in BLTAPT
  147.                     ; (puntatore maschera)
  148.                     ; lo mettiamo in A2 per ottimizzare
  149.                     ; la scrittura
  150.  
  151.     move.w    #(64*39)+4,d5        ; valore da scrivere in BLTSIZE
  152.                     ; lo mettiamo in D5 per ottimizzare
  153.                     ; la scrittura
  154.  
  155.     btst    #6,2(a5)         ; dmaconr
  156. WBlit2a:
  157.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  158.     bne.s    wblit2a            ; prima di modificare i registri
  159.  
  160.     move.w    #32,$66(a5)        ; BLTDMOD (40-8=32)
  161.     move.w    d0,$40(a5)        ; BLTCON0 questi 2 registri sono usati
  162.                     ; con valori diversi nella routine
  163.                     ; ClearScreen, quindi devono essere
  164.                     ; reinizializzati ogni volta
  165.                     ; e` comunque necessario farlo una
  166.                     ; volta sola, fuori dal loop.
  167.  
  168. Drawloop:
  169.     btst    #6,2(a5)         ; dmaconr
  170. WBlit2b:
  171.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  172.     bne.s    wblit2b            ; prima di blittare
  173.  
  174.     move.l    a2,$50(a5)        ; BLTAPT  puntatore maschera
  175.                     ; il valore e` stato precedentemente
  176.                     ; scritto in A2
  177.     move.l    a0,$4c(a5)        ; BLTBPT  puntatore figura
  178.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  179.     move.w    d5,$58(a5)        ; scrivi BLTSIZE
  180.                     ; il valore e` stato precedentemente
  181.                     ; scritto in D5
  182.  
  183.     add.w    #56*40,a0        ; ind. prossimo plane figura
  184.     add.w    #256*40,a1        ; ind. prossimo plane destinazione
  185.     dbra    d7,Drawloop
  186.     rts
  187.  
  188. ;*****************************************************************************
  189. ; Questa routine legge la coordinata orizzontale da una tabella
  190. ; e la memorizza nella variabile MASCHERAX
  191. ;*****************************************************************************
  192.  
  193. SpostaMaschera:
  194.     ADDQ.L    #2,TABXPOINT        ; Fai puntare alla word successiva
  195.     MOVE.L    TABXPOINT(PC),A0    ; indirizzo contenuto in long TABXPOINT
  196.                     ; copiato in a0
  197.     CMP.L    #FINETABX-2,A0      ; Siamo all'ultima word della TAB?
  198.     BNE.S    NOBSTARTX        ; non ancora? allora continua
  199.     MOVE.L    #TABX-2,TABXPOINT     ; Riparti a puntare dalla prima word-2
  200. NOBSTARTX:
  201.     MOVE.W    (A0),MascheraX        ; copia il valore nella variabile
  202.     rts
  203.  
  204. MascheraX:
  205.         dc.w    0    ; posizione attuale maschera
  206. TABXPOINT:
  207.         dc.l    TABX    ; puntatore alla tabella
  208.  
  209. ; tabella posizioni maschera
  210.  
  211. TABX:
  212.     DC.W    $12,$16,$19,$1D,$21,$25,$28,$2C,$30,$34
  213.     DC.W    $37,$3B,$3F,$43,$46,$4A,$4E,$51,$55,$58
  214.     DC.W    $5C,$60,$63,$67,$6A,$6E,$71,$74,$78,$7B
  215.     DC.W    $7F,$82,$85,$89,$8C,$8F,$92,$95,$98,$9C
  216.     DC.W    $9F,$A2,$A5,$A8,$AA,$AD,$B0,$B3,$B6,$B8
  217.     DC.W    $BB,$BE,$C0,$C3,$C5,$C8,$CA,$CC,$CF,$D1
  218.     DC.W    $D3,$D5,$D8,$DA,$DC,$DE,$E0,$E1,$E3,$E5
  219.     DC.W    $E7,$E8,$EA,$EC,$ED,$EE,$F0,$F1,$F2,$F4
  220.     DC.W    $F5,$F6,$F7,$F8,$F9,$FA,$FB,$FB,$FC,$FD
  221.     DC.W    $FD,$FE,$FE,$FF,$FF,$FF,$100,$100,$100,$100
  222.     DC.W    $100,$100,$100,$100,$FF,$FF,$FF,$FE,$FE,$FD
  223.     DC.W    $FD,$FC,$FB,$FB,$FA,$F9,$F8,$F7,$F6,$F5
  224.     DC.W    $F4,$F2,$F1,$F0,$EE,$ED,$EC,$EA,$E8,$E7
  225.     DC.W    $E5,$E3,$E1,$E0,$DE,$DC,$DA,$D8,$D5,$D3
  226.     DC.W    $D1,$CF,$CC,$CA,$C8,$C5,$C3,$C0,$BE,$BB
  227.     DC.W    $B8,$B6,$B3,$B0,$AD,$AA,$A8,$A5,$A2,$9F
  228.     DC.W    $9C,$98,$95,$92,$8F,$8C,$89,$85,$82,$7F
  229.     DC.W    $7B,$78,$74,$71,$6E,$6A,$67,$63,$60,$5C
  230.     DC.W    $58,$55,$51,$4E,$4A,$46,$43,$3F,$3B,$37
  231.     DC.W    $34,$30,$2C,$28,$25,$21,$1D,$19,$16,$12
  232. FINETABX:
  233.  
  234. ;*****************************************************************************
  235.  
  236.     SECTION    GRAPHIC,DATA_C
  237.  
  238. COPPERLIST:
  239.     dc.w    $8E,$2c81    ; DiwStrt
  240.     dc.w    $90,$2cc1    ; DiwStop
  241.     dc.w    $92,$38        ; DdfStart
  242.     dc.w    $94,$d0        ; DdfStop
  243.     dc.w    $102,0        ; BplCon1
  244.     dc.w    $104,0        ; BplCon2
  245.     dc.w    $108,0        ; Bpl1Mod
  246.     dc.w    $10a,0        ; Bpl2Mod
  247.  
  248.     dc.w    $100,$5200    ; bplcon0
  249.  
  250. BPLPOINTERS:
  251.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  252.     dc.w $e4,$0000,$e6,$0000
  253.     dc.w $e8,$0000,$ea,$0000
  254.     dc.w $ec,$0000,$ee,$0000
  255.     dc.w $f0,$0000,$f2,$0000
  256.  
  257. Colours:
  258.     dc.w    $180,0,$182,$f10,$184,$f21,$186,$f42
  259.     dc.w    $188,$f53,$18a,$f63,$18c,$f74,$18e,$f85
  260.     dc.w    $190,$f96,$192,$fa6,$194,$fb7,$196,$fb8
  261.     dc.w    $198,$fc9,$19a,$f21,$19c,$f10,$19e,$f00
  262.     dc.w    $1a0,$eff,$1a2,$eff,$1a4,$dff,$1a6,$dff
  263.     dc.w    $1a8,$cff,$1aa,$bef,$1ac,$bef,$1ae,$adf
  264.     dc.w    $1b0,$9df,$1b2,$9cf,$1b4,$8bf,$1b6,$7bf
  265.     dc.w    $1b8,$7af,$1ba,$69f,$1bc,$68f,$1be,$57f
  266.  
  267.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  268.  
  269. ;*****************************************************************************
  270.  
  271. ; qui c'e` il disegno, largo 320 pixel, alto 56 linee e formato da 5 plane
  272.  
  273. Figura:
  274.     incbin    lava320*56*5.raw
  275.  
  276. ;*****************************************************************************
  277.  
  278. ; Questa e` la maschera. E` una figura formata da un solo bitplane,
  279. ; alta 39 linee e larga 4 words
  280.  
  281. Maschera:
  282.     dc.l    $00007fc0,$00000000,$0003fff8,$00000000,$000ffffe,$00000000
  283.     dc.l    $001fffff,$00000000,$007fffff,$c0000000,$00ffffff,$e0000000
  284.     dc.l    $01ffffff,$f0000000,$03ffffff,$f8000000,$03ffffff,$f8000000
  285.     dc.l    $07ffffff,$fc000000,$0fffffff,$fe000000,$0fffffff,$fe000000
  286.     dc.l    $1fffffff,$ff000000,$1fffffff,$ff000000,$1fffffff,$ff000000
  287.     dc.l    $3fffffff,$ff800000,$3fffffff,$ff800000,$3fffffff,$ff800000
  288.     dc.l    $3fffffff,$ff800000,$3fffffff,$ff800000,$3fffffff,$ff800000
  289.     dc.l    $3fffffff,$ff800000,$3fffffff,$ff800000,$3fffffff,$ff800000
  290.     dc.l    $1fffffff,$ff000000,$1fffffff,$ff000000,$1fffffff,$ff000000
  291.     dc.l    $0fffffff,$fe000000,$0fffffff,$fe000000,$07ffffff,$fc000000
  292.     dc.l    $03ffffff,$f8000000,$03ffffff,$f8000000,$01ffffff,$f0000000
  293.     dc.l    $00ffffff,$e0000000,$007fffff,$c0000000,$001fffff,$00000000
  294.     dc.l    $000ffffe,$00000000,$0003fff8,$00000000,$00007fc0,$00000000
  295.     
  296. ;*****************************************************************************
  297.  
  298.     SECTION    bitplane,BSS_C
  299. BITPLANE1:
  300.     ds.b    40*256
  301. BITPLANE2:
  302.     ds.b    40*256
  303. BITPLANE3:
  304.     ds.b    40*256
  305. BITPLANE4:
  306.     ds.b    40*256
  307. BITPLANE5:
  308.     ds.b    40*256
  309.  
  310.     end
  311.  
  312. ;*****************************************************************************
  313.  
  314. Questo esempio e` la versione ottimizzata di lezione10c4.s. le ottimizzazioni
  315. sono spiegate nel listato.
  316.  
  317.