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

  1.  
  2. ; Lezione8m.s - Routine di stampa di punti (plot), usata in un loop per
  3. ;        fare una linea.
  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. Coeff    equ    1    ; Coefficiente angolare, m
  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. ;    Y=m*x, o meglio m*x=y, ossia Coeff*d0=d1
  53.  
  54.     Addq.W    #1,Miox        ; Incrementa la X
  55.     move.w    Miox(PC),d1
  56.     Mulu.w    #Coeff,d1    ; Y=m*x
  57.     cmp.w    #255,d1        ; siamo in fondo allo schermo??
  58.     bhi.s    Finito
  59.     move.w    Miox(PC),d0    ; X
  60.  
  61.     bsr.s    plotPIX        ; stampa il punto alla coord. X=d0, Y=d1
  62.  
  63.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  64.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  65. Aspetta:
  66.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  67.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  68.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  69.     BEQ.S    Aspetta
  70.  
  71.     btst    #6,$bfe001    ; mouse premuto?
  72.     bne.s    mouse
  73. Finito:
  74.     btst    #6,$bfe001    ; mouse premuto?
  75.     bne.s    Finito
  76.     rts            ; esci
  77.  
  78. MioX:
  79.     dc.w    0
  80.  
  81. *****************************************************************************
  82. ;            Routine di plot dei punti (dots)
  83. *****************************************************************************
  84.  
  85. ;    Parametri in entrata di PlotPIX:
  86. ;
  87. ;    a0 = Indirizzo bitplane destinazione
  88. ;    d0.w = Coordinata X (0-319)
  89. ;    d1.w = Coordinata Y (0-255)
  90.  
  91. LargSchermo    equ    40    ; Larghezza dello schermo in bytes.
  92.  
  93. ;         _____
  94. ;        / ¯¬~°\
  95. ;      _/ \   / \_
  96. ;     (/_(¯\ /¯)_\)
  97. ;     / / ¯° °¯ \ \
  98. ;    /  __(___)__  \
  99. ;    \ (l_T_|_T_|) /
  100. ;     \ \_T_T_T_/ /
  101. ;      \_ ¯ ¯ ¯ _/ xCz
  102. ;       `-------'
  103.  
  104. PlotPIX:
  105.     move.w    d0,d2        ; Copia la coordinata X in d2
  106.  
  107.  
  108. ; Troviamo l'offset orizzontale, ossia la X
  109.  
  110.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  111.                 ; dividendo per 8 la coordinata X. Essendo lo
  112.                 ; schermo fatto di bits, sappiamo che una
  113.                 ; linea orizzontale e' larga 320 pixel, ossia
  114.                 ; 320/8=40 bytes. Avendo la coordinata X che
  115.                 ; va da 0 a 320, cioe' in bits, la dobbiamo
  116.                 ; convertire in bytes, dividendola per 8.
  117.                 ; In questo modo abbiamo il byte entro cui
  118.                 ; settare il nostro bit.
  119.  
  120. ; Ora troviamo l'offset verticale, ossia la Y:
  121.  
  122.     mulu.w    #largschermo,d1    ; moltiplica la larghezza di una linea per il
  123.                 ; numero di linee, trovando l'offset
  124.                 ; verticale dall'inizio dello schermo
  125.  
  126. ; Infine troviamo l'offset dall'inizio dello schermo del byte dove si trova il
  127. ; punto (ossia il bit), che setteremo con l'istruzione BSET:
  128.  
  129.     add.w    d1,d0    ; Somma lo scostamento verticale a quello orizzontale
  130.  
  131. ; Ora abbiamo in d0 l'offset, in bytes, dall'inizio dello schermo per trovare
  132. ; il byte dove si trova il punto da settare. Abbiamo quindi da scegliere quale
  133. ; degli 8 bit del byte va settato.
  134.  
  135. ; Ora troviamo quale bit del byte dobbiamo settare:
  136.  
  137.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X, ossia
  138.                 ; l'offset (scostamento) nel byte,
  139.                 ; ricavando in d2 il bit da settare
  140.                 ; (in realta' sarebbe il resto della divisione
  141.                 ;  per 8, fatta in precedenza)
  142.  
  143.     not.w    d2        ; opportunamente nottato
  144.  
  145. ; Ora abbiamo in d0 l'offset dall'inizio dello schermo per trovare il byte,
  146. ; in d2 il numero di bit da settare all'interno di quel bit, e in a0
  147. ; l'indirizzo del bitplane. Con una sola istruzione possiamo settare il bit:
  148.  
  149.     bset.b    d2,(a0,d0.w)    ; Setta il bit d2 del byte distante d0 bytes
  150.                 ; dall'inizio dello schermo.
  151.     rts            ; Esci.
  152.  
  153. *****************************************************************************
  154.  
  155.     SECTION    GRAPHIC,DATA_C
  156.  
  157. COPPERLIST:
  158.  
  159.     dc.w    $8E,$2c81    ; DiwStrt
  160.     dc.w    $90,$2cc1    ; DiwStop
  161.     dc.w    $92,$0038    ; DdfStart
  162.     dc.w    $94,$00d0    ; DdfStop
  163.     dc.w    $102,0        ; BplCon1
  164.     dc.w    $104,$24    ; BplCon2 - Tutti gli sprite sopra i bitplane
  165.     dc.w    $108,0        ; Bpl1Mod
  166.     dc.w    $10a,0        ; Bpl2Mod
  167.             ; 5432109876543210
  168.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  169.  
  170. BPLPOINTERS:
  171.     dc.w $e0,0,$e2,0    ;primo     bitplane
  172.  
  173.     dc.w    $0180,$000    ; color0 - SFONDO
  174.     dc.w    $0182,$1af    ; color1 - SCRITTE
  175.  
  176.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  177.  
  178.  
  179. *****************************************************************************
  180.  
  181.     SECTION    MIOPLANE,BSS_C
  182.  
  183. BITPLANE:
  184.     ds.b    40*256    ; un bitplane lowres 320x256
  185.  
  186.     end
  187.  
  188. Con un loop facciamo una linea. Sappiamo che la "formula" di una linea e'
  189. y=m*x, dove m e' un numero, detto coefficiente angolare, che determina tra
  190. l'altro l'inclinazione della retta stessa. Per chi fosse azzerato con la
  191. matematica, ecco in brevis cosa succede: se abbiamo che X e' 0, la Y la
  192. ricaviamo moltiplicando la X per m, che qua e' definito con un EQU all'inizio
  193. del listato. Supponiamo che Coeff sia = 1:
  194.  
  195. X = 0    -> Y=Coeff*X, ossia 1*0, ossia 0
  196.  
  197. Dunque, X=0 e Y=0
  198.  
  199. Nel loop incrementiamo di 1 la X. ecco cosa succede al prossimo loop:
  200.  
  201. X = 1    -> Y= 1*1, ossia 1
  202.  
  203. poi...
  204.  
  205. X = 2    -> Y=2
  206.  
  207. Insomma, la Y e' sempre uguale alla X, perche' la moltiplichiamo per Coeff=1.
  208. Da cio' ne deriva la seguente linea:
  209.  
  210. 11
  211.   22
  212.     33
  213.       44
  214.     55
  215.       66
  216.         77
  217.           88
  218.         ...
  219.  
  220. Chiaro perche' e' a 45 gradi??? Provate a cambiare il Coeff mettendo, ad
  221. esempio, 2. In questo caso ecco cosa succede:
  222.  
  223. X = 0    -> Y=Coeff*X, ossia 2*0, ossia 0
  224. X = 1    -> Y= 2*1, ossia 2
  225. X = 2    -> Y= 2*2, ossia 4
  226. X = 3    -> Y= 2*3, ossia 6
  227. X = 4    -> Y= 2*4, ossia 8
  228. X = 5    -> Y= 2*5, ossia 10
  229.  
  230. La linea che ne risulta, sara':
  231.  
  232. 12
  233.  
  234.  24
  235.  
  236.   36
  237.  
  238.    48
  239.  
  240.     510
  241.  
  242.  
  243. Ossia piu' verso sinistra, e non continua. ci sono dei "buchi" tra un punto e
  244. l'altro perche' operiamo solo con i numeri interi, e i valori, per esempio,
  245. tra 2 e 3 lasciano il "vuoto". Vedremo piu' avanti che ci sono molti modi per
  246. usare numeri in "virgola mobile emulata" anche senza coprocessori matematici,
  247. per esempio per fare calcoli in 3d.
  248.  
  249.