home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings3
/
listing7y4.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
13KB
|
394 lines
; Listing7y4.s - Landschaft, hergestellt mit nur 2 Sprites!
; Dieses Beispiel zeigt, wie es möglich ist, eine ganze Landschaft
; auf den Bildschirm zu malen, indem man nur zwei Sprites verwendet.
; Wir pointen direkt auf die Spriteregister
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:
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
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, und
; deswegen nicht erscheint.
dc.w $01ba,$0fff ; COLOR29
dc.w $01bc,$0aaa ; COLOR30
dc.w $01be,$0753 ; COLOR31
; Aus Bequemlichkeit verwenden wir Symbole. Ich erinnere euch, daß man ein
; Symbol (oder EQUATE) auf zwei Arten definieren kann: wie in diesem Fall,
; wo wir einfach ein = setzen, gefolgt vom Wert, den das Symbol haben soll,
; oder mit dem Schlüsselword EQU anstelle des =.
spr6pos = $170
spr6data = $174
spr6datb = $176
spr7pos = $178
spr7data = $17c
spr7datb = $17e
; Zeile $50
dc.w $5025,$fffe
dc.w spr6data,$0,spr6datb,$0,spr7data,$f000,spr7datb,$0
dc.w spr6pos,$40,spr7pos,$48,$504b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$505b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$506b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$507b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$508b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$509b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$50ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$50bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$50cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$50db,$fffe
; Zeile $51
dc.w $5125,$fffe
dc.w spr6data,$0001,spr6datb,$0000,spr7data,$b800,spr7datb,$4000
dc.w spr6pos,$40,spr7pos,$48,$514b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$515b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$516b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$517b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$518b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$519b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$51ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$51bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$51cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$51db,$fffe
; Zeile $52
dc.w $5225,$fffe
dc.w spr6data,$0003,spr6datb,$0000,spr7data,$bc00,spr7datb,$4000
dc.w spr6pos,$40,spr7pos,$48,$524b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$525b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$526b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$527b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$528b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$529b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$52ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$52bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$52cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$52db,$fffe
; Zeile $53
dc.w $5325,$fffe
dc.w spr6data,$0002,spr6datb,$0001,spr7data,$ec00,spr7datb,$1200
dc.w spr6pos,$40,spr7pos,$48,$534b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$535b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$536b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$537b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$538b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$539b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$53ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$53bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$53cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$53db,$fffe
; Zeile $54
dc.w $5425,$fffe
dc.w spr6data,$0007,spr6datb,$0000,spr7data,$2b00,spr7datb,$d400
dc.w spr6pos,$40,spr7pos,$48,$544b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$545b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$546b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$547b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$548b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$549b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$54ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$54bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$54cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$54db,$fffe
; Zeile $55
dc.w $5525,$fffe
dc.w spr6data,$001c,spr6datb,$0003,spr7data,$e780,spr7datb,$1800
dc.w spr6pos,$40,spr7pos,$48,$554b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$555b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$556b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$557b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$558b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$559b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$55ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$55bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$55cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$55db,$fffe
; Zeile $56
dc.w $5625,$fffe
dc.w spr6data,$803e,spr6datb,$0001,spr7data,$9ac1,spr7datb,$6500
dc.w spr6pos,$40,spr7pos,$48,$564b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$565b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$566b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$567b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$568b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$569b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$56ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$56bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$56cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$56db,$fffe
; Zeile $57
dc.w $5725,$fffe
dc.w spr6data,$c079,spr6datb,$0006,spr7data,$b6e7,spr7datb,$4910
dc.w spr6pos,$40,spr7pos,$48,$574b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$575b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$576b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$577b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$578b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$579b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$57ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$57bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$57cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$57db,$fffe
; Zeile $58
dc.w $5825,$fffe
dc.w spr6data,$c07f,spr6datb,$0048,spr7data,$fff6,spr7datb,$2009
dc.w spr6pos,$40,spr7pos,$48,$584b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$585b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$586b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$587b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$588b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$589b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$58ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$58bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$58cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$58db,$fffe
; Zeile $59
dc.w $5925,$fffe
dc.w spr6data,$e06f,spr6datb,$0096,spr7data,$7eaf,spr7datb,$a150
dc.w spr6pos,$40,spr7pos,$48,$594b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$595b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$596b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$597b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$598b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$599b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$59ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$59bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$59cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$59db,$fffe
; Zeile $5a
dc.w $5a25,$fffe
dc.w spr6data,$61ed,spr6datb,$9013,spr7data,$dfff,spr7datb,$6cab
dc.w spr6pos,$40,spr7pos,$48,$5a4b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$5a5b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$5a6b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$5a7b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$5a8b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$5a9b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$5aab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$5abb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$5acb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$5adb,$fffe
; Zeile $5b
dc.w $5b25,$fffe
dc.w spr6data,$db9f,spr6datb,$72ed,spr7data,$ffff,spr7datb,$dbee
dc.w spr6pos,$40,spr7pos,$48,$5b4b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$5b5b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$5b6b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$5b7b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$5b8b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$5b9b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$5bab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$5bbb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$5bcb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$5bdb,$fffe
; Zeile $5c
dc.w $5c25,$fffe
dc.w spr6data,$ffff,spr6datb,$cfbf,spr7data,$ffff,spr7datb,$ff3f
dc.w spr6pos,$40,spr7pos,$48,$5c4b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$5c5b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$5c6b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$5c7b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$5c8b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$5c9b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$5cab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$5cbb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$5ccb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$5cdb,$fffe
; Zeile $5d
dc.w $5d25,$fffe
dc.w spr6data,$ffff,spr6datb,$ffff,spr7data,$ffff,spr7datb,$feff
dc.w spr6pos,$40,spr7pos,$48,$5d4b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$5d5b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$5d6b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$5d7b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$5d8b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$5d9b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$5dab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$5dbb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$5dcb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$5ddb,$fffe
; Copperanweisungen zum deaktivieren der Sprite
dc.w $5107,$fffe ; Warte den Anfang der Zeile ab
dc.w $172,0 ; spr6ctl
dc.w $17a,0 ; spr7ctl
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
Wie ihr seht, ist es möglich, auch mehr als nur einmal pro Zeile einen
Sprite anzuzeigen, angenommen, man kann Assemblerprogrammieren.
In diesem Fall verwenden wir zwei Sprites (6+7) und zeigen jeden 10 mal
an, was insgesamt 16*20=320 ergibt, genau die Breite des Bildschirmes.
Praktisch füllen wir den ganzen Bildschirm. Die Idee ist die gleiche wie
im vorigen Beispiel, wir verändern die Werte der Register mit dem Copper.
Aber hier verändern wir nicht nur in jeder Zeile die Position, sondern
auch noch die Form des Sprites, um eben die Landschaft zu erzeugen. Der
Einfachheit wegen ist unser Gebirge nur 14 Pixel hoch, aber man könnte
auch den ganzen Bildschirm ausfüllen!
Jede Zeile in der Copperlist ist so aufgebaut:
; Zeile $50
dc.w $5025,$fffe
dc.w spr6data,$0,spr6datb,$0,spr7data,$f000,spr7datb,$0
dc.w spr6pos,$40,spr7pos,$48,$504b,$fffe
dc.w spr6pos,$50,spr7pos,$58,$505b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$506b,$fffe
dc.w spr6pos,$70,spr7pos,$78,$507b,$fffe
dc.w spr6pos,$80,spr7pos,$88,$508b,$fffe
dc.w spr6pos,$90,spr7pos,$98,$509b,$fffe
dc.w spr6pos,$a0,spr7pos,$a8,$50ab,$fffe
dc.w spr6pos,$b0,spr7pos,$b8,$50bb,$fffe
dc.w spr6pos,$c0,spr7pos,$c8,$50cb,$fffe
dc.w spr6pos,$d0,spr7pos,$d8,$50db,$fffe
Hier haben wir das Stück Copperlist für Zeile $50 herausgenommen. Sehen
wir uns die Bedeutung aller Anweisungen an:
dc.w $5025,$fffe ;Wait
Die erste Anweisung dient dazu, abzuwarten, bis der Elektronenstrahl die
horizontale Position $25 in der aktuellen Zeile erreicht.
dc.w spr6data,$0,spr6datb,$0,spr7data,$f000,spr7datb,$0
Diese Befehle dienen zum setzen der Werte der DATA-Register für diese
Zeile, sie geben seine Form an, sein Aussehen.
dc.w spr6pos,$40,spr7pos,$48,$504b,$fffe
Damit wird die Position des Sprite festgelegt. Sie arbeiten wie im vorigen
Beispiel. Zuerst werden die Spritepositionen erneuert, und dann wird
abgewartet, bis die zwei Sprites angezeigt werden. Nun wiederholen sich
zehn Gruppen von solchen Copper-Anweisungen, die wiederum die
Spritepositionen verändern und mit einem Wait abwarten, so, daß die
Sprites jeweils 16 Pixel verschoben sind, um sie nebeneinander zu
plazieren. Z.B.:
dc.w spr6pos,$50,spr7pos,$58,$505b,$fffe
dc.w spr6pos,$60,spr7pos,$68,$506b,$fffe
Zerteilen wir eine Zeile in die 3 Anweisungen, die sie enthält:
dc.w spr6pos,$50 ; bestimmt die Position des Sprite6
dc.w spr7pos,$58 ; bestimmt die Position des Sprite7
dc.w $505b,$fffe ; WAIT - Wartet 16 Pixel ab, weiter rechts.
und so weiter.
Nach zehn solcher Gruppen haben wir eine ganze Zeile gezeichnet. Nun
bleibt uns nichts anderes übrig, als das, was wir für Zeile $50 getan
haben, auch für die anderen 13 Zeilen der Landschaft zu machen. Natürlich
haben wir für jede Zeile andere Werte in den Registern SPRxDATx, um die
Berge zu gestalten.
Natürlich werden für solche extrem langen Copperlisten eigene Routinen
geschrieben, etwa "GeneriereCopperlist", die wegen ihrer Komplexität aber
noch nicht im Kurs eingeführt worden sind. Das wichtige ist im Moment, zu
verstehen, wie die Sache mit der Wiederverwendung abläuft, und wie man
direkt auf die Spriteregister mit der Copperlist zugreift.