*********************************************************
*							*
*	Anti Atari Demo von Jörg Schmidt 1/1988		*
*							*
*********************************************************

* Library-Routinen-Offsets:

execbase	equ	4
forbid		equ	-132
permit		equ	-138
allocmem	equ	-198
freemem		equ	-210
openlibrary	equ	-408
closelibrary	equ	-414
opendevice	equ	-444
closedevice	equ	-450
doio		equ	-456
sendio		equ	-462

open		equ	-30
read		equ	-42
close		equ	-36

initbitmap	equ	-390

* Hardware:

custom	equ	$dff000
dmaconr	equ	$2
vposr	equ	$4
joy0dat	equ	$a
joy1dat	equ	$c
clxdat	equ	$e
joytest	equ	$36

bltcon0	equ	$40
bltcon1	equ	$42
bltafwm	equ	$44
bltalwm	equ	$46
bltcpt	equ	$48
bltbpt	equ	$4C
bltapt	equ	$50
bltdpt	equ	$54
bltsize	equ	$58

bltcmod	equ	$60
bltbmod	equ	$62
bltamod	equ	$64
bltdmod	equ	$66

bltcdat	equ	$70
bltbdat	equ	$72
bltadat	equ	$74

diwstrt	equ	$8e
diwstop	equ	$90
ddfstrt	equ	$92
ddfstop	equ	$94
dmacon	equ	$96
clxcon	equ	$98

aud0lc	equ	$a0
aud0len	equ	$a4
aud0per	equ	$a6
aud0vol	equ	$a8
aud1lc	equ	$b0
aud1len	equ	$b4
aud1per	equ	$b6
aud1vol	equ	$b8

bplpt0	equ	$e0
bplpt1	equ	$e4
bplpt2	equ	$e8
bplpt3	equ	$ec
bplpt4	equ	$f0
bplpt5	equ	$f4
bplcon0	equ	$100
bplcon1	equ	$102
bplcon2	equ	$104
bpl1mod	equ	$108
bpl2mod	equ	$10a
sprpt0	equ	$120
sprpt1	equ	$124
sprpt2	equ	$128
sprpt3	equ	$12c
sprpt4	equ	$130
sprpt5	equ	$134
sprpt6	equ	$138
sprpt7	equ	$13c
color	equ	$180

* BitMap-Dimensionen:

bm1width	equ	40
bm1heigth	equ	512
bm1length	equ	bm1width*bm1heigth
bm2width	equ	80
bm2heigth	equ	56
bm2length	equ	bm2width*bm2heigth
bm3width	equ	72
bm3heigth	equ	107
bm3length	equ	bm3width*bm3heigth
bm4width	equ	46
bm4heigth	equ	176
bm4length	equ	bm4width*bm4heigth
bm5width	equ	40
bm5heigth	equ	440
bm5length	equ	bm5width*bm5heigth
bm6width	equ	40
bm6heigth	equ	200
bm6length	equ	bm6width*bm6heigth

* Importierte Labels:

	xref	stars.pic
	xref	mask.pic
	xref	abc.pic
	xref	sound

* Let's go!!!!

main:	bsr	init
	move.l	$32(a6),oldcprlist
	bsr	scroll
	move.l	#cprlist,$32(a6)
	move.w	#$8001,custom+dmacon
	move.w	#$5000,d0
1$	dbra	d0,1$	;Rechten Kanal leicht verzögern
	move.w	#$8002,custom+dmacon
mainlp:
	bsr	game
	bsr	scroll
	btst	#6,$bfe001
	beq.s	mainend
	cmpi.b	#$77,$bfec01
	bne.s	mainlp
mainend:
	move.l	oldcprlist,$32(a6)
	move.w	#$0003,custom+dmacon

	move.l	a6,a1
	move.l	execbase,a6
	jsr	closelibrary(a6)
	jsr	permit(a6)
	moveq	#0,d0
	rts
*
* Komfortable Fehlerbehandlung erleichtert
* eine problemlose Fehlersuche:
*
error:	bra.s	error
*
* Intialisierungen
*
init:	move.l	execbase,a6

	lea	trackdiskname,a0	;Trackdisk-Device öffnen
	moveq	#0,d0	;Unit 0=df0:
	lea	diskio,a1	;Disk-I/O-Request-Struktur
	moveq	#0,d1	;Keine Flags
	jsr	opendevice(a6)
	move.l	#diskrep,diskio+14	;IORequest->IOPort

	move.w	#9,diskio+28	;Befehl: Motor ein/aus
	clr.l	diskio+36	;0=aus, 1=an
	lea	diskio,a1	;Motor ausschalten
	jsr	doio(a6)

	lea	diskio,a1	;Trackdisk.Device schließen
	jsr	closedevice(a6)

	jsr	forbid(a6)	;andere Tasks aus!

	move.w	#%0110000111000111,custom+clxcon

	lea	gfxname,a1
	jsr	openlibrary(a6)
	move.l	d0,a6
	move.l	#workspace,d7
	move.l	d7,bitmap1+8
	addi.l	#bm1length,d7
	move.l	d7,bitmap1+12
	addi.l	#bm1length,d7
	move.l	d7,bitmap1+16
	addi.l	#bm1length,d7
	move.l	d7,bitmap2+8
	addi.l	#bm2length,d7
	move.l	d7,bitmap2+12
	addi.l	#bm2length,d7
	move.l	d7,bitmap2+16
	addi.l	#bm2length,d7
	move.l	d7,bitmap3+8
	addi.l	#bm3length,d7
	move.l	d7,bitmap3+12
	addi.l	#bm3length,d7
	move.l	d7,bitmap3+16
	addi.l	#bm3length,d7
	move.l	d7,bitmap4+8
	addi.l	#bm4length,d7
	move.l	d7,bitmap4+12
	addi.l	#bm4length,d7
	move.l	d7,bitmap4+16
	addi.l	#bm4length,d7

	move.l	d7,bitmap5+8
	move.l	d7,bitmap5+12	;2 Pseudo-BitPlanes
	move.l	d7,bitmap5+16
	addi.l	#bm5length,d7
	move.l	d7,bitmap6+8
	addi.l	#bm6length,d7
	move.l	d7,bitmap6+12
	addi.l	#bm6length,d7
	move.l	d7,bitmap6+16
	addi.l	#bm6length,d7

	lea	bitmap1,a0
	moveq	#3,d0
	move.l	#bm1width*8,d1
	move.l	#bm1heigth,d2
	jsr	initbitmap(a6)
	lea	bitmap2,a0
	moveq	#3,d0
	move.l	#bm2width*8,d1
	move.l	#bm2heigth,d2
	jsr	initbitmap(a6)
	lea	bitmap3,a0
	moveq	#3,d0
	move.l	#bm3width*8,d1
	move.l	#bm3heigth,d2
	jsr	initbitmap(a6)
	lea	bitmap4,a0
	moveq	#3,d0
	move.l	#bm4width*8,d1
	move.l	#bm4heigth,d2
	jsr	initbitmap(a6)
	lea	bitmap5,a0
	moveq	#3,d0
	move.l	#bm5width*8,d1
	move.l	#bm5heigth,d2
	jsr	initbitmap(a6)
	lea	bitmap6,a0
	moveq	#3,d0
	move.l	#bm6width*8,d1
	move.l	#bm6heigth,d2
	jsr	initbitmap(a6)

	moveq	#0,d6	;Weltraumbild dekomprimieren
	moveq	#0,d7
	move.l	file1ptr,a3
	lea	bitmap1,a4
	lea	clpfbcolor,a5
	bsr	getpic
	bsr	mywaitblit
	move.w	#bm1width-40,custom+bltamod	;Modulos
	move.w	#bm1width-40,custom+bltdmod
	move.w	#$09f0,custom+bltcon0
	clr.w	custom+bltcon1
	move.w	#$ffff,custom+bltafwm
	move.w	#$ffff,custom+bltalwm
	lea	bitmap1+8,a1
	moveq	#2,d7	;3 BitPlanes
picblitlp:
	bsr	mywaitblit
	move.l	(a1)+,a0
	move.l	a0,custom+bltapt	;Source
	adda.l	#256*bm1width,a0
	move.l	a0,custom+bltdpt
	move.w	#16384+20,custom+bltsize	;40*256
	dbra	d7,picblitlp

	moveq	#0,d6	;Buchstaben-Bild dekomprimieren
	moveq	#0,d7
	move.l	file2ptr,a3
	lea	bitmap5,a4
	suba.l	a5,a5
	move.b	#1,bitmap5+5
	bsr	getpic
	move.b	#3,bitmap5+5
	moveq	#0,d6	;Masken-Bild dekomprimieren
	moveq	#0,d7
	move.l	file3ptr,a3
	lea	bitmap6,a4
	suba.l	a5,a5
	bsr	getpic
drawship:
	bsr	mywaitblit	;Raumschiff->BitMap3
	move.w	#bm6width-8,custom+bltamod	;Modulos
	move.w	#bm3width-8,custom+bltdmod
	move.w	#$29f0,custom+bltcon0
	clr.w	custom+bltcon1
	move.w	#$ffff,custom+bltafwm
	move.w	#$fff0,custom+bltalwm
	lea	bitmap6+8,a1
	lea	bitmap3+8,a2
	moveq	#2,d7	;3 BitPlanes
rsblitlp:
	bsr	mywaitblit
	move.l	(a1)+,a0
	adda.l	#8,a0	;Byte-Offset
	move.l	a0,custom+bltapt	;Source
	move.l	(a2)+,a0
	adda.l	#bm3width+32,a0	;Zeile 1, ByteOffset 32
	move.l	a0,custom+bltdpt	;Dest.
	move.w	#6784+4,custom+bltsize	;8*106
	dbra	d7,rsblitlp

* Audio-Peripherie vorbereiten:

	lea	sound,a0
1$	cmpi.l	#'BODY',(a0)+
	bne.s	1$
	move.l	(a0)+,d0
	lsr.w	#1,d0
	move.w	d0,custom+aud0len
	move.w	d0,custom+aud1len
	move.l	a0,custom+aud0lc
	move.l	a0,custom+aud1lc
	move.w	#180,custom+aud0per
	move.w	#180,custom+aud1per
	move.w	#64,custom+aud0vol
	move.w	#64,custom+aud1vol
	rts
*
* Spiel
*
game:	tst.w	plex	;Explosion im Gange oder was?
	bne.s	noplmove
	clr.w	custom+joytest
	move.w	custom+joy1dat,d0
	moveq	#2,d1
	cmpi.w	#$0200,d0
	beq.s	game1
	cmpi.w	#$0300,d0
	beq.s	game1
	cmpi.w	#$0301,d0
	beq.s	game1
	moveq	#-2,d1
	cmpi.w	#$0103,d0
	beq.s	game1
	cmpi.w	#$0003,d0
	beq.s	game1
	cmpi.w	#$0002,d0
	beq.s	game1
	moveq	#0,d1
game1:	move.w	bm3rx,d0
	add.w	d1,d0
	bpl.s	game2
	moveq	#0,d0
	bra.s	game3
game2:	cmpi.w	#256,d0
	bcs.s	game3
	move.w	#256,d0
game3:	move.w	d0,bm3rx
noplmove:
	tst.w	schy	;Schüsse noch da?
	cmpi.w	#-16,schy
	bgt.s	game4	;Schüsse bewegen
	tst.w	plex	;Während Explosion:
	bne	game5	; keine Schüsse, bitte!
	move.b	butstat,d0	;Schuß auslösen?
	move.b	$bfe001,butstat
	tst.b	d0	;Button noch gedrückt?
	bpl	game5	;ja
	tst.b	butstat	;nein, aber jetzt?
	bmi	game5
	move.l	#sch1sprite,d0
	move.w	d0,clspr0+4
	swap	d0
	move.w	d0,clspr0
	move.l	#sch2sprite,d0
	move.w	d0,clspr1+4
	swap	d0
	move.w	d0,clspr1
	move.w	#257,d0
	sub.w	bm3rx,d0
	move.w	d0,sch1x
	addi.w	#53,d0
	move.w	d0,sch2x
	move.w	#180,schy
game4:
	subi.w	#8,schy	;Schuß bewegen
	cmpi.w	#-16,schy
	bgt	game6
	clr.w	clspr0
	clr.w	clspr0+4
	clr.w	clspr1
	clr.w	clspr1+4
	bra.s	game5
game6:
	move.w	sch1x,d0
	bmi.s	nosch1
	lea	sch1sprite,a0
	move.w	schy,d1
	bsr	mymovesprite
nosch1:
	move.w	sch2x,d0
	bmi.s	game5
	lea	sch2sprite,a0
	move.w	schy,d1
	bsr	mymovesprite	
game5:

* Spieler von Bombensprite getroffen???

	tst.w	plex
	bne.L	contplex
	move.w	custom+clxdat,d0
	andi.w	#%1100,d0
	beq.L	contplex
	moveq	#3,d7
	lea	boxy,a5
phlp:	move.l	(a5)+,d2
	beq.s	phlpsk
	cmpi.w	#180,d2
	bcs.s	phlpsk
	swap	d2	;d2=BombenX
	move.w	#256,d1
	sub.w	bm3rx,d1	;d1=SpielerX
	sub.w	d1,d2	;BombenX-SpielerX<60
	cmpi.w	#55,d2
	bcs.s	playerhit
phlpsk:
	dbra	d7,phlp
	bra.L	contplex
playerhit:
	bsr	clrplayer
	move.w	#$fff,clrscolors
	move.w	#$ffa,clrscolors+4
	move.w	#$ff5,clrscolors+8
	move.w	#$fd0,clrscolors+12
	move.w	#$f90,clrscolors+16
	move.w	#$f80,clrscolors+20
	move.w	#$f30,clrscolors+24
	clr.l	clrscolors+26
	move.w	#4,plex

* Spieler-Explosion fortschreiten lassen:

contplex:
	move.w	plex,d0
	beq.s	newaliens
	move.w	d0,d2
	andi.w	#3,d2
	bne.s	contplex1
	lsr.w	#2,d0
	bsr	plexplosion
contplex1:
	addq.w	#1,plex
	cmpi.w	#4*30,plex
	bne.s	newaliens
	clr.w	plex
	move.w	#$cca,clrscolors
	move.w	#$bb9,clrscolors+4
	move.w	#$997,clrscolors+8
	move.w	#$886,clrscolors+12
	move.w	#$775,clrscolors+16
	move.w	#$40f,clrscolors+20
	move.w	#$000,clrscolors+24
	move.l	#$ffdffffe,clrscolors+26
	bsr	drawship

* Aliens ggf. neu aufbauen:

newaliens:
	move.w	bm4rx,d0
	andi.w	#$1f,d0
	bne	da3
	tst.w	schy
	bpl.s	da3
	move.w	alnum,d7	;Alle Aliens abgeschossen?
	subq.w	#1,d7
	lea	alxy,a0
	moveq	#0,d0
alfertig:
	or.l	(a0)+,d0
	dbra	d7,alfertig
	tst.l	d0
	bne.s	da3

	move.w	#$60,clalbplcon2 ;Anfangen, Aliens zu zeichnen
	clr.w	clalcolors+4
	clr.w	clalcolors+8
	clr.w	clalcolors+12
	clr.w	clalcolors+16
	clr.w	clalcolors+20
	clr.w	clalcolors+24
	move.l	alxytabptr,a4
da2:	move.w	(a4)+,alnum
	move.w	alnum,alctr
	bne.s	da1
	lea	alxytab,a4
	bra.s	da2
da1:	move.l	a4,alxytabptr
	move.l	#alxy,alxyptr
da3:
	cmpi.w	#$60,clalbplcon2	;Noch am aufbauen???
	bne.s	game7
	bsr	drawalien	;1 Alien malen
	subq.w	#1,alctr
	bne.L	game12
	move.w	#$20,clalbplcon2	;PF A vor B
	move.w	#$fff,clalcolors+4
	move.w	#$add,clalcolors+8
	move.w	#$6cc,clalcolors+12
	move.w	#$3aa,clalcolors+16
	move.w	#$099,clalcolors+20
	move.w	#$fd3,clalcolors+24
	move.w	#$f30,clalcolors+28
game7:
	move.w	alnum,d7
	subq.w	#1,d7
	lea	alex,a4
	lea	alxy,a5
game8:	move.w	(a4)+,d3
	beq.s	noalex
	move.w	d3,d0
	andi.w	#3,d0
	bne.s	noexdraw
	lsr.w	#2,d3
	move.w	(a5),d0
	move.w	2(a5),d1
	bsr	alexplosion
noexdraw:
	move.w	-2(a4),d0
	addq.w	#1,d0
	move.w	d0,-2(a4)
	cmpi.w	#4*8,d0
	bne.s	alexskip
	clr.w	-2(a4)	;Explosions-Nummer löschen
	clr.l	(a5)	;Alien-Koordinaten löschen
alexskip:
	move.l	(a5)+,d0	;a5 erhöhen
	bra	game9
noalex:
	move.w	(a5)+,d0	;Bitmap-X
	sub.w	bm4rx,d0	;Screen-X
	move.w	(a5)+,d1
	beq.L	game9	;0=schon abgeschossen
	move.w	schy,d2
	bmi.s	game9
	addq.w	#3,d2	;Schuß-Y
	sub.w	d1,d2	;- Alien-Y
	cmpi.w	#32,d2
	bhi.s	game9	;Schuß zu tief
	move.w	sch1x,d4	;Schuß1x
	addq.w	#3,d4
	sub.w	d0,d4	;Schuß1x-Alienx
	move.w	sch2x,d5
	addq.w	#3,d5
	sub.w	d0,d5	;Schuß2x-Alienx
	cmpi.w	#38,d4	;Treffer mit Schuß1?
	bhi.s	game10
	clr.w	clspr0
	clr.w	clspr0+4
	move.w	#4,-2(a4)	;Expl.# setzen
	move.w	#-20,sch1x
game10:	cmpi.w	#38,d5	;Treffer mit Schuß2?
	bhi.s	game11
	clr.w	clspr1
	clr.w	clspr1+4
	move.w	#4,-2(a4)	;Expl.# setzen
	move.w	#-20,sch2x
game11:	move.w	sch1x,d0
	and.w	sch2x,d0
	bpl.s	game9
	move.w	#-16,schy
game9:	dbra	d7,game8
game12:
	cmpi.w	#$60,clalbplcon2	;Aliens am aufbauen?
	beq.L	nobombdrop	;Kein Abwurf
	move.w	bm4rx,d0	;Bombenhagel eindämmen
	andi.w	#$1f,d0
	bne.L	nobombdrop
	tst.w	plex
	bne.s	nobombdrop
	move.w	alnum,d7	;Bombenabwurf???
	subq.w	#1,d7
	lea	alex,a4
	lea	alxy,a5
game13:
	move.l	(a5)+,d0	;Schon weg?
	tst.w	(a4)+	;Explodierend?
	bne.s	game14
	move.w	d0,d3
	beq.s	game14
	swap	d0
	sub.w	bm4rx,d0	;Alien-Screenx
	addi.w	#18,d0	;Etwa Mitte
	move.w	d0,d2
	move.w	#256,d1
	sub.w	bm3rx,d1	;Spieler-Screenx
	sub.w	d1,d0	;Alien - Spieler
	cmpi.w	#60,d0
	bhi.s	game14	;Kein Bombenabwurf
	lea	clspr0+8,a2
	moveq	#4,d6
	lea	boxy,a0
	lea	bosprtab-4,a1
initbomb:
	addq.l	#8,a2	;Adresse in der Copperliste+8
	addq.l	#4,a1
	tst.l	(a0)+
	dbeq	d6,initbomb	
	cmpa.l	#clspr0+48,a2
	bcc.s	game14
	addq.w	#8,d3
	move.w	d3,-(a0)
	move.w	d2,-(a0)
	move.l	(a1),d0	;Sprite-Adr.
	move.w	d0,4(a2)	;in Copperliste
	swap	d0
	move.w	d0,(a2)
game14:
	dbra	d7,game13
nobombdrop:

* Bomben bewegen:

	lea	clspr0+8,a2
	moveq	#3,d7
	lea	boxy,a4
	lea	bosprtab,a5
movebombs:
	addq.l	#8,a2	;Copperlisten-Adr + 8
	move.l	(a5)+,a3	;SpriteAdr.
	move.l	(a4)+,d0
	beq.s	nobomb
	move.w	d0,d1	;Y
	addq.w	#4,d1
	cmpi.w	#256,d1
	bcs.s	bombyok
	clr.l	-4(a4)
	clr.w	(a2)
	clr.w	4(a2)
	bra.s	nobomb
bombyok:
	move.w	d1,-2(a4)	;Y
	swap	d0	;X
	move.l	a3,a0
	bsr	mymovesprite
nobomb:	dbra	d7,movebombs
	rts
*
* Spieler-Explosion zeichnen
* d0=Expl. # (1...7)
*
plexplosion:
	cmpi.w	#11,d0
	bcc.L	clrplayer
	subq.w	#1,d0
	move.w	#$2dfc,d1
	btst	#0,d0
	beq.s	plex1
	move.w	#$29f0,d1
plex1:	bclr	#0,d0
	asl.w	#2,d0
	ext.l	d0
	add.l	#bm6width*140,d0
	bsr	mywaitblit
	move.w	#bm6width-8,custom+bltamod	;Modulos
	move.w	#bm3width-8,custom+bltbmod
	move.w	#bm3width-8,custom+bltdmod
	move.w	d1,custom+bltcon0
	clr.w	custom+bltcon1
	move.w	#$ffff,custom+bltafwm
	move.w	#$fff0,custom+bltalwm
	lea	bitmap6+8,a1
	lea	bitmap3+8,a2
	moveq	#2,d7	;3 BitPlanes
plexblitlp:
	bsr	mywaitblit
	move.l	(a1)+,a0
	adda.l	d0,a0	;Byte-Offset
	move.l	a0,custom+bltapt	;Source
	move.l	(a2)+,a0
	adda.l	#bm3width*24+32,a0
	move.l	a0,custom+bltbpt
	move.l	a0,custom+bltdpt	;Dest.
	move.w	#3840+4,custom+bltsize	;4*60
	dbra	d7,plexblitlp
	rts
*
* Spieler löschen
*
clrplayer:
	bsr	mywaitblit	;Spieler löschen
	move.w	#bm3width-8,custom+bltdmod
	move.w	#$0100,custom+bltcon0
	clr.w	custom+bltcon1
	lea	bitmap3+8,a2
	moveq	#2,d7	;3 BitPlanes
plclrblitlp:
	bsr	mywaitblit
	move.l	(a2)+,a0
	adda.l	#32,a0
	move.l	a0,custom+bltdpt	;Dest.
	move.w	#6784+4,custom+bltsize	;4*107
	dbra	d7,plclrblitlp
	rts
*
* Alien-Explosion malen
* d3=Ex.#
* d0=X, d1=Y
*
alexplosion:
	move.w	d3,d4
	subq.w	#1,d3
	mulu	#6,d3
	add.l	#bm6width*106,d3
	cmpi.w	#7,d4
	bne.s	ex1bis6
	move.w	#24,d3
ex1bis6:
	ext.l	d0
	move.w	d0,d2
	andi.w	#$f,d2
	ror.w	#4,d2
	lsr.l	#3,d0
	mulu	#bm4width,d1
	add.l	d0,d1
	bsr	mywaitblit
	move.w	#bm6width-8,custom+bltamod
	move.w	#-8,custom+bltbmod	;Ausblendmaske
	move.w	#bm4width-8,custom+bltcmod
	move.w	#bm4width-8,custom+bltdmod
	move.w	d2,custom+bltcon1	;BSHIFT-Wert
	ori.w	#$0fe2,d2
	move.w	d2,custom+bltcon0
	move.w	#$ffff,custom+bltafwm
	move.w	#$ffff,custom+bltalwm
	lea	bitmap6+8,a1
	lea	bitmap4+8,a2	;Dest.-BitMap
	moveq	#2,d0	;3 BitPlanes
rablitlp:
	bsr	mywaitblit
	move.l	(a1)+,a3
	adda.l	d3,a3
	move.l	a3,custom+bltapt
	move.l	#alclrmask,custom+bltbpt
	move.l	(a2)+,a0
	adda.l	d1,a0	;Offset in BitMap4
	move.l	a0,custom+bltcpt
	move.l	a0,custom+bltdpt	;Destination
	move.w	#2048+4,custom+bltsize	;4*32
	bsr	mywaitblit
	move.l	a3,custom+bltapt
	move.l	#alclrmask,custom+bltbpt
	adda.l	#bm4width*88,a0	;88 Zeilen tiefer
	move.l	a0,custom+bltcpt
	move.l	a0,custom+bltdpt
	move.w	#2048+4,custom+bltsize
	dbra	d0,rablitlp
	rts
*
* Alien malen
*
drawalien:
	move.l	alxytabptr,a4
	move.l	alxyptr,a5
	move.l	(a4)+,d2
	move.l	d2,(a5)+
	move.l	a4,alxytabptr
	move.l	a5,alxyptr
	move.w	d2,d1	;Y
	mulu	#bm4width,d1
	swap	d2
	moveq	#0,d0
	move.w	d2,d0	;X
	lsr.l	#3,d0
	add.l	d0,d1	;Offset
	andi.w	#$f,d2
	ror.w	#4,d2	;Shiftwert
	bsr	mywaitblit
	move.w	#bm6width-8,custom+bltamod	;Modulos
	move.w	#bm4width-8,custom+bltbmod
	move.w	#bm4width-8,custom+bltdmod
	ori.w	#$0dfc,d2
	move.w	d2,custom+bltcon0
	clr.w	custom+bltcon1
	move.w	#$ffff,custom+bltafwm
	move.w	#$ffff,custom+bltalwm
	lea	bitmap6+8,a1	;SourceB-BitMap
	lea	bitmap4+8,a2	;Dest.-BitMap
	moveq	#2,d6	;3 BitPlanes
dablitlp:
	bsr	mywaitblit
	move.l	(a1)+,a3
	adda.l	#16,a3	;SourceA
	move.l	a3,custom+bltapt
	move.l	(a2)+,a0
	adda.l	d1,a0	;Offset in DestBitMap
	move.l	a0,custom+bltbpt
	move.l	a0,custom+bltdpt	;Destination
	move.w	#2048+4,custom+bltsize	;3*32
	bsr	mywaitblit
	adda.l	#bm6width*32,a3
	move.l	a3,custom+bltapt
	adda.l	#bm4width*88,a0
	move.l	a0,custom+bltbpt
	move.l	a0,custom+bltdpt
	move.w	#2048+4,custom+bltsize
	dbra	d6,dablitlp
	rts
*
* Text scrollen
*
scroll:
	move.l	custom+vposr,d0
	andi.l	#$1ff00,d0
	cmpi.l	#$07000,d0	;VOR Text-Bereich
	bne.s	scroll

	move.w	bm2rx,d0
	andi.w	#$3f,d0
	bne.s	scroll1
	move.l	txtptr,a0
	move.b	(a0)+,d7
	bne.s	scroll2
	move.l	#txt,a0
	move.b	(a0)+,d7
scroll2:
	move.l	a0,txtptr
	bsr	putchar
	eori.w	#88,bm4ry
scroll1:
	move.l	custom+vposr,d0
	andi.l	#$1ff00,d0
	cmpi.l	#$0c000,d0	;NACH Text-Bereich
	bne.s	scroll1
	moveq	#0,d0
	move.w	bm2rx,d0
	lsr.w	#3,d0	;d0=X-Byte-Offset
	btst	#0,d0
	bne.L	notxtblit
	bsr	mywaitblit
	move.w	#bm2width-2,custom+bltamod	;Modulos
	move.w	#bm2width-2,custom+bltdmod
	move.w	#$09f0,custom+bltcon0
	clr.w	custom+bltcon1
	move.w	#$ffff,custom+bltafwm
	move.w	#$ffff,custom+bltalwm
	lea	bitmap2+8,a1
	moveq	#2,d7	;3 BitPlanes
txtblitlp:
	bsr	mywaitblit
	move.l	(a1)+,a0
	add.l	d0,a0
	move.l	a0,custom+bltdpt	;Destination
	adda.l	#40,a0
	move.l	a0,custom+bltapt	;Source
	move.w	#3393,custom+bltsize
	dbra	d7,txtblitlp
notxtblit:
	addq.w	#8,bm2rx
	cmpi.w	#320,bm2rx
	bne.s	scroll3
	clr.w	bm2rx
	move.w	#320,charx
scroll3:
	move.w	bm2rx,d0
	andi.w	#$f,d0
	bne.s	scroll4

* Textfarben rotieren lassen:

	move.w	txtcolors+20,d0
	move.w	txtcolors+16,txtcolors+20
	move.w	txtcolors+12,txtcolors+16
	move.w	txtcolors+8,txtcolors+12
	move.w	txtcolors+4,txtcolors+8
	move.w	txtcolors,txtcolors+4
	move.w	d0,txtcolors
scroll4:

* Hintergrund scrollen:

	subi.w	#2,bm1ry
	bne.s	scroll5
	move.w	#256,bm1ry
scroll5:

* Raketenfarben rotieren lassen:

	move.w	clrakcolors+396,d1
	lea	clrakcolors+384,a0
	moveq	#32,d0
scroll6:
	move.w	(a0),12(a0)
	sub.l	#12,a0
	dbra	d0,scroll6
	move.w	d1,clrakcolors
	move.w	bm2rx,d0
	andi.w	#$3f,d0
	bne.s	scroll7
	move.w	clrakcolors+400,d1
	lea	clrakcolors+388,a0
	moveq	#32,d0
scroll8:
	move.w	(a0),12(a0)
	sub.l	#12,a0
	dbra	d0,scroll8
	move.w	d1,clrakcolors+4
scroll7:
	move.w	alvx,d1
	add.w	d1,bm4rx	;Alien-Scrolling
	beq.s	scroll9
	cmpi.w	#40,bm4rx
	bne.s	scroll10
scroll9:
	neg.w	alvx
scroll10:
*
* Copperliste aktualisieren
*
updatecl:
	move.l	custom+vposr,d0
	andi.l	#$1ff00,d0
	cmpi.l	#$12800,d0
	bne.s	updatecl

	move.w	bm1rx,d0
	move.w	bm1ry,d1
	moveq	#bm1width,d2
	bsr	calcscroll
	asl.w	#4,d2
	move.w	d2,clalbplcon1
	move.w	d2,cltxbplcon1
	move.w	d2,clrsbplcon1
	add.l	bitmap1+8,d1
	swap	d1
	move.w	d1,clpfbpt
	swap	d1
	move.w	d1,clpfbpt+4
	addi.l	#bm1length,d1
	swap	d1
	move.w	d1,clpfbpt+8
	swap	d1
	move.w	d1,clpfbpt+12
	addi.l	#bm1length,d1
	swap	d1
	move.w	d1,clpfbpt+16
	swap	d1
	move.w	d1,clpfbpt+20

	move.w	bm4rx,d0	;Aliens
	move.w	bm4ry,d1
	moveq	#bm4width,d2
	bsr	calcscroll
	or.w	d2,clalbplcon1
	add.l	bitmap4+8,d1
	swap	d1
	move.w	d1,clalpt
	swap	d1
	move.w	d1,clalpt+4
	addi.l	#bm4length,d1
	swap	d1
	move.w	d1,clalpt+8
	swap	d1
	move.w	d1,clalpt+12
	addi.l	#bm4length,d1
	swap	d1
	move.w	d1,clalpt+16
	swap	d1
	move.w	d1,clalpt+20

	move.w	bm2rx,d0	;Text
	addq.w	#8,d0	;Damit's links nicht flackert
	move.w	bm2ry,d1
	moveq	#bm2width,d2
	bsr	calcscroll
	or.w	d2,cltxbplcon1
	add.l	bitmap2+8,d1
	swap	d1
	move.w	d1,cltxpt
	swap	d1
	move.w	d1,cltxpt+4
	addi.l	#bm2length,d1
	swap	d1
	move.w	d1,cltxpt+8
	swap	d1
	move.w	d1,cltxpt+12
	addi.l	#bm2length,d1
	swap	d1
	move.w	d1,cltxpt+16
	swap	d1
	move.w	d1,cltxpt+20

	move.w	bm3rx,d0	;Raumschiff
	move.w	bm3ry,d1
	moveq	#bm3width,d2
	bsr	calcscroll
	or.w	d2,clrsbplcon1
	add.l	bitmap3+8,d1
	swap	d1
	move.w	d1,clrspt
	swap	d1
	move.w	d1,clrspt+4
	addi.l	#bm3length,d1
	swap	d1
	move.w	d1,clrspt+8
	swap	d1
	move.w	d1,clrspt+12
	addi.l	#bm3length,d1
	swap	d1
	move.w	d1,clrspt+16
	swap	d1
	move.w	d1,clrspt+20
	rts
*
* Zeichen (d7) in BitMap2 klätschen
*
putchar:
	andi.l	#$ff,d7
	cmpi.b	#$20,d7
	beq.L	space
	moveq	#8,d0
	move.l	#5*53,d1
	cmpi.b	#'.',d7
	beq.s	putchar1
	move.w	#16,d0
	cmpi.b	#'!',d7
	beq.s	putchar1
	move.w	#24,d0
	cmpi.b	#',',d7
	beq.s	putchar1
	move.w	#32,d0
	cmpi.b	#'-',d7
	beq.s	putchar1
	move.l	#6*53,d2	;Y-Offset f. Zahlen
	subi.b	#48,d7
	cmpi.b	#9,d7
	ble.s	putchar2
	moveq	#0,d2
	subi.b	#49,d7
putchar2:
	move.l	d7,d0
	divu	#5,d7	;Code/5
	move.w	d7,d1
	mulu	#5,d7	;*5
	sub.l	d7,d0	;X=Code-(Code/5)*5
	asl.l	#3,d0	;X=X*8 (X-Byte-Offset)
	mulu	#53,d1	;Y=(Code/5)*53
	add.l	d2,d1
putchar1:
	mulu	#bm5width,d1	;Y*BitMapBreite
	add.l	d1,d0	;+XByteOffset
	moveq	#0,d1
	move.w	charx,d1
	lsr.l	#3,d1	;Dest.-Offset
	bsr	mywaitblit
	move.w	#bm5width-8,custom+bltamod	;Modulos
	move.w	#bm6width-8,custom+bltbmod
	move.w	#bm2width-8,custom+bltdmod
	move.w	#$0dc0,custom+bltcon0
	clr.w	custom+bltcon1
	move.w	#$ffff,custom+bltafwm
	move.w	#$ffff,custom+bltalwm
	lea	bitmap6+8,a1	;SourceB-BitMap
	lea	bitmap2+8,a2	;Dest.-BitMap
	moveq	#2,d7	;3 BitPlanes
charblitlp:
	bsr	mywaitblit
	move.l	bitmap5+8,a0
	adda.l	d0,a0	;Offset in SourceA-BitMap
	move.l	a0,custom+bltapt	;SourceA
	move.l	(a1)+,custom+bltbpt	;SourceB
	move.l	(a2)+,a0
	adda.l	d1,a0	;Offset in DestBitMap
	move.l	a0,custom+bltdpt	;Destination
	move.w	#3392+4,custom+bltsize	;8*53
	dbra	d7,charblitlp
	bra.s	putcharend
space:
	moveq	#0,d1
	move.w	charx,d1
	lsr.w	#3,d1
	bsr	mywaitblit
	move.w	#bm2width-8,custom+bltdmod
	move.w	#$0100,custom+bltcon0
	clr.w	custom+bltcon1
	lea	bitmap2+8,a2	;Dest.-BitMap
	moveq	#2,d7	;3 BitPlanes
spaceblitlp:
	bsr	mywaitblit
	move.l	(a2)+,a0
	adda.l	d1,a0	;Offset in DestBitMap
	move.l	a0,custom+bltdpt	;Destination
	move.w	#3392+4,custom+bltsize	;8*53
	dbra	d7,spaceblitlp
putcharend:
	addi.w	#64,charx
	rts
*
*------------------------------------------
*   Subroutinen für dies & das
*------------------------------------------
*
* BitPlane-Offset & FineScroll-Wert berechnen
* In: d0=X, d1=Y, d2=BitMap-BytesPerRow
* Out: d1=Offset, d2=FineScroll
*
calcscroll:
	mulu	d2,d1
	subq.w	#1,d0
	ext.l	d0
	move.w	d0,d2
	lsr.l	#3,d0
	add.l	d0,d1
	eori.w	#$f,d2
	andi.w	#$f,d2
	rts
*
* Neue Sprite-POS und CTL-Words berechnen:
* A0=Zeiger auf Sprite
* D0=X-Koordinate (normal:-16...+320)
* D1=Y-Koordinate (normal:-44...+256)
* D0...D4 werden verändert!
*
mymovesprite:
	addi.w	#$81,d0	;An DIWSTRT/DIWSTOP anpassen
	addi.w	#$2C,d1
	
	move.w	2(a0),d2	;Altes StopY
	move.b	#$ff,d2
	sub.w	(a0),d2	;- StartY	equ	SpriteHöhe*$100
	andi.w	#$ff00,d2

	move.w	d1,d4
	lsr.w	#6,d4	;Bit 8 von Y -> Bit 2
	andi.b	#4,d4
	lsl.l	#8,d1	;-> $YY00
	move.w	d1,d3
	move.b	d0,d1	;-> $YYXX
	andi.b	#1,d1	;Bit 0 von X
	or.b	d4,d1	;Bit 8 von StartY in Bit 2
	add.l	d2,d1	;+ Höhe*$100	equ	StopY
	move.l	d1,d4
	lsr.l	#7,d4	;Bit 8 von Stopy in Bit 1
	lsr.w	#8,d4
	andi.w	#2,d4
	or.w	d4,d1	;	equ	CTL
	move.w	d1,2(a0)
	lsr.w	#1,d0	;X/2
	move.b	d0,d3	;D3=$YYXX (Start)
	move.w	d3,(a0)
	rts
*
* Warten, bis Blitter fertig ist,
* dabei dem Blitter-DMA absolute Priorität
* über den Prozessor geben
*
mywaitblit:
	move.w	#$8400,custom+dmacon	;BLTPRI setzen
waitblitlp:
	btst	#14,custom+dmaconr
	bne.s	waitblitlp
	move.w	#$0400,custom+dmacon	;BLTPRI löschen
	rts
*
* IFF-Bild dekomprimieren:
*
* D6=X-Offset (in Bytes)
* D7=Y-Offset (in Zeilen)
* A3=Zeiger auf IFF-Puffer
* A4=Zeiger auf Bitmap
* A5=Zeiger auf Color-Table
*
planetab:	ds.l	6
getpic:
	mulu	(a4),d7	;YOffset*BytesPerRow
	add.l	d6,d7	;+XOffset=MemOffset

	move.l	a3,a0
searchbmhd:
	addq.l	#2,a0
	cmpi.l	#'BMHD',(a0)
	bne.s	searchbmhd
	addq.l	#8,a0
	moveq	#0,d5
	move.w	(a0),d5	;Bildbreite
	addq.w	#7,d5	;+7 /8
	lsr.w	#3,d5	;=Bytes pro Bildzeile
	moveq	#0,d6
	move.w	2(a0),d6	;Bildhöhe

* CMAP-Chunk auswerten:

	move.l	a3,a0	
findcmap:
	addq.l	#2,a0
	cmpi.l	#'CMAP',(a0)
	bne.s	findcmap
	addq.l	#8,a0		;Längenangabe überspringen

* Farbtabelle aufbauen:

	moveq	#0,d3
	move.b	5(a4),d3	;Planes
	move.l	a5,d0
	beq.s	nocmap
	moveq	#1,d0
	asl.b	d3,d0	;Anzahl der Farben
	subq.w	#1,d0	;-1
makecoltab:
	moveq	#0,d2
	move.b	(a0)+,d2	;rot
	asl.w	#4,d2
	moveq	#0,d1
	move.b	(a0)+,d1	;grün
	or.w	d1,d2
	move.b	(a0)+,d1	;blau
	lsr.w	#4,d1
	or.w	d1,d2
	move.w	d2,(a5)
	addq.l	#4,a5	;!!!Modifikation f. Copperlisten!!!
	dbra	d0,makecoltab

* Bitplane-Tabelle aufstellen:

nocmap:
	subq.w	#1,d3	;Depth-1
	move.l	d3,d4
	move.l	a4,a5	;Zeiger auf Bitmap retten
	addq.l	#8,a4	;BitMap-Planetabelle
	lea	planetab,a0	;Eigene Planetabelle
makeplanetab:
	move.l	(a4)+,d0
	add.l	d7,d0
	move.l	d0,(a0)+
	dbra	d3,makeplanetab

* Nach Body-Chunk suchen:

	move.l	a3,a0
findbody:
	addq.l	#2,a0
	cmpi.l	#'BODY',(a0)
	bne.s	findbody
	addq.l	#8,a0

* Bild dekomprimieren:
* a5=BitMap, d4=Planes-1, d5=Breite, d6=Höhe

	subq.w	#1,d6
	move.l	d6,d0	;d0=Zeilenzähler
	move.l	d4,d6	;d6=Planes-1
	move.l	d5,d7	;d7=Bytes pro Bildzeile
clinelp:
	move.l	d6,d1	;Bitplane-Zähler
	lea	planetab,a1	;Zeiger auf Plane-Tabelle
cplanelp:
	move.l	(a1),a2		;Zeilen-Startadr. in A2
	moveq	#0,d2		;Byte-Zähler
cbytelp:
	moveq	#0,d3
	move.b	(a0)+,d3	;Codebyte lesen
	bmi.s	wiederholung

* Keine Wiederholung
* --> Codebyte+1 Bytes übertragen

noreptlp:
	move.b	(a0)+,0(a2,d2.w);Bildbyte nach Zeilenadr+Bytezähler
	addq.w	#1,d2		;Bytezähler=Bytezähler+1
	tst.b	d3		;Codebyte=0?
	dbeq	d3,noreptlp
	bra.s	wend

wiederholung:
	move.b	(a0)+,d4	;Wiederholungsbyte lesen
	move.w	#257,d5		;Anzal der Wiederholungen
	sub.w	d3,d5		;=257-Codebyte=3...129
reptlp:
	move.b	d4,0(a2,d2.w)	;Bildbyte nach Zeilenadr+Bytezähler
	addq.w	#1,d2		;Bytezähler=Bytezähler+1
	cmpi.w	#1,d5
	dbeq	d5,reptlp
wend:
	cmp.w	d7,d2	;Bytezähler<Bytes-pro-Bildzeile?
	bcs.s	cbytelp

	adda.w	(a5),a2	;Zeile dieser Plane fertig
	move.l	a2,(a1)+	;Neue Zeilenadr. in Planetab

	dbra	d1,cplanelp	;Plane=Plane-1
	dbra	d0,clinelp	;Zeile=Zeile-1
	rts
*
* File einladen:
* d1=Filename
* d7=Buffer
* a6=dosbase
* Hinterher: d7=Buffer+Länge
*
	ifne	0
readfile:
	move.l	#1005,d2
	jsr	open(a6)
	move.l	d0,d1
	beq	error
	move.l	d7,d2
	move.l	#$4000,d3
	move.l	d1,-(sp)
	jsr	read(a6)
	move.l	(sp)+,d1
	add.l	d0,d7
	jmp	close(a6)
	endc
*
* Copper-Liste
*
	data
cprlist:
	dc.w	$0001,$fffe
	dc.w	bplpt0
clalpt:	dc.w	0
	dc.w	bplpt0+2,0
	dc.w	bplpt2,0
	dc.w	bplpt2+2,0
	dc.w	bplpt4,0
	dc.w	bplpt4+2,0
	dc.w	bplpt1
clpfbpt:
	dc.w	0
	dc.w	bplpt1+2,0
	dc.w	bplpt3,0
	dc.w	bplpt3+2,0
	dc.w	bplpt5,0
	dc.w	bplpt5+2,0
	dc.w	diwstrt,$2c81	;Y=$2C...$12C
	dc.w	diwstop,$2cc1	;X=$81...$1C1
	dc.w	ddfstrt,$0030	;Data-Fetch-Start/Stop
	dc.w	ddfstop,$00d8
	dc.w	bplcon0,$6600	;Darstellungs-Modus
	dc.w	bplcon1	;Alien-Fine-Scroll
clalbplcon1:
	dc.w	0
	dc.w	bplcon2	;Sprite/Playfield-Priorität
clalbplcon2:
	dc.w	$0024
	dc.w	bpl1mod,bm4width-43 ;Modulo-Wert gerade Plane/PF A
	dc.w	bpl2mod,bm1width-43 ;     "    ungerade Plane/PF B

	dc.w	sprpt0
clspr0:	dc.w	0
	dc.w	sprpt0+2,0
	dc.w	sprpt1
clspr1:	dc.w	0
	dc.w	sprpt1+2,0
	dc.w	sprpt2,0,sprpt2+2,0
	dc.w	sprpt3,0,sprpt3+2,0
	dc.w	sprpt4,0,sprpt4+2,0
	dc.w	sprpt5,0,sprpt5+2,0
	dc.w	sprpt6,0,sprpt6+2,0
	dc.w	sprpt7,0,sprpt7+2,0

	dc.w	color
clalcolors:
	dc.w	0,color+2,0,color+4,0,color+6,0
	dc.w	color+8,0,color+10,0,color+12,0,color+14,0
	dc.w	color+16
clpfbcolor:
	dc.w	0
	dc.w	color+18,0
	dc.w	color+20,0,color+22,0,color+24,0
	dc.w	color+26,0,color+28,0,color+30,0
	dc.w	color+34,$ffd,color+36,$5f5,color+38,$1a0
	dc.w	color+42,$fff,color+44,$f88,color+46,$f00
	dc.w	color+50,$fff,color+52,$f88,color+54,$f00
	dc.w	color+58,$fff,color+60,$f88,color+62,$f00
	dc.w	$83b1,$fffe	;WAIT(87+$2c,$b8)
	dc.w	bpl1mod,bm2width-43
	dc.w	bplcon1		;Text-Fine Scroll
cltxbplcon1:
	dc.w	0
	dc.w	color+4	;Schrift-Farben setzen
txtcolors:
	dc.w	$f90
	dc.w	color+6,$fb5,color+8,$fd9
	dc.w	color+10,$fff,color+12,$fd9
	dc.w	color+14,$fb5
	dc.w	$8401,$fffe	;WAIT(88+$2c,0)
	dc.w	bplcon2,$0020	;PF A vor B
	dc.w	bplpt0	;BitPlane-Adressen Text-Bereich
cltxpt:
	dc.w	0
	dc.w	bplpt0+2,0
	dc.w	bplpt2,0
	dc.w	bplpt2+2,0
	dc.w	bplpt4,0
	dc.w	bplpt4+2,0

	dc.w	$b801,$fffe	;WAIT(88+52+$2c,0)
	dc.w	bplcon2,$64	;PF B vor A
	dc.w	color,0,color+2,0,color+4,0,color+6,0
	dc.w	color+8,0,color+10,0,color+12,0,color+14,0

	dc.w	bplcon1	;Raumschiff-FineScroll
clrsbplcon1:
	dc.w	0
	dc.w	bpl1mod,bm3width-43	;PF A Modulo-Wert

	dc.w	$c201,$fffe	;Wait(150+$2c,0)
	dc.w	bplcon2,$20	;PF A vor B
	dc.w	bplpt0	;BitPlane-Adressen Raumschiff
clrspt:
	dc.w	0
	dc.w	bplpt0+2,0
	dc.w	bplpt2,0
	dc.w	bplpt2+2,0
	dc.w	bplpt4,0
	dc.w	bplpt4+2,0
	dc.w	color+2
clrscolors:
	dc.w	$cca,color+4,$bb9,color+6,$997
	dc.w	color+8,$886,color+10,$775
	dc.w	color+12,$40f,color+14,0

	dc.w	$ffdf,$fffe	;Ab hier: $YY gilt als $1YY
	dc.w	$0a01,$fffe	;WAIT($10a,0)
	dc.w	color+12
clrakcolors:
	dc.w	$f00
	dc.w	color+14,$ff0
	dc.w	$0b01,$fffe
	dc.w	color+12,$f10
	dc.w	color+14,$fd0
	dc.w	$0c01,$fffe
	dc.w	color+12,$f20
	dc.w	color+14,$fb0
	dc.w	$0d01,$fffe
	dc.w	color+12,$f30
	dc.w	color+14,$f90
	dc.w	$0e01,$fffe
	dc.w	color+12,$f40
	dc.w	color+14,$f70
	dc.w	$0f01,$fffe
	dc.w	color+12,$f50
	dc.w	color+14,$f50
	dc.w	$1001,$fffe
	dc.w	color+12,$f60
	dc.w	color+14,$f30
	dc.w	$1101,$fffe
	dc.w	color+12,$f70
	dc.w	color+14,$f10
	dc.w	$1201,$fffe
	dc.w	color+12,$f80
	dc.w	color+14,$f00
	dc.w	$1301,$fffe
	dc.w	color+12,$f90
	dc.w	color+14,$f20
	dc.w	$1401,$fffe
	dc.w	color+12,$fa0
	dc.w	color+14,$f40
	dc.w	$1501,$fffe
	dc.w	color+12,$fb0
	dc.w	color+14,$f60
	dc.w	$1601,$fffe
	dc.w	color+12,$fc0
	dc.w	color+14,$f80
	dc.w	$1701,$fffe
	dc.w	color+12,$fd0
	dc.w	color+14,$fa0
	dc.w	$1801,$fffe
	dc.w	color+12,$fe0
	dc.w	color+14,$fc0
	dc.w	$1901,$fffe
	dc.w	color+12,$ff0
	dc.w	color+14,$fe0
	dc.w	$1a01,$fffe
	dc.w	color+12,$fe0
	dc.w	color+14,$ff0
	dc.w	$1b01,$fffe
	dc.w	color+12,$fd0
	dc.w	color+14,$fe0
	dc.w	$1c01,$fffe
	dc.w	color+12,$fc0
	dc.w	color+14,$fc0
	dc.w	$1d01,$fffe
	dc.w	color+12,$fb0
	dc.w	color+14,$fa0
	dc.w	$1e01,$fffe
	dc.w	color+12,$fa0
	dc.w	color+14,$f80
	dc.w	$1f01,$fffe
	dc.w	color+12,$f90
	dc.w	color+14,$f60
	dc.w	$2001,$fffe
	dc.w	color+12,$f80
	dc.w	color+14,$f40
	dc.w	$2101,$fffe
	dc.w	color+12,$f70
	dc.w	color+14,$f20
	dc.w	$2201,$fffe
	dc.w	color+12,$f60
	dc.w	color+14,$f10
	dc.w	$2301,$fffe
	dc.w	color+12,$f50
	dc.w	color+14,$f00
	dc.w	$2401,$fffe
	dc.w	color+12,$f40
	dc.w	color+14,$f20
	dc.w	$2501,$fffe
	dc.w	color+12,$f30
	dc.w	color+14,$f40
	dc.w	$2601,$fffe
	dc.w	color+12,$f20
	dc.w	color+14,$f60
	dc.w	$2701,$fffe
	dc.w	color+12,$f10
	dc.w	color+14,$f80
	dc.w	$2801,$fffe
	dc.w	color+12,$f00
	dc.w	color+14,$fa0
	dc.w	$2901,$fffe
	dc.w	color+12,$f10
	dc.w	color+14,$fc0
	dc.w	$2a01,$fffe
	dc.w	color+12,$f20
	dc.w	color+14,$fe0
	dc.w	$2b01,$fffe
	dc.w	color+12,$f10
	dc.w	color+14,$ff0

	dc.l	0	;Ende der Copperliste
*
* Schuß-Sprites
*
sch1sprite: dc.b 0,0,$23,0
 dc.w $1000,$1000,$2800,$3800,$2800,$3800,$5400,$6C00
 dc.w $5400,$6C00,$BA00,$C600,$BA00,$C600,$BA00,$C600
 dc.w $BA00,$C600,$BA00,$C600,$BA00,$C600,$BA00,$C600
 dc.w $5400,$6C00,$5400,$6C00,$5400,$6C00,$5400,$6C00
 dc.w $5400,$6C00,$5400,$6C00,$5400,$6C00,$2800,$3800
 dc.w $2800,$3800,$2800,$3800,$2800,$3800,$2800,$3800
 dc.w $2800,$3800,$2800,$3800,$1000,$1000,$1000,$1000
 dc.w $1000,$1000,$1000,$1000,$1000,$1000,$1000,$1000
 dc.w $1000,$1000,$1000,$1000,$1000,$1000
 dc.l 0
sch2sprite: dc.b 0,0,$23,0
 dc.w $1000,$1000,$2800,$3800,$2800,$3800,$5400,$6C00
 dc.w $5400,$6C00,$BA00,$C600,$BA00,$C600,$BA00,$C600
 dc.w $BA00,$C600,$BA00,$C600,$BA00,$C600,$BA00,$C600
 dc.w $5400,$6C00,$5400,$6C00,$5400,$6C00,$5400,$6C00
 dc.w $5400,$6C00,$5400,$6C00,$5400,$6C00,$2800,$3800
 dc.w $2800,$3800,$2800,$3800,$2800,$3800,$2800,$3800
 dc.w $2800,$3800,$2800,$3800,$1000,$1000,$1000,$1000
 dc.w $1000,$1000,$1000,$1000,$1000,$1000,$1000,$1000
 dc.w $1000,$1000,$1000,$1000,$1000,$1000
 dc.l 0
bosprtab:
 dc.l bo1sprite,bo2sprite,bo3sprite,bo4sprite
bo1sprite: dc.b 0,0,$11,0
 dc.w $B400,$CC00,$4800,$7800,$3000,$3000,$4800,$7800
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$4800,$7800
 dc.w $3000,$3000
 dc.l 0
bo2sprite: dc.b 0,0,$11,0
 dc.w $B400,$CC00,$4800,$7800,$3000,$3000,$4800,$7800
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$4800,$7800
 dc.w $3000,$3000
 dc.l 0
bo3sprite: dc.b 0,0,$11,0
 dc.w $B400,$CC00,$4800,$7800,$3000,$3000,$4800,$7800
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$4800,$7800
 dc.w $3000,$3000
 dc.l 0
bo4sprite: dc.b 0,0,$11,0
 dc.w $B400,$CC00,$4800,$7800,$3000,$3000,$4800,$7800
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$B400,$CC00
 dc.w $B400,$CC00,$B400,$CC00,$B400,$CC00,$4800,$7800
 dc.w $3000,$3000
 dc.l 0
*
* Allgemeine Daten & Variablen
*
gfxname:	dc.b	'graphics.library',0
trackdiskname:	dc.b	'trackdisk.device',0
		cnop	0,2
file1ptr:	dc.l	stars.pic
file2ptr:	dc.l	abc.pic
file3ptr:	dc.l	mask.pic
diskio:		ds.b	20
diskrep:	ds.b	8
charx:		dc.w	320
txtptr:		dc.l	txt
oldcprlist:	dc.l	0
	dc.l	0
alclrmask:	dc.l	$ffffffff,$fc000000
*
* BitMaps
*
bitmap1:	ds.b	$28	;Hintergrund
bm1rx:		dc.w	0
bm1ry:		dc.w	256
bitmap2:	ds.b	$28	;Text
bm2rx:		dc.w	0
bm2ry:		dc.w	0
bitmap3:	ds.b	$28	;Raumschiff
bm3rx:		dc.w	128
bm3ry:		dc.w	0
bitmap4:	ds.b	$28	;Aliens
bm4rx:		dc.w	0
bm4ry:		dc.w	0
bitmap5:	ds.b	$28	;Buchstaben-Bild
bitmap6:	ds.b	$28	;Maske
*
* Spiel-Variablen
*
sch1x:		dc.w	0	;-20=weg
sch2x:		dc.w	0	;-20=weg
schy:		dc.w	0	;<=-16: beide weg
alnum:		dc.w	2	;Anzahl Aliens
alvx:		dc.w	1	;Alien-Flugrichtung
butstat:	dc.w	0
boxy:		ds.l 	6	;Bomben-XY-Tabelle; 0=weg
plex:		dc.w 	0	;Spieler-Explosionsphase
alxy:		ds.l	20	;Alien-XY-Tabelle
alex:		ds.w	20	;Alien-Expl.-Phase
alxyptr:	dc.l 	alxy	;Zeiger in XY-Tabelle
alxytabptr:	dc.l	alxytab	;Z. in Formationstab.
alctr:		dc.w	0	;Zähler
alxytab:
	dc.w	13
	dc.w	40,2,80,2,120,2,160,2,200,2,240,2,280,2
	dc.w	60,34,100,34,140,34,180,34,220,34,260,34
	dc.w	13
	dc.w	60,2,100,2,140,2,180,2,220,2,260,2
	dc.w	40,34,80,34,120,34,160,34,200,34,240,34,280,34
	dc.w	10
	dc.w	40,2,160,18,280,2
	dc.w	40,34,80,34,120,34,160,50,200,34,240,34,280,34
	dc.w	11
	dc.w	40,28,80,10,80,46,120,6,120,50
	dc.w	160,2,200,6,200,50,240,10,240,46,280,28
	dc.w	0
*
* Scroll-Text
*
txt:	dc.b	'                        '
	dc.b	'hello amiga-freaks!    this is the one-and-only copperkilling '
	dc.b	'and blitterbreaking world famous anti-atari-invader demo!!! '
	dc.b	'     written by j. schmidt in 1988 '
	dc.b	'     press mouse button or return to stop the show... '
	dc.b	'     and now... take your joystick and shoot them up!!! '
	dc.b	0
	cnop	0,2

	bss
workspace:
	ds.l	$c000

	end
