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

  1.  
  2. ; Listing7x2.s    - Kollision Sprite-Dual Playfield-Mode
  3. ; In diesem Beispiel zeigen wir die Kollision zwischen einem Sprite und
  4. ; den zwei Playfields. Der Sprite bewegt sich von oben nach unten. Wenn eine
  5. ; Kollision auftritt, verändert sich die Hintergrundfarbe (Rot oder Grün,
  6. ; je nach Art der Kollision).
  7.  
  8.  
  9.     SECTION CipundCop,CODE
  10.  
  11. Anfang:
  12.     move.l    4.w,a6        ; Execbase
  13.     jsr    -$78(a6)    ; Disable
  14.     lea    GfxName(PC),a1    ; Name lib
  15.     jsr    -$198(a6)    ; OpenLibrary
  16.     move.l    d0,GfxBase
  17.     move.l    d0,a6
  18.     move.l    $26(a6),OldCop    ; speichern die alte COP
  19.  
  20. ; Usiamo 2 planes per ogni playfield
  21.  
  22. ;    Pointen wie immer auf unser PIC
  23.  
  24.     MOVE.L    #PIC1,d0
  25.     LEA    BPLPOINTERS1,A1
  26.     MOVEQ    #2-1,D1
  27. POINTBP:
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.     swap    d0
  32.     ADD.L    #40*256,d0
  33.     addq.w    #8,a1
  34.     dbra    d1,POINTBP
  35.  
  36.  
  37.     MOVE.L    #PIC2,d0    ; point playfield 2
  38.     LEA    BPLPOINTERS2,A1
  39.     MOVEQ    #2-1,D1
  40. POINTBP2:
  41.     move.w    d0,6(a1)
  42.     swap    d0
  43.     move.w    d0,2(a1)
  44.     swap    d0
  45.     ADD.L    #40*256,d0
  46.     addq.w    #8,a1
  47.     dbra    d1,POINTBP2
  48.  
  49. ;    Pointen auf den Sprite
  50.  
  51.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  52.     MOVE.L    #MEINSPRITE0,d0        ; Adresse des Sprite in d0
  53.     move.w    d0,6(a1)
  54.     swap    d0
  55.     move.w    d0,2(a1)
  56.     add.l    #16,a1
  57.  
  58.     move.l    #COPPERLIST,$dff080    ; unsere COP
  59.     move.w    d0,$dff088        ; START COP
  60.     move.w    #0,$dff1fc        ; NO AGA!
  61.     move.w    #$c00,$dff106        ; NO AGA!
  62.  
  63.  
  64.     move.w    #$0024,$dff104    ; BPLCON2
  65.                 ; mit diesem Wert sind alle Sprites über
  66.                 ; den Bitplanes
  67.  
  68. Warte1:
  69.     cmp.b    #$ff,$dff006    ; Zeile 255?
  70.     bne.s    Warte1
  71. Warte11:
  72.     cmp.b    #$ff,$dff006    ; Immer noch Zeile 255?
  73.     beq.s    Warte11
  74.  
  75.     btst    #6,$bfe001
  76.     beq.s    Raus
  77.  
  78.     bsr.s    BewegeSprite    ; Bewege den Sprite nach unten
  79.     bsr.w    CheckColl    ; Kontrolliert Kollision und greift ein
  80.  
  81.     bra.s    Warte1
  82.  
  83. Raus    move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  84.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  85.  
  86.     move.l    4.w,a6
  87.     jsr    -$7e(a6)    ; Enable
  88.     move.l    gfxbase(PC),a1
  89.     jsr    -$19e(a6)    ; Closelibrary
  90.     rts
  91.  
  92. ;    Dati
  93.  
  94. GfxName:
  95.     dc.b    "graphics.library",0,0
  96.  
  97. GfxBase:
  98.     dc.l    0
  99.  
  100. OldCop:
  101.     dc.l    0
  102.  
  103. ; Diese Routine bewegt den Sprite 0 nach Unten, jeweils um 1 Pixel pro
  104. ; Frame. Es wird ein Flag verwendet.
  105.  
  106. BewegeSprite:
  107.     not.w    flag
  108.     beq.s    EndeBewegeSprite
  109.  
  110.     addq.w    #1,Hoehe
  111.     cmp.w    #300,Hoehe    ; ist er am unteren Rand angekommen?
  112.     blo.s    kein_Rand
  113.     move.w    #$2c,Hoehe    ; wenn ja, setz ihn wieder rauf
  114. kein_Rand:
  115.     move.w    Hoehe(PC),d0
  116.     CLR.B    VHBITS0         ; lösche Bit 8 der vertikalen Position
  117.     MOVE.b    d0,VSTART0    ; Kopiert die Bit von 0 bis 7 von VSTART
  118.     BTST.l    #8,D0        ; ist die Position größer als 255 ?
  119.     BEQ.S    NOBIGVSTART    ; wenn nicht, geh weiter, das Bit wurde schon
  120.                 ; vom CLR.b VHBITS gelöscht
  121.  
  122.     BSET.b    #2,VHBITS0    ; ansonsten setze Bit 8 auf 1 (Vertikale Start-
  123.                 ; position)
  124. NOBIGVSTART:
  125.     ADDQ.w    #8,D0        ; Zähle die Länge des Sprite dazu, um die
  126.                 ; Endposition (VSTOP) zu ermitteln
  127.     move.b    d0,VSTOP0    ; Gib die Bit von 0 bis 7 in VSTOP
  128.     BTST.l    #8,D0        ; ist die Position größer als 255 ?
  129.     BEQ.S    NOBIGVSTOP    ; wenn nicht, geh weiter, denn das Bit wurde
  130.                 ; schon mit dem CLR.b VHBITS auf NULL gesetzt
  131.     BSET.b    #1,VHBITS0    ; ansonsten setze Bit 8 auf 1 (Vertikale Start-
  132.                 ; position)
  133. NOBIGVSTOP:
  134. EndeBewegeSprite:
  135.     rts
  136.  
  137.  
  138. ; Diese Routine kontrolliert, ob es eine Kollision gibt.
  139. ; Wenn ja, verändert sie die Farbe des Hintergrundes, in dem sie in der
  140. ; Copperlist das Register COLOR0 verändert.
  141.  
  142. CheckColl:
  143.     move.w    $dff00e,d0    ; liest CLXDAT ($dff00e)
  144.                 ; das Lesen dieses Registers bewirkt auch
  145.                 ; seine sofortige Löschung, es ist also besser,
  146.                 ; man kopiert es sich in d0 und macht dort dann
  147.                 ; die Tests
  148.     btst.l    #1,d0            ; das Bit 1 meldet eine Kollision zwischen
  149.                 ; Sprite 0 und Playfield 1
  150.     beq.s    no_coll1    ; wenn´s keine Kollision gab, überspringe
  151.  
  152.     move.w    #$f00,Kollisions_Sensor ; "anschalten" des Signales (COLOR0)
  153.                     ; verändert die Copperlist (Rot)
  154.     bra.s    exitColl        ; Raus
  155.  
  156. no_coll1:
  157.     btst.l    #5,d0        ; Das Bit 5 meldet eine Kollision zwischen
  158.                 ;  Sprite 0 und Playfield 2
  159.     beq.s    no_coll2          ; wenn´s keine Kollision gab, überspringe
  160.     move.w    #$0f0,Kollisions_Sensor ; "anschalten" des Signeles (COLOR0)
  161.                     ; verändert die Copperlist (Grün)
  162.     bra.s    exitColl        ; Raus
  163.  
  164. no_coll2:
  165.     move.w    #$000,Kollisions_Sensor ; "aussachlten" des Sinales (COLOR0)
  166.                     ; verändern die Copperlist (Schwarz)
  167. exitColl:
  168.     rts
  169.  
  170. flag:
  171.     dc.w    0
  172. Hoehe:
  173.     dc.w    $2c
  174.  
  175.  
  176.     SECTION GRAPHIC,DATA_C
  177.  
  178. COPPERLIST:
  179. SpritePointers:
  180.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  181.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  182.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  183.     dc.w    $13e,0
  184.  
  185.     dc.w    $8E,$2c81    ; DiwStrt
  186.     dc.w    $90,$2cc1    ; DiwStop
  187.     dc.w    $92,$38        ; DdfStart
  188.     dc.w    $94,$d0        ; DdfStop
  189.     dc.w    $102,0        ; BplCon1
  190.     dc.w    $108,0        ; Bpl1Mod
  191.     dc.w    $10a,0        ; Bpl2Mod
  192.  
  193.             ; 5432109876543210
  194.     dc.w    $100,%0100011000000000    ; Bit 10 an = Dual Playfield
  195.                     ; 4 Planes = 4 Farben pro Playfield
  196.  
  197. BPLPOINTERS1:
  198.     dc.w $e0,0,$e2,0    ;erstes Bitplane Playfield 1 (BPLPT1)
  199.     dc.w $e8,0,$ea,0    ;zweites Bitplane Playfield 1 (BPLPT3)
  200.  
  201.  
  202. BPLPOINTERS2:
  203.     dc.w $e4,0,$e6,0    ;erstes Bitplane Playfield 2 (BPLPT2)
  204.     dc.w $ec,0,$ee,0    ;zweites Bitplane Playfield 2 (BPLPT4)
  205.  
  206.  ; Das ist das Register CLXCON (kontrolliert die Art der Registrierung)
  207.  
  208. ; Die Bit von 0 bis 5 sind die Werte, die von den Planes eingenommen werden
  209. ; müssen
  210. ; Die Bit 6 bis 11 zeigen, welche Planes aktiv für Kollisionen sind
  211. ; Die Bit 12 bis 15 zeigen, welche ungeraden Sprites aktiviert werden sollen
  212. ; (für die Spriteregistrierung)
  213.  
  214.             ;5432109876543210
  215.     dc.w    $98,%0000001111001011    ; CLXCON
  216.  
  217. ; Diese Werte bedeuten, daß die Planes 1,2,3,4 für die Kollis. aktiviert sind.
  218. ; Es wird eine Kollision angezeigt, wenn der Sprite Playfield 1 überlagert, das
  219. ; die Pixel so hat:    Plane 1 = 1 (Bit 0)
  220. ;            Plane 3 = 0 (Bit 2)
  221. ; Also wird Color1 des Playfield 1 eine Kollision verursachen.
  222.  
  223. ; Es wird eine Koll. mit Playf. 2 gemeldet, wenn der Sprite über der folgenden
  224. ; Pixelkombination ist: Plane 2 = 1 (Bit 1)
  225. ;            Plane 4 = 1 (Bit 3)
  226. ; Also Color3 des Playfield 2
  227.  
  228.  
  229.     dc.w    $180    ; COLOR00
  230. Kollisions_Sensor:
  231.     dc.w    0    ; An DIESEM PUNKT schreibt die Routine CheckColl in
  232.             ; die Copperlist und verändert die Farben.
  233.  
  234.                 ; Palette Playfield 1
  235.     dc.w    $182,$005    ; Farben von 0 bis 7
  236.     dc.w    $184,$a40
  237.     dc.w    $186,$f80
  238.     dc.w    $188,$f00
  239.     dc.w    $18a,$0f0
  240.     dc.w    $18c,$00f
  241.     dc.w    $18e,$080
  242.  
  243.  
  244.                 ; Palette Playfield 2
  245.     dc.w    $192,$367    ; Farben von 9 bis 15
  246.     dc.w    $194,$0cc    ; Die Farbe8 ist durchsichtig, sie wird nicht
  247.     dc.w    $196,$a0a    ; gesetzt.
  248.     dc.w    $198,$242
  249.     dc.w    $19a,$282
  250.     dc.w    $19c,$861
  251.     dc.w    $19e,$ff0
  252.  
  253.  
  254.     dc.w    $1A2,$F00    ; Palette der Sprites
  255.     dc.w    $1A4,$0F0
  256.     dc.w    $1A6,$FF0
  257.  
  258.     dc.w    $1AA,$FFF
  259.     dc.w    $1AC,$0BD
  260.     dc.w    $1AE,$D50
  261.  
  262.     dc.w    $1B2,$00F
  263.     dc.w    $1B4,$F0F
  264.     dc.w    $1B6,$BBB
  265.  
  266.     dc.w    $1BA,$8E0
  267.     dc.w    $1BC,$a70
  268.     dc.w    $1BE,$d00
  269.  
  270.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  271.  
  272. ;    Die zwei Playfields
  273.  
  274. PIC1:    incbin    "colldual1.raw"
  275. PIC2:    incbin    "colldual2.raw"
  276.  
  277. ; ********* Und hier der Sprite: KLARERWEISE in CHIP RAM!! *********
  278.  
  279. MEINSPRITE0:
  280. VSTART0:
  281.     dc.b $2c
  282. HSTART0:
  283.     dc.b $80
  284. VSTOP0:
  285.     dc.b $2c+8
  286. VHBITS0
  287.     dc.b $00
  288.  dc.w    %0000001111000000,%0111110000111110
  289.  dc.w    %0000111111110000,%1111001110001111
  290.  dc.w    %0011111111111100,%1100010001000011
  291.  dc.w    %0111111111111110,%1000010001000001
  292.  dc.w    %0111111111111110,%1000010001000001
  293.  dc.w    %0011111111111100,%1100010001000011
  294.  dc.w    %0000111111110000,%1111001110001111
  295.  dc.w    %0000001111000000,%0111110000111110
  296.  dc.w    0,0
  297.  
  298.  
  299.     end
  300.  
  301. Dieses Beispiel  zeigt,  wie  die  Kollisionen  zwischen  Sprite  und  den
  302. Playfields  (im Dual-Playfield-Mode) funktionieren. Die Kollisionen werden
  303. unabhängig voneinander für  die  2  Playfields  kontrolliert,  indem  zwei
  304. verschiedene  Bits  im  Register  CLXDAT  gelesen  werden. In unserem Fall
  305. verwenden wir das Bit 1 für die Kollision mit  dem  Playfield  1  (geraden
  306. Planes)  und  Bit  5  für  das  Playfield 2 (ungerade Planes). Im Reigster
  307. CLXCON funktioniert alles wie im Falle eines normalen Bildschirmes:
  308.  
  309. Die Bit von 0 bis 5 sind die Werte, die die Planes einneh,men müssen.
  310. Die Bit von 6 bis 11 geben an, welche Planes für die Kollisionen aktiviert sind
  311. Die Bit von 12 bis 15 geben an, welche der ungeraden Sprites für die
  312. Kollision aktiviert sind.
  313.  
  314. Es bleibt immer noch die Möglichkeit offen, einige Planes  nicht  für  die
  315. Kollisionsdetektion  freizugeben,  sie  also  nicht  zu  aktivieren, um so
  316. mehrere Farben nutzen zu können. Es wurde  in  Listing7w2.s  gezeigt.  Ihr
  317. könnt versuchen, in der Copperlist den Wert des CLXCON zu verändern.
  318.  
  319.