home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings3
/
listing7s.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
15KB
|
566 lines
; Listing7s.s ANZEIGEN VON !& SPRITES
; In diesem Listing wird die Wiederverwendung der Sprite gezeigt.
; Mit der linken Maustaste ändern die Sprites Position.
; Rechte Taste zum Aussteigen.
SECTION CiriCop,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 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ächten 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ächten 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ächten 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ächten 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ächten 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ächten 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ächten SPRITEPOINTERS
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
; Spritepositionen
MOVE.B #$2C+50,VSTART0
MOVE.B #$2C+50+8,VSTOP0
MOVE.B #$2C+50,VSTART1
MOVE.B #$2C+50+8,VSTOP1
MOVE.B #$2C+50,VSTART2
MOVE.B #$2C+50+8,VSTOP2
MOVE.B #$2C+50,VSTART3
MOVE.B #$2C+50+8,VSTOP3
MOVE.B #$2C+50,VSTART4
MOVE.B #$2C+50+8,VSTOP4
MOVE.B #$2C+50,VSTART5
MOVE.B #$2C+50+8,VSTOP5
MOVE.B #$2C+50,VSTART6
MOVE.B #$2C+50+8,VSTOP6
MOVE.B #$2C+50,VSTART7
MOVE.B #$2C+50+8,VSTOP7
; hier beginnen die "wiederverwendeten" Sprites
MOVE.B #$2C+90,VSTART8
MOVE.B #$2C+90+8,VSTOP8
MOVE.B #$2C+90,VSTART9
MOVE.B #$2C+90+8,VSTOP9
MOVE.B #$2C+90,VSTART10
MOVE.B #$2C+90+8,VSTOP10
MOVE.B #$2C+90,VSTART11
MOVE.B #$2C+90+8,VSTOP11
MOVE.B #$2C+90,VSTART12
MOVE.B #$2C+90+8,VSTOP12
MOVE.B #$2C+90,VSTART13
MOVE.B #$2C+90+8,VSTOP13
MOVE.B #$2C+90,VSTART14
MOVE.B #$2C+90+8,VSTOP14
MOVE.B #$2C+90,VSTART15
MOVE.B #$2C+90+8,VSTOP15
move.l #COPPERLIST,$dff080 ; unsere COP
move.w d0,$dff088 ; START COP
move.w #0,$dff1fc ; NO AGA!
move.w #$c00,$dff106 ; NO AGA!
Mouse1:
btst #6,$bfe001 ; linke Maustaste gedrückt?
bne.s mouse1
; gibt neue vertikale Positionen ein
MOVE.B #$2C+10,VSTART0
MOVE.B #$2C+10+8,VSTOP0
MOVE.B #$2C+10+8*1,VSTART1
MOVE.B #$2C+10+8*1+8,VSTOP1
MOVE.B #$2C+10+8*2,VSTART2
MOVE.B #$2C+10+8*2+8,VSTOP2
MOVE.B #$2C+10+8*3,VSTART3
MOVE.B #$2C+10+8*3+8,VSTOP3
MOVE.B #$2C+10+8*4,VSTART4
MOVE.B #$2C+10+8*4+8,VSTOP4
MOVE.B #$2C+10+8*5,VSTART5
MOVE.B #$2C+10+8*5+8,VSTOP5
MOVE.B #$2C+10+8*6,VSTART6
MOVE.B #$2C+10+8*6+8,VSTOP6
MOVE.B #$2C+10+8*7,VSTART7
MOVE.B #$2C+10+8*7+8,VSTOP7
; hier beginnen die "wiederverwendeten" Sprites
MOVE.B #$2C+10+20,VSTART8
MOVE.B #$2C+10+20+8,VSTOP8
MOVE.B #$2C+10+20+8*1,VSTART9
MOVE.B #$2C+10+20+8*1+8,VSTOP9
MOVE.B #$2C+10+20+8*2,VSTART10
MOVE.B #$2C+10+20+8*2+8,VSTOP10
MOVE.B #$2C+10+20+8*3,VSTART11
MOVE.B #$2C+10+20+8*3+8,VSTOP11
MOVE.B #$2C+10+20+8*4,VSTART12
MOVE.B #$2C+10+20+8*4+8,VSTOP12
MOVE.B #$2C+10+20+8*5,VSTART13
MOVE.B #$2C+10+20+8*5+8,VSTOP13
MOVE.B #$2C+10+20+8*6,VSTART14
MOVE.B #$2C+10+20+8*6+8,VSTOP14
MOVE.B #$2C+10+20+8*7,VSTART15
MOVE.B #$2C+10+20+8*7+8,VSTOP15
Mouse2:
btst #2,$dff016
bne.s Mouse2
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
BPLPOINTERS:
dc.w $e0,0,$e2,0 ;erstes Bitplane
dc.w $180,$000 ; color0 ; schwarzer Hintergrund
dc.w $182,$123 ; color1 ; Color 1 des Bitplane, das
; in diesem Fall leer ist,
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:
; per gli sprite 0 ed 1
;BINARIO 00=COLORE 0 (TRASPARENTE)
;BINARIO 10=COLORE 1 (ROSSO)
;BINARIO 01=COLORE 2 (VERDE)
;BINARIO 11=COLORE 3 (GIALLO)
MEINSPRITE0: ; Länge13 Zeilen
VSTART0:
dc.b 0
HSTART0:
dc.b $40+12+0*20
VSTOP0:
dc.b $0
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
VSTART8:
dc.b $0
HSTART8:
dc.b $40+20+0*12
VSTOP8:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001110001111
dc.w %0011111111111100,%1100010001000011
dc.w %0111111111111110,%1000001110000001
dc.w %0111111111111110,%1000010001000001
dc.w %0011111111111100,%1100010001000011
dc.w %0000111111110000,%1111001110001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
MEINSPRITE1: ; Länge13 Zeilen
VSTART1:
dc.b $0
HSTART1:
dc.b $40+12+1*20
VSTOP1:
dc.b $0
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
VSTART9:
dc.b $0
HSTART9:
dc.b $40+20+1*12
VSTOP9:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111001110001111
dc.w %0011111111111100,%1100010001000011
dc.w %0111111111111110,%1000001110000001
dc.w %0111111111111110,%1000000001000001
dc.w %0011111111111100,%1100000001000011
dc.w %0000111111110000,%1111001110001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
; per gli sprite 2 e 3
;BINARIO 00=COLORE 0 (TRASPARENTE)
;BINARIO 10=COLORE 1 (BIANCO)
;BINARIO 01=COLORE 2 (ACQUA)
;BINARIO 11=COLORE 3 (ARANCIO)
MEINSPRITE2: ; Länge13 Zeilen
VSTART2:
dc.b $0
HSTART2:
dc.b $40+12+2*20
VSTOP2:
dc.b $0
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
VSTART10:
dc.b $0
HSTART10:
dc.b $40+20+2*12
VSTOP10:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000000001111
dc.w %0011111111111100,%1100010011100011
dc.w %0111111111111110,%1000110010100001
dc.w %0111111111111110,%1000010010100001
dc.w %0011111111111100,%1100111011100011
dc.w %0000111111110000,%1111000000001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
MEINSPRITE3: ; Länge13 Zeilen
VSTART3:
dc.b $0
HSTART3:
dc.b $40+12+3*20
VSTOP3:
dc.b 0
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
VSTART11:
dc.b $0
HSTART11:
dc.b $40+20+3*12
VSTOP11:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000000001111
dc.w %0011111111111100,%1100010001000011
dc.w %0111111111111110,%1000110011000001
dc.w %0111111111111110,%1000010001000001
dc.w %0011111111111100,%1100111011100011
dc.w %0000111111110000,%1111000000001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
; per gli sprite 4 e 5
;BINARIO 00=COLORE 0 (TRASPARENTE)
;BINARIO 10=COLORE 1 (BLU)
;BINARIO 01=COLORE 2 (VIOLA)
;BINARIO 11=COLORE 3 (GRIGIO)
MEINSPRITE4: ; Länge13 Zeilen
VSTART4:
dc.b $0
HSTART4:
dc.b $40+12+4*20
VSTOP4:
dc.b $0
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
VSTART12:
dc.b $0
HSTART12:
dc.b $40+20+4*12
VSTOP12:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000000001111
dc.w %0011111111111100,%1100010011000011
dc.w %0111111111111110,%1000110001000001
dc.w %0111111111111110,%1000010010000001
dc.w %0011111111111100,%1100111011100011
dc.w %0000111111110000,%1111000000001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
MEINSPRITE5: ; Länge13 Zeilen
VSTART5:
dc.b $0
HSTART5:
dc.b $40+12+5*20
VSTOP5:
dc.b $0
dc.b $0
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
VSTART13:
dc.b $0
HSTART13:
dc.b $40+20+5*12
VSTOP13:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000000001111
dc.w %0011111111111100,%1100010011100011
dc.w %0111111111111110,%1000110001100001
dc.w %0111111111111110,%1000010000100001
dc.w %0011111111111100,%1100111011000011
dc.w %0000111111110000,%1111000000001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
; per gli sprite 6 e 7
;BINARIO 00=COLORE 0 (TRASPARENTE)
;BINARIO 10=COLORE 1 (VERDE CHIARO)
;BINARIO 01=COLORE 2 (MARRONE)
;BINARIO 11=COLORE 3 (ROSSO SCURO)
MEINSPRITE6: ; Länge13 Zeilen
VSTART6:
dc.b $0
HSTART6:
dc.b $40+12+6*20
VSTOP6:
dc.b $0
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
VSTART14:
dc.b $0
HSTART14:
dc.b $40+20+6*12
VSTOP14:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000000001111
dc.w %0011111111111100,%1100010000100011
dc.w %0111111111111110,%1000110010100001
dc.w %0111111111111110,%1000010011100001
dc.w %0011111111111100,%1100111001000011
dc.w %0000111111110000,%1111000000001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; fine sprite
MEINSPRITE7: ; Länge13 Zeilen
VSTART7:
dc.b 0
HSTART7:
dc.b $40+12+7*20
VSTOP7:
dc.b $0
dc.b $0
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
VSTART15:
dc.b $0
HSTART15:
dc.b $40+20+7*12
VSTOP15:
dc.b $0
dc.b $00
dc.w %0000001111000000,%0111110000111110
dc.w %0000111111110000,%1111000000001111
dc.w %0011111111111100,%1100010011100011
dc.w %0111111111111110,%1000110011000001
dc.w %0111111111111110,%1000010000100001
dc.w %0011111111111100,%1100111011100011
dc.w %0000111111110000,%1111000000001111
dc.w %0000001111000000,%0111110000111110
dc.w 0,0 ; Ende 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 wird gezeigt, wie man die Sprites mehrmals auf dem
gleichen Screen wiederverwenden kann. Im Beispiel wird jeder Sprite zwei
Mal recycelt.
Der Sprite 0 wird wiederverwendet um Sprite 8 zu zeichnen.
Der Sprite 1 wird wiederverwendet um Sprite 9 zu zeichnen.
Der Sprite 2 wird wiederverwendet um Sprite 10 zu zeichnen.
Der Sprite 3 wird wiederverwendet um Sprite 11 zu zeichnen.
Der Sprite 4 wird wiederverwendet um Sprite 12 zu zeichnen.
Der Sprite 5 wird wiederverwendet um Sprite 13 zu zeichnen.
Der Sprite 6 wird wiederverwendet um Sprite 14 zu zeichnen.
Der Sprite 7 wird wiederverwendet um Sprite 15 zu zeichnen.
Bemerkt ihr, daß bei der Wiederverwendung eines Sprites, dieser am
Bildschrim TIEFER dargestellt wird, als es die letzte Zeile bei seiner
ersten Anzeige war? Das ist einem bestimmten Hardwarelimit zuzuschreiben.
Zwischen einer Verwendung und der nächtsten muß MINDESTENS eine leere
Zeile dazwischenliegen.
Das Byte VSTART des Sprite 8 muß GRÖßER sein als VSTOP des Sprite 0
Das Byte VSTART des Sprite 9 muß GRÖßER sein als VSTOP des Sprite 1
Das Byte VSTART des Sprite 10 muß GRÖßER sein als VSTOP des Sprite 2
Das Byte VSTART des Sprite 11 muß GRÖßER sein als VSTOP des Sprite 3
Das Byte VSTART des Sprite 12 muß GRÖßER sein als VSTOP des Sprite 4
Das Byte VSTART des Sprite 13 muß GRÖßER sein als VSTOP des Sprite 5
Das Byte VSTART des Sprite 14 muß GRÖßER sein als VSTOP des Sprite 6
Das Byte VSTART des Sprite 15 muß GRÖßER sein als VSTOP des Sprite 7
Die Wiederverwendung eines Sprite ändert die Farbregister nicht, die ihm
zugeteilt sind.
Ihr bemerkt sicher, daß die Farben eines "wiederverwendeten" Sprites die
gleichen sind wie die des "Orginals". Da die Sprites aber auf
verschiedenen Höhen liegen hindert uns nichts daran, deren Farben mit dem
Copper zu verändern, während wir uns z.B in der "leeren" Zeile befinden.
Ihr könnt es als Übung mal versuchen.