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

  1.  
  2. ; Lezione9i4.s    BOB con sfondo "finto"
  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.  
  25. ; puntiamo i bitplanes
  26.     MOVE.L    #BITPLANE1,d0    ; dove puntare
  27.     LEA    BPLPOINTERS,A1    ; puntatori COP
  28.     MOVEQ    #3-1,D1        ; numero di bitplanes
  29. POINTBP:
  30.     move.w    d0,6(a1)
  31.     swap    d0
  32.     move.w    d0,2(a1)
  33.     swap    d0
  34.     ADD.L    #40*256,d0    ; + lunghezza bitplane (qua e' alto 256 linee)
  35.     addq.w    #8,a1
  36.     dbra    d1,POINTBP
  37.  
  38. ;    Puntiamo il quarto bitplane (lo sfondo)
  39.  
  40.     LEA    BPLPOINTERS,A0        ; puntatori COP
  41.     move.l    #SfondoFinto,d0        ; indirizzo sfondo
  42.     move.w    d0,30(a0)        ; lo sfondo e` il bitplane 4
  43.     swap    d0    
  44.     move.w    d0,26(a0)        ; scrivi word alta
  45.  
  46.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  47.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  48.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  49.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  50.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  51.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  52.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  53.  
  54. mouse:
  55.     bsr.s    MuoviOggetto        ; muove il bob
  56.     bsr.w    DisegnaOggetto        ; disegna il bob
  57.  
  58.  
  59.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  60.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  61. Waity1:
  62.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  63.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  64.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  65.     BNE.S    Waity1
  66.  
  67.     bsr.w    CancellaOggetto        ; cancella il bob dalla vecchia
  68.                     ; posizione
  69.  
  70.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  71.     bne.s    mouse            ; se no, torna a mouse:
  72.  
  73.     rts
  74.  
  75.  
  76. ;****************************************************************************
  77. ; Questa routine muove il bob controllando che non superi i bordi
  78. ;****************************************************************************
  79.  
  80. MuoviOggetto:
  81.     move.w    ogg_x(pc),d0        ; posizione X
  82.     move.w    ogg_y(pc),d1        ; posizione Y
  83.     move.w    vel_x(pc),d2        ; dx (velocita` X)
  84.     move.w    vel_y(pc),d3        ; dy (velocita` Y)
  85.     add.w    d2,d0            ; x = x + dx
  86.     add.w    d3,d1            ; y = y + dy
  87.     addq.w    #1,d3            ; aggiunge la gravita`
  88.                     ; (aumenta la velocita`)
  89.     cmp.w    #Lowest_Floor,d1    ; controlla bordo in basso
  90.     blt.s    UO_NoBounce1
  91.  
  92.     subq.w    #1,d3            ; togli l'aumento di velocita`
  93.     neg.w    d3            ; cambia il segno della velocita` dy
  94.                     ; invertendo la direzione del moto
  95.     move.w    #Lowest_Floor,d1    ; riparti dal bordo
  96. UO_NoBounce1:
  97.  
  98.     cmp.w    #Right_Side,d0        ; controlla bordo destro
  99.     blt.s    UO_NoBounce2        ; se supera il bordo destro..
  100.     sub.w    #Right_Side,d0        ; distanza dal bordo
  101.     neg.w    d0            ; inverti la distanza
  102.     add.w    #Right_Side,d0        ; aggiungi coordinata bordo
  103.     neg.w    d2            ; inverti direzione del moto
  104. UO_NoBounce2:
  105.     btst    #15,d0            ; controlla bordo sinistro (X=0)
  106.     beq.s    UO_NoBounce3        ; se la X e` negativa...
  107.     neg.w    d0            ; .. fa il rimbalzo
  108.     neg.w    d2            ; inverti direzione del moto
  109. UO_NoBounce3:
  110.     move.w    d0,ogg_x        ; aggiorna posizione e velocita`
  111.     move.w    d1,ogg_y
  112.     move.w    d2,vel_x
  113.     move.w    d3,vel_y
  114.  
  115.     rts
  116.  
  117.  
  118. ;****************************************************************************
  119. ; Questa routine disegna il BOB alle coordinate specificate nelle variabili
  120. ; X_OGG e Y_OGG. Il BOB e lo schermo sono in formato normale (non interleaved)
  121. ; e sono utilizzate le formule relative a questo formato nel calcolo dei
  122. ; valori da scrivere nei registri del blitter. Inoltre viene impiegata la
  123. ; tecnica di mascherare l'ultima word del BOB vista nella lezione
  124. ;****************************************************************************
  125.  
  126. ;         ,-^---^-.
  127. ;       _/  -- --  \_
  128. ;       l_ /¯¯T¯¯\ _|
  129. ;      (¯T \_°|°_/ T¯)
  130. ;       ¯T _ ¯u¯ _ T¯
  131. ;       _| l_____| |_
  132. ;      |¬|   ¯¬¯   |¬|
  133. ;    xCz l_________| l
  134.  
  135. DisegnaOggetto:
  136.     lea    BITPLANE1,a0    ; indirizzo bitplane
  137.     move.w    ogg_y(pc),d0    ; coordinata Y
  138.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga occupa 40 bytes
  139.  
  140.     add.l    d0,a0        ; aggiungi offset Y
  141.  
  142.     move.w    ogg_x(pc),d0    ; coordinata X
  143.     move.w    d0,d1        ; copia
  144.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  145.                 ; inseriti nello shifter del canale A 
  146.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  147.     lsl.w    #4,d0        ; della word...
  148.     or.w    #$09f0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  149.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  150.                 ; arrotonda ai multipli di 8 per il puntatore
  151.                 ; allo schermo, ovvero agli indirizzi dispari
  152.                 ; (anche ai byte, quindi)
  153.                 ; x es.: un 16 come coordinata diventa il
  154.                 ; byte 2 
  155.     and.l    #$0000fffe,d1    ; escludo il bit 0 del
  156.     add.l    d1,a0        ; aggiungi l'offset X, trovando l'indirizzo
  157.                 ; della destinazione
  158.  
  159.     move.l    a0,IndirizzoOgg        ; memorizza l'indirizzo della
  160.                     ; destinazione per la routine
  161.                     ; di cancellazione
  162.  
  163.     lea    Ball_Bob,a1        ; puntatore alla figura
  164.     moveq    #3-1,d7            ; bitplane counter
  165.  
  166. DrawLoop:
  167.     btst    #6,2(a5)
  168. WBlit2:
  169.     btst    #6,2(a5)
  170.     bne.s    WBlit2
  171.  
  172.     move.w    d0,$40(a5)        ; BLTCON0 - scrivi valore di shift
  173.     move.w    #$0000,$42(a5)        ; BLTCON1 - modo ascendente
  174.     move.l    #$ffff0000,$44(a5)    ; BLTAFWM e BLTLWM
  175.     move.w    #$FFFE,$64(a5)        ; BLTAMOD
  176.     move.w    #40-6,$66(a5)        ; BLTDMOD
  177.     move.l    a1,$50(a5)        ; BLTAPT - puntatore figura
  178.     move.l    a0,$54(a5)        ; BLTDPT - puntatore bitplanes
  179.  
  180.     move.w    #(31*64)+3,$58(a5)    ; BLTSIZE - altezza 31 linee
  181.                      ; largh. 3 word (48 pixel).
  182.  
  183.     add.l    #4*31,a1        ; indirizzo prossimo plane immagine
  184.     add.l    #40*256,a0        ; indirizzo prossimo plane destinazione
  185.  
  186.     dbra    d7,DrawLoop
  187.     rts
  188.  
  189.  
  190. ;****************************************************************************
  191. ; Questa routine cancella il BOB mediante il blitter. La cancellazione
  192. ; viene fatta sul rettangolo che racchiude il bob
  193. ;****************************************************************************
  194.  
  195. CancellaOggetto:
  196.     moveq    #3-1,d7            ; 3 bitplanes
  197.     move.l    IndirizzoOgg(PC),a0    ; rileggi l'indirizzo destinazione
  198.  
  199. canc_loop:
  200.     btst    #6,2(a5)
  201. WBlit3:
  202.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  203.     bne.s    wblit3
  204.  
  205.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  206.     move    #$0022,$66(a5)        ; BLTDMOD=40-6=34=$22
  207.     move.l    a0,$54(a5)        ; BLTDPT
  208.     move.w    #(64*31)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  209.                     ; cancella il rettangolo che racchiude
  210.                     ; il BOB
  211.  
  212.     add.l    #40*256,a0        ; indirizzo prossimo plane destinazione
  213.     dbra    d7,canc_loop
  214.     rts
  215.  
  216.  
  217. ; dati oggetto
  218.  
  219. IndirizzoOgg:
  220.     dc.l    0    ; questa variabile contiene l'indirizzo della
  221.             ; destinazione
  222.  
  223. ogg_x:    dc.w    32        ; posizione X
  224. ogg_y:    dc.w    50        ; posizione Y
  225. vel_x:    dc.w    -3        ; velocita` X
  226. vel_y:    dc.w    1        ; velocita` Y
  227.  
  228. ;****************************************************************************
  229.  
  230.     SECTION    MY_COPPER,CODE_C
  231.  
  232. COPPERLIST:
  233.     dc.w    $8E,$2c81    ; DiwStrt
  234.     dc.w    $90,$2cc1    ; DiwStop
  235.     dc.w    $92,$38        ; DdfStart
  236.     dc.w    $94,$d0        ; DdfStop
  237.     dc.w    $102,0        ; BplCon1
  238.     dc.w    $104,0        ; BplCon2
  239.  
  240.     dc.w    $108,0        ; MODULO
  241.     dc.w    $10a,0
  242.  
  243. BPLPOINTERS:
  244.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  245.     dc.w $e4,$0000,$e6,$0000
  246.     dc.w $e8,$0000,$ea,$0000
  247.     dc.w $ec,$0000,$ee,$0000
  248.  
  249.     dc.w    $180,$000    ; color0 - sfondo
  250.     dc.w    $190,$000
  251.  
  252.      dc.w    $182,$0A0            ; colori da 1 a 7
  253.      dc.w    $184,$040
  254.      dc.w    $186,$050
  255.      dc.w    $188,$061
  256.      dc.w    $18A,$081
  257.      dc.w    $18C,$020
  258.      dc.w    $18E,$6F8
  259.  
  260.     dc.w    $192,$0A0            ; colori da 9 a 15
  261.     dc.w    $194,$040            ; sono gli stessi valori
  262.     dc.w    $196,$050            ; caricati nei registri da 1 a 7
  263.     dc.w    $198,$061
  264.     dc.w    $19a,$081
  265.     dc.w    $19c,$020
  266.     dc.w    $19e,$6F8
  267.  
  268.     dc.w    $190,$345    ; colore 8 - pixel ad 1 dello sfondo
  269.  
  270.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  271.  
  272.     dc.w    $8007,$fffe    ; aspetta riga $80
  273.     dc.w    $100,$4200    ; bplcon0 - 4 bitplanes lowres
  274.                 ; attiva il bitplane 4 (sfondo)
  275.  
  276. ; in questo spazio e' visualizzata la parte dello sfondo
  277.  
  278.     dc.w    $e007,$fffe    ; aspetta riga $e0
  279.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  280.  
  281.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  282.  
  283. ;****************************************************************************
  284.  
  285. ; Figura Bob
  286. Ball_Bob:
  287.  DC.W $0000,$0000,$0000,$0000,$0000,$0000,$003F,$8000    ; plane 1
  288.  DC.W $00C1,$E000,$017C,$E000,$02FE,$3000,$05FF,$5400
  289.  DC.W $07FF,$1800,$0BFE,$AC00,$03FF,$1A00,$0BFE,$AC00
  290.  DC.W $11FF,$1A00,$197D,$2C00,$0EAA,$1A00,$1454,$DC00
  291.  DC.W $0E81,$3800,$0154,$F400,$02EB,$F000,$015F,$D000
  292.  DC.W $00B5,$A000,$002A,$8000,$0000,$0000,$0000,$0000
  293.  DC.W $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
  294.  DC.W $0000,$0000,$0000,$0000,$0000,$0000
  295.  
  296.  DC.W $000F,$E000,$007F,$FC00,$01FF,$FF00,$03FF,$FF80    ; plane 2
  297.  DC.W $07C1,$FFC0,$0F00,$FFE0,$1E00,$3FF0,$3C40,$5FF8
  298.  DC.W $3CE0,$1FF8,$7840,$2FFC,$7800,$1FFC,$7800,$2FFC
  299.  DC.W $F800,$1FFE,$F800,$2FFE,$FE00,$1FFE,$FC00,$DFFE
  300.  DC.W $FE81,$3FFE,$FF54,$FFFE,$FFEB,$FFFE,$7FFF,$FFFC
  301.  DC.W $7FFF,$FFFC,$7FFF,$FFFC,$3FFF,$FFF8,$3FFF,$FFF8
  302.  DC.W $1FFF,$FFF0,$0FFF,$FFE0,$07FF,$FFC0,$03FF,$FF80
  303.  DC.W $01FF,$FF00,$007F,$FC00,$000F,$E000
  304.  
  305.  DC.W $000F,$E000,$007F,$FC00,$01E0,$7F00,$0380,$0F80    ; plane 3
  306.  DC.W $073E,$0AC0,$0CFF,$0560,$198F,$C2F0,$3347,$A0B8
  307.  DC.W $32EB,$E158,$6647,$D0AC,$660B,$E05C,$4757,$D0AC
  308.  DC.W $C7AF,$E05E,$A7FF,$D02E,$C1FF,$E05E,$A3FF,$202E
  309.  DC.W $D17E,$C05E,$E0AB,$002E,$D014,$005E,$6800,$00AC
  310.  DC.W $7000,$02DC,$7400,$057C,$2800,$0AF8,$3680,$55F8
  311.  DC.W $1D54,$AAF0,$0EAB,$55E0,$0754,$ABC0,$03EB,$FF80
  312.  DC.W $01FE,$FF00,$007F,$FC00,$000F,$E000
  313.  
  314. ;****************************************************************************
  315.  
  316. ; Sfondo 320 * 100 1 Bitplane, raw normale.
  317.  
  318. SfondoFinto:
  319.     incbin    "assembler2:sorgenti6/sfondo320*100.raw"
  320.  
  321. ;****************************************************************************
  322.  
  323.     SECTION    bitplane,BSS_C
  324. BITPLANE1:
  325.     ds.b    40*256
  326. BITPLANE2:
  327.     ds.b    40*256
  328. BITPLANE3:
  329.     ds.b    40*256
  330.  
  331.     end
  332.  
  333. ;****************************************************************************
  334.  
  335. In questo esempio vedremo un bob che si muove su uno sfondo. L'effetto e`
  336. ottenuto pero` con un trucco che limita molto le prestazioni. Il trucco e`
  337. il seguente: usiamo 4 bitplanes, i primi 3 per disegnare il bob e il quarto
  338. e' per lo sfondo. Lo sfondo e il bob hanno dunque piani separati.
  339. Per far apparire il bob sopra lo sfondo, si fa in modo che il bitplane
  340. dello sfondo non influenzi i colori del bob. Consideriamo per esempio un
  341. pixel del bob formato prendendo plane 1=0, plane 2=1, plane 3=1.
  342. Questo pixel muovendosi viene a trovarsi sovrapposto a tanti bit del plane 4.
  343. Quando si trova in corrispondenza di un bit posto a 0, i 4 planes formeranno
  344. la combinazione plane 1=0, plane 2=1, plane 3=1, plane 4=0 che definisce il
  345. colore 6. Quando invece si trova in corrispondenza di un bit posto a 1, si
  346. formera` la combinazione plane 1=0, plane 2=1, plane 3=1, plane 4=1 che
  347. definisce il colore 14. Quindi i colori del bob cambiano a seconda della
  348. zona di sfondo che attraversano. Noi vorremmo invece che il bob apparisse
  349. sempre uguale passando sopra lo sfondo. Possiamo simulare questo effetto
  350. in un modo molto semplice, rendendo uguali i colori contenuti nei registri
  351. colore che differiscono solo per i bit dello sfondo. Tornando all'esempio, se
  352. mettiamo lo stesso valore RGB sia nel registro COLOR06 che in COLOR14, quale
  353. che sia il valore del bit del plane 4, il nostro pixel apparira` sempre dello
  354. stesso colore. facendo lo stesso per tutti gli altri registri (cioe` ponendo
  355.  COLOR01 = COLOR09, COLOR02=COLOR10, COLOR03=COLOR11 ecc) risolveremo
  356. il problema. La parte "trasparente" del bob, e` quella che ha i 3 planes a 0,
  357. che visualizza il colore 0 o il colore 8 a seconda del valore del bit nel plane
  358. 4. Tenendo diversi questi 2 colori, e` possibile visualizzare lo sfondo:
  359. i bit a 0 dello sfondo appariranno del colore 0, mentre quelli a 1 appariranno
  360. del colore 8. Per capire bene cosa succende, provate un po' a mettere nei
  361. registri COLOR01-07 valori diversi da quelli di COLOR09-15: scoprirete subito
  362. il trucco. Questa tecnica ha lo svantaggio di "sprecare" alcuni colori.
  363. Infatti siamo costretti a scrivere valori RGB uguali in alcuni registri,
  364. diminuendo il numero di colori visualizzabili. In questo esempio, utiliziamo 4
  365. bitplanes, ma possiamo usare solo 8 colori per il bob e 2 per lo sfondo.
  366. Sprechiamo dunque 6 colori. Se usassimo 3 planes per il bob e 2 per lo sfondo,
  367. potremmo visualizzare 8+4=12 colori, contro i 32 normalmente permessi da 5
  368. bitplanes. Come vedete dunque anche questa tecnica non e` l'ideale.
  369. Ma non temete, prima o poi riusciremo a fare un bob come si deve!
  370. Nel frattempo notate un po' di cose in questo listato:
  371. 1) Utiliziamo il trucco (gia` visto) della BLTLWM a 0 per risparmiare la
  372. colonna di word a destra del bob;
  373. 2) Utiliziamo uno schermo NON interleaved per separare i planes di sfondo e
  374. planes del bob.
  375. 3) Negli esempi precedenti calcoliamo l'indirizzo della destinazione del bob,
  376. sia nella routine di disegno che in quella di cancellazione. In realta` tra
  377. il disegno e la successiva cancellazione, il bob non cambia posizione (lo fa
  378. solo DOPO la cancellazione) quindi il calcolo e` sempre lo stesso e lo si
  379. potrebbe fare una sola volta. In questo esempio facciamo appunto questo:
  380. il calcolo viene fatto nella routine DisegnaOggetto e viene memorizzato
  381. nella variabile IndirizzoOgg. La routine di cancellazione si limita a rileggere
  382. il risultato dalla variabile e ad usarlo.
  383.  
  384.