home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings3
/
listing7t1.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
9KB
|
257 lines
; Listing7t1.s Sterne
; In diesem Listing machen wir einen Sternenhimmel
; Mit einem Sprite, der 127 mal wiederverwendet wird!!!!
SECTION CipundCop,CODE
Anfang:
move.l 4.w,a6 ; Execbase
jsr -$78(a6) ; Disable
lea GfxName(PC),a1 ; Name lib
jsr -$198(a6) ; OpenLibrary
move.l d0,GfxBase
move.l d0,a6
move.l $26(a6),OldCop
MOVE.L #BITPLANE,d0
LEA BPLPOINTERS,A1
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
; Pointen auf die Sprites
MOVE.L #SPRITE,d0 ; Adresse des Sprite in d0
LEA SpritePointers,a1 ; Pointer in der Copperlist
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
move.l #COPPERLIST,$dff080 ; unsere COP
move.w d0,$dff088 ; START COP
move.w #0,$dff1fc ; NO AGA!
move.w #$c00,$dff106 ; NO AGA!
mouse:
cmpi.b #$ff,$dff006 ; Zeile 255?
bne.s mouse
bsr.s BewegeSterne ; diese Routine bewegt die Sterne
Warte:
cmpi.b #$ff,$dff006 ; Zeile 255?
beq.s Warte
btst #6,$bfe001 ; Maus gedrückt?
bne.s mouse
move.l OldCop(PC),$dff080 ; Pointen auf die SystemCOP
move.w d0,$dff088 ; starten die alte COP
move.l 4.w,a6
jsr -$7e(a6) ; Enable
move.l gfxbase(PC),a1
jsr -$19e(a6) ; Closelibrary
rts
; Dati
GfxName:
dc.b "graphics.library",0,0
GfxBase:
dc.l 0
OldCop:
dc.l 0
; Diese einfache Routine läßt den Sprite weitergehen, der die Sterne
; darstellt. Er agiert auf jedes HSTART mit dem STERNEN_LOOP
BewegeSterne:
lea Sprite,A0 ; a0 pointet auf den Sprite
STERNEN_LOOP:
CMPI.B #$f0,1(A0) ; hat der Stern den rechten Rand
; des Bildschirmes erreicht?
BNE.S nicht_Rand ; nicht, dann überspringe
MOVE.B #$30,1(A0) ; ja, setze den Stern nach links
nicht_Rand:
ADDQ.B #1,1(A0) ; versetze den Sprite um 2 Pixel
ADDQ.w #8,A0 ; nächster Stern
CMP.L #SpriteEnd,A0 ; haben wir das Ende erreicht?
BLO.S STERNEN_LOOP ; wenn nicht, wiederhol den Loop
RTS ; Ende Routine
SECTION GRAPHIC,DATA_C
COPPERLIST:
SpritePointers:
dc.w $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
dc.w $12a,0,$12c,0,$12e,0,$130,0,$132,0
dc.w $134,0,$136,0,$138,0,$13a,0,$13c,0
dc.w $13e,0
dc.w $8E,$2c81 ; DiwStrt
dc.w $90,$2cc1 ; DiwStop
dc.w $92,$38 ; DdfStart
dc.w $94,$d0 ; DdfStop
dc.w $102,0 ; BplCon1
dc.w $104,0 ; BplCon2
dc.w $108,0 ; Bpl1Mod
dc.w $10a,0 ; Bpl2Mod
; 5432109876543210
dc.w $100,%0001001000000000 ; Bit 12 an!! 1 Bitplane Lowres
BPLPOINTERS:
dc.w $e0,0,$e2,0 ;erstes Bitplane
dc.w $180,$000 ; Color0 ; Hintergrund Schwarz
dc.w $182,$123 ; Color1 ; Farbe 1 des Bitplane, die
; in diesem Fall leer ist,
; und deswegen nicht erscheint
; der Sprite verwendet nur eine Farbe, COLOR17
dc.w $1A2,$ddd ; COLOR17, - COLOR1 deso Sprite0 - weiß
dc.w $FFFF,$FFFE ; Ende der Copperlist
; - - - - - - -
; Wie ihr sehen könnt wurde dieser Sprite ganz schön oft wiederverwendet,
; um genau zu sein 127 Mal. Er besteht aus vielen Word-Kontrollpaaren, die
; von einem $1000,$0000 gefolgt werden, also den Daten, die einen einzelnen
; Stern ergeben. Die vertikalen Positionen gehen in Zweierschritten, es gibt
; also einen Stern alle zwei vertikalen Zeilen, bei einer immer anderen
; horizontalen Position. Die erste Wiederverwertung des Sprite ist
; $307a,$3100,$1000,$0000
; die zweite $3220,$3300,$1000,$0000
; und so weiter. Die verschiedenen VSTART gehen in Schritten zu 2, also $30,
; $32, $34, $36 ...
; Die HSTART sind zufällig positioniert ($7a, $20, $c0, $50,...)
; Die VSTOP befinden sich natürlich eine Zeile nach VSTART ($31, $33, $35,...),
; da die Sterne ja 1 Pixel hoch sind.
; Die Routine agiert bei jedem Fotogramm auf alle HSTART, und verstellt
; somit die Sterne nach vorne.
Sprite:
dc.w $307A,$3100,$1000,$0000,$3220,$3300,$1000,$0000
dc.w $34C0,$3500,$1000,$0000,$3650,$3700,$1000,$0000
dc.w $3842,$3900,$1000,$0000,$3A6D,$3B00,$1000,$0000
dc.w $3CA2,$3D00,$1000,$0000,$3E9C,$3F00,$1000,$0000
dc.w $40DA,$4100,$1000,$0000,$4243,$4300,$1000,$0000
dc.w $445A,$4500,$1000,$0000,$4615,$4700,$1000,$0000
dc.w $4845,$4900,$1000,$0000,$4A68,$4B00,$1000,$0000
dc.w $4CB8,$4D00,$1000,$0000,$4EB4,$4F00,$1000,$0000
dc.w $5082,$5100,$1000,$0000,$5292,$5300,$1000,$0000
dc.w $54D0,$5500,$1000,$0000,$56D3,$5700,$1000,$0000
dc.w $58F0,$5900,$1000,$0000,$5A6A,$5B00,$1000,$0000
dc.w $5CA5,$5D00,$1000,$0000,$5E46,$5F00,$1000,$0000
dc.w $606A,$6100,$1000,$0000,$62A0,$6300,$1000,$0000
dc.w $64D7,$6500,$1000,$0000,$667C,$6700,$1000,$0000
dc.w $68C4,$6900,$1000,$0000,$6AC0,$6B00,$1000,$0000
dc.w $6C4A,$6D00,$1000,$0000,$6EDA,$6F00,$1000,$0000
dc.w $70D7,$7100,$1000,$0000,$7243,$7300,$1000,$0000
dc.w $74A2,$7500,$1000,$0000,$7699,$7700,$1000,$0000
dc.w $7872,$7900,$1000,$0000,$7A77,$7B00,$1000,$0000
dc.w $7CC2,$7D00,$1000,$0000,$7E56,$7F00,$1000,$0000
dc.w $805A,$8100,$1000,$0000,$82CC,$8300,$1000,$0000
dc.w $848F,$8500,$1000,$0000,$8688,$8700,$1000,$0000
dc.w $88B9,$8900,$1000,$0000,$8AAF,$8B00,$1000,$0000
dc.w $8C48,$8D00,$1000,$0000,$8E68,$8F00,$1000,$0000
dc.w $90DF,$9100,$1000,$0000,$924F,$9300,$1000,$0000
dc.w $9424,$9500,$1000,$0000,$96D7,$9700,$1000,$0000
dc.w $9859,$9900,$1000,$0000,$9A4F,$9B00,$1000,$0000
dc.w $9C4A,$9D00,$1000,$0000,$9E5C,$9F00,$1000,$0000
dc.w $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
dc.w $A423,$A500,$1000,$0000,$A6FA,$A700,$1000,$0000
dc.w $A86C,$A900,$1000,$0000,$AA44,$AB00,$1000,$0000
dc.w $AC88,$AD00,$1000,$0000,$AE9A,$AF00,$1000,$0000
dc.w $B06C,$B100,$1000,$0000,$B2D4,$B300,$1000,$0000
dc.w $B42A,$B500,$1000,$0000,$B636,$B700,$1000,$0000
dc.w $B875,$B900,$1000,$0000,$BA89,$BB00,$1000,$0000
dc.w $BC45,$BD00,$1000,$0000,$BE24,$BF00,$1000,$0000
dc.w $C0A3,$C100,$1000,$0000,$C29D,$C300,$1000,$0000
dc.w $C43F,$C500,$1000,$0000,$C634,$C700,$1000,$0000
dc.w $C87C,$C900,$1000,$0000,$CA1D,$CB00,$1000,$0000
dc.w $CC6B,$CD00,$1000,$0000,$CEAC,$CF00,$1000,$0000
dc.w $D0CF,$D100,$1000,$0000,$D2FF,$D300,$1000,$0000
dc.w $D4A5,$D500,$1000,$0000,$D6D6,$D700,$1000,$0000
dc.w $D8EF,$D900,$1000,$0000,$DAE1,$DB00,$1000,$0000
dc.w $DCD9,$DD00,$1000,$0000,$DEA6,$DF00,$1000,$0000
dc.w $E055,$E100,$1000,$0000,$E237,$E300,$1000,$0000
dc.w $E47D,$E500,$1000,$0000,$E62E,$E700,$1000,$0000
dc.w $E8AF,$E900,$1000,$0000,$EA46,$EB00,$1000,$0000
dc.w $EC65,$ED00,$1000,$0000,$EE87,$EF00,$1000,$0000
dc.w $F0D4,$F100,$1000,$0000,$F2F5,$F300,$1000,$0000
dc.w $F4FA,$F500,$1000,$0000,$F62C,$F700,$1000,$0000
dc.w $F84D,$F900,$1000,$0000,$FAAC,$FB00,$1000,$0000
dc.w $FCB2,$FD00,$1000,$0000,$FE9A,$FF00,$1000,$0000
dc.w $009A,$0106,$1000,$0000,$02DF,$0306,$1000,$0000
dc.w $0446,$0506,$1000,$0000,$0688,$0706,$1000,$0000
dc.w $0899,$0906,$1000,$0000,$0ADD,$0B06,$1000,$0000
dc.w $0CEE,$0D06,$1000,$0000,$0EFF,$0F06,$1000,$0000
dc.w $10CD,$1106,$1000,$0000,$1267,$1306,$1000,$0000
dc.w $1443,$1506,$1000,$0000,$1664,$1706,$1000,$0000
dc.w $1823,$1906,$1000,$0000,$1A6D,$1B06,$1000,$0000
dc.w $1C4F,$1D06,$1000,$0000,$1E5F,$1F06,$1000,$0000
dc.w $2055,$2106,$1000,$0000,$2267,$2306,$1000,$0000
dc.w $2445,$2506,$1000,$0000,$2623,$2706,$1000,$0000
dc.w $2834,$2906,$1000,$0000,$2AF0,$2B06,$1000,$0000
dc.w $2CBC,$2D06,$1000,$0000
SpriteEnd
dc.w $0000,$0000 ; Endlich ist der wiederverwertete Sprite fertig
SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
; müssen es verwenden, denn ohne Bitplane
; ist es nicht möglich, die Sprites
; zu aktivieren
BITPLANE:
ds.b 40*256 ; Bitplane auf 0 Lowres
end
In diesem Listing sehen wir einen klassischen Effekt des Amiga. Der
Sternenhimmel ist mittels einem einzigen Sprite erzeugt, der gut 127 mal
wiederverwendet wird, jedesmal auf einer anderen Höhe. Jeder einzelne
Stern entspricht einer Wiederverwendung des Sprite. Ein Stern ist nur eine
Zeile hoch, und enthält nur ein farbiges Pixel, mit Farbe 17 (also seinem
ersten "Plane" auf 1 und dem zweiten auf 0). Die anderen Pixel sind alle
Transparent, sie haben also das "Plane" auf 0. Sehen wir uns an, wie ein
einzelner Stern aussieht, z.B. auf der vertikalne Position $a0:
dc.w $A046,$A100,$1000,$0000
Ihr seht, VSTART=$a0, VSTOP=$a1, HSTART=$46. Ein Stern verbraucht 4 Word
Speicher, also 8 Byte.
Wie ihr seht, unterscheiden sich VSTART und VSTOP um 1, das bedeutet daß
der Sprite nur eine einzige Zeile einnimmt. Die zwei Word $1000 und $000
sind die zwei Planes, die die Formdaten der ersten und einzigen Zeile des
Sprite enthalten. Nachdem der Sprite auf Position $a0 angezeigt wurde,
wird er wiederverwendet, um auf vertikaler Position $a2 zu erscheinen.
Schauen wir, wie die Daten beider Sterne aussehen:
dc.w $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
Man bemerkt, daß der Stern auf vertikaler Position $a2 gleich gemacht ist
wie der Vorgänger. Der einzige Unterschied liegt in der vertikalen
Koordinate (natürlich auch in der horizontalen).
Nun sehen wir, wie die Routine BewegeSterne funktioniert. Die Routine
verändert die Position der Sterne, einen nach dem anderen, beginnend beim
Ersten. Zur Änderung der Position wird 1 zu HSTART des Sprite dazugezählt.
Wie ihr gut wißt, wird damit der Sprite um 2 Pixel verschoben, da das
niederwertige Bit von HSTART im vierten Kontrollword liegt. Wir sehen im
nächsten Beispiel, wie wir dieses Limit aufheben können. Da ein Stern im
Speicher 8 Bytes verbraucht, wird jedesmal 8 zur Adresse dazugezählt, um
auf den nächsten Stern zu pointen. Wenn der Pointer den letzten Stern
erreicht hat, ist die Routine beendet.