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

  1.  
  2. ; Listing7l.s    VERITKALER SCROLL EINES SPRITE UNTER DIE ZEILE $FF
  3.  
  4.  
  5.         SECTION CiriCop,CODE
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Libname
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; speichern die alte COP
  15.  
  16. ;    Pointen auf das "leere" PIC
  17.  
  18.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  19.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  20.     move.w    d0,6(a1)
  21.     swap    d0
  22.     move.w    d0,2(a1)
  23.  
  24. ;    Pointen auf den Sprite
  25.  
  26.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  27.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  28.     move.w    d0,6(a1)
  29.     swap    d0
  30.     move.w    d0,2(a1)
  31.  
  32.     move.l    #COPPERLIST,$dff080    ; unsere COP
  33.     move.w    d0,$dff088        ; START COP
  34.     move.w    #0,$dff1fc        ; NO AGA!
  35.     move.w    #$c00,$dff106
  36.  
  37. mouse:
  38.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  39.     bne.s    mouse
  40.  
  41.  
  42.     btst    #2,$dff016
  43.     beq.s    Warte
  44.     bsr.w    BewegeSpriteY    ; Bewege Sprite 0 vertikal (über $FF)
  45.  
  46. Warte:
  47.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  48.     beq.s    Warte
  49.  
  50.     btst    #6,$bfe001    ; Mouse gedrückt?
  51.     bne.s    mouse
  52.  
  53.  
  54.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  55.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  56.  
  57.     move.l    4.w,a6
  58.     jsr    -$7e(a6)    ; Enable
  59.     move.l    gfxbase(PC),a1
  60.     jsr    -$19e(a6)    ; Closelibrary
  61.     rts
  62.  
  63. ;    Daten
  64.  
  65. GfxName:
  66.     dc.b    "graphics.library",0,0
  67.  
  68. GfxBase:
  69.     dc.l    0
  70.  
  71. OldCop:
  72.     dc.l    0
  73.  
  74.  
  75. ; Diese Routine bewegt den Sprite nach Oben und Unten, indem sie auf die
  76. ; Byte VSTART und VSTOP zugreift. Weiters auch noch auf die hochwertigen
  77. ; Bit der VSTART/VSTOP-Koordinaten, um die Position des Sprites auch unterhalb
  78. ; der Zeile $Ff zu erlauben. Die Koordinaten müssen hier als BYTES vorliegen,
  79. ; also von $00 bis $FF, um innerhalb des normalen Screens zu bleiben (der
  80. ; Offset von $2c wird von der Routine dazugezählt), oder man kann auch darüber
  81. ; hinausgehen, wenn man den Sprite in Overscan-Screens bis an die Grenzen der
  82. ; Hardware gehen lassen will.
  83.  
  84.  
  85. BewegeSpriteY:
  86.     ADDQ.L    #2,TABYPOINT     ; Point auf das nächste Byte
  87.     MOVE.L    TABYPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  88.                  ; wird in a0 kopiert
  89.     CMP.L    #ENDETABY-2,A0     ; Sind wir beim letzten Longword der TAB?
  90.     BNE.S    NOBSTARTY     ; noch nicht? dann weiter
  91.     MOVE.L    #TABY-2,TABYPOINT ; Starte wieder beim ersten Byte (-1)
  92. NOBSTARTY:
  93.     moveq    #0,d0        ; Lösche d0
  94.     MOVE.w    (A0),d0        ; kopiere das Byte aus der Tabelle in d0
  95.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  96.     MOVE.b    d0,VSTART    ; kopiere das Byte in VSTART VSTART
  97.     btst.l    #8,D0        ; Zähle die Länge des Sprite dazu,
  98.                 ; um die Endposition zu errechnen (VSTOP)
  99.     beq.s    NichtVSTARTSet
  100.     bset.b    #2,MEINSPRITE+3    ; Setzt Bit 8 von VSTART (Zahl > $FF) auf 1
  101.     bra.s    ToVSTOP
  102. NichtVSTARTSet:
  103.     bclr.b    #2,MEINSPRITE+3    ; Löscht Bit 8 von VSTART (Zahl < $FF)
  104. ToVSTOP:
  105.     ADD.w    #13,D0        ; Zählt die Länge des Sprite dazu, um die
  106.                 ; Endposition des Sprites zu errechnen (VSTOP)
  107.     move.b    d0,VSTOP    ; Gib den richtigen Wert (Bits 0-7) in VSTOP
  108.     btst.l    #8,d0        ; Ist die Position größer als 255? ($FF)
  109.     beq.s    NichtVSTOPSet
  110.     bset.b    #1,MEINSPRITE+3    ; Setzt Bit 8 von VSTOP (Zahl > $FF) auf 1
  111.     bra.w    VstopFIN
  112. NichtVSTOPSet:
  113.     bclr.b    #1,MEINSPRITE+3    ; Löscht Bit 8 von VSTOP (Zahl < $FF)
  114. VstopFIN:
  115.     rts
  116.  
  117. TABYPOINT:
  118.     dc.l    TABY-2    ; BEMERKE: Die Werte in der Tabelle sind hier
  119.             ; Bytes, wir arbeiten also mit einem ADDQ.L #1,
  120.             ; TABYPOINT, und nicht #2 wie bei den Words
  121.             ; oder #4 bei den Longwords.
  122.  
  123.  
  124. ; Tabelle mit vorausberechneten Y-Koordinaten für den Sprite.
  125. ; Zu beachten ist, daß die Y-Koordinate des Sprites zwischen $0 und $ff liegen
  126. ; muß, wenn er ins Videofenster passen soll. Den Offset von $2c zählt die
  127. ; Routine dazu. Wenn keine Overscan-Modi verwendet werden, also nicht länger
  128. ; als 255 Zeilen, dann kann eine Tabelle mit dc.b-Werten verwendet werden
  129. ; ($00-$ff)
  130.  
  131.  
  132. ; Wie man sich eine Tabelle macht:
  133.  
  134. ; BEG> 0
  135. ; END> 360
  136. ; AMOUNT> 200
  137. ; AMPLITUDE> $f0/2
  138. ; YOFFSET> $f0/2
  139. ; SIZE (B/W/L)> b
  140. ; MULTIPLIER> 1
  141.  
  142.  
  143. TABY:
  144.     DC.W    $7A,$7E,$81,$85,$89,$8D,$90,$94,$98,$9B,$9F,$A2,$A6,$A9,$AD
  145.     DC.W    $B0,$B3,$B7,$BA,$BD,$C0,$C3,$C6,$C9,$CC,$CE,$D1,$D3,$D6,$D8
  146.     DC.W    $DA,$DC,$DE,$E0,$E2,$E4,$E5,$E7,$E8,$EA,$EB,$EC,$ED,$EE,$EE
  147.     DC.W    $EF,$EF,$F0,$F0,$F0,$F0,$F0,$F0,$EF,$EF,$EE,$EE,$ED,$EC,$EB
  148.     DC.W    $EA,$E8,$E7,$E5,$E4,$E2,$E0,$DE,$DC,$DA,$D8,$D6,$D3,$D1,$CE
  149.     DC.W    $CC,$C9,$C6,$C3,$C0,$BD,$BA,$B7,$B3,$B0,$AD,$A9,$A6,$A2,$9F
  150.     DC.W    $9B,$98,$94,$90,$8D,$89,$85,$81,$7E,$7A,$76,$72,$6F,$6B,$67
  151.     DC.W    $63,$60,$5C,$58,$55,$51,$4E,$4A,$47,$43,$40,$3D,$39,$36,$33
  152.     DC.W    $30,$2D,$2A,$27,$24,$22,$1F,$1D,$1A,$18,$16,$14,$12,$10,$0E
  153.     DC.W    $0C,$0B,$09,$08,$06,$05,$04,$03,$02,$02,$01,$01,$00,$00,$00
  154.     DC.W    $00,$00,$00,$01,$01,$02,$02,$03,$04,$05,$06,$08,$09,$0B,$0C
  155.     DC.W    $0E,$10,$12,$14,$16,$18,$1A,$1D,$1F,$22,$24,$27,$2A,$2D,$30
  156.     DC.W    $33,$36,$39,$3D,$40,$43,$47,$4A,$4E,$51,$55,$58,$5C,$60,$63
  157.     DC.W    $67,$6B,$6F,$72,$76
  158. ENDETABY:
  159.  
  160.     SECTION GRAPHIC,DATA_C
  161.  
  162. COPPERLIST:
  163. SpritePointers:
  164.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  165.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  166.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  167.     dc.w    $13e,0
  168.  
  169.     dc.w    $8E,$2c81    ; DiwStrt
  170.     dc.w    $90,$2cc1    ; DiwStop
  171.     dc.w    $92,$38        ; DdfStart
  172.     dc.w    $94,$d0        ; DdfStop
  173.     dc.w    $102,0        ; BplCon1
  174.     dc.w    $104,0        ; BplCon2
  175.     dc.w    $108,0        ; Bpl1Mod
  176.     dc.w    $10a,0        ; Bpl2Mod
  177.  
  178.             ; 5432109876543210
  179.     dc.w    $100,%0001001000000000  ; Bit 12 an!! 1 Bitplane Lowres
  180.  
  181. BPLPOINTERS:
  182.     dc.w $e0,0,$e2,0    ;erstes  Bitplane
  183.  
  184.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  185.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  186.                         ; in diesem Fall leer ist,
  187.                         ; und deswegen nicht erscheint
  188.  
  189.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROT
  190.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  191.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GELB
  192.  
  193.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  194.  
  195.  
  196. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ********
  197.  
  198. MEINSPRITE:       ; Länge 13 Zeilen
  199. VSTART:
  200.     dc.b $50   ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  201. HSTART:
  202.     dc.b $90   ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  203. VSTOP:
  204.     dc.b $5d   ; $50+13=$5d    ; Vertikale Endposition des Sprite
  205.     dc.b $00
  206.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  207.  dc.w    %0000000000000000,%0000011001100000
  208.  dc.w    %0000000000000000,%0000001001000000
  209.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  210.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  211.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  212.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  213.  dc.w    %0000011111100000,%0000011111100000
  214.  dc.w    %0000011111100000,%0001111001111000
  215.  dc.w    %0000001111000000,%0011101111011100
  216.  dc.w    %0000000110000000,%0011000110001100
  217.  dc.w    %0000000000000000,%1111000000001111
  218.  dc.w    %0000000000000000,%1111000000001111
  219.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  220.  
  221.  
  222.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  223.                   ; müssen es verwenden, denn ohne Bitplane
  224.                   ; ist es nicht möglich, die Sprites
  225.                   ; zu aktivieren
  226. BITPLANE:
  227.     ds.b    40*256        ; Bitplane auf 0 Lowres
  228.  
  229.     end
  230.  
  231. Dieses Beispiel ist fast identisch mit dem aus Listing7d.s. In diesem hier
  232. kann  die  vertikale  Position  des  Sprite  aber über die Zeile $FF (255)
  233. hinausgehen. Ich erinnere euch daran, daß das Videofenster bei  Koordinate
  234. ($40,$2c) beginnt, die 255ste Zeile also der 211 entspricht (255-$2c=211).
  235. Wenn wir also unseren Sprite über den gesamten  Bildschirm  laufen  lassen
  236. wollen,  müssen  wir  die  mögliche,  erreichbare  Position  auf  299=$12b
  237. hinaufschrauben. Dieser Wert ist zu  groß,  um  in  einem  Byte  Platz  zu
  238. finden,  es  sind  9  Bit notwendig. Um die Anfangs-Y-Position festzulegen
  239. wird außer den 8 Bit des Bytes VSTART auch noch ein neuntes Bit verwendet,
  240. um  genau zu sein das Bit2 des Byte VHBITS, also dem vierten Kontrollbyte.
  241. Das gleiche gilt für die Endposition, nur wird hier das Bit 1  von  VHBITS
  242. verwendet.  In  der Tabelle hingegen sind die Werte als Words gespeichert.
  243. Die Routine, die die Koordinaten liest, schaut, ob der Wert größer ist als
  244. 255;  wenn  das  eintrifft,  dann  wird  das entsprechende Bit im Register
  245. VHBITS auf 1 gesetzt, ansonsten auf 0. Zu Be,erken ist, daß die  Kontrolle
  246. unabhängig  für  VSTART und VSTOP gemacht wird. Es kann nämlich passieren,
  247. daß ein Sprite bei einer Position beginnt, die kleiner ist  also  255  und
  248. mit  einer  größeren  endet.  In  diesem  Fall wird Bit 2 Von VHBITS auf 0
  249. gesetzt, Bit 1 hingegen auf 1.
  250.  
  251.  
  252.