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

  1.  
  2. ; Lezione8p9b.s        Quesiti e consigli sulle applicazioni dei CC
  3.  
  4.     SECTION    CondC,CODE
  5.  
  6. AspettaMouse:
  7.     move.b    $BFE001,d2
  8.     and.b    #$40,D2        ; $40 = %01000000, cioe' bit 6
  9.     bne.s    AspettaMouse
  10.     RTS
  11.  
  12.     end
  13.  
  14. Come mai questa routine aspetta correttamente la pressione del mouse, senza
  15. BTST alcuno? Spero che il commento a lato e la vostra conoscenza dei CC vi
  16. faccia supporre la risposta.
  17. Veniamo ad alcune applicazioni dei "cc". Andatevi a ripescare la Lezione7n.s
  18. che faceva rimbalzare uno sprite. Ecco quella routine senza i "btst" che
  19. testavano (inutilmente) il bit alto per vedere se il numero era divenuto
  20. negativo:
  21.  
  22. ; Questa routine cambia le coordinate dello sprite aggiungendo una velocita`
  23. ; costante sia in verticale che in orizzontale. Inoltre quando lo sprite tocca
  24. ; uno dei bordi, la routine provvede a invertire la direzione.
  25. ; Per comprendere questa routine occorre sapere che l'istruzione "NEG" serve
  26. ; a trasformare un numero positivo in negativo e viceversa. Inoltre noterete
  27. ; anche un BPL dopo un ADD, e non dopo un TST o un CMP. Ora sapete perche':
  28.  
  29.  
  30. MuoviSprite:
  31.     move.w    sprite_y(PC),d0    ; leggi la vecchia posizione
  32.     add.w    speed_y(PC),d0    ; aggiungi la velocita`
  33.     bpl.s    no_tocca_sopra    ; se >0 va bene
  34.     neg.w    speed_y        ; se <0 abbiamo toccato il bordo superiore
  35.                 ; allora inverti la direzione
  36.     bra.s    Muovisprite    ; ricalcola la nuova posizione
  37.  
  38. no_tocca_sopra:
  39.     cmp.w    #243,d0    ; quando la posizione vale 256-13=243, lo sprite
  40.             ; tocca il bordo inferiore
  41.     blo.s    no_tocca_sotto
  42.     neg.w    speed_y        ; se lo sprite tocca il bordo inferiore,
  43.                 ; inverti la velocita`
  44.     bra.s    Muovisprite    ; ricacola la nuova posizione
  45.  
  46. no_tocca_sotto:
  47.     move    d0,sprite_y    ; aggiorna la posizione
  48. posiz_x:
  49.     move.w    sprite_x(PC),d1    ; leggi la vecchia posizione
  50.     add.w    speed_x(PC),d1    ; aggiungi la velocita`
  51.     bpl.s    no_tocca_sinistra
  52.     neg.w    speed_x        ; se <0 tocca a sinistra: inverti la direzione
  53.     bra.s    posiz_x        ; ricalcola nuova posizione oriz.
  54.  
  55. no_tocca_sinistra:
  56.     cmp.w    #304,d1    ; quando la posizione vale 320-16=304, lo sprite
  57.             ; tocca il bordo destro
  58.     blo.s    no_tocca_destra
  59.     neg.w    speed_x        ; se tocca a destra, inverti la direzione
  60.     bra.s    posiz_x        ; ricalcola nuova posizione oriz.
  61.  
  62. no_tocca_destra:
  63.     move.w    d1,sprite_x    ; aggiorna la posizione
  64.  
  65.     lea    miosprite,a1    ; indirizzo sprite
  66.     moveq    #13,d2        ; altezza sprite
  67.         bsr.s    UniMuoviSprite  ; esegue la routine universale che posiziona
  68.                            ; lo sprite
  69.     rts
  70.  
  71. -    -    -    -    -    -    -    -    -    -
  72.  
  73. Ora vediamo un'altro possibile utilizzo dei CC. Supponiamo di voler fare uno
  74. scroll verticale ad un bitplane, usando una routine diversa da quella che
  75. "preleva" l'indirizzo dai bplpointers, adda 40 e lo ripunta.
  76. Supponiamo che questa routine debba solo addare 40 al bpl0ptl, ossia alla
  77. word bassa dell'indirizzo. Il problema si pone quando ci troviamo, ad esempio,
  78. all'indirizzo $2ffE2, per cui addando 40 andremmo a $3000a, e anche la word
  79. alta cambia:
  80.  
  81. Copperlist:
  82.     ...
  83.     dc.w    $e0    ; bpl0pth
  84. PlaneH:
  85.     dc.w    $0002
  86.     dc.w    $e2    ; bpl0ptl
  87. PlaneL:
  88.     dc.w    $ffe2
  89.  
  90. Come vedete se addiamo 40 a PlaneL otteniamo $000A, ma PlaneH rimane $0002!
  91. Per questo ogni volta preleviamo l'indirizzo, sommiamo e lo rimettiamo nelle
  92. 2 word! Altrimenti quando "scatta" la word alta come faremmo?
  93. Con i CC comunque qualcosa si puo' fare. Abbiamo detto che $ffe2+40 ci da
  94. la soluzione esatta, $000a, ma si setta anche il Carry, per il riporto, dato
  95. che abbiamo superato $ffff. Allo potremmo scrivere:
  96.  
  97. Scroll:
  98.     add.w    #40,PlaneL    ; Scendi di una linea aggiungendo 40 alla
  99.                 ; word bassa dell'indirizzo a cui punta il
  100.                 ; bpl1pt
  101.     bcc.s    NonScattato    ; Abbiamo superato il valore contenibile
  102.                 ; dalla word e dobbiamo modificare anche
  103.                 ; la word alta? Se no salta...
  104.     addq.w    #1,PlaneH    ; Altrimenti adda di 1 la word alta, ossia
  105.                 ; "esegui" il riporto dell'add sul PlaneL!
  106. NonScattato:
  107.     rts
  108.  
  109. Questi sono alcuni esempi di come si possono "rivedere" routines gia' note.
  110.  
  111.