home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti9 / lezione15g2.s < prev    next >
Text File  |  1995-05-01  |  8KB  |  275 lines

  1.  
  2. ; Lezione15g2.s        - Scroll AGA dei bitplanes a scatti di 1/4 di pixel,
  3. ;              per un messimo di 64 pixel. I 2 playfield scrollano
  4. ;              indipendentemente in questo esempio.
  5.  
  6. ; NOTA: I 2 bit alti dello scroll, che permettono "scatti" di 16 o di 32 pixel,
  7. ; per un massimo di 64 pixel di scroll, funzionano solo se il burst mode e'
  8. ; a 64 pixel (settando i 2 bit bassi di FMODE, ossia $dff1fc).
  9.  
  10.     SECTION    AgaRulez,CODE
  11.  
  12. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  13.  
  14. *****************************************************************************
  15.     include    "startup2.s"    ; Salva Copperlist Etc.
  16. *****************************************************************************
  17.  
  18.         ;5432109876543210
  19. DMASET    EQU    %1000001110000000    ; copper, bitplane DMA
  20.  
  21. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  22.  
  23. START:
  24.  
  25. ;    Puntiamo la pic AGA (planes pari)
  26.  
  27.     MOVE.L    #PIC1,d0
  28.     LEA    EVENBPLPT,A1        ; BPL POINTERS DEI BITPLANES PARI
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33. ;    Puntiamo la pic AGA (planes dispari)
  34.  
  35.     MOVE.L    #PIC2,d0
  36.     LEA    ODDBPLPT,A1    ; BPL POINTERS DEI BITPLANES DISPARI
  37.     move.w    d0,6(a1)
  38.     swap    d0
  39.     move.w    d0,2(a1)
  40.  
  41.     bsr.w    MAKEMOVTAB    ; Questa semplice routine fa 2 tabelle
  42.                 ; con valori da 0 a 255, poi di nuovo a 0
  43.  
  44.     bsr.w    FINESCROLLC    ; Questa routine "converte" i valori decimali
  45.                 ; in valori di scroll per il BPLCON1 AGA
  46.  
  47.     lea    $dff000,a5
  48.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  49.     move.l    #AgaCopList,$80(a5)    ; Puntiamo la nostra COP
  50.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  51.     move.w    #0,$1fc(a5)        ; Fmode azzerato, burst normale
  52.     move.w    #$c00,$106(a5)        ; BPLCON3 resettato
  53.     move.w    #$11,$10c(a5)        ; BPLCON4 resettato
  54.  
  55. LOOP:
  56.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  57.     MOVE.L    #$11000,d2    ; linea da aspettare = $110
  58. Waity1:
  59.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  60.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  61.     CMPI.L    D2,D0        ; aspetta la linea $110
  62.     BNE.S    Waity1
  63.  
  64.     BSR.w    WABBLE
  65.  
  66.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  67.     MOVE.L    #$11000,d2    ; linea da aspettare = $110
  68. Aspetta:
  69.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  70.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  71.     CMPI.L    D2,D0        ; aspetta la linea $110
  72.     BEQ.S    Aspetta
  73.  
  74.     BTST    #6,$BFE001
  75.     BNE.S    LOOP
  76.     RTS
  77.  
  78. ******************************************************************************
  79. ; Questa routine fa una tabella con valori "decimali" 0-255-0, in due tabelle
  80. ; separate, una per il playfield1 e l'altra per il playfield 2.
  81. ******************************************************************************
  82.  
  83. NUMVAL = 255    ; Il nuovo bplcon1 puo' andare da 0 a 255, sfruttiamolo!
  84.  
  85. makemovtab:
  86.     LEA    MOVTAB(PC),A0    ; Tab valori playfield 1
  87.     LEA    MOVTAB2(PC),A1    ; Tab valori playfield 2
  88.     MOVEQ    #0,D0        ; MINIMO PLAYFIELD 1 : 0
  89.     MOVE.L    #NUMVAL,d2    ; MINIMO PLAYFIELD 2 : numval
  90.     MOVE.L    #NUMVAL,D1    ; MASSIMO : numval
  91. AMTLOOP:
  92.     MOVE.W    D0,(A0)+    ; Val playfield 1
  93.     MOVE.W    D2,(A1)+    ; Val playfield 2
  94.     ADDQ.L    #1,D0        ; aggiungi 1 al val. playfield 1
  95.     SUBQ.L    #1,D2        ; togli 1 al val. playfield 2
  96.     CMP.L    D1,D0        ; pf1=numval? (allora pf2=zero)
  97.     BNE.S    AMTLOOP        ; se non ancora, continua a loopare.
  98. AMTLOOP2:
  99.     MOVE.W    D0,(A0)+    ; Val Pf1 - (Da numval a 0)
  100.     MOVE.W    D2,(A1)+    ; Val Pf2 - lascia sempre zero... fermo!
  101.     SUBQ.L    #1,D0        ; Subba val. Pf1
  102.     BNE.S    AMTLOOP2    ; d0=zero? (flag Z) - se non ancora loopa!
  103.     RTS
  104.  
  105. MOVTAB:
  106.     DCB.W    NUMVAL*2,0    ; *2 perche' sono words
  107. MOVTABEND:
  108.  
  109. MOVTAB2:
  110.     DCB.W    NUMVAL*2,0    ; *2 perche' sono words
  111. MOVTAB2END:
  112.  
  113. ******************************************************************************
  114. ; Routine che converte da numeri "decimali" a valori per il bplcon1 AGA.
  115. ; In pratica scompone il numero a 8 bit posizionando i sui bit secondo lo
  116. ; schema del bplcon1 aga:
  117. ;
  118. ;    15    64 PIXEL SCROLL PF2 (AGA)
  119. ;    14     64 PIXEL SCROLL PF2 (AGA)
  120. ;    13     FINE SCROLL PF2 (AGA SCROLL 35ns 1/4 of pixel)
  121. ;    12     FINE SCROLL PF2
  122. ;    11     64 PIXEL SCROLL PF1 (AGA)
  123. ;    10     64 PIXEL SCROLL PF1 (AGA)
  124. ;    09     FINE SCROLL PF1 (AGA SCROLL 35ns 1/4 of pixel)
  125. ;    08    FINE SCROLL PF1
  126. ;    07    PF2H3
  127. ;    06    PF2H2
  128. ;    05    PF2H1
  129. ;    04    PF2H0
  130. ;    03    PF1H3
  131. ;    02    PF1H2
  132. ;    01    PF1H1
  133. ;    00    PF1H0
  134.  
  135. ******************************************************************************
  136.  
  137. FINESCROLLC:
  138.     LEA    MOVTAB2(PC),A0        ; Tab valori playfield 2
  139.     LEA    MOVTAB(PC),A3        ; Tab valori playfield 1
  140.     LEA    CON1VALUES(PC),A1    ; Tab destinazione per $DFF002
  141.     LEA    MOVTAB2END(PC),a2    ; Fine della tabella
  142. CONVLOOP:
  143.     MOVEQ    #0,D1
  144.     MOVE.W    (A0)+,D1    ; VALORE "DECIMALE" PF1 IN D1
  145.     MOVE.W    (A3)+,D5    ; VALORE "DECIMALE" PF2 IN D5
  146.     MOVE.W    D1,D2        ; COPIA VAL. 1 IN D2
  147.     MOVE.W    d1,d4        ; COPIA VAL. 1 IN D4
  148.     MOVE.W    D5,D6        ; COPIA VAL. 2 IN D6
  149. ;pf1
  150.     AND.W    #%11,D1        ; Selez. bits 0-1 (SCROLL 1/4 e 1/2 pixel)
  151.     LSL.W    #8,D1        ; Shiftali al posto "giusto": bit 8 e 9
  152.     MOVE.W    D1,D3        ; Salva in d3
  153. ;pf2
  154.     AND.W    #%11,D5        ; Selez. bits 0-1 (SCROLL 1/4 e 1/2 pixel)
  155.     LSL.W    #8,D5        ; Shiftali al posto "giusto", in 2 passaggi:
  156.     LSL.W    #4,D5        ; in totale shiftati di  12 bit: bit 12 e 13
  157.     OR.W    D5,D3        ; Salva in d3
  158. ;pf1
  159.     AND.W    #%111100,d2    ; Selez. i "vecchi" 4 bit dello scroll ad 1
  160.                 ; pixel, max 16 pixel.
  161.     LSR.W    #2,d2        ; Shiftali al posto giusto: primi 4 bits!
  162.     OR.W    d2,d3        ; Salva in d3
  163. ;pf2
  164.     MOVE.W    D6,D5
  165.     AND.W    #%111100,d5    ; Selez. i "vecchi" 4 bit dello scroll ad 1
  166.                 ; pixel, max 16 pixel.
  167.     LSL.W    #2,d5        ; Shiftali al posto giusto: bits 4,5,6,7
  168.     OR.W    d5,d3        ; Salva in d3
  169. ;pf1
  170.     AND.W    #%11000000,d4    ; Selez. i bit alti: scatti di 16/32 pixel
  171.     LSL.W    #4,d4        ; Posto giusto: BITS 10&11 per PF1
  172.     OR.W    D4,d3        ; Salva in d3
  173. ;pf2
  174.     AND.W    #%11000000,d6    ; Selez. i bit alti: scatti di 16/32 pixel
  175.     LSL.W    #8,d6        ; Posto giusto: BITS 14&15 per PF2
  176.     OR.W    d6,d3        ; add pf2 16 pixel scroll bits to d3
  177.  
  178.     MOVE.w    D3,(A1)+    ; Salva il valore BPLCON1 finale
  179.     CMP.L    a0,a2        ; Fine della tabella?
  180.     BNE.S    CONVLOOP    ; Se non ancora, continua la conversione!
  181.     RTS
  182.  
  183. ; Tabella con i valori finali per il $dff102 (BPLCON1)
  184.  
  185. CON1VALUES:
  186.     DCB.W    NUMVAL*2,0
  187. CON1TABEND:
  188.  
  189. ******************************************************************************
  190. ; Routine che copia i valori dalla tabella CON1VALUES al bplcon1 in copper.
  191. ; Una volta letta tutta la tabella, smette.
  192. ******************************************************************************
  193.  
  194. WABBLE:
  195.     tst.w    FLAGGY            ; Abbiamo finito la tabella?
  196.     beq.s    NOWA            ; Se si, esci!
  197.     move.l    Con1TabPointer(PC),a0    ; Con1TabPointer in a0
  198.     move.w    (a0)+,SCRLVAL        ; Copia il valore in copperlist
  199.     cmp.l    #CON1TABEND,a0        ; Siamo alla fine della tab?
  200.     bne.s    okay            ; Se non ancora, ok
  201.     clr.w    FLAGGY            ; Altrimenti segna che abbiamo finito
  202. okay:
  203.     lea    Con1TabPointer(PC),a0    ; Con1TabPointer in a0
  204.     addq.l    #2,(a0)            ; Vai al prossimo valore
  205. NOWA:
  206.     RTS
  207.  
  208. FLAGGY:
  209.     dc.w    -1
  210.  
  211. Con1TabPointer:
  212.     dc.l    CON1VALUES
  213.  
  214. *************************************************************************
  215. ;            COPPERLIST AGA
  216. *************************************************************************
  217.  
  218.     CNOP    0,8
  219.  
  220.         Section    MiaCop,data_C
  221.  
  222. AGACOPLIST:
  223.     dc.w    $8E,$2c81    ; DiwStrt
  224.     dc.w    $90,$2cc1    ; DiwStop
  225.     dc.w    $92,$0038    ; DdfStart
  226.     dc.w    $94,$00d0    ; DdfStop
  227.  
  228.     dc.w    $102        ; BplCon1
  229. SCRLVAL:
  230.     dc.w    0        ; Val. Bplcon1 - cambiato dalla routine
  231.  
  232.     dc.w    $104,0        ; BplCon2
  233.     dc.w    $108,-8        ; Bpl1Mod
  234.     dc.w    $10a,-8        ; Bpl2Mod
  235.  
  236.     dc.w    $1fc,3        ; Burst mode 64bit - NOTA: I bit alti del
  237.                 ; BPLCON1 che permettono lo scroll a scatti
  238.                 ; di 16 o 32 pixel funzionano solo se il
  239.                 ; burst e' a 32 o 64 bit, rispettivamente.
  240.  
  241. EVENBPLPT:
  242.     dc.w $e0,0,$e2,0        ;bitplane   0
  243. ODDBPLPT:
  244.     dc.w $e4,0,$e6,0        ;bitplane   1
  245.  
  246.             ; 5432109876543210
  247.     dc.w    $100,%0010001000000001    ; 2 bitplane LOWRES 320x256.
  248.  
  249.     dc.w    $106,$C00    ; Nibble alti
  250.     dc.w    $180,$001    ; COLOR 0 REGISTER
  251.     dc.w    $182,$081    ; COLOR 1 REGISTER
  252.     dc.w    $184,$aa1    ; COLOR 2 REGISTER
  253.     dc.w    $186,$aa1    ; COLOR 3 REGISTER
  254.     dc.w    $106,$200    ; Nibble bassi
  255.     dc.w    $180,$124    ; COLOR 0 REGISTER
  256.     dc.w    $182,$567    ; COLOR 1 REGISTER
  257.     dc.w    $184,$413    ; COLOR 2 REGISTER
  258.     dc.w    $186,$a83    ; COLOR 3 REGISTER
  259.  
  260.     dc.w    $FFFF,$FFFE    ; FineCopperist
  261.  
  262. *************************************************************************
  263. ;               BITPLANES
  264. *************************************************************************
  265.  
  266.     CNOP    0,8
  267.  
  268. PIC1:
  269.     dcb.b    40*256,%00000111
  270. PIC2:
  271.     dcb.b    40*256,%01110000
  272.  
  273.     END
  274.  
  275.