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

  1.  
  2. ; Lezione11h4.s    BARRETTA CHE SALE E SCENDE USANDO IL MASCHERAMENTO DEL WAIT
  3.  
  4. ;    Questo listato e' identico al Lezione3d.s, fatta eccezione per
  5. ;    uno stratagemma che ci permette di spostare l'intera barretta
  6. ;    con una sola istruzione!!!! Il trucco sta nella COPPERLIST!
  7.  
  8.  
  9.     SECTION    CiriCop,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    %1000001010000000    ; solo copper DMA
  19.  
  20. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  21.  
  22. START:
  23.     lea    $dff000,a5
  24.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  25.                     ; e sprites.
  26.  
  27.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  28.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  29.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  30.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  31.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  32.  
  33. mouse:
  34.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  35.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  36. Waity1:
  37.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  38.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  39.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  40.     BNE.S    Waity1
  41.  
  42.     btst    #2,$dff016    ; tasto destro premuto?
  43.     beq.s    Mouse2        ; se si non eseguire MuoviCopper
  44.  
  45.     bsr.s    MuoviCopper    ; Routine che sfrutta il mascheramento del WAIT
  46.  
  47. mouse2:
  48.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  49.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  50. Aspetta:
  51.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  52.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  53.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  54.     BEQ.S    Aspetta
  55.  
  56.     btst    #6,$bfe001    ; mouse premuto?
  57.     bne.s    mouse
  58.     rts
  59.  
  60. *****************************************************************************
  61.  
  62. MuoviCopper:
  63.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  64.                 ; azzerata, (cioe' il TST verifica il BEQ)
  65.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  66.                 ; (se cioe' questo TST non e' verificato)
  67.                 ; continuiamo salendo (facendo dei subq)
  68.     beq.w    VAIGIU
  69.     cmpi.b    #$34,BARRA    ; siamo arrivati alla linea $34?
  70.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  71.     subq.b    #1,BARRA
  72.     rts
  73.  
  74. MettiGiu:
  75.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  76.     rts            ; fara' saltare alla routine VAIGIU, e
  77.                 ; la barra scedera'
  78.  
  79. VAIGIU:
  80.     cmpi.b    #$77,BARRA    ; siamo arrivati alla linea $77?
  81.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  82.     addq.b    #1,BARRA
  83.     rts
  84.  
  85. MettiSu:
  86.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  87.     rts            ; significa che dobbiamo risalire.
  88.  
  89. Finito:
  90.     rts
  91.  
  92.  
  93. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG, ossia una
  94. ;    bandierina (in gergo)
  95.  
  96. SuGiu:
  97.     dc.b    0,0
  98.  
  99.  
  100. *****************************************************************************
  101.  
  102.     SECTION    GRAPHIC,DATA_C
  103.  
  104. COPPERLIST:
  105.     dc.w    $100,$200
  106.     dc.w    $180,$000    ; Inizio la cop col colore NERO
  107.  
  108.     dc.w    $2c07,$FFFE    ; una piccola barretta fissa verde
  109.     dc.w    $180,$010
  110.     dc.w    $2d07,$FFFE
  111.     dc.w    $180,$020
  112.     dc.w    $2e07,$FFFE
  113.     dc.w    $180,$030
  114.     dc.w    $2f07,$FFFE
  115.     dc.w    $180,$040
  116.     dc.w    $3007,$FFFE
  117.     dc.w    $180,$030
  118.     dc.w    $3107,$FFFE
  119.     dc.w    $180,$020
  120.     dc.w    $3207,$FFFE
  121.     dc.w    $180,$010
  122.     dc.w    $3307,$FFFE
  123.     dc.w    $180,$000
  124.  
  125. ;      /\  __ __ ______ __ __  /\ Mo!
  126. ;    _// \/  ____ _  _ ____  \/ \\_
  127. ;    \(_  \  \(O/      \O)/  /  _)/
  128. ;     \/     _)/  _/\   \(_     \/
  129. ;     /_ __        ··\    ______ \
  130. ;    (    (_____/\  _____/ | | |\ \
  131. ;     \__________ \/   \_|_|_|_|_) )
  132. ;                \ _______________/
  133. ;                 \/
  134.  
  135. BARRA:
  136.     dc.w    $3407,$FFFE    ; aspetto la linea $79 (WAIT NORMALE!)
  137.                 ; questo wait e' il "BOSS" dei wait
  138.                 ; mascherati seguenti, infatti lo seguono
  139.                 ; come degli scagnozzi: se questo wait
  140.                 ; scende di 1, tutti i wait mascherati
  141.                 ; sottostanti scendono di 1, eccetera.
  142.  
  143.     dc.w    $180,$300    ; inizio la barra rossa: rosso a 3
  144.  
  145.     dc.w    $00E1,$80FE    ; Questa coppia di istruzioni copper, che
  146.     dc.w    $0007,$80FE    ; invece di terminare per $FFFE terminano
  147.                 ; con $80FE, in pratica si possono tradurre
  148.                 ; in: "ASPETTA LA LINEA SEGUENTE", in questo
  149.                 ; caso la linea seguente al wait di BARRA:.
  150.                 ; Infatti il $00E180fE aspetta la fine della
  151.                 ; linea (al bordo destro dello schermo), il
  152.                 ; che fa scattare il copper alla linea seguente
  153.                 ; alla sua posizione orizzintale 0001 (il
  154.                 ; bordo sinistro dello schermo). A questo
  155.                 ; punto per "allineare" aspettiamo la posizione
  156.                 ; 0007 come gli altri wait.
  157.  
  158.     dc.w    $180,$600    ; rosso a 6
  159.  
  160.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  161.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  162.  
  163.     dc.w    $180,$900    ; rosso a 9
  164.  
  165.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  166.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  167.  
  168.     dc.w    $180,$c00    ; rosso a 12
  169.  
  170.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  171.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  172.  
  173.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  174.  
  175.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  176.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  177.  
  178.     dc.w    $180,$c00    ; rosso a 12
  179.  
  180.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  181.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  182.  
  183.     dc.w    $180,$900    ; rosso a 9
  184.  
  185.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  186.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  187.  
  188.     dc.w    $180,$600    ; rosso a 6
  189.  
  190.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  191.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  192.  
  193.     dc.w    $180,$300    ; rosso a 3
  194.  
  195.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  196.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  197.  
  198.     dc.w    $180,$000    ; colore NERO
  199.  
  200.  
  201.     dc.w    $fd07,$FFFE    ; aspetto la linea $FD
  202.     dc.w    $180,$00a    ; blu intensita' 10
  203.     dc.w    $fe07,$FFFE    ; linea seguente
  204.     dc.w    $180,$00f    ; blu intensita' massima (15)
  205.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  206.  
  207.  
  208.     end
  209.  
  210. In questo esempio abbiamo risparmiato un bel po' di MOVE: Cambiando 1 solo
  211. BYTE per fotogramma facciamo scorrere una barra intera! Questo grazie al
  212. "mascheramento della y del wait". In pratica l'utilita' sta nel fatto che
  213. mettendo queste 2 wait mascherate:
  214.  
  215.     dc.w    $00E1,$80FE    ; ASPETTA LA LINEA SEGUENTE
  216.     dc.w    $0007,$80FE    ; CON il Wait ad Y "mascherata"
  217.  
  218. Andiamo alla linea seguente all'ultimo wait $FFFE definito, e aggiungendo
  219. altre coppie di $80fe si possono "appiccicare" al primo wait molte linee.
  220. Nonostante tutto pero' e' uno stratagemma poco usato, in quanto ha delle
  221. limitazioni, ad esempio non funziona per le linee superiori alla 127 ($7f)
  222. circa. Provate infatti a cambiare la linea massima raggiungibile:
  223.  
  224. VAIGIU:
  225.     cmpi.b    #$77,BARRA    ; siamo arrivati alla linea $77?
  226.  
  227. mettendoci un bel $f0, e noterete come superata la linea $80 la barra
  228. si appiattisce e diventa una linea.
  229. La coordinata Y deve andare da $00 a $7f, perche' possiamo mascherare solo 6
  230. bit. Meglio di niente, pero'!!!
  231.  
  232. Quindi, si puo' dire che il mascheramento funziona nella parte alta dello
  233. schermo da $00 a $7f circa, e sotto la zona NTSC, ossia dopo il $FFDF,$FFFE.
  234.  
  235.