home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings3
/
listing7f.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
12KB
|
411 lines
; Listing7f.s ANZEIGEN ALLER 8 SPRITE DES AMIGA
; In diesem Listing wird gezeigt, daß alle 8 Sprites ihre Palette
; in Paaren gemeinsam haben, also Sprite 0 die gleiche wie Sprite1
; hat, Sprite 2 die gleichen Farben wie Sprite 3 und so weiter.
; Es wird auch gezeigt, wie die Prioritäten bei Überlagerungen
; verteilt sind, also daß der mit der kleineren Nummer über dem
; mit einer größeren Vorrang hat, also über diesem angezeigt wird.
; Sprite 0 wird also über allen anderen angezeigt, Sprite 7 hingegen
; kann von allen anderen überdeckt werden. Sprite 3 z.B. überdeckt
; die Sprites 4,5,6,7, wird aber selbst von 0,1 und 2 überdeckt.
; Durch Drücken der linken Maustaste Überlappen sich die Sprites
; und die Prioritäten sind gut erkennbar. Rechts Maustaste zum
; Aussteigen.
SECTION CipundCop,CODE
Anfang:
move.l 4.w,a6 ; Execbase
jsr -$78(a6) ; Disable
lea GfxName(PC),a1 ; Libname
jsr -$198(a6) ; OpenLibrary
move.l d0,GfxBase
move.l d0,a6
move.l $26(a6),OldCop ; speichern die alte COP
; Pointen auf das "leere" PIC
MOVE.L #BITPLANE,d0 ; wohin pointen
LEA BPLPOINTERS,A1 ; COP-Pointer
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
; Pointen auf die Sprite
MOVE.L #MEINSPRITE0,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 #MEINSPRITE1,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #MEINSPRITE2,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #MEINSPRITE3,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #MEINSPRITE4,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #MEINSPRITE5,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #MEINSPRITE6,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
MOVE.L #MEINSPRITE7,d0 ; Adresse des Sprite in d0
addq.w #8,a1 ; nächsten SPRITEPOINTERS
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:
btst #6,$bfe001 ; Mouse gedrückt?
bne.s mouse
MOVEQ #$60,d0 ; Anfangskoordinate HSTART
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
; (zu Bemerken, daß das Byte HSTART immer 2 Pixel
; nimmt, wenn wir uns also um 10 Pixel verstellen
; wollen müssen wir nur 5 zu HSTART dazuzählen!)
MOVE.B d0,HSTART1
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
MOVE.B d0,HSTART2
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
MOVE.B d0,HSTART3
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
MOVE.B d0,HSTART4
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
MOVE.B d0,HSTART5
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
MOVE.B d0,HSTART6
ADDQ.B #(10/2),d0 ; Abstand zum nächsten Sprite
MOVE.B d0,HSTART7
MouseRechts:
btst #2,$dff016
bne.s MouseRechts
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
; Daten
GfxName:
dc.b "graphics.library",0,0
GfxBase:
dc.l 0
OldCop:
dc.l 0
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 acceso!! 1 bitplane lowres
BPLPOINTERS:
dc.w $e0,0,$e2,0 ;primo bitplane
dc.w $180,$000 ; Color0 ; schwarzer Hintergrund
dc.w $182,$123 ; Color1 ; Color1 des Bitplane, das
; hier leer ist, es erscheint
; also nicht.
dc.w $1A2,$F00 ; Color17, - Color1 der Sprite0/1 -ROT
dc.w $1A4,$0F0 ; Color18, - Color2 der Sprite0/1 -GRÜN
dc.w $1A6,$FF0 ; Color19, - Color3 der Sprite0/1 -GELB
dc.w $1AA,$FFF ; Color21, - Color1 der Sprite2/3 -WEIß
dc.w $1AC,$0BD ; Color22, - Color2 der Sprite2/3 -WASSER
dc.w $1AE,$D50 ; Color23, - Color3 der Sprite2/3 -ORANGE
dc.w $1B2,$00F ; Color25, - Color1 der Sprite4/5 -BLAU
dc.w $1B4,$F0F ; Color26, - Color2 der Sprite4/5 -VIOLETT
dc.w $1B6,$BBB ; Color27, - Color3 der Sprite4/5 -GRAU
dc.w $1BA,$8E0 ; Color29, - Color1 der Sprite6/7 -HELLGRÜN
dc.w $1BC,$a70 ; Color30, - Color2 der Sprite6/7 -BRAUN
dc.w $1BE,$d00 ; Color31, - Color3 der Sprite6/7 -DUNKELROT
dc.w $FFFF,$FFFE ; Ende der Copperlist
; ************ Hier die Sprite: KLARERWEISE in CHIP RAM! ************
; Referenztabelle zur Definition der Farben:
; für die Sprite 0 und 1
; BINÄR 00=COLOR 0 (TRANSPARENT)
; BINÄR 10=COLOR 1 (ROT)
; BINÄR 01=COLOR 2 (GRÜN)
; BINÄR 11=COLOR 3 (GELB)
MEINSPRITE0: ; Länge: 13 Zeilen
VSTART0:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART0:
dc.b $60 ; Horizontale Pos. (von $40 bis $d8)
VSTOP0:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001110001111
dc.w %0011111111111100,%1100010001000011
dc.w %0111111111111110,%1000010001000001
dc.w %0111111111111110,%1000010001000001
dc.w %0011111111111100,%1100010001000011
dc.w %0000111111110000,%1111001110001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
MEINSPRITE1: ; Länge: 13 Zeilen
VSTART1:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART1:
dc.b $60+14 ; Horizontale Pos. (von $40 bis $d8)
VSTOP1:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000010001111
dc.w %0011111111111100,%1100000110000011
dc.w %0111111111111110,%1000000010000001
dc.w %0111111111111110,%1000000010000001
dc.w %0011111111111100,%1100000010000011
dc.w %0000111111110000,%1111000111001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
; für die Sprite 2 und 3
;BINÄR 00=COLOR 0 (TRANSPARENT)
;BINÄR 10=COLOR 1 (WEIß)
;BINÄR 01=COLOR 2 (WASSER)
;BINÄR 11=COLOR 3 (ORANGE)
MEINSPRITE2: ; Länge: 13 Zeilen
VSTART2:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART2:
dc.b $60+(14*2) ; Horizontale Pos. (von $40 bis $d8)
VSTOP2:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000111001111
dc.w %0011111111111100,%1100001000100011
dc.w %0111111111111110,%1000000000100001
dc.w %0111111111111110,%1000000111000001
dc.w %0011111111111100,%1100001000000011
dc.w %0000111111110000,%1111001111101111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
MEINSPRITE3: ; Länge: 13 Zeilen
VSTART3:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART3:
dc.b $60+(14*3) ; Horizontale Pos. (von $40 bis $d8)
VSTOP3:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001111101111
dc.w %0011111111111100,%1100000000100011
dc.w %0111111111111110,%1000000111100001
dc.w %0111111111111110,%1000000000100001
dc.w %0011111111111100,%1100000000100011
dc.w %0000111111110000,%1111001111101111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
; für die Sprite 4 und 5
;BINÄR 00=COLOR 0 (TRANSPARENT)
;BINÄR 10=COLOR 1 (BLAU)
;BINÄR 01=COLOR 2 (VIOLETT)
;BINÄR 11=COLOR 3 (GRAU)
MEINSPRITE4: ; Länge: 13 Zeilen
VSTART4:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART4:
dc.b $60+(14*4) ; Horizontale Pos. (von $40 bis $d8)
VSTOP4:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001001001111
dc.w %0011111111111100,%1100001001000011
dc.w %0111111111111110,%1000001111000001
dc.w %0111111111111110,%1000000001000001
dc.w %0011111111111100,%1100000001000011
dc.w %0000111111110000,%1111000001001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
MEINSPRITE5: ; Länge: 13 Zeilen
VSTART5:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART5:
dc.b $60+(14*5) ; Horizontale Pos. (von $40 bis $d8)
VSTOP5:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001111001111
dc.w %0011111111111100,%1100001000000011
dc.w %0111111111111110,%1000001111000001
dc.w %0111111111111110,%1000000001000001
dc.w %0011111111111100,%1100000001000011
dc.w %0000111111110000,%1111001111001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
; für die Sprite 6 und 7
;BINÄR 00=COLOR 0 (TRANSPARENT)
;BINÄR 10=COLOR 1 (HELLGRÜN)
;BINÄR 01=COLOR 2 (BRAUN)
;BINÄR 11=COLOR 3 (DUNKELROT)
MEINSPRITE6: ; Länge: 13 Zeilen
VSTART6:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART6:
dc.b $60+(14*6) ; Horizontale Pos. (von $40 bis $d8)
VSTOP6:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001111001111
dc.w %0011111111111100,%1100001000000011
dc.w %0111111111111110,%1000001111000001
dc.w %0111111111111110,%1000001001000001
dc.w %0011111111111100,%1100001001000011
dc.w %0000111111110000,%1111001111001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
MEINSPRITE7: ; Länge: 13 Zeilen
VSTART7:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART7:
dc.b $60+(14*7) ; Horizontale Pos. (von $40 bis $d8)
VSTOP7:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001111001111
dc.w %0011111111111100,%1100000001000011
dc.w %0111111111111110,%1000000001000001
dc.w %0111111111111110,%1000000001000001
dc.w %0011111111111100,%1100000001000011
dc.w %0000111111110000,%1111000001001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende des Sprite
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 werden alle 8 Sprites "gepointet", jeder von ihnen hat
die Nummer gezeichnet. Wie schon in der Theorie erklärt haben die 8
Sprites 4 separate Paletten, deswegen teilen sich immer zwei nebenstehende
Sprites eine Palette:
dc.w $1A2,$F00 ; Color17, - Color1 der Sprite0/1 -ROT
dc.w $1A4,$0F0 ; Color18, - Color2 der Sprite0/1 -GRÜN
dc.w $1A6,$FF0 ; Color19, - Color3 der Sprite0/1 -GELB
dc.w $1AA,$FFF ; Color21, - Color1 der Sprite2/3 -WEIß
dc.w $1AC,$0BD ; Color22, - Color2 der Sprite2/3 -WASSER
dc.w $1AE,$D50 ; Color23, - Color3 der Sprite2/3 -ORANGE
dc.w $1B2,$00F ; Color25, - Color1 der Sprite4/5 -BLAU
dc.w $1B4,$F0F ; Color26, - Color2 der Sprite4/5 -VIOLETT
dc.w $1B6,$BBB ; Color27, - Color3 der Sprite4/5 -GRAU
dc.w $1BA,$8E0 ; Color29, - Color1 der Sprite6/7 -HELLGRÜN
dc.w $1BC,$a70 ; Color30, - Color2 der Sprite6/7 -BRAUN
dc.w $1BE,$d00 ; Color31, - Color3 der Sprite6/7 -DUNKELROT
Zu Bemerken ist, daß die Farben 16, 20, 24 und 28 nicht von den Sprites
verwendet werden, sie werden übersprungen, da sie dem Color0 des Sprite
entsprechen würden, also dem TRANSPARENT, das eben keine Farbe ist,
sondern eher als "LOCH" aufgefasst werden kann. Er nimmt die Farbe des
darunterliegenden Bitplane (oder Sprite) an. Jeder Sprite hat sein VSTART,
VSTOP und HSTART, sehen wir z.B. Sprite2:
MEINSPRITE2: ; Länge: 13 Zeilen
VSTART2:
dc.b $60 ; Vertikale Pos. (von $2c bis $f2)
HSTART2:
dc.b $60+(14*2) ; Horizontale Pos. (von $40 bis $d8)
VSTOP2:
dc.b $68 ; $60+13=$6d ; Ende Vertikal
dc.b $00
Jeder Sprite ist von den anderen distanziert, indem wir zu HSTART ein
(14*x) dazugezählt haben. Nach dem linken Mausdruck werden alle HSTART
außer dem ersten geändert, um sie alle zu überlagern. Das Veranschaulicht
dann die Priotitäten.