home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings3
/
listing7y2.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
6KB
|
227 lines
; Listing7y2.s Vertikale Balken
; In diesem Beispiel verwenden wir zwei Sprites, um vertikale Balken
; zu erzeugen.
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 ; 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)
; Wir pointen NICHT auf den Sprite !!!!!!!!!!!!!!!!!!!!
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 BewegeSprite ; Bewegt die Sprite 0 und 1 horizontal, aber
; indem er auf die MOVE in der COPPERLIST zugreift,
; da wir ja die Register direkt verwenden
Warte:
cmpi.b #$ff,$dff006 ; Zeile 255?
beq.s Warte
btst #6,$bfe001 ; Mouse gedrückt?
bne.s mouse
move.l OldCop(PC),$dff080 ; Pointen auf die SystemCOP
move.w d0,$dff088 ; Starten die alte SystemCOP
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
; Diese Routine bewegt den Sprite, indem sie auf die Copperlist einwirkt,
; durch verändern des Wertes bar1, der in das Register SPRxPOS geladen wird,
; also das Byte der horizontalen Position. Es werden schon vorausberechnete
; Werte aus einer Tabelle eingesetzt, TABX.
BewegeSprite:
ADDQ.L #2,TABXPOINT ; Pointe auf das nächste Byte
MOVE.L TABXPOINT(PC),A0 ; Adresse im Long TABXPOINT
; wird in a0 kopiert
CMP.L #ENDETABX-2,A0 ; Sind wir beim letzten Longword der TAB?
BNE.S NOBSTART ; noch nicht? Dann mach weiter
MOVE.L #TABX-2,TABXPOINT ; Starte wieder beim ersten Long
NOBSTART:
MOVE.w (A0),d1
add.w #128,D1 ; 128 - um den Sprite zu zentrieren
btst.l #0,D1 ; Niederw. Bit der X-Koordinate = 0?
beq.s NiederBitNull
bset.b #0,bar1_b ; Setzen das niederwertige Bit der bar.
bra.s PlaceCoords
NiederBitNull:
bclr.b #0,bar1_b ; Löschen das niederwertige Bit der bar.
PlaceCoords:
lsr.w #1,D1 ; SHIFTEN, bewegen also alles um 1 Bit nach rechts.
move.b D1,bar1 ; Geben den XX-Wert in die Position des Sprite
ADDQ.L #2,TABXPOINT2 ; Pointe auf das nächste Byte
MOVE.L TABXPOINT2(PC),A0 ; Adresse im Long TABXPOINT
; wird in a0 kopiert
CMP.L #ENDETABX-2,A0 ; Sind wir beim letzten Word der TAB?
BNE.S NOBSTART2 ; noch nicht? Dann mach weiter.
MOVE.L #TABX-2,TABXPOINT2 ; Starte wieder beim ersten Long
NOBSTART2:
MOVE.w (A0),d1
add.w #128,D1 ; 128 - um den Sprite zu zentrieren.
btst.l #0,D1 ; niederwertiges Bit der X-Koordinate =0?
beq.s NiederBitNull2
bset.b #0,bar2_b ; Setzen das niederwertige Bit der bar.
bra.s PlaceCoords2
NiederBitNull2:
bclr.b #0,bar2_b ; Löschen das niederwertige Bit der bar.
PlaceCoords2:
lsr.w #1,D1 ; SHIFTEN, bewegen also alles um 1 Bit nach rechts.
move.b D1,bar2 ; Geben den XX-Wert ind das Byte der Position
rts
TABXPOINT:
dc.l TABX-2
TABXPOINT2: ; Der Pointer für die zweite Position ist anders
dc.l TABX+40-2
; Tabelle mit vorausberechneten X-Koordinaten des Sprite.
TABX:
incbin "XCOORDINATOK.TAB"
ENDETABX:
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 ; schwarzer Hintergrund
dc.w $182,$123 ; COLOR1 ; COLOR1 des Bitplane, das in
; diesem Fall leer ist, es wird
; also nicht angezeigt.
dc.w $1A2,$FF0 ; COLOR17, also COLOR1 des Sprite0 - GIELB
dc.w $1A4,$a00 ; COLOR18, also COLOR2 des Sprite0 - ROT
dc.w $1A6,$F70 ; COLOR19, also COLOR3 des Sprite0 - ORANGE
dc.w $2c07,$fffe ; WAIT - Warte auf den oberen Rand
dc.w $140 ; SPR0POS
dc.b 0 ; Vertikale Position (nicht verwenddet)
bar1: dc.b 0 ; Horizontale Position
dc.w $142 ; SPR0CTL
dc.b 0 ; VSTOP (nicht verwendet)
bar1_b: dc.b 0 ; viertes Kontrollbyte: es wird das Bit 0
; verwendet, es ist das fehlende Bit der
; horizontalen Position (niederwertigstes)
dc.w $146,$0e70 ; SPR0DATB
dc.w $144,$03c0 ; SPR0DATA - aktiviert Sprite
dc.w $148 ; SPR1POS
dc.b 0
bar2: dc.b 0 ; horizontale Position
dc.w $14a ; SPR1CTL
dc.b 0
bar2_b: dc.b 0
dc.w $14e,$3e7c ; SPR1DATB
dc.w $14c,$0ff0;db0 ; SPR1DATA - aktiviert Sprite
dc.w $FFFF,$FFFE ; Ende der Copperlist
SECTION LEERESPLANE,BSS_C ; Wir brauchen ein leeres Bitplane,
; denn ohne Bitplanes können wir
; keine Sprites anzeigen.
BITPLANE:
ds.b 40*256 ; leeres Bitplane Lowres
end
Bemerkt, daß bei den Kolonnen, da sie den ganzen Bildschirm ausfüllen, es
nicht notwendig ist, in das Register SPRxCTL zu schreiben, um die Sprite
zu deaktivieren.
Setzt dieses Stück Copperlist vor der Zeile "dc.w $FFFF,$FFFE" ein, um
einen Schuß Farbe ins Listing zu bringen (Amiga+b+c+i).
dc.w $5407,$fffe ; WAIT
dc.w $1A2,$FaF ; COLOR17 ; Violett
dc.w $1A4,$703 ; COLOR18
dc.w $1A6,$F0a ; COLOR19
dc.w $6807,$fffe ; WAIT
dc.w $1A2,$aFa ; COLOR17 ; Grün
dc.w $1A4,$050 ; COLOR18
dc.w $1A6,$0a0 ; COLOR19
dc.w $7c07,$fffe ; WAIT
dc.w $1A2,$0FF ; COLOR17 ; Blau
dc.w $1A4,$00d ; COLOR18
dc.w $1A6,$07F ; COLOR19
dc.w $9007,$fffe ; WAIT
dc.w $1A2,$eee ; COLOR17 ; Grau
dc.w $1A4,$444 ; COLOR18
dc.w $1A6,$888 ; COLOR19