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

  1.  
  2. ; Lezione7n.s - esempio di applicazione della routine universale:
  3. ;        uno sprite che rimbalza
  4.  
  5.  
  6.     SECTION    CiriCop,CODE
  7.  
  8. Inizio:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Nome lib
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  16.  
  17. ;    Puntiamo la PIC "vuota"
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25. ;    Puntiamo lo sprite
  26.  
  27.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  28.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     move.l    #COPPERLIST,$dff080    ; nostra COP
  34.     move.w    d0,$dff088        ; START COP
  35.     move.w    #0,$dff1fc        ; NO AGA!
  36.     move.w    #$c00,$dff106        ; NO AGA!
  37.  
  38. mouse:
  39.     cmpi.b    #$aa,$dff006    ; Linea $aa?
  40.     bne.s    mouse
  41.  
  42.     btst    #2,$dff016
  43.     beq.s    aspetta
  44.     bsr.w    MuoviSprite    ; Muovi lo sprite 0
  45.  
  46. Aspetta:
  47.     cmpi.b    #$aa,$dff006    ; linea $aa?
  48.     beq.s    Aspetta
  49.  
  50.     btst    #6,$bfe001    ; mouse premuto?
  51.     bne.s    mouse
  52.  
  53.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  54.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  55.  
  56.     move.l    4.w,a6
  57.     jsr    -$7e(a6)    ; Enable
  58.     move.l    gfxbase(PC),a1
  59.     jsr    -$19e(a6)    ; Closelibrary
  60.     rts
  61.  
  62. ;    Dati
  63.  
  64. GfxName:
  65.     dc.b    "graphics.library",0,0
  66.  
  67. GfxBase:
  68.     dc.l    0
  69.  
  70. OldCop:
  71.     dc.l    0
  72.  
  73. ; Questa routine cambia le coordinate dello sprite aggiungendo una velocita`
  74. ; costante sia in verticale che in orizzontale. Inoltre quando lo sprite tocca
  75. ; uno dei bordi, la routine provvede a invertire la direzione.
  76. ; Per comprendere questa routine occorre sapere che l'istruzione "NEG" serve
  77. ; a trasformare un numero positivo in negativo e viceversa.
  78.  
  79. MuoviSprite:
  80.     move.w    sprite_y(PC),d0    ; leggi la vecchia posizione
  81.     add.w    speed_y(PC),d0    ; aggiungi la velocita`
  82.     btst    #15,d0        ; se il bit 15 e' settato, il numero e'
  83.                 ; diventato negativo. E' diventato negativo?
  84.     beq.s    no_tocca_sopra    ; se >0 va bene
  85.     neg.w    speed_y        ; se <0 abbiamo toccato il bordo superiore
  86.                 ; allora inverti la direzione
  87.     bra.s    Muovisprite    ; ricalcola la nuova posizione
  88.  
  89. no_tocca_sopra:
  90.     cmp.w    #243,d0    ; quando la posizione vale 256-13=243, lo sprite
  91.             ; tocca il bordo inferiore
  92.     blo.s    no_tocca_sotto
  93.     neg.w    speed_y        ; se lo sprite tocca il bordo inferiore,
  94.                 ; inverti la velocita`
  95.     bra.s    Muovisprite    ; ricacola la nuova posizione
  96.  
  97. no_tocca_sotto:
  98.     move    d0,sprite_y    ; aggiorna la posizione
  99. posiz_x:
  100.     move.w    sprite_x(PC),d1    ; leggi la vecchia posizione
  101.     add.w    speed_x(PC),d1    ; aggiungi la velocita`
  102.     btst    #15,d0        ; se il bit 15 e' settato, il numero e'
  103.                 ; diventato negativo. E' diventato negativo?
  104.     beq.s    no_tocca_sinistra
  105.     neg.w    speed_x        ; se <0 tocca a sinistra: inverti la direzione
  106.     bra.s    posiz_x        ; ricalcola nuova posizione oriz.
  107.  
  108. no_tocca_sinistra:
  109.     cmp.w    #304,d1    ; quando la posizione vale 320-16=304, lo sprite
  110.             ; tocca il bordo destro
  111.     blo.s    no_tocca_destra
  112.     neg.w    speed_x        ; se tocca a destra, inverti la direzione
  113.     bra.s    posiz_x        ; ricalcola nuova posizione oriz.
  114.  
  115. no_tocca_destra:
  116.     move.w    d1,sprite_x    ; aggiorna la posizione
  117.  
  118.     lea    miosprite,a1    ; indirizzo sprite
  119.     moveq    #13,d2        ; altezza sprite
  120.         bsr.s    UniMuoviSprite  ; esegue la routine universale che posiziona
  121.                            ; lo sprite
  122.     rts
  123.  
  124. SPRITE_Y:
  125.         DC.W    10    ; posizione sprite
  126. SPRITE_X:
  127.         DC.W    0
  128. SPEED_Y:
  129.         dc.w    -4        ; velocita` sprite
  130. SPEED_X:
  131.         dc.w    3
  132.  
  133. ; Routine universale di posizionamento degli sprite.
  134.  
  135. ;
  136. ;    Parametri in entrata di UniMuoviSprite:
  137. ;
  138. ;    a1 = Indirizzo dello sprite
  139. ;    d0 = posizione verticale Y dello sprite sullo schermo (0-255)
  140. ;    d1 = posizione orizzontale X dello sprite sullo schermo (0-320)
  141. ;    d2 = altezza dello sprite
  142. ;
  143.  
  144. UniMuoviSprite:
  145. ; posizionamento verticale
  146.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  147.  
  148. ; a1 contiene l'indirizzo dello sprite
  149.     MOVE.b    d0,(a1)        ; copia il byte in VSTART
  150.     btst.l    #8,d0
  151.     beq.s    NonVSTARTSET
  152.     bset.b    #2,3(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  153.     bra.s    ToVSTOP
  154. NonVSTARTSET:
  155.     bclr.b    #2,3(a1)    ; Azzera il bit 8 di VSTART (numero < $FF)
  156. ToVSTOP:
  157.     ADD.w    D2,D0        ; Aggiungi l'altezza dello sprite per
  158.                 ; determinare la posizione finale (VSTOP)
  159.     move.b    d0,2(a1)    ; Muovi il valore giusto in VSTOP
  160.     btst.l    #8,d0
  161.     beq.s    NonVSTOPSET
  162.     bset.b    #1,3(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  163.     bra.w    VstopFIN
  164. NonVSTOPSET:
  165.     bclr.b    #1,3(a1)    ; Azzera il bit 8 di VSTOP (numero < $FF)
  166. VstopFIN:
  167.  
  168. ; posizionamento orizzontale
  169.     add.w    #128,D1        ; 128 - per centrare lo sprite.
  170.     btst    #0,D1        ; bit basso della coordinata X azzerato?
  171.     beq.s    BitBassoZERO
  172.     bset    #0,3(a1)    ; Settiamo il bit basso di HSTART
  173.     bra.s    PlaceCoords
  174.  
  175. BitBassoZERO:
  176.     bclr    #0,3(a1)    ; Azzeriamo il bit basso di HSTART
  177. PlaceCoords:
  178.     lsr.w    #1,D1        ; SHIFTIAMO, ossia spostiamo di 1 bit a destra
  179.                 ; il valore di HSTART, per "trasformarlo" nel
  180.                 ; valore fa porre nel byte HSTART, senza cioe'
  181.                 ; il bit basso.
  182.     move.b    D1,1(a1)    ; Poniamo il valore XX nel byte HSTART
  183.     rts
  184.  
  185.  
  186.     SECTION    GRAPHIC,DATA_C
  187.  
  188. COPPERLIST:
  189. SpritePointers:
  190.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  191.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  192.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  193.     dc.w    $13e,0
  194.  
  195.     dc.w    $8E,$2c81    ; DiwStrt
  196.     dc.w    $90,$2cc1    ; DiwStop
  197.     dc.w    $92,$38        ; DdfStart
  198.     dc.w    $94,$d0        ; DdfStop
  199.     dc.w    $102,0        ; BplCon1
  200.     dc.w    $104,0        ; BplCon2
  201.     dc.w    $108,0        ; Bpl1Mod
  202.     dc.w    $10a,0        ; Bpl2Mod
  203.  
  204.             ; 5432109876543210
  205.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  206.  
  207. BPLPOINTERS:
  208.     dc.w $e0,0,$e2,0    ;primo     bitplane
  209.  
  210.     dc.w    $180,$000    ; color0    ; sfondo nero
  211.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  212.                         ; in questo caso e' vuoto,
  213.                         ; per cui non compare.
  214.  
  215.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  216.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  217.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  218.  
  219.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  220.  
  221.  
  222. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  223.  
  224. MIOSPRITE:        ; lunghezza 13 linee
  225.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  226.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  227.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  228.     dc.b $00
  229.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  230.  dc.w    %0000000000000000,%0000011001100000
  231.  dc.w    %0000000000000000,%0000001001000000
  232.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  233.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  234.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  235.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  236.  dc.w    %0000011111100000,%0000011111100000
  237.  dc.w    %0000011111100000,%0001111001111000
  238.  dc.w    %0000001111000000,%0011101111011100
  239.  dc.w    %0000000110000000,%0011000110001100
  240.  dc.w    %0000000000000000,%1111000000001111
  241.  dc.w    %0000000000000000,%1111000000001111
  242.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  243.  
  244.  
  245.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  246.                     ; perche' per vedere gli sprite
  247.                     ; e' necessario che ci siano bitplanes
  248.                     ; abilitati
  249. BITPLANE:
  250.     ds.b    40*256        ; bitplane azzerato lowres
  251.  
  252.     end
  253.  
  254. In questo esempio mostriamo un modo diverso di muovere gli sprite, senza
  255. usare le tabelle.
  256. In qesto esempio il nostro sprite si muove in modo rettilineo, con velocita`
  257. costante sia per la posizione orizzontale, sia per quella verticale.
  258. La velocita` non e` altro che un numero, contenuto in una locazione di memoria,
  259. che viene aggiunto ogni volta alla posizione che lo sprite occupava in
  260. precedenza, calcolando cosi` la nuova posizione.
  261. Se la velocita` e` un numero positivo, aumentera` ogni volta la posizione
  262. dello sprite, spostandolo verso destra (o in basso nel caso Y).
  263. Se la velocita` e` un numero negativo, diminuira` ogni volta la posizione
  264. dello sprite, spostandolo verso sinistra (o in alto nel caso Y).
  265. Quando lo sprite tocca uno dei bordi e` necessario invertire la direzione
  266. in cui si sta` spostando. Per fare cio` e` sufficente cambiare di segno la
  267. velocita`, trasformandola cioe` da positiva in negativa o viceversa.
  268. Di questo si occupa l'istruzione NEG che cambia appunto il segno di un numero
  269. contenuto in un registro o in una locazione di memoria.
  270.