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

  1.  
  2. ; Lezione11i2.s    - Barre in "pseudoparallasse"
  3.  
  4.     SECTION    ParaCop,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup2.s" ; Salva Copperlist Etc.
  10. *****************************************************************************
  11.  
  12.         ;5432109876543210
  13. DMASET    EQU    %1000001010000000    ; solo copper DMA
  14.  
  15. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  16.  
  17. START:
  18.     bsr.w    WriteWaits    ; Crea le 2 copperlist...
  19.  
  20.     lea    $dff000,a6
  21.     MOVE.W    #DMASET,$96(a6)        ; DMACON - abilita bitplane, copper
  22.                     ; e sprites.
  23.  
  24.     move.l    #KOPLIST1,$80(a6)    ; Puntiamo la nostra COP
  25.     move.w    d0,$88(a6)        ; Facciamo partire la COP
  26.     move.w    #0,$1fc(a6)        ; Disattiva l'AGA
  27.     move.w    #$c00,$106(a6)        ; Disattiva l'AGA
  28.     move.w    #$11,$10c(a6)        ; Disattiva l'AGA
  29.  
  30. mouse:
  31.     bsr.w    waitvb                ; Aspetta il vertical Blank
  32.     move.l    #koplist2,$dff080
  33.     move.l    #koplist1Waits+6,stampa        ; inizio cop
  34.     move.l    #koplist1Waits+6+(8*200),a5    ; fine cop
  35.     bsr.w    cleacop                ; pulisci la copperlist
  36.     bsr.w    makeBeams            ; disegna le barre
  37.  
  38.     bsr.w    waitvb                ; Aspetta il vertical Blank
  39.     move.l    #koplist1,$dff080
  40.     move.l    #koplist2Waits+6,stampa        ; inzio cop
  41.     move.l    #koplist2Waits+6+(8*200),a5    ; fine cop
  42.     bsr.w    cleacop                ; pulisci la copperlist
  43.     bsr.w    makeBeams            ; disegna le barre
  44.  
  45.     btst    #6,$bfe001    ; mouse premuto?
  46.     bne.s    mouse
  47.     rts            ; esci
  48.  
  49. *****************************************************************************
  50. ;    Routine che crea le 2 copperlist
  51. *****************************************************************************
  52.  
  53. ;    __/\__
  54. ;    \(Oo)/
  55. ;    /_()_\
  56. ;      \/
  57.  
  58. WriteWaits:
  59.     lea    koplist1waits,a1
  60.     lea    koplist2waits,a2
  61.     move.l    #$2c07ff00,d0    ; Wait (prima linea $2c)
  62.     move.l    #$01800000,d2    ; Color0
  63.     move.w    #200-1,d1    ; Numero waits (200 per l'area NTSC)
  64. WWLoop:
  65.     move.l    d0,(a1)+    ; Wait in coplist 1
  66.     move.l    d0,(a2)+    ; Wait in coplist 2
  67.  
  68.     move.l    d2,(a1)+    ; Color0 in coplist1
  69.     move.l    d2,(a2)+    ; Color0 in coplist2
  70.     add.l    #$01000000,d0    ; Fai waitare 1 linea sotto
  71.     dbra    d1,WWLoop
  72.     RTS
  73.  
  74. *****************************************************************************
  75. ;    Routine che "pulisce" lo sfondo
  76. *****************************************************************************
  77.  
  78. ;    __/\__
  79. ;    \[oO]/
  80. ;    /_--_\
  81. ;      \/
  82.  
  83. CleaCop:
  84.     move.l    stampa(PC),a0    ; copper attuale
  85.     moveq    #$001,d0    ; Colore di sfondo
  86.     move.w    #(200/4)-1,d1    ; numero waits
  87. Clealoop:
  88.     move.w    d0,(a0)        ; azzera
  89.     move.w    d0,8(a0)    ;...
  90.     move.w    d0,8*2(a0)
  91.     move.w    d0,8*3(a0)
  92.     lea    8*4(a0),a0
  93.     dbra    d1,Clealoop    ; rifai 200/4 volte, perche' pulisce 4
  94.     rts            ; words per loop! (piu' veloce!)
  95.  
  96. *****************************************************************************
  97. ;    Routine che attende il vblank
  98. *****************************************************************************
  99.  
  100. ;    __/\__
  101. ;    \-OO-/
  102. ;    /_\/_\
  103. ;      \/
  104.  
  105. Waitvb:
  106.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  107.     MOVE.L    #$0ff00,d2    ; linea da aspettare = $FF
  108. Waity1:
  109.     MOVE.L    4(A6),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  110.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  111.     CMPI.L    D2,D0        ; aspetta la linea $FF
  112.     BNE.S    Waity1
  113. Aspetta:
  114.     MOVE.L    4(A6),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  115.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  116.     CMPI.L    D2,D0        ; aspetta la linea $FF
  117.     BEQ.S    Aspetta
  118.     RTS
  119.  
  120. *****************************************************************************
  121. ;    Routine che modifica le copperlist
  122. *****************************************************************************
  123.  
  124. ;    __/\__
  125. ;    \(OO)/
  126. ;    /_==_\
  127. ;      \/
  128.  
  129. MakeBeams:
  130.     lea    beam01(pc),a1    ; tab colori barra 1
  131.     move.l    beam01x(pc),d0    ; la x...
  132.     moveq    #10,d1        ; la distanza tra 1 e l'altro
  133.     bsr.w    writebeam
  134.  
  135.     lea    beam02(PC),a1    ; tab colori barra 2
  136.     move.l    beam02x(PC),d0    ; la x...
  137.     moveq    #25,d1        ; la distanza tra 1 e l'altro
  138.     bsr.w    writebeam
  139.  
  140.     lea    beam03(PC),a1    ; tab colori barra 2
  141.     move.l    beam03x(PC),d0    ; la x...
  142.     moveq    #55,d1        ; la distanza tra 1 e l'altro
  143.     bsr.w    writebeam
  144.  
  145. ; BEAM01x scende di 1 ogni 2 frames.
  146.  
  147.     subq.b    #1,timer01x    ; 1 frame ogni 2.
  148.     bne.s    Non01x        ; passato il frame? (timer1x=0?)
  149.     move.b    #2,timer01x    ; risetta 2 frame
  150.  
  151.     addq.l    #1,beam01x    ; Fai scendere di 1 Beam01x
  152.     cmp.l    #8+10,beam01x    ; siamo in fondo?
  153.     bne.s    Non01x
  154.     clr.l    beam01x        ; Se si, riparti!
  155. Non01x:
  156.  
  157. ; BEAM02x scende di 1 ogni frame.
  158.  
  159.     addq.l    #1,beam02x    ; fai scendere di 1 beam02x
  160.     cmp.l    #16+25,beam02x    ; siamo in fondo?
  161.     bmi.s    NONON2
  162.     clr.l    beam02x        ; se si riparti
  163. NONON2:
  164.  
  165. ; BEAM03x scende di 2 ogni frame.
  166.  
  167.     addq.l    #2,beam03x    ; Fai scendere di 2 beam03x
  168.  
  169.     cmp.l    #16+55,beam03x    ; siamo in fondo
  170.     bmi.s    NONON3
  171.  
  172.     clr.l    beam03x        ; se si riparti.
  173. NONON3:
  174.     RTS
  175.  
  176. timer01x:
  177.     dc.b    2
  178.  
  179.     even
  180.  
  181. stampa:        dc.l    koplist1Waits+6        ; Copper attuale
  182.  
  183. beam01x:    dc.l 10
  184. beam02x:    dc.l 5
  185. beam03x:    dc.l 2
  186.  
  187.  
  188. *****************************************************************************
  189. ;    Routine che "scrive" le barre
  190. *****************************************************************************
  191. ;    lea    beam01(pc),a1    ; Tabella colori Beam01
  192. ;    move.l    beam01x(pc),d0    ; la x...
  193. ;    moveq    #10,d1        ; la distanza tra 1 e l'altro
  194.  
  195. ;    __/\__
  196. ;    \ $$ /
  197. ;    /_()_\
  198. ;      \/  
  199.  
  200. WriteBeam:
  201.     move.l    stampa(PC),a0    ; indirizzo copper attuale
  202.     move.l    a1,a2        ; indirizzo tabella colori in a1 e a2
  203.     lsl.w    #3,d0        ; X * 8
  204.     lsl.w    #3,d1        ; Distanza tra le barre * 8
  205.     add.w    d0,a0        ; trova offset (x*8)
  206. WBLoop2:
  207.     move.l    a2,a1        ; tab colori
  208. WBLoop:
  209.     tst.w    (a1)        ; tab colori finita?
  210.     beq.s    EndOfBeam    ; se si, esci!
  211.     move.w    (a1)+,(a0)    ; Copia il colore dalla tabella alla copbar
  212.     addq.w    #8,a0        ; vai al prossimo color0
  213.     cmp.l    a5,a0        ; fine della copperlist?
  214.     bmi.s    WBloop        ; se non ancora, insisti
  215. EndOfBeam:
  216.     add.w    d1,a0        ; finita una barra, se ne fa un'altra piu'
  217.                 ; sotto: aggiungiamo la distanza * 8 per
  218.                 ; trovare dove comincia la prossima barra
  219.     cmp.l    a5,a0        ; e verifichiamo di non essere fuori copper
  220.     bmi.s    WBloop2        ; Se non siamo fuori, possiamo andare!
  221.     RTS
  222.  
  223.  
  224. ; Tabella colori delle barre piu' "lontane" e lente (blu)
  225.  
  226. Beam01:
  227.     dc.w    $003
  228.     dc.w    $005
  229.     dc.w    $007
  230.     dc.w    $009
  231.     dc.w    $00a
  232.     dc.w    $007
  233.     dc.w    $005
  234.     dc.w    $003
  235.     dc.w    0
  236.  
  237. ; Tabella colori delle barre intermedie (verdi)
  238.  
  239. Beam02:
  240.     dc.w    $001
  241.     dc.w    $001
  242.  
  243.     dc.w    $010
  244.     dc.w    $020
  245.     dc.w    $030
  246.     dc.w    $040
  247.     dc.w    $050
  248.     dc.w    $060
  249.     dc.w    $070
  250.     dc.w    $060
  251.     dc.w    $050
  252.     dc.w    $040
  253.     dc.w    $030
  254.     dc.w    $020
  255.     dc.w    $010
  256.  
  257.     dc.w    $001
  258.     dc.w    0
  259.  
  260. ; Tabella colori delle barre "vicine" (arancione)
  261.  
  262. Beam03:
  263.     dc.w    $110
  264.     dc.w    $320
  265.     dc.w    $520
  266.     dc.w    $730
  267.     dc.w    $940
  268.     dc.w    $b50
  269.     dc.w    $d60
  270.     dc.w    $f70
  271.     dc.w    $f60
  272.     dc.w    $b50
  273.     dc.w    $940
  274.     dc.w    $730
  275.     dc.w    $520
  276.     dc.w    $420
  277.     dc.w    $320
  278.     dc.w    $210
  279.     dc.w    $110
  280.     dc.w    0
  281.  
  282.  
  283. *****************************************************************************
  284.  
  285.     SECTION    koplists,DATA_C
  286.  
  287. ; Prima copper
  288.  
  289. koplist1:
  290.     dc.w    $180,$666    ; Color0
  291.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  292. koplist1waits:
  293.     dcb.w    4*200,0        ; Spazio per l'effetto
  294.     dc.w    $180,$666    ; Color0
  295.     dc.w    $ffff,$fffe    ; Fine della copperlist
  296.  
  297. ; Seconda copper, scambiata con la prima per una sorta di "double buffering"
  298. ; per copperlist, per eliminare l'evenienza di non riuscire a scrivere in
  299. ; tempo nei color0 per evitare che si "noti" la scrittura stessa.
  300.  
  301. koplist2:
  302.     dc.w    $180,$666    ; Color0
  303.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  304. koplist2waits:
  305.     dcb.w    4*200,0        ; Spazio per l'effetto.
  306.     dc.w    $180,$666    ; Color0
  307.     dc.w    $ffff,$fffe    ; Fine della copperlist
  308.  
  309.     end
  310.  
  311. Questo listato ha la particolarita' di avere un "double coppering", ossia si
  312. scrive su una copper mentre se ne visualizza un'altra scritta prima, in modo
  313. da evitare che si "noti" la scrittura rallentata a video. Si poteva anche
  314. usare il sistema del COP2LC+COPJMP2 per scambiare le copperlist.
  315.  
  316.