home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti4 / lezione8m4.s < prev    next >
Text File  |  1995-09-29  |  6KB  |  216 lines

  1.  
  2. ; Lezione8m4.s - Routine di stampa di punti (plot), usata in un loop per
  3. ;         calcolare y=a*x*x, ossia delle parabole
  4.  
  5.     Section    dotta,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; con questo include mi risparmio di
  11.                 ; riscriverla ogni volta!
  12. *****************************************************************************
  13.  
  14.  
  15. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  16.  
  17.         ;5432109876543210
  18. DMASET    EQU    %1000001110000000    ; copper e bitplane DMA abilitati
  19. ;         -----a-bcdefghij
  20.  
  21.  
  22. START:
  23. ;     PUNTIAMO IL NOSTRO BITPLANE
  24.  
  25.     MOVE.L    #BITPLANE,d0
  26.     LEA    BPLPOINTERS,A1
  27.     move.w    d0,6(a1)
  28.     swap    d0
  29.     move.w    d0,2(a1)
  30.  
  31.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  32.                     ; e sprites.
  33.  
  34.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  35.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  36.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  37.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  38.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  39.  
  40.     lea    bitplane,a0    ; Indirizzo del bitplane dove stampare
  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.s    CalcolaParabola    ; y=a*x*x
  52.  
  53.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  54.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  55. Aspetta:
  56.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  57.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  58.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  59.     BEQ.S    Aspetta
  60.  
  61.     btst    #6,$bfe001    ; mouse premuto?
  62.     bne.s    mouse
  63. Finito:
  64.     btst    #6,$bfe001    ; mouse premuto?
  65.     bne.s    Finito
  66.     rts            ; esci
  67.  
  68. ;         ______
  69. ;        /      \
  70. ;       /   oo   \
  71. ;       \___()___/
  72. ;       /       ¬\
  73. ;       \________/
  74. ;       /       ¬\
  75. ;     __\________/__
  76. ;    (_____/  \_____)CNT
  77.  
  78. ;    Y=a*x*x, coeff*d0*d0=d1
  79.  
  80. CalcolaParabola:
  81.     Addq.W    #1,Miox        ; Incrementa la X
  82.     move.w    Miox(PC),d1
  83.     Mulu.w    d1,d1        ; x*x
  84.     Mulu.w    Coeff(PC),d1    ; y=a*x*x
  85.     lsr.w    #8,d1        ; dividi per 256 la Y per "allargare"
  86.  
  87.     cmp.w    #256,MioY    ; siamo sotto lo schermo??
  88.     bhi.s    Riparti        ; se si, abbiamo 1 solo schermo!!! ripartiamo
  89.     cmp.w    #319-160,MioX    ; siamo all'estrema destra dello schermo??
  90.     ble.s    NonFinito
  91. Riparti:
  92.     addq.w    #1,Coeff    ; Aggiungi 1 al coefficiente della parabola
  93.     cmp.w    #3,Coeff    ; Abbiamo gia' fatto 2 parabole?
  94.     beq.s    Finito        ; Se si, usciamo!
  95.     move.w    #-160,Miox    ; E riparti da X= -160 per la nuova parabola
  96.     rts            ; Niente da plottare questa volta.
  97.  
  98. NonFinito:
  99.     move.w    d1,MioY
  100.  
  101. ; Andiamo a plottare il punto:
  102.  
  103.     move.w    Miox(PC),d0    ; Coord. X
  104.     add.w    #160,d0        ; spostati in avanti di 160, dato che calcolo
  105.                 ; da -160 a +160, che devo normalizzare in
  106.                 ; cordinate 0 fino 320... in questo modo ho
  107.                 ; spostato la parabola a destra.
  108.     move.w    Mioy(PC),d1    ; Coord  Y
  109.     bsr.s    plotPIX        ; stampa il punto alla coord. X=d0, Y=d1
  110.  
  111.     rts
  112.  
  113.  
  114. MioX:
  115.     dc.w    -160    ; parto da -160 per "centrare" la parabola.
  116. MioY:
  117.     dc.w    0
  118.  
  119. Coeff:
  120.     dc.w    1
  121.  
  122. *****************************************************************************
  123. ;            Routine di plot dei punti (dots)
  124. *****************************************************************************
  125.  
  126. ;    Parametri in entrata di PlotPIX:
  127. ;
  128. ;    a0 = Indirizzo bitplane destinazione
  129. ;    d0.w = Coordinata X (0-319)
  130. ;    d1.w = Coordinata Y (0-255)
  131.  
  132. LargSchermo    equ    40    ; Larghezza dello schermo in bytes.
  133.  
  134. PlotPIX:
  135.     move.w    d0,d2        ; Copia la coordinata X in d2
  136.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  137.                 ; dividendo per 8 la coordinata X.
  138.     mulu.w    #largschermo,d1
  139.     add.w    d1,d0        ; Somma scost. verticale a quello orizzontale
  140.  
  141.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X
  142.                 ; (in realta' sarebbe il resto della divisione
  143.                 ;  per 8, fatta in precedenza)
  144.     not.w    d2
  145.  
  146.     bset.b    d2,(a0,d0.w)    ; Setta il bit d2 del byte distante d0 bytes
  147.                 ; dall'inizio dello schermo.
  148.     rts
  149.  
  150. *****************************************************************************
  151.  
  152.     SECTION    GRAPHIC,DATA_C
  153.  
  154. COPPERLIST:
  155.  
  156.     dc.w    $8E,$2c81    ; DiwStrt
  157.     dc.w    $90,$2cc1    ; DiwStop
  158.     dc.w    $92,$0038    ; DdfStart
  159.     dc.w    $94,$00d0    ; DdfStop
  160.     dc.w    $102,0        ; BplCon1
  161.     dc.w    $104,$24    ; BplCon2 - Tutti gli sprite sopra i bitplane
  162.     dc.w    $108,0        ; Bpl1Mod
  163.     dc.w    $10a,0        ; Bpl2Mod
  164.             ; 5432109876543210
  165.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  166.  
  167. BPLPOINTERS:
  168.     dc.w $e0,0,$e2,0    ;primo     bitplane
  169.  
  170.     dc.w    $0180,$000    ; color0 - SFONDO
  171.     dc.w    $0182,$1af    ; color1 - SCRITTE
  172.  
  173.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  174.  
  175.  
  176. *****************************************************************************
  177.  
  178.     SECTION    MIOPLANE,BSS_C
  179.  
  180. BITPLANE:
  181.     ds.b    40*256    ; un bitplane lowres 320x256
  182.  
  183.     end
  184.  
  185. La modifica piu' importante qua e' che abbiamo "spostato" la parabola verso
  186. destra, "scoprendo" anche la parte negativa che sale:
  187.  
  188.      **
  189.       *        *
  190.    *          *
  191.  *     0    *
  192.        ZERO
  193.  
  194. Come si vede dallo schemuccio, con la X minore di zero la curva e' contraria,
  195. o speculare, vah... Allora per vederla basta partire con una x di -160 e
  196. arrivare fino a +160. Poi "spostiamo" il tutto a destra di 160, centrando la
  197. parabola, con un semplice ADD.W #160,d0. -160 diventa 0 e +160 diventa 320.
  198.  
  199.  
  200. In questo esempio abbiamo inserito anche un coefficiente per il quale
  201. moltiplichiamo x*x, ottenendo di poter fare 2 parabole, una piu' "larga"
  202. dell'altra.
  203.  
  204. Una nota finale: per rendere piu' "visibile" e meno tratteggiata la parabola,
  205. viene divisa per 256 la coordinata Y con un LSR #8.
  206.  
  207.     lsr.w    #8,d1        ; dividi per 256 la Y per "allargare"
  208.  
  209. Come sapete, si puo' dividere o moltiplicare per potenze di 2 tramite lsr e
  210. lsl, anche se non e' proprio "uguale" ad un MULU o DIVU. In questo caso
  211. comunque funziona abbastanza...
  212.  
  213. P.S: Da questo listato in avanti la routine PlotPIX sara' senza i megacommenti
  214. dei listati precedenti... e' inutile allungare cosi' i sorgente!
  215.  
  216.