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

  1.  
  2. ; Lezione10f2.s    Tanti BOB con sfondo "finto" e "double buffering"
  3. ;        Tasto sinistro per uscire.
  4.  
  5.     SECTION    bau,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. ; costanti bordi.
  18.  
  19. Lowest_Floor    equ    200    ; bordo in basso
  20. Right_Side    equ    287    ; bordo a destra    
  21.  
  22.  
  23. START:
  24. ; i primi 3 planes vengono puntati dalla routine ScambiaBuffer
  25.  
  26. ;    Puntiamo il quarto bitplane (lo sfondo)
  27.  
  28.     LEA    BPLPOINTERS,A0        ; puntatori COP
  29.     move.l    #SfondoFinto,d0        ; indirizzo sfondo
  30.     move.w    d0,30(a0)        ; lo sfondo e` il bitplane 4
  31.     swap    d0    
  32.     move.w    d0,26(a0)        ; scrivi word alta
  33.  
  34.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  35.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  36.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  37.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  38.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  39.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  40.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  41.  
  42. mouse:
  43.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  44.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  45. Waity1:
  46.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  47.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  48.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  49.     BNE.S    Waity1
  50.  
  51.     bsr.w    ScambiaBuffer        ; questa routine scambia i 2 buffer
  52.  
  53.     bsr.w    CancellaSchermo        ; cancella lo schermo
  54.  
  55.     lea    Oggetto_1,a4        ; indirizzo primo oggetto
  56.     moveq    #6-1,d6            ; 6 oggetti
  57.  
  58. Ogg_loop:
  59.     bsr.s    MuoviOggetto        ; muove il bob
  60.     bsr.w    DisegnaOggetto        ; disegna il bob
  61.  
  62.     addq.l    #8,a4            ; punta al prossimo oggetto
  63.  
  64.     dbra    d6,Ogg_loop
  65.  
  66.     btst    #6,2(a5)
  67. WBlit_coppermonitor:
  68.     btst    #6,2(a5)
  69.     bne.s    WBlit_coppermonitor
  70.  
  71.     move.w    #$aaa,$180(a5)        ; copper monitor: colore grigio
  72.  
  73.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  74.     bne.s    mouse            ; se no, torna a mouse:
  75.  
  76.     rts
  77.  
  78. ;****************************************************************************
  79. ; Questa routine scambia i 2 buffer scambiando gli indirizzi nelle
  80. ; variabili VIEW_BUFFER e  DRAW_BUFFER.
  81. ; Inoltre aggiorna nella copperlist le istruzioni che caricano i registri
  82. ; BPLxPT, in modo che puntino al nuovo buffer da visualizzare.
  83. ;****************************************************************************
  84.  
  85. ;            |\__/,|   (`\
  86. ;          _.|o o  |_   ) )
  87. ;      ---(((---(((---------
  88.  
  89. ScambiaBuffer:
  90.     move.l    draw_buffer(pc),d0        ; scambia il contenuto
  91.     move.l    view_buffer(pc),draw_buffer    ; delle variabili
  92.     move.l    d0,view_buffer            ; in d0 c'e` l'indirizzo
  93.                         ; del nuovo buffer
  94.                         ; da visualizzare
  95.  
  96. ; aggiorna la copperlist puntando i bitplanes del nuovo buffer da visualizzare
  97.  
  98.     LEA    BPLPOINTERS,A1    ; puntatori COP
  99.     MOVEQ    #3-1,D1        ; numero di bitplanes
  100. POINTBP:
  101.     move.w    d0,6(a1)
  102.     swap    d0
  103.     move.w    d0,2(a1)
  104.     swap    d0
  105.     ADD.L    #40*256,d0    ; + lunghezza bitplane (qua e' alto 256 linee)
  106.     addq.w    #8,a1
  107.     dbra    d1,POINTBP
  108.  
  109.     rts
  110.  
  111. ;****************************************************************************
  112. ; Questa routine muove un bob controllando che non superi i bordi
  113. ; A4 - punta alla struttura dati che contiene la posizione e la velocita`
  114. ;      del bob
  115. ;****************************************************************************
  116.  
  117. MuoviOggetto:
  118.     move.w    (a4),d0            ; posizione X
  119.     move.w    2(a4),d1        ; posizione Y
  120.     move.w    4(a4),d2        ; dx (velocita` X)
  121.     move.w    6(a4),d3        ; dy (velocita` Y)
  122.     add.w    d2,d0            ; x = x + dx
  123.     add.w    d3,d1            ; y = y + dy
  124.  
  125.     btst    #15,d1            ; controlla bordo alto (Y=0)
  126.     beq.s    UO_NoBounce4        ; se la Y e` negativa...
  127.     neg.w    d1            ; .. fa il rimbalzo
  128.     neg.w    d3            ; inverti direzione del moto
  129. UO_NoBounce4:
  130.  
  131.     cmp.w    #Lowest_Floor,d1    ; controlla bordo in basso
  132.     blt.s    UO_NoBounce1
  133.  
  134.     neg.w    d3            ; cambia il segno della velocita` dy
  135.                     ; invertendo la direzione del moto
  136.     move.w    #Lowest_Floor,d1    ; riparti dal bordo
  137. UO_NoBounce1:
  138.  
  139.     cmp.w    #Right_Side,d0        ; controlla bordo destro
  140.     blt.s    UO_NoBounce2        ; se supera il bordo destro..
  141.     sub.w    #Right_Side,d0        ; distanza dal bordo
  142.     neg.w    d0            ; inverti la distanza
  143.     add.w    #Right_Side,d0        ; aggiungi coordinata bordo
  144.     neg.w    d2            ; inverti direzione del moto
  145. UO_NoBounce2:
  146.     btst    #15,d0            ; controlla bordo sinistro (X=0)
  147.     beq.s    UO_NoBounce3        ; se la X e` negativa...
  148.     neg.w    d0            ; .. fa il rimbalzo
  149.     neg.w    d2            ; inverti direzione del moto
  150. UO_NoBounce3:
  151.     move.w    d0,(a4)            ; aggiorna posizione e velocita`
  152.     move.w    d1,2(a4)
  153.     move.w    d2,4(a4)
  154.     move.w    d3,6(a4)
  155.  
  156.     rts
  157.  
  158.  
  159. ;****************************************************************************
  160. ; Questa routine disegna un BOB.
  161. ; A4 - punta alla struttura dati che contiene la posizione e la velocita`
  162. ;      del bob
  163. ;****************************************************************************
  164.  
  165. DisegnaOggetto:
  166.     move.l    draw_buffer(pc),a0    ; indirizzo buffer disegno
  167.     move.w    2(a4),d0    ; coordinata Y
  168.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga occupa 40 bytes
  169.  
  170.     add.l    d0,a0        ; aggiungi offset Y
  171.  
  172.     move.w    (a4),d0        ; coordinata X
  173.     move.w    d0,d1        ; copia
  174.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  175.                 ; inseriti nello shifter del canale A 
  176.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  177.     lsl.w    #4,d0        ; della word...
  178.     or.w    #$0FCA,d0    ; ...giusti per inserirsi nel registro BLTCON0
  179.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  180.                 ; arrotonda ai multipli di 8 per il puntatore
  181.                 ; allo schermo, ovvero agli indirizzi dispari
  182.                 ; (anche ai byte, quindi)
  183.                 ; x es.: un 16 come coordinata diventa il
  184.                 ; byte 2 
  185.     and.l    #$0000fffe,d1    ; escludo il bit 0 del
  186.     add.l    d1,a0        ; aggiungi l'offset X, trovando l'indirizzo
  187.                 ; della destinazione
  188.  
  189.     lea    Ball_Bob,a1        ; puntatore alla figura
  190.     lea    Ball_Mask,a2        ; puntatore alla maschera
  191.     moveq    #3-1,d7            ; bitplane counter
  192.  
  193. DrawLoop:
  194.     btst    #6,2(a5)
  195. WBlit2:
  196.     btst    #6,2(a5)
  197.     bne.s    WBlit2
  198.  
  199.     move.w    d0,$40(a5)        ; BLTCON0 - scrivi valore di shift
  200.     move.w    d0,d1            ; copia valore di BLTCON0,
  201.     and.w    #$f000,d1        ; seleziona valore di shift..
  202.     move.w    d1,$42(a5)        ; e scrivilo in BLTCON1 (per canale B)
  203.  
  204.     move.l    #$ffff0000,$44(a5)    ; BLTAFWM e BLTLWM
  205.  
  206.     move.w    #$FFFE,$64(a5)        ; BLTAMOD
  207.     move.w    #$FFFE,$62(a5)        ; BLTBMOD
  208.  
  209.     move.w    #40-6,$66(a5)        ; BLTDMOD
  210.     move.w    #40-6,$60(a5)        ; BLTCMOD
  211.  
  212.     move.l    a2,$50(a5)        ; BLTAPT - puntatore maschera
  213.     move.l    a1,$4c(a5)        ; BLTBPT - puntatore figura
  214.     move.l    a0,$48(a5)        ; BLTCPT - puntatore sfondo
  215.     move.l    a0,$54(a5)        ; BLTDPT - puntatore bitplanes
  216.  
  217.     move.w    #(31*64)+3,$58(a5)    ; BLTSIZE - altezza 31 linee
  218.                      ; largh. 3 word (48 pixel).
  219.  
  220.     add.l    #4*31,a1        ; indirizzo prossimo plane immagine
  221.     add.l    #40*256,a0        ; indirizzo prossimo plane destinazione
  222.     dbra    d7,DrawLoop
  223.  
  224.  
  225.  
  226.     rts
  227.  
  228.  
  229. ;****************************************************************************
  230. ; Questa routine cancella lo schermo mediante il blitter.
  231. ;****************************************************************************
  232.  
  233. CancellaSchermo:
  234.     moveq    #3-1,d7            ; 3 bitplanes
  235.     move.l    draw_buffer(pc),a0    ; indirizzo buffer disegno
  236.  
  237. canc_loop:
  238.     btst    #6,2(a5)
  239. WBlit3:
  240.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  241.     bne.s    wblit3
  242.  
  243.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  244.     move    #$0000,$66(a5)        ; BLTDMOD=0
  245.     move.l    a0,$54(a5)        ; BLTDPT
  246.     move.w    #(64*256)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  247.                     ; cancella tutto lo schermo
  248.  
  249.     add.l    #40*256,a0        ; indirizzo prossimo plane destinazione
  250.     dbra    d7,canc_loop
  251.     rts
  252.  
  253. ; puntatori ai 2 buffer
  254. view_buffer    dc.l    BITPLANE1    ; buffer visualizzato
  255. draw_buffer    dc.l    BITPLANE1b    ; buffer di disegno
  256.  
  257.  
  258. ; dati oggetti
  259. ; queste sono le strutture dati che contengono velocita` e posizione dei bobs.
  260. ; ogni struttra dati si compone di 4 words che contengono nell'ordine:
  261. ; POSIZIONE X, POSIZIONE Y, VELOCITA` X, VELOCITA` Y
  262.  
  263. Oggetto_1:
  264.     dc.w    32,53        ;  x / y   - posizione
  265.     dc.w    -3,1        ; dx / dy  - velocita`
  266.  
  267. Oggetto_2:
  268.     dc.w    132,65        ;  x / y   - posizione
  269.     dc.w    2,-1        ; dx / dy  - velocita`
  270.  
  271. Oggetto_3:
  272.     dc.w    232,42        ;  x / y   - posizione
  273.     dc.w    3,1        ; dx / dy  - velocita`
  274.  
  275. Oggetto_4:
  276.     dc.w    2,20        ;  x / y   - posizione
  277.     dc.w    -5,1        ; dx / dy  - velocita`
  278.  
  279. Oggetto_5:
  280.     dc.w    60,80        ;  x / y   - posizione
  281.     dc.w    6,1        ; dx / dy  - velocita`
  282.  
  283. Oggetto_6:
  284.     dc.w    50,75        ;  x / y   - posizione
  285.     dc.w    -5,1        ; dx / dy  - velocita`
  286.  
  287. ;****************************************************************************
  288.  
  289.     SECTION    MY_COPPER,CODE_C
  290.  
  291. COPPERLIST:
  292.     dc.w    $8E,$2c81    ; DiwStrt
  293.     dc.w    $90,$2cc1    ; DiwStop
  294.     dc.w    $92,$38        ; DdfStart
  295.     dc.w    $94,$d0        ; DdfStop
  296.     dc.w    $102,0        ; BplCon1
  297.     dc.w    $104,0        ; BplCon2
  298.  
  299.     dc.w    $108,0        ; MODULO
  300.     dc.w    $10a,0
  301.  
  302. BPLPOINTERS:
  303.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  304.     dc.w $e4,$0000,$e6,$0000
  305.     dc.w $e8,$0000,$ea,$0000
  306.     dc.w $ec,$0000,$ee,$0000
  307.  
  308.     dc.w    $180,$000    ; color0 - sfondo
  309.     dc.w    $190,$000
  310.  
  311.      dc.w    $182,$0A0            ; colori da 1 a 7
  312.      dc.w    $184,$040
  313.      dc.w    $186,$050
  314.      dc.w    $188,$061
  315.      dc.w    $18A,$081
  316.      dc.w    $18C,$020
  317.      dc.w    $18E,$6F8
  318.  
  319.     dc.w    $192,$0A0            ; colori da 9 a 15
  320.     dc.w    $194,$040            ; sono gli stessi valori
  321.     dc.w    $196,$050            ; caricati nei registri da 1 a 7
  322.     dc.w    $198,$061
  323.     dc.w    $19a,$081
  324.     dc.w    $19c,$020
  325.     dc.w    $19e,$6F8
  326.  
  327.     dc.w    $190,$345    ; colore 8 - pixel ad 1 dello sfondo
  328.  
  329.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  330.  
  331.     dc.w    $8007,$fffe    ; aspetta riga $80
  332.     dc.w    $100,$4200    ; bplcon0 - 4 bitplanes lowres
  333.                 ; attiva il bitplane 4 (sfondo)
  334.  
  335. ; in questo spazio e' visualizzata la parte dello sfondo
  336.  
  337.     dc.w    $e007,$fffe    ; aspetta riga $e0
  338.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  339.  
  340.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  341.  
  342. ;****************************************************************************
  343.  
  344. ; Figura Bob
  345. Ball_Bob:
  346.  DC.W $0000,$0000,$0000,$0000,$0000,$0000,$003F,$8000    ; plane 1
  347.  DC.W $00C1,$E000,$017C,$E000,$02FE,$3000,$05FF,$5400
  348.  DC.W $07FF,$1800,$0BFE,$AC00,$03FF,$1A00,$0BFE,$AC00
  349.  DC.W $11FF,$1A00,$197D,$2C00,$0EAA,$1A00,$1454,$DC00
  350.  DC.W $0E81,$3800,$0154,$F400,$02EB,$F000,$015F,$D000
  351.  DC.W $00B5,$A000,$002A,$8000,$0000,$0000,$0000,$0000
  352.  DC.W $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
  353.  DC.W $0000,$0000,$0000,$0000,$0000,$0000
  354.  
  355.  DC.W $000F,$E000,$007F,$FC00,$01FF,$FF00,$03FF,$FF80    ; plane 2
  356.  DC.W $07C1,$FFC0,$0F00,$FFE0,$1E00,$3FF0,$3C40,$5FF8
  357.  DC.W $3CE0,$1FF8,$7840,$2FFC,$7800,$1FFC,$7800,$2FFC
  358.  DC.W $F800,$1FFE,$F800,$2FFE,$FE00,$1FFE,$FC00,$DFFE
  359.  DC.W $FE81,$3FFE,$FF54,$FFFE,$FFEB,$FFFE,$7FFF,$FFFC
  360.  DC.W $7FFF,$FFFC,$7FFF,$FFFC,$3FFF,$FFF8,$3FFF,$FFF8
  361.  DC.W $1FFF,$FFF0,$0FFF,$FFE0,$07FF,$FFC0,$03FF,$FF80
  362.  DC.W $01FF,$FF00,$007F,$FC00,$000F,$E000
  363.  
  364.  DC.W $000F,$E000,$007F,$FC00,$01E0,$7F00,$0380,$0F80    ; plane 3
  365.  DC.W $073E,$0AC0,$0CFF,$0560,$198F,$C2F0,$3347,$A0B8
  366.  DC.W $32EB,$E158,$6647,$D0AC,$660B,$E05C,$4757,$D0AC
  367.  DC.W $C7AF,$E05E,$A7FF,$D02E,$C1FF,$E05E,$A3FF,$202E
  368.  DC.W $D17E,$C05E,$E0AB,$002E,$D014,$005E,$6800,$00AC
  369.  DC.W $7000,$02DC,$7400,$057C,$2800,$0AF8,$3680,$55F8
  370.  DC.W $1D54,$AAF0,$0EAB,$55E0,$0754,$ABC0,$03EB,$FF80
  371.  DC.W $01FE,$FF00,$007F,$FC00,$000F,$E000
  372.  
  373. ; Maschera Bob
  374. Ball_MASK:
  375.  DC.W $000F,$E000,$007F,$FC00,$01FF,$FF00,$03FF,$FF80
  376.  DC.W $07FF,$FFC0,$0FFF,$FFE0,$1FFF,$FFF0,$3FFF,$FFF8
  377.  DC.W $3FFF,$FFF8,$7FFF,$FFFC,$7FFF,$FFFC,$7FFF,$FFFC
  378.  DC.W $FFFF,$FFFE,$FFFF,$FFFE,$FFFF,$FFFE,$FFFF,$FFFE
  379.  DC.W $FFFF,$FFFE,$FFFF,$FFFE,$FFFF,$FFFE,$7FFF,$FFFC
  380.  DC.W $7FFF,$FFFC,$7FFF,$FFFC,$3FFF,$FFF8,$3FFF,$FFF8
  381.  DC.W $1FFF,$FFF0,$0FFF,$FFE0,$07FF,$FFC0,$03FF,$FF80
  382.  DC.W $01FF,$FF00,$007F,$FC00,$000F,$E000
  383.  
  384.  
  385. ;****************************************************************************
  386.  
  387. ; Sfondo 320 * 100 1 Bitplane, raw normale.
  388.  
  389. SfondoFinto:
  390.     incbin    "sfondo320*100.raw"
  391.  
  392. ;****************************************************************************
  393.  
  394.     SECTION    bitplane,BSS_C
  395. ; Questi sono i bitplanes del primo buffer
  396. BITPLANE1:
  397.     ds.b    40*256
  398. BITPLANE2:
  399.     ds.b    40*256
  400. BITPLANE3:
  401.     ds.b    40*256
  402.  
  403. ; Questi sono i bitplanes del secondo buffer
  404. BITPLANE1b:
  405.     ds.b    40*256
  406. BITPLANE2b:
  407.     ds.b    40*256
  408. BITPLANE3b:
  409.     ds.b    40*256
  410.  
  411.     end
  412.  
  413. ;****************************************************************************
  414.  
  415. In questo esempio risolviamo il problema dell'esempio lezione10f1.s mediante
  416. la tecnica del double buffering. Questa tecnica consiste nell'uso di 2
  417. buffer separati, uno che viene visualizzato e uno sul quale si disegna
  418. che vengono scambiati ad ogni Vertical Blank.
  419. Gli indirizzi dei 2 buffer sono contenuti in 2 variabili. La variabile
  420. draw_buffer contiene l'indirizzo del buffer usato per disegnare nel
  421. fotogramma corrente. Le routine che modificano lo schermo (CancellaSchermo
  422. e DisegnaOggetto) leggono da draw_buffer l'indirizzo del buffer di disegno
  423. e su di esso effettuano le loro operazioni.
  424. La variabile view_buffer contiene l'indirizzo del buffer attualmente
  425. visualizzato. 
  426. La routine ScambiaBuffer provvede a scambiare ad ogni fotogramma il contenuto
  427. delle 2 variabili. Inoltre essa fa in modo che venga visualizzato il giusto
  428. buffer (quello il cui indirizzo e` memorizzato in view_buffer). Infatti,
  429. per visualizzare alternativamente i 2 buffer, e` necessario che ad ogni
  430. fotogramma la copper list faccia puntare i registri BPLxPT ai bitplane del
  431. buffer di visualizzazione. Questo significa che la copper list deve essere
  432. modificata ad ogni vertical blank, cosa che viene fatta dalla routine
  433. ScambiaBuffer.
  434.  
  435.