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

  1.  
  2. ; Lezione7l.s    SCORRIMENTO VERTICALE DI UNO SPRITE SOTTO LA LINEA $FF
  3.  
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. Inizio:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Nome lib
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  15.  
  16. ;    Puntiamo la PIC "vuota"
  17.  
  18.     MOVE.L    #BITPLANE,d0    ; dove puntare
  19.     LEA    BPLPOINTERS,A1    ; puntatori COP
  20.     move.w    d0,6(a1)
  21.     swap    d0
  22.     move.w    d0,2(a1)
  23.  
  24. ;    Puntiamo lo sprite
  25.  
  26.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  27.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.  
  32.     move.l    #COPPERLIST,$dff080    ; nostra COP
  33.     move.w    d0,$dff088        ; START COP
  34.     move.w    #0,$dff1fc        ; NO AGA!
  35.     move.w    #$c00,$dff106        ; NO AGA!
  36.  
  37. mouse:
  38.     cmpi.b    #$aa,$dff006    ; Linea $aa?
  39.     bne.s    mouse
  40.  
  41.     btst    #2,$dff016
  42.     beq.s    aspetta
  43.     bsr.w    MuoviSpriteY    ; Muovi lo sprite 0 verticalmente (oltre $FF)
  44.  
  45. Aspetta:
  46.     cmpi.b    #$aa,$dff006    ; linea $aa?
  47.     beq.s    Aspetta
  48.  
  49.     btst    #6,$bfe001    ; mouse premuto?
  50.     bne.s    mouse
  51.  
  52.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  53.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  54.  
  55.     move.l    4.w,a6
  56.     jsr    -$7e(a6)    ; Enable
  57.     move.l    gfxbase(PC),a1
  58.     jsr    -$19e(a6)    ; Closelibrary
  59.     rts
  60.  
  61. ;    Dati
  62.  
  63. GfxName:
  64.     dc.b    "graphics.library",0,0
  65.  
  66. GfxBase:
  67.     dc.l    0
  68.  
  69. OldCop:
  70.     dc.l    0
  71.  
  72. ; Questa routine sposta in alto e in basso lo sprite agendo sui suoi byte
  73. ; VSTART e VSTOP, ossia i byte della sua posizione Y di inizio e fine, nonche'
  74. ; i bit alti delle coordinate VSTART/VSTOP, permettendo il posizionamento
  75. ; dello sprite anche nelle linee sotto $FF. La coordinata iniziale deve essere
  76. ; in formato WORD, da 0 a $FF per rimanere nello schermo normale (l'offset di
  77. ; $2c viene aggiunto dalla routine) oppure si puo' andare oltre $FF per
  78. ; far andare lo sprite fino al limite hardware negli schermi overscan.
  79.  
  80. MuoviSpriteY:
  81.     ADDQ.L    #2,TABYPOINT     ; Fai puntare alla word successiva
  82.     MOVE.L    TABYPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  83.                  ; copiato in a0
  84.     CMP.L    #FINETABY-2,A0  ; Siamo all'ultima word della TAB?
  85.     BNE.S    NOBSTARTY    ; non ancora? allora continua
  86.     MOVE.L    #TABY-2,TABYPOINT ; Riparti a puntare dalla prima word (-2)
  87. NOBSTARTY:
  88.     moveq    #0,d0        ; Pulisci d0
  89.     MOVE.w    (A0),d0        ; copia la word dalla tabella in d0
  90.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  91.     MOVE.b    d0,VSTART    ; copia il byte (bits 0-7) in VSTART
  92.     btst.l    #8,d0        ; la posizione e' maggiore di 255? ($FF)
  93.     beq.s    NonVSTARTSET
  94.     bset.b    #2,MIOSPRITE+3    ; Setta il bit 8 di VSTART (numero > $FF)
  95.     bra.s    ToVSTOP
  96. NonVSTARTSET:
  97.     bclr.b    #2,MIOSPRITE+3    ; Azzera il bit 8 di VSTART (numero < $FF)
  98. ToVSTOP:
  99.     ADD.w    #13,D0        ; Aggiungi la lunghezza dello sprite per
  100.                 ; determinare la posizione finale (VSTOP)
  101.     move.b    d0,VSTOP    ; Muovi il valore giusto (bits 0-7) in VSTOP
  102.     btst.l    #8,d0        ; la posizione e' maggiore di 255? ($FF)
  103.     beq.s    NonVSTOPSET
  104.     bset.b    #1,MIOSPRITE+3    ; Setta il bit 8 di VSTOP (numero > $FF)
  105.     bra.w    VstopFIN
  106. NonVSTOPSET:
  107.     bclr.b    #1,MIOSPRITE+3    ; Azzera il bit 8 di VSTOP (numero < $FF)
  108. VstopFIN:
  109.     rts
  110.  
  111. TABYPOINT:
  112.     dc.l    TABY-2        ; NOTA: i valori della tabella qua sono bytes,
  113.                 ; dunque lavoriamo con un ADDQ.L #1,TABYPOINT
  114.                 ; e non #2 come per quando sono word o con #4
  115.                 ; come quando sono longword.
  116.  
  117. ; Tabella con coordinate Y dello sprite precalcolate.
  118. ; Da notare che la posizione Y per far entrare lo sprite nella finestra video
  119. ; deve essere compresa tra $0 e $ff, infatti l'offset di $2c viene aggiunto
  120. ; dalla routine. Se non si usano schermi overscan, ossia non piu' lunghi di
  121. ; 255 linee, si puo' usare una tabella di valori dc.b (da $00 a $FF)
  122.  
  123.  
  124. ; Come rifarsi la tabella:
  125.  
  126. ; BEG> 0
  127. ; END> 360
  128. ; AMOUNT> 200
  129. ; AMPLITUDE> $f0/2
  130. ; YOFFSET> $f0/2
  131. ; SIZE (B/W/L)> b
  132. ; MULTIPLIER> 1
  133.  
  134.  
  135. TABY:
  136.     DC.W    $7A,$7E,$81,$85,$89,$8D,$90,$94,$98,$9B,$9F,$A2,$A6,$A9,$AD
  137.     DC.W    $B0,$B3,$B7,$BA,$BD,$C0,$C3,$C6,$C9,$CC,$CE,$D1,$D3,$D6,$D8
  138.     DC.W    $DA,$DC,$DE,$E0,$E2,$E4,$E5,$E7,$E8,$EA,$EB,$EC,$ED,$EE,$EE
  139.     DC.W    $EF,$EF,$F0,$F0,$F0,$F0,$F0,$F0,$EF,$EF,$EE,$EE,$ED,$EC,$EB
  140.     DC.W    $EA,$E8,$E7,$E5,$E4,$E2,$E0,$DE,$DC,$DA,$D8,$D6,$D3,$D1,$CE
  141.     DC.W    $CC,$C9,$C6,$C3,$C0,$BD,$BA,$B7,$B3,$B0,$AD,$A9,$A6,$A2,$9F
  142.     DC.W    $9B,$98,$94,$90,$8D,$89,$85,$81,$7E,$7A,$76,$72,$6F,$6B,$67
  143.     DC.W    $63,$60,$5C,$58,$55,$51,$4E,$4A,$47,$43,$40,$3D,$39,$36,$33
  144.     DC.W    $30,$2D,$2A,$27,$24,$22,$1F,$1D,$1A,$18,$16,$14,$12,$10,$0E
  145.     DC.W    $0C,$0B,$09,$08,$06,$05,$04,$03,$02,$02,$01,$01,$00,$00,$00
  146.     DC.W    $00,$00,$00,$01,$01,$02,$02,$03,$04,$05,$06,$08,$09,$0B,$0C
  147.     DC.W    $0E,$10,$12,$14,$16,$18,$1A,$1D,$1F,$22,$24,$27,$2A,$2D,$30
  148.     DC.W    $33,$36,$39,$3D,$40,$43,$47,$4A,$4E,$51,$55,$58,$5C,$60,$63
  149.     DC.W    $67,$6B,$6F,$72,$76
  150. FINETABY:
  151.  
  152.     SECTION    GRAPHIC,DATA_C
  153.  
  154. COPPERLIST:
  155. SpritePointers:
  156.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  157.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  158.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  159.     dc.w    $13e,0
  160.  
  161.     dc.w    $8E,$2c81    ; DiwStrt
  162.     dc.w    $90,$2cc1    ; DiwStop
  163.     dc.w    $92,$38        ; DdfStart
  164.     dc.w    $94,$d0        ; DdfStop
  165.     dc.w    $102,0        ; BplCon1
  166.     dc.w    $104,0        ; BplCon2
  167.     dc.w    $108,0        ; Bpl1Mod
  168.     dc.w    $10a,0        ; Bpl2Mod
  169.  
  170.             ; 5432109876543210
  171.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  172.  
  173. BPLPOINTERS:
  174.     dc.w $e0,0,$e2,0    ;primo     bitplane
  175.  
  176.     dc.w    $180,$000    ; color0    ; sfondo nero
  177.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  178.                         ; in questo caso e' vuoto,
  179.                         ; per cui non compare.
  180.  
  181.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  182.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  183.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  184.  
  185.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  186.  
  187.  
  188. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  189.  
  190. MIOSPRITE:        ; lunghezza 13 linee
  191. VSTART:
  192.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  193. HSTART:
  194.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  195. VSTOP:
  196.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  197.     dc.b $00
  198.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  199.  dc.w    %0000000000000000,%0000011001100000
  200.  dc.w    %0000000000000000,%0000001001000000
  201.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  202.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  203.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  204.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  205.  dc.w    %0000011111100000,%0000011111100000
  206.  dc.w    %0000011111100000,%0001111001111000
  207.  dc.w    %0000001111000000,%0011101111011100
  208.  dc.w    %0000000110000000,%0011000110001100
  209.  dc.w    %0000000000000000,%1111000000001111
  210.  dc.w    %0000000000000000,%1111000000001111
  211.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  212.  
  213.  
  214.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  215.                     ; perche' per vedere gli sprite
  216.                     ; e' necessario che ci siano bitplanes
  217.                     ; abilitati
  218. BITPLANE:
  219.     ds.b    40*256        ; bitplane azzerato lowres
  220.  
  221.     end
  222.  
  223. Questo esempio e` quasi identico a quello del sorgente LEZIONE7d. In questo
  224. esempio pero` la posizione verticale dello sprite puo` andare oltre la linea
  225. 255. Vi ricordo che poiche` la finestra video inizia alle coordinate ($40,$2c)
  226. la linea 255 corrisponde alla 211-esima linea visibile sullo schermo
  227. (infatti 255-$2c=211). Quindi se vogliamo che il nostro sprite possa muoversi
  228. per tutte le 256 linee visibili sullo schermo, e` necessario che la posizione
  229. verticale raggiunga il valore 299=$12b. Questo valore e` troppo grande per
  230. essere contenuto in un byte, sono necessari 9 bit. Per specificare la posizione
  231. Y di inizio dello sprite si usa quindi, oltre agli 8 bit del byte VSTART
  232. (che abbiamo usato finora), un ulteriore bit, precisamente il bit 2 del byte
  233. VHBITS, ovvero il quarto byte di controllo. Lo stesso discorso vale per la
  234. posizione di fine dello sprite, solo che si usa il bit 1 del byte VHBITS.
  235. Nella tabella invece le posizioni verticali sono memorizzate come word.
  236. La routine che legge le coordinate verticali dalla tabella controlla se
  237. i valori letti sono maggiori di 255; se questo accade mette a 1 il bit giusto
  238. del registro VHBITS, altrimenti lo azzera. Da notare che il controllo viene
  239. fatto indipendentemente per la posizione di inizio e per quella di fine;
  240. puo` accadere infatti che uno sprite inizi ad una posizione minore di 255,
  241. pero` finisca ad una posizione maggiore di 255. In questo caso il bit 2 di
  242. VHBITS viene azzerato, mentre il bit 1 di VHBITS viene settato a 1.
  243.