home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings3 / listing7a.s < prev    next >
Text File  |  1977-12-31  |  7KB  |  203 lines

  1.  
  2. ; Listing7a.s        ANZEIGEN EINES SPRITE
  3.  
  4.  
  5.     SECTION CipundCop,CODE
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Libname
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; speichern die alte COP
  15.  
  16. ;    Pointen auf das "leere" PIC
  17.  
  18.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  19.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  20.     move.w    d0,6(a1)
  21.     swap    d0
  22.     move.w    d0,2(a1)
  23.  
  24. ;    Pointen auf den Sprite
  25.  
  26.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  27.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.  
  32.     move.l    #COPPERLIST,$dff080    ; unsere 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.     btst    #6,$bfe001    ; Mouse gedrückt?
  39.     bne.s    mouse
  40.  
  41.     move.l    OldCop(PC),$dff080    ; Pointen auf die alte SystemCopperlist
  42.     move.w    d0,$dff088        ; Starten die alte SystemCopperlist
  43.  
  44.     move.l    4.w,a6
  45.     jsr    -$7e(a6)    ; Enable
  46.     move.l    gfxbase(PC),a1
  47.     jsr    -$19e(a6)    ; Closelibrary
  48.     rts
  49.  
  50. ;    Daten
  51.  
  52. GfxName:
  53.     dc.b    "graphics.library",0,0
  54.  
  55. GfxBase:
  56.     dc.l    0
  57.  
  58. OldCop:
  59.     dc.l    0
  60.  
  61.  
  62.     SECTION GRAPHIC,DATA_C
  63.  
  64. COPPERLIST:
  65. SpritePointers:
  66.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  67.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  68.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  69.     dc.w    $13e,0
  70.  
  71.     dc.w    $8E,$2c81    ; DiwStrt
  72.     dc.w    $90,$2cc1    ; DiwStop
  73.     dc.w    $92,$38     ; DdfStart
  74.     dc.w    $94,$d0     ; DdfStop
  75.     dc.w    $102,0        ; BplCon1
  76.     dc.w    $104,0        ; BplCon2
  77.     dc.w    $108,0        ; Bpl1Mod
  78.     dc.w    $10a,0        ; Bpl2Mod
  79.  
  80.             ; 5432109876543210
  81.     dc.w    $100,%0001001000000000  ; Bit 12 an!! 1 Bitplane Lowres
  82.  
  83. BPLPOINTERS:
  84.     dc.w $e0,0,$e2,0    ;erstes  Bitplane
  85.  
  86.     dc.w    $180,$000    ; color0    ; Hintergrund Schwarz
  87.     dc.w    $182,$123    ; color1    ; Farbe 1 des Bitplane, die
  88.                         ; in diesem Fall leer ist,
  89.                         ; und deswegen nicht erscheint
  90.  
  91.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROSSO
  92.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - VERDE
  93.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GIALLO
  94.  
  95.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  96.  
  97.  
  98. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ************
  99.  
  100. MEINSPRITE:      ; Länge 13 Zeilen
  101. VSTART:
  102.     dc.b $30  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  103. HSTART:
  104.     dc.b $90  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  105. VSTOP:
  106.     dc.b $3d  ; $30+13=$3d - Vertikale Endposition des Sprite
  107.     dc.b $00
  108.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  109.  dc.w    %0000000000000000,%0000011001100000
  110.  dc.w    %0000000000000000,%0000001001000000
  111.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  112.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  113.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  114.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  115.  dc.w    %0000011111100000,%0000011111100000
  116.  dc.w    %0000011111100000,%0001111001111000
  117.  dc.w    %0000001111000000,%0011101111011100
  118.  dc.w    %0000000110000000,%0011000110001100
  119.  dc.w    %0000000000000000,%1111000000001111
  120.  dc.w    %0000000000000000,%1111000000001111
  121.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  122.  
  123.  
  124.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  125.                   ; müssen es verwenden, denn ohne Bitplane
  126.                   ; ist es nicht möglich, die Sprites
  127.                   ; zu aktivieren
  128. BITPLANE:
  129.     ds.b    40*256      ; Bitplane auf 0 Lowres
  130.  
  131.     end
  132.  
  133. Das ist der erste Sprite in diesem Kurs, den wir kontrollieren, ihr  könnt
  134. ihn  leicht verändern indem ihr auf die 2 Plane zugreift, die ihn ergeben.
  135. Sie  sind  in  Binärformat  angegeben.    Die  resultierende  Farbe  der
  136. Überlagerungen  kann  leicht herausgefunden werden, wenn ihr den Kommentar
  137. neben dem Sprite lest. Die Farben des Sprite0 sind  in  den  Farbregisters
  138. 17,18 und 19 definiert.
  139.  
  140.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROSSO
  141.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - VERDE
  142.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GIALLO
  143.  
  144. Um die Position des Sprites zu verändern, greift auf die ersten Byte zu:
  145.  
  146.  
  147. MEINSPRITE:        ; Länge 13 Zeilen
  148. VSTART:
  149.     dc.b $30  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  150. HSTART:
  151.     dc.b $90  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  152. VSTOP:
  153.     dc.b $3d  ; $30+13=$3d    ; Vertikale Endposition des Sprite
  154.     dc.b $00
  155.  
  156.  
  157. Einfach folgendes bedenken:
  158.  
  159. 1) Die linke, obere Ecke des Monitors ist nocht die Position $00,$00, denn
  160. im Overscan kann der Bildschirm ja noch größer werden; In einem "normalen"
  161. Screen ist die horizontale Anfangsposition (HSTART) zwischen $40 und  $d8,
  162. ansonsten  wird der Sprite "abgeschnitten" oder er befindet sich überhaupt
  163. außerhalb des  Screens.  Ebenfalls  die  vertikale  Anfangsposition,  also
  164. VSTART,  beginnt  nicht  bei  $00,  sondern bei $2c, also am Anfang des in
  165. DIWSTART definierten Videofensters (hier ist es $2c81). Um in einem Screen
  166. zu 320x256 einen Sprite zu positionieren, z.B. auf Koordinate 160,128, muß
  167. beachtet werden, daß die linke, obere Koordinate $40,$2c  ist,  und  nicht
  168. 0,0,  es  muß  also $40 zur X-Koordinate und $2c zur Y-Koordinate summiert
  169. werden. In der Tat entspricht $40+160, $2c+128 den Koordinaten 160,128  in
  170. einem  320x256  Screen  ohne  Overscan.  Da  wir horizontal noch nicht die
  171. Kontrolle Pixel für Pixel haben, sondern noch  in  Schritten  zu  2  Pixel
  172. vorschreiten,  müssen  wir  nicht  160  dazuzählen,  sondern 160/2, um den
  173. Mittelpunkt zu treffen.
  174.  
  175.  
  176. HSTART:
  177.     dc.b $40+(160/2)    ; Position in der Mitte des Monitors
  178.  
  179. So auch für alle anderen, horizontalen Koordinaten, z.B. Position 50:
  180.  
  181.     dc.b $40+(50/2)
  182.  
  183. Später werden wir sehen, wie wir den Sprite jeweils um 1 Pixel verstellen.
  184.  
  185. 2)  Die  horizontale Position kann für sich alleine verstellt werden, wenn
  186. man den Sprite verschieben möchte. Bei der vertikalen  Positionierung  ist
  187. aber  aufzupassen!  Denn dort muß auf zwei Bytes agiert werden, dem VSTART
  188. und dem VSTOP. Also auf die vertikale Position und die Länge des  Sprites.
  189. Die  Breite  eines  Sprites  ist  immer  16, und somit ist die horizontale
  190. Endposition immer 16 Pixel weiter  rechts  als  die  Anfangsposition.  Die
  191. Länge  hingegen  kann  beliebig  sein,  und  so ist es notwendig, auch die
  192. Endposition des Sprites zu definieren. Wenn wir also den  Sprite  um  eins
  193. nach  Oben  verstellen  wollen, dann müssen wir sowohl bei VSTART wie auch
  194. bei VSTOP 1 subtrahieren,  wenn  wir  ihn  hingegen  um  eins  nach  Unten
  195. verschieben  wollen,  dann  müssen wir bei beiden Bytes 1 dazuzählen. Wenn
  196. wir in VSTART  z.B.  $55  einsetzen  möchten,  dann  müssen  wir  und  die
  197. Endposition  VSTOP  errechnen,  indem wir zu dieser Position die Länge des
  198. Sprites (bei uns 13 Zeilen) dazuzählen, also $55+13=$62. Setzt den  Sprite
  199. auf  die  verschiedensten  Positionen  am Bildschirm, um zu prüfen, ob ihr
  200. alles verstanden habt. Erinnert euch,  daß  HSTART  jedesmal  um  2  Pixel
  201. vorrückt, und nicht um 1, wie es leicht vermuten ließe.
  202.  
  203.