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

  1.  
  2. ; Listing7v2.s  -  Sprite im Dual-Playfield-Mode
  3. ; In diesem Listing ewzeigen wir die verschiedenen Prioritätslevel der
  4. ; Sprites gegenüber den zwei Playfields. Die Sprites bewegen sich von Oben nach
  5. ; Unten. Jedesmal, wenn sie unten angekommen sind, beginnen sie wieder
  6. ; von oben, nur mit einer anderen Priorität.
  7. ; Das Ende des Programmes muß abgewartet werden.
  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. ;    Pointen auf die übliche Art unsere Pic´s an
  21.  
  22.     MOVE.L    #PIC1,d0
  23.     LEA    BPLPOINTERS1,A1
  24.     MOVEQ    #3-1,D1
  25. POINTBP:
  26.     move.w    d0,6(a1)
  27.     swap    d0
  28.     move.w    d0,2(a1)
  29.     swap    d0
  30.     ADD.L    #40*256,d0
  31.     addq.w    #8,a1
  32.     dbra    d1,POINTBP
  33.  
  34.     MOVE.L    #PIC2,d0
  35.     LEA    BPLPOINTERS2,A1
  36.     MOVEQ    #3-1,D1
  37. POINTBP2:
  38.     move.w    d0,6(a1)
  39.     swap    d0
  40.     move.w    d0,2(a1)
  41.     swap    d0
  42.     ADD.L    #40*256,d0
  43.     addq.w    #8,a1
  44.     dbra    d1,POINTBP2
  45.  
  46. ;    Pointen auf die Sprites
  47.  
  48.     MOVE.L    #MEINSprite0,d0      ; Adresse des Sprite in d0
  49.     LEA    SpritePointers,a1 ; Pointer in der Copperlist
  50.     move.w    d0,6(a1)
  51.     swap    d0
  52.     move.w    d0,2(a1)
  53.     MOVE.L    #MEINSprite1,d0     ; Adresse des Sprite in d0
  54.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  55.     move.w    d0,6(a1)
  56.     swap    d0
  57.     move.w    d0,2(a1)
  58.     MOVE.L    #MEINSprite2,d0     ; Adresse des Sprite in d0
  59.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  60.     move.w    d0,6(a1)
  61.     swap    d0
  62.     move.w    d0,2(a1)
  63.     MOVE.L    #MEINSprite3,d0     ; Adresse des Sprite in d0
  64.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  65.     move.w    d0,6(a1)
  66.     swap    d0
  67.     move.w    d0,2(a1)
  68.     MOVE.L    #MEINSprite4,d0     ; Adresse des Sprite in d0
  69.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  70.     move.w    d0,6(a1)
  71.     swap    d0
  72.     move.w    d0,2(a1)
  73.     MOVE.L    #MEINSprite5,d0     ; Adresse des Sprite in d0
  74.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  75.     move.w    d0,6(a1)
  76.     swap    d0
  77.     move.w    d0,2(a1)
  78.     MOVE.L    #MEINSprite6,d0     ; Adresse des Sprite in d0
  79.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  80.     move.w    d0,6(a1)
  81.     swap    d0
  82.     move.w    d0,2(a1)
  83.     MOVE.L    #MEINSprite7,d0     ; Adresse des Sprite in d0
  84.     addq.w    #8,a1         ; nächsten SpritePOINTERS
  85.     move.w    d0,6(a1)
  86.     swap    d0
  87.     move.w    d0,2(a1)
  88.  
  89.     move.l    #COPPERLIST,$dff080    ; unsere COP
  90.     move.w    d0,$dff088        ; START COP
  91.     move.w    #0,$dff1fc        ; NO AGA!
  92.     move.w    #$c00,$dff106        ; NO AGA!
  93.  
  94.     lea    PriList(PC),a0    ; a0 pointet auf die Liste mit Prioritätsleveln
  95.     
  96.     move.w    #$0000,$dff104    ; BPLCON2
  97.                 ; mit diesem Wert sind alle Sprites unter
  98.                 ; beiden Playfields
  99.  
  100. Warte1:
  101.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  102.     bne.s    Warte1
  103.  
  104.     bsr.s    BewegeSprites    ; Bewegt die Sprites nach unten
  105.  
  106. Warte2:
  107.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  108.     beq.s    Warte2
  109.  
  110.     cmp.w    #250,Hoehe    ; Haben die Sprites den unteren Rand erreicht?
  111.     blo.s    Warte1        ; nein, dann bewege sie weiter
  112.  
  113.     move.w    #$2c,Hoehe    ; Ja. Setz sie wieder ganz nach oben
  114.     cmp.l    #EndPriList,a0    ; Haben wir die Prioritlevel alle durchgemacht?
  115.     beq.s    Raus        ; wenn ja, dann steig aus.
  116.     move.w    (a0)+,$dff104    ; Wenn nicht, gib den nächsten Wert in BPLCON2
  117.     bra.s    Warte1
  118.  
  119. Raus:
  120.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  121.     move.w    d0,$dff088        ; Starten die alte COP
  122.  
  123.     move.l    4.w,a6
  124.     jsr    -$7e(a6)    ; Enable
  125.     move.l    gfxbase(PC),a1
  126.     jsr    -$19e(a6)    ; Closelibrary
  127.     rts
  128.  
  129. ;    Daten
  130.  
  131. GfxName:
  132.     dc.b    "graphics.library",0,0
  133.  
  134. GfxBase:
  135.     dc.l    0
  136.  
  137. OldCop:
  138.     dc.l    0
  139.  
  140. ; Diese Routine bewegt die 8 Sprites um einen Pixel pro Durchgang nach unten.
  141. ; Alle Sprites haben die selbe Höhe.
  142.  
  143.  
  144. BewegeSprites:
  145.  
  146. ; bewegt den Sprite 0
  147.  
  148.     addq.w    #1,Hoehe
  149.     move.w    Hoehe(PC),d0
  150.  
  151.     CLR.B    VHBITS0        ; Lösche die Bits 8 der horizontalen Position
  152.     MOVE.b    d0,VSTART0  ; Kopiere die Bit von 0 bis 7 in VSTART
  153.     BTST.l    #8,D0        ; ist die Position größer als 255?
  154.     BEQ.S    NOBIGVSTART ; wenn nicht, dann geh weitde, denn das Bit wurde
  155.                 ; bereits mit CLR.b VHBITS gelöscht
  156.  
  157.     BSET.b    #2,VHBITS0  ; ansonsten setze Bit 8 der vertikalen Startposition
  158.                 ; auf 1
  159. NOBIGVSTART:
  160.     ADDQ.W    #8,D0        ; Zähle die Länge des Sprite dazu, um die
  161.                 ; Endposition zu ermitteln (VSTOP)
  162.     move.b    d0,VSTOP0   ; Gib die Bit von 0 bis 7 in VSTOP
  163.     BTST.l    #8,D0        ; ist die Position größer als 255 ?
  164.     BEQ.S    NOBIGVSTOP  ; wenn nicht, dann geh weiter, denn das Bit wurde
  165.                 ; bereits mit CLR.b VHBITS gelöscht
  166.  
  167.     BSET.b    #1,VHBITS0 ; ansonsten setze Bit 8 der vertikalen Startposition
  168.                ; auf 1
  169. NOBIGVSTOP:
  170.  
  171. ; kopiere die Höhe in die anderen Sprites
  172.  
  173.     move.b    vstart0,vstart1 ; kopiert VSTART
  174.     move.w    vstop0,vstop1    ; kopiert VSTOP und VHBITS
  175.  
  176.     move.b    vstart0,vstart2 ; kopiert VSTART
  177.     move.w    vstop0,vstop2    ; kopiert VSTOP und VHBITS
  178.  
  179.     move.b    vstart0,vstart3 ; kopiert VSTART
  180.     move.w    vstop0,vstop3    ; kopiert VSTOP und VHBITS
  181.  
  182.     move.b    vstart0,vstart4 ; kopiert VSTART
  183.     move.w    vstop0,vstop4    ; kopiert VSTOP und VHBITS
  184.  
  185.     move.b    vstart0,vstart5 ; kopiert VSTART
  186.     move.w    vstop0,vstop5    ; kopiert VSTOP und VHBITS
  187.  
  188.     move.b    vstart0,vstart6 ; kopiert VSTART
  189.     move.w    vstop0,vstop6    ; kopiert VSTOP und VHBITS
  190.  
  191.     move.b    vstart0,vstart7 ; kopiert VSTART
  192.     move.w    vstop0,vstop7    ; kopiert VSTOP und VHBITS
  193.  
  194. EndeBewegeSprites:
  195.     rts
  196.  
  197. Hoehe:
  198.     dc.w    $2c
  199.  
  200. ; Das ist die Liste mit dne Prioritätswerten. Ihr könnt sie variieren, wie
  201. ; ihr wollt. Nach dem letzten Wert muß aber das Label EndPriList stehen.
  202. ; Diese Werte werden in BPLCON2 geschrieben. Bemerkt den Unterschied zu
  203. ; Listing7v1.s, hier wird ein Screen im Dual-Playfield verwendet, somit können
  204. ; wir für jedes Playfield eigene Prioritätslevel vergeben.
  205. ; Ich erinnere euch daran, daß zwischen den Sprites die Prioritäten fix
  206. ; verteilt sind, und zwar so: der Sprite 0 hat die höchste Priorität, der
  207. ; Sprite 7 die kleinste.
  208.  
  209. PriList:
  210.     dc.w    $0008    ; %001000 - mit disem Wert sind die Prioritäten:
  211.             ; Playfield 1 (über allem)
  212.             ; Sprite 0 und 1
  213.             ; Playfield 2
  214.             ; Sprite 2,3,4,5,6,7 (unter allem)
  215.  
  216.     dc.w    $0010    ; %010000 - mit diesem Wert sind die Prioritäten:
  217.             ; Playfield 1 (über allem)
  218.             ; Sprite 0,1,2,3
  219.             ; Playfield 2
  220.             ; Sprite 4,5,6,7 (unter allem)
  221.  
  222.     dc.w    $0018    ; %011000 - mit diesem Wert sind die Prioritäten:
  223.             ; Playfield 1 (über allem)
  224.             ; Sprite 0,1,2,3,4,5
  225.             ; Playfield 2
  226.             ; Sprite 6,7 (unter allem)
  227.             
  228.     dc.w    $0020    ; %100000 - mit diesem Wert sind die Prioritäten:
  229.             ; Playfield 1 (über allem)
  230.             ; Sprite 0,1,2,3,4,5,6,7
  231.             ; Playfield 2
  232.             
  233.     dc.w    $0021    ; %100001 - mit diesem Wert sind die Prioritäten:
  234.             ; Sprite 0 und 1 (über allem)
  235.             ; Playfield 1
  236.             ; Sprite 2,3,4,5,6,7
  237.             ; Playfield 2 (unter allem)
  238.             
  239.     dc.w    $0022    ; %100010 - mit diesem Wert sind die Prioritäten:
  240.             ; Sprite 0,1,2,3 (über allem)
  241.             ; Playfield 1
  242.             ; Sprite 4,5,6,7
  243.             ; Playfield 2 (unter allem)
  244.         
  245.     dc.w    $0023    ; %100011 - mit diesem Wert sind die Prioritäten:
  246.             ; Sprite 0,1,2,3,4,5 (über allem)
  247.             ; Playfield 1
  248.             ; Sprite 6,7
  249.             ; Playfield 2 (unter allem)
  250.  
  251.     dc.w    $0024    ; %100100 - mit diesem Wert sind die Prioritäten:
  252.             ; Sprite 0,1,2,3,4,5,6,7 (über allem)
  253.             ; Playfield 1
  254.             ; Playfield 2 (unter allem)
  255. EndPriList:
  256.  
  257.  
  258.  
  259.     SECTION GRAPHIC,DATA_C
  260.  
  261. COPPERLIST:
  262. SpritePointers:
  263.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; Sprite
  264.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  265.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  266.     dc.w    $13e,0
  267.  
  268.  
  269.     dc.w    $8E,$2c81    ; DiwStrt
  270.     dc.w    $90,$2cc1    ; DiwStop
  271.     dc.w    $92,$38         ; DdfStart
  272.     dc.w    $94,$d0         ; DdfStop
  273.  
  274. ;    wir haben das BPLCON2 aus der Copperlist entfernt, da wie es
  275. ;    "manuell" mit dem Prozessor manipulieren.
  276.  
  277.     dc.w    $102,0        ; BplCon1
  278.     dc.w    $108,0        ; Bpl1Mod
  279.     dc.w    $10a,0        ; Bpl2Mod
  280.  
  281.             ; 5432109876543210
  282.     dc.w    $100,%0110011000000000    ; Bit 10 an = Dual Playfield
  283.                     ; verwende 6 Planes = 8 Farben pro
  284.                     ; Playfield
  285. BPLPOINTERS1:
  286.     dc.w $e0,0,$e2,0    ;erstes    Bitplane Playfield 1 (BPLPT1)
  287.     dc.w $e8,0,$ea,0    ;zweites Bitplane Playfield 1 (BPLPT3)
  288.     dc.w $f0,0,$f2,0    ;drittes Bitplane Playfield 1 (BPLPT5)
  289.  
  290.  
  291. BPLPOINTERS2:
  292.     dc.w $e4,0,$e6,0    ;erstes    Bitplane Playfield 2 (BPLPT2)
  293.     dc.w $ec,0,$ee,0    ;zweites Bitplane Playfield 2 (BPLPT4)
  294.     dc.w $f4,0,$f6,0    ;drittes Bitplane Playfield 2 (BPLPT6)
  295.  
  296.     dc.w    $180,$110    ; Palette Playfield 1
  297.     dc.w    $182,$005    ; Farben von 0 bis 7
  298.     dc.w    $184,$a40
  299.     dc.w    $186,$f80 
  300.     dc.w    $188,$f00 
  301.     dc.w    $18a,$0f0 
  302.     dc.w    $18c,$00f
  303.     dc.w    $18e,$080
  304.  
  305.               ; Palette Playfield 2
  306.     dc.w    $192,$367 ; Farben von 9 bis 15
  307.     dc.w    $194,$0cc ; COLOR8 ist durchsichtig, er wird nicht gesetzt
  308.     dc.w    $196,$a0a 
  309.     dc.w    $198,$242 
  310.     dc.w    $19a,$282 
  311.     dc.w    $19c,$861
  312.     dc.w    $19e,$ff0
  313.  
  314.  
  315.     dc.w    $1A2,$F00    ; Palette der Sprites
  316.     dc.w    $1A4,$0F0
  317.     dc.w    $1A6,$FF0
  318.  
  319.     dc.w    $1AA,$FFF
  320.     dc.w    $1AC,$0BD
  321.     dc.w    $1AE,$D50
  322.  
  323.     dc.w    $1B2,$00F
  324.     dc.w    $1B4,$F0F
  325.     dc.w    $1B6,$BBB
  326.  
  327.     dc.w    $1BA,$8E0
  328.     dc.w    $1BC,$a70
  329.     dc.w    $1BE,$d00
  330.  
  331.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  332.  
  333.  
  334. ;    Die zwei Playfields
  335.  
  336.  
  337. PIC1:    incbin    "dual1.raw"
  338. PIC2:    incbin    "dual2.raw"
  339.  
  340.  ; ************ Hier die Sprite: KLARERWEISE in CHIP RAM! ************
  341.  
  342.  ; Referenztabelle zur Definition der Farben:
  343.  
  344.  
  345. ;  für die Sprite 0 und 1
  346. ; BINÄR 00=COLOR 0 (TRANSPARENT)
  347. ; BINÄR 10=COLOR 1 (ROT)
  348. ; BINÄR 01=COLOR 2 (GRÜN)
  349. ; BINÄR 11=COLOR 3 (GELB)
  350.  
  351. MEINSprite0:        ; Länge: 13 Zeilen
  352. VSTART0:
  353.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  354. HSTART0:
  355.     dc.b $60    ; Horizontale Pos. (von $40 bis $d8)
  356. VSTOP0:
  357.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  358. VHBITS0:
  359.     dc.b $00
  360.  dc.w    %0000001111000000,%0111110000111110
  361.  dc.w    %0000111111110000,%1111001110001111
  362.  dc.w    %0011111111111100,%1100010001000011
  363.  dc.w    %0111111111111110,%1000010001000001
  364.  dc.w    %0111111111111110,%1000010001000001
  365.  dc.w    %0011111111111100,%1100010001000011
  366.  dc.w    %0000111111110000,%1111001110001111
  367.  dc.w    %0000001111000000,%0111110000111110
  368.  dc.w    0,0    ; Ende des Sprite
  369.  
  370.  
  371. MEINSprite1:        ; Länge: 13 Zeilen
  372. VSTART1:
  373.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  374. HSTART1:
  375.     dc.b $60+14    ; Horizontale Pos. (von $40 bis $d8)
  376. VSTOP1:
  377.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  378.     dc.b $00
  379.  dc.w    %0000001111000000,%0111110000111110
  380.  dc.w    %0000111111110000,%1111000010001111
  381.  dc.w    %0011111111111100,%1100000110000011
  382.  dc.w    %0111111111111110,%1000000010000001
  383.  dc.w    %0111111111111110,%1000000010000001
  384.  dc.w    %0011111111111100,%1100000010000011
  385.  dc.w    %0000111111110000,%1111000111001111
  386.  dc.w    %0000001111000000,%0111110000111110
  387.  dc.w    0,0    ; Ende des Sprite
  388.  
  389. ;  für die Sprite 2 und 3
  390. ; BINÄR 00=COLOR 0 (TRANSPARENT)
  391. ; BINÄR 10=COLOR 1 (WEIß)
  392. ; BINÄR 01=COLOR 2 (WASSER)
  393. ; BINÄR 11=COLOR 3 (ORANGE)
  394.  
  395. MEINSprite2:        ; Länge: 13 Zeilen
  396. VSTART2:
  397.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  398. HSTART2:
  399.     dc.b $60+(14*2) ; Horizontale Pos. (von $40 bis $d8)
  400. VSTOP2:
  401.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  402.     dc.b $00
  403.  dc.w    %0000001111000000,%0111110000111110
  404.  dc.w    %0000111111110000,%1111000111001111
  405.  dc.w    %0011111111111100,%1100001000100011
  406.  dc.w    %0111111111111110,%1000000000100001
  407.  dc.w    %0111111111111110,%1000000111000001
  408.  dc.w    %0011111111111100,%1100001000000011
  409.  dc.w    %0000111111110000,%1111001111101111
  410.  dc.w    %0000001111000000,%0111110000111110
  411.  dc.w    0,0    ; Ende des Sprite
  412.  
  413. MEINSprite3:        ; Länge: 13 Zeilen
  414. VSTART3:
  415.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  416. HSTART3:
  417.     dc.b $60+(14*3) ; Horizontale Pos. (von $40 bis $d8)
  418. VSTOP3:
  419.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  420.     dc.b $00
  421.  dc.w    %0000001111000000,%0111110000111110
  422.  dc.w    %0000111111110000,%1111001111101111
  423.  dc.w    %0011111111111100,%1100000000100011
  424.  dc.w    %0111111111111110,%1000000111100001
  425.  dc.w    %0111111111111110,%1000000000100001
  426.  dc.w    %0011111111111100,%1100000000100011
  427.  dc.w    %0000111111110000,%1111001111101111
  428.  dc.w    %0000001111000000,%0111110000111110
  429.  dc.w    0,0    ; Ende des Sprite
  430.  
  431. ;  für die Sprite 4 und 5
  432. ; BINÄR 00=COLOR 0 (TRANSPARENT)
  433. ; BINÄR 10=COLOR 1 (BLAU)
  434. ; BINÄR 01=COLOR 2 (VIOLETT)
  435. ; BINÄR 11=COLOR 3 (GRAU)
  436.  
  437. MEINSprite4:        ; Länge: 13 Zeilen
  438. VSTART4:
  439.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  440. HSTART4:
  441.     dc.b $60+(14*4) ; Horizontale Pos. (von $40 bis $d8)
  442. VSTOP4:
  443.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  444.     dc.b $00
  445.  dc.w    %0000001111000000,%0111110000111110
  446.  dc.w    %0000111111110000,%1111001001001111
  447.  dc.w    %0011111111111100,%1100001001000011
  448.  dc.w    %0111111111111110,%1000001111000001
  449.  dc.w    %0111111111111110,%1000000001000001
  450.  dc.w    %0011111111111100,%1100000001000011
  451.  dc.w    %0000111111110000,%1111000001001111
  452.  dc.w    %0000001111000000,%0111110000111110
  453.  dc.w    0,0    ; Ende des Sprite
  454.  
  455. MEINSprite5:        ; Länge: 13 Zeilen
  456. VSTART5:
  457.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  458. HSTART5:
  459.     dc.b $60+(14*5) ; Horizontale Pos. (von $40 bis $d8)
  460. VSTOP5:
  461.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  462.     dc.b $00
  463.  dc.w    %0000001111000000,%0111110000111110
  464.  dc.w    %0000111111110000,%1111001111001111
  465.  dc.w    %0011111111111100,%1100001000000011
  466.  dc.w    %0111111111111110,%1000001111000001
  467.  dc.w    %0111111111111110,%1000000001000001
  468.  dc.w    %0011111111111100,%1100000001000011
  469.  dc.w    %0000111111110000,%1111001111001111
  470.  dc.w    %0000001111000000,%0111110000111110
  471.  dc.w    0,0    ; Ende des Sprite
  472.  
  473. ;  für die Sprite 6 und 7
  474. ; BINÄR 00=COLOR 0 (TRANSPARENT)
  475. ; BINÄR 10=COLOR 1 (HELLGRÜN)
  476. ; BINÄR 01=COLOR 2 (BRAUN)
  477. ; BINÄR 11=COLOR 3 (DUNKELROT)
  478.  
  479. MEINSprite6:        ; Länge: 13 Zeilen
  480. VSTART6:
  481.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  482. HSTART6:
  483.     dc.b $60+(14*6) ; Horizontale Pos. (von $40 bis $d8)
  484. VSTOP6:
  485.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  486.     dc.b $00
  487.  dc.w    %0000001111000000,%0111110000111110
  488.  dc.w    %0000111111110000,%1111001111001111
  489.  dc.w    %0011111111111100,%1100001000000011
  490.  dc.w    %0111111111111110,%1000001111000001
  491.  dc.w    %0111111111111110,%1000001001000001
  492.  dc.w    %0011111111111100,%1100001001000011
  493.  dc.w    %0000111111110000,%1111001111001111
  494.  dc.w    %0000001111000000,%0111110000111110
  495.  dc.w    0,0    ; Ende des Sprite
  496.  
  497. MEINSprite7:        ; Länge: 13 Zeilen
  498. VSTART7:
  499.     dc.b $60    ; Vertikale Pos. (von $2c bis $f2)
  500. HSTART7:
  501.     dc.b $60+(14*7) ; Horizontale Pos. (von $40 bis $d8)
  502. VSTOP7:
  503.     dc.b $68    ; $60+13=$6d    ; Ende Vertikal
  504.     dc.b $00
  505.  dc.w    %0000001111000000,%0111110000111110
  506.  dc.w    %0000111111110000,%1111001111001111
  507.  dc.w    %0011111111111100,%1100000001000011
  508.  dc.w    %0111111111111110,%1000000001000001
  509.  dc.w    %0111111111111110,%1000000001000001
  510.  dc.w    %0011111111111100,%1100000001000011
  511.  dc.w    %0000111111110000,%1111000001001111
  512.  dc.w    %0000001111000000,%0111110000111110
  513.  dc.w    0,0    ; Ende des Sprite
  514.  
  515.         end
  516.  
  517. Dieses Beispiel zeigt, wie die Prioritäten  der  Sprites  gegenüber  einem
  518. Bildschirm  in  Dual-Playfield-Mode funktioniert. Für jedes Playfield kenn
  519. ein anderer Prioritätslevel gesetzt werden. Für dieses Beispiel haben  wir
  520. eine  Liste  mit Werten verwendet. Eine Liste ist praktisch eine Reihe von
  521. Werten, wie eine TABELLE. Mit einem Adressregister  (in  diesem  Fall  a0)
  522. pointen wir auf den ersten Wert, und zwar mit der Anweisung:
  523.  
  524.  
  525.     lea PriList(PC),a0
  526.  
  527. Jedesmal  wenn  ein Wert gelesen wird, bewegen wir das Register a0 auf den
  528. darauf folgenden Wert, mittels indirekter Adressierung mit Postinkrement:
  529.  
  530.     move.w    (a0)+,$dff104    ; Geben den Wert in BPLCON2
  531.  
  532. Wenn wir den letzten Wert erreicht haben, wird a0  dazugebracht,  auf  die
  533. Adresse  im  Speicher  zu pointen, die dem letzten Wert folgt. Das ist die
  534. Adresse des Label EndPriList. Wenn a0 gleich EndPriList wird,  dann  haben
  535. wir das Ende der Liste erreicht, und wir steigen vom Program aus.
  536.  
  537. Ihr  könnt  die  Werte  in  der  Liste  austauschen,  und  so  ein bißchen
  538. herumexperimentieren. Versucht z.B. $0011, ihr werdet die Sprite 0  und  1
  539. über  allen  beiden Playfields sehen, die Sprites 2 und 3 über Playfield 2
  540. und unter dem ersten, während der Rest der Sprites unter beiden Playfields
  541. sein wird.
  542.  
  543. BEMERKUNG:  In  diesem  Beispiel  verändern  wir  die Priorität, indem wir
  544. direkt ins Register $dff104 (BPLCON2) schreiben. Das ist möglich, weil wir
  545. die  Zeile  für  dessen Definition aus der Copperlist entfernt haben, also
  546. die Zeile:
  547.  
  548.  
  549.     dc.w    $104,0    ; BPLCON2
  550.  
  551. Wenn ihr versucht, sie wieder einzufügen, dann werdet ihr sehen,  daß  der
  552. Effekt anulliert wird, da die Copperlist ja bei jedem Fotogramm ausgeführt
  553. wird, und damit  BPLCON2  gelöscht  wird.  Es  ist  also  möglich,  einige
  554. Register mit dem Copper zu verändern, und andere direkt mit dem Prozessor,
  555. aber ich rate euch, wann immer es möglich ist, den Copper zu verwenden. Er
  556. ist besser und leichter zu synchronisieren,die richtige Zeile auszuwählen,
  557. um auf ein Register zugreifen zu können.
  558.  
  559. AdÜ: "BUCO" bedeutet soviel wie "Loch"...  (Hatte  keine  Zeit,  das  Bild
  560. neuzuzeichen).
  561.  
  562.