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

  1.  
  2. ; Listing7y5.s    - Landschaft aus 2 Sprites, die scrollt.
  3.  
  4. ;    Dieses Beispiel ist das gleiche wie das Vorige, nur scrollen
  5. ;    wir es hier auch noch.
  6.  
  7.  
  8.  
  9.     SECTION CipundCop,CODE
  10.  
  11. Anfang:
  12.     move.l    4.w,a6     ; Execbase
  13.     jsr    -$78(a6)    ; Disable
  14.     lea    GfxName(PC),a1    ; Name lib
  15.     jsr    -$198(a6)    ; OpenLibrary
  16.     move.l    d0,GfxBase
  17.     move.l    d0,a6
  18.     move.l    $26(a6),OldCop    ; speichern die alte COP
  19.  
  20. ;    Pointen auf das "leere" PIC
  21.  
  22.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  23.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.  
  28. ;    Wir pointen NICHT auf den Sprite !!!!!!!!!!!!!!!!!!!!
  29.  
  30.     move.l    #COPPERLIST,$dff080    ; unsere COP
  31.     move.w    d0,$dff088        ; START COP
  32.     move.w    #0,$dff1fc        ; NO AGA!
  33.     move.w    #$c00,$dff106        ; NO AGA!
  34.  
  35. mouse:
  36.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  37.     bne.s    mouse
  38.  
  39.     bsr.w    BewegeBerge    ; Läßt die Landschaft scrollen
  40.  
  41. Warte:
  42.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  43.     beq.s    Warte
  44.  
  45.     btst    #6,$bfe001    ; Mouse gedrückt?
  46.     bne.s    mouse
  47.  
  48.  
  49.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  50.     move.w    d0,$dff088        ; starten die alte SystemCOP
  51.  
  52.     move.l    4.w,a6
  53.     jsr    -$7e(a6)    ; Enable
  54.     move.l    gfxbase(PC),a1
  55.     jsr    -$19e(a6)    ; Closelibrary
  56.     rts
  57.  
  58. ;    Daten
  59.  
  60. GfxName:
  61.     dc.b    "graphics.library",0,0
  62.  
  63. GfxBase:
  64.     dc.l    0
  65.  
  66. OldCop:
  67.     dc.l    0
  68.  
  69.  
  70. ; Diese Routine bringt die Daten der Sprites zum scrollen, die die Berge
  71. ; bilden.
  72.  
  73. BewegeBerge:
  74.     moveq    #14-1,d0    ; Anzahl der Zeilen
  75.     lea    SpriteForm,a0    ; Adresse ersten Daten des Sprite
  76. LandLoop:
  77.  
  78. ; Läßt das Plane A der Sprites scrollen
  79.  
  80.     move.w    (a0),d1        ; liest Wert von spr6data
  81.     swap    d1        ; gibt ihn in das hochw. Word des Registers
  82.     move.w    8(a0),d1    ; liest Wert von spr7data
  83.  
  84.     ror.l    #1,d1        ; Läßt die Bit der Form des Sprites scrollen
  85.     move.w    d1,8(a0)    ; schreibt Wert    spr7data
  86.     swap    d1        ; vertauscht die Word des Registers
  87.     move.w    d1,(a0)        ; schreibt Wert    spr6data
  88.  
  89. ; Läßt das Plane B der Sprites scrollen
  90.  
  91.     move.w    4(a0),d1    ; liest Wert von spr6datb
  92.     swap    d1        ; gibt ihn in das hochw. Word des Registers
  93.     move.w    12(a0),d1    ; liest Wert von spr7datb
  94.  
  95.     ror.l    #1,d1        ; Läßt die Bit der Form des Sprites scrollen
  96.     move.w    d1,12(a0)    ; schreibt Wert    spr7datb
  97.     swap    d1        ; vertauscht die Word des Registers
  98.     move.w    d1,4(a0)    ; schreibt Wert    spr6datb
  99.  
  100.     add.w    #140,a0        ; nächste Zeile der Landschaft
  101.     dbra    d0,LandLoop
  102.  
  103.     rts
  104.  
  105.  
  106.  
  107.     SECTION GRAPHIC,DATA_C
  108.  
  109. COPPERLIST:
  110. SpritePointers:
  111.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  112.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  113.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  114.     dc.w    $13e,0
  115.  
  116.     dc.w    $8E,$2c81    ; DiwStrt
  117.     dc.w    $90,$2cc1    ; DiwStop
  118.     dc.w    $92,$38        ; DdfStart
  119.     dc.w    $94,$d0        ; DdfStop
  120.     dc.w    $102,0        ; BplCon1
  121.     dc.w    $104,0        ; BplCon2
  122.     dc.w    $108,0        ; Bpl1Mod
  123.     dc.w    $10a,0        ; Bpl2Mod
  124.  
  125.             ; 5432109876543210
  126.     dc.w    $100,%0001001000000000    ; Bit 12 an: 1 Bitplane Lowres
  127.  
  128. BPLPOINTERS:
  129.     dc.w $e0,0,$e2,0    ;erstes Bitplane
  130.  
  131.     dc.w    $180,$000    ; COLOR0    ; schwarzer Hintergrund
  132.     dc.w    $182,$123    ; COLOR1    ; COLOR1 des Bitplane, das
  133.                         ; in diesem Fall leer ist, und
  134.                         ; deswegen nicht erscheint.
  135.  
  136.  
  137.     dc.w    $01ba,$0fff        ; COLOR29
  138.     dc.w    $01bc,$0aaa        ; COLOR30
  139.     dc.w    $01be,$0753        ; COLOR31
  140.  
  141. ; Aus Bequemlichkeit verwenden wir Symbole. Ich erinnere euch, daß man ein
  142. ; Symbol (oder EQUATE) auf zwei Arten definieren kann: wie in diesem Fall,
  143. ; wo wir einfach ein = setzen, gefolgt vom Wert, den das Symbol haben soll,
  144. ; oder mit dem Schlüsselword EQU anstelle des =.
  145.  
  146. spr6pos        = $170
  147. spr6data    = $174
  148. spr6datb    = $176
  149. spr7pos        = $178
  150. spr7data    = $17c
  151. spr7datb    = $17e
  152.  
  153.  
  154. ; Zeile $50 - (Die Copperanweisungen für eine Zeile sind 140 Byte lang)
  155.  
  156.     dc.w    $5025,$fffe    ; Wait
  157.     dc.w    spr6data
  158. SpriteForm:            ; Ab dieser Label machen wir alle Offsets
  159.     dc.w    $0        ; um die anderen SPRxDATx zu erreichen
  160.     dc.w    spr6datb
  161.     dc.w    $0
  162.     dc.w    spr7data
  163.     dc.w    $f000
  164.     dc.w    spr7datb
  165.     dc.w    $0
  166.     dc.w    spr6pos,$40,spr7pos,$48,$504b,$fffe
  167.     dc.w    spr6pos,$50,spr7pos,$58,$505b,$fffe
  168.     dc.w    spr6pos,$60,spr7pos,$68,$506b,$fffe
  169.     dc.w    spr6pos,$70,spr7pos,$78,$507b,$fffe
  170.     dc.w    spr6pos,$80,spr7pos,$88,$508b,$fffe
  171.     dc.w    spr6pos,$90,spr7pos,$98,$509b,$fffe
  172.     dc.w    spr6pos,$a0,spr7pos,$a8,$50ab,$fffe
  173.     dc.w    spr6pos,$b0,spr7pos,$b8,$50bb,$fffe
  174.     dc.w    spr6pos,$c0,spr7pos,$c8,$50cb,$fffe
  175.     dc.w    spr6pos,$d0,spr7pos,$d8,$50db,$fffe
  176.  
  177. ; Zeile $51
  178.     dc.w    $5125,$fffe
  179.     dc.w    spr6data,$0001,spr6datb,$0000,spr7data,$b800,spr7datb,$4000
  180.     dc.w    spr6pos,$40,spr7pos,$48,$514b,$fffe
  181.     dc.w    spr6pos,$50,spr7pos,$58,$515b,$fffe
  182.     dc.w    spr6pos,$60,spr7pos,$68,$516b,$fffe
  183.     dc.w    spr6pos,$70,spr7pos,$78,$517b,$fffe
  184.     dc.w    spr6pos,$80,spr7pos,$88,$518b,$fffe
  185.     dc.w    spr6pos,$90,spr7pos,$98,$519b,$fffe
  186.     dc.w    spr6pos,$a0,spr7pos,$a8,$51ab,$fffe
  187.     dc.w    spr6pos,$b0,spr7pos,$b8,$51bb,$fffe
  188.     dc.w    spr6pos,$c0,spr7pos,$c8,$51cb,$fffe
  189.     dc.w    spr6pos,$d0,spr7pos,$d8,$51db,$fffe
  190.  
  191. ; Zeile $52
  192.     dc.w    $5225,$fffe
  193.     dc.w    spr6data,$0003,spr6datb,$0000,spr7data,$bc00,spr7datb,$4000
  194.     dc.w    spr6pos,$40,spr7pos,$48,$524b,$fffe
  195.     dc.w    spr6pos,$50,spr7pos,$58,$525b,$fffe
  196.     dc.w    spr6pos,$60,spr7pos,$68,$526b,$fffe
  197.     dc.w    spr6pos,$70,spr7pos,$78,$527b,$fffe
  198.     dc.w    spr6pos,$80,spr7pos,$88,$528b,$fffe
  199.     dc.w    spr6pos,$90,spr7pos,$98,$529b,$fffe
  200.     dc.w    spr6pos,$a0,spr7pos,$a8,$52ab,$fffe
  201.     dc.w    spr6pos,$b0,spr7pos,$b8,$52bb,$fffe
  202.     dc.w    spr6pos,$c0,spr7pos,$c8,$52cb,$fffe
  203.     dc.w    spr6pos,$d0,spr7pos,$d8,$52db,$fffe
  204.  
  205. ; Zeile $53
  206.     dc.w    $5325,$fffe
  207.     dc.w    spr6data,$0002,spr6datb,$0001,spr7data,$ec00,spr7datb,$1200
  208.     dc.w    spr6pos,$40,spr7pos,$48,$534b,$fffe
  209.     dc.w    spr6pos,$50,spr7pos,$58,$535b,$fffe
  210.     dc.w    spr6pos,$60,spr7pos,$68,$536b,$fffe
  211.     dc.w    spr6pos,$70,spr7pos,$78,$537b,$fffe
  212.     dc.w    spr6pos,$80,spr7pos,$88,$538b,$fffe
  213.     dc.w    spr6pos,$90,spr7pos,$98,$539b,$fffe
  214.     dc.w    spr6pos,$a0,spr7pos,$a8,$53ab,$fffe
  215.     dc.w    spr6pos,$b0,spr7pos,$b8,$53bb,$fffe
  216.     dc.w    spr6pos,$c0,spr7pos,$c8,$53cb,$fffe
  217.     dc.w    spr6pos,$d0,spr7pos,$d8,$53db,$fffe
  218.  
  219. ; Zeile $54
  220.     dc.w    $5425,$fffe
  221.     dc.w    spr6data,$0007,spr6datb,$0000,spr7data,$2b00,spr7datb,$d400
  222.     dc.w    spr6pos,$40,spr7pos,$48,$544b,$fffe
  223.     dc.w    spr6pos,$50,spr7pos,$58,$545b,$fffe
  224.     dc.w    spr6pos,$60,spr7pos,$68,$546b,$fffe
  225.     dc.w    spr6pos,$70,spr7pos,$78,$547b,$fffe
  226.     dc.w    spr6pos,$80,spr7pos,$88,$548b,$fffe
  227.     dc.w    spr6pos,$90,spr7pos,$98,$549b,$fffe
  228.     dc.w    spr6pos,$a0,spr7pos,$a8,$54ab,$fffe
  229.     dc.w    spr6pos,$b0,spr7pos,$b8,$54bb,$fffe
  230.     dc.w    spr6pos,$c0,spr7pos,$c8,$54cb,$fffe
  231.     dc.w    spr6pos,$d0,spr7pos,$d8,$54db,$fffe
  232.  
  233. ; Zeile $55
  234.     dc.w    $5525,$fffe
  235.     dc.w    spr6data,$001c,spr6datb,$0003,spr7data,$e780,spr7datb,$1800
  236.     dc.w    spr6pos,$40,spr7pos,$48,$554b,$fffe
  237.     dc.w    spr6pos,$50,spr7pos,$58,$555b,$fffe
  238.     dc.w    spr6pos,$60,spr7pos,$68,$556b,$fffe
  239.     dc.w    spr6pos,$70,spr7pos,$78,$557b,$fffe
  240.     dc.w    spr6pos,$80,spr7pos,$88,$558b,$fffe
  241.     dc.w    spr6pos,$90,spr7pos,$98,$559b,$fffe
  242.     dc.w    spr6pos,$a0,spr7pos,$a8,$55ab,$fffe
  243.     dc.w    spr6pos,$b0,spr7pos,$b8,$55bb,$fffe
  244.     dc.w    spr6pos,$c0,spr7pos,$c8,$55cb,$fffe
  245.     dc.w    spr6pos,$d0,spr7pos,$d8,$55db,$fffe
  246.  
  247. ; Zeile $56
  248.     dc.w    $5625,$fffe
  249.     dc.w    spr6data,$803e,spr6datb,$0001,spr7data,$9ac1,spr7datb,$6500
  250.     dc.w    spr6pos,$40,spr7pos,$48,$564b,$fffe
  251.     dc.w    spr6pos,$50,spr7pos,$58,$565b,$fffe
  252.     dc.w    spr6pos,$60,spr7pos,$68,$566b,$fffe
  253.     dc.w    spr6pos,$70,spr7pos,$78,$567b,$fffe
  254.     dc.w    spr6pos,$80,spr7pos,$88,$568b,$fffe
  255.     dc.w    spr6pos,$90,spr7pos,$98,$569b,$fffe
  256.     dc.w    spr6pos,$a0,spr7pos,$a8,$56ab,$fffe
  257.     dc.w    spr6pos,$b0,spr7pos,$b8,$56bb,$fffe
  258.     dc.w    spr6pos,$c0,spr7pos,$c8,$56cb,$fffe
  259.     dc.w    spr6pos,$d0,spr7pos,$d8,$56db,$fffe
  260.  
  261. ; Zeile $57
  262.     dc.w    $5725,$fffe
  263.     dc.w    spr6data,$c079,spr6datb,$0006,spr7data,$b6e7,spr7datb,$4910
  264.     dc.w    spr6pos,$40,spr7pos,$48,$574b,$fffe
  265.     dc.w    spr6pos,$50,spr7pos,$58,$575b,$fffe
  266.     dc.w    spr6pos,$60,spr7pos,$68,$576b,$fffe
  267.     dc.w    spr6pos,$70,spr7pos,$78,$577b,$fffe
  268.     dc.w    spr6pos,$80,spr7pos,$88,$578b,$fffe
  269.     dc.w    spr6pos,$90,spr7pos,$98,$579b,$fffe
  270.     dc.w    spr6pos,$a0,spr7pos,$a8,$57ab,$fffe
  271.     dc.w    spr6pos,$b0,spr7pos,$b8,$57bb,$fffe
  272.     dc.w    spr6pos,$c0,spr7pos,$c8,$57cb,$fffe
  273.     dc.w    spr6pos,$d0,spr7pos,$d8,$57db,$fffe
  274.  
  275. ; Zeile $58
  276.     dc.w    $5825,$fffe
  277.     dc.w    spr6data,$c07f,spr6datb,$0048,spr7data,$fff6,spr7datb,$2009
  278.     dc.w    spr6pos,$40,spr7pos,$48,$584b,$fffe
  279.     dc.w    spr6pos,$50,spr7pos,$58,$585b,$fffe
  280.     dc.w    spr6pos,$60,spr7pos,$68,$586b,$fffe
  281.     dc.w    spr6pos,$70,spr7pos,$78,$587b,$fffe
  282.     dc.w    spr6pos,$80,spr7pos,$88,$588b,$fffe
  283.     dc.w    spr6pos,$90,spr7pos,$98,$589b,$fffe
  284.     dc.w    spr6pos,$a0,spr7pos,$a8,$58ab,$fffe
  285.     dc.w    spr6pos,$b0,spr7pos,$b8,$58bb,$fffe
  286.     dc.w    spr6pos,$c0,spr7pos,$c8,$58cb,$fffe
  287.     dc.w    spr6pos,$d0,spr7pos,$d8,$58db,$fffe
  288.  
  289. ; Zeile $59
  290.     dc.w    $5925,$fffe
  291.     dc.w    spr6data,$e06f,spr6datb,$0096,spr7data,$7eaf,spr7datb,$a150
  292.     dc.w    spr6pos,$40,spr7pos,$48,$594b,$fffe
  293.     dc.w    spr6pos,$50,spr7pos,$58,$595b,$fffe
  294.     dc.w    spr6pos,$60,spr7pos,$68,$596b,$fffe
  295.     dc.w    spr6pos,$70,spr7pos,$78,$597b,$fffe
  296.     dc.w    spr6pos,$80,spr7pos,$88,$598b,$fffe
  297.     dc.w    spr6pos,$90,spr7pos,$98,$599b,$fffe
  298.     dc.w    spr6pos,$a0,spr7pos,$a8,$59ab,$fffe
  299.     dc.w    spr6pos,$b0,spr7pos,$b8,$59bb,$fffe
  300.     dc.w    spr6pos,$c0,spr7pos,$c8,$59cb,$fffe
  301.     dc.w    spr6pos,$d0,spr7pos,$d8,$59db,$fffe
  302.  
  303. ; Zeile $5a
  304.     dc.w    $5a25,$fffe
  305.     dc.w    spr6data,$61ed,spr6datb,$9013,spr7data,$dfff,spr7datb,$6cab
  306.     dc.w    spr6pos,$40,spr7pos,$48,$5a4b,$fffe
  307.     dc.w    spr6pos,$50,spr7pos,$58,$5a5b,$fffe
  308.     dc.w    spr6pos,$60,spr7pos,$68,$5a6b,$fffe
  309.     dc.w    spr6pos,$70,spr7pos,$78,$5a7b,$fffe
  310.     dc.w    spr6pos,$80,spr7pos,$88,$5a8b,$fffe
  311.     dc.w    spr6pos,$90,spr7pos,$98,$5a9b,$fffe
  312.     dc.w    spr6pos,$a0,spr7pos,$a8,$5aab,$fffe
  313.     dc.w    spr6pos,$b0,spr7pos,$b8,$5abb,$fffe
  314.     dc.w    spr6pos,$c0,spr7pos,$c8,$5acb,$fffe
  315.     dc.w    spr6pos,$d0,spr7pos,$d8,$5adb,$fffe
  316.  
  317. ; Zeile $5b
  318.     dc.w    $5b25,$fffe
  319.     dc.w    spr6data,$db9f,spr6datb,$72ed,spr7data,$ffff,spr7datb,$dbee
  320.     dc.w    spr6pos,$40,spr7pos,$48,$5b4b,$fffe
  321.     dc.w    spr6pos,$50,spr7pos,$58,$5b5b,$fffe
  322.     dc.w    spr6pos,$60,spr7pos,$68,$5b6b,$fffe
  323.     dc.w    spr6pos,$70,spr7pos,$78,$5b7b,$fffe
  324.     dc.w    spr6pos,$80,spr7pos,$88,$5b8b,$fffe
  325.     dc.w    spr6pos,$90,spr7pos,$98,$5b9b,$fffe
  326.     dc.w    spr6pos,$a0,spr7pos,$a8,$5bab,$fffe
  327.     dc.w    spr6pos,$b0,spr7pos,$b8,$5bbb,$fffe
  328.     dc.w    spr6pos,$c0,spr7pos,$c8,$5bcb,$fffe
  329.     dc.w    spr6pos,$d0,spr7pos,$d8,$5bdb,$fffe
  330.  
  331. ; Zeile $5c
  332.     dc.w    $5c25,$fffe
  333.     dc.w    spr6data,$ffff,spr6datb,$cfbf,spr7data,$ffff,spr7datb,$ff3f
  334.     dc.w    spr6pos,$40,spr7pos,$48,$5c4b,$fffe
  335.     dc.w    spr6pos,$50,spr7pos,$58,$5c5b,$fffe
  336.     dc.w    spr6pos,$60,spr7pos,$68,$5c6b,$fffe
  337.     dc.w    spr6pos,$70,spr7pos,$78,$5c7b,$fffe
  338.     dc.w    spr6pos,$80,spr7pos,$88,$5c8b,$fffe
  339.     dc.w    spr6pos,$90,spr7pos,$98,$5c9b,$fffe
  340.     dc.w    spr6pos,$a0,spr7pos,$a8,$5cab,$fffe
  341.     dc.w    spr6pos,$b0,spr7pos,$b8,$5cbb,$fffe
  342.     dc.w    spr6pos,$c0,spr7pos,$c8,$5ccb,$fffe
  343.     dc.w    spr6pos,$d0,spr7pos,$d8,$5cdb,$fffe
  344.  
  345. ; Zeile $5d
  346.     dc.w    $5d25,$fffe
  347.     dc.w    spr6data,$ffff,spr6datb,$ffff,spr7data,$ffff,spr7datb,$feff
  348.     dc.w    spr6pos,$40,spr7pos,$48,$5d4b,$fffe
  349.     dc.w    spr6pos,$50,spr7pos,$58,$5d5b,$fffe
  350.     dc.w    spr6pos,$60,spr7pos,$68,$5d6b,$fffe
  351.     dc.w    spr6pos,$70,spr7pos,$78,$5d7b,$fffe
  352.     dc.w    spr6pos,$80,spr7pos,$88,$5d8b,$fffe
  353.     dc.w    spr6pos,$90,spr7pos,$98,$5d9b,$fffe
  354.     dc.w    spr6pos,$a0,spr7pos,$a8,$5dab,$fffe
  355.     dc.w    spr6pos,$b0,spr7pos,$b8,$5dbb,$fffe
  356.     dc.w    spr6pos,$c0,spr7pos,$c8,$5dcb,$fffe
  357.     dc.w    spr6pos,$d0,spr7pos,$d8,$5ddb,$fffe
  358.  
  359. ; Copperanweisung, um die Sprites zu deaktivieren
  360.  
  361.     dc.w    $5e07,$fffe        ; Warte Anfang der Zeile ab
  362.     dc.w    $172,0        ; spr6ctl
  363.     dc.w    $17a,0        ; spr7ctl
  364.  
  365.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  366.  
  367.     SECTION LEERESPLANE,BSS_C    ; Wir brauchen ein leeres Bitplane,
  368.                     ; denn ohne Bitplanes können wir
  369.                     ; keine Sprites anzeigen.
  370.  
  371. BITPLANE:
  372.     ds.b    40*256     ; leeres Bitplane Lowres
  373.  
  374.     end
  375.  
  376. In diesem Beispiel bringen wir die Landschaft aus  Sprites  zum  scrollen.
  377. Dazu  ist  die  Verwendung des Registers BPLCON1 nicht möglich, das wir ja
  378. verwendet hatten, um Bitplanes zu scollen, da dieses Register auf  Sprites
  379. keinen  Effekt  hat.  Um  die  Berge zum Rollen zu bringen müssen wir alle
  380. Pixel, aus denen sie bestehen, verstellen. Jetzt kommt es uns zurecht, daß
  381. die Berge alle gleich sind, daß sie sich also in der horizontalen Richtung
  382. wiederholen, und zwar alle 32 Pixel.
  383. Das Panorama besteht nämlich aus zwei Sprites, jeder zu 16 Pixel, die sich
  384. immerzu  wiederholen  und  für  die  gesamte Zeile gleich sind. Um nun die
  385. Landschaft zum Scrollen bringen brauchen wir nun nur die Pixel, aus  denen
  386. die  zwei Sprites bestehen, verschieben. Aber diese Pixel werden bei jeder
  387. Zeile neu in  die  Register  SPR6DATA,  SPR6DATB,  SPR7DATA  und  SPR7DATB
  388. geschrieben.  Also müssen wir den Inhalt dieser Register in der Copperlist
  389. verändern. An der Adresse SpriteForm in  der  Copperlist  finden  wir  den
  390. Wert,  der in SPR6DATA für die erste Zeile kommt. Jeweils 4,8 und 12 Bytes
  391. später die Werte der Register SPR6DATB, SPR7DATA und SPR7DATB,  immer  für
  392. die  erste  Zeile.  Wenn  wir  nun den Inhalt unserer Register in allen 14
  393. Zeilen scrollen lassen, dann haben wir unser Ziel erreicht.
  394.  
  395. Sehen wir nun, wie wir einen Scroll, z.B. nach Rechts, erzielen.
  396.  
  397. Wir kennen schon die Anweisung, die es  uns  erlaubt,  die  Bit  in  einer
  398. Speicherzelle  oder  einem Register zu verschieben. Es ist das LSR. Dieser
  399. Befehl läßt die Bit nach Rechts rutschen, und schiebt links  immer  Nullen
  400. nach. Zum Beispiel:
  401.  
  402.     move.b    #%00100101,d0
  403.     lsr.b    #3,d0
  404.  
  405. Nach dieser Anweisung wird in d0 der Wert %00000100 stehen. Das  geht  für
  406. uns  aber  nicht recht gut, denn die Nullen, die sich links einschmuggeln,
  407. produzieren dann ein "Loch" im Sprite, das immer größer wird, bis sie dann
  408. total verschwunden sind.
  409.  
  410. Was  wir  brauchen  ist  ein  Befehl,  der  zwar  die  Bit  nach  links
  411. hinausschubst, aber sie rechts wieder reinläßt. Der die  Bit  im  Register
  412. also  rotieren  läßt.  Diese  Anweisung  gibt´s,  sie  heißt  ROR ("ROtate
  413. Right"). Sehen wir gleich ein Beispiel:
  414.  
  415.  
  416.   move.b  #%00100101,d0
  417.   ror.b  #3,d0
  418.  
  419. Nach diesem Schritt wird in d0 der Wert %10100100 sein. Praktisch sind die
  420. drei  Bits  ganz  rechts  verdrängt  worden  und  dann  von  links  wieder
  421. hineingeschlüpft. Es könnte etwa so aussehen:
  422.  
  423. Bit:     7 6 5 4 3 2 1 0
  424.         -----------------
  425.         | | | | | | | | |
  426.         -----------------
  427.        ->   -->   -->   -->
  428.       |                     |   Laufrichtung
  429.         <--   <--   <--   <-
  430.  
  431. Die Routine "BewegeBerge"  verwendet  eine  ROR-Anweisung,  um  die  Pixel
  432. scrollen  zu lassen. Bemerkt, daß die Inhalte von SPR6DATA und SPR7DATA in
  433. das gleiche Register kommen und dann zusammen rotiert  werden,  sodaß  das
  434. Bit, das SPR6DATA von links verläßt, bei SPR7DATA rechts hineinkommen, und
  435. die  Bits,  die  bei  SPR7DATA  links  rausfallen  bei  SPR6DATA  rechts
  436. reinkommen.  Die  gleiche Operation wird auch für die Inhalte der Register
  437. SPR6DATB und SPR7DATB verrichtet, die stellen das zweite Plane des  Sprite
  438. dar.
  439.  
  440. Um  euch  besser vor Augen zu halten, wie der Unterschied zwischen dem LSR
  441. und ROR ist, versucht, das ROR mit dem LSR in  der  Routine  "BewegeBerge"
  442. auszutauschen.  Ihr  werdet  sehen,  daß  es  nicht genau das ist, was wir
  443. wollten!
  444.  
  445. Natürlich gibt es zum ROR ein Gegenstück, das alles nach links rollen lät,
  446. das  ROL  ("ROtate Left"). Es ist das gleiche wie das ROR, ihr könnt es in
  447. der Routine austauschen  und  somit  die  Berge  in  die  andere  Richtung
  448. schicken.
  449.  
  450. In  Theorie  könnte  man  mit  nur  zwei  Sprites  den gesamten Bildschirm
  451. ausfüllen, angefangen ganz oben, mit den Wolken, weiter herunten  mit  den
  452. Bergen,  die  Prärie  und  die  Bäume  im  Vordergrund.  Man  könnte  die
  453. verscheidenen "Levels" auch mit verschiedenen  Geschwindigkeiten  scrollen
  454. lassen, und so einen Parallax-Effekt erzeugen, also die Berge langsam, die
  455. Prärie mittelschnell und die Bäume schnell. Aber  das  würde  eine  enorme
  456. Copperlist  erfordern,  und die Scrollroutine wäre recht langsam, deswegen
  457. werden für solche Operationen  die  Bitplanes  bevorzugt.  Sie  sind  auch
  458. farbiger und eben schneller zu bewegen. Na ja, wenn sich nun jemand traut,
  459. zu sagen, der Amiga hat nur 8 kleine Sprites, dann könntet ihr  ihm  einen
  460. Bildschirm  zeigen,  der  nur aus 2 Sprites besteht, die sich in Parallaxe
  461. bewegen, darübergeblendet ein Bild in 4096 Farben in HAM, dann würden euch
  462. noch  6  Sprites  übrigbleiben,  um Sternchen und Raumschiffe zu zeichnen.
  463. Wenn ihr dann dazwischen noch ein  paar  hundert  BOB´s  mit  dem  Blitter
  464. rumdüsen  läßt...vielleicht  würde man nichts mehr verstehen, aber es wäre
  465. interessant!
  466.  
  467.