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

  1.  
  2. ; Lezione8l.s - Routine di stampa di punti (plot)
  3.  
  4.     Section    dotta,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup1.s"    ; con questo include mi risparmio di
  10.                 ; riscriverla ogni volta!
  11. *****************************************************************************
  12.  
  13.  
  14. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  15.  
  16.         ;5432109876543210
  17. DMASET    EQU    %1000001110000000    ; copper e bitplane DMA abilitati
  18. ;         -----a-bcdefghij
  19.  
  20. START:
  21. ;     PUNTIAMO IL NOSTRO BITPLANE
  22.  
  23.     MOVE.L    #BITPLANE,d0
  24.     LEA    BPLPOINTERS,A1
  25.     move.w    d0,6(a1)
  26.     swap    d0
  27.     move.w    d0,2(a1)
  28.  
  29.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  30.                     ; e sprites.
  31.  
  32.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  33.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  34.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  35.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  36.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  37.  
  38.     lea    bitplane,a0    ; Indirizzo del bitplane dove stampare
  39.  
  40. mouse:
  41.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  42.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  43. Waity1:
  44.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  45.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  46.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  47.     BNE.S    Waity1
  48.  
  49.     move.w    #160,d0        ; Coordinata X
  50.     move.w    #100,d1        ; Coordinata Y
  51.  
  52.     bsr.s    plotPIX        ; stampa il punto alla coord. X=d0, Y=d1
  53.  
  54.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  55.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  56. Aspetta:
  57.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  58.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  59.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  60.     BEQ.S    Aspetta
  61.  
  62.     btst    #6,$bfe001    ; mouse premuto?
  63.     bne.s    mouse
  64. Finito:
  65.     rts            ; esci
  66.  
  67.  
  68. *****************************************************************************
  69. ;            Routine di plot dei punti (dots)
  70. *****************************************************************************
  71.  
  72. ;    Parametri in entrata di PlotPIX:
  73. ;
  74. ;    a0 = Indirizzo bitplane destinazione
  75. ;    d0.w = Coordinata X (0-319)
  76. ;    d1.w = Coordinata Y (0-255)
  77.  
  78. ;           ,..,..,.,
  79. ;       .:¦¾½¾½¾½¾½¾½¾¦.
  80. ;       ¦::·        ·::|
  81. ;       |   ______     |
  82. ;      _|  ¯_______ ___l
  83. ;     / j  /     ¬\_____)
  84. ;    ( C| /    (°  )   ¯|
  85. ;     \_) \_______/  °) ¦
  86. ;       |         ¯\---÷'
  87. ;      _j        C·_)  |
  88. ;     (  _____________ `\
  89. ;      \ \l_l__l_l_l_¡  /
  90. ;       \ \_T_T_T_l_!j /
  91. ;        \__¯ ¯ ¯ ¯ __/ xCz
  92. ;          `--------'
  93.  
  94.  
  95. LargSchermo    equ    40    ; Larghezza dello schermo in bytes.
  96.  
  97. PlotPIX:
  98.     move.w    d0,d2        ; Copia la coordinata X in d2
  99.  
  100.  
  101. ; Troviamo l'offset orizzontale, ossia la X
  102.  
  103.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  104.                 ; dividendo per 8 la coordinata X. Essendo lo
  105.                 ; schermo fatto di bits, sappiamo che una
  106.                 ; linea orizzontale e' larga 320 pixel, ossia
  107.                 ; 320/8=40 bytes. Avendo la coordinata X che
  108.                 ; va da 0 a 320, cioe' in bits, la dobbiamo
  109.                 ; convertire in bytes, dividendola per 8.
  110.                 ; In questo modo abbiamo il byte entro cui
  111.                 ; settare il nostro bit.
  112.  
  113. ; Ora troviamo l'offset verticale, ossia la Y:
  114.  
  115.     mulu.w    #largschermo,d1    ; moltiplica la larghezza di una linea per il
  116.                 ; numero di linee, trovando l'offset
  117.                 ; verticale dall'inizio dello schermo
  118.  
  119. ; Infine troviamo l'offset dall'inizio dello schermo del byte dove si trova il
  120. ; punto (ossia il bit), che setteremo con l'istruzione BSET:
  121.  
  122.     add.w    d1,d0    ; Somma lo scostamento verticale a quello orizzontale
  123.  
  124. ; Ora abbiamo in d0 l'offset, in bytes, dall'inizio dello schermo per trovare
  125. ; il byte dove si trova il punto da settare. Abbiamo quindi da scegliere quale
  126. ; degli 8 bit del byte va settato.
  127.  
  128. ; Ora troviamo quale bit del byte dobbiamo settare:
  129.  
  130.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X, ossia
  131.                 ; l'offset (scostamento) nel byte,
  132.                 ; ricavando in d2 il bit da settare
  133.                 ; (in realta' sarebbe il resto della divisione
  134.                 ;  per 8, fatta in precedenza)
  135.  
  136.     not.w    d2        ; Opportunamente nottato
  137.  
  138. ; Ora abbiamo in d0 l'offset dall'inizio dello schermo per trovare il byte,
  139. ; in d2 il numero di bit da settare all'interno di quel bit, e in a0
  140. ; l'indirizzo del bitplane. Con una sola istruzione possiamo settare il bit:
  141.  
  142.     bset.b    d2,(a0,d0.w)    ; Setta il bit d2 del byte distante d0 bytes
  143.                 ; dall'inizio dello schermo.
  144.     rts            ; Esci.
  145.  
  146. *****************************************************************************
  147.  
  148.     SECTION    GRAPHIC,DATA_C
  149.  
  150. COPPERLIST:
  151.  
  152.     dc.w    $8E,$2c81    ; DiwStrt
  153.     dc.w    $90,$2cc1    ; DiwStop
  154.     dc.w    $92,$0038    ; DdfStart
  155.     dc.w    $94,$00d0    ; DdfStop
  156.     dc.w    $102,0        ; BplCon1
  157.     dc.w    $104,$24    ; BplCon2 - Tutti gli sprite sopra i bitplane
  158.     dc.w    $108,0        ; Bpl1Mod
  159.     dc.w    $10a,0        ; Bpl2Mod
  160.             ; 5432109876543210
  161.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  162.  
  163. BPLPOINTERS:
  164.     dc.w $e0,0,$e2,0    ;primo     bitplane
  165.  
  166.     dc.w    $0180,$000    ; color0 - SFONDO
  167.     dc.w    $0182,$1af    ; color1 - SCRITTE
  168.  
  169.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  170.  
  171.  
  172. *****************************************************************************
  173.  
  174.     SECTION    MIOPLANE,BSS_C
  175.  
  176. BITPLANE:
  177.     ds.b    40*256    ; un bitplane lowres 320x256
  178.  
  179.     end
  180.  
  181. Ecco una semplice routine per stampare dei punti sullo schermo. Provate a
  182. cambiare le cordinate X e Y. Dovete ricordarvi che la coordinata 0,0 e' 
  183. l'angolo in alto a sinistra, per cui 320,256 e' l'angolo in basso a destra.
  184. Il sistema di assi cartesiani ha la posizione 0,0 in basso a sinistra, per
  185. cui la Y e' invertita rispetto a tale riferimento. Se proprio si volesse fare
  186. in modo che 0,0 fosse in basso a destra basterebbero poche modifiche: partire
  187. dalla fine del bitplane e "tornare indietro" anziche' avanzare.
  188.  
  189.