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

  1.  
  2. ; Lezione8n3.s - Routine di stampa di punti (plot), ottimizzata.
  3. ;         Viene usata una tabella per "muovere" un punto. Tasto destro
  4. ;         per far "lasciare la scia" al punto.
  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. LargSchermo    equ    40    ; Larghezza dello schermo in bytes.
  23.  
  24. START:
  25. ;     PUNTIAMO IL NOSTRO BITPLANE
  26.  
  27.     MOVE.L    #BITPLANE,d0
  28.     LEA    BPLPOINTERS,A1
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33. ; PRECALCOLIAMO UNA TABELLA CON I MULTIPLI DI 40, ossia della larghezza dello
  34. ; schermo, per evitare di fare una moltiplicazione per ogni plottaggio.
  35.  
  36.     lea    MulTab,a0    ; Indirizzo spazio di 256 words dove scrivere
  37.                 ; i multipli di 40...
  38.     moveq    #0,d0        ; Iniziamo da 0...
  39.     move.w    #256-1,d7    ; Numero di multipli di 40 necessari
  40. PreCalcLoop
  41.     move.w    d0,(a0)+    ; Salviamo il multiplo attuale
  42.     add.w    #LargSchermo,d0    ; aggiungiamo larghschermo, prossimo multiplo
  43.     dbra    d7,PreCalcLoop    ; Creiamo tutta la MulTab
  44.  
  45. ; Puntiamo la cop...
  46.  
  47.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  48.                     ; e sprites.
  49.  
  50.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  51.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  52.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  53.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  54.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  55.  
  56.     lea    bitplane,a0    ; Indirizzo del bitplane dove stampare in a0
  57.     lea    MulTab,a1    ; Indirizzo della tabella con i multipli della
  58.                 ; largh. schermo precalcolati in a1
  59.  
  60. mouse:
  61.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  62.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  63. Waity1:
  64.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  65.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  66.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  67.     BNE.S    Waity1
  68.  
  69.     bsr.w    LeggiTabelle    ; Legge le posizioni X ed Y dalle tabelle
  70.  
  71.     move.w    MioX(PC),d0    ; coordinata X
  72.     move.w    MioY(PC),d1    ; coordinata Y
  73.  
  74.     bsr.w    PlotPIXP    ; stampa il punto alla coord. X=d0, Y=d1
  75.  
  76.     btst    #2,$16(a5)    ; tasto destro del mouse premuto?
  77.     beq.s    NonCancellare
  78.  
  79.     move.w    MioXold(PC),d0    ; coordinata X vecchia da cancellare
  80.     move.w    MioYold(PC),d1    ; coordinata Y vecchia
  81.  
  82.     bsr.w    ErasePIXP    ; azzera il punto alla coord. X=d0, Y=d1
  83.  
  84. NonCancellare:
  85.     move.w    MioX(PC),MioXold ; prepara le coord del punto che cancelleremo
  86.     move.w    MioY(PC),MioYold ; dopo
  87.  
  88.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  89.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  90. Aspetta:
  91.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  92.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  93.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  94.     BEQ.S    Aspetta
  95.  
  96.     btst    #6,$bfe001    ; mouse premuto?
  97.     bne.s    mouse
  98.     rts            ; esci
  99.  
  100.  
  101.  
  102. MioX:
  103.     dc.w    0
  104. MioY:
  105.     dc.w    0
  106. MioXold:
  107.     dc.w    0
  108. MioYold:
  109.     dc.w    0
  110.  
  111.  
  112. *****************************************************************************
  113. ;        Routine di plot dei punti (dots) ottimizzata
  114. *****************************************************************************
  115.  
  116. ;    Parametri in entrata di PlotPIXP:
  117. ;
  118. ;    a0 = Indirizzo bitplane destinazione
  119. ;    a1 = Indirizzo della tabella con i multipli di 40 precalcolati
  120. ;    d0.w = Coordinata X (0-319)
  121. ;    d1.w = Coordinata Y (0-255)
  122.  
  123. ;        .....
  124. ;      __\ oO/__
  125. ;     / _ \./ _ \
  126. ;    /\/|  "  |\/\
  127. ;    \ \|_____|/ /
  128. ;     \ \_(_)_| /
  129. ;      \\\     \
  130. ;     /   \/    \
  131. ;     \____\____/
  132. ;    (_____\_____)eD
  133. ;
  134.  
  135. PlotPIXP:
  136.     move.w    d0,d2        ; Copia la coordinata X in d2
  137.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  138.                 ; dividendo per 8 la coordinata X.
  139.     add.w    d1,d1        ; Moltiplichiamo la Y per 2, trovando l'offset
  140.     add.w    (a1,d1.w),d0    ; scostamento verticale + offset orizzontale
  141.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X (resto)
  142.     not.w    d2        ; nottati
  143.     bset.b    d2,(a0,d0.w)    ; Setta il bit d2 del byte distante d0 bytes
  144.                 ; dall'inizio dello schermo.
  145.     rts
  146.  
  147. ; Routine che CANCELLA un pixel. Basta sostituire BCLR a BSET.
  148.  
  149. ErasePIXP:
  150.     move.w    d0,d2        ; Copia la coordinata X in d2
  151.     lsr.w    #3,d0        ; Intanto trova l'offset orizzontale,
  152.                 ; dividendo per 8 la coordinata X.
  153.     add.w    d1,d1        ; Moltiplichiamo la Y per 2, trovando l'offset
  154.     add.w    (a1,d1.w),d0    ; scostamento verticale + offset orizzontale
  155.     and.w    #%111,d2    ; Seleziona solo i primi 3 bit di X (resto)
  156.     not.w    d2        ; nottati
  157.     bclr.b    d2,(a0,d0.w)    ; azzera il bit d2 del byte distante d0 bytes
  158.                 ; dall'inizio dello schermo.
  159.     rts
  160.  
  161. *****************************************************************************
  162.  
  163. LeggiTabelle:
  164.     move.l    a0,-(SP)    ; salva a0 nello stack
  165.     ADDQ.L    #1,TABYPOINT     ; Fai puntare al byte successivo
  166.     MOVE.L    TABYPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  167.                  ; copiato in a0
  168.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultimo byte della TAB?
  169.     BNE.S    NOBSTARTY    ; non ancora? allora continua
  170.     MOVE.L    #TABY-1,TABYPOINT ; Riparti a puntare dal primo byte
  171. NOBSTARTY:
  172.     moveq    #0,d0        ; Pulisci d0
  173.     MOVE.b    (A0),d0        ; copia il byte della tabella, cioe` la
  174.                 ; coordinata Y in d0 in modo da farla
  175.                 ; trovare alla routine universale
  176.  
  177.     ADDQ.L    #2,TABXPOINT     ; Fai puntare alla word successiva
  178.     MOVE.L    TABXPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  179.                  ; copiato in a0
  180.     CMP.L    #FINETABX-2,A0  ; Siamo all'ultima word della TAB?
  181.     BNE.S    NOBSTARTX    ; non ancora? allora continua
  182.     MOVE.L    #TABX-2,TABXPOINT ; Riparti a puntare dalla prima word-2
  183. NOBSTARTX:
  184.     moveq    #0,d1        ; azzeriamo d1
  185.     MOVE.w    (A0),d1        ; poniamo il valore della tabella, cioe`
  186.                 ; la coordinata X in d1
  187.     move.w    d0,MioY        ; salva le coordinate
  188.     move.w    d1,MioX
  189.     move.l    (sp)+,a0    ; riprendi a0 dallo stack
  190.     rts
  191.  
  192.  
  193. TABYPOINT:
  194.     dc.l    TABY-1        ; NOTA: i valori della tabella qua sono bytes
  195. TABXPOINT:
  196.     dc.l    TABX-2        ; NOTA: i valori della tabella qua sono word
  197.  
  198. ; Tabella con coordinate Y
  199.  
  200. TABY:
  201.     incbin    "ycoordinatok.tab"    ; 200 valori .B
  202. FINETABY:
  203.  
  204. ; Tabella con coordinate X
  205.  
  206. TABX:
  207.     incbin    "xcoordinatok.tab"    ; 150 valori .W
  208. FINETABX:
  209.  
  210. *****************************************************************************
  211.  
  212.     SECTION    GRAPHIC,DATA_C
  213.  
  214. COPPERLIST:
  215.  
  216.     dc.w    $8E,$2c81    ; DiwStrt
  217.     dc.w    $90,$2cc1    ; DiwStop
  218.     dc.w    $92,$0038    ; DdfStart
  219.     dc.w    $94,$00d0    ; DdfStop
  220.     dc.w    $102,0        ; BplCon1
  221.     dc.w    $104,$24    ; BplCon2 - Tutti gli sprite sopra i bitplane
  222.     dc.w    $108,0        ; Bpl1Mod
  223.     dc.w    $10a,0        ; Bpl2Mod
  224.             ; 5432109876543210
  225.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  226.  
  227. BPLPOINTERS:
  228.     dc.w $e0,0,$e2,0    ;primo     bitplane
  229.  
  230.     dc.w    $0180,$000    ; color0 - SFONDO
  231.     dc.w    $0182,$1af    ; color1 - SCRITTE
  232.  
  233.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  234.  
  235.  
  236. *****************************************************************************
  237.  
  238.     SECTION    MIOPLANE,BSS_C
  239.  
  240. BITPLANE:
  241.     ds.b    40*256    ; un bitplane lowres 320x256
  242.  
  243. ; Tabella che conterra' i multipli della larghezza dello schermo precalcolati
  244. ; per eliminare la moltiplicazione nella routine PlotPIX, aumentando la sua
  245. ; velocita'.
  246.  
  247.     SECTION    Precalc,bss
  248.  
  249. MulTab:
  250.     ds.w    256
  251.  
  252.     end
  253.  
  254. In questo esempio abbiamo semplicemente aggiunto la routine che legge dalle 2
  255. tabelle le cordinate X ed Y, come per gli sprite. Come si puo' vedere e'
  256. utile anche per routines di punti. Facendo tabelle e routines piu' complesse
  257. si possono ottenere onde varie.
  258.  
  259.