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

  1.  
  2. ; Listing7z.s    ANIMATION (6 FOTOGRAMME) EINES ATTACHED-SPRITES
  3.  
  4.  
  5.      SECTION CipundCop,CODE
  6.  
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Name lib
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; speichern die alte COP
  16.  
  17. ;    Pointen auf das "leere" PIC
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  20.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25.  
  26. ;    Wir pointen auf die Sprites 0 und 1, die ATTACHED einen einzigen Sprite
  27. ;    zu 16 Farben ergeben. Der ungerade Sprite, also Sprite 1, muß das Bit 7
  28. ;    des zweiten Word auf 1 haben.
  29.  
  30.     MOVE.L    FRAMETAB(PC),d0         ; Adresse des Sprite in d0
  31.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  32.     move.w    d0,6(a1)
  33.     swap    d0
  34.     move.w    d0,2(a1)
  35.     swap    d0
  36.     ADD.L    #$44,d0        ; Der ungerade Sprite ist 44 Bytes später!!
  37.     addq.w    #8,a1        ; nächste SPRITEPOINTERS
  38.     move.w    d0,6(a1)
  39.     swap    d0
  40.     move.w    d0,2(a1)
  41.  
  42. ; P.S: Das Bit 7 braucht nicht gesetzt zu werden, es ist in diesem Fall schon
  43. ; gemacht
  44.  
  45.     move.l    #COPPERLIST,$dff080    ; undere COP
  46.     move.w    d0,$dff088        ; START COP
  47.     move.w    #0,$dff1fc        ; NO AGA!
  48.     move.w    #$c00,$dff106        ; NO AGA!
  49.  
  50. mouse:
  51.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  52.     bne.s    mouse
  53.  
  54.     bsr.s    Animation
  55.     bsr.w    BewegeSprites    ; Bewege die Sprites
  56.  
  57. Warte:
  58.     cmpi.b    #$ff,$dff006    ; Zeile    255?
  59.     beq.s    Warte
  60.  
  61.     btst    #6,$bfe001    ; Mouse gedrückt?
  62.     bne.s    mouse
  63.  
  64.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  65.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  66.  
  67.     move.l    4.w,a6
  68.     jsr    -$7e(a6)    ; Enable
  69.     move.l    gfxbase(PC),a1
  70.     jsr    -$19e(a6)    ; Closelibrary
  71.     rts
  72.  
  73. ;    Daten
  74.  
  75. GfxName:
  76.     dc.b    "graphics.library",0,0
  77.  
  78. GfxBase:
  79.     dc.l    0
  80.  
  81. OldCop:
  82.     dc.l    0
  83.  
  84. ; Diese Routine animiert die Sprites, indem sie die Adressen der einzelnen
  85. ; Fotogramme so verstellt, daß die erste der Tabelle an die letzte Stelle
  86. ; kommt, während alle anderen um eine Stelle in Richtung des ersten rutschen.
  87.  
  88. Animation:
  89.     addq.b    #1,ZahlAnim    ; diese drei Anweisungen sorgen dafür, daß
  90.     cmp.b    #2,ZahlAnim    ; das Fotogramm nur alle zwei Mal geändert
  91.     bne.s    NichtAendern    ; wird.
  92.     clr.b    ZahlAnim
  93.     LEA    FRAMETAB(PC),a0 ; Tabelle der Fotogramme
  94.     MOVE.L    (a0),d0         ; speichere die erste Adresse in d0
  95.     MOVE.L    4(a0),(a0)    ; verschiebe die nächsten 5 nach hinten
  96.     MOVE.L    4*2(a0),4(a0)    ; Diese Anweisungen "rotieren" die Adressen
  97.     MOVE.L    4*3(a0),4*2(a0) ; in der Tabelle.
  98.     MOVE.L    4*4(a0),4*3(a0)
  99.     MOVE.L    4*5(a0),4*4(a0)
  100.     MOVE.L    d0,4*5(a0)    ; Gibt die Ex-erste Adresse an sechste Stelle
  101.  
  102.     MOVE.L    FRAMETAB(PC),d0     ; Adresse des Sprite in d0
  103.     LEA    SpritePointers,a1    ; Gerade Spritepointer
  104.     move.w    d0,6(a1)
  105.     swap    d0
  106.     move.w    d0,2(a1)
  107.     swap    d0
  108.     ADD.L    #$44,d0     ; Der ungerade Sprite ist 44 Bytes nach dem geraden
  109.     addq.w    #8,a1     ; POINTER des ungeraden Sprite
  110.     move.w    d0,6(a1)
  111.     swap    d0
  112.     move.w    d0,2(a1)
  113. NichtAendern:
  114.     rts
  115.  
  116. ZahlAnim:
  117.     dc.w    0
  118.  
  119. ; Das ist die Tabelle mir den Adressen der Fotogramme des geraden Sprite,
  120. ; von der aus auch auf die dementsprechenden ungeraden Sprites zugegriffen
  121. ; wird, die attached werden müssen. Die Adressen in der Tabelle werden von
  122. ; der Routine "Animation" rotiert, somit befindet sich in der Liste das
  123. ; erste Mal Fotogramm1 an erster Stelle, das nächste Mal Fotogramm2 usw.
  124. ; Das wiederholt sich immer und beginnt dann wieder von vorne. Somit muß
  125. ; immer nur die Adresse genommen werden, die am Anfang der Tabelle steht,
  126. ; und diese dann "Mischen", um die Fotogramme in Sequenz zu haben.
  127.  
  128. FRAMETAB:
  129.     DC.L    Fotogramm1
  130.     DC.L    Fotogramm2
  131.     DC.L    Fotogramm3
  132.     DC.L    Fotogramm4
  133.     DC.L    Fotogramm5
  134.     DC.L    Fotogramm6
  135.  
  136. ; Diese Routine liest aus den zwei Tabellen die realen Koordinaten der
  137. ; Sprites. Da die Sprites Attached sind, haben sie die gleichen Koordianten.
  138.  
  139. BewegeSprites:
  140.     ADDQ.L    #1,TABYPOINT     ; Pointe auf das nächste Byte
  141.     MOVE.L    TABYPOINT(PC),A0 ; Adresse in Long TABXPOINT
  142.                  ; wird in a0 kopiert
  143.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Byte der TAB?
  144.     BNE.S    NOBSTARTY     ; noch nicht? Dann mach weiter
  145.     MOVE.L    #TABY-1,TABYPOINT ; Starte wieder beim ersten Byte
  146. NOBSTARTY:
  147.     moveq    #0,d3         ; Lösche d3
  148.     MOVE.b    (A0),d3         ; Kopiere das Byte aus der Tabelle, also
  149.                  ; die Y-Koordinate, in d3
  150.  
  151.     ADDQ.L    #2,TABXPOINT     ; Pointe auf das nächste Word
  152.     MOVE.L    TABXPOINT(PC),A0 ; Adresse von Long TABXPOINT
  153.                  ; wird in a0 kopiert
  154.     CMP.L    #ENDETABX-2,A0     ; sind wir beim letzten Word der TAB?
  155.     BNE.S    NOBSTARTX     ; noch nicht? Dann mach weiter
  156.     MOVE.L    #TABX-2,TABXPOINT ; Starte wieder beim ersten Word-2
  157. NOBSTARTX:
  158.     moveq    #0,d4        ; Löschen d4
  159.     MOVE.w    (A0),d4        ; geben der Wert der Tabelle, also die
  160.                 ; X-Koordinate, in d4
  161.  
  162.     MOVE    D3,D0        ; Y-Koordinate in d0
  163.     MOVE    D4,D1        ; X-Koordinate in d1
  164.     moveq    #15,d2        ; Höhe des Sprite in d2
  165.     MOVE.L    FRAMETAB(PC),a1 ; Adresse des Sprite in A1
  166.  
  167.     bsr.w    UniMoveSprite    ; führt die UniversalRoutine zum positionieren
  168.                 ; des geraden Sprite aus
  169.  
  170.     MOVE.W    D3,D0        ; Y-Koordinate in d0
  171.     MOVE.W    D4,D1        ; X-Koordinate in d1
  172.     moveq    #15,d2        ; Höhe des Sprite in d2
  173.     LEA    $44(a1),a1    ; Adresse des ungeraden Sprite in A1
  174.                 ; der ungerade Sprite ist 44 Byte nach dem
  175.                 ; geraden
  176.     bsr.w    UniMoveSprite    ; Startet die Universalroutine zum position.
  177.                 ; des ungeraden Sprite
  178.     rts
  179.  
  180.  
  181. TABYPOINT:
  182.     dc.l    TABY-1    ; BEMERKE: Die Werte der Tabelle sind hier Bytes,
  183.             ; wir arbeiten deshalb mit einem ADDQ.L #1,TABYPOINT
  184.             ; und nicht mit einem #2 wie es bei den Word der Fall
  185.             ; wäre, oder mit #4 bei Long
  186. TABXPOINT:
  187.     dc.l    TABX-2        ; BEMERKE: Die Werte der Tabelle sind hier Word
  188.  
  189. ; Tabelle mit vorausberechneten Y-Koordinaten
  190.  
  191. TABY:
  192.     incbin    "ycoordinatok.tab"    ; 200 .B Werte
  193. ENDETABY:
  194.  
  195. ; Tanbelle mit vorausberechneten X-Koordianten
  196.  
  197. TABX:
  198.     incbin    "xcoordinatok.tab"    ; 150 .W Werte
  199. ENDETABX:
  200.  
  201. ; Universelle Routine zum Positionieren der Sprites
  202.  
  203. ;    Eingangsparameter von UniMoveSprite:
  204. ;
  205. ;    a1 = Adresse des Sprite
  206. ;    d0 = Vertikale Position des Sprite auf dem Screen (0-255)
  207. ;    d1 = Horizontale Position des Sprite auf dem Screen (0-320)
  208. ;    d2 = Höhe des Sprite
  209. ;
  210. UniMoveSprite:
  211. ; Vertikale Positionierung
  212.  
  213.     ADD.W    #$2c,d0     ; zähle den Offset vom Anfang des Screens dazu
  214.  
  215. ; a1 enthält die Adresse des Sprite
  216.  
  217.     MOVE.b    d0,(a1)        ; kopiert das Byte in VSTART
  218.     btst.l    #8,d0
  219.     beq.s    NichtVSTARTSET
  220.     bset.b    #2,3(a1)    ; Setzt das Bit 8 von VSTART (Zahl > $FF)
  221.     bra.s    ToVSTOP
  222. NichtVSTARTSET:
  223.     bclr.b    #2,3(a1)    ; Löscht das Bit 8 von VSTART (Zahl < $FF)
  224. ToVSTOP:
  225.     ADD.w    D2,D0        ; Zähle die Höhe des Sprite dazu, um
  226.                 ; die Endposition zu errechnen (VSTOP)
  227.     move.b    d0,2(a1)    ; Setze den richtigen Wert in VSTOP
  228.     btst.l    #8,d0
  229.     beq.s    NichtVSTOPSET
  230.     bset.b    #1,3(a1)    ; Setzt Bit 8 von VSTOP (Zahl > $FF)
  231.     bra.w    VVSTOPENDE
  232. NichtVSTOPSET:
  233.     bclr.b    #1,3(a1)    ; Löscht Bit 8 von VSTOP (Zahl < $FF)
  234. VVSTOPENDE:
  235.  
  236. ; horizontale Positionierung
  237.  
  238.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren
  239.     btst    #0,D1        ; niederwert. Bit der X-Koordinate auf 0?
  240.     beq.s    NiederBitNull
  241.     bset    #0,3(a1)    ; Setzen das niederw. Bit von HSTART
  242.     bra.s    PlaceCoords
  243.  
  244. NiederBitNull:
  245.     bclr    #0,3(a1)    ; Löschen das niederw. Bit von HSTART
  246. PlaceCoords:
  247.     lsr.w    #1,D1        ; SHIFTEN, verschieben den Wert von HSTART um
  248.                 ; 1 Bit nach Rechts, um es in den Wert zu
  249.                 ; "verwandeln", der dann in HSTART kommt, also
  250.                 ; ohne dem niederwertigen Bit.
  251.     move.b    D1,1(a1)    ; geben den Wert XX ins Byte HSTART
  252.     rts
  253.  
  254.  
  255.  
  256.     SECTION GRAPHIC,DATA_C
  257.  
  258. COPPERLIST:
  259. SpritePointers:
  260.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  261.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  262.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  263.     dc.w    $13e,0
  264.  
  265.     dc.w    $8E,$2c81    ; DiwStrt
  266.     dc.w    $90,$2cc1    ; DiwStop
  267.     dc.w    $92,$38        ; DdfStart
  268.     dc.w    $94,$d0        ; DdfStop
  269.     dc.w    $102,0        ; BplCon1
  270.     dc.w    $104,0        ; BplCon2
  271.     dc.w    $108,0        ; Bpl1Mod
  272.     dc.w    $10a,0        ; Bpl2Mod
  273.  
  274.             ; 5432109876543210
  275.     dc.w    $100,%0001001000000000    ; Bit 12 an: 1 Bitplane Lowres
  276.  
  277. BPLPOINTERS:
  278.     dc.w $e0,0,$e2,0    ;erstes    Bitplane
  279.  
  280. ;    Palette der PIC
  281.  
  282.     dc.w    $180,$000    ; COLOR0    ; schwarzer Hintergrund
  283.     dc.w    $182,$123    ; COLOR1    ; Farbe 1 des Bitplane, das
  284.                         ; in diesem Fall leer ist,
  285.                         ; deswegen erscheint sie nicht.
  286.  
  287. ;    Palette der SPRITE Attacched
  288.  
  289.     dc.w    $1A2,$FFC    ; COLOR17, COL 1 für Attached-Sprite
  290.     dc.w    $1A4,$DEA    ; COLOR18, COL 2 für Attached-Sprite
  291.     dc.w    $1A6,$AC7    ; COLOR19, COL 3 für Attached-Sprite
  292.     dc.w    $1A8,$7B6    ; COLOR20, COL 4 für Attached-Sprite
  293.     dc.w    $1AA,$494    ; COLOR21, COL 5 für Attached-Sprite
  294.     dc.w    $1AC,$284    ; COLOR22, COL 6 für Attached-Sprite
  295.     dc.w    $1AE,$164    ; COLOR23, COL 7 für Attached-Sprite
  296.     dc.w    $1B0,$044    ; COLOR24, COL 7 für Attached-Sprite
  297.     dc.w    $1B2,$023    ; COLOR25, COL 9 für Attached-Sprite
  298.     dc.w    $1B4,$001    ; COLOR26, COL 10 für Attached-Sprite
  299.     dc.w    $1B6,$F80    ; COLOR27, COL 11 für Attached-Sprite
  300.     dc.w    $1B8,$C40    ; COLOR28, COL 12 für Attached-Sprite
  301.     dc.w    $1BA,$820    ; COLOR29, COL 13 für Attached-Sprite
  302.     dc.w    $1BC,$500    ; COLOR30, COL 14 für Attached-Sprite
  303.     dc.w    $1BE,$200    ; COLOR31, COL 15 für Attached-Sprite
  304.  
  305.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  306.  
  307.  
  308. ; ************ Hier die Sprite: KLARERWEISE in CHIP RAM! **********
  309.  
  310.  
  311. Fotogramm1:        ; Länge 15 Zeilen, $44 Bytes
  312.     dc.w $0000,$0000
  313.     dc.w $0580,$0040,$07c0,$0430,$0d68,$0d18,$1fac,$1b9c
  314.     dc.w $3428,$3818,$068e,$993c,$d554,$1390,$729e,$b6d8
  315.     dc.w $5556,$9390,$96b0,$e972,$406c,$7c60,$5bc4,$5fc8
  316.     dc.w $0970,$0908,$0bc0,$0030,$0600,$01c0
  317.     dc.w 0,0
  318. Fotogramm1b:        ; lunghezza 15 linee
  319.     dc.w $0000,$0080
  320.     dc.w $07c0,$0000,$1bf0,$0380,$32f8,$0380,$607c,$0380
  321.     dc.w $43f8,$0384,$e3fc,$0382,$efec,$7ffe,$cfe4,$7ffe
  322.     dc.w $efec,$7ffe,$fff0,$038e,$7fe0,$039c,$5c40,$23bc
  323.     dc.w $0a80,$37f8,$0380,$1ff0,$0000,$07c0
  324.     dc.w 0,0
  325.  
  326. Fotogramm2:
  327.     dc.w $0000,$0000
  328.     dc.w $0580,$0040,$05c0,$0430,$0ee8,$0e98,$1dac,$1b9c
  329.     dc.w $34e8,$3ad8,$560e,$993c,$f5e8,$3318,$d252,$1690
  330.     dc.w $3a96,$c7d0,$95b8,$ea32,$41ec,$78e0,$5e44,$5e48
  331.     dc.w $0470,$0408,$0ec0,$0030,$0600,$01c0
  332.     dc.w 0,0
  333. Fotogramm2b:
  334.     dc.w $0000,$0080
  335.     dc.w $07c0,$0000,$1bf0,$0180,$3178,$01c0,$607c,$01c0
  336.     dc.w $4138,$01c4,$e3fc,$7382,$cff8,$7f86,$efe0,$fffe
  337.     dc.w $ffec,$0ffe,$ffc8,$07fe,$7ff8,$071c,$5940,$27bc
  338.     dc.w $0a00,$3ff8,$0e00,$1ff0,$0000,$07c0
  339.     dc.w 0,0
  340.  
  341. Fotogramm3:
  342.     dc.w $0000,$0000
  343.     dc.w $0580,$0040,$04c0,$0430,$0e68,$0e18,$3dfc,$1bec
  344.     dc.w $25c8,$0bd8,$7b2e,$ba3c,$d068,$1798,$6642,$82b0
  345.     dc.w $32d6,$c690,$9490,$eb12,$49bc,$78b0,$4d6c,$4d60
  346.     dc.w $1870,$0808,$0ec0,$0030,$0600,$01c0
  347.     dc.w 0,0
  348. Fotogramm3b:
  349.     dc.w $0000,$0080
  350.     dc.w $07c0,$0000,$1bf0,$0000,$31f8,$0060,$601c,$20f0
  351.     dc.w $7038,$30e4,$c5dc,$7de2,$eff8,$3fc6,$fff0,$0fce
  352.     dc.w $fff0,$07ee,$ffe8,$07fe,$77c8,$0f7c,$5358,$3ebc
  353.     dc.w $1400,$3ff8,$0c00,$1ff0,$0000,$07c0
  354.     dc.w 0,0
  355.  
  356. Fotogramm4:
  357.     dc.w $0000,$0000
  358.     dc.w $0580,$0040,$04c0,$0430,$1678,$0608,$357c,$1764
  359.     dc.w $0968,$0968,$122e,$91bc,$c7e8,$0398,$6242,$86b0
  360.     dc.w $3256,$c790,$93b0,$f032,$786c,$5b60,$7354,$4748
  361.     dc.w $1870,$0808,$0ac0,$0030,$0600,$01c0
  362.     dc.w 0,0
  363. Fotogramm4b:
  364.     dc.w $0000,$0080
  365.     dc.w $07c0,$0000,$1bf0,$0000,$39f8,$1830,$689c,$3c78
  366.     dc.w $7698,$3ef4,$efdc,$1fe2,$fff8,$0fc6,$fff0,$07ce
  367.     dc.w $fff0,$0fee,$efc0,$1ffe,$6798,$3cfc,$7f30,$38fc
  368.     dc.w $1820,$37f8,$0000,$1ff0,$0000,$07c0
  369.     dc.w 0,0
  370.  
  371. Fotogramm5:
  372.     dc.w $0000,$0000
  373.     dc.w $0580,$0040,$04c0,$0030,$0e68,$0218,$172c,$1714
  374.     dc.w $3ca8,$3ca0,$0116,$9810,$cf10,$09d0,$64e2,$8290
  375.     dc.w $30d6,$d7b0,$8a50,$c992,$782c,$5b20,$7be4,$4fe8
  376.     dc.w $0830,$0808,$0ae0,$0010,$0600,$01c0
  377.     dc.w 0,0
  378. Fotogramm5b:
  379.     dc.w $0000,$0080
  380.     dc.w $07c0,$0000,$1ff0,$0400,$3df8,$0c00,$68fc,$0e08
  381.     dc.w $4358,$0f3c,$e7ec,$077e,$f7e8,$07fe,$fff0,$07ee
  382.     dc.w $eff0,$1fce,$f7f0,$3fee,$67c0,$3cfc,$7f10,$30fc
  383.     dc.w $0870,$37f8,$0060,$1ff0,$0000,$07c0
  384.     dc.w 0,0
  385.  
  386. Fotogramm6:
  387.     dc.w $0000,$0000
  388.     dc.w $0580,$0040,$07c0,$0430,$0e68,$0a18,$1b2c,$1b1c
  389.     dc.w $3428,$3c18,$0696,$9910,$cf5c,$0d98,$7492,$92d0
  390.     dc.w $50b6,$97d0,$ab70,$c8b2,$602c,$5e20,$5bc4,$5fc8
  391.     dc.w $0850,$0848,$0ae0,$0010,$0600,$01c0
  392.     dc.w 0,0
  393. Fotogramm6b:
  394.     dc.w $0000,$0080
  395.     dc.w $07c0,$0000,$1bf0,$0300,$35f8,$0700,$64fc,$0700
  396.     dc.w $43f8,$0784,$e3ec,$03be,$f3e4,$03fe,$efee,$1ffe
  397.     dc.w $eff0,$7fee,$f7f0,$3fce,$7fe0,$21dc,$5e00,$21fc
  398.     dc.w $08a0,$37f8,$00e0,$1ff0,$0000,$07c0
  399.     dc.w 0,0
  400.  
  401.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  402.                   ; müssen es verwenden, denn ohne Bitplane
  403.                   ; ist es nicht möglich, die Sprites
  404.                   ; zu aktivieren
  405. BITPLANE:
  406.     ds.b    40*256        ; Bitplane auf 0 Lowres
  407.  
  408.     end
  409.  
  410. In diesem Beispiel zeigen wir, wie man einen animierten Sprite realisiert,
  411. indem  wir  die  in der Lektion angeführte Technik anwenden. Das Bild, das
  412. wir animieren, besteht eigentlich aus einen Spritepaar, das Attached  ist,
  413. wir  bewegen  also  praktisch  zwei  Sprites. Für jeden Sprite haben wir 6
  414. Fotogramme parat.  Betrachten  wir  im  Moment  nur  einen  Sprite.  Jedes
  415. Fotogramm  ist  in  einer  Spritestruktur  gespeichert. Jedesmal, wenn der
  416. Sprite neugezeichnet wird, sorgt die Routine "Animation"  dafür,  daß  ein
  417. anderes  Fotogramm  benutzt  wird,  also  eine  andere Spritestruktur. Die
  418. Routine  verwaltet  eine  Tabelle  mit  den  Adressen  der  verschiedenen
  419. Spritestrukturen,  und  jedesmal,  wenn sie ausgeführt wird, verstellt sie
  420. die Adressen darin so, daß sie eine Art Rotation  ausführen,  alle  kommen
  421. einmal an die erste Stelle der Tabelle.
  422. In der Praxis gibt´s hier nichts  Neues  zu  sehen,  wir  haben  nur  eine
  423. Tabelle  mit  Werten  vor  uns,  oder besser: mit Adressen. Diese Adressen
  424. werden dann rotiert, die erste Adresse kommt an  die  letzte  Stelle,  die
  425. zweite an die erste, die dritte an die zweite usw., genau so wie wir es in
  426. Listing3e.s gesehen haben. Die Adresse an  der  ersten  Stelle  wird  dann
  427. immer  in den Spritepointer geladen, und sie wird als Fotogramm verwendet.
  428. Um zu vermeiden, diese Arbeit auch für den zweiten Sprite machen zu müssen
  429. (dem  ungeraden,  der  ja  am geraden "hängt"), ist jedes Fotogramm dieses
  430. "zweiten" Sprites sofort nach dem des ersten im Speicher angesiedelt. Wenn
  431. man  nun  die Adresse des einen hat, kann man ohne Probleme auf das andere
  432. rückschließen, es wird immer $44 Byte später sein:
  433.  
  434.   lea  $44(a0),a1
  435.  
  436. Damit  zählen  wir zur Adresse des Fotogrammes des ersten Sprite die Länge
  437. des Fotogrammes selbst dazu, und befinden uns somit auf  der  Adresse  des
  438. zweiten Fotogrammes (Ungerader Sprite).
  439.  
  440. AdÜ: FFFFFFFeeeeeeerrrrrtttttiiiiiggggg!!!!!!!
  441.  
  442.