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

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