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

  1.  
  2. ; Lezione8m2.s - Routine di stampa di punti (plot), usata in un loop per
  3. ;         fare delle linee.
  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    CalcolaLinea
  52.  
  53.     move.w    Miox(PC),d0    ; Coord. X
  54.     move.w    Mioy(PC),d1    ; Coord  Y
  55.  
  56.     bsr.s    plotPIX        ; stampa il punto alla coord. X=d0, Y=d1
  57.  
  58.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  59.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  60. Aspetta:
  61.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  62.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  63.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  64.     BEQ.S    Aspetta
  65.  
  66.     btst    #6,$bfe001    ; mouse premuto?
  67.     bne.s    mouse
  68. Finito:
  69.     btst    #6,$bfe001    ; mouse premuto?
  70.     bne.s    Finito
  71.     rts            ; esci
  72.  
  73. ;                  _ _
  74. ;      __      /\_///_
  75. ;    _(__)_   //\\\X/\\
  76. ;    \     \    / _ _\\\
  77. ;     \     \__/ (°u°)\¯
  78. ;      \      / ______ \__
  79. ;       \___  \_\____/_/ ¬\
  80. ;         T    `------'_   \
  81. ;         |            /    \
  82. ;         l_       ___/      )
  83. ;          l______ \        /
  84. ;           /     ¦¯\      /
  85. ;          /    _/`--\____/
  86. ;         (_     \     /
  87. ;         _\______\ , /
  88. ;        (_______)   / xCz
  89. ;            /_______\_
  90. ;              (_______)    
  91.  
  92. ;    Y=m*x, o meglio m*x=y, ossia Coeff*d0=d1
  93.  
  94. CalcolaLinea:
  95.     Addq.W    #1,Miox        ; Incrementa la X
  96.     move.w    Miox(PC),d1
  97.     Mulu.w    Coeff(PC),d1    ; y=m*x
  98.     cmp.w    #255,d1        ; siamo in fondo allo schermo??
  99.     blo.s    NonFinito
  100.     addq.w    #1,Coeff    ; Aggiungi 1 al coefficiente angolare
  101.     cmp.w    #8,Coeff    ; Abbiamo gia' fatto 7 linee?
  102.     beq.s    Finito        ; Se si, usciamo!
  103.     clr.w    Miox        ; E riparti da 0 per la nuova linea con
  104.                 ; diversa inclinazione
  105.     moveq    #0,d1
  106. NonFinito:
  107.     move.w    d1,MioY
  108.     rts
  109.  
  110. MioX:
  111.     dc.w    0
  112. MioY:
  113.     dc.w    0
  114.  
  115. Coeff:
  116.     dc.w    1
  117.  
  118. *****************************************************************************
  119. ;            Routine di plot dei punti (dots)
  120. *****************************************************************************
  121.  
  122. ;    Parametri in entrata di PlotPIX:
  123. ;
  124. ;    a0 = Indirizzo bitplane destinazione
  125. ;    d0.w = Coordinata X (0-319)
  126. ;    d1.w = Coordinata Y (0-255)
  127.  
  128. LargSchermo    equ    40    ; Larghezza dello schermo in bytes.
  129.  
  130. PlotPIX:
  131.     move.w    d0,d2        ; Copia la coordinata X in d2
  132.  
  133.  
  134. ; Troviamo l'offset orizzontale, ossia la X
  135.  
  136.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  137.                 ; dividendo per 8 la coordinata X. Essendo lo
  138.                 ; schermo fatto di bits, sappiamo che una
  139.                 ; linea orizzontale e' larga 320 pixel, ossia
  140.                 ; 320/8=40 bytes. Avendo la coordinata X che
  141.                 ; va da 0 a 320, cioe' in bits, la dobbiamo
  142.                 ; convertire in bytes, dividendola per 8.
  143.                 ; In questo modo abbiamo il byte entro cui
  144.                 ; settare il nostro bit.
  145.  
  146. ; Ora troviamo l'offset verticale, ossia la Y:
  147.  
  148.     mulu.w    #largschermo,d1    ; moltiplica la larghezza di una linea per il
  149.                 ; numero di linee, trovando l'offset
  150.                 ; verticale dall'inizio dello schermo
  151.  
  152. ; Infine troviamo l'offset dall'inizio dello schermo del byte dove si trova il
  153. ; punto (ossia il bit), che setteremo con l'istruzione BSET:
  154.  
  155.     add.w    d1,d0    ; Somma lo scostamento verticale a quello orizzontale
  156.  
  157. ; Ora abbiamo in d0 l'offset, in bytes, dall'inizio dello schermo per trovare
  158. ; il byte dove si trova il punto da settare. Abbiamo quindi da scegliere quale
  159. ; degli 8 bit del byte va settato.
  160.  
  161. ; Ora troviamo quale bit del byte dobbiamo settare:
  162.  
  163.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X, ossia
  164.                 ; l'offset (scostamento) nel byte,
  165.                 ; ricavando in d2 il bit da settare
  166.                 ; (in realta' sarebbe il resto della divisione
  167.                 ;  per 8, fatta in precedenza)
  168.  
  169.     not.w    d2        ; opportunamente nottato
  170.  
  171. ; Ora abbiamo in d0 l'offset dall'inizio dello schermo per trovare il byte,
  172. ; in d2 il numero di bit da settare all'interno di quel bit, e in a0
  173. ; l'indirizzo del bitplane. Con una sola istruzione possiamo settare il bit:
  174.  
  175.     bset.b    d2,(a0,d0.w)    ; Setta il bit d2 del byte distante d0 bytes
  176.                 ; dall'inizio dello schermo.
  177.     rts            ; Esci.
  178.  
  179. *****************************************************************************
  180.  
  181.     SECTION    GRAPHIC,DATA_C
  182.  
  183. COPPERLIST:
  184.  
  185.     dc.w    $8E,$2c81    ; DiwStrt
  186.     dc.w    $90,$2cc1    ; DiwStop
  187.     dc.w    $92,$0038    ; DdfStart
  188.     dc.w    $94,$00d0    ; DdfStop
  189.     dc.w    $102,0        ; BplCon1
  190.     dc.w    $104,$24    ; BplCon2 - Tutti gli sprite sopra i bitplane
  191.     dc.w    $108,0        ; Bpl1Mod
  192.     dc.w    $10a,0        ; Bpl2Mod
  193.             ; 5432109876543210
  194.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  195.  
  196. BPLPOINTERS:
  197.     dc.w $e0,0,$e2,0    ;primo     bitplane
  198.  
  199.     dc.w    $0180,$000    ; color0 - SFONDO
  200.     dc.w    $0182,$1af    ; color1 - SCRITTE
  201.  
  202.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  203.  
  204.  
  205. *****************************************************************************
  206.  
  207.     SECTION    MIOPLANE,BSS_C
  208.  
  209. BITPLANE:
  210.     ds.b    40*256    ; un bitplane lowres 320x256
  211.  
  212.     end
  213.  
  214. In questo esempio il loop che fa una linea e' inserito in un altro loop per
  215. fare varie linee cambiando il coefficiente angolare, che ora e' una word su
  216. cui nessuno vieta di fare un "ADDQ".
  217.  
  218.