home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti5 / lezione9g3.s < prev    next >
Text File  |  1995-10-23  |  10KB  |  284 lines

  1.  
  2. ; Lezione9g3.s    Ancora le mattonelle, stavolta pero` con lo schermo INTERLEAVED
  3. ;        La temporizzazione col Wblank fa in modo che venga
  4. ;        blittata solo una FILA per fotogramma.
  5. ;        Tasto sinistro per uscire.
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  10.  
  11. *****************************************************************************
  12.     include    "startup1.s"    ; Salva Copperlist Etc.
  13. *****************************************************************************
  14.  
  15.         ;5432109876543210
  16. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  17.  
  18.  
  19. START:
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     MOVEQ    #2-1,D1        ; numero di bitplanes (qua sono 2)
  23. POINTBP:
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.     swap    d0
  28.                 ; QUI C'E` LA UNA DIFFERENZA RISPETTO
  29.                 ; ALLE IMMAGINI NORMALI!!!!!!
  30.     ADD.L    #40,d0        ; + LUNGHEZZA DI UNA RIGA !!!!!
  31.     addq.w    #8,a1
  32.     dbra    d1,POINTBP
  33.  
  34.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  35.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  36.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  37.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  38.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  39.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  40.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  41.  
  42.     bsr.s    fillmem        ; esegui la routine di "piastrellatura"
  43.  
  44. mouse2:
  45.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  46.     bne.s    mouse2        ; se no, torna a mouse2:
  47.  
  48.     rts
  49.  
  50. *****************************************************************************
  51. ; Routine che esegue la piastrellatura
  52. *****************************************************************************
  53.  
  54. ;        ________
  55. ;       (___  ___)
  56. ;      (¡ (°)(°) ¡)
  57. ;      `| ¯(··)¯ |'
  58. ;       |  /¬¬\  | xCz
  59. ;       l__¯¯¯¯__!
  60. ;      ___T¯¯¯¯T___
  61. ;     /   `----'  ¬\
  62. ;    ·              ·
  63.  
  64. fillmem:
  65.     lea    Bitplane,a0    ; bitplanes
  66.     lea    gfxdata,a3    ; ind. figura
  67.  
  68.     btst    #6,2(a5) ; dmaconr
  69. WBlit1:
  70.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  71.     bne.s    wblit1
  72.  
  73.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM e BLTALWM li spieghiamo dopo
  74.     move.w    #0,$64(a5)        ; BLTAMOD = 0
  75.     move.w    #38,$66(a5)        ; BLTDMOD (40-2=38), infatti ogni
  76.                     ; "mattonella" e' larga 16 pixel,
  77.                     ; cioe' 2 bytes, che dobbiamo togliere
  78.                     ; alla larghezza totale di una linea,
  79.                     ; cioe' 40, e il risultato e' 40-2=38!
  80.     move.w    #$0000,$42(a5)        ; BLTCON1 - lo spiegheremo dopo
  81.     move.w    #$09f0,$40(a5)        ; BLTCON0 (usa A+D)
  82.  
  83.     moveq    #16-1,d7        ; 16 file di blocchi per arrivare
  84.                     ; verticalmente fino in fondo, infatti
  85.                     ; le mattonelle sono alte 15 pixel,
  86.                     ; piu' 1 di "spaziatura" tra una e
  87.                     ; l'altra, sotto ognuna, fa un
  88.                     ; ingombro di 16 pixel per piastrella,
  89.                     ; dunque 256/16=16 mattonelle.
  90. FaiTutteLeRighe:
  91.     moveq    #20-1,d6        ; 20 blocchi per linea (fila), infatti,
  92.                     ; essendo le mattonelle larghe 16
  93.                     ; pixel, cioe' 2 bytes, ne deriva che
  94.                     ; ce ne possono stare 320/16=20 per
  95.                     ; linea orizzontale.
  96.  
  97. ; aspetta il vblank una volta ogni riga disegnata.
  98. WaitWblank:
  99.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  100.     MOVE.L    #$10800,d2    ; linea da aspettare = $108
  101. Waity1:
  102.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  103.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  104.     CMPI.L    D2,D0        ; aspetta la linea $108
  105.     BNE.S    Waity1
  106. Waity2:
  107.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  108.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  109.     CMPI.L    D2,D0        ; aspetta la linea $108
  110.     Beq.S    Waity2
  111.  
  112. FaiUnaRigaLoop:
  113.  
  114. ; Blitta il primo bitplane di una mattonella
  115.  
  116.     move.l    a0,$54(a5)        ; BLTDPT - destinazione (bitpl 1)
  117.     move.l    a3,$50(a5)        ; BLTAPT - sorgente (fig1)
  118.     move.w    #(2*15*64)+1,$58(a5)    ; BLTSIZE - altezza: 2 planes
  119.                     ; alti 15 righe
  120.                     ; larghezza 1 word
  121.  
  122.     btst    #6,2(a5) ; dmaconr
  123. WBlit2:
  124.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  125.     bne.s    wblit2
  126.  
  127.  
  128.     addq.w    #2,a0    ; salta 1 word (16 pixel) nel bitplane 1, scattando
  129.             ; in "avanti" per la prossima mattonella
  130.     dbra    d6,FaiUnaRigaLoop    ; e cicla fino a che non sono state
  131.                     ; blittate tutte le 20 mattonelle
  132.                     ; di una riga.
  133.  
  134.     lea    40+2*15*40(a0),a0
  135.                 ; A forza di ADDQ #2,A0, abbiamo incrementato
  136.                 ; il puntatore a0 fino a superare l'ultima word
  137.                 ; della riga 0, plane 1. Quindi siamo arrivati
  138.                 ; alla prima word della riga 0, plane 2.
  139.                 ; Ora ci vogliamo spostare alla prima word
  140.                 ; della riga 16, plane 1. Dobbiamo quindi
  141.                 ; sommare ad A0: 40 per spostarci sulla prima
  142.                 ; word della riga 1, plane 1 e poi 2*15*40
  143.                 ; per spostarci dove vogliamo.
  144.  
  145.     dbra    d7,FaiTutteLeRighe    ; fai tutte le 16 righe
  146.      rts
  147.  
  148. *****************************************************************************
  149.  
  150.     SECTION    GRAPHIC,DATA_C
  151.  
  152. COPPERLIST:
  153.     dc.w    $8E,$2c81    ; DiwStrt
  154.     dc.w    $90,$2cc1    ; DiwStop
  155.     dc.w    $92,$38        ; DdfStart
  156.     dc.w    $94,$d0        ; DdfStop
  157.     dc.w    $102,0        ; BplCon1
  158.     dc.w    $104,0        ; BplCon2
  159.  
  160.                 ; QUI C'E` UNA DIFFERENZA RISPETTO
  161.                 ; ALLE IMMAGINI NORMALI!!!!!!
  162.     dc.w    $108,40        ; VALORE MODULO = 2*20*(2-1)= 40
  163.     dc.w    $10a,40        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  164.  
  165.     dc.w    $100,$2200    ; bplcon0 - 3 bitplanes lowres
  166.  
  167. BPLPOINTERS:
  168.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  169.     dc.w $e4,$0000,$e6,$0000
  170.  
  171.     dc.w $180,$000    ; Color0
  172.     dc.w $182,$FED    ; Color1
  173.     dc.w $184,$33a    ; Color2
  174.     dc.w $186,$888    ; Color3
  175.  
  176.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  177.  
  178. ;    Figura, composta da 2 biplanes. larghezza = 1 word, altezza = 15 linee
  179.  
  180. **************************************************************************
  181. ; Figura della mattonella
  182.  
  183. ; Si tratta della stessa figura dell'esempio lezioine9f3.s solo che li`
  184. ; era in formato normale. Per metterla in formato interleaved sono state
  185. ; "mischiate" le righe.
  186.  
  187. gfxdata:
  188.     dc.w    %1111111111111100    ; riga 0, plane 1
  189.     dc.w    %0000000000000010    ; riga 0, plane 2
  190.     dc.w    %1111111111111100    ; riga 1, plane 1
  191.     dc.w    %0111111111111110    ; riga 1, plane 2
  192.     dc.w    %1100000000001100    ; riga 3, plane 1
  193.     dc.w    %0111111111110110    ; riga 3, plane 2
  194.     dc.w    %1101111111111100
  195.     dc.w    %0111111111110110
  196.     dc.w    %1101111111111100
  197.     dc.w    %0111000000010110
  198.     dc.w    %1101111111011100
  199.     dc.w    %0111011111110110
  200.     dc.w    %1101110011011100
  201.     dc.w    %0111011101110110
  202.     dc.w    %1101110111011100
  203.     dc.w    %0111011101110110
  204.     dc.w    %1101111111011100
  205.     dc.w    %0111010001110110
  206.     dc.w    %1101111111011100
  207.     dc.w    %0111011111110110
  208.     dc.w    %1101100000011100
  209.     dc.w    %0111011111110110
  210.     dc.w    %1101111111111100
  211.     dc.w    %0111111111110110
  212.     dc.w    %1111111111111100
  213.     dc.w    %0100000000000110
  214.     dc.w    %1111111111111100
  215.     dc.w    %0111111111111110
  216.     dc.w    %0000000000000000    ; riga 15, plane 1
  217.     dc.w    %1111111111111110    ; riga 15, plane 2
  218.  
  219. *****************************************************************************
  220.  
  221.     section    gnippi,bss_C
  222.  
  223. bitplane:
  224.         ds.b    2*40*256    ; 2 bitplanes
  225.  
  226.     end
  227.  
  228. *****************************************************************************
  229.  
  230. In questo esempio ritroviamo le mattonelle, stavolta in formato interleaved.
  231. Come prima cosa notate come viene disposta in memoria la figura della
  232. mattonella. Nell'esempio lezione9f3.s avevamo i 2 bitplanes separati.
  233. Qui invece le righe sono mescolate tra loro.
  234. Per quanto riguarda la routine, le mattonelle vengono copiate con una sola
  235. blittata, mentre in lezione9f3.s dovevamo fare una blittata per ogni bitplane.
  236. L'altezza della blittata e` pari al prodotto dell'altezza della figura
  237. (15 linee) per il numero di bitplanes (2), come abbiamo spiegato nella lezione.
  238. Anche il calcolo dell' indirizzo destinazione e` (naturalmente) diverso
  239. (la sorgente e` fissa e pertanto resta sempre uguale). Le mattonelle sulla
  240. stessa riga si trovano distanziate sempre di una word, come e` logico visto
  241. che l'interleaved si differenzia solo per la disposizione delle righe.
  242. La differenza si trova dopo il loop interno, quando siamo arrivati alla fine
  243. di una fila orizzontale di mattonelle e dobbiamo iniziare la seguente.
  244. Se indichiamo con Y la riga alla quale iniziamo a blittare, dobbiamo spostarci
  245. alla riga Y+16.
  246. Nel loop interno, aumentiamo il puntatore di 2 ogni volta, spostandoci in tal
  247. modo di una word verso destra. Alla fine del loop ci troviamo subito dopo
  248. l'ultima word della riga attuale, cioe` sulla prima word del plane 2
  249. della riga Y. Per prima cosa dobbiamo spostarci sul plane 1 della riga Y+1,
  250. aggiungendo 40 (numero di bytes occupati da UN plane di UNA riga).
  251. A questo punto dobbiamo scendere di altre 15 righe.
  252. Poiche` un plane di una riga occupa 40 bytes, e noi abbiamo 2 planes per ogni
  253. riga, dobbiamo aggiungere 2*15*40.
  254. Naturalmente, possiamo aggiungere in una volta sola entrambe le quantita`
  255. facendo una LEA 40+15*2*40(A1),A1.
  256.  
  257. Riassumiamo la situazione con la seguente figura:
  258.  
  259. - All'inizio del loop interno il puntatore punta la word indicata con (0).
  260. - Alla fine del loop interno il puntatore punta la word indicata con (1).
  261. - Aggiungendo 40 il puntatore punta la word indicata con (2).
  262. - Aggiungendo 2*40*15 ci spostiamo in basso di 15 righe e il puntatore punta
  263.   la word indicata con (3) che e` la word che volevamo.
  264.   (tra una riga e l'altra ci sono 2*40 bytes; se avessimo aggiunto solo 2*40
  265.    ci saremmo spostati dalla word (2) alla word (2')).
  266.  
  267. riga Y     plane 1    | (0)  |      |      |    . . .   |      |
  268. riga Y     plane 2    | (1)  |      |      |    . . .   |      |
  269. riga Y+1   plane 1    | (2)  |      |      |    . . .   |      | \
  270. riga Y+1   plane 2    |      |      |      |    . . .   |      |  |
  271. riga Y+1   plane 1    | (2') |      |      |    . . .   |      |  |
  272. riga Y+1   plane 2    |      |      |      |    . . .   |      |  |
  273.                                     |
  274. .                                    |
  275.                                     | 15 righe
  276. .                                    |
  277.                                     |
  278. .                                    |
  279.                                     |
  280.                                    /
  281. riga Y+16  plane 1    | (3)  |      |      |    . . .   |      |
  282. riga Y+16  plane 2    |      |      |      |    . . .   |      |
  283.  
  284.