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

  1.  
  2. ; Listing7r1.s    EIN SPRITE WIRD MIT DER MAUS BEWEGT
  3.  
  4. ;        ACHTUNG: Diese Routine kann horizontal nur 255 Zeilen
  5. ;        verarbeiten, und nicht alle 320
  6.  
  7.     SECTION CipundCop,CODE
  8.  
  9.  
  10. Anfang:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Libname
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; speichern die alte COP
  18.  
  19. ;    Pointen auf das "leere" PIC
  20.  
  21.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  22.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.  
  27. ;    Pointen auf den Sprite
  28.  
  29.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  30.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  31.     move.w    d0,6(a1)
  32.     swap    d0
  33.     move.w    d0,2(a1)
  34.  
  35.     move.l    #COPPERLIST,$dff080    ; unsere COP
  36.     move.w    d0,$dff088        ; START COP
  37.     move.w    #0,$dff1fc        ; NO AGA!
  38.     move.w    #$c00,$dff106
  39.  
  40. mouse:
  41.     cmpi.b    #$ff,$dff006    ; Zeile $ff?
  42.     bne.s    mouse
  43.     bsr.s    LiesMouse    ; hier wird die Mouse gelesen
  44.     moveq    #0,d0        ; lösche d0
  45.     moveq    #0,d1        ; lösche d1
  46.  
  47. ; bereite die Parameter für die Universalroutine vor
  48.  
  49.     move.b    sprite_y(pc),d0 ; Spritekoordinaten
  50.     move.b    sprite_x(pc),d1
  51.     lea    MEINSPRITE,a1    ; Spriteadresse
  52.     moveq    #13,d2        ; Hlhe des Sprite
  53.     bsr.s    UniMoveSprite    ; ruft die Universalroutine auf
  54.  
  55. Warte:
  56.     cmpi.b    #$ff,$dff006    ; Zeile $ff?
  57.     beq.s    Warte
  58.  
  59.     btst    #6,$bfe001    ; Mouse gedrückt?
  60.     bne.s    mouse
  61.  
  62.  
  63.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  64.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  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. ;    Daten
  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. ; Diese Routine liest die Mouse und erneuert die Werte in den
  84. ; Variabeln Sprite_x und Sprite_y
  85.  
  86. LiesMouse:
  87.     move.b    $dff00a,d0    ; JOY0DAT Vertikalposition der Mouse
  88.     move.b    d0,sprite_y    ; verändere Spriteposition
  89.  
  90.     move.b    $dff00b,d0    ; JOY0DAT+1 Horizontalposition der Mouse
  91.     move.b    d0,sprite_x    ; verändere Spriteposition
  92.     RTS
  93.  
  94. SPRITE_Y:    dc.b    0    ; hier wird das X der Sprite gespeichert
  95. SPRITE_X:    dc.b    0    ; hier wird das Y des Sprite gespeichert
  96.  
  97.  
  98. ; Universelle Routine zum Positionieren der Sprites
  99.  
  100. ;    Eingangsparameter von UniMoveSprite:
  101. ;
  102. ;    a1 = Adresse des Sprite
  103. ;    d0 = Vertikale Position des Sprite auf dem Screen (0-255)
  104. ;    d1 = Horizontale Position des Sprite auf dem Screen (0-320)
  105. ;    d2 = Höhe des Sprite
  106. ;
  107. UniMoveSprite:
  108. ; Vertikale Positionierung
  109.  
  110.     ADD.W    #$2c,d0     ; zähle den Offset vom Anfang des Screens dazu
  111.  
  112. ; a1 enthält die Adresse des Sprite
  113.  
  114.     MOVE.b    d0,(a1)     ; kopiert das Byte in VSTART
  115.     btst.l    #8,d0
  116.     beq.s    NichtVSTARTSET
  117.     bset.b    #2,3(a1)    ; Setzt das Bit 8 von VSTART (Zahl > $FF)
  118.     bra.s    ToVSTOP
  119. NichtVSTARTSET:
  120.     bclr.b    #2,3(a1)    ; Löscht das Bit 8 von VSTART (Zahl < $FF)
  121. ToVSTOP:
  122.     ADD.w    D2,D0        ; Zähle die Höhe des Sprite dazu, um
  123.                 ; die Endposition zu errechnen (VSTOP)
  124.     move.b    d0,2(a1)    ; Setze den richtigen Wert in VSTOP
  125.     btst.l    #8,d0
  126.     beq.s    NichtVSTOPSET
  127.     bset.b    #1,3(a1)    ; Setzt Bit 8 von VSTOP (Zahl > $FF)
  128.     bra.w    VVSTOPENDE
  129. NichtVSTOPSET:
  130.     bclr.b    #1,3(a1)    ; Löscht Bit 8 von VSTOP (Zahl < $FF)
  131. VVSTOPENDE:
  132.  
  133. ; horizontale Positionierung
  134.  
  135.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren
  136.     btst    #0,D1        ; niederwert. Bit der X-Koordinate auf 0?
  137.     beq.s    NiederBitNull
  138.     bset    #0,3(a1)    ; Setzen das niederw. Bit von HSTART
  139.     bra.s    PlaceCoords
  140.  
  141. NiederBitNull:
  142.     bclr    #0,3(a1)    ; Löschen das niederw. Bit von HSTART
  143. PlaceCoords:
  144.     lsr.w    #1,D1        ; SHIFTEN, verschieben den Wert von HSTART um
  145.                 ; 1 Bit nach Rechts, um es in den Wert zu
  146.                 ; "verwandeln", der dann in HSTART kommt, also
  147.                 ; ohne dem niederwertigen Bit.
  148.     move.b    D1,1(a1)    ; geben den Wert XX ins Byte HSTART
  149.     rts
  150.  
  151.  
  152.     SECTION GRAPHIC,DATA_C
  153.  
  154. COPPERLIST:
  155. SpritePointers:
  156.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  157.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  158.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  159.     dc.w    $13e,0
  160.  
  161.     dc.w    $8E,$2c81    ; DiwStrt
  162.     dc.w    $90,$2cc1    ; DiwStop
  163.     dc.w    $92,$38        ; DdfStart
  164.     dc.w    $94,$d0        ; DdfStop
  165.     dc.w    $102,0        ; BplCon1
  166.     dc.w    $104,0        ; BplCon2
  167.     dc.w    $108,0        ; Bpl1Mod
  168.     dc.w    $10a,0        ; Bpl2Mod
  169.  
  170.             ; 5432109876543210
  171.     dc.w    $100,%0001001000000000    ; Bit 12 an!! 1 Bitplane Lowres
  172.  
  173. BPLPOINTERS:
  174.     dc.w $e0,0,$e2,0    ;erstes    Bitplane
  175.  
  176.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  177.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  178.                         ; in diesem Fall leer ist,
  179.                         ; und deswegen nicht erscheint
  180.  
  181.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROT
  182.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  183.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GELB
  184.  
  185.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  186.  
  187.  
  188. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ********
  189.  
  190. MEINSPRITE:      ; Länge 13 Zeilen
  191. VSTART:
  192.     dc.b $50  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  193. HSTART:
  194.     dc.b $90  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  195. VSTOP:
  196.     dc.b $5d  ; $50+13=$5d    ; Vertikale Endposition des Sprite
  197. VHBITS:
  198.     dc.b $00
  199.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  200.  dc.w    %0000000000000000,%0000011001100000
  201.  dc.w    %0000000000000000,%0000001001000000
  202.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  203.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  204.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  205.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  206.  dc.w    %0000011111100000,%0000011111100000
  207.  dc.w    %0000011111100000,%0001111001111000
  208.  dc.w    %0000001111000000,%0011101111011100
  209.  dc.w    %0000000110000000,%0011000110001100
  210.  dc.w    %0000000000000000,%1111000000001111
  211.  dc.w    %0000000000000000,%1111000000001111
  212.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  213.  
  214.  
  215.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  216.                   ; müssen es verwenden, denn ohne Bitplane
  217.                   ; ist es nicht möglich, die Sprites
  218.                   ; zu aktivieren
  219. BITPLANE:
  220.     ds.b    40*256        ; Bitplane auf 0 Lowres
  221.  
  222.     end
  223.  
  224. Mit  diesem  Beispiel bewegen wir einen Sprite mit der Maus. Um den Sprite
  225. zu positionieren verwenden wir  wie  immer  unsere  Universalroutine.  Die
  226. Routine  LiesMouse  kümmert  sich darum, den Mausstatus auszulesen und die
  227. Koordinaten zu erneuern.  Diese  sind  wie  im  vorigen  Beispiel  in  den
  228. Speicherzellen Sprite_x und Sprite_y gespeichert.
  229.  
  230. Das  Auslesen  der  Maus  erfolgt  für  die  horizontale und die vertikale
  231. Position separat.
  232. Das Register JOY0DAT können wir wie ein Byte-Paar auffassen. Das  Byte  an
  233. der Adresse JOY0DAT (=$dff00a) stellt die vertikale Position dar, das Byte
  234. JOY0DAT+1 (=$dff00b) hingegen die horizontale. In  jedem  Byte  lesen  wir
  235. eine  Zahl,  die  von  0  bis  255  geht,  sie  verändert  sich  je  nach
  236. Mausbewegung:
  237.  
  238. rauf  - $dff00a dekrementiert
  239. runter - $dff00a inkrementiert
  240. links  - $dff00b dekrementiert
  241. rechts - $dff00b inkrementiert
  242.  
  243. In  diesem  Beispiel  verwenden  wir  die  ausgelesenen  Zahlen direkt als
  244. Koordinaten für den Sprite.
  245. Ihr könnt sofort erkennen, wie diese simple Methode ein "kleines"  Problem
  246. hat:  die  Zahlen, die wir vom Mouse-Register auslesen gehen nur von 0 bis
  247. 255, die horizontalen Koordinaten aber von 0 bis 320. Mit  dieser  Methode
  248. kann  der  Sprite also nie den rechten Rand erreichen. Das gleiche Problem
  249. tritt auch in vertikaler Richtung auf, wenn wir in Overscan arbeiten.  Wie
  250. man das Problem löst? Das sehen wir im nächten Beispiel.
  251.  
  252.