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

  1.  
  2. ; Listing7e.s    EIN SPRITE WIRD SOWOHL VERTIKAL ALS AUCH HORIZONTAL MIT
  3. ;        ZWEI TABELLEN BEWEGT (VORGEFERTIGTEN WERTEN)
  4. ;
  5. ;        Im Kommentar wird erklärt, wie man sich selbst Tebellen
  6. ;        herstellen kann.
  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. ;    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        ; NO AGA!
  39.  
  40. mouse:
  41.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  42.     bne.s    mouse
  43.  
  44.  
  45.     bsr.s    BewegeSpriteX    ; Bewege Sprite 0 in X-Richtung
  46.     bsr.w    BewegeSpriteY    ; Bewege Sprite 0 in Y-Richtung
  47.  
  48. Warte:
  49.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  50.     beq.s    Warte
  51.  
  52.     btst    #6,$bfe001    ; Mouse gedrückt?
  53.     bne.s    mouse
  54.  
  55.  
  56.     move.l    OldCop(PC),$dff080    ; Pointen auf die alte SystemCOP
  57.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  58.  
  59.     move.l    4.w,a6
  60.     jsr    -$7e(a6)    ; Enable
  61.     move.l    gfxbase(PC),a1
  62.     jsr    -$19e(a6)    ; Closelibrary
  63.     rts
  64.  
  65. ;    Daten
  66.  
  67. GfxName:
  68.     dc.b    "graphics.library",0,0
  69.  
  70. GfxBase:
  71.     dc.l    0
  72.  
  73. OldCop:
  74.     dc.l    0
  75.  
  76. ; In diesem Beispiel wurden die Routinen und Tabellen aus den vorigen
  77. ; Beispielen verwendet, wir verändern damit die X- und die Y-Position
  78. ; des Sprites. Da beide Tabellen 200 Werte haben, werden immer die
  79. ; gleichen Paare zusammenkommen:
  80.  
  81. ; Wert 1 der Tabelle X + Wert 1 der Tabelle Y
  82. ; Wert 2 der Tabelle X + Wert 2 der Tabelle Y
  83. ; Wert 3 der Tabelle X + Wert 3 der Tabelle Y
  84. ; ....
  85. ; Das Resultat ist dann, daß der Sprite in die Diagonale geht, wie wir es schon
  86. ; gesehen haben, wenn man addq.b #1,HSTART und addq.b #1,VSTART/VSTOP
  87. ; zusammengibt.
  88.  
  89.  
  90. ; Diese Routine bewegt den Sprite indem die auf das Byte HSTART, also
  91. ; dem Byte seiner X-Pos, zugreift. Es werden die Werte einer vorausberechneten
  92. ; Tabelle (TABX) eingesetzt. Wenn wir nur auf HSTART agieren, dann bewegen wir
  93. ; den Sprite um jeweils 2 Pixel, und nicht nur einem, deswegen ist der Scroll
  94. ; etwas "ruckelig", vor allem wenn er langsamer wird.
  95. ; In den nächsten Listings werden wir dieses Manko beheben und mit einem Pixel
  96. ; scrollen.
  97.  
  98. BewegeSpriteX:
  99.     ADDQ.L    #1,TABXPOINT     ; Pointe auf das nächste Byte
  100.     MOVE.L    TABXPOINT(PC),A0 ; Adresse, die im Long TABXPOINT enthalten ist
  101.                  ; wird in a0 kopiert
  102.     CMP.L    #ENDETABX-1,A0     ; Sind wir beim letzten Long der TAB?
  103.     BNE.S    NOBSTARTX     ; noch nicht? dann mach´ weiter
  104.     MOVE.L    #TABX-1,TABXPOINT ; Starte wieder beim ersten Long
  105. NOBSTARTX:
  106.     MOVE.b    (A0),HSTART    ; Kopiert das Byte aus der Tabelle nach HSTART
  107.     rts
  108.  
  109. TABXPOINT:
  110.     dc.l    TABX-1    ; BEMERKUNG: Die Werte in der Tabelle sind Bytes,
  111.             ; deswegen arbeiten wir mit einem ADDQ.L #1,TABXPOINT
  112.             ; und nicht mit #2 wie es bei Word der Fall wäre oder
  113.             ; mit #4, Longword.
  114.  
  115. ; Tabelle mit vordefinierten X-Koordinaten.
  116. ; Zu Bemerken, daß die X-Werte innerhalb der Grenzen $40 und $d8 sein müssen,
  117. ; in der Tabelle kommen deswegen keine Werte vor, die kleiner als $40 oder
  118. ; größer als $d8 sind.
  119.  
  120. TABX:
  121.     dc.b    $41,$43,$46,$48,$4A,$4C,$4F,$51,$53,$55,$58,$5A ; 200 valori
  122.     dc.b    $5C,$5E,$61,$63,$65,$67,$69,$6B,$6E,$70,$72,$74
  123.     dc.b    $76,$78,$7A,$7C,$7E,$80,$82,$84,$86,$88,$8A,$8C
  124.     dc.b    $8E,$90,$92,$94,$96,$97,$99,$9B,$9D,$9E,$A0,$A2
  125.     dc.b    $A3,$A5,$A7,$A8,$AA,$AB,$AD,$AE,$B0,$B1,$B2,$B4
  126.     dc.b    $B5,$B6,$B8,$B9,$BA,$BB,$BD,$BE,$BF,$C0,$C1,$C2
  127.     dc.b    $C3,$C4,$C5,$C5,$C6,$C7,$C8,$C9,$C9,$CA,$CB,$CB
  128.     dc.b    $CC,$CC,$CD,$CD,$CE,$CE,$CE,$CF,$CF,$CF,$CF,$D0
  129.     dc.b    $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,$CF,$CF,$CF
  130.     dc.b    $CF,$CE,$CE,$CE,$CD,$CD,$CC,$CC,$CB,$CB,$CA,$C9
  131.     dc.b    $C9,$C8,$C7,$C6,$C5,$C5,$C4,$C3,$C2,$C1,$C0,$BF
  132.     dc.b    $BE,$BD,$BB,$BA,$B9,$B8,$B6,$B5,$B4,$B2,$B1,$B0
  133.     dc.b    $AE,$AD,$AB,$AA,$A8,$A7,$A5,$A3,$A2,$A0,$9E,$9D
  134.     dc.b    $9B,$99,$97,$96,$94,$92,$90,$8E,$8C,$8A,$88,$86
  135.     dc.b    $84,$82,$80,$7E,$7C,$7A,$78,$76,$74,$72,$70,$6E
  136.     dc.b    $6B,$69,$67,$65,$63,$61,$5E,$5C,$5A,$58,$55,$53
  137.     dc.b    $51,$4F,$4C,$4A,$48,$46,$43,$41
  138. ENDETABX:
  139.  
  140.  
  141.  
  142.     even    ; damit gleichen wir die folgende Adresse aus
  143.  
  144.  
  145. ; Diese Routine bewegt den Sprite nach Oben und nach Unten, indem sie auf
  146. ; die Bytes VSTART und VSTOP zugreift, also den Anfangs- und Endkoordinaten
  147. ; des Sprites. Es werden schon vordefinierte Koordinaten aus TABY eingesetzt.
  148.  
  149. BewegeSpriteY:
  150.     ADDQ.L    #1,TABYPOINT     ; Pointe auf das nächste Byte
  151.     MOVE.L    TABYPOINT(PC),A0 ; Adresse, die im Long TABXPOINT enthalten ist
  152.                  ; wird in a0 kopiert
  153.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Long der TAB?
  154.     BNE.S    NOBSTARTY     ; noch nicht? dann mach´ weiter
  155.     MOVE.L    #TABY-1,TABYPOINT ; Starte wieder beim ersten Long
  156. NOBSTARTY:
  157.     moveq    #0,d0        ; Lösche d0
  158.     MOVE.b    (A0),d0        ; kopiere Byte aus der Tabelle in d0
  159.     MOVE.b    d0,VSTART    ; kopieren das Byte in VSTART
  160.     ADD.B    #13,D0        ; Addiere die Länge des Sprite, um die
  161.                 ; Endposition    (VSTOP) zu ermitteln
  162.     move.b    d0,VSTOP    ; Gib diesen Wert in VSTOP
  163.     rts
  164.  
  165. TABYPOINT:
  166.     dc.l    TABY-1    ; BEMERKUNG: Die Werte in der Tabelle sind Bytes,
  167.             ; deswegen arbeiten wir mit einem ADDQ.L #1,TABXPOINT
  168.             ; und nicht mit #2 wie es bei Word der Fall wäre oder
  169.             ; mit #4, Longword.
  170.  
  171. ; Tabelle mit vordefinierten Y-Koordinaten.
  172. ; Zu Bemerken, daß die Y-Werte innerhalb der Grenzen $2c und $f2 sein müssen,
  173. ; in der Tabelle kommen deswegen keine Werte vor, die kleiner als $2c oder
  174. ; größer als $f2 sind.
  175.  
  176. TABY:
  177.     dc.b    $EE,$EB,$E8,$E5,$E2,$DF,$DC,$D9,$D6,$D3,$D0,$CD ; Rekord-
  178.     dc.b    $CA,$C7,$C4,$C1,$BE,$BB,$B8,$B5,$B2,$AF,$AC,$A9 ; hochsprung!
  179.     dc.b    $A6,$A4,$A1,$9E,$9B,$98,$96,$93,$90,$8E,$8B,$88 ;
  180.     dc.b    $86,$83,$81,$7E,$7C,$79,$77,$74,$72,$70,$6D,$6B ; 200 Werte
  181.     dc.b    $69,$66,$64,$62,$60,$5E,$5C,$5A,$58,$56,$54,$52
  182.     dc.b    $51,$4F,$4D,$4B,$4A,$48,$47,$45,$44,$42,$41,$3F
  183.     dc.b    $3E,$3D,$3C,$3A,$39,$38,$37,$36,$35,$34,$33,$33
  184.     dc.b    $32,$31,$30,$30,$2F,$2F,$2E,$2E,$2D,$2D,$2D,$2C
  185.     dc.b    $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2D,$2D,$2D
  186.     dc.b    $2E,$2E,$2F,$2F,$30,$30,$31,$32,$33,$33,$34,$35
  187.     dc.b    $36,$37,$38,$39,$3A,$3C,$3D,$3E,$3F,$41,$42,$44
  188.     dc.b    $45,$47,$48,$4A,$4B,$4D,$4F,$51,$52,$54,$56,$58
  189.     dc.b    $5A,$5C,$5E,$60,$62,$64,$66,$69,$6B,$6D,$70,$72
  190.     dc.b    $74,$77,$79,$7C,$7E,$81,$83,$86,$88,$8B,$8E,$90
  191.     dc.b    $93,$96,$98,$9B,$9E,$A1,$A4,$A6,$A9,$AC,$AF,$B2
  192.     dc.b    $B5,$B8,$BB,$BE,$C1,$C4,$C7,$CA,$CD,$D0,$D3,$D6
  193.     dc.b    $D9,$DC,$DF,$E2,$E5,$E8,$EB,$EE
  194. ENDETABY:
  195.  
  196.  
  197.      SECTION GRAPHIC,DATA_C
  198.  
  199. COPPERLIST:
  200. SpritePointers:
  201.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  202.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  203.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  204.     dc.w    $13e,0
  205.  
  206.     dc.w    $8E,$2c81    ; DiwStrt
  207.     dc.w    $90,$2cc1    ; DiwStop
  208.     dc.w    $92,$38        ; DdfStart
  209.     dc.w    $94,$d0        ; DdfStop
  210.     dc.w    $102,0        ; BplCon1
  211.     dc.w    $104,0        ; BplCon2
  212.     dc.w    $108,0        ; Bpl1Mod
  213.     dc.w    $10a,0        ; Bpl2Mod
  214.             ; 5432109876543210
  215.     dc.w    $100,%0001001000000000  ; Bit 12 an!! 1 Bitplane Lowres
  216.  
  217. BPLPOINTERS:
  218.     dc.w $e0,0,$e2,0    ;erstes  Bitplane
  219.  
  220.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  221.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  222.                         ; in diesem Fall leer ist,
  223.                         ; und deswegen nicht erscheint
  224.  
  225.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROT
  226.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  227.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GELB
  228.  
  229.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  230.  
  231.  
  232. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ********
  233.  
  234. MEINSPRITE:        ; Länge 13 Zeilen
  235. VSTART:
  236.     dc.b $50  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  237. HSTART:
  238.     dc.b $90  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  239. VSTOP:
  240.     dc.b $5d  ; $50+13=$5d    ; Vertikale Endposition des Sprite
  241.     dc.b $00
  242.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  243.  dc.w    %0000000000000000,%0000011001100000
  244.  dc.w    %0000000000000000,%0000001001000000
  245.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  246.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  247.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  248.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  249.  dc.w    %0000011111100000,%0000011111100000
  250.  dc.w    %0000011111100000,%0001111001111000
  251.  dc.w    %0000001111000000,%0011101111011100
  252.  dc.w    %0000000110000000,%0011000110001100
  253.  dc.w    %0000000000000000,%1111000000001111
  254.  dc.w    %0000000000000000,%1111000000001111
  255.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  256.  
  257.  
  258.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  259.                   ; müssen es verwenden, denn ohne Bitplane
  260.                   ; ist es nicht möglich, die Sprites
  261.                   ; zu aktivieren
  262. BITPLANE:
  263.     ds.b    40*256      ; Bitplane auf 0 Lowres
  264.  
  265.     end
  266.  
  267. Bis  jetzt  haben  wir den Sprite horizontal, vertikal und diagonal laufen
  268. lassen, aber niemals Kurven. Gut, ihr müßt nur dieses  Listing  verändern,
  269. um  alle  möglichen  Kurven  zu  erzeugen, denn wir können seine X- und Y-
  270. Koordianten ändern, wie wir wollen. In diesem Listing sind beide  Tabellen
  271. gleich  lang,  200  Werte,  deswegen werden wir immer die gleichen "Paare"
  272. haben:
  273.  
  274.  
  275.  Wert 1 der Tabelle X + Wert 1 der Tabelle Y
  276.  Wert 2 der Tabelle X + Wert 2 der Tabelle Y
  277.  Wert 3 der Tabelle X + Wert 3 der Tabelle Y
  278.  
  279.  ....
  280.  
  281. Daraus  ergibt  sich immer die gleiche Oszillierung in die Diagonale. Wenn
  282. aber eine der beiden Tabellen kürzer wäre, dann  würde  diese  früher  von
  283. vorne  beginnen  als  die  andere.  Und  das  würde dann immer neue Muster
  284. ergeben, denn jedesmal kämen andere Paare zusammen:
  285.  
  286.  Wert 23 der Tabelle X + Wert 56 der Tabelle Y
  287.  Wert 24 der Tabelle X + Wert 57 der Tabelle Y
  288.  Wert 25 der Tabelle X + Wert 58 der Tabelle Y
  289. ....
  290.  
  291. Diese Werte würden dann kurvenförmige Schwingungen des Sprites ergeben.
  292.  
  293. Probiert mal, folgende Tabelle der X-Werte statt  der  alten  einzusetzen:
  294. (Amiga+b+c+i zum Kopieren, Amiga+b+x um ein Stück zu löschen)
  295.  
  296. TABX:
  297.     dc.b    $8A,$8D,$90,$93,$95,$98,$9B,$9E,$A1,$A4,$A7,$A9 ; 150 Werte
  298.     dc.b    $AC,$AF,$B1,$B4,$B6,$B8,$BA,$BC,$BF,$C0,$C2,$C4
  299.     dc.b    $C6,$C7,$C8,$CA,$CB,$CC,$CD,$CE,$CE,$CF,$CF,$D0
  300.     dc.b    $D0,$D0,$D0,$D0,$CF,$CF,$CE,$CE,$CD,$CC,$CB,$CA
  301.     dc.b    $C8,$C7,$C6,$C4,$C2,$C0,$BF,$BC,$BA,$B8,$B6,$B4
  302.     dc.b    $B1,$AF,$AC,$A9,$A7,$A4,$A1,$9E,$9B,$98,$95,$93
  303.     dc.b    $90,$8D,$8A,$86,$83,$80,$7D,$7B,$78,$75,$72,$6F
  304.     dc.b    $6C,$69,$67,$64,$61,$5F,$5C,$5A,$58,$56,$54,$51
  305.     dc.b    $50,$4E,$4C,$4A,$49,$48,$46,$45,$44,$43,$42,$42
  306.     dc.b    $41,$41,$40,$40,$40,$40,$40,$41,$41,$42,$42,$43
  307.     dc.b    $44,$45,$46,$48,$49,$4A,$4C,$4E,$50,$51,$54,$56
  308.     dc.b    $58,$5A,$5C,$5F,$61,$64,$67,$69,$6C,$6F,$72,$75
  309.     dc.b    $78,$7B,$7D,$80,$83,$86
  310. ENDETABX:
  311.  
  312. Nun könnt ihr euren Sprite am Bildschirm bewundern,  wir  er  realistische
  313. und  variable  Bewegungen  ausführt.  Das  ist das  Ergebnis  der
  314. unterschiedlichen Längen der Tabellen.
  315.  
  316. Mit  zwei  Tabellen,  einer  für  die  XX-Richtung  und  einer    für  die
  317. YY-Richtung,  werden  auch verschiedene kurvenförmige Bewegungen bei Demos
  318. und Spielen hergestellt, z.B. den Wurf einer Granate:
  319.  
  320.         .  .
  321.          .         .
  322.         .          .
  323.      o /          .
  324.     /||         
  325.      /\       BOOM!!
  326.  
  327. Der Verlauf  der  Richtung  der  Bombe  unseres  Helden  wurde  durch  das
  328. Vorausberechnen  dieser  in  XX  und YY Koordinaten simuliert. Da sich das
  329. Männchen auf jeder beliebigen Position am Bildschirm befinden konnte, z.B.
  330. ganz  links unten oder mitte-rechts, wird einfach die Position des Werfers
  331. zu der Kurve addiert,  und  somit  wird  die  Bombe  vom  richtigen  Punkt
  332. abgeworfen  und  geht  dann (hoffentlich) ins Ziel. Oder auch die Bewegung
  333. eines Geschwaders von außerirdischen Raumschiffen:
  334.  
  335.  
  336.                  @  @  @  @  @  @  @  @ <--
  337.               @      @
  338.             @        @
  339.  
  340.             @          @
  341.               @       @ 
  342.        <--  @  @  @  @  @  @
  343.  
  344.  
  345. Die Anwendungsgebiete der Tabellen sind unendlich.
  346.  
  347. Ihr werdet euch nun  fragen:  Müssen  wir  uns  diese  Tabellen  per  Hand
  348. ausrechnen,  und  die  Kurve  Pi  mal Daumen erraten? NEIN. Der Asmone hat
  349. einen Befehl, den "CS" (oder "IS"), der  ausreicht,  um  die  Tabellen  zu
  350. errechnen,  die  wir  in  diesem Kurs verwenden (ich habe sie wirklich mit
  351. diesem Befehl gemacht!). Wenn es einer  ganz  speziellen  Tabelle  bedarf,
  352. dann  kann  man  sich  auch  ein Programm schreiben, das einen eine solche
  353. erstellt.
  354.  
  355. Ich nehme das Argument "wie mache ich mir eine Tabelle?" voraus:
  356.  
  357. Der Befehl CS bedeutet  "CREATE  SINUS",  dür  diejenigen,  die  sich  ein
  358. bißchen mit Trigonometrie auskennen bedeutet das "Ist das alles?", während
  359. für diejenigen, die sie nicht kennen, es ein "Was iss´n das?" werden wird.
  360. Da  das nur ein Vorwort ist, werde ich nur erklären, wie man die Parameter
  361. für die Befehle "CS" und "IS" vergibt.
  362. Der Befehl "CS" erzeugt die Werte im  Speicher  an  der  Adresse  oder  am
  363. Label,  das  angegeben  wird,  wenn  z.B. schon eine Tab mit 200 Werten am
  364. Label TABX besteht, und wir als Adresse "TABX" angeben, dann wird nach dem
  365. Assemblieren  eine  andere Tabelle zu 200 Bytes erstellen, dann wird diese
  366. letzte  beim  Ausführen  verwendet werden.  Wenn wir  aber  nochmal
  367. assemblieren, dann wird wieder die alte, orginale zum Vorschein kommen, da
  368. der Text (dc.b $xx,$xx...) ja nicht gelöscht wurde.  Um  eine  Tabelle  zu
  369. speichern kann sie über einer anderen mit gleichviel Werten erzeugt werden
  370. oder man kann einen sogenannten "Buffer" machen, also ein Stück  Speicher,
  371. der zum Erstellen und Abspeichern von Tabellen gewidmet ist.
  372. Machen wir ein praktisches Beispiel: Wir  wollen  eine  spezielle  Tabelle
  373. machen,  die 512 Bytes lang ist, und wir wollen sie auf Disk speichern, um
  374. sie dann mit dem Befehl incbin herinladen zu können:
  375.  
  376.  
  377. TABX: incbin "TABELLE1"
  378.  
  379. Um  so  eine  Tabelle  erzeugen  zu  können,  müssen wir zuerst eine leere
  380. Portion Speicher für die Tabelle schaffen. Sie muß 512 Bytes groß sein, um
  381. dann mit dem Befehl "CS" die Tabelle zu erstellen:
  382.  
  383. PLATZ:
  384.     dcb.b    512,0    ; 512 Byte auf NULL, dort kommt dann die Tabelle rein
  385. ENDEPLATZ:
  386.  
  387. Einmal assembliert werden wir eine Tabeller erzeugen und als Ziel
  388. "PLATZ" angeben:
  389.  
  390.  DEST> PLATZ
  391.  
  392. Und natürlich 512 Werte generieren, von der Größe eines BYTE:
  393.  
  394.  AMOUNT> 512
  395.  SIZE (B/W/L)> B
  396.  
  397. Nun haben  wir  512  Bytes,  die  die  Tabelle  ergeben,  von  PLATZ:  bis
  398. ENDEPLATZ:,  wir  müssen dieses Stück jetzt auf Disk abspeichern. Dazu hat
  399. der ASMONE den  Befehl  "WB"  (Write  Binary,  oder  "Schreibe  ein  Stück
  400. Speicher").  Um  unsere  TAB abzuspeichern müssen wir folgende Operationen
  401. machen:
  402.  
  403. 1) "WB" tippen und den Namen des File eingeben, z.B. "TABELLE1"
  404. 2) Bei der Frage BEG> (Begin, oder "ab wo?") PLATZ schreiben
  405. 3) Bei der Frage END> (Ende) ENDEPLATZ eingeben.
  406.  
  407. Das ist alles, nun haben wir einen File, der Tabelle1 heißt  und  den  wir
  408. später mit incbin herinholen können.
  409.  
  410. Der  Befehl  WB  kann  dazu  verwendet  werden,  ein jedes beliebige Stück
  411. Speicher abzuspeichern! Ihr könnt versuchen,  einen  Sprite  abzuspeichern
  412. und ihn dann mit dem INCBIN einbinden.
  413.  
  414. Die  andere  Methode  ist  das "IS", oder INSERT SINUS, also Sinus im Text
  415. einfügen. Damit wird die Tabelle direkt  in  Textformat  dc.b  im  Listing
  416. erzeugt. Sie kann bei kleinen Tabellen recht bequem sein.
  417.  
  418. Einfach  den  Cursor  dorthin  plazieren, wo wir die Tabelle haben wollen,
  419. z.B. unter  dem  Label  "TABX:",  ESC  drücken  um  zur  Kommandozeile  zu
  420. wechseln,  und  dann  die Tabelle mit "IS" anstatt mit "CS" erstellen. Die
  421. Prozedur und die Parameter sind die gleichen. Nochmals ESC drücken, um  un
  422. den  Editor  zurückzugelangen  und  ihr  werdet die Tabelle als dc.b unter
  423. TABX: vorfinden.
  424.  
  425. Aber sehen wir nun, wie wir eine SINTAB mit den Befehlen CS oder IS erstellen:
  426.  
  427.  
  428.  DEST> Zieladresse- oder Label, z.B.: DEST>tabx
  429.  BEG> Startwinkel (0-360) (es können auch Werte größer als 360 eing. werden)
  430.  END> Endwinkel (0-360)
  431.  AMOUNT> Anzahl der zu generierenden Werte (z.B.: 200, wie in diesem Listing)
  432.  AMPLITUDE> Amplitude, also höchster zu erreichender Wert
  433.  YOFFSET> Offset (Zahl, die dazugezählt werden soll, um alles nach "Oben"
  434.             zu versetzen)
  435.  SIZE (B/W/L)> Dimension der Werte (byte,word,long)
  436.  MULTIPLIER> "Multiplizieren" (Multipliziert die Amplitude)
  437.  HALF CORRECTION>Y/N    \ diese dienen zum "glätten" der Kurve,
  438.  ROUND CORRECTION>Y/N    / falls irgendwo Sprünge auftreten
  439.  
  440. Wer weiß, was ein Sinus und ein Cosinus ist, der versteht im Flug, was  zu
  441. tun  ist,  den  anderen  kann  ich sagen, daß BEG> und END> den Start bzw.
  442. Zielwinkel der Welle angeben, also die Form der Welle, ob  diese  steigend
  443. oder  fallend  beginnt.  Es  folgen  einige  Beispiele  mit  der Zeichnung
  444. daneben.
  445.  
  446. - Mit AMOUNT> gibt man an, wieviele Werte die Tabelle haben soll.
  447. - Mit AMPLITUDE definiert man die Amplitude der Welle, also welchen Maximal-
  448.   wert sie erreichen soll, oder Minimalwert, wenn die Kurve ins Negative
  449.   startet.
  450. - Mit YOFFSET entscheidet man, wieviel die ganze Kurve "gehoben" werden soll,
  451.   wieviel also zu jedem Wert der Tabelle addiert werden soll. Wenn eine Tab
  452.   z.B. aus 0,1,2,3,4,5,4,3,2,1,0 besteht, mit einem YOFFSET von 0, dann wird
  453.   durch ein YOFFSET von 10 die Tabelle so aussehen:
  454.  
  455.      10,11,12,13,14,15,14,13,12,11,10.
  456.  
  457.   Bei den Sprites haben wir z.B. den Fall, daß das X bei $40 startet und bei
  458.   $d8 ankommt, unser YOFFSET wird also $40 sein, um die eventuellen $00 in
  459.   $40 zu "verwandeln", die $01 in $41 usw.
  460. - Mit SIZE entscheiden wir, ob die Werte der Tabelle aus Byte, Word oder
  461.   Longword bestehen sollen. Die Spritekoordinaten werden in BYTE angegeben.
  462. - MULTIPLIER> ist ein Multiplikator der Amplitude, wenn man nichts multipliz.
  463.   will einfach 1 eingeben.
  464.  
  465. Nun  bleibt  noch  übrig, zu verstehen, wie die "Form der Welle" definiert
  466. wird, also das Wichtigste. Dafür können wir nur BEG> und  END>  verwenden,
  467. die sich auf den Start und den Endwinkel dieser Welle beziehen. Denen, die
  468. mit  Trigonometrie  nichts  gemeinsam  haben,  rate  ich,  sie  etwas    zu
  469. studieren.  Sie  ist  recht  wichtig,  vor allem bei den dreidimensionalen
  470. Routinen. Kurzum kann ich es so erklären: stellt  euch  den  Umfang  eines
  471. Kreises  mit  dem  Mittelpunkt  O  und  einem  beliebigen  Radius vor (Aus
  472. technischen Gründen ist der Kreis nicht rund...), der sich im  Mittelpunkt
  473. der  Achsen  X  und  Y befindet (0,0): (zeichnet euch diese Durchgänge auf
  474. Papier nach)
  475.  
  476.                |
  477.                | y
  478.                |
  479.               _L_
  480.              / | \    achse x
  481.         --------|--o--|---------»
  482.              \_L_/
  483.                |
  484.                |
  485.                |
  486.  
  487.  
  488. Nehmen wir nun an, dieser  Kreis  sei  eine  Uhr  mit  einem  Zeiger,  der
  489. rückwärts geht (ein blödes Beispiel!), der bei dieser Position startet:
  490.  
  491.                   90 grad
  492.                 _____
  493.                /     \
  494.               /      \
  495.              /       \
  496.         180 grad    (     O---» ) 0 grad
  497.              \       /
  498.               \      /
  499.                \_____/
  500.  
  501.              270 grad
  502.  
  503. (Denkt einfach, das sei ein Kreis!!!) Es ist praktisch 3  Uhr.  An  Stelle
  504. der Stunden haben wir hier die Grade, die vom Zeiger angezeigt werden, und
  505. das gegenüber der X-Achse. Um 12 Uhr z.B. ist er auf 90 Grad:
  506.  
  507.  
  508.                   90 grad
  509.                 _____
  510.                /  ^  \
  511.               /   |   \
  512.              /    |    \
  513.         180 grad    (     O     ) 0 grad
  514.              \       /
  515.               \      /
  516.                \_____/
  517.  
  518.              270 grad
  519.  
  520.  
  521. Und das sind 45 Grad:
  522.  
  523.  
  524.                   90 grad
  525.                 _____
  526.                /     \
  527.               /     / \
  528.              /     /   \
  529.         180 grad    (     O     ) 0 grad (oder 360, die komplette Runde)
  530.              \       /
  531.               \      /
  532.                \_____/
  533.  
  534.              270 grad
  535.  
  536.  
  537. Alles klar mit dieser dummen  Uhr,  die  rückwärts  läuft  und  statt  der
  538. Stunden  die  Grad  anzeigt?? Nun kommen wir zum Zusammenhang zwischen den
  539. BEG> und END> des Befehles "VS". Mit dieser Uhr können wir nun eine Studie
  540. anfertigen,  die uns den Verlauf des Sinus (oder des Cosinus, wieso nicht)
  541. angibt. Stellen wir uns vor,  wir  lassen  den  Zeiger  eine  volle  Runde
  542. drehen:  wenn  wir  in  einer  danebenstehenden  Grafik  den  Verlauf  der
  543. Zeigerspitze gegenüber der Y-Achse aufzeichnen, werden wir  bemerken,  daß
  544. sie bei 0 beginnt, bis zu einem Maximum ansteigt, das bei 90 Grad erreicht
  545. ist, wieder sinkt, bis es bei 180 Grad wieder den Nullpunkt  erreicht  hat
  546. und  weitersinkt  bis zu einem Minimum bei 270 Grad. Ab hier geht´s wieder
  547. aufwärts bis zum anfänglichen Nullpunkt bei 360 Grad  (der  Startposition,
  548. oder 0 Grad).
  549.  
  550.  
  551.  
  552.           90 grad 
  553.         _____
  554.        /     \
  555.       /      \
  556.      /       \
  557.  180 g.    (     O---» ) 0 grad     *-----------------------------------
  558.      \       /        0    90    180    270    360 (grad )
  559.       \      /
  560.        \_____/
  561.      270 grad 
  562.  
  563.  
  564.           90 grad 
  565.         _____
  566.        /     \     45 grad 
  567.       /    / \- - - - - - - - *
  568.      /     /   \         *
  569.  180 g.    (     O     ) 0 grad     *-------------------------------------
  570.      \       /        0    90    180    270    360 (grad )
  571.       \      /
  572.        \_____/
  573.      270 grad 
  574.  
  575.  
  576.           90 grad 
  577.         _____ _ _ _ _ _ _ _ _ _ _ _ *
  578.        /  ^  \              * 
  579.       /   |   \            *
  580.      /    |    \         *
  581.  180 g.    (     O     ) 0 grad     *-----------------------------------
  582.      \       /        0    90    180    270    360 (grad )
  583.       \      /
  584.        \_____/
  585.      270 grad 
  586.  
  587.  
  588.           90 grad 
  589.         _____                * *
  590.        /     \     135 grad     *     *
  591.       / \     \- - - - - - - - * - - - - *
  592.      /   \     \         *
  593.  180 g.    (     O     ) 0 grad     *-----------------------------------
  594.      \       /        0    90    180    270    360 (grad )
  595.       \      /
  596.        \_____/
  597.      270 grad 
  598.  
  599.  
  600.           90 grad 
  601.         _____                * *
  602.        /     \              *     *
  603.       /      \           *         *
  604.      /       \         *           *
  605.  180 g.    ( <---O     ) 0 grad     *---------------*---------------------
  606.      \       /        0    90    180    270    360 (grad )
  607.       \      /
  608.        \_____/
  609.      270 grad 
  610.  
  611.  
  612.           90 grad 
  613.         _____                * *
  614.        /     \              *     *
  615.       /      \           *         *
  616.      /       \         *           *
  617.  180 g.    (     O     ) 0 grad     *---------------*---------------------
  618.      \   /       /        0    90    180    270    360 (grad )
  619.       \ /      /- - - - - - - - - - - - - - - - -*
  620.        \_____/        225 grad 
  621.      270 grad 
  622.  
  623.  
  624.           90 grad 
  625.         _____                * *
  626.        /     \              *     *
  627.       /      \           *         *
  628.      /       \         *           *
  629.  180 g.    (     O     ) 0 grad     *---------------*---------------------
  630.      \    |       /        0    90    180    270    360 (grad )
  631.       \   |      /                   *
  632.        \__L__/                     *
  633.      270 grad  - - - - - - - - - - - - - - - - - - *
  634.  
  635.  
  636.           90 grad 
  637.         _____                * *
  638.        /     \              *     *
  639.       /      \           *         *
  640.      /       \         *           *
  641.  180 g.    (     O     ) 0 grad     *---------------*---------------------
  642.      \     \   /        0    90    180    270    360 (grad )
  643.       \    \ /- - - - - - - - - - - - - - - - * - - - - *
  644.        \_____/        315 grad          *       *
  645.      270 grad                        * *
  646.  
  647.  
  648.           90 grad 
  649.         _____                * *
  650.        /     \              *     *
  651.       /      \           *         *
  652.      /       \         *           *
  653.  180 g.    (     O---> ) 0 grad     *---------------*----------------*----
  654.      \        /        0    90    180    270    *360 (grad )
  655.       \      /                   *         *
  656.        \_____/        360 grad          *       *
  657.      270 grad                        * *
  658.  
  659.  
  660. Ich hoffe, mich klar genug ausgedrückt zu haben, vor allem für diejenigen,
  661. die  bei  Mathematik  gerade  auf Diät sind: um eine Kurve, die steigt und
  662. sinkt, braucht man nur als Anfangswinkel 0 und Endwinkel  180  eingeben!!!
  663. Für  eine  Kurve, die sinkt und steigt als BEG> 180 und END> 360 eingeben.
  664. So auch für alle anderen Kurven. Durch ändern der AMPLITUDE,  YOFFSET  und
  665. MULTIPLIER  macht  ihr  Kurven,  die  länger  oder  kürzer,  breiter  oder
  666. schmäler, höher oder niedriger sind. Es können auch Werte größer  als  360
  667. verwendet  werden,  um  die  Kurve  beim  "zweiten  Uhrendurchgang"  noch
  668. aufzuzeichnen, da die Funktion ja immer gleich ist:
  669.  
  670. /\/\/\/\/\/\/\/\/\/\/\.....
  671.  
  672. Machen wir einige Beispiele: (Unter der Zeichnung wird eine Anmerkung über die
  673.                   effektive Tabelle gemacht: 0,1,2,3...999,1000..
  674.                   oder dessen Inhalt)
  675.   EIN BEISPIEL VON SINUS:
  676.  
  677.                +     __
  678.   DEST>cosintabx       _ _ _/_ \_ _ _ _ _ _  = 512 words:
  679.   BEG>0                    \__/
  680.   END>360           -    0      360
  681.   AMOUNT>512    0,1,2,3...999,1000,999..3,2,0,-1,-2,-3..-1000,-999,...-2,-1,0
  682.   AMPLITUDE>1000
  683.   YOFFSET>0
  684.   SIZE (B/W/L)>W
  685.   MULTIPLIER>1
  686.  
  687.  
  688.   EIN BEISPIEL VON COSINUS:
  689.  
  690.                  +      _     _
  691.   DEST>cosintabx        _ _ _ _\_ _ /_ _ _ _  = 512 words:
  692.   BEG>90                \__/
  693.   END>360+90           -    90      450
  694.   AMOUNT>512    1000,999..3,2,0,-1,-2,-3..-1000,-999,...-2,-1,0,1,2...999,1000
  695.   AMPLITUDE>1000
  696.   YOFFSET>0
  697.   SIZE (B/W/L)>W
  698.   MULTIPLIER>1
  699.  
  700.  
  701. EIN WEITERES BEISPIEL:
  702.  
  703.                 +     ___
  704.   DEST>cosintabx       _ _ _/_ _\_ _ _ _  = 800 words:
  705.   BEG>0                    
  706.   END>180           -    0  180
  707.   AMOUNT>800        0,1,2,3,4,5...999,1000,999..3,2,1,0 (800 valori)
  708.   AMPLITUDE>1000
  709.   YOFFSET>0
  710.   SIZE (B/W/L)>W
  711.   MULTIPLIER>1
  712.  
  713.  
  714. EIN WEITERES BEISPIEL:          _
  715.                 +     / \
  716.   DEST>cosintabx       _ _ _/_ _\_ _ _ _  = 800 words:
  717.   BEG>0                    
  718.   END>180           -    0  180
  719.   AMOUNT>800        0,1,2,3,4,5...1999,2000,1999..3,2,1,0 (800 valori)
  720.   AMPLITUDE>1000
  721.   YOFFSET>0
  722.   SIZE (B/W/L)>W
  723.   MULTIPLIER>2    <--
  724.  
  725.  
  726. EIN WEITERES BEISPIEL:         _    _
  727.                 +      \    /
  728.   DEST>cosintabx        _ _ _ _\__/_ _ _ _  = 512 words:
  729.   BEG>90               
  730.   END>360+90           -    90      450
  731.   AMOUNT>512         2000,1999..3,2,0,1,2...1999,2000
  732.   AMPLITUDE>1000
  733.   YOFFSET>1000
  734.   SIZE (B/W/L)>W
  735.   MULTIPLIER>1
  736.  
  737.  
  738. LETZTES BEISPIEL:         _    _
  739.                 +      \    /
  740.   DEST>cosintabx        _ _ _ _\__/_ _ _ _  = 360 words:
  741.   BEG>90               
  742.   END>360+90           -    90      450
  743.   AMOUNT>360         304,303..3,2,0,1,2...303,304
  744.   AMPLITUDE>152
  745.   YOFFSET>152
  746.   SIZE (B/W/L)>W
  747.   MULTIPLIER>1
  748.   HALF CORRECTION>Y
  749.   ROUND CORRECTION>N
  750.  
  751.  
  752. Hier nun die Anleitung, wie ihr die Tabellen der vorigen Beispiele mit den
  753. Koordianten  XX  und  YY  ersetzen  könnt:  (Parameter  für das CS und der
  754. endgültigen Tabelle)
  755.  
  756. Für die X-Koordinaten, die von $40 bis $d8 gehen
  757.  
  758. ; DEST> tabx
  759. ; BEG> 0         ___ $d0
  760. ; END> 180        /   \40
  761. ; AMOUNT> 200
  762. ; AMPLITUDE> $d0-$40    ; $40,$41,$42...$ce,$cf,d0,$cf,$ce...$43,$41....
  763. ; YOFFSET> $40    ; die NULL wird in $40 verwandelt
  764. ; SIZE (B/W/L)> b
  765. ; MULTIPLIER> 1
  766.  
  767.     dc.b    $41,$43,$46,$48,$4A,$4C,$4F,$51,$53,$55,$58,$5A
  768.     dc.b    $5C,$5E,$61,$63,$65,$67,$69,$6B,$6E,$70,$72,$74
  769.     dc.b    $76,$78,$7A,$7C,$7E,$80,$82,$84,$86,$88,$8A,$8C
  770.     dc.b    $8E,$90,$92,$94,$96,$97,$99,$9B,$9D,$9E,$A0,$A2
  771.     dc.b    $A3,$A5,$A7,$A8,$AA,$AB,$AD,$AE,$B0,$B1,$B2,$B4
  772.     dc.b    $B5,$B6,$B8,$B9,$BA,$BB,$BD,$BE,$BF,$C0,$C1,$C2
  773.     dc.b    $C3,$C4,$C5,$C5,$C6,$C7,$C8,$C9,$C9,$CA,$CB,$CB
  774.     dc.b    $CC,$CC,$CD,$CD,$CE,$CE,$CE,$CF,$CF,$CF,$CF,$D0
  775.     dc.b    $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,$CF,$CF,$CF
  776.     dc.b    $CF,$CE,$CE,$CE,$CD,$CD,$CC,$CC,$CB,$CB,$CA,$C9
  777.     dc.b    $C9,$C8,$C7,$C6,$C5,$C5,$C4,$C3,$C2,$C1,$C0,$BF
  778.     dc.b    $BE,$BD,$BB,$BA,$B9,$B8,$B6,$B5,$B4,$B2,$B1,$B0
  779.     dc.b    $AE,$AD,$AB,$AA,$A8,$A7,$A5,$A3,$A2,$A0,$9E,$9D
  780.     dc.b    $9B,$99,$97,$96,$94,$92,$90,$8E,$8C,$8A,$88,$86
  781.     dc.b    $84,$82,$80,$7E,$7C,$7A,$78,$76,$74,$72,$70,$6E
  782.     dc.b    $6B,$69,$67,$65,$63,$61,$5E,$5C,$5A,$58,$55,$53
  783.     dc.b    $51,$4F,$4C,$4A,$48,$46,$43,$41
  784.  
  785. --    --    --    --    --    --    --    --    --    --
  786.  
  787. ; DEST> tabx            $d0
  788. ; BEG> 180        \____/  $40
  789. ; END> 360
  790. ; AMOUNT> 200
  791. ; AMPLITUDE> $d0-$40    ; $cf,$cd,$ca...$42,$41,$40,$41,$42...$ca,$cd,$cf
  792. ; YOFFSET> $d0    ; Kurve unter NULL! Also müssen wir $d0 dazuzählen
  793. ; SIZE (B/W/L)> b
  794. ; MULTIPLIER> 1
  795.  
  796.     dc.b    $CF,$CD,$CA,$C8,$C6,$C4,$C1,$BF,$BD,$BB,$B8,$B6
  797.     dc.b    $B4,$B2,$AF,$AD,$AB,$A9,$A7,$A5,$A2,$A0,$9E,$9C
  798.     dc.b    $9A,$98,$96,$94,$92,$90,$8E,$8C,$8A,$88,$86,$84
  799.     dc.b    $82,$80,$7E,$7C,$7A,$79,$77,$75,$73,$72,$70,$6E
  800.     dc.b    $6D,$6B,$69,$68,$66,$65,$63,$62,$60,$5F,$5E,$5C
  801.     dc.b    $5B,$5A,$58,$57,$56,$55,$53,$52,$51,$50,$4F,$4E
  802.     dc.b    $4D,$4C,$4B,$4B,$4A,$49,$48,$47,$47,$46,$45,$45
  803.     dc.b    $44,$44,$43,$43,$42,$42,$42,$41,$41,$41,$41,$40
  804.     dc.b    $40,$40,$40,$40,$40,$40,$40,$40,$40,$41,$41,$41
  805.     dc.b    $41,$42,$42,$42,$43,$43,$44,$44,$45,$45,$46,$47
  806.     dc.b    $47,$48,$49,$4A,$4B,$4B,$4C,$4D,$4E,$4F,$50,$51
  807.     dc.b    $52,$53,$55,$56,$57,$58,$5A,$5B,$5C,$5E,$5F,$60
  808.     dc.b    $62,$63,$65,$66,$68,$69,$6B,$6D,$6E,$70,$72,$73
  809.     dc.b    $75,$77,$79,$7A,$7C,$7E,$80,$82,$84,$86,$88,$8A
  810.     dc.b    $8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E,$A0,$A2
  811.     dc.b    $A5,$A7,$A9,$AB,$AD,$AF,$B2,$B4,$B6,$B8,$BB,$BD
  812.     dc.b    $BF,$C1,$C4,$C6,$C8,$CA,$CD,$CF
  813.  
  814. --    --    --    --    --    --    --    --    --    --
  815.  
  816. ;                        ___$d8
  817. ; DEST> tabx                       /   \ $d0-$40 ($90)
  818. ; BEG> 0              \___/     $48
  819. ; END> 360
  820. ; AMOUNT> 200
  821. ; AMPLITUDE> ($d0-$40)/2 ; Amplitude sowohl über als auch unter NULL, wir
  822.              ; müssen also Halbe-Halbe machen, Hälfte unten, Hälfte
  823.              ; oben. Also teilen wir die Amplitude durch zwei
  824. ; YOFFSET> $90        ; und verschieben alles nach Oben, um -72 in $48 zu
  825. ; SIZE (B/W/L)> b    ; verwandeln
  826. ; MULTIPLIER> 1
  827.  
  828.     dc.b    $91,$93,$96,$98,$9A,$9C,$9F,$A1,$A3,$A5,$A7,$A9
  829.     dc.b    $AC,$AE,$B0,$B2,$B4,$B6,$B8,$B9,$BB,$BD,$BF,$C0
  830.     dc.b    $C2,$C4,$C5,$C7,$C8,$CA,$CB,$CC,$CD,$CF,$D0,$D1
  831.     dc.b    $D2,$D3,$D3,$D4,$D5,$D5,$D6,$D7,$D7,$D7,$D8,$D8
  832.     dc.b    $D8,$D8,$D8,$D8,$D8,$D8,$D7,$D7,$D7,$D6,$D5,$D5
  833.     dc.b    $D4,$D3,$D3,$D2,$D1,$D0,$CF,$CD,$CC,$CB,$CA,$C8
  834.     dc.b    $C7,$C5,$C4,$C2,$C0,$BF,$BD,$BB,$B9,$B8,$B6,$B4
  835.     dc.b    $B2,$B0,$AE,$AC,$A9,$A7,$A5,$A3,$A1,$9F,$9C,$9A
  836.     dc.b    $98,$96,$93,$91,$8F,$8D,$8A,$88,$86,$84,$81,$7F
  837.     dc.b    $7D,$7B,$79,$77,$74,$72,$70,$6E,$6C,$6A,$68,$67
  838.     dc.b    $65,$63,$61,$60,$5E,$5C,$5B,$59,$58,$56,$55,$54
  839.     dc.b    $53,$51,$50,$4F,$4E,$4D,$4D,$4C,$4B,$4B,$4A,$49
  840.     dc.b    $49,$49,$48,$48,$48,$48,$48,$48,$48,$48,$49,$49
  841.     dc.b    $49,$4A,$4B,$4B,$4C,$4D,$4D,$4E,$4F,$50,$51,$53
  842.     dc.b    $54,$55,$56,$58,$59,$5B,$5C,$5E,$60,$61,$63,$65
  843.     dc.b    $67,$68,$6A,$6C,$6E,$70,$72,$74,$77,$79,$7B,$7D
  844.     dc.b    $7F,$81,$84,$86,$88,$8A,$8D,$8F
  845.  
  846. --    --    --    --    --    --    --    --    --    --
  847.  
  848.  TABELLE DER Y:
  849.  
  850. ; Zu Bemerken, daß die Y-Position, um den Sprite ins Videofenster zu bringen,
  851. ; zwischen $2c und $f2 liegen muß, in der Tat sind in der Tabelle keine Byte
  852. ; enthalten, die größer als $f2 oder kleiner als $2c sind.
  853.  
  854. ; DEST> taby            $f0 (d0)
  855. ; BEG> 180        \____/  $2c (40)
  856. ; END> 360
  857. ; AMOUNT> 200
  858. ; AMPLITUDE> $f0-$2c    ; $ef,$ed,$ea...$2c...$ea,$ed,$ef
  859. ; YOFFSET> $f0
  860. ; SIZE (B/W/L)> b
  861. ; MULTIPLIER> 1
  862.  
  863.     dc.b    $EE,$EB,$E8,$E5,$E2,$DF,$DC,$D9,$D6,$D3,$D0,$CD ; Rekord-
  864.     dc.b    $CA,$C7,$C4,$C1,$BE,$BB,$B8,$B5,$B2,$AF,$AC,$A9 ;
  865.     dc.b    $A6,$A4,$A1,$9E,$9B,$98,$96,$93,$90,$8E,$8B,$88 ; hochsprung!
  866.     dc.b    $86,$83,$81,$7E,$7C,$79,$77,$74,$72,$70,$6D,$6B
  867.     dc.b    $69,$66,$64,$62,$60,$5E,$5C,$5A,$58,$56,$54,$52
  868.     dc.b    $51,$4F,$4D,$4B,$4A,$48,$47,$45,$44,$42,$41,$3F
  869.     dc.b    $3E,$3D,$3C,$3A,$39,$38,$37,$36,$35,$34,$33,$33
  870.     dc.b    $32,$31,$30,$30,$2F,$2F,$2E,$2E,$2D,$2D,$2D,$2C
  871.     dc.b    $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2D,$2D,$2D
  872.     dc.b    $2E,$2E,$2F,$2F,$30,$30,$31,$32,$33,$33,$34,$35
  873.     dc.b    $36,$37,$38,$39,$3A,$3C,$3D,$3E,$3F,$41,$42,$44
  874.     dc.b    $45,$47,$48,$4A,$4B,$4D,$4F,$51,$52,$54,$56,$58
  875.     dc.b    $5A,$5C,$5E,$60,$62,$64,$66,$69,$6B,$6D,$70,$72
  876.     dc.b    $74,$77,$79,$7C,$7E,$81,$83,$86,$88,$8B,$8E,$90
  877.     dc.b    $93,$96,$98,$9B,$9E,$A1,$A4,$A6,$A9,$AC,$AF,$B2
  878.     dc.b    $B5,$B8,$BB,$BE,$C1,$C4,$C7,$CA,$CD,$D0,$D3,$D6
  879.     dc.b    $D9,$DC,$DF,$E2,$E5,$E8,$EB,$EE
  880.  
  881.  
  882. --    --    --    --    --    --    --    --    --    --
  883.  
  884.  
  885. ;                        ___ ($f0) $d8
  886. ; DEST> taby                       /   \ ($f0-$2c) $d0-$40 ($90)
  887. ; BEG> 0              \___/      ($2c) $48
  888. ; END> 360
  889. ; AMOUNT> 200
  890. ; AMPLITUDE> ($f0-$2c)/2 ;
  891. ; YOFFSET> $8e      ; wäre ein $f0-(($f0-$2c)/2)
  892. ; SIZE (B/W/L)> b
  893. ; MULTIPLIER> 1
  894.  
  895.     dc.b    $8E,$91,$94,$97,$9A,$9D,$A0,$A3,$A6,$A9,$AC,$AF
  896.     dc.b    $B2,$B4,$B7,$BA,$BD,$BF,$C2,$C5,$C7,$CA,$CC,$CE
  897.     dc.b    $D1,$D3,$D5,$D7,$D9,$DB,$DD,$DF,$E0,$E2,$E3,$E5
  898.     dc.b    $E6,$E7,$E9,$EA,$EB,$EC,$EC,$ED,$EE,$EE,$EF,$EF
  899.     dc.b    $EF,$EF,$F0,$EF,$EF,$EF,$EF,$EE,$EE,$ED,$EC,$EC
  900.     dc.b    $EB,$EA,$E9,$E7,$E6,$E5,$E3,$E2,$E0,$DF,$DD,$DB
  901.     dc.b    $D9,$D7,$D5,$D3,$D1,$CE,$CC,$CA,$C7,$C5,$C2,$BF
  902.     dc.b    $BD,$BA,$B7,$B4,$B2,$AF,$AC,$A9,$A6,$A3,$A0,$9D
  903.     dc.b    $9A,$97,$94,$91,$8E,$8B,$88,$85,$82,$7F,$7C,$79
  904.     dc.b    $76,$73,$70,$6D,$6A,$68,$65,$62,$5F,$5D,$5A,$57
  905.     dc.b    $55,$52,$50,$4E,$4B,$49,$47,$45,$43,$41,$3F,$3D
  906.     dc.b    $3C,$3A,$39,$37,$36,$35,$33,$32,$31,$30,$30,$2F
  907.     dc.b    $2E,$2E,$2D,$2D,$2D,$2D,$2C,$2D,$2D,$2D,$2D,$2E
  908.     dc.b    $2E,$2F,$30,$30,$31,$32,$33,$35,$36,$37,$39,$3A
  909.     dc.b    $3C,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4E,$50,$52
  910.     dc.b    $55,$57,$5A,$5D,$5F,$62,$65,$68,$6A,$6D,$70,$73
  911.     dc.b    $76,$79,$7C,$7F,$82,$85,$88,$8B,$8d
  912.  
  913. --    --    --    --    --    --    --    --    --    --
  914.  
  915. Da die Tabellen alle schon bereit sind, eingesetzt zu werden, versucht sie
  916. denen aus den Listings zu  ersetzen,  um  viele  verschiedene  Effekte  zu
  917. erzeugen.  Probiert  auch,  selbst eigene, andere zu machen, mit mehr 100,
  918. 120, 300 Werten statt 200. Damit könnt ihr unendlich viele Schußlinien für
  919. den Sprite berechnen.
  920.  
  921.