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

  1.  
  2. ; Lezione8m3.s - Routine di stampa di punti (plot), usata in un loop per
  3. ;         calcolare y=x*x, ossia una curva simile a quella prodotta
  4. ;         dalla caduta di un sasso in una frana (parabola!)
  5.  
  6.     Section    dotta,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup1.s"    ; con questo include mi risparmio di
  12.                 ; riscriverla ogni volta!
  13. *****************************************************************************
  14.  
  15.  
  16. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  17.  
  18.         ;5432109876543210
  19. DMASET    EQU    %1000001110000000    ; copper e bitplane DMA abilitati
  20. ;         -----a-bcdefghij
  21.  
  22.  
  23. START:
  24. ;     PUNTIAMO IL NOSTRO BITPLANE
  25.  
  26.     MOVE.L    #BITPLANE,d0
  27.     LEA    BPLPOINTERS,A1
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.  
  32.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  33.                     ; e sprites.
  34.  
  35.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  36.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  37.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  38.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  39.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  40.  
  41.     lea    bitplane,a0    ; Indirizzo del bitplane dove stampare
  42.  
  43. mouse:
  44.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  45.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  46. Waity1:
  47.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  48.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  49.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  50.     BNE.S    Waity1
  51.  
  52.     bsr.s    CalcolaPotenza    ; y=x*x
  53.  
  54.     move.w    Miox(PC),d0    ; Coord. X
  55.     move.w    Mioy(PC),d1    ; Coord  Y
  56.  
  57.     bsr.s    plotPIX        ; stampa il punto alla coord. X=d0, Y=d1
  58.  
  59.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  60.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  61. Aspetta:
  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.     BEQ.S    Aspetta
  66.  
  67.     btst    #6,$bfe001    ; mouse premuto?
  68.     bne.s    mouse
  69. Finito:
  70.     btst    #6,$bfe001    ; mouse premuto?
  71.     bne.s    Finito
  72.     rts            ; esci
  73.  
  74. ;     _.--._     _ 
  75. ;    |   _ .|   (_)
  76. ;    |   \__|   ||
  77. ;    |______|   ||
  78. ;    .-`--'-.   ||
  79. ;    | | |  |\__l|
  80. ;    |_| |__|__|_))
  81. ;     ||_| |    ||
  82. ;     |(_) |
  83. ;     |    |
  84. ;     |____|__
  85. ;     |______/g®m
  86.  
  87. ;    Y=x*x, d0*d0=d1
  88.  
  89. CalcolaPotenza:
  90.     Addq.W    #1,Miox        ; Incrementa la X
  91.     move.w    Miox(PC),d1
  92.     Mulu.w    d1,d1        ; y=m*x
  93.     lsr.w    #3,d1        ; allarghiamo un po' la parabbola
  94.     cmp.w    #255,d1        ; siamo in fondo allo schermo??
  95.     blo.s    NonFinito
  96.     bra.s    Finito        ; Se si, usciamo!
  97.     addq.w    #1,Coeff    ; Aggiungi 1 al coefficiente angolare
  98.     cmp.w    #80,Coeff    ; Abbiamo gia' fatto 39 linee?
  99. NonFinito:
  100.     move.w    d1,MioY
  101.     rts
  102.  
  103. MioX:
  104.     dc.w    0
  105. MioY:
  106.     dc.w    0
  107. Coeff:
  108.     dc.w    1
  109.  
  110. *****************************************************************************
  111. ;            Routine di plot dei punti (dots)
  112. *****************************************************************************
  113.  
  114. ;    Parametri in entrata di PlotPIX:
  115. ;
  116. ;    a0 = Indirizzo bitplane destinazione
  117. ;    d0.w = Coordinata X (0-319)
  118. ;    d1.w = Coordinata Y (0-255)
  119.  
  120. LargSchermo    equ    40    ; Larghezza dello schermo in bytes.
  121.  
  122. PlotPIX:
  123.     move.w    d0,d2        ; Copia la coordinata X in d2
  124.  
  125.  
  126. ; Troviamo l'offset orizzontale, ossia la X
  127.  
  128.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  129.                 ; dividendo per 8 la coordinata X. Essendo lo
  130.                 ; schermo fatto di bits, sappiamo che una
  131.                 ; linea orizzontale e' larga 320 pixel, ossia
  132.                 ; 320/8=40 bytes. Avendo la coordinata X che
  133.                 ; va da 0 a 320, cioe' in bits, la dobbiamo
  134.                 ; convertire in bytes, dividendola per 8.
  135.                 ; In questo modo abbiamo il byte entro cui
  136.                 ; settare il nostro bit.
  137.  
  138. ; Ora troviamo l'offset verticale, ossia la Y:
  139.  
  140.     mulu.w    #largschermo,d1    ; moltiplica la larghezza di una linea per il
  141.                 ; numero di linee, trovando l'offset
  142.                 ; verticale dall'inizio dello schermo
  143.  
  144. ; Infine troviamo l'offset dall'inizio dello schermo del byte dove si trova il
  145. ; punto (ossia il bit), che setteremo con l'istruzione BSET:
  146.  
  147.     add.w    d1,d0    ; Somma lo scostamento verticale a quello orizzontale
  148.  
  149. ; Ora abbiamo in d0 l'offset, in bytes, dall'inizio dello schermo per trovare
  150. ; il byte dove si trova il punto da settare. Abbiamo quindi da scegliere quale
  151. ; degli 8 bit del byte va settato.
  152.  
  153. ; Ora troviamo quale bit del byte dobbiamo settare:
  154.  
  155.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X, ossia
  156.                 ; l'offset (scostamento) nel byte,
  157.                 ; ricavando in d2 il bit da settare
  158.                 ; (in realta' sarebbe il resto della divisione
  159.                 ;  per 8, fatta in precedenza)
  160.  
  161.     not.w    d2        ; opportunamente nottato
  162.  
  163. ; Ora abbiamo in d0 l'offset dall'inizio dello schermo per trovare il byte,
  164. ; in d2 il numero di bit da settare all'interno di quel bit, e in a0
  165. ; l'indirizzo del bitplane. Con una sola istruzione possiamo settare il bit:
  166.  
  167.     bset.b    d2,(a0,d0.w)    ; Setta il bit d2 del byte distante d0 bytes
  168.                 ; dall'inizio dello schermo.
  169.     rts            ; Esci.
  170.  
  171. *****************************************************************************
  172.  
  173.     SECTION    GRAPHIC,DATA_C
  174.  
  175. COPPERLIST:
  176.  
  177.     dc.w    $8E,$2c81    ; DiwStrt
  178.     dc.w    $90,$2cc1    ; DiwStop
  179.     dc.w    $92,$0038    ; DdfStart
  180.     dc.w    $94,$00d0    ; DdfStop
  181.     dc.w    $102,0        ; BplCon1
  182.     dc.w    $104,$24    ; BplCon2 - Tutti gli sprite sopra i bitplane
  183.     dc.w    $108,0        ; Bpl1Mod
  184.     dc.w    $10a,0        ; Bpl2Mod
  185.             ; 5432109876543210
  186.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  187.  
  188. BPLPOINTERS:
  189.     dc.w $e0,0,$e2,0    ;primo     bitplane
  190.  
  191.     dc.w    $0180,$000    ; color0 - SFONDO
  192.     dc.w    $0182,$1af    ; color1 - SCRITTE
  193.  
  194.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  195.  
  196.  
  197. *****************************************************************************
  198.  
  199.     SECTION    MIOPLANE,BSS_C
  200.  
  201. BITPLANE:
  202.     ds.b    40*256    ; un bitplane lowres 320x256
  203.  
  204.     end
  205.  
  206. Con questa variante si puo' ammirare una cosa del genere:
  207.  
  208. *
  209.  *
  210.  
  211.   *
  212.  
  213.  
  214.    *
  215.  
  216.  
  217.  
  218.  
  219.     *
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.       *
  227.  
  228.  
  229. Purtroppo lavoriamo solo con i numeri interi, e non sono disponibili i pixel
  230. tra un punto e l'altro, che sono frazionari. Comunque meglio di niente!
  231. Questo tipo di curva e' ottenuto assegnando il valore della y come la
  232. elevazione al quadrato della x. In questo modo abbiamo:
  233.  
  234. X = 0    -> Y=X*X, ossia 0*0, ossia 0
  235. X = 1    -> Y= 1*1, ossia 1
  236. X = 2    -> Y= 2*2, ossia 4
  237. X = 3    -> Y= 3*3, ossia 9
  238. X = 4    -> Y= 4*4, ossia 16
  239. X = 5    -> Y= 5*5, ossia 25
  240.  
  241. Esponenzialmente (exp) la Y aumenta rispetto alla X.
  242.  
  243.