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

  1.  
  2. ; Listing7h.s    4 SPRITE ZU 16 FARBEN IM ATTACHED-MODE WERDEN AM BILDSCHIRM
  3. ;        MITTELS TABELLEN BEWEGT (vorausberechnete X- und Y-Koordinaten)
  4. ;
  5. ;    ** BEMERKUNG** Um das Programm zu sehen und um auszusteigen:
  6. ;    LINKE TASTE RECHTE TASTE, LINKE TASTE, RECHTE TASTE
  7.  
  8.     SECTION CipundCop,CODE
  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.  
  28. ;    Pointen auf die 8 Sprite, die im Attaced-Modus 4 zu 16 Farben ergeben.
  29. ;    Die Sprite 1,3,5,7, die ungeraden, müssen das Bit 7 des zweiten Word
  30. ;    auf 1 haben.
  31.  
  32.  
  33.     MOVE.L    #MEINSPRITE0,d0      ; Adresse des Sprite in d0
  34.     LEA    SpritePointers,a1 ; Pointer in der Copperlist
  35.     move.w    d0,6(a1)
  36.     swap    d0
  37.     move.w    d0,2(a1)
  38.     MOVE.L    #MEINSPRITE1,d0    ; Adresse des Sprite in d0
  39.     addq.w    #8,a1        ; nächsten SPRITEPOINTERS
  40.     move.w    d0,6(a1)
  41.     swap    d0
  42.     move.w    d0,2(a1)
  43.     MOVE.L    #MEINSPRITE2,d0    ; Adresse des Sprite in d0
  44.     addq.w    #8,a1        ; nächsten SPRITEPOINTERS
  45.     move.w    d0,6(a1)
  46.     swap    d0
  47.     move.w    d0,2(a1)
  48.     MOVE.L    #MEINSPRITE3,d0    ; Adresse des Sprite in d0
  49.     addq.w    #8,a1        ; nächsten SPRITEPOINTERS
  50.     move.w    d0,6(a1)
  51.     swap    d0
  52.     move.w    d0,2(a1)
  53.     MOVE.L    #MEINSPRITE4,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    #MEINSPRITE5,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    #MEINSPRITE6,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    #MEINSPRITE7,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.  
  74. ; Setzen das Attached-Bit
  75.  
  76.     bset    #7,MEINSPRITE1+3    ; Setzt das Bit für Attached beim
  77.                     ; Sprite. Wird es nicht gesetzt,
  78.                     ; entstehen nur zwei Sprites mit
  79.                     ; drei Farben, die sich überlappen
  80.     
  81.     bset    #7,MEINSPRITE3+3
  82.     bset    #7,MEINSPRITE5+3
  83.     bset    #7,MEINSPRITE7+3
  84.  
  85.     move.l    #COPPERLIST,$dff080    ; unsere COP
  86.     move.w    d0,$dff088        ; START COP
  87.     move.w    #0,$dff1fc        ; NO AGA!
  88.     move.w    #$c00,$dff106        ; NO AGA!
  89.  
  90. ;    Schaffen eine Positionsdifferenz in den Pointern der Tabelle zwischen
  91. ;    den 4 Sprites um sie in verschiedenen Richtungen zu bewegen.
  92.  
  93.     MOVE.L    #TABX+55,TABXPOINT0
  94.     MOVE.L    #TABX+86,TABXPOINT1
  95.     MOVE.L    #TABX+130,TABXPOINT2
  96.     MOVE.L    #TABX+170,TABXPOINT3
  97.     MOVE.L    #TABY-1,TABYPOINT0
  98.     MOVE.L    #TABY+45,TABYPOINT1
  99.     MOVE.L    #TABY+90,TABYPOINT2
  100.     MOVE.L    #TABY+140,TABYPOINT3
  101.  
  102.  
  103. Mouse1:
  104.     bsr.w    BewegeSprite    ; Wartet ein Fotogramm, bewegt die Sprite
  105.                 ; und kommt zurück
  106.  
  107.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  108.     bne.s    mouse1
  109.  
  110.     MOVE.L    #TABX+170,TABXPOINT0
  111.     MOVE.L    #TABX+130,TABXPOINT1
  112.     MOVE.L    #TABX+86,TABXPOINT2
  113.     MOVE.L    #TABX+55,TABXPOINT3
  114.     MOVE.L    #TABY-1,TABYPOINT0
  115.     MOVE.L    #TABY+45,TABYPOINT1
  116.     MOVE.L    #TABY+90,TABYPOINT2
  117.     MOVE.L    #TABY+140,TABYPOINT3
  118.  
  119. Mouse2:
  120.     bsr.w    BewegeSprite    ; Wartet ein Fotogramm, bewegt die Sprite
  121.                 ; und kommt zurück
  122.  
  123.     btst    #2,$dff016    ; rechte Maustaste gedrückt?
  124.     bne.s    mouse2
  125.  
  126. ; SPRITE IM GÄNSEMARSCH
  127.  
  128.     MOVE.L    #TABX+30,TABXPOINT0
  129.     MOVE.L    #TABX+20,TABXPOINT1
  130.     MOVE.L    #TABX+10,TABXPOINT2
  131.     MOVE.L    #TABX-1,TABXPOINT3
  132.     MOVE.L    #TABY+30,TABYPOINT0
  133.     MOVE.L    #TABY+20,TABYPOINT1
  134.     MOVE.L    #TABY+10,TABYPOINT2
  135.     MOVE.L    #TABY-1,TABYPOINT3
  136.  
  137. Mouse3:
  138.     bsr.w    BewegeSprite    ; Wartet ein Fotogramm, bewegt die Sprite
  139.                 ; und kommt zurück
  140.  
  141.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  142.     bne.s    mouse3
  143.  
  144. ; BESOFFENE SPRITES AM BILDSCHIRM
  145.  
  146.     MOVE.L    #TABX+220,TABXPOINT0
  147.     MOVE.L    #TABX+30,TABXPOINT1
  148.     MOVE.L    #TABX+102,TABXPOINT2
  149.     MOVE.L    #TABX+5,TABXPOINT3
  150.     MOVE.L    #TABY-1,TABYPOINT0
  151.     MOVE.L    #TABY+180,TABYPOINT1
  152.     MOVE.L    #TABY+20,TABYPOINT2
  153.     MOVE.L    #TABY+100,TABYPOINT3
  154.  
  155.  
  156. Mouse4:
  157.     bsr.w    BewegeSprite    ; Wartet ein Fotogramm, bewegt die Sprite
  158.                 ; und kommt zurück
  159.  
  160.     btst    #2,$dff016    ; rechte Maustaste gedrückt?
  161.     bne.s    mouse4
  162.  
  163.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  164.     move.w    d0,$dff088        ; Starten die alte COP
  165.  
  166.  
  167.     move.l    4.w,a6
  168.     jsr    -$7e(a6)    ; Enable
  169.     move.l    gfxbase(PC),a1
  170.     jsr    -$19e(a6)    ; Closelibrary
  171.     rts
  172.  
  173. ;    Daten
  174.  
  175. GfxName:
  176.     dc.b    "graphics.library",0,0
  177.  
  178. GfxBase:
  179.     dc.l    0
  180.  
  181. OldCop:
  182.     dc.l    0
  183.  
  184.  
  185. ; Diese Routine startet die einzelnen Bewegungsroutinen der Sprites
  186. ; und beinhaltet auch den Warte-Loop des Fotogrammes für das Timing.
  187.  
  188. BewegeSprite:
  189.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  190.     bne.s    BewegeSprite
  191.  
  192.     bsr.s    BEWEGESPRITEX0    ; bewege den Sprite 0 horizontal
  193.     bsr.w    BEWEGESPRITEX1    ; bewege den Sprite 1 horizontal
  194.     bsr.w    BEWEGESPRITEX2    ; bewege den Sprite 2 horizontal
  195.     bsr.w    BEWEGESPRITEX3    ; bewege den Sprite 3 horizontal
  196.     bsr.w    BEWEGESPRITEY0    ; bewege den Sprite 0 vertikal
  197.     bsr.w    BEWEGESPRITEY1    ; bewege den Sprite 1 vertikal
  198.     bsr.w    BEWEGESPRITEY2    ; bewege den Sprite 2 vertikal
  199.     bsr.w    BEWEGESPRITEY3    ; bewege den Sprite 3 vertikal
  200.  
  201. Warte:
  202.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  203.     beq.s    Warte
  204.  
  205.     rts        ; Zurück zum MOUSE - LOOP
  206.  
  207.  
  208. ; ********************* ROUTINES ZUR HORIZONTALEN BEWEGUNG ******************
  209.  
  210. ; Diese Routine bewegt den Sprite indem die auf das Byte HSTART, also dem
  211. ; Byte seiner X-Position, zugreift. Es werden die Werte einer vorausberechneten
  212. ; Tabelle (TABX) eingesetzt.
  213.  
  214. ; Für den Sprite0 ATTACCHED: (also Sprite0+Sprite1)
  215.  
  216. BEWEGESPRITEX0:
  217.     ADDQ.L    #1,TABXPOINT0      ; Pointe auf das nächste Byte
  218.     MOVE.L    TABXPOINT0(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  219.                   ; ist wird in a0 kopiert
  220.     CMP.L    #ENDETABX-1,A0      ; Sind wir beim letzten Long der TAB?
  221.     BNE.S    NOBSTARTX0      ; noch nicht? dann mach´ weiter
  222.     MOVE.L    #TABX-1,TABXPOINT0 ; Starte wieder beim ersten Long
  223. NOBSTARTX0:
  224.     MOVE.b    (A0),MEINSPRITE0+1 ; Kopie das Byte aus der Tabelle in HSTART0
  225.     MOVE.b    (A0),MEINSPRITE1+1 ; Kopie das Byte aus der Tabelle in HSTART1
  226.     rts
  227.  
  228. TABXPOINT0:
  229.     dc.l    TABX+55        ; ACHTUNG: Die Werte der Tabelle sind Bytes
  230.  
  231.  
  232. ; Für den Sprite1 ATTACCHED: (also Sprite2+Sprite3)
  233.  
  234. BEWEGESPRITEX1:
  235.     ADDQ.L    #1,TABXPOINT1      ; Pointe auf das nächste Byte
  236.     MOVE.L    TABXPOINT1(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  237.                   ; ist wird in a0 kopiert
  238.     CMP.L    #ENDETABX-1,A0      ; Sind wir beim letzten Long der TAB?
  239.     BNE.S    NOBSTARTX1      ; noch nicht? dann mach´ weiter
  240.     MOVE.L    #TABX-1,TABXPOINT1 ; Starte wieder beim ersten Long
  241. NOBSTARTX1:
  242.     MOVE.b    (A0),MEINSPRITE2+1 ; Kopie das Byte aus der Tabelle in HSTART0
  243.     MOVE.b    (A0),MEINSPRITE3+1 ; Kopie das Byte aus der Tabelle in HSTART1
  244.     rts
  245.  
  246. TABXPOINT1:
  247.     dc.l    TABX+86        ; ACHTUNG: Die Werte der Tabelle sind Bytes
  248.  
  249.  
  250.  
  251. ; Für den Sprite2 ATTACCHED: (also Sprite4+Sprite5)
  252.  
  253. BEWEGESPRITEX2:
  254.     ADDQ.L    #1,TABXPOINT2      ; Pointe auf das nächste Byte
  255.     MOVE.L    TABXPOINT2(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  256.                   ; ist wird in a0 kopiert
  257.     CMP.L    #ENDETABX-1,A0      ; Sind wir beim letzten Long der TAB?
  258.     BNE.S    NOBSTARTX2      ; noch nicht? dann mach´ weiter
  259.     MOVE.L    #TABX-1,TABXPOINT2 ; Starte wieder beim ersten Long
  260. NOBSTARTX2:
  261.     MOVE.b    (A0),MEINSPRITE4+1 ; Kopie das Byte aus der Tabelle in HSTART0
  262.     MOVE.b    (A0),MEINSPRITE5+1 ; Kopie das Byte aus der Tabelle in HSTART1
  263.     rts
  264.  
  265. TABXPOINT2:
  266.     dc.l    TABX+130     ; ACHTUNG: Die Werte der Tabelle sind Bytes
  267.  
  268. ; Für den Sprite3 ATTACCHED: (also Sprite6+Sprite7)
  269.  
  270. BEWEGESPRITEX3:
  271.     ADDQ.L    #1,TABXPOINT3      ; Pointe auf das nächste Byte
  272.     MOVE.L    TABXPOINT3(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  273.                   ; ist wird in a0 kopiert
  274.     CMP.L    #ENDETABX-1,A0      ; Sind wir beim letzten Long der TAB?
  275.     BNE.S    NOBSTARTX3      ; noch nicht? dann mach´ weiter
  276.     MOVE.L    #TABX-1,TABXPOINT3 ; Starte wieder beim ersten Long
  277. NOBSTARTX3:
  278.     MOVE.b    (A0),MEINSPRITE6+1 ; Kopie das Byte aus der Tabelle in HSTART0
  279.     MOVE.b    (A0),MEINSPRITE7+1 ; Kopie das Byte aus der Tabelle in HSTART1
  280.     rts
  281.  
  282. TABXPOINT3:
  283.     dc.l    TABX+170    ; ACHTUNG: Die Werte der Tabelle sind Bytes
  284.  
  285. ; ********************* ROUTINES ZUR VERTIKALEN BEWEGUNG *******************
  286.  
  287. ; Diese Routine bewegt den Sprite nach Oben und nach Unten, indem sie auf
  288. ; die Bytes VSTART und VSTOP zugreift, also den Anfangs- und Endkoordinaten
  289. ; des Sprites. Es werden schon vordefinierte Koordinaten aus TABY eingesetzt.
  290.  
  291. BEWEGESPRITEY0:
  292.     ADDQ.L    #1,TABYPOINT0      ; Pointe auf das nächste Byte
  293.     MOVE.L    TABYPOINT0(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  294.                   ; ist wird in a0 kopiert
  295.     CMP.L    #ENDETABY-1,A0      ; Sind wir beim letzten Long der TAB?
  296.     BNE.S    NOBSTARTY0      ; noch nicht? dann mach´ weiter
  297.     MOVE.L    #TABY-1,TABYPOINT0 ; Starte wieder beim ersten Long
  298. NOBSTARTY0:
  299.     moveq    #0,d0        ; Lösche d0
  300.     MOVE.b    (A0),d0        ; kopiere das Byte aus der Tabelle in d0
  301.     MOVE.b    d0,MEINSPRITE0    ; kopiere das Byte in VSTART0
  302.     MOVE.b    d0,MEINSPRITE1    ; kopiere das Byte in VSTART1
  303.     ADD.B    #15,D0        ; Addiere die Länge des Sprites
  304.                  ; um die Endposition zu ermitteln (VSTOP)
  305.     move.b    d0,MEINSPRITE0+2 ; setze den richtigen Wert in VSTOP0
  306.     move.b    d0,MEINSPRITE1+2 ; setze den richtigen Wert in VSTOP1
  307.     rts
  308.  
  309. TABYPOINT0:
  310.     dc.l    TABY-1        ; ACHTUNG: Die Werte der Tabelle sind Bytes
  311.  
  312.  
  313.  
  314. ; Für den Sprite1 ATTACCHED: (also Sprite2+Sprite3)
  315.  
  316. BEWEGESPRITEY1:
  317.     ADDQ.L    #1,TABYPOINT1      ; Pointe auf das nächste Byte
  318.     MOVE.L    TABYPOINT1(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  319.                   ; ist wird in a0 kopiert
  320.     CMP.L    #ENDETABY-1,A0      ; Sind wir beim letzten Long der TAB?
  321.     BNE.S    NOBSTARTY1      ; noch nicht? dann mach´ weiter
  322.     MOVE.L    #TABY-1,TABYPOINT1 ; Starte wieder beim ersten Long
  323. NOBSTARTY1:
  324.     moveq    #0,d0        ; Lösche d0
  325.     MOVE.b    (A0),d0        ; kopiere das Byte aus der Tabelle in d0
  326.     MOVE.b    d0,MEINSPRITE2    ; kopiere das Byte in VSTART2
  327.     MOVE.b    d0,MEINSPRITE3    ; kopiere das Byte in VSTART3
  328.     ADD.B    #15,D0        ; Addiere die Länge des Sprites
  329.                  ; um die Endposition zu ermitteln (VSTOP)
  330.     move.b    d0,MEINSPRITE2+2 ; setze den richtigen Wert in VSTOP2
  331.     move.b    d0,MEINSPRITE3+2 ; setze den richtigen Wert in VSTOP3
  332.     rts
  333.  
  334. TABYPOINT1:
  335.     dc.l    TABY+45        ; ACHTUNG: Die Werte der Tabelle sind Bytes
  336.  
  337.  
  338. ; Für den Sprite2 ATTACCHED: (also Sprite4+Sprite5)
  339.  
  340. BEWEGESPRITEY2:
  341.     ADDQ.L    #1,TABYPOINT2      ; Pointe auf das nächste Byte
  342.     MOVE.L    TABYPOINT2(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  343.                   ; ist wird in a0 kopiert
  344.     CMP.L    #ENDETABY-1,A0      ; Sind wir beim letzten Long der TAB?
  345.     BNE.S    NOBSTARTY2      ; noch nicht? dann mach´ weiter
  346.     MOVE.L    #TABY-1,TABYPOINT2 ; Starte wieder beim ersten Long
  347. NOBSTARTY2:
  348.     moveq    #0,d0        ; Lösche d0
  349.     MOVE.b    (A0),d0        ; kopiere das Byte aus der Tabelle in d0
  350.     MOVE.b    d0,MEINSPRITE4    ; kopiere das Byte in VSTART4
  351.     MOVE.b    d0,MEINSPRITE5    ; kopiere das Byte in VSTART5
  352.     ADD.B    #15,D0        ; Addiere die Länge des Sprites
  353.                  ; um die Endposition zu ermitteln (VSTOP)
  354.     move.b    d0,MEINSPRITE4+2 ; setze den richtigen Wert in VSTOP4
  355.     move.b    d0,MEINSPRITE5+2 ; setze den richtigen Wert in VSTOP5
  356.     rts
  357.  
  358.  
  359.  
  360. TABYPOINT2:
  361.     dc.l    TABY+90        ; ACHTUNG: Die Werte der Tabelle sind Bytes
  362.  
  363.  
  364.  
  365. ; Für den Sprite3 ATTACCHED: (also Sprite6+Sprite7)
  366.  
  367. BEWEGESPRITEY3:
  368.     ADDQ.L    #1,TABYPOINT3      ; Pointe auf das nächste Byte
  369.     MOVE.L    TABYPOINT3(PC),A0 ; Adresse, die im Long TABXPOINT enthalten
  370.                   ; ist wird in a0 kopiert
  371.     CMP.L    #ENDETABY-1,A0      ; Sind wir beim letzten Long der TAB?
  372.     BNE.S    NOBSTARTY3      ; noch nicht? dann mach´ weiter
  373.     MOVE.L    #TABY-1,TABYPOINT3 ; Starte wieder beim ersten Long
  374. NOBSTARTY3:
  375.     moveq    #0,d0        ; Lösche d0
  376.     MOVE.b    (A0),d0        ; kopiere das Byte aus der Tabelle in d0
  377.     MOVE.b    d0,MEINSPRITE6    ; kopiere das Byte in VSTART6
  378.     MOVE.b    d0,MEINSPRITE7    ; kopiere das Byte in VSTART7
  379.     ADD.B    #15,D0        ; Addiere die Länge des Sprites
  380.                  ; um die Endposition zu ermitteln (VSTOP)
  381.     move.b    d0,MEINSPRITE6+2 ; setze den richtigen Wert in VSTOP6
  382.     move.b    d0,MEINSPRITE7+2 ; setze den richtigen Wert in VSTOP7
  383.     rts
  384.  
  385. TABYPOINT3:
  386.     dc.l    TABY+140    ; ACHTUNG: Die Werte der Tabelle sind Bytes
  387.  
  388.  
  389.  
  390. ; Tabelle mit vorausberechneten X-Werten.
  391.  
  392. TABX:
  393.     incbin    "XCOORDINAT.TAB"    ; 334 Werte
  394. ENDETABX:
  395.  
  396. ; Tabelle mit vorausberechneten Y-Werten.
  397.  
  398. TABY:
  399.     incbin    "YCOORDINAT.TAB"    ; 200 Werte
  400. ENDETABY:
  401.  
  402.  
  403.     SECTION GRAPHIC,DATA_C
  404.  
  405. COPPERLIST:
  406. SpritePointers:
  407.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  408.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  409.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  410.     dc.w    $13e,0
  411.  
  412.     dc.w    $8E,$2c81    ; DiwStrt
  413.     dc.w    $90,$2cc1    ; DiwStop
  414.     dc.w    $92,$38        ; DdfStart
  415.     dc.w    $94,$d0        ; DdfStop
  416.     dc.w    $102,0        ; BplCon1
  417.     dc.w    $104,0        ; BplCon2
  418.     dc.w    $108,0        ; Bpl1Mod
  419.     dc.w    $10a,0        ; Bpl2Mod
  420.  
  421.             ; 5432109876543210
  422.     dc.w    $100,%0001001000000000    ; Bit 12 an-1 Bitplane Lowres
  423.  
  424. BPLPOINTERS:
  425.     dc.w $e0,0,$e2,0    ;erstes Bitplane
  426.  
  427. ;    Palette der PIC
  428.  
  429.     dc.w    $180,$000    ; color0    ; schwarzer Hintergrund
  430.     dc.w    $182,$123    ; color1    ; Color1 des Bitplane, das in
  431.                         ; diesem Fall leer ist, und
  432.                         ; deshalb nicht erscheint
  433.  
  434. ;    Palette der Attached-SPRITES
  435.  
  436.     dc.w    $1A2,$FFC    ; color17, Farbe 1 für die Attached-Sprites
  437.     dc.w    $1A4,$EEB    ; color18, Farbe 2 für die Attached-Sprites
  438.     dc.w    $1A6,$CD9    ; color19, Farbe 3 für die Attached-Sprites
  439.     dc.w    $1A8,$AC8    ; color20, Farbe 4 für die Attached-Sprites
  440.     dc.w    $1AA,$8B6    ; color21, Farbe 5 für die Attached-Sprites
  441.     dc.w    $1AC,$6A5    ; color22, Farbe 6 für die Attached-Sprites
  442.     dc.w    $1AE,$494    ; color23, Farbe 7 für die Attached-Sprites
  443.     dc.w    $1B0,$384    ; color24, Farbe 7 für die Attached-Sprites
  444.     dc.w    $1B2,$274    ; color25, Farbe 9 für die Attached-Sprites
  445.     dc.w    $1B4,$164    ; color26, Farbe 10 für die Attached-Sprites
  446.     dc.w    $1B6,$154    ; color27, Farbe 11 für die Attached-Sprites
  447.     dc.w    $1B8,$044    ; color28, Farbe 12 für die Attached-Sprites
  448.     dc.w    $1BA,$033    ; color29, Farbe 13 für die Attached-Sprites
  449.     dc.w    $1BC,$012    ; color30, Farbe 14 für die Attached-Sprites
  450.     dc.w    $1BE,$001    ; color31, Farbe 15 für die Attached-Sprites
  451.  
  452.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  453.  
  454. ; ************ Hier die Sprites: KLARERWEISE in CHIP RAM! **********
  455.  
  456. MEINSPRITE0:                ; Länge 15 Zeilen
  457.     incbin    "Sprite16Col.GERADE"
  458.  
  459. MEINSPRITE1:                ; Länge 15 Zeilen
  460.     incbin    "Sprite16Col.UNGERADE"
  461.  
  462. MEINSPRITE2:                ; Länge 15 Zeilen
  463.     incbin    "Sprite16Col.GERADE"
  464.  
  465. MEINSPRITE3:                ; Länge 15 Zeilen
  466.     incbin    "Sprite16Col.UNGERADE"
  467.  
  468. MEINSPRITE4:                ; Länge 15 Zeilen
  469.     incbin    "Sprite16Col.GERADE"
  470.  
  471. MEINSPRITE5:                ; Länge 15 Zeilen
  472.     incbin    "Sprite16Col.UNGERADE"
  473.  
  474. MEINSPRITE6:                ; Länge 15 Zeilen
  475.     incbin    "Sprite16Col.GERADE"
  476.  
  477. MEINSPRITE7:                ; Länge 15 Zeilen
  478.     incbin    "Sprite16Col.UNGERADE"
  479.  
  480.         SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  481.                 ; müssen es verwenden, denn ohne Bitplane
  482.                 ; ist es nicht möglich, die Sprites
  483.                 ; zu aktivieren
  484. BITPLANE:
  485.     ds.b    40*256        ; Bitplane auf 0 Lowres
  486.  
  487.     end
  488.  
  489. In diesem Listing werden alle 4 Attached-Sprites mit 16 Farben angezeigt.
  490. Die Sprites wurden, einschließlich der Kontrollword, als File abgespeichert,
  491. verwendet wurde dazu der Befehl "WB". Das um im Listing Platz zu sparen
  492. und um die Sprites andere Male wiederverwenden zu können. Auch im Listing
  493. selbst wurde der Sprite öfters wiederverwendet,er ist in Sprite16Col.GERADE
  494. und Sprite16Col.UNGERADE aufgeteilt. Alle vier Sprites wurden damit erzeugt.
  495. Was die Bewegung der Sprites angeht, so hat ein jeder Sprite seine
  496. eigene Routine mit eigenen Tabellenpointern auf X- und Y- Richtung.
  497. Wenn man nun die Bewegungen "außer Fase", also in verschiedenen Punkten
  498. der Tabelle, beginnen läßt, entstehen scheinbar separate Bahnen. Die
  499. Tabelle für X- und Y- Richtung sind aber immer die gleichen für alle
  500. Routinen. Ein Sprite startet z.B. bei Position x,y, ein anderer bei Position
  501. x+n,y+,, und plaziert ihn somit weiter vorne als den anderen. Das ist der
  502. Fall beim "Gänsemarsch". Oder es entstehen scheinbar zufällige
  503. Bahnen.
  504. Eine Besonderheit dieses Listings gebührt aber noch etwas Aufmerksamkeit:
  505. da öfters auf den Druck des linken und des rechten Mausknopfes gewartet
  506. werden muß, um die Bewegung der Sprites zu verändern, bevor man aussteigt,
  507. wäre es notwendig gewesen, jedesmal die zwei Loops, die die Zeile $FF
  508. abwarten, neuzuschreiben. Auch alle 8 "BSR BEWEGESPRITE":
  509.  
  510. ; Warte Zeile $FF
  511. ; bsr BEWEGESPRITE
  512. ; Warte auf linken Mausknopf
  513.  
  514. ; ändere die Bahn des Sprite
  515.  
  516. ; Warte Zeile $FF
  517. ; bsr BEWEGESPRITE
  518. ; Warte auf rechten Mausknopf
  519.  
  520. ; ändere die Bahn des Sprite
  521.  
  522. ; Warte Zeile $FF
  523. ; bsr BEWEGESPRITE
  524. ; Warte auf linken Mausknopf
  525.  
  526. ; ändere die Bahn des Sprite
  527.  
  528. ; Warte Zeile $FF
  529. ; bsr BEWEGESPRITE
  530. ; Warte auf rechten Mausknopf
  531.  
  532. Um Listingzeilen zu sparen ist eine Lösung die, die Warte-Schleife in die
  533. Subroutine BSR BEWEGESPRITE einzubauen:
  534.  
  535. ; Diese Routine startet die einzelnen Bewegungsroutinen der Sprites
  536. ; und beinhaltet auch den Warte-Loop des Fotogrammes für das Timing.
  537.  
  538. BewegeSprite:
  539.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  540.     bne.s    BewegeSprite
  541.  
  542.     bsr.s    BEWEGESPRITEX0    ; bewege den Sprite 0 horizontal
  543.     bsr.w    BEWEGESPRITEX1    ; bewege den Sprite 1 horizontal
  544.     bsr.w    BEWEGESPRITEX2    ; bewege den Sprite 2 horizontal
  545.     bsr.w    BEWEGESPRITEX3    ; bewege den Sprite 3 horizontal
  546.     bsr.w    BEWEGESPRITEY0    ; bewege den Sprite 0 vertikal
  547.     bsr.w    BEWEGESPRITEY1    ; bewege den Sprite 1 vertikal
  548.     bsr.w    BEWEGESPRITEY2    ; bewege den Sprite 2 vertikal
  549.     bsr.w    BEWEGESPRITEY3    ; bewege den Sprite 3 vertikal
  550.  
  551. Warte:
  552.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  553.     beq.s    Warte
  554.  
  555.     rts        ; zurück zum MOUSE - Loop
  556.  
  557. Somit muß nur gewartet werden, bis die Maustaste gedrückt wird, ansonsten
  558. wird die Routine BewegeSprite ausgeführt:
  559.  
  560.  
  561. Mouse1:
  562.     bsr.w    BewegeSprite    ; Wartet ein Fotogramm, bewegt die Sprite
  563.                 ; und kommt zurück
  564.  
  565.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  566.     bne.s    mouse1
  567.  
  568.     MOVE.L    #TABX+170,TABXPOINT0    ; ändere die Bahn des Sprite
  569.     ...
  570.  
  571. Mouse2:
  572.     bsr.w    BewegeSprite    ; Wartet ein Fotogramm, bewegt die Sprite
  573.                 ; und kommt zurück
  574.  
  575.     btst    #2,$dff016    ; rechte Maustaste gedrückt?
  576.     bne.s    mouse2
  577.  
  578.