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

  1.  
  2. ; Listing7i.s    HORIZONTALER SCROLL EINES SPRITES IN 1-PIXEL-SCHRITTEN, UND
  3. ;        NICHT MEHR IN 2-PIXEL-SCHRITTEN, WIE FRÜHER. DAMIT WIRKT DER
  4. ;        SCROLL NICHT MEHR SO RUCKELIG
  5.  
  6.     SECTION CipundCop,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Libname
  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. ;    Pointen auf den Sprite
  26.  
  27.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  28.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     move.l    #COPPERLIST,$dff080    ; unsere COP
  34.     move.w    d0,$dff088        ; START COP
  35.     move.w    #0,$dff1fc        ; NO AGA!
  36.     move.w    #$c00,$dff106
  37.  
  38. mouse:
  39.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  40.     bne.s    mouse
  41.  
  42.     bsr.s    BewegeSpriteX    ; Bewege den Sprite 0 horizontal (FLÜßIG)
  43.     bsr.w    BewegeSpriteY    ; Bewege den Sprite 0 vertikal
  44.  
  45. Warte:
  46.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  47.     beq.s    Warte
  48.  
  49.     btst    #6,$bfe001    ; Mouse gedrückt?
  50.     bne.s    mouse
  51.  
  52.  
  53.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  54.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  55.  
  56.     move.l    4.w,a6
  57.     jsr    -$7e(a6)    ; Enable
  58.     move.l    gfxbase(PC),a1
  59.     jsr    -$19e(a6)    ; Closelibrary
  60.     rts
  61.  
  62. ;    Daten
  63.  
  64. GfxName:
  65.     dc.b    "graphics.library",0,0
  66.  
  67. GfxBase:
  68.     dc.l    0
  69.  
  70. OldCop:
  71.     dc.l    0
  72.  
  73.  
  74. ; Diese Routine bewegt den Sprite horizontal, indem sie auf das Byte HSTART
  75. ; und das Bit 0 im vierten Kontrollbyte zugreift, also dem niederwertigen Bit
  76. ; von HSTART. Somit erfolgt ein horizontaler Scroll in Schritten zu einem Pixel
  77. ; anstatt 2, seine Bewegung ist schöner und das Ruckeln aus den vorigen
  78. ; Beispielen verschwindet.
  79. ; Die Routine, die die Koordinaten in HSTART+Bit verwandelt kann in
  80. ; allen Listings verwendet werden, die Sprites bewegen, es ist auch der
  81. ; Videooffset miteinbezogen (+$40*2, mit einem add.w #128,d0), damit können
  82. ; der Routine schon die realen Werte für einen Lowres-Screen übergeben werden.
  83. ; Mit einem 0 wird sich der Sprite ganz links positionieren, mit 160 in der
  84. ; Mitte und mit 320 ganz rechts.
  85.  
  86.  
  87. BewegeSpriteX:
  88.     ADDQ.L    #2,TABXPOINT     ; Pointe auf das nächste Word
  89.     MOVE.L    TABXPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  90.                  ; wird in a0 kopiert
  91.     CMP.L    #ENDETABX-2,A0     ; sind wir beim letzten Word der TAB?
  92.     BNE.S    NOBSTARTX     ; noch nicht? dann weiter
  93.     MOVE.L    #TABX-2,TABXPOINT ; beginne beim ersten Word-2
  94. NOBSTARTX:
  95.     moveq    #0,d0        ; löschen d0
  96.     MOVE.w    (A0),d0        ; setzen den Wert der Tabelle in d0
  97.     add.w    #128,D0        ; 128 - um den Sprite zu zentrieren.
  98.     btst    #0,D0        ; niederw. Bit der X-Koordinate auf 0?
  99.     beq.s    NiederBitNull
  100.     bset    #0,MEINSPRITE+3    ; setzen das niederw. Bit von HSTART
  101.     bra.s    PlaceCoords
  102.  
  103. NiederBitNull:
  104.     bclr    #0,MEINSPRITE+3    ; löschen il das niederw. Bit von HSTART
  105. PlaceCoords:
  106.     lsr.w    #1,D0        ; SHIFTEN, verschieben den Wert von HSTART um
  107.                 ; 1 Bit nach Rechts, um es in den Wert zu
  108.                 ; "verwandeln", der dann in HSTART kommt, also
  109.                 ; ohne dem niederwertigen Bit.
  110.     move.b    D0,HSTART    ; geben den Wert XX ins Byte HSTART
  111.     rts
  112.  
  113. TABXPOINT:
  114.     dc.l    TABX-2    ; Bemerke: die Werte in der Tabelle sind hier Word
  115.  
  116.  
  117. ; Tabelle mit vorausberechneten X-Koordinaten. Diese Tabelle enthält die REALEN
  118. ; Werte der Koordinaten auf dem Bildschirm, nicht die "halbierten" Werte für
  119. ; den ruckeligen Scroll zu 2 Pixel auf einmal, wie wir ihn bis jetzt gesehen
  120. ; haben.
  121. ; Da Werte bis über 256 möglich sind, wird die Größe eines Byte überschritten,
  122. ; deswegen ist die Tabelle aus Word zusammengesetzt, denn sie können diese
  123. ; Werte beinhalten.
  124. ; Die Routine "BewegeSpriteX" kümmert sich darum, die Word aus der
  125. ; Tabelle zu holen und sie in NIEDERWERTIGES BIT und HOCHWERTIGES BYTE
  126. ; zu unterteilen. Das niederwertige Bit dient zum flüssigen Scroll, da es die
  127. ; 2 Pixel ersetzt und Scrolls zu 1 Pixel ermöglicht.
  128. ; Zu Beachten ist, daß die X-Position des Sprites zwischen 0 und 320 liegen
  129. ; muß, wenn wir ihn ins Videofenster bekommen wollen, mit einem Offset von
  130. ; 128 ($40*2). Dieser wird von der Routine dazugefügt.
  131. ; Wir müssen uns auch erinnern, daß ein Sprite 16 Pixel breit ist, und sich
  132. ; seine X-Koordinate auf die linke Ecke bezieht. Wenn wir also Koordianten
  133. ; eingeben, die größer sind als 320-16, oder 304, dann wird der Sprite
  134. ; teilweise außerhalb des Bildschirmes liegen.
  135. ; In der Tabelle sind in der Tat nur Werte zwischen 0 und 320 enthalten.
  136.  
  137.  
  138. ; So erhält man die Tabelle:
  139.  
  140. ;                      ___304
  141. ; DEST> tabx                 /   \ 152 (304/2)
  142. ; BEG> 0            \___/      0
  143. ; END> 360
  144. ; AMOUNT> 150
  145. ; AMPLITUDE> 304/2  ; Amplotude sowohl über als auch unter NULL, also
  146.             ; müssen wir die Hälfte über NULL und die Hälfte darunter
  147.             ; haben, anders ausgedrückt die AMPLITUDE durch 2 teilen.
  148. ; YOFFSET> 304/2    ; dann alles hinaufschieben, um -152 in 0 zu verwandeln
  149. ; SIZE (B/W/L)> w
  150. ; MULTIPLIER> 1
  151.  
  152. TABX:
  153.     incbin    "xcoordinatok.tab"    ; 150 .W Werte
  154. ENDETABX:
  155.  
  156. ; Diese Routine bewegt den Sprite nach Oben und Unten, indem sie auf die Byte
  157. ; VSTART und VSTOP zugreift, also auf die Y-Position des Sprite.  Es werden
  158. ; schon vorausberechnete Werte eingegeben (aus Tabelle TABY)
  159.  
  160. BewegeSpriteY:
  161.     ADDQ.L    #1,TABYPOINT     ; Point auf das nächste Byte
  162.     MOVE.L    TABYPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  163.                  ; wird in a0 kopiert
  164.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Longword der TAB?
  165.     BNE.S    NOBSTARTY     ; noch nicht? dann weiter
  166.     MOVE.L    #TABY-1,TABYPOINT ; Starte wieder beim ersten Byte (-1)
  167. NOBSTARTY:
  168.     moveq    #0,d0        ; Lösche d0
  169.     MOVE.b    (A0),d0        ; kopiere das Byte aus der Tabelle in d0
  170.     MOVE.b    d0,VSTART    ; kopiere das Byte in VSTART VSTART
  171.     ADD.B    #13,D0        ; Zähle die Länge des Sprite dazu,
  172.                 ; um die Endposition zu errechnen (VSTOP)
  173.     move.b    d0,VSTOP    ; Setze den richtigen Wert in VSTOP
  174.     rts
  175.  
  176. TABYPOINT:
  177.     dc.l    TABY-1    ; BEMERKE: Die Werte in der Tabelle sind hier
  178.             ; Bytes, wir arbeiten also mit einem ADDQ.L #1,
  179.             ; TABYPOINT, und nicht #2 wie bei den Words
  180.             ; oder #4 bei den Longwords.
  181.  
  182.  
  183. ; Tabelle mit vorausberechneten Y-Koordinaten.
  184. ; Zu Bemerken, daß die Y-Position des Sprites zwischen $2c und $f2 liegen muß,
  185. ; wenn wir ihn in das Videofenster bekommen wollen. In der Tabelle sind alles
  186. ; Werte enthalten, die innerhalb dieses Limits liegen.
  187.  
  188. TABY:
  189.     dc.b    $8E,$91,$94,$97,$9A,$9D,$A0,$A3,$A6,$A9,$AC,$AF ; Wellen,
  190.     dc.b    $B2,$B4,$B7,$BA,$BD,$BF,$C2,$C5,$C7,$CA,$CC,$CE ; 200 Werte
  191.     dc.b    $D1,$D3,$D5,$D7,$D9,$DB,$DD,$DF,$E0,$E2,$E3,$E5
  192.     dc.b    $E6,$E7,$E9,$EA,$EB,$EC,$EC,$ED,$EE,$EE,$EF,$EF
  193.     dc.b    $EF,$EF,$F0,$EF,$EF,$EF,$EF,$EE,$EE,$ED,$EC,$EC
  194.     dc.b    $EB,$EA,$E9,$E7,$E6,$E5,$E3,$E2,$E0,$DF,$DD,$DB
  195.     dc.b    $D9,$D7,$D5,$D3,$D1,$CE,$CC,$CA,$C7,$C5,$C2,$BF
  196.     dc.b    $BD,$BA,$B7,$B4,$B2,$AF,$AC,$A9,$A6,$A3,$A0,$9D
  197.     dc.b    $9A,$97,$94,$91,$8E,$8B,$88,$85,$82,$7F,$7C,$79
  198.     dc.b    $76,$73,$70,$6D,$6A,$68,$65,$62,$5F,$5D,$5A,$57
  199.     dc.b    $55,$52,$50,$4E,$4B,$49,$47,$45,$43,$41,$3F,$3D
  200.     dc.b    $3C,$3A,$39,$37,$36,$35,$33,$32,$31,$30,$30,$2F
  201.     dc.b    $2E,$2E,$2D,$2D,$2D,$2D,$2C,$2D,$2D,$2D,$2D,$2E
  202.     dc.b    $2E,$2F,$30,$30,$31,$32,$33,$35,$36,$37,$39,$3A
  203.     dc.b    $3C,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4E,$50,$52
  204.     dc.b    $55,$57,$5A,$5D,$5F,$62,$65,$68,$6A,$6D,$70,$73
  205.     dc.b    $76,$79,$7C,$7F,$82,$85,$88,$8b
  206. ENDETABY:
  207.  
  208.  
  209.     SECTION GRAPHIC,DATA_C
  210.  
  211. COPPERLIST:
  212. SpritePointers:
  213.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  214.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  215.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  216.     dc.w    $13e,0
  217.  
  218.     dc.w    $8E,$2c81    ; DiwStrt
  219.     dc.w    $90,$2cc1    ; DiwStop
  220.     dc.w    $92,$38        ; DdfStart
  221.     dc.w    $94,$d0        ; DdfStop
  222.     dc.w    $102,0        ; BplCon1
  223.     dc.w    $104,0        ; BplCon2
  224.     dc.w    $108,0        ; Bpl1Mod
  225.     dc.w    $10a,0        ; Bpl2Mod
  226.  
  227.             ; 5432109876543210
  228.     dc.w    $100,%0001001000000000  ; Bit 12 an!! 1 Bitplane Lowres
  229.  
  230. BPLPOINTERS:
  231.     dc.w $e0,0,$e2,0    ;erstes  Bitplane
  232.  
  233.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  234.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  235.                         ; in diesem Fall leer ist,
  236.                         ; und deswegen nicht erscheint
  237.  
  238.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROT
  239.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  240.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GELB
  241.  
  242.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  243.  
  244.  
  245. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ********
  246.  
  247. MEINSPRITE:        ; Länge 13 Zeilen
  248. VSTART:
  249.     dc.b $50   ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  250. HSTART:
  251.     dc.b $90   ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  252. VSTOP:
  253.     dc.b $5d   ; $50+13=$5d    - Vertikale Endposition des Sprite
  254.     dc.b $00
  255.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  256.  dc.w    %0000000000000000,%0000011001100000
  257.  dc.w    %0000000000000000,%0000001001000000
  258.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  259.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  260.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  261.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  262.  dc.w    %0000011111100000,%0000011111100000
  263.  dc.w    %0000011111100000,%0001111001111000
  264.  dc.w    %0000001111000000,%0011101111011100
  265.  dc.w    %0000000110000000,%0011000110001100
  266.  dc.w    %0000000000000000,%1111000000001111
  267.  dc.w    %0000000000000000,%1111000000001111
  268.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  269.  
  270.  
  271.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  272.                   ; müssen es verwenden, denn ohne Bitplane
  273.                   ; ist es nicht möglich, die Sprites
  274.                   ; zu aktivieren
  275. BITPLANE:
  276.     ds.b    40*256      ; Bitplane auf 0 Lowres
  277.  
  278.     end
  279.