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

  1.  
  2. ; Lezione7r1.s    UNO SPRITE MOSSO CON IL MOUSE
  3.  
  4. ;        NOTA: Questa routine orizzontalmente puo' gestire solo
  5. ;              255 linee e non tutte le 320.
  6.  
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Nome lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  18.  
  19. ;    Puntiamo la PIC "vuota"
  20.  
  21.     MOVE.L    #BITPLANE,d0    ; dove puntare
  22.     LEA    BPLPOINTERS,A1    ; puntatori COP
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.  
  27. ;    Puntiamo lo sprite
  28.  
  29.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  30.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  31.     move.w    d0,6(a1)
  32.     swap    d0
  33.     move.w    d0,2(a1)
  34.  
  35.     move.l    #COPPERLIST,$dff080    ; nostra COP
  36.     move.w    d0,$dff088        ; START COP
  37.     move.w    #0,$dff1fc        ; NO AGA!
  38.     move.w    #$c00,$dff106        ; NO AGA!
  39.  
  40. mouse:
  41.     cmpi.b    #$ff,$dff006    ; Linea 255?
  42.     bne.s    mouse
  43.  
  44.     bsr.s    LeggiMouse    ; questa legge il mouse
  45.     moveq    #0,d0        ; pulisci d0
  46.     moveq    #0,d1        ; pulisci d1
  47.  
  48. ; prepara i parametri per la routine universale
  49.  
  50.         move.b    sprite_y(pc),d0 ; coordinate sprite
  51.         move.b    sprite_x(pc),d1
  52.     lea    miosprite,a1    ; indirizzo sprite
  53.     moveq    #13,d2        ; altezza sprite
  54.     bsr.s    UniMuoviSprite    ; chiama la routine universale
  55.  
  56. Aspetta:
  57.     cmpi.b    #$ff,$dff006    ; linea 255?
  58.     beq.s    Aspetta
  59.  
  60.     btst    #6,$bfe001    ; mouse premuto?
  61.     bne.s    mouse
  62.  
  63.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  64.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  65.  
  66.     move.l    4.w,a6
  67.     jsr    -$7e(a6)    ; Enable
  68.     move.l    gfxbase(PC),a1
  69.     jsr    -$19e(a6)    ; Closelibrary
  70.     rts
  71.  
  72. ;    Dati
  73.  
  74. GfxName:
  75.     dc.b    "graphics.library",0,0
  76.  
  77. GfxBase:
  78.     dc.l    0
  79.  
  80. OldCop:
  81.     dc.l    0
  82.  
  83. ; Questa routine legge il mouse e aggiorna i valori contenuti nelle
  84. ; variabili sprite_x e sprite_y
  85.  
  86. LeggiMouse:
  87.     move.b    $dff00a,d0      ; JOY0DAT posizione verticale mouse
  88.     move.b    d0,sprite_y    ; modifica posizione sprite
  89.  
  90.     move.b    $dff00b,d0    ; JOY0DAT+1 posizione orizzontale mouse
  91.     move.b    d0,sprite_x    ; modifica pos. sprite
  92.     RTS
  93.  
  94. SPRITE_Y:    dc.b    0    ; qui viene memorizzata la Y dello sprite
  95. SPRITE_X:    dc.b    0    ; qui viene memorizzata la X dello sprite
  96.  
  97.  
  98.  
  99.  
  100. ; Routine universale di posizionamento degli sprite.
  101.  
  102. ;
  103. ;    Parametri in entrata di UniMuoviSprite:
  104. ;
  105. ;    a1 = Indirizzo dello sprite
  106. ;    d0 = posizione verticale Y dello sprite sullo schermo (0-255)
  107. ;    d1 = posizione orizzontale X dello sprite sullo schermo (0-320)
  108. ;    d2 = altezza dello sprite
  109. ;
  110.  
  111. UniMuoviSprite:
  112. ; posizionamento verticale
  113.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  114.  
  115. ; a1 contiene l'indirizzo dello sprite
  116.     MOVE.b    d0,(a1)        ; copia il byte in VSTART
  117.     btst.l    #8,d0
  118.     beq.s    NonVSTARTSET
  119.     bset.b    #2,3(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  120.     bra.s    ToVSTOP
  121. NonVSTARTSET:
  122.     bclr.b    #2,3(a1)    ; Azzera il bit 8 di VSTART (numero < $FF)
  123. ToVSTOP:
  124.     ADD.w    D2,D0        ; Aggiungi l'altezza dello sprite per
  125.                 ; determinare la posizione finale (VSTOP)
  126.     move.b    d0,2(a1)    ; Muovi il valore giusto in VSTOP
  127.     btst.l    #8,d0
  128.     beq.s    NonVSTOPSET
  129.     bset.b    #1,3(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  130.     bra.w    VstopFIN
  131. NonVSTOPSET:
  132.     bclr.b    #1,3(a1)    ; Azzera il bit 8 di VSTOP (numero < $FF)
  133. VstopFIN:
  134.  
  135. ; posizionamento orizzontale
  136.     add.w    #128,D1        ; 128 - per centrare lo sprite.
  137.     btst    #0,D1        ; bit basso della coordinata X azzerato?
  138.     beq.s    BitBassoZERO
  139.     bset    #0,3(a1)    ; Settiamo il bit basso di HSTART
  140.     bra.s    PlaceCoords
  141.  
  142. BitBassoZERO:
  143.     bclr    #0,3(a1)    ; Azzeriamo il bit basso di HSTART
  144. PlaceCoords:
  145.     lsr.w    #1,D1        ; SHIFTIAMO, ossia spostiamo di 1 bit a destra
  146.                 ; il valore di HSTART, per "trasformarlo" nel
  147.                 ; valore fa porre nel byte HSTART, senza cioe'
  148.                 ; il bit basso.
  149.     move.b    D1,1(a1)    ; Poniamo il valore XX nel byte HSTART
  150.     rts
  151.  
  152.  
  153.     SECTION    GRAPHIC,DATA_C
  154.  
  155. COPPERLIST:
  156. SpritePointers:
  157.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  158.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  159.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  160.     dc.w    $13e,0
  161.  
  162.     dc.w    $8E,$2c81    ; DiwStrt
  163.     dc.w    $90,$2cc1    ; DiwStop
  164.     dc.w    $92,$38        ; DdfStart
  165.     dc.w    $94,$d0        ; DdfStop
  166.     dc.w    $102,0        ; BplCon1
  167.     dc.w    $104,0        ; BplCon2
  168.     dc.w    $108,0        ; Bpl1Mod
  169.     dc.w    $10a,0        ; Bpl2Mod
  170.  
  171.             ; 5432109876543210
  172.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  173.  
  174. BPLPOINTERS:
  175.     dc.w $e0,0,$e2,0    ;primo     bitplane
  176.  
  177.     dc.w    $180,$000    ; color0    ; sfondo nero
  178.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  179.                         ; in questo caso e' vuoto,
  180.                         ; per cui non compare.
  181.  
  182.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  183.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  184.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  185.  
  186.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  187.  
  188.  
  189. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  190.  
  191. MIOSPRITE:        ; lunghezza 13 linee
  192. VSTART:
  193.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  194. HSTART:
  195.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  196. VSTOP:
  197.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  198. VHBITS:
  199.     dc.b $00    ; bit
  200.  
  201.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  202.  dc.w    %0000000000000000,%0000011001100000
  203.  dc.w    %0000000000000000,%0000001001000000
  204.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  205.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  206.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  207.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  208.  dc.w    %0000011111100000,%0000011111100000
  209.  dc.w    %0000011111100000,%0001111001111000
  210.  dc.w    %0000001111000000,%0011101111011100
  211.  dc.w    %0000000110000000,%0011000110001100
  212.  dc.w    %0000000000000000,%1111000000001111
  213.  dc.w    %0000000000000000,%1111000000001111
  214.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  215.  
  216.  
  217.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  218.                     ; perche' per vedere gli sprite
  219.                     ; e' necessario che ci siano bitplanes
  220.                     ; abilitati
  221. BITPLANE:
  222.     ds.b    40*256        ; bitplane azzerato lowres
  223.  
  224.     end
  225.  
  226. In questo esempio muoviamo uno sprite con il mouse.
  227. Per posizionare lo sprite sullo schermo usiamo la nostra routine universale,
  228. che abbiamo gia` bella pronta risparmiandoci un po' di lavoro.
  229. La routine LeggiMouse invece si occupa di rilevare lo stato del mouse e di
  230. conseguenza aggiorna le coordinate dello sprite che sono memorizzate
  231. in 2 locazioni di memoria: SPRITE_X e SPRITE_Y.
  232.  
  233. La lettura del mouse avviene separatamente per le posizioni orizzontali e
  234. verticali. Il registro JOY0DAT lo possiamo considerare come una coppia di
  235. byte. Il byte all'indirizzo JOY0DAT (=$dff00a) si occupa della posizione
  236. verticale, mentre quello all'indirizzo JOY0DAT+1 (=$dff00b) si occupa
  237. della posizione orizzontale. In ogni byte leggiamo un numero, che va
  238. da 0 a 255, che varia a seconda dei movimenti del mouse:
  239.  
  240. alto - $dff00a decresce
  241. basso - $dff00a cresce
  242. sinistra - $dff00b decresce
  243. destra - $dff00b cresce
  244.  
  245. In questo esempio usiamo i numeri che leggiamo dal mouse direttamente
  246. come coordinate dello sprite.
  247. Potete subito vedere come questo semplice metodo, ha un "piccolo" problema:
  248. i numeri che leggiamo dal mouse vanno da 0 a 255, mentre le coordinate
  249. orizzontali vanno da 0 a 320. Quindi con questo metodo lo sprite non puo`
  250. raggiungere il bordo destro dello schermo. Inoltre lo stesso problema si
  251. presenterebbe per le coordinate verticali se usassimo uno schermo in
  252. overscan.
  253. Come risolverlo ? Lo vedremo nel prossimo esempio.
  254.  
  255.