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

  1.  
  2. ; Listing7p.s    EIN SPRITE WIRD MIT DEM JOYSTICK BEWEGT
  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
  36.  
  37. mouse:
  38.     cmpi.b    #$ff,$dff006    ; Zeile $aa?
  39.     bne.s    mouse
  40.  
  41.     btst    #7,$bfe001    ; FEUERKNOPF gedrückt?
  42.     bne.s    NonFuoco    ; Wenn nicht, überspringe die nächste Anweisung
  43.     move.w    #$f00,$dff180    ; Wenn ja, gib ein schönes ROT in COLOR0
  44. NonFuoco:
  45.  
  46.     bsr.s    LiesJoy        ; das liest den Joystick
  47.     move.w    sprite_y(pc),d0 ; bereite die Parameter für Universalroutine
  48.     move.w    sprite_x(pc),d1 ; vor
  49.     lea    MEINSPRITE,a1    ; Spriteadresse
  50.     moveq    #13,d2        ; Höhe des Sprite
  51.     bsr.w    UniMoveSprite    ; Aufruf der UniversalRoutine
  52.  
  53. Warte:
  54.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  55.     beq.s    Warte
  56.  
  57.     btst    #6,$bfe001    ; Mouse gedrückt?
  58.     bne.s    mouse
  59.  
  60.  
  61.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  62.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  63.  
  64.     move.l    4.w,a6
  65.     jsr    -$7e(a6)    ; Enable
  66.     move.l    gfxbase(PC),a1
  67.     jsr    -$19e(a6)    ; Closelibrary
  68.     rts
  69.  
  70. ;    Daten
  71.  
  72. GfxName:
  73.     dc.b    "graphics.library",0,0
  74.  
  75. GfxBase:
  76.     dc.l    0
  77.  
  78. OldCop:
  79.     dc.l    0
  80.  
  81. ; Diese Routine liest den Joystick aus und updatet die Werte in
  82. ; den Variabeln Sprite_x und Sprite_y
  83.  
  84. LiesJoy:
  85.     MOVE.w    $dff00c,D3    ; JOY1DAT
  86.     BTST.l    #1,D3        ; das Bit 1 sagt uns, ob wir nach rechts gehn
  87.     BEQ.S    NICHTRECHTS    ; wenn es 0 ist, gehen wir nicht rechts
  88.     ADDQ.w    #1,SPRITE_X    ; wenn es 1 ist, bewege den Sprite um 1 Pixel
  89.                 ; nach rechts
  90.     BRA.S    CHECK_Y        ; geh´ zur Kontrolle für Y
  91.  
  92. NICHTRECHTS:
  93.     BTST.l    #9,D3        ; Bit 9 sagt uns, ob wir nach links gehn.
  94.     BEQ.S    CHECK_Y        ; wenn es 0 ist, gehen wir nicht nach links
  95.     SUBQ.W    #1,SPRITE_X    ; wenn es 1 ist, bewege den Sprite
  96. CHECK_Y:
  97.     MOVE.w    D3,D2        ; kopiere den Wert des Registers
  98.     LSR.w    #1,D2        ; läßt die Bits um eins nach Rechts rutschen
  99.     EOR.w    D2,D3        ; Exklusives OR. Nun können wir testen
  100.     BTST.l    #8,D3        ; Testen, ob es nach oben geht
  101.     BEQ.S    NICHTRAUF    ; wenn nicht, kontrolliere ob nach unten
  102.     SUBQ.W    #1,SPRITE_Y    ; wenn ja, bewege den Sprite
  103.     BRA.S    ENDJOYST
  104.  
  105. NICHTRAUF:
  106.     BTST.l    #0,D3        ; testen, ob es nach unten geht
  107.     BEQ.S    ENDJOYST    ; wenn nicht, ende
  108.     ADDQ.W    #1,SPRITE_Y    ; wenn ja, bewege den Sprite
  109. ENDJOYST:
  110.     RTS
  111.  
  112. SPRITE_Y:    dc.w    0    ; hier wird das Y des Sprite gespeichert
  113. SPRITE_X:    dc.w    0    ; hier wird das X des Sprite gespeichert
  114.  
  115. ; Universelle Routine zum Positionieren der Sprites
  116.  
  117. ;    Eingangsparameter von UniMoveSprite:
  118. ;
  119. ;    a1 = Adresse des Sprite
  120. ;    d0 = Vertikale Position des Sprite auf dem Screen (0-255)
  121. ;    d1 = Horizontale Position des Sprite auf dem Screen (0-320)
  122. ;    d2 = Höhe des Sprite
  123. ;
  124. UniMoveSprite:
  125. ; Vertikale Positionierung
  126.  
  127.     ADD.W    #$2c,d0     ; zähle den Offset vom Anfang des Screens dazu
  128.  
  129. ; a1 enthält die Adresse des Sprite
  130.  
  131.     MOVE.b    d0,(a1)        ; kopiert das Byte in VSTART
  132.     btst.l    #8,d0
  133.     beq.s    NichtVSTARTSET
  134.     bset.b    #2,3(a1)    ; Setzt das Bit 8 von VSTART (Zahl > $FF)
  135.     bra.s    ToVSTOP
  136. NichtVSTARTSET:
  137.     bclr.b    #2,3(a1)    ; Löscht das Bit 8 von VSTART (Zahl < $FF)
  138. ToVSTOP:
  139.     ADD.w    D2,D0        ; Zähle die Höhe des Sprite dazu, um
  140.                 ; die Endposition zu errechnen (VSTOP)
  141.     move.b    d0,2(a1)    ; Setze den richtigen Wert in VSTOP
  142.     btst.l    #8,d0
  143.     beq.s    NichtVSTOPSET
  144.     bset.b    #1,3(a1)    ; Setzt Bit 8 von VSTOP (Zahl > $FF)
  145.     bra.w    VVSTOPENDE
  146. NichtVSTOPSET:
  147.     bclr.b    #1,3(a1)    ; Löscht Bit 8 von VSTOP (Zahl < $FF)
  148. VVSTOPENDE:
  149.  
  150. ; horizontale Positionierung
  151.  
  152.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren
  153.     btst    #0,D1        ; niederwert. Bit der X-Koordinate auf 0?
  154.     beq.s    NiederBitNull
  155.     bset    #0,3(a1)    ; Setzen das niederw. Bit von HSTART
  156.     bra.s    PlaceCoords
  157.  
  158. NiederBitNull:
  159.     bclr    #0,3(a1)    ; Löschen das niederw. Bit von HSTART
  160. PlaceCoords:
  161.     lsr.w    #1,D1        ; SHIFTEN, verschieben den Wert von HSTART um
  162.                 ; 1 Bit nach Rechts, um es in den Wert zu
  163.                 ; "verwandeln", der dann in HSTART kommt, also
  164.                 ; ohne dem niederwertigen Bit.
  165.     move.b    D1,1(a1)    ; geben den Wert XX ins Byte HSTART
  166.     rts
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.     SECTION GRAPHIC,DATA_C
  174.  
  175. COPPERLIST:
  176. SpritePointers:
  177.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  178.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  179.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  180.     dc.w    $13e,0
  181.  
  182.     dc.w    $8E,$2c81    ; DiwStrt
  183.     dc.w    $90,$2cc1    ; DiwStop
  184.     dc.w    $92,$38        ; DdfStart
  185.     dc.w    $94,$d0        ; DdfStop
  186.     dc.w    $102,0        ; BplCon1
  187.     dc.w    $104,0        ; BplCon2
  188.     dc.w    $108,0        ; Bpl1Mod
  189.     dc.w    $10a,0        ; Bpl2Mod
  190.  
  191.             ; 5432109876543210
  192.     dc.w    $100,%0001001000000000    ; Bit 12 an!! 1 Bitplane Lowres
  193.  
  194. BPLPOINTERS:
  195.     dc.w $e0,0,$e2,0    ;erstes    Bitplane
  196.  
  197.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  198.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  199.                         ; in diesem Fall leer ist,
  200.                         ; und deswegen nicht erscheint
  201.  
  202.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROT
  203.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  204.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GELB
  205.  
  206.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  207.  
  208.  
  209. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ********
  210.  
  211. MEINSPRITE:      ; Länge 13 Zeilen
  212. VSTART:
  213.     dc.b $50  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  214. HSTART:
  215.     dc.b $90  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  216. VSTOP:
  217.     dc.b $5d  ; $50+13=$5d    ; Vertikale Endposition des Sprite
  218. VHBITS:
  219.     dc.b $00
  220.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  221.  dc.w    %0000000000000000,%0000011001100000
  222.  dc.w    %0000000000000000,%0000001001000000
  223.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  224.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  225.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  226.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  227.  dc.w    %0000011111100000,%0000011111100000
  228.  dc.w    %0000011111100000,%0001111001111000
  229.  dc.w    %0000001111000000,%0011101111011100
  230.  dc.w    %0000000110000000,%0011000110001100
  231.  dc.w    %0000000000000000,%1111000000001111
  232.  dc.w    %0000000000000000,%1111000000001111
  233.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  234.  
  235.  
  236.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  237.                   ; müssen es verwenden, denn ohne Bitplane
  238.                   ; ist es nicht möglich, die Sprites
  239.                   ; zu aktivieren
  240. BITPLANE:
  241.     ds.b    40*256        ; Bitplane auf 0 Lowres
  242.  
  243.     end
  244.  
  245. In  diesem  Beispile  bewegen  wir  den  Sprite  mit  dem  Joystick.  Das
  246. einfachstge ist zu kontrollieren, ob der Feuerknopf gedrückt ist,  einfach
  247. ein  BTST  #7,$bfe001, genau das Gleiche wie bei der linken Maustaste, nur
  248. ist es dort das Bit 6. Um den Sprite am Monitor zu bewegen  verwenden  wir
  249. unsere  Universalroutine, die wir schon fix und fertig vorliegen haben und
  250. ersparen uns so eine Menge Arbeit.
  251. Die Routine LiesJoy  kümmert  sich  darum,  den  Joystick  auszulesen  und
  252. infolgedessen  die Koordinaten des Sprites zu erneuern, sie upzudaten. Sie
  253. sind in den zwei Speicherzellen Sprite_x und Sprite_y festgehalten. Um den
  254. Joystick  lesen  zu  können brauchen wir das Exklusive OR, das, wie wir in
  255. der Lektion gesehen haben, eine Ex-OR-Operation zwischen den Bits aus zwei
  256. Registern  durchführt.  Das  Lesen des Joystick erfolgt durch das Register
  257. JOY1DAT. Um zu wissen, ob der Hebel des Joystick nach  links  oder  rechts
  258. gedrückt  ist,  reicht  es  den Status der Bits 1 und 9 zu kennen. Für die
  259. anderen Richtungen ist es etwas komplizierter. Denn um zu wissen,  ob  der
  260. Hebel  nach  oben gedrückt ist, muß ein Ex-OR zeischen dem Bit 8 und 9 von
  261. JOY1DAT gemacht werden. Da sich diese Bits aber beide im  selben  Register
  262. befinden  kopieren wir dieses in zwei Datenregister des 68000, z.B. d2 und
  263. d3. Dann SHIFTEN ("rutschen") wir eines der beiden Register um eine Stelle
  264. nach  rechts.  Somit  wird  das  Bit  9  des  Registers auf die Position 8
  265. verstellt. Da das Register,  das  wir  geshiftet  haben,  eine  Kopie  von
  266. JOY1DAT  war,  wird nach dem SHIFT das Bit 8 des Datenregisters gleich dem
  267. Bit 9 von JOY1DAT sein. Im noch nicht  geshiftetem  Register  wird  Bit  8
  268. hingegen immer noch gleich dem Bit 8 von JOY1DAT sein.
  269. Wenn wir nun ein EOR zwischen den beiden Registern machen wird in Position
  270. 8  das  EOR  zwischen  Bit  8 des Registers JOY1DAT und Bit 9 von Register
  271. JOY1DAT sein. Genau das, was wir brauchten, um zu wissen,  ob  der  Sprite
  272. nach oben geht. Um zu wissen, ob der Sprite nach unten geht müssen wir ein
  273. EOR zwischen Bit 0 und 1 machen, genauso wie gerade beschrieben.
  274.  
  275. Ihr könnt versuchen, die Geschwindigkeit des Sprites  zu  verändern.  Wenn
  276. die  Routine  LiesJoy  eine Bewegung des Hebels registriert, dann wird der
  277. Sprite um 1 Pixel verstellt (mit ADDQ #1,xxx oder SUBQ #1,xxx).  Wenn  ihr
  278. statt 1 größere Werte einsetzt, dann wird er sich schneller bewegen.
  279.  
  280.