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

  1.  
  2. ; Lezione11h.s    Uso del COP2LC ($dff084) per fare una copperlist dinamica,
  3. ;        ossia una copperlist che ogni frame si alternano 2 copperlist
  4. ;        fatte in modo che "aumenti" la credibilita' di una sfumatura.
  5. ;        Tasto destro per vedere la differenza!
  6.  
  7.     SECTION    DynaCop,CODE
  8.  
  9. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  10.  
  11. *****************************************************************************
  12.     include    "startup2.s" ; Salva Copperlist Etc.
  13. *****************************************************************************
  14.  
  15.         ;5432109876543210
  16. DMASET    EQU    %1000001110000000    ; solo copper e bitplane DMA
  17.  
  18. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  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. ;    Puntiamo tutti gli sprite allo sprite nullo
  30.  
  31.     MOVE.L    #SpriteNullo,d0        ; indirizzo dello sprite in d0
  32.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  33.     MOVEQ    #8-1,d1            ; tutti gli 8 sprite
  34. NulLoop:
  35.     move.w    d0,6(a1)
  36.     swap    d0
  37.     move.w    d0,2(a1)
  38.     swap    d0
  39.     addq.w    #8,a1
  40.     dbra    d1,NulLoop
  41.  
  42.     bsr.w    InitCops    ; Crea le 2 copperlist da "scambiare"
  43.  
  44.     lea    $dff000,a6
  45.     MOVE.W    #DMASET,$96(a6)        ; DMACON - abilita bitplane, copper
  46.                     ; e sprites.
  47.  
  48.     move.l    #COPPERLIST,$80(a6)    ; Puntiamo la nostra COP
  49.     move.w    d0,$88(a6)        ; Facciamo partire la COP
  50.     move.w    #0,$1fc(a6)        ; Disattiva l'AGA
  51.     move.w    #$c00,$106(a6)        ; Disattiva l'AGA
  52.     move.w    #$11,$10c(a6)        ; Disattiva l'AGA
  53.  
  54. mouse:
  55.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  56.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  57. Waity1:
  58.     MOVE.L    4(A6),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  59.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  60.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  61.     BNE.S    Waity1
  62.  
  63.     btst    #2,$16(a6)    ; tasto destro del mouse premuto?
  64.     beq.s    NonSwappare    ; Se si non scambiare (bello schifo!)
  65.  
  66.     movem.l    CoppPointer1(PC),d0-d1    ; Metti con un solo MOVEM gli indirizzi
  67.                     ; delle 2 copperlist in d0 e in a1
  68.     move.l    d0,CoppPointer2        ; Scambiane l'ordine...
  69.     move.l    d1,CoppPointer1        ; ...
  70.     move.w    d1,Cop2lcl        ; E punta l'altra copperlist2 come
  71.     swap    d1            ; prossima a cui saltare con
  72.     move.w    d1,Cop2lch        ; il COPJMP2 ($dff08a)
  73. nonSwappare:
  74.  
  75.     bsr.w    PrintCarattere    ; Stampa un carattere alla volta
  76.  
  77.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  78.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  79. Aspetta:
  80.     MOVE.L    4(A6),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  81.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  82.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  83.     BEQ.S    Aspetta
  84.  
  85.     btst    #6,$bfe001    ; mouse premuto?
  86.     bne.s    mouse
  87.     rts            ; esci
  88.  
  89.  
  90. CoppPointer1:
  91.         dc.l    ColInt1
  92. CoppPointer2:
  93.         dc.l    ColInt2
  94.  
  95. *****************************************************************************
  96. * Routine che crea le 2 copperslist che dovranno essere visualizzate        *
  97. * alternativamente puntandole nel COP2LC e facendole partire con COPJMP2    *
  98. *****************************************************************************
  99.  
  100. ;      _________________
  101. ;     /                 \
  102. ;     \   ___     ___   /
  103. ;    __\  (__)   (__)  /__
  104. ;    \__\___  ` '  ___/__/
  105. ;         \ \...../ /
  106. ;          \_______/g®m
  107.  
  108.  
  109. COLSTART    EQU    $660    ; Colore di partenza = giallo
  110. COLTENDENZA    EQU    $001    ; Tendenza (valore aggiunto ogni waitata)
  111.  
  112. InitCops:
  113.     move.l    #$4407fffe,d0    ; Wait - inizia dalla linea orizzontale $44
  114.     move.l    #$1800000,d1    ; Color0
  115.     move.w    #COLSTART,d2    ; Colore di partenza
  116.     move.w    #COLTENDENZA,d3    ; tendenza destinazione ($001/$010/$100)
  117.     moveq    #2-1,d5        ; 2 Copperlist da fare
  118.     lea    ColInt1,a1    ; Prima Copperlist
  119. makecop:
  120.     move.w    d2,d1        ; Copia colstart in d1 (nel $180xxxx!)
  121.     move.l    d0,(a1)+    ; Metti il WAIT in coplist
  122.     move.l    d1,(a1)+    ; Metti il $180xxxx (color0) in coplist
  123.     add.l    #$05000000,d0    ; wait 5 linee piu' in basso la volta dopo
  124.     move.l    d0,(a1)+    ; metti wait
  125.     move.l    d1,(a1)+    ; metti il $180xxxx (color0)
  126.     add.l    #$05000000,d0    ; wait 5 linee piu' in basso
  127.     move.w    d2,d4        ; copia il colstart in d4
  128.     and.w    #$00f,d4    ; Seleziona solo la componente BLU
  129.     cmp.w    #$00f,d4    ; e' al massimo?
  130.     beq.S    endcop        ; Se si, endcop!
  131.     move.w    d2,d4        ; Altrimenti, vediamo il verde:
  132.     and.w    #$0f0,d4    ; seleziona solo la componente verde.
  133.     cmp.w    #$0f0,d4    ; E' al massimo?
  134.     beq.S    endcop        ; Se si, endcop!
  135.     move.w    d2,d4
  136.     and.w    #$f00,d4    ; Seleziona solo la componente ROSSA
  137.     cmp.w    #$f00,d4    ; e' al massimo?
  138.     beq.S    endcop        ; Se si ENDCOP!
  139.     add.w    d3,d2        ; Aggiungi COLTENDENZA al COLORSTART
  140.     bra.S    makecop        ; E continua...
  141. endcop:
  142.     move.l    #$fffffffe,d0    ; Fine copperlist in d0
  143.     move.w    d2,d1        ; copia COLORSTART in d1
  144.     move.l    d0,(a1)+    ; fine copperlist
  145.     move.l    #$4907fffe,d0
  146.     move.l    #$1800000,d1
  147.     move.w    #COLSTART,d2
  148.     move.w    #COLTENDENZA,d3
  149.     lea    ColInt2,a1
  150.     dbf    d5,makecop
  151.     rts
  152.  
  153.  
  154. *****************************************************************************
  155. ;            Routine di Print
  156. *****************************************************************************
  157.  
  158. PRINTcarattere:
  159.     movem.l    d2/a0/a2-a3,-(SP)
  160.     MOVE.L    PuntaTESTO(PC),A0 ; Indirizzo del testo da stampare in a0
  161.     MOVEQ    #0,D2        ; Pulisci d2
  162.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  163.     CMP.B    #$ff,d2        ; Segnale di fine testo? ($FF)
  164.     beq.s    FineTesto    ; Se si, esci senza stampare
  165.     TST.B    d2        ; Segnale di fine riga? ($00)
  166.     bne.s    NonFineRiga    ; Se no, non andare a capo
  167.  
  168.     ADD.L    #40*7,PuntaBITPLANE    ; ANDIAMO A CAPO
  169.     ADDQ.L    #1,PuntaTesto        ; primo carattere riga dopo
  170.                     ; (saltiamo lo ZERO)
  171.     move.b    (a0)+,d2        ; primo carattere della riga dopo
  172.                     ; (saltiamo lo ZERO)
  173.  
  174. NonFineRiga:
  175.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  176.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  177.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  178.                 ; DELL'ASTERISCO ($21), in $01...
  179.     LSL.W    #3,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  180.                 ; essendo i caratteri alti 8 pixel
  181.     MOVE.L    D2,A2
  182.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  183.  
  184.     MOVE.L    PuntaBITPLANE(PC),A3 ; Indir. del bitplane destinazione in a3
  185.  
  186.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  187.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  188.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  189.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  190.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  191.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  192.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  193.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  194.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  195.  
  196.     ADDQ.L    #1,PuntaBitplane ; avanziamo di 8 bit (PROSSIMO CARATTERE)
  197.     ADDQ.L    #1,PuntaTesto    ; prossimo carattere da stampare
  198.  
  199. FineTesto:
  200.     movem.l    (SP)+,d2/a0/a2-a3
  201.     RTS
  202.  
  203.  
  204. PuntaTesto:
  205.     dc.l    TESTO
  206.  
  207. PuntaBitplane:
  208.     dc.l    BITPLANE
  209.  
  210. ;    $00 per "fine linea" - $FF per "fine testo"
  211.  
  212.         ; numero caratteri per linea: 40
  213. TESTO:         ;          1111111111222222222233333333334
  214.              ;   1234567890123456789012345678901234567890
  215.     dc.b    '                                        ',0 ; 1
  216.     dc.b    '    Questo listato utilizza il COP2LC   ',0 ; 2
  217.     dc.b    '                                        ',0 ; 3
  218.     dc.b    '    ($dff084) per far saltare, ad una   ',0 ; 4
  219.     dc.b    '                                        ',0 ; 5
  220.     dc.b    '    certa linea video, ad un altra      ',0 ; 6
  221.     dc.b    '                                        ',0 ; 7
  222.     dc.b    '    copperlist. Al termine di questa    ',0 ; 8
  223.     dc.b    '                                        ',0 ; 9
  224.     dc.b    '    riparte sempre e comunque la        ',0 ; 10
  225.     dc.b    '                                        ',0 ; 11
  226.     dc.b    '    copperlist 1 (in $dff180). Dunque   ',0 ; 12
  227.     dc.b    '                                        ',0 ; 13
  228.     dc.b    '    basta cambiare solo la cop2 a cui   ',0 ; 14
  229.     dc.b    '                                        ',0 ; 15
  230.     dc.b    '    puntare ogni frame, per DynamiCop!  ',0 ; 16
  231.     dc.b    '                                        ',0 ; 17
  232.     dc.b    '    Il tasto destro ferma lo scambio.   ',$FF ; 18
  233.  
  234.     EVEN
  235.  
  236. ;    Il FONT caratteri 8x8 (copiato in CHIP dalla CPU e non dal blitter,
  237. ;    per cui puo' stare anche in fast ram. Anzi sarebbe meglio!
  238.  
  239. FONT:
  240.     incbin    "assembler2:sorgenti4/nice.fnt"
  241.  
  242. ****************************************************************************
  243.  
  244.     Section    copperDynamic,data_C
  245.  
  246. copperlist:
  247. SpritePointers:
  248.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  249.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  250.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  251.     dc.w    $13e,0
  252.  
  253.     dc.w    $8E,$2c81    ; DiwStrt
  254.     dc.w    $90,$2cc1    ; DiwStop
  255.     dc.w    $92,$0038    ; DdfStart
  256.     dc.w    $94,$00d0    ; DdfStop
  257.     dc.w    $102,0        ; BplCon1
  258.     dc.w    $104,0        ; BplCon2
  259.     dc.w    $108,0        ; Bpl1Mod
  260.     dc.w    $10a,0        ; Bpl2Mod
  261.             ; 5432109876543210
  262.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  263.  
  264. BPLPOINTERS:
  265.     dc.w $e0,0,$e2,0    ;primo     bitplane
  266.  
  267.     dc.w    $180,COLSTART    ; COLOR0 - colore di "partenza"
  268.     dc.w    $182,$FF0    ; color1 - SCRITTE
  269.  
  270. ;    dc.w    $2ce1,$fffe    ; Waitiamo almeno Y=$2c X=$d7
  271.  
  272.     dc.w    $84        ; registro COP2LCH (indirizzo copper 2!)
  273. COP2LCH:
  274.     dc.w    0
  275.     dc.w    $86        ; registro COP2LCL
  276. COP2LCL:
  277.     dc.w    0
  278.  
  279.     dc.w    $8a,$000    ; COPJMP2 - fai partire la copperlist 2
  280.  
  281. ****************************************************************************
  282.  
  283. ; spazio per la copperlist 1
  284.  
  285. ColInt1:
  286.     dcb.l    2*60,0
  287.  
  288. ****************************************************************************
  289.  
  290. ; spazio per la copperlist 2
  291.  
  292. ColInt2:
  293.     dcb.l    2*60,0
  294.  
  295.  
  296. *****************************************************************************
  297.  
  298.     SECTION    MIOPLANE,BSS_C
  299.  
  300. BITPLANE:
  301.     ds.b    40*256    ; un bitplane lowres 320x256
  302.  
  303. SpriteNullo:            ; Sprite nullo da puntare in copperlist
  304.     ds.l    4        ; negli eventuali puntatori inutilizzati
  305.  
  306.     END
  307.  
  308.