; ---------------------------------------------------------------------
;
;	the official Kickstart-game, part five !
;
;	code and comments by Martin Silbernagl
;
;	graphics by Sebastian Dosch
;
;	last revision: 16/01/1989
;
; ---------------------------------------------------------------------

DMACONR		EQU	$DFF002
JOY0DAT		EQU	$DFF00A
JOY1DAT		EQU	$DFF00C
INTREQR		EQU	$DFF01E
INTENAR		EQU	$DFF01C
BLTCON0		EQU	$DFF040
BLTCON1		EQU	$DFF042
BLTAFWM		EQU	$DFF044
BLTALWM		EQU	$DFF046
BLTCPTH		EQU	$DFF048
BLTBPTH		EQU	$DFF04C
BLTAPTH		EQU	$DFF050
BLTDPTH		EQU	$DFF054
BLTSIZE		EQU	$DFF058
BLTCMOD		EQU	$DFF060
BLTBMOD		EQU	$DFF062
BLTAMOD		EQU	$DFF064
BLTDMOD		EQU	$DFF066
DIWSTRT		EQU	$DFF08E
DIWSTOP		EQU	$DFF090
DDFSTRT		EQU	$DFF092
DDFSTOP		EQU	$DFF094
DMACON		EQU	$DFF096
INTENA		EQU	$DFF09A
INTREQ		EQU	$DFF09C
ADKCON		EQU	$DFF09E
AUD0LCH		EQU	$DFF0A0
AUD0LEN		EQU	$DFF0A4
AUD0PER		EQU	$DFF0A6
AUD0VOL		EQU	$DFF0A8
BPL1PT		EQU	$DFF0E0
BPLCON0		EQU	$DFF100
BPLCON1		EQU	$DFF102
BPLCON2		EQU	$DFF104
BPL1MOD		EQU	$DFF108
BPL2MOD		EQU	$DFF10A
COLOR00		EQU	$DFF180
VHPOSR		EQU	$DFF006

CIAA_PRA	EQU	$BFE001
CIAA_TALO	EQU	$BFE401
CIAA_TAHI	EQU	$BFE501
CIAA_TBLO	EQU	$BFE601
CIAA_TBHI	EQU	$BFE701

CIAA_SDR	EQU	$BFEC01
CIAA_ICR	EQU	$BFED01
CIAA_CRA	EQU	$BFEE01
CIAA_CRB	EQU	$BFEF01

_LVOAllocMem		EQU	-$0c6	; exec LVOs
_LVOFreeMem		EQU	-$0d2
_LVOOpenLibrary		EQU	-$228
_LVOCloseLibrary	EQU	-$19e
_LVOOpen		EQU	-$01e	; dos LVOs
_LVOClose		EQU	-$024
_LVORead		EQU	-$02a
_LVOSeek		EQU	-$042
_LVODisplayAlert	EQU	-$05a	; intuition LVOs

TITLE_P	EQU	40*200			; Größe einer Titelbild-Plane
TITLE	EQU	TITLE_P*5		; Größe des Titelbildes
FIELD_B	EQU	48			; Bytes pro Zeile beim Titelbild
FIELD_H	EQU	288+32			; Höhe des Spielfeldes
FIELD_P	EQU	FIELD_B*FIELD_H		; Größe einer Spielfeld-Plane
FIELD_O	EQU	FIELD_P*7		; Größe eines Spielfeldes
FIELD	EQU	FIELD_O*2		; Größe der zwei Spielfelder
LINES	EQU	4			; Zeilen zwischen zwei Sternen
STARS	EQU	FIELD_H/LINES		; maximale Anzahl der Sterne
SHIP_W	EQU	3			; Breite des Schiffs in Words
SHIP_B	EQU	SHIP_W*2		; Breite des Schiffs in Bytes
SHIP_H	EQU	18			; Höhe des Schiffs
SHIP_P	EQU	SHIP_H*SHIP_B		; Größe einer Plane
SH_BLIT	EQU	SHIP_H*64+SHIP_W	; Blitter"SIZE" des Schiffs
XSPEED	EQU	4			; Geschwindigkeit des Raumschiffs
YSPEED	EQU	3			; Geschwindigkeit des Raumschiffs
LENGTH	EQU	8192			; Buffergröße festlegen
SHOOT_M	EQU	8			; Maximale Anzahl der Schüsse
SHOOT_W	EQU	2			; Breite des Schusses in Words
SHOOT_B	EQU	SHOOT_W*2		; Breite des Schusses in Bytes
SHOOT_H	EQU	1			; Höhe des Schusses
SHOOT_P	EQU	SHOOT_H*SHOOT_B		; Größe einer Plane
SHOOT_X	EQU	(SHIP_W-1)*16		; rel. Pos. des Schusses: X-Wert
SHOOT_Y	EQU	SHIP_H/2		; rel. Pos. des Schusses: Y-Wert
SHOOT_S	EQU	8			; Geschwindigkeit der Schüsse
SO_BLIT	EQU	SHOOT_H*64+SHOOT_W	; Blitter"SIZE" des Schusses
ENEMY_N	EQU	4+7			; Anzahl der Angreiferphasen
ENEMY_W	EQU	2			; Breite des Angreifers in Words
ENEMY_B	EQU	ENEMY_W*2		; Breite des Angreifers in Bytes
ENEMY_H	EQU	16			; Höhe des Angreifers
ENEMY_P	EQU	ENEMY_H*ENEMY_B		; Größe einer Plane
EN_BLIT	EQU	ENEMY_H*64+ENEMY_W	; Blitter"SIZE" des Angreifers
EN_M	EQU	16			; Maximale Anzahl der Angreifer
EXP_ST	EQU	6			; erste Explosionsanimationsphase
EXP_ED	EQU	EXP_ST+6		; letzte Explosionsanimationsphase
MAXX_SO	EQU	8*(FIELD_B-SHOOT_B+2)-1	; Maximaler X-Bereich des Schusses
MAXX	EQU	320			; Maximale X-Position des Schiffs
MAXY	EQU	288			; Maximale Y-Position des Schiffs
MINX	EQU	32			; Minimale X-Position des Schiffs
MINY	EQU	32			; Minimale Y-Position des Schiffs
BOBS	EQU	6*(SHIP_P+SHOOT_P+ENEMY_N*ENEMY_P)


START:
	MOVEM.L	D0-D7/A0-A6,-(A7)       ; Alle Register auf den Stack legen

	MOVEA.L	4,A6			; Adresse der exec-library holen
	MOVE.L	#TITLE+FIELD+BOBS,D0	; Speichergröße nach D0
	MOVE.L	#ADSR1,D1		; Ende der letzten Wellenform
	SUB.L	#WAVE1,D1		; davon Anfang der ersten abziehen
	ADD.L	D1,D0			; gesamten Speicherbedarf errechnen
	MOVE.L	#$10002,D1		; CLEAR und CHIP soll es sein
	JSR	_LVOAllocMem(A6)	; Speicher holen
	TST.L	D0			; Speicher bekommen ?
	BNE.S	OK1			; wenn ja, dann nach OK1 springen
	MOVE.W	#0,ERRORN		; Fehler #0
	JSR	ERRORS			; Alert ausgeben
	JMP	END1			; Programm beenden
OK1:	MOVE.L	D0,TITLE_BASE		; Adresse des Speichers abspeichern
	ADDI.L	#TITLE,D0		; Größe des Bildes dazurechnen
	MOVE.L	D0,FIELD_BASE		; Adresse des Speichers abspeichern
	ADDI.L	#FIELD,D0		; Größe des Bildes dazurechnen
	MOVE.L	D0,BOB_BASE		; Adresse des Speichers abspeichern
	ADDI.L	#BOBS,D0		; Größe der Blitter-Objects dazu
	MOVE.L	D0,WAVE_BASE		; Adresse des Speichers abspeichern

	MOVE.L	#BOBS,D0		; Speicherbedarf der BOBS
	LEA	SHIP_DATA,A0		; Anfang der Daten
	MOVEA.L	BOB_BASE,A1		; Adresse des Chip-Mems
COPY_BOBS:
	MOVE.B	(A0)+,(A1)+		; ein Byte kopieren
	DBRA	D0,COPY_BOBS		; Schleife machen

	MOVE.W	#ENEMY_N,D0		; Anzahl der Eintragungen holen
	MOVE.L	BOB_BASE,D1		; Adresse des Bob-Chip-Mems
	LEA	EN_GFX+4,A0		; Adresse der Animationsadressen
ADD_BASE:
	ADD.L	D1,(A0)+		; Offset addieren
	DBRA	D0,ADD_BASE		; Schleife machen

	MOVE.L	#ADSR1,D0		; Ende der letzten Wellenform
	SUB.L	#WAVE1,D0		; davon Anfang der ersten abziehen
	SUBQ	#1,D0			; zum Schleifenzähler machen
	LEA	WAVE1,A0		; Anfang der ersten Wellenform
	MOVEA.L	WAVE_BASE,A1		; Adresse des Chip-Mems
COPY_WAVES:
	MOVE.B	(A0)+,(A1)+		; ein Byte kopieren
	DBRA	D0,COPY_WAVES		; Schleife machen

	MOVE.W	NUM_OF_WAVES,D0		; Anzahl der Wellenformen holen
	MOVE.L	#WAVE1,D1		; Adresse des Chip-Mems
	SUB.L	WAVE_BASE,D1		; Offset berechnen
	LEA	WAVES,A0		; Adresse der Waveadressen
SUB_OFFSET:
	SUB.L	D1,(A0)+		; Offset wegnehmen
	DBRA	D0,SUB_OFFSET		; Schleife machen

	MOVEA.L	4,A6			; ExecBase nach A6
	LEA	DOS_NAME,A1		; Name der Library nach A1
	MOVEQ	#0,D0			; Version Number 0
	JSR	_LVOOpenLibrary(A6)	; DOS-Library öffnen
	TST.L	D0			; konnte sie nicht geöffnet werden?
	BNE.S	OK2			; wenn doch, dann nach OK2 springen
	MOVE.W	#1,ERRORN		; Fehler #1
	JSR	ERRORS			; Alert ausgeben
	JMP	END2			; Programm beenden
OK2:	MOVE.L	D0,DOS_BASE		; Adresse der DOS-library speichern

 	LEA	TITLE_NAME,A0		; Name des Titelbildes
	MOVEA.L	TITLE_BASE,A5		; Adresse des Videospeichers
	MOVE.L	#320,D6			; gewünschte Breite
	MOVE.L	#200,D7			; gewünschte Höhe
	JSR	LOAD_IFF		; IFF-Bild einladen

	LEA	IFF_COLORS,A0		; Adresse der Quellcolormap
	LEA	TITLE_CMAP,A1		; Adresse der Zielcolormap
	MOVEQ	#31,D0			; 32 mal kopieren
COPY_CMAP1:
	MOVE.W	(A0)+,(A1)+		; eine Farbe kopieren
	DBRA	D0,COPY_CMAP1		; Schleife machen

	MOVEQ	#61,D0			; Schleife 62 mal durchlaufen
	LEA	PAGE0,A0		; Basis des Zwischenspeichers nach A0
	LEA	8,A1			; Basis der Vektorentabelle nach A1
LOOP1:	MOVE.L	(A1)+,(A0)+		; jeweils einen Vektor kopieren
	DBRA	D0,LOOP1		; D0=-1? Wenn nicht, dann loop1

	JSR	INIT_STARS		; Tabellen aufbauen

	JSR	WAIT_BLT		; auf möglichen Blit vom BS warten

MAIN:
	MOVE.L	#MAIN,$0020		; MAIN to Priv._Viol._Vektor
	MOVE.W	#$2700,SR		; Supervisor=1, Interruptlevel=7
	ADDA.L	#6,A7			; A7 auf alten Inhalt zurücksetzen

	MOVE.L	A7,ADR7			; Inhalt von A7 zwischenspeichern
	LEA	STACK,A7		; Supervisor-Stackptr. neu setzten

	MOVE.W	INTENAR,INTENA_BUF	; Int-Kontrollregister zwischenspeichern
	MOVE.W	DMACONR,DMACON_BUF	; DMA-Kontrollregister zwischenspeichern

	MOVE.B	#$08,CIAA_TAHI		; Timer A auf $0800 setzen
	MOVE.B	#$00,CIAA_TALO		; Timer A auf $0800 setzen
	MOVE.B	#$10,CIAA_TBHI		; Timer B auf $1000 setzen
	MOVE.B	#$00,CIAA_TBLO		; Timer B auf $1000 setzen
	MOVE.B	CIAA_CRA,CIAA_CRA_BUF	; Register zwischenspeichern
	MOVE.B	CIAA_CRB,CIAA_CRB_BUF	; Register zwischenspeichern
	MOVE.B	#%10010001,CIAA_CRA	; Steuerbits neu setzen (Timer A)
	MOVE.B	#%00010001,CIAA_CRB	; Steuerbits neu setzen (Timer B)
	MOVE.B	#$8b,CIAA_ICR		; SP, TA und TB Interrupt erlauben

	MOVE.W	#$00ff,ADKCON		; keine Modulationen
	MOVE.W	#$ffff,BLTAFWM		; Blitter: keine Maske beim 1. Word
	MOVE.W	#$ffff,BLTALWM		; Blitter: keine Maske beim letzte W.

	MOVE.L	FIELD_BASE,A0		; Adresse des Spielfeldes holen
	MOVE.L	A0,FIELD_BASE1		; Adresse des ersten Spielfeldes 
	MOVE.L	A0,SH_LAST		; Dummy-Adresse für den Blitter
	ADDA.L	#FIELD_O,A0		; Platz für ein Feld dazu 
	MOVE.L	A0,FIELD_BASE2		; Adresse des zweiten Spielfeldes 
	MOVE.L	A0,SH_BE_LAST		; Dummy-Adresse für den Blitter

	MOVE.W	#$2000,SR		; Supervisor=1, Interruptlevel=0

START_OVER:
	MOVE.L	#PORTS,$68		; Vektor Int.-Level 2 auf PORTS umbiegen
	MOVE.L	#VERTB,$6C		; Vektor Int.-Level 3 auf VERTB umbiegen
	MOVE.W	#$7fff,INTENA		; Alle Ints. ausschalten
	MOVE.W	#$C028,INTENA		; PORTS- und VERB-Int. erlauben
	MOVE.W	#$7ff0,DMACON		; Alle DMA ausschalten
	MOVE.W	#$830f,DMACON		; DMAEN und BPLEN anschalten

	LEA	TITLE_CMAP,A0		; Adresse der Quellcolormap
	JSR	COPY_COLORS		; Farben setzen

	MOVE.W	#$5200,BPLCON0		; 5 Bitplanes und Colorburst
	MOVE.W	#$0000,BPLCON1		; Scrollregister auf Null setzen
	MOVE.W	#$0000,BPLCON2		; Prioritäten normal setzen

	MOVE.W	#0,BPL1MOD		; kein Modulo setzen
	MOVE.W	#0,BPL2MOD		; kein Modulo setzen

	MOVE.W	#$2c81,DIWSTRT		; linke, obere Ecke setzen
	MOVE.W	#$f4c1,DIWSTOP		; rechte, untere Ecke setzen
	MOVE.W	#$0038,DDFSTRT		; data-fetch-start definieren
	MOVE.W	#$00d0,DDFSTOP		; data-fetch-start definieren

	JSR	WAIT_JOYSTICK		; auf Knopfdruck warten

MAIN_INIT:
	MOVE.L	#MAIN_LOOP,MAIN_JMP+2	; Vektor der Hauptschleife zurücksetzen
	MOVE.L	#PORTS_M,$68		; Vektor Int.-Level 2 auf PORTS_M
	MOVE.L	#VERTB_M,$6C		; Vektor Int.-Level 3 auf VERTB_M
	MOVE.W	#$7fff,INTENA		; Alle Ints. ausschalten
	MOVE.W	#$C028,INTENA		; PORTS- und VERB-Int. erlauben
	MOVE.W	#$7fff,DMACON		; Alle DMA ausschalten
	MOVE.W	#$8740,DMACON		; BLTPRI,DMAEN,BPLEN & BLTEN setzen

	LEA	MAIN_CMAP,A0		; Adresse der Quellcolormap
	JSR	COPY_COLORS		; Farben setzen

	MOVE.W	#$5200,BPLCON0		; 5 Bitplanes und Colorburst
	MOVE.W	#$0000,BPLCON1		; Scrollregister auf Null setzen
	MOVE.W	#$0000,BPLCON2		; Prioritäten normal setzen

	MOVE.W	#4,BPL1MOD		; Modulo setzen
	MOVE.W	#4,BPL2MOD		; Modulo setzen

	MOVE.W	#$1671,DIWSTRT		; linke, obere Ecke setzen
	MOVE.W	#$36d1,DIWSTOP		; rechte, untere Ecke setzen
	MOVE.W	#$0030,DDFSTRT		; data-fetch-start definieren
	MOVE.W	#$00d8,DDFSTOP		; data-fetch-start definieren

	MOVE.L	#INIT_ENEMYS1,MOVE_ENEMYS+2 ; Vektor verbiegen	

MAIN_LOOP:
WT_V:	JMP	W_OFF
W_ON:	MOVEQ	#2,D1
TST2:	MOVE.W	#$ffff,D0
TST1:	DBRA	D0,TST1
	DBRA	D1,TST2
W_OFF:

	MOVEA.L	FIELD_BASE1,A0		; Adresse des ersten Spielfeldes
	MOVE.L	FIELD_BASE2,FIELD_BASE1	; Adresse des zweiten kopieren
	MOVE.L	A0,FIELD_BASE2		; Vertauschung vollenden

;	MOVE.W	#$f,COLOR00
	JSR	DEL_STARS		; Sterne löschen
;	MOVE.W	#$f0,COLOR00
	JSR	DEL_SHOOTS		; Schüsse löschen
;	MOVE.W	#$ff,COLOR00
	JSR	DEL_SHIP		; Schiff löschen
;	MOVE.W	#$f00,COLOR00
	JSR	DEL_ENEMYS		; Angreifer löschen

;	MOVE.W	#$f0f,COLOR00
	JSR	MOVE_STARS		; Sterne bewegen
;	MOVE.W	#$ff0,COLOR00
	JSR	MOVE_SHOOTS		; Schüsse bewegen
;	MOVE.W	#$fff,COLOR00
	JSR	MOVE_SHIP		; Schiff bewegen
;	MOVE.W	#$08f,COLOR00
	JSR	MOVE_ENEMYS		; Angreifer bewegen

;	MOVE.W	#$0,COLOR00

	MOVE.L	#MAIN_WAIT,MAIN_WAIT+2	; Vektor setzen
MAIN_WAIT:
	JMP	MAIN_WAIT		; auf VERTB warten
MAIN_JMP:
	JMP	MAIN_LOOP		; Hauptschleife



; ---------------------------------------------------------------------
;
; Ab hier wird das Betriebssystem (exec usw.) wieder eingeschaltet.
;
; ---------------------------------------------------------------------

ENDING:
	JSR	WAIT_BLT		; auf Ende eines mögl. Blits warten

	MOVE.W	#$2700,SR		; auf höchste Int. Ebene setzen
	ORI.W	#$8000,INTENA_BUF	; Set-Bit im Zwischenspeicher setzen
	MOVE.W	#$7fff,INTENA		; alle Ints. verbieten
	MOVE.W	INTENA_BUF,INTENA	; alte Interrupts setzen

	ORI.W	#$8000,DMACON_BUF	; Set-Bit im Zwischenspeicher setzen
	MOVE.W	#$7fff,DMACON		; alle Ints. verbieten
	MOVE.W	DMACON_BUF,DMACON	; alte Interrupts setzen

	MOVE.B	CIAA_CRA_BUF,CIAA_CRA	; Steuerregister restaurieren
	MOVE.B	CIAA_CRB_BUF,CIAA_CRB	; Steuerregister restaurieren

	MOVEQ	#61,D0			; 62 Werte kopieren
	LEA	PAGE0,A0		; Basis des Zwischenspeichers nach A0
	LEA	8,A1			; Basis der Vektorentabelle nach A1
LOOP2:
	MOVE.L	(A0)+,(A1)+		; jeweils einen Vektor kopieren
	DBRA	D0,LOOP2		; D0=-1? Wenn nicht, dann loop2

	MOVEA.L	ADR7,A7			; alten Stackpointer wieder holen

	MOVE.W	#$0000,SR		; Supervisor=0, Interruptlevel=0
END3:
	MOVEA.L	4,A6			; Basis der exec-Library holen
	MOVEA.L	DOS_BASE,A1		; Pointer auf DOS-Library holen
	JSR	_LVOCloseLibrary(A6)	; Bibliothek schliessen
END2:
	MOVEA.L	4,A6			; Basis der exec-Library holen
	MOVEA.L	TITLE_BASE,A1		; Basis nach A1 holen
	MOVE.L	#TITLE+FIELD+BOBS,D0	; Grösse nach D0
	MOVE.L	#ADSR1,D1		; Ende der letzten Wellenform
	SUB.L	#WAVE1,D1		; davon Anfang der ersten abziehen
	ADD.L	D1,D0			; gesamten Speicherbedarf errechnen
	JSR	_LVOFreeMem(A6)		; Speicher freigeben
END1:	MOVEM.L	(A7)+,D0-D7/A0-A6	; Alle Register vom Stack
	RTS				; Und das Pgm beenden


; ---------------------------------------------------------------------
;
; Die Routine Ports wird angesprungen, wenn der CIA_A einen Interrupt
; fordert. Dies kann unter anderem dann geschehen, wenn von der Tas-
; tatur ein Byte gesendet wird.
;
; ---------------------------------------------------------------------

PORTS:					; Server von Interrupt-Level 2
	MOVE.W	#$0008,INTREQ		; Interrupt-Bit wieder zurücksetzen
	MOVE.W	D0,-(A7)		; D0 auf den Stack
	MOVE.B	CIAA_ICR,D0		; Interruptregister auslesen

	BTST	#3,D0			; SP-Bit gesetzt ?
	BEQ.S	NO_SP			; wenn nicht, dann andere Bits
	JSR	KEY_WORX		; Tastatur abfragen
NO_SP:
	BTST	#0,D0			; TA-Bit gesetzt ?
	BEQ.S	NO_TA			; wenn nicht, mir egal
	JSR	PLAYER			; Musik spielen
NO_TA:
	BTST	#1,D0			; TB-Bit gesetzt ?
	BEQ.S	NO_TB			; wenn nicht, dann Ende
	JSR	DO_ADSR			; Hüllkurve produzieren
NO_TB:
	MOVE.W	(A7)+,D0		; D0 vom Stack
	RTE				; Rückkehr auf andere Ebene

PORTS_M:					; Server von Interrupt-Level 2
	MOVE.W	#$0008,INTREQ		; Interrupt-Bit wieder zurücksetzen
	MOVE.W	D0,-(A7)		; D0 auf den Stack
	MOVE.B	CIAA_ICR,D0		; Interruptregister auslesen
	BTST	#3,D0			; SP-Bit gesetzt ?
	BEQ.S	NO_SP_M			; wenn nicht, dann andere Bits
	JSR	KEY_WORX		; Tastatur abfragen
NO_SP_M:
	MOVE.W	(A7)+,D0		; D0 vom Stack
	RTE				; Rückkehr auf andere Ebene

KEY_WORX:
	MOVEM.L	D0-D2/A0,-(A7)		; D0-D2 und A0 auf den Stack
	MOVE.B	CIAA_SDR,D0		; Inhalt Serielles Datenregister
	ORI.B	#64,CIAA_CRA		; Serial-Port auf Output setzen
	MOVEQ	#60,D1			; Schleife 60 mal durchlaufen
KBRD_LOW:
	CLR.B	CIAA_SDR		; Auf Null setzen
	DBRA	D1,KBRD_LOW		; Schleife machen
	NOT.B	D0			; Erhaltene Daten invertieren
	ROR.B	#1,D0			; Bits in richtige Reihenfolge bringen
	AND.B	#$BF,CIAA_CRA		; Serial-Port auf Input setzen

	CMP.B	#$F9,D0			; Letzter Keycode schlecht ?
	BNE.S	LAST_GOOD		; wenn nicht, dann nach last_good
	BRA	END_PORTS		; sonst den Interrupt beenden
LAST_GOOD:

	TST.B	PASS_CNT		; Password schon eingegeben ?
	BEQ.S	PLUS_PASS		; wenn ja, dann nach plus_pass
	CMP.B	#$7f,D0			; Eine losgelassene Taste ?
	BHI	REGULAR_KEYS		; wenn ja, dann nach regular_keys
	MOVEA.L	PASS_PTR,A0		; Zeiger auf akt. Buchstaben
	CMP.B	(A0)+,D0		; gedr. Taste gleich (A0) ?
	BEQ.S	NEXT_OK			; wenn ja, dann nach next_ok
	MOVE.B	#14,PASS_CNT		; wenn nicht, Zaehler zuruecksetzen
	MOVE.L	#PASS_WORD,PASS_PTR	; Zeiger zuruecksetzen
	BRA	REGULAR_KEYS		; und beenden
NEXT_OK:
	MOVE.L	A0,PASS_PTR		; neue Adr. zurueckschreiben
	SUBQ.B	#1,PASS_CNT		; Zaehler erniedrigen
	BNE	END_PORTS		; Zaehler versch. Null -> end_ports

PLUS_PASS:
	LEA	PASS_KEY_TABLE,A0	; Adresse der Sprungtabelle nach A0
	MOVEQ	#0,D1			; D1 auf 32-Bit 0 setzen
	MOVE.B	D0,D1			; Key-Code kopieren
	LSL.W	#2,D1			; Inhalt von D1 vervierfachen
	MOVEA.L	0(A0,D1),A0		; Zeiger auf Adresse der Routine
	JMP	(A0)			; zur berechneten Key-Routine springen

RK:					; kuerzeres Label fuer REGULAR_KEYS
	NOP				; steht nur zur Zierde hier
REGULAR_KEYS:
	LEA	KEY_TABLE,A0		; Adresse der Sprungtabelle nach A0
	MOVEQ	#0,D1			; D1 auf 32-Bit 0 setzen
	MOVE.B	D0,D1			; Key-Code kopieren
	LSL.W	#2,D1			; Inhalt von D1 vervierfachen
	MOVEA.L	0(A0,D1),A0		; Zeiger auf Adresse der Routine
	JMP	(A0)			; zur berechneten Key-Routine springen

EP:					; kuerzeres Label fuer END_PORTS
	NOP				; steht auch hier nur zur Zierde
END_PORTS:
	MOVEM.L	(A7)+,D0-D2/A0		; D0-D2 und A0 vom Stack holen
	RTS				; return to where we came from

PASS_PTR:	DC.L	PASS_WORD
PASS_CNT:	DC.B	14
SHIFT:		DC.B	0
PASS_WORD:
	DC.B	$13,$12,$20,$22,$40,$27,$17,$33,$27,$21,$14,$20,$13,$14
		; r   e   a   d       k   i   c   k   s   t   a   r   t
	EVEN

PASS_KEY_TABLE:
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $00-$0f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $10-$1f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $20-$2f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $30-$3f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $40-$4f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,HE	; $50-$5f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $60-$6f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $70-$7f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $80-$8f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $90-$9f
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $a0-$af
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $b0-$bf
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $c0-$cf
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $d0-$df
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $e0-$ef
	DC.L	RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK,RK	; $f0-$ff
	
KEY_TABLE:
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $00-$0f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $10-$1f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $20-$2f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $30-$3f
	DC.L	EP,EP,EP,EP,EP,ES,DE,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $40-$4f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $50-$5f
	DC.L	SD,SD,SD,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $60-$6f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $70-$7f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $80-$8f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $90-$9f
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $a0-$af
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $b0-$bf
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $c0-$cf
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $d0-$df
	DC.L	SU,SU,SU,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $e0-$ef
	DC.L	EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP,EP	; $f0-$ff



; ---------------------------------------------------------------------
;
; Ab hier stehen die Routinen, die durch einen Tastendruck aufgerufen
; werden, auch wenn noch kein Password eingegeben wurde.
;
; ---------------------------------------------------------------------

ES:					; Wird bei esc (=$45) aufgerufen
	JMP	ENDING			; beenden

SD:					; Wird bei Shift down aufgerufen
	MOVE.L	#W_ON,WT_V+2		; Auf Langsam stellen
	ADDQ.B	#1,SHIFT		; Shift-Zaehler um eins erhoehen
	JMP	END_PORTS		; und zurueck

SU:					; Wird bei Shift release aufgerufen
	MOVE.L	#W_OFF,WT_V+2		; Auf Schnell stellen
	SUBQ.B	#1,SHIFT		; Shift-Zaehler um eins erniedrigen
	JMP	END_PORTS		; und zurueck

DE:					; wird bei del (=$46) augerufen
	MOVE.L	#START_OVER,MAIN_JMP+2	; Vektor der Hauptschleife verbiegen
	JMP	END_PORTS		; und zurueck



; ---------------------------------------------------------------------
;
; Ab hier stehen die Routinen, die durch einen Tastendruck aufgerufen
; werden, aber nur wenn das Password eingegeben wurde.
;
; ---------------------------------------------------------------------

HE:					; wird durch Help down aufgerufen
	BCHG	#1,CIAA_PRA		; Led-Status umschalten
	JMP	END_PORTS		; Ruecksprung



; ---------------------------------------------------------------------
;
; Ab hier stehen die Vertical-Blanking-Interrupts
; Der Vertb-Int. wird am aAnfang jedes Videobildes aufgerufen
;
; ---------------------------------------------------------------------

VERTB:
	MOVE.W	#$0020,INTREQ		; Request-Bit loeschen
	MOVEM.L	D0-D1/A0,-(A7)		; Register auf den Stack legen
	MOVEQ	#4,D0			; 5 Bitmapointer sind zu setzen
	MOVE.L	TITLE_BASE,D1		; Adresse des Titelbildes
	LEA	BPL1PT,A0		; Adresse des ersten Registers
SET_TITLE:
	MOVE.L	D1,(A0)+		; Adresse der Plane setzen
	ADDI.L	#TITLE_P,D1		; eine Plane dazuaddieren
	DBRA	D0,SET_TITLE		; naechste plane setzen
	MOVEM.L	(A7)+,D0-D1/A0		; Register vom Stack holen
	RTE

VERTB_M:
	MOVE.W	#$0020,INTREQ		; Request-Bit loeschen
	MOVEM.L	D0-D3/A0,-(A7)		; Register auf den Stack legen
	MOVEQ	#4,D0			; 5 Bitmapointer sind zu setzen
	MOVE.L	FIELD_BASE1,D1		; Adresse des Spielfeldes
	ADDI.L	#FIELD_B*16+2,D1	; Offset dazuaddieren
	LEA	BPL1PT,A0		; Adresse des ersten Registers
SET_FIELD:
	MOVE.L	D1,(A0)+		; Adresse der Plane setzen
	ADDI.L	#FIELD_P,D1		; eine Plane dazuaddieren
	DBRA	D0,SET_FIELD		; naechste plane setzen
	MOVE.L	#MAIN_JMP,MAIN_WAIT+2	; Vektor setzen

	MOVEM.L	(A7)+,D0-D3/A0		; Register vom Stack holen
	RTE




; ---------------------------------------------------------------------
;
; Ab hier steht die Fehlerausgaberoutine
;
; ---------------------------------------------------------------------

ERRORS:
	MOVEA.L	4,A6			; ExecBase nach A6
	LEA	INTUI_NAME,A1		; Name der Library nach A1
	MOVEQ	#0,D0			; Version Number 0
	JSR	_LVOOpenLibrary(A6)	; Intuition-Library oeffnen
	TST.L	D0			; Nicht moeglich zu oeffnen ?
	BNE.S	OK_ERR			; wenn doch, dann ok_err
	RTS
OK_ERR:
	MOVE.L	D0,INTUI_BASE		; Adresse abspeichern
	MOVEA.L	D0,A6			; Adresse kopieren
	MOVEQ	#0,D0			; Alert Nummer 0
	MOVE.W	ERRORN,D2		; Nummer des Alerts holen	
	LSL.L	#2,D2			; D2 auf Word-Offset bringen
	LEA	ALERTS,A1		; Adresse der Vektor-table nach A1
	ADDA.L	D2,A1			; Adresse des Vektors nach A1
	MOVEA.L	(A1),A0			; Adresse des Strings nach A0
	MOVE.L	#24,D1			; Hoehe = 24 Punkte
	JSR	_LVODisplayAlert(A6)	; Display it !
	MOVEA.L	INTUI_BASE,A1		; intuition's Basis holen
	MOVEA.L	4,A6			; exec's Basis holen		
	JSR	_LVOCloseLibrary(A6)	; Bibliothek schliessen
	RTS



; ---------------------------------------------------------------------
;
; Ab hier steht der IFF-loader
;
; ---------------------------------------------------------------------

LOAD_IFF:				; A0=Name A5=Ziel D6=X D7=Y
	JSR	OPEN_IFF		; oeffne das file
	JSR	READ_LONG		; lese ein Langwort nach D0
	CMP.L	#"FORM",D0		; FORM-Chunk?
	BEQ.S	FORM_FOUND		; wenn ja, dann weitermachen
	MOVEQ	#2,D0			; Fehler Nummer 2
	JMP	IFF_ERROR		; und ausgeben
FORM_FOUND:
	JSR	READ_LONG		; FORM-Laenge ueberlesen
	JSR	READ_LONG		; lese ein Langwort nach D0
	CMP.L	#"ILBM",D0		; ILBM-Chunk?
	BEQ.S	ILBM_FOUND		; wenn ja, dann weitermachen
	MOVEQ	#3,D0			; Fehler Nummer 3
	JMP	IFF_ERROR		; und ausgeben
ILBM_FOUND:
	JSR	READ_LONG		; lese ein Langwort nach D0
	CMP.L	#"BMHD",D0		; BMHD-Chunk?
	BEQ.S	BMHD_FOUND		; wenn ja, dann weitermachen
	JSR	READ_LONG		; Laenge des aktuellen Chunks
	JSR	SKIP_DATA		; aktuellen Chunk ueberspringen
	BRA.S	ILBM_FOUND		; nochmal versuchen
BMHD_FOUND:
	JSR	READ_LONG		; Laenge des Chunks lesen
	LEA	BMHD,A0			; Adresse des Header-Datenfeldes
	JSR	READ_DATA		; Chunk lesen
	MOVE.W	(A0),D2			; Breite aus dem Chunk lesen
	CMP.W	D6,D2			; Bild so breit wie gewuenscht?
	BEQ.S	IFF_X_OK		; wenn ja, dann weiter
	MOVEQ	#4,D0			; Fehler Nummer 4
	JMP	IFF_ERROR		; Alert ausgeben
IFF_X_OK:
	MOVE.W	2(A0),D2		; Hoehe aus dem Chunk lesen
	CMP.W	D7,D2			; Bild so hoch wie gewuenscht?
	BEQ.S	IFF_Y_OK		; wenn ja, dann weiter
	MOVEQ	#5,D0			; Fehler Nummer 5
	JMP	IFF_ERROR		; Alert ausgeben
IFF_Y_OK:
	JSR	READ_LONG		; lese ein Langwort nach D0
	CMP.L	#"CMAP",D0		; CMAP-Chunk?
	BEQ.S	CMAP_FOUND		; wenn ja, dann weitermachen
	JSR	READ_LONG		; Laenge des aktuellen Chunks
	JSR	SKIP_DATA		; aktuellen Chunk ueberspringen
	BRA.S	IFF_Y_OK		; nochmal versuchen
CMAP_FOUND:
	JSR	READ_LONG		; Laenge des Chunks lesen
	LEA	CMAP,A0			; Adresse der Colormap
	JSR	READ_DATA		; Chunk lesen
	MOVEQ	#31,D0			; 32 Werte zu konvertieren
	LEA	IFF_COLORS,A2		; Adresse des Ziels
DO_COLORS:
	MOVE.B	(A0)+,D1		; R-Wert holen
	LSL.W	#4,D1			; R-Wert konvertieren
	MOVE.B	(A0)+,D1		; G-Wert holen
	MOVE.B	(A0)+,D2		; B-Wert holen
	LSR.B	#4,D2			; B-Wert konvertieren
	OR.B	D2,D1			; B-Wert kopieren
	MOVE.W	D1,(A2)+		; Farbwert schreiben
	DBRA	D0,DO_COLORS		; Schleife
SEEK_BODY:
	JSR	READ_LONG		; lese ein Langwort nach D0
	CMP.L	#"BODY",D0		; BODY-Chunk?
	BEQ.S	BODY_FOUND		; wenn ja, dann weitermachen
	JSR	READ_LONG		; Laenge des aktuellen Chunks
	JSR	SKIP_DATA		; aktuellen Chunk ueberspringen
	BRA.S	SEEK_BODY		; nochmal versuchen
BODY_FOUND:

	JSR	READ_LONG		; Chunk-Laenge ueberlesen
	MOVE.B	PLANES,D4		; Anzahl der Planes nach D4
	EXT.W	D4			; auf word bringen
	SUBQ.W	#1,D4			; D4=Schleifenzaehler
	LSR.L	#3,D6			; D6=Bytes pro Zeile
	MOVE.W	D7,D5			; Hoehe kopieren
	MULU	D6,D5			; D5=Bytes pro Plane
	SUBQ.W	#1,D7			; D7=Schleifenzaehler

	CMP.B	#1,COMP			; komprimiertes Format?
	BEQ	IFF_COMP		; wenn ja, nach iff-comp springen
		
	MOVE.L	D6,D0			; Bytes pro Zeile kopieren
UN_DO_IT:
	MOVE.L	D4,D3			; Schleifenzehler kopieren
	MOVEA.L	A5,A0			; Zieladresse kopieren
UN_ONE_LINE:
	JSR	READ_DATA		; Zeile lesen
	ADD.L	D5,A0			; eine plane weiter gehen
	DBRA	D3,UN_ONE_LINE		; alle planes durchgehen
	CMP.B	#1,MASK			; Maskenplane verwendet?
	BNE.S	UN_NO_MASK		; wenn nicht, naechsten Teil auslassen
	JSR	SKIP_DATA		; Maskenplane ueberspringen
UN_NO_MASK:
	ADDA.L	D0,A5			; eine Zeile weiter gehen
	DBRA	D7,UN_DO_IT		; alle Zeilen abarbeiten
	JMP	CLOSE_IFF		; file schliessen und zurueck
IFF_COMP:
	MOVEA.L	A5,A1			; Zieladresse kopieren
	MOVE.L	D4,D3			; Schleifenzaehler kopieren
PK_ONE_LINE:
	MOVEQ	#0,D2			; Zaehler fuer Bytes pro Zeile
	MOVEA.L	A1,A0			; Zieladresse kopieren
PK_ONE_PLANE:
	JSR	READ_BYTE		; Pack-Byte lesen
	TST.L	D0			; Flags setzen
	BMI.S	PACKED			; wenn neg., dann gepackt
	ADDQ.L	#1,D0			; lese n+1 Bytes
	JSR	READ_DATA		; Daten uebernehmen
	ADDA.L	D0,A0			; Neue Adresse berechnen
	ADD.L	D0,D2			; "Bytes pro Zeile"-Zaehler erhoehen
BACK_FROM_PACK:
	CMP.W	D6,D2			; Zeile fertig?
	BNE.S	PK_ONE_PLANE		; wenn nicht, nochmal wiederholen
	BRA.S	PK_NEXT			; naechsten Teil ueberspringen
	CMP.B	#1,MASK			; Maskenplane verwenden
	BNE.S	PK_NEXT			; wenn nicht, naechsten Teil auslassen
PACKED:
	NEG.L	D0			; Vorzeichen von D0 aendern
	ADD.L	D0,D2			; Zaehler um n-1 erhoehen
	ADDQ.L	#1,D2			; "Bytes pro Zeile"-Zaehler um 1 erhoehen
	MOVE.L	D0,D1			; D0 retten
	JSR	READ_BYTE		; Wert lesen, der kopiert werden soll
PK_COPY_LOOP:
	MOVE.B	D0,(A0)+		; Wert kopieren
	DBRA	D1,PK_COPY_LOOP		; D1+1 mal kopieren
	BRA.S	BACK_FROM_PACK		; ansonsten normal weiter machen
PK_NEXT:
	ADDA.L	D5,A1			; eine Plane dazu addieren
	DBRA	D3,PK_ONE_LINE		; naechste Linie einlesen
MASKING:
	CMP.B	#1,MASK			; Maskenplane verwendet?
	BNE.S	PK_NO_MASK		; wenn nicht, naechsten Teil auslassen
	MOVEQ	#0,D2			; Zaehler fuer Bytes pro Zeile
MSK_ONCE:
	JSR	READ_BYTE		; Pack-Byte lesen
	TST.L	D0			; Flags setzen
	BMI.S	MSK_PACKED		; wenn neg., dann gepackt
	ADDQ.L	#1,D0			; ueberspringe n+1 Bytes
	JSR	SKIP_DATA		; Daten ueberspringen
MSK_BACK:
	ADD.L	D0,D2			; "Bytes pro Zeile"-Zaehler erhoehen
	CMP.W	D6,D2			; Zeile fertig?
	BNE.S	MSK_ONCE		; wenn nicht, nochmal wiederholen
	BRA.S	PK_NO_MASK		; naechsten Teil ueberspringen
MSK_PACKED:
	MOVEQ	#1,D0			; Laenge nach D0
	JSR	SKIP_DATA		; ein Byte ueberlesen
	BRA.S	MSK_BACK		; normal weiter machen
PK_NO_MASK:
	ADD.L	D6,A5			; eine Zeile weiter gehen
	DBRA	D7,IFF_COMP		; naechste Zeile bearbeiten
	JMP	CLOSE_IFF		; file schliessen und dann zurueck

READ_LONG:
	MOVE.L	A0,-(A7)		; A0 auf den Stack legen
	MOVEQ	#4,D0			; ein Langwort lesen
	LEA	LONG_B,A0		; Adresse des Buffers
	JSR	READ_DATA		; Langwort in den Buffer lesen
	MOVE.L	LONG_B,D0		; Langwort nach D0 holen
	MOVEA.L	(A7)+,A0		; A0 vom Stack holen
	RTS				; zurueck
LONG_B:	DC.L	0			; hier kommt das Langw. hinein

READ_BYTE:
	MOVE.L	A0,-(A7)		; A0 auf den Stack legen
	MOVEQ	#1,D0			; ein Langwort lesen
	LEA	BYTE_B,A0		; Adresse des Buffers
	JSR	READ_DATA		; Langwort in den Buffer lesen
	MOVE.B	BYTE_B,D0		; Langwort nach D0 holen
	EXT.W	D0			; D0 vorzeichenrichtig auf Word bringen
	EXT.L	D0			; D0 vorzeichenrichtig auf Long bringen
	MOVEA.L	(A7)+,A0		; A0 vom Stack holen
	RTS				; zurueck
BYTE_B:	DC.W	0			; hier kommt das Langw. hinein

READ_DATA:				; A0=Ziel D0=Laenge
	MOVEM.L	D0-D4/A0-A1/A6,-(A7)	; Register auf den Stack
	MOVE.L	FILE,D1			; Adresse des file-handles
	MOVE.L	A0,D2			; Zieladresse des Reads
	MOVE.L	D0,D3			; Anzahl der zu lesenden Bytes
	MOVE.L	D0,D4			; Kopie der Anzahl machen
	JSR	BUFFER_READ		; und lesen
	CMP.L	D4,D0			; gewuenschte Anzahl gelesen?
	BEQ.S	READ_DATA_OK		; wenn ja, dann weiter
	MOVEM.L	(A7)+,D0-D4/A0-A1/A6	; Register auf den Stack
	ADDQ.L	#4,A7			; Eine Ebene vom Stack nehmen
	MOVEQ	#7,D0			; Error #7
	JMP	IFF_ERROR		; -> zwei Ebenen zurueck -> Hauptprg.
READ_DATA_OK:
	MOVEM.L	(A7)+,D0-D4/A0-A1/A6	; Register auf den Stack
	RTS	

SKIP_DATA:				; A0=Ziel D0=Laenge
	MOVEM.L	D0-D3/A0-A1/A6,-(A7)	; Register auf den Stack
	MOVE.L	FILE,D1			; Adresse des file-handles
	MOVE.L	D0,D2			; Anz. der zu ueberlesenden Bytes
	MOVEQ	#0,D3			; Von der aktuellen r/w-position aus
	JSR	BUFFER_SEEK		; Bytes ueberlesen
	CMPI.L	#-1,D0			; gewuenschte Anzahl ueberlesen?
	BNE.S	SKIP_DATA_OK		; wenn ja, dann weiter
	MOVEM.L	(A7)+,D0-D3/A0-A1/A6	; Register auf den Stack
	ADDQ.L	#4,A7			; Eine Ebene vom Stack nehmen
	MOVEQ	#7,D0			; Error #7
	JMP	IFF_ERROR		; -> zwei Ebenen zurueck -> Hauptprg.
SKIP_DATA_OK:
	MOVEM.L	(A7)+,D0-D3/A0-A1/A6	; Register auf den Stack
	RTS	

OPEN_IFF:
	MOVEM.L	D0-D2/A0-A1/A6,-(A7)	; Register auf den Stack retten
	MOVE.L	A0,D1			; Adresse des Namens nach D1
	MOVE.L	#1005,D2		; Modus = MODE_OLDFILE
	MOVE.L	DOS_BASE,A6		; Adresse der DOS-library
	JSR	_LVOOpen(A6)		; file oeffnen
	TST.L	D0			; kein Erfolg?
	BNE.S	OPEN_IFF_OK		; wenn doch, weitermachen
	MOVE.W	#6,ERRORN		; Fehler Nummer 6
	JSR	ERRORS			; Fehler ausgeben
	MOVEM.L	(A7)+,D0-D2/A0-A1/A6	; Register vom Stack holen
	ADDQ.L	#4,A7			; Stack manipulieren
	RTS				; -> zwei Ebenen zurueck -> Hauptprg.
OPEN_IFF_OK:
	MOVE.L	D0,FILE			; file-handle abspeichern
	JSR	INIT_BUFFER		; Buffer instalieren
	MOVEM.L	(A7)+,D0-D2/A0-A1/A6	; Register vom Stack retten
	RTS				; Rueckkehr

CLOSE_IFF:
	JSR	FREE_BUFFER		; Speicher freigeben
	MOVE.L	DOS_BASE,A6		; pointer auf die DOSch-library holen
	MOVE.L	FILE,D1			; file-handle nach D1 laden	
	JSR	_LVOClose(A6)		; file schliessen
	RTS				; zurueck

IFF_ERROR:				; D0=Fehlernummer
	MOVE.W	D0,ERRORN		; Fehlernummer 
	JSR	ERRORS			; und ausgeben
	JMP	CLOSE_IFF		; IFF-file schliessen

BUFFER_READ:				; D1:file D2:Adr. D3:Länge
	MOVEM.L	D1-D5/A2-A3/A6,-(A7)	; Register retten
	MOVE.L	D2,D4			; Zwischenspeicher anlegen
	MOVE.L	D3,D5			; Zwischenspeicher anlegen
	MOVE.L	REST,D0			; Anzahl der Bytes im Buffer
	CMP.L	D3,D0			; noch genügend Daten vorhanden?
	BGE.S	BUFFER_COPY_NOW		; dann nächsten Teil überspringen
	MOVEA.L	POSITION,A2		; aktuelle Bufferposition holen
	MOVEA.L	BUFFER,A3		; Adresse des Buffers holen
	TST.L	D0			; REST genau 0?
	BEQ.S	BREAD_NO_COPY		; dann ist der Buffer ganz leer
	SUB.L	#1,D0			; D0 zum Schleifenzähler machen
BREAD_COPY:
	MOVE.B	(A2)+,(A3)+		; ein Byte kopieren
	DBRA	D0,BREAD_COPY		; Restbuffer kopieren
BREAD_NO_COPY:
	MOVE.L	A3,D2			; Adresse des leeren (Rest-) Buffers
	MOVE.L	#LENGTH,D3		; Länge des Buffers holen
	SUB.L	REST,D3			; davon Länge des vollen abziehen
	MOVEA.L	DOS_BASE,A6		; Adresse der DOS-library holen
	JSR	_LVORead(A6)		; Buffer vollmachen
	MOVE.L	#LENGTH,REST		; der Buffer ist wieder voll
	MOVE.L	BUFFER,POSITION		; auf Anfangsposition setzen
BUFFER_COPY_NOW:			
	MOVEA.L	POSITION,A2		; aktuelle Bufferposition holen
	MOVE.L	D5,D0			; D5 kopieren
	SUB.L	#1,D5			; D5 (Länge) zum Schleifenzähler
	MOVE.L	D4,A3			; gewünschte Adresse nach A1
BUFFER_COPY:
	MOVE.B	(A2)+,(A3)+		; ein Datenbyte kopieren
	DBRA	D5,BUFFER_COPY		; Schleife machen
	MOVE.L	A2,POSITION		; neue Adresse abspeichern
	SUB.L	D0,REST			; Anzahl der gelesenen Bytes abziehen		
	MOVEM.L	(A7)+,D1-D5/A2-A3/A6	; Register zurück
	RTS				

BUFFER_SEEK:				; D1:file D2:Länge
	MOVEM.L	D1-D4/A2-A3/A6,-(A7)	; Register retten
	MOVE.L	D2,D4			; Zwischenspeicher anlegen
	MOVE.L	REST,D0			; Anzahl der Bytes im Buffer
	CMP.L	D2,D0			; noch genügend Daten vorhanden?
	BGE.S	SBUFFER_COPY_NOW	; dann nächsten Teil überspringen
	MOVEA.L	POSITION,A2		; aktuelle Bufferposition holen
	MOVEA.L	BUFFER,A3		; Adresse des Buffers holen
	TST.L	D0			; REST genau 0?
	BEQ.S	BSEEK_NO_COPY		; dann ist der Buffer ganz leer
	SUB.L	#1,D0			; D0 zum Schleifenzähler machen
BSEEK_COPY:
	MOVE.B	(A2)+,(A3)+		; ein Byte kopieren
	DBRA	D0,BSEEK_COPY		; Restbuffer kopieren
BSEEK_NO_COPY:
	MOVE.L	A3,D2			; Adresse des leeren (Rest-) Buffers
	MOVE.L	#LENGTH,D3		; Länge des Buffers holen
	SUB.L	REST,D3			; davon Länge des vollen abziehen
	MOVEA.L	DOS_BASE,A6		; Adresse der DOS-library holen
	JSR	_LVORead(A6)		; Buffer vollmachen
	MOVE.L	#LENGTH,REST		; der Buffer ist wieder voll
	MOVE.L	BUFFER,POSITION		; auf Anfangsposition setzen
SBUFFER_COPY_NOW:			
	MOVE.L	D4,D0			; D5 kopieren
	ADD.L	D0,POSITION		; neue Adresse berechnen
	SUB.L	D0,REST			; Anzahl der gelesenen Bytes abziehen		
	MOVEM.L	(A7)+,D1-D4/A2-A3/A6	; Register zurück
	RTS				

INIT_BUFFER:
	MOVEM.L	D0-D1/A0-A1/A6,-(A7)	; Register retten
	MOVE.L	#LENGTH,D0		; Buffergröße festsetzen
	MOVEQ	#0,D1			; keinen besonderen Speicher
	MOVE.L	4,A6			; Adresse der exec-library
	JSR	_LVOAllocMem(A6)	; Buffer holen
	TST.L	D0			; Speicher bekommen ?
	BNE.S	INIT_BUFFER_OK		; wenn ja, dann weiter
	MOVEM.L	(A7)+,D0-D1/A0-A1/A6	; Register zurückholen
	MOVEQ	#8,D0			; Fehler Nummer 8
	JSR	IFF_ERROR		; Fehler ausgeben
INIT_BUFFER_OK:
	MOVE.L	D0,BUFFER		; Adresse des Buffers abspeichern
	MOVE.L	D0,POSITION		; Anfangsposition setzen
	CLR.L	REST			; keine Zeichen mehr im Puffer
	MOVEM.L	(A7)+,D0-D1/A0-A1/A6	; Register zurückholen
	RTS

FREE_BUFFER:
	MOVEM.L	D0-D1/A0-A1/A6,-(A7)	; kennst DU Thomas Breunig ?
	MOVE.L	BUFFER,A1		; Adresse des Buffers holen
	BEQ.S	NO_FREE			; wenn nicht, dann zurück
	MOVE.L	#LENGTH,D0		; Größe nach D0
	MOVE.L	4,A6			; Adresse der exec-library holen
	JSR	_LVOFreeMem(a6)		; Speicher freigeben
NO_FREE:
	MOVEM.L	(A7)+,D0-D1/A0-A1/A6	; hier steht nichts.
	RTS

BMHD:
	DC.W	0,0			; Breite und Hoehe
	DC.W	0,0			; X- und Y-Position
PLANES:	DC.B	0			; Anzahl der Planes
MASK:	DC.B	0			; Art der Maske
COMP:	DC.B	0			; Komprimiert Ja/Nein
	DC.B	0			; Leerbyte
	DC.W	0			; Nummer der Hintergrundfarbe
	DC.B	0,0			; Verhaeltnis von Breite zu Hoehe
	DC.W	0,0			; screen-hoehe und screen-breite
CMAP:
	DS.B	96			; Platz fuer 96 R, G und B Werte
IFF_COLORS:
	DS.W	32			; Platz fuer 32 RGB-Werte


	
; ---------------------------------------------------------------------
;
; Ab hier stehen verschiedene kleine Routinen
;
; ---------------------------------------------------------------------

COPY_COLORS:				; Farbregister setzen
	MOVEM.L	D0/A0-A1,-(A7)		; Register retten
	LEA	COLOR00,A1		; Basisadresse der Farbregister
	MOVEQ	#31,D0			; 32 mal kopieren
COPY_CMAP2:
	MOVE.W	(A0)+,(A1)+		; eine Farbe kopieren
	DBRA	D0,COPY_CMAP2		; Schleife machen
	MOVEM.L	(A7)+,D0/A0-A1		; Register retten
	RTS

WAIT_JOYSTICK:				; auf Knopfdruck warten
	BTST	#6,CIAA_PRA		; Mausknopf gedrückt?
	BEQ.S	PRESSED			; wenn nicht, wieder prüfen
	BTST	#7,CIAA_PRA		; Joystickknopf gedrückt?
	BNE.S	WAIT_JOYSTICK		; wenn nicht, wieder prüfen
PRESSED:
	RTS

FAST_RAND:				; liefert Zufallszahl von 0-256
	MOVE.W	D1,-(A7)		; D1 auf den Stack retten
	MOVEQ	#0,D0			; D0 löschen
	MOVE.W	VHPOSR,D0		; Kathodenstrahlposition auslesen
	LSR.W	#8,D0			; Y-Wert nach unten schieben
	MOVE.W	VHPOSR,D1		; Kathodenstrahlposition auslesen
	EOR.B	D1,D0			; noch zufälliger machen
	MOVE.W	(A7)+,D1		; D1 vom Stack holen
	RTS

WAIT_BLT:				; wartet auf den Blitter
	MOVE.W	D0,-(A7)		; D0 auf den Stack retten
WB_LOOP:
	MOVE.W	DMACONR,D0		; DMACON-Register auslesen
	BTST	#14,D0			; Blitter am werken?
	BNE.S	WB_LOOP			; wenn versch. 0, dann nochmal
	MOVE.W	(A7)+,D0		; D0 vom Stack holen
	RTS

CALC_POS:				; Positionen umrechnen D0=x D1=y
	MOVE.W	D1,D2			; y-Position retten
	MOVE.W	D0,D1			; x-Position kopieren
	LSR.W	#4,D0			; Anzahl der Bytes auf der X-Achse
	LSL.W	#1,D0			; Anzahl der Worte auf der X-Achse
	ANDI.W	#$000f,D1		; Feinwert berechnen
	MULU	#FIELD_B,D2		; mal Bytes pro Zeile nehmen
	RTS



; ---------------------------------------------------------------------
;
; Ab hier steht die Musikroutine, ihre Variablen und Daten
;
; ---------------------------------------------------------------------

PLAYER:					; Ansprungpunkt für PORTS-Int.
	MOVEM.L	D7/A0,-(A7)		; D7 und A0 auf den  Stack legen
	MOVEQ	#6,D7			; Stimmenzähler in words
PL_LOOP:
	LEA	COUNTERS,A0		; Adresse der Zähler
	SUBQ.W	#1,(A0,D7)		; Zähler erniedrigen
	BNE	NEXT_VOICE		; Ton nicht fertig -> nächste Stimme 
	JSR	DO_MUSIC		; In die Hauptroutine springen
NEXT_VOICE:
	SUBQ.L	#2,D7			; auf nächste Stimme bringen
	BPL.S	PL_LOOP			; Schleife, solange D7 positiv
	MOVEM.L	(A7)+,D7/A0		; D7 und A0 vom Stack holen
	RTS

DO_MUSIC:
	MOVEM.L	D0-D2/D5-D6/A1-A2,-(A7)	; Register auf den Stack
	MOVE.L	D7,D6			; Stimmenzähler kopieren
	LSL.B	#1,D6			; Longwordzeiger daraus machen
	MOVE.L	D6,D5			; Stimmenzähler kopieren
	LSL.B	#2,D5			; $10-Zeiger daraus machen
AGAIN:	LEA	NEXT_EVENT,A1		; Adresse der Zeiger holen
	MOVEA.L	(A1,D6),A0		; Zeiger auf nächstes Wort holen
	LEA	COUNTERS,A1		; Adresse der Zähler holen
	MOVE.W	(A0)+,D0		; Signalwort nach D0
	MOVE.W	(A0)+,(A1,D7)		; Neue Notenlänge ablegen
CHK_RESTART_ADSR:
	BTST	#0,D0			; Hüllkurve neu starten ?
	BEQ.S	CHK_RESTART_WAVE	; wenn nicht, Bit #1 prüfen
	LEA	FIRST_ADSR,A2		; Adresse der Zeiger holen
	MOVE.L	(A2,D6),A1		; Adresse der ADSR holen
	LEA	NEXT_ADSR,A2		; Adresse der Zeiger holen
	MOVE.L	A1,(A2,D6)		; neue Adresse schreiben
	LEA	ADSR_COUNT,A1		; Adresse holen
	MOVE.W	#1,(A1,D7)		; Zähler löschen
CHK_RESTART_WAVE:
	BTST	#1,D0			; Wellenform neu starten ?
	BEQ.S	CHK_NEW_PERIOD		; wenn nicht, Bit #2 prüfen
	LEA	DMA_OFF,A1		; Adresse holen
	MOVE.W	(A1,D7),DMACON		; DMA der Stimme ausschalten
	LEA	DMA_ON,A1		; Adresse holen
	MOVE.W	(A1,D7),DMACON		; DMA der Stimme anschalten
CHK_NEW_PERIOD:
	BTST	#2,D0			; Geschwindigkeit neu setzen ?
	BEQ.S	CHK_NEW_WAVE		; wenn nicht, Bit #3 prüfen
	MOVE.W	(A0),D1			; Oktave und Note holen
	ANDI.W	#$00ff,D1		; Oktave ausblenden
	LSL.B	#1,D1			; auf Word-Offset bringen
	MOVEA.L	AKT_PER,A1		; Adresse holen
	MOVE.W	(A1,D1.W),D1		; Period holen
	MOVE.B	(A0),D2			; wirkliche Oktave holen
	LSR.W	D2,D1			; Frequenz entspr. oft verdoppeln
	LEA	AUD0PER,A1		; Adresse des Periodregisters
	MOVE.W	D1,(A1,D5)		; neue Period abspeichern
	ADDQ.L	#2,A0			; A0 weiterstellen
CHK_NEW_WAVE:
	BTST	#3,D0			; Wellenform neu setzen ?
	BEQ.S	CHK_NEW_ADSR		; wenn nicht, Bit #4 prüfen
	MOVE.W	(A0)+,D1		; Nummer der Waveform holen
	LEA	DMA_OFF,A2		; Adresse holen
	MOVE.W	(A2,D7),DMACON		; DMA der Stimme ausschalten
	LSL.W	#1,D1			; Auf Longwordzeiger bringen
	LEA	LENGTHS,A2		; Adresse holen
	MOVEA.W	(A2,D1.W),A1		; Adresse der Wave holen
	LEA	AUD0LEN,A2		; Adresse des Längenregisters
	MOVE.W	A1,0(A2,D5)		; neue Adresse der Wave abspeichern
	LSL.W	#1,D1			; Auf Longwordzeiger bringen
	LEA	PERIODS,A2		; Adresse holen
	MOVEA.L	(A2,D1.W),A1		; Adresse der Periodtabelle holen
	LEA	AKT_PER,A2		; Adresse der akt. Tabelle holen 
	MOVE.L	A1,(A2,D6)		; Adresse der akt. Per.tab abspeichern
	LEA	WAVES,A2		; Adresse holen
	MOVEA.L	(A2,D1.W),A1		; Adresse der Wave holen
	LEA	AUD0LCH,A2		; Adresse des Adressregisters
	MOVE.L	A1,0(A2,D5)		; neue Adresse der Wave abspeichern
	LEA	DMA_ON,A2		; Adresse holen
	MOVE.W	(A2,D7),DMACON		; DMA der Stimme anschalten
CHK_NEW_ADSR:
	BTST	#4,D0			; Hüllkurve neu setzen ?
	BEQ.S	CHK_END			; wenn nicht, Bit #15 prüfen
	MOVE.W	(A0)+,D1		; Nummer der Hüllkurve holen
	LSL.W	#2,D1			; Auf Longwordzeiger bringen
	LEA	ADSRS,A2		; Adresse holen
	MOVEA.L	(A2,D1.W),A1		; Adresse der Hüllkurve holen
	LEA	FIRST_ADSR,A2		; Adresse holen
	MOVE.L	A1,(A2,D6)		; neue Adresse abspeichern
	LEA	NEXT_ADSR,A2		; Adresse holen
	MOVE.L	A1,(A2,D6)		; neue Adresse schreiben
	LEA	ADSR_COUNT,A1		; Adresse holen
	MOVE.W	#1,(A1,D7)		; Zähler löschen
CHK_END:	
	BTST	#15,D0			; Track neu starten ?
	BEQ.S	END_MUSIC		; wenn nicht, dann beenden
	LEA	FIRST_EVENT,A1		; Adresse holen
	LEA	NEXT_EVENT,A2		; Adresse holen
	MOVE.L	(A1,D6),(A2,D6)		; zurücksetzen
	BRA	AGAIN			; von vorne
END_MUSIC:
	LEA	NEXT_EVENT,A2		; Adresse holen
	MOVE.L	A0,(A2,D6)		; Event-Zeiger zurücksetzen
	LEA	COUNTERS,A1		; Adresse der Zähler holen
	TST.W	(A1,D7)			; Notenlänge = 0 ?
	BEQ	AGAIN			; dann nochmal durchlaufen
	MOVEM.L	(A7)+,D0-D2/D5-D6/A1-A2	; Register vom Stack nehmen
	RTS				; zurück

DO_ADSR:
	MOVEM.L	D7/A0,-(A7)		; D7 und A0 auf den  Stack legen
	MOVEQ	#6,D7			; Stimmenzähler in words
ADSR_WORK:
	LEA	ADSR_COUNT,A0
	SUBQ.W	#1,(A0,D7)		; Zähler erniedrigen
	BNE.S	NEXT_VOICE2		; ADSR nicht fertig -> nächste Stimme 
	JSR	ADSR_WORX		; In die Hauptroutine springen
NEXT_VOICE2:
	SUBQ.L	#2,D7			; auf nächste Stimme bringen
	BPL.S	ADSR_WORK		; Schleife, solange D7 positiv
	MOVEM.L	(A7)+,D7/A0		; D7 und A0 vom Stack holen
	RTS

ADSR_WORX:
	MOVEM.L	D5-D6/A1,-(A7)		; Register auf den Stack
	MOVE.L	D7,D6			; Stimmenzähler kopieren
	LSL.B	#1,D6			; Longwordzeiger daraus machen
	MOVE.L	D6,D5			; Stimmenzähler kopieren
	LSL.B	#2,D5			; $10-Zeiger daraus machen
	LEA	NEXT_ADSR,A1		; Adresse holen
	MOVEA.L	(A1,D6),A0		; Adresse des akt. 
	LEA	AUD0VOL,A1		; Adresse des Volumenregisters
	MOVE.W	(A0)+,(A1,D5)		; Neues Volumen schreiben
	LEA	ADSR_COUNT,A1		; Adresse holen
	MOVE.W	(A0)+,(A1,D7)		; Zähler neu setzen
	LEA	NEXT_ADSR,A1		; Adresse holen
	ADDQ.L	#4,(A1,D6)		; Adresse neu setzen
	MOVEM.L	(A7)+,D5-D6/A1		; Register auf den Stack
	RTS


COUNTERS:	DC.W	1,1,1,1		; Länge des akt. Tones
ADSR_COUNT:	DC.W	1,1,1,1		; Länge des ADSR-Events
NEXT_EVENT:	DC.L	NO0,NO1,NO2,NO3	; Adresse des nächsten Worts
FIRST_EVENT:	DC.L	NO0,NO1,NO2,NO3	; Adresse des ersten Worts
WAVES:		DC.L	WAVE1		; Adressen der Wellenformen
ADSRS:		DC.L	ADSR1		; Adressen der Hüllkurven
LENGTHS:	DC.W	4		; Länge der Wellen in Words
PERIODS:	DC.L	PER1		; Adressen der Periodtabellen
AKT_PER:	DC.L	PER1,PER1	; Adresse der aktuellen Per.tab.
		DC.L	PER1,PER1	; sind hier abgelegt
DMA_OFF:	DC.W	$0001,$0002	; Werte des DMA-Registers
		DC.W	$0004,$0008	; zum Ausschalten einer Stimme
DMA_ON:		DC.W	$8001,$8002	; Werte des DMA-Registers
		DC.W	$8004,$8008	; zum Anschalten einer Stimme
NEXT_ADSR:	DC.L	ADSR1,ADSR1	; Adresse des nächsten
		DC.L	ADSR1,ADSR1	; ADSR-Werts
FIRST_ADSR:	DC.L	ADSR1,ADSR1	; Adresse des ersten
		DC.L	ADSR1,ADSR1	; ADSR-Werts
NUM_OF_WAVES:	DC.W	0		; wir haben eine Wellenform
WAVE1:
	DC.B	-127,-127,-127,-127	; simple Rechteckschwingung
	DC.B	127,127,127,127		; als Wellenform Nummer eins
ADSR1:
	DC.W	48,1,56,1,64,1,63,1,62,1,61,1,60,1,59,1
	DC.W	58,1,57,1,56,1,55,1,54,1,53,1,52,1,51,1
	DC.W	50,1,49,1,48,2,47,2,46,2,45,2,44,2,43,2
	DC.W	42,2,41,2,40,2,39,2,38,2,37,2,36,2,35,2
	DC.W	34,2,33,2,32,3,31,3,30,3,29,3,28,3,27,3
	DC.W	26,3,25,3,24,4,23,4,22,4,21,4,20,4,19,4
	DC.W	18,4,17,4,16,5,15,5,14,5,13,5,12,5,11,5
	DC.W	10,5,9,5,8,6,7,6,6,6,5,6,4,6,3,6,2,6
	DC.W	1,6,0,$ffff
PER1:
	DC.W	54727,51656,48756,46020	; Periodwerte für C0 bis H0
	DC.W	43437,40999,38698,36526	; -> für die Frequenzen von
	DC.W	34476,32541,30714,28991	; 6.875Hz bis 15.433Hz
NO0:
	DC.W	$18,$0,$0,$0	; Hülllkurve und Wellenform setzen
	DC.W	$7,$60,$400,$7,$30,$300,$7,$60,$400,$7,$30,$307,$7
	DC.W	$60,$30B,$7,$60,$309,$7,$30,$209,$7,$60,$309,$7,$30
	DC.W	$309,$7,$30,$307,$7,$30,$307,$7,$60,$305,$7,$60,$405
	DC.W	$7,$30,$305,$7,$30,$307,$7,$60,$305,$7,$90,$307,$7
	DC.W	$30,$307,$7,$60,$407,$7,$60,$307,$7,$60,$400,$7,$30
	DC.W	$300,$7,$60,$400,$7,$30,$307,$7,$60,$30B,$7,$60,$209
	DC.W	$7,$30,$309,$7,$60,$309,$7,$30,$309,$7,$30,$307,$7
	DC.W	$30,$307,$7,$60,$305,$7,$60,$405,$7,$30,$305,$7,$30
	DC.W	$307,$7,$60,$305,$7,$90,$307,$7,$30,$307,$7,$60,$407
	DC.W	$7,$60,$307,$7,$120,$400,$7,$60,$400,$7,$120,$402,$7
	DC.W	$60,$402,$7,$120,$305,$7,$60,$305,$7,$180,$30B,$7,$120
	DC.W	$400,$7,$60,$400,$7,$120,$402,$7,$60,$402,$7,$120,$305
	DC.W	$7,$60,$305,$7,$180,$30B,$8000
NO1:
	DC.W	$18,$0,$0,$0	; Hülllkurve und Wellenform setzen
	DC.W	$0,$60,$7,$30,$507,$7,$60,$600,$7,$30,$507,$7,$30
	DC.W	$602,$7,$30,$600,$7,$30,$602,$7,$30,$604,$7,$30,$600
	DC.W	$7,$30,$507,$0,$60,$0,$60,$0,$60,$7,$30,$505,$7
	DC.W	$30,$507,$7,$30,$509,$7,$30,$602,$7,$30,$600,$7,$30
	DC.W	$505,$7,$C0,$507,$7,$C0,$507,$0,$60,$7,$30,$507,$7
	DC.W	$60,$600,$7,$30,$507,$7,$30,$602,$7,$30,$600,$7,$30
	DC.W	$602,$7,$30,$604,$7,$30,$607,$7,$30,$600,$0,$60,$0
	DC.W	$60,$0,$60,$7,$30,$600,$7,$30,$509,$7,$30,$600,$7
	DC.W	$30,$604,$7,$30,$602,$7,$30,$509,$7,$C0,$600,$7,$C0
	DC.W	$602,$0,$60,$7,$30,$603,$7,$30,$602,$7,$30,$50A,$7
	DC.W	$30,$505,$7,$30,$503,$7,$30,$502,$7,$30,$503,$7,$30
	DC.W	$502,$7,$30,$503,$7,$30,$505,$0,$60,$0,$60,$7,$30
	DC.W	$600,$7,$30,$50A,$7,$30,$505,$7,$60,$503,$7,$30,$502
	DC.W	$7,$30,$503,$7,$30,$507,$7,$C0,$508,$7,$C0,$50B,$0
	DC.W	$60,$7,$30,$502,$7,$30,$503,$7,$30,$505,$7,$90,$508
	DC.W	$7,$30,$50A,$7,$30,$508,$7,$30,$507,$7,$30,$508,$0
	DC.W	$60,$0,$60,$7,$30,$505,$7,$30,$50A,$7,$30,$505,$7
	DC.W	$60,$508,$7,$30,$505,$7,$30,$503,$7,$30,$507,$7,$C0
	DC.W	$508,$7,$C0,$50B,$8000
NO2:
	DC.W	$18,$0,$0,$0	; Hülllkurve und Wellenform setzen
	DC.W	$0,$60,$7,$30,$500,$7,$60,$504,$7,$30,$500,$7,$30
	DC.W	$505,$7,$30,$504,$7,$C0,$500,$0,$C0,$0,$60,$7,$30
	DC.W	$409,$7,$30,$40A,$7,$30,$500,$7,$30,$502,$7,$30,$409
	DC.W	$7,$30,$40A,$7,$C0,$504,$7,$C0,$502,$0,$60,$7,$30
	DC.W	$500,$7,$60,$504,$7,$30,$500,$7,$30,$505,$7,$30,$504
	DC.W	$7,$C0,$500,$0,$C0,$0,$60,$7,$30,$507,$7,$30,$505
	DC.W	$7,$30,$504,$7,$30,$509,$7,$30,$505,$7,$30,$500,$7
	DC.W	$C0,$509,$7,$C0,$507,$0,$60,$7,$30,$507,$7,$30,$505
	DC.W	$7,$30,$503,$7,$30,$500,$7,$30,$500,$7,$30,$40A,$7
	DC.W	$30,$405,$7,$30,$407,$7,$30,$40A,$7,$30,$502,$0,$C0
	DC.W	$7,$30,$503,$7,$30,$502,$7,$30,$502,$7,$60,$500,$7
	DC.W	$30,$407,$7,$30,$408,$7,$30,$407,$7,$C0,$503,$7,$C0
	DC.W	$503,$0,$60,$7,$30,$40A,$7,$30,$500,$7,$30,$40A,$7
	DC.W	$90,$408,$7,$30,$502,$7,$30,$500,$7,$30,$40A,$7,$30
	DC.W	$408,$0,$C0,$7,$30,$502,$7,$30,$503,$7,$30,$502,$7
	DC.W	$60,$503,$7,$30,$502,$7,$30,$500,$7,$30,$502,$0,$180
	DC.W	$8000
NO3:
	DC.W	$18,$0,$0,$0	; Hülllkurve und Wellenform setzen
	DC.W	$0,$60,$7,$30,$400,$7,$60,$404,$7,$30,$400,$7,$30
	DC.W	$409,$7,$30,$407,$7,$C0,$409,$0,$C0,$0,$180,$0,$180
	DC.W	$0,$60,$7,$30,$400,$7,$60,$404,$7,$30,$400,$7,$30
	DC.W	$409,$7,$30,$407,$7,$C0,$409,$0,$C0,$0,$60,$7,$60
	DC.W	$409,$7,$60,$407,$7,$60,$405,$7,$180,$407,$0,$60,$7
	DC.W	$30,$407,$7,$30,$405,$7,$30,$407,$7,$30,$405,$7,$30
	DC.W	$407,$7,$30,$405,$0,$180,$7,$30,$407,$7,$30,$405,$7
	DC.W	$30,$407,$7,$30,$403,$0,$C0,$7,$180,$408,$0,$60,$7
	DC.W	$30,$405,$7,$30,$403,$7,$30,$405,$7,$90,$405,$7,$30
	DC.W	$405,$7,$30,$408,$7,$30,$407,$7,$30,$405,$0,$C0,$0
	DC.W	$180,$0,$180,$8000



; ---------------------------------------------------------------------
;
; Ab hier stehen die Routinen zum Aufbau und zur Bewegung der Sterne
;
; ---------------------------------------------------------------------

INIT_STARS:
	MOVE.W	#STARS-1,D2		; Anzahl der Sterne als Zähler
	LEA	STAR_DUMMY,A0		; Leeradresse
	LEA	STARS_DEL,A1		; Adresse der Adressentabelle
	LEA	STARS_POS,A2		; Adresse der Positionstabelle
	LEA	STARS_SPEED,A3		; Adresse der Geschwindigkeitstab.
IS_LOOP:
	MOVE.L	A0,(A1)+		; Löschadresse schreiben
	JSR	FAST_RAND		; Zufallszahl holen
	MOVE.W	D0,D1			; nach D1 kopieren
	JSR	FAST_RAND		; Zufallszahl holen
	LSR.W	#2,D0			; vierteln
	ADD.W	D1,D0			; die beiden Zahlen addieren
	MOVE.W	D0,(A2)+		; Position abspeichern
	JSR	FAST_RAND		; neue Zufallszahl nach D0 holen
	ANDI.B	#$07,D0			; Geschwindigkeit zwischen 0 & 7
	ADDQ.B	#2,D0			; Geschwindigkeit zwischen 2 & 9
	MOVE.W	D0,(A3)+		; Geschwindigkeit abspeichern
	DBRA	D2,IS_LOOP		; nächster Stern
	RTS
STAR_DUMMY:
	DC.L	0			; Hilfsadresse

DEL_STARS:
	MOVE.W	#STARS-1,D4		; Anzahl der Sterne als Zähler
	LEA	STARS_ADR,A0		; Adresse der 1. Adressentabelle
	LEA	STARS_DEL,A1		; Adresse der 2. Adressentabelle
DS_LOOP:
	MOVE.L	(A1),A2			; Adresse der zu löschenden Stelle
	CLR.B	(A2)			; alten Stern löschen
	MOVE.L	(A0)+,(A1)+		; Adresse kopieren
	DBRA	D4,DS_LOOP		; nächsten Stern
	RTS

MOVE_STARS:
	MOVE.W	#STARS-1,D4		; Anzahl der Sterne als Zähler
	LEA	STARS_ADR,A0		; Adresse der Adressentabelle
	LEA	STARS_POS,A1		; Adresse der Positionstabelle
	LEA	STARS_SPEED,A2		; Adresse der Geschwindigkeitstab.
	MOVEA.L	FIELD_BASE1,A3		; Adresse des unsichtb. Spielfeldes
	LEA	STARS_TAB,A4		; Adresse der geshifteten Sterne
MS_LOOP:
	MOVE.W	(A1),D1			; Position holen
	SUB.W	(A2)+,D1		; Um Geschwindigkeit vermindern
	BPL.S	MS_NO_NEW_STAR		; Ende der Zeile noch nicht erreicht?
	MOVE.W	#351,D1			; neuer Stern am linken Rand
	JSR	FAST_RAND		; neue Zufallszahl nach D0 holen
	ANDI.B	#$07,D0			; Geschwindigkeit zwischen 0 & 7
	ADDQ.B	#2,D0			; Geschwindigkeit zwischen 2 & 9
	MOVE.W	D0,-2(A2)		; Geschwindigkeit abspeichern
MS_NO_NEW_STAR:
	MOVE.W	D1,(A1)+		; neue Position abspeichern
	MOVE.W	D1,D2			; Position kopieren
	LSR.W	#3,D1			; Position in Bytes
	ANDI.W	#$0007,D2		; Bytes ausblenden
	MOVE.B	0(A4,D2),D3		; verschobenen Stern holen
	LEA	0(A3,D1),A6		; Zieladresse im Spielfeld
	MOVE.B	D3,(A6)			; Stern ausgeben
	MOVE.L	A6,(A0)+		; Position abspeichern
	ADDA.L	#LINES*FIELD_B,A3	; 4 Zeilen weiter gehen
	DBRA	D4,MS_LOOP		; nächsten Stern
	RTS

STARS_TAB:
	DC.B	%10000000,%01000000,%00100000,%00010000
	DC.B	%00001000,%00000100,%00000010,%00000001



; ---------------------------------------------------------------------
;
; Ab hier stehen die Routinen zum Löschen und zur Bewegung des Schiffs
;
; ---------------------------------------------------------------------

DEL_SHIP:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	#$0100,BLTCON0		; D wird auf Null gesetzt
	MOVE.W	#$0000,BLTCON1		; zweites Kontrollreg. setzen
	MOVE.W	#FIELD_B-SHIP_B,BLTDMOD	; Modulo setzen
	MOVE.L	SH_BE_LAST,D0		; da war das Schiff vor 2 Bildern
	MOVEQ	#5,D1			; 6 Planes müssen bearbeitet werden
DSH_LOOP:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter löschen
	MOVE.W	#SH_BLIT,BLTSIZE	; Blitter Starten
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	DBRA	D1,DSH_LOOP		; nächster Blit
	MOVE.L	SH_LAST,SH_BE_LAST	; vorletzte wird letzte
	RTS

MOVE_SHIP:
	JSR	JOY_MOVE		; Joystick kontrolieren
	MOVE.L	SH_X,D0			; D0 mit X-Position laden
	MOVE.L	SH_Y,D1			; D1 mit Y-Position laden
	JSR	CALC_POS		; Position umrechnen

	LSL.W	#8,D1			; Shiftwert um 8 Bits nach rechts
	LSL.W	#4,D1			; Shiftwert um 4 Bits nach rechts
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	D1,BLTCON1		; zweites Kontrollreg. setzen
	ADDI.W	#$0fca,D1		; ABCD an und D=AB+Ac
	MOVE.W	D1,BLTCON0		; D wird auf Null gesetzt

	CLR.W	BLTAMOD			; Schattenmaske: kein Modulo
	CLR.W	BLTBMOD			; Schiffsdaten:  kein Modulo
	MOVE.W	#FIELD_B-SHIP_B,BLTCMOD	; Modulo setzen
	MOVE.W	#FIELD_B-SHIP_B,BLTDMOD	; Modulo setzen
	ADD.L	FIELD_BASE1,D0		; Adresse des Spielfelds zu D3
	ADD.L	D2,D0			; Y-Offset dazu
	MOVE.L	D0,SH_LAST		; vorletzte wird letzte

	MOVE.L	BOB_BASE,BLTBPTH	; Zeiger auf Schiffsdaten setzen
	MOVE.L	BOB_BASE,D2		; Zeiger auf Daten
	ADDI.L	#5*SHIP_P,D2		; Adresse der Schattenmaske

	MOVEQ	#5,D1			; 6 Planes müssen bearbeitet werden
MSH_LOOP:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D2,BLTAPTH		; Zeiger auf Schattenmaske setzen
	MOVE.L	D0,BLTCPTH		; Dort liegt der Hintergrund
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter hinkopieren
	MOVE.W	#SH_BLIT,BLTSIZE	; Blitter Starten
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	DBRA	D1,MSH_LOOP		; nächster Blit
	RTS

JOY_MOVE:
	MOVE.W	JOY0DAT,D0		; Zähler auslesen
	MOVE.B	PREVX,D1		; vorherigen X-Wert holen
	MOVE.B	D0,PREVX		; jetzigen als vorigen abspeichern
	SUB.B	D0,D1			; jetzigen vom vorigen abziehen
	MOVE.B	D1,D2			; Wert abspeichern
	BPL.S	POSX			; Springe, wenn positiv
	NEG.B	D2			; positiv machen
POSX:	CMP.B	#127,D2			; hat Zähler wieder bei Null angef.?
	BLE.S	NO_WRAPX		; springe,  wenn nocht
	ADDI.B	#255,D1			; auf echten count bringen
NO_WRAPX:
	NEG.B	D1			; negieren	
	EXT.W	D1			; auf Wort bringen
	EXT.L	D1			; auf Langwort bringen
	ADD.L	D1,SH_X			; neu setzen
MOUSE_Y:
	LSR.W	#8,D0			; shiften, um Y-Wert zu bekommen
	MOVE.B	PREVY,D1		; letzen Y-Wert	holen
	MOVE.B	D0,PREVY		; jetzigen als vorigen abspeichern
	SUB.B	D0,D1			; jetzigen vom vorigen abziehen
	MOVE.B	D1,D2			; Wert abspeichern
	BPL.S	POSY			; springe, wenn größer Null
	NEG.B	D2			; positiv machen
POSY:	CMP.B	#127,D2			; Umkehr des Zählers passiert
	BLE.S	NO_WRAPY		; springe, wenn nicht
	ADDI.B	#255,D1			; auf echten Wert bringen
NO_WRAPY:		
	NEG.B	D1			; Vorzeichen wechseln
	EXT.W	D1			; auf Wort bringen
	EXT.L	D1			; auf Langwort bringen
	ADD.L	D1,SH_Y			; neu setzen

JOYSTICK_X:
	MOVE.W	JOY1DAT,D0		; Inhalt des Registers nach D0

	BTST	#1,D0			; Joystick nach rechts?
	BEQ.S	JM_NOT_RIGHT		; springen, wenn nicht gedrückt
	ADDQ.L	#XSPEED,SH_X		; Geschw. zur X-Position
	BTST	#0,D0			; Joystick nach hinten gedrückt?
	BNE.S	JOYSTICK_Y		; überspringen, wenn gesetzt
	ADDQ.L	#YSPEED,SH_Y		; Geschw. zur Y-Position
JM_NOT_RIGHT:
	BTST	#0,D0			; Joystick nach hinten gedrückt?
	BEQ.S	JOYSTICK_Y		; überspringen, wenn nicht gesetzt
	ADDQ.L	#YSPEED,SH_Y		; Geschw. zur Y-Position
JOYSTICK_Y:
	BTST	#9,D0			; Joystick nach links?
	BEQ.S	JM_NOT_LEFT		; springen, wenn nicht gedrückt
	SUBQ.L	#XSPEED,SH_X		; Geschw. von der X-Position abz.
	BTST	#8,D0			; Joystick nach vorne gedrückt?
	BNE.S	TST_X			; überspringen, wenn gesetzt
	SUBQ.L	#YSPEED,SH_Y		; Geschw. zur Y-Position
JM_NOT_LEFT:
	BTST	#8,D0			; Joystick nach vorne gedrückt
	BEQ.S	TST_X			; überspringen, wenn nicht gesetzt
	SUBQ.L	#YSPEED,SH_Y		; Geschw. zur Y-Position
TST_X:
	MOVE.L	SH_X,D0			; X-Koordinate nach D0
	CMP.L	#MINX,D0		; kleiner als erlaubt?
	BGE.S	NOT_NEGX		; wenn nicht, dann springen
	MOVE.L	#MINX,SH_X		; auf kleinsten Wert setzen
NOT_NEGX:
	CMP.L	#MAXX,D0		; groesser als Breite des Felds?
	BLE.S	TST_Y			; wenn nicht, dann springen
	MOVE.L	#MAXX,SH_X		; auf alten Wert zuruecksetzen		
TST_Y:
	MOVE.L	SH_Y,D0			; Y-Koordinate nach D0
	CMP.L	#MINY,D0		; kleiner als erlaubt?
	BGE.S	NOT_NEGY		; wenn nicht, dann springen
	MOVE.L	#MINY,SH_Y		; auf kleinsten Wert setzen
NOT_NEGY:
	CMP.L	#MAXY,D0		; größer als Höhe des Felds?
	BLE.S	NOT_MOREY		; wenn nicht, dann...
	MOVE.L	#MAXY,SH_Y		; auf alten Wert zurücksetzen		
NOT_MOREY:
	RTS				; zurück

PREVX:		DC.B	0
PREVY:		DC.B	0
SH_LAST:	DC.L	0		; letze Adresse des Raumschiffs
SH_BE_LAST:	DC.L	0		; vorletze Adresse des Schiffs
SH_X:		DC.L	0		; Horizontale Position des Schiffs
SH_Y:		DC.L	0		; Vertikale Position des Schiffs



; ---------------------------------------------------------------------
;
; Ab hier stehen die Grafikdaten für das Schiff und den Schuß
;
; ---------------------------------------------------------------------

SHIP_DATA:
	dc.w	$f800,$0000,$0000
	dc.w	$fc00,$0000,$0000
	dc.w	$fe00,$0000,$0000
	dc.w	$1fe0,$0000,$0000
	dc.w	$e000,$0000,$0000
	dc.w	$ffff,$0000,$0000
	dc.w	$1ffd,$c000,$0000
	dc.w	$0005,$f000,$0000
	dc.w	$ffe0,$0fc0,$0000
	dc.w	$e004,$0002,$0000
	dc.w	$1fe0,$2004,$0000
	dc.w	$0004,$1ff8,$0000
	dc.w	$2538,$6000,$0000
	dc.w	$2722,$0000,$0000
	dc.w	$1130,$0000,$0000
	dc.w	$0fc0,$0000,$0000
	dc.w	$0800,$0000,$0000
	dc.w	$0000,$0000,$0000

	dc.w	$4400,$0000,$0000
	dc.w	$7e00,$0000,$0000
	dc.w	$4900,$0000,$0000
	dc.w	$e060,$0000,$0000
	dc.w	$0060,$0000,$0000
	dc.w	$e01f,$8000,$0000
	dc.w	$ffe6,$e000,$0000
	dc.w	$fffa,$3800,$0000
	dc.w	$e07f,$f860,$0000
	dc.w	$1fff,$0fff,$0000
	dc.w	$ffff,$f00e,$0000
	dc.w	$fffb,$e00c,$0000
	dc.w	$dac7,$fff0,$0000
	dc.w	$d8df,$c000,$0000
	dc.w	$7ff8,$0000,$0000
	dc.w	$7fe0,$0000,$0000
	dc.w	$3f80,$0000,$0000
	dc.w	$1e00,$0000,$0000

	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000
	dc.w	$0000,$0000,$0000

	dc.w	$4000,$0000,$0000
	dc.w	$7c00,$0000,$0000
	dc.w	$4800,$0000,$0000
	dc.w	$0060,$0000,$0000
	dc.w	$0060,$0000,$0000
	dc.w	$e01f,$0000,$0000
	dc.w	$1fe5,$c000,$0000
	dc.w	$0019,$f000,$0000
	dc.w	$e06c,$0840,$0000
	dc.w	$1fe7,$0ffe,$0000
	dc.w	$1fe8,$300c,$0000
	dc.w	$001b,$c008,$0000
	dc.w	$dac7,$6000,$0000
	dc.w	$58de,$0000,$0000
	dc.w	$7ff0,$0000,$0000
	dc.w	$3fc0,$0000,$0000
	dc.w	$1f00,$0000,$0000
	dc.w	$0000,$0000,$0000

	dc.w	$fc00,$0000,$0000
	dc.w	$fe00,$0000,$0000
	dc.w	$ff00,$0000,$0000
	dc.w	$ffe0,$0000,$0000
	dc.w	$ffe0,$0000,$0000
	dc.w	$ffff,$8000,$0000
	dc.w	$ffff,$e000,$0000
	dc.w	$ffff,$f800,$0000
	dc.w	$ffff,$ffe0,$0000
	dc.w	$ffff,$ffff,$0000
	dc.w	$ffff,$fffe,$0000
	dc.w	$ffff,$fffc,$0000
	dc.w	$ffff,$fff0,$0000
	dc.w	$ffff,$c000,$0000
	dc.w	$7ff8,$0000,$0000
	dc.w	$7fe0,$0000,$0000
	dc.w	$3f80,$0000,$0000
	dc.w	$1e00,$0000,$0000

	dc.w	$fc00,$0000,$0000
	dc.w	$fe00,$0000,$0000
	dc.w	$ff00,$0000,$0000
	dc.w	$ffe0,$0000,$0000
	dc.w	$ffe0,$0000,$0000
	dc.w	$ffff,$8000,$0000
	dc.w	$ffff,$e000,$0000
	dc.w	$ffff,$f800,$0000
	dc.w	$ffff,$ffe0,$0000
	dc.w	$ffff,$ffff,$0000
	dc.w	$ffff,$fffe,$0000
	dc.w	$ffff,$fffc,$0000
	dc.w	$ffff,$fff0,$0000
	dc.w	$ffff,$c000,$0000
	dc.w	$7ff8,$0000,$0000
	dc.w	$7fe0,$0000,$0000
	dc.w	$3f80,$0000,$0000
	dc.w	$1e00,$0000,$0000

SHOOT_DATA:
	dc.w	$d3d3,$0000
	dc.w	$e1e1,$0000
	dc.w	$fbfb,$0000
	dc.w	$fbfb,$0000
	dc.w	$0404,$0000
	dc.w	$ffff,$0000

ENEMY_A1:
	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0c38,$0000
	dc.w	$130c,$0000
	dc.w	$2dc6,$0000
	dc.w	$18c6,$0000
	dc.w	$50e3,$0000
	dc.w	$6f1f,$0000
	dc.w	$5555,$0000
	dc.w	$2019,$0000
	dc.w	$50e7,$0000
	dc.w	$18c6,$0000
	dc.w	$2dce,$0000
	dc.w	$131c,$0000
	dc.w	$0c78,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1cfc,$0000
	dc.w	$303e,$0000
	dc.w	$203e,$0000
	dc.w	$601f,$0000
	dc.w	$70ff,$0000
	dc.w	$2222,$0000
	dc.w	$4007,$0000
	dc.w	$601f,$0000
	dc.w	$203e,$0000
	dc.w	$303e,$0000
	dc.w	$1cfc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

ENEMY_A2:
	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0c38,$0000
	dc.w	$130c,$0000
	dc.w	$2dc6,$0000
	dc.w	$18c6,$0000
	dc.w	$50e3,$0000
	dc.w	$6f1f,$0000
	dc.w	$2aaa,$0000
	dc.w	$2019,$0000
	dc.w	$50e7,$0000
	dc.w	$18c6,$0000
	dc.w	$2dce,$0000
	dc.w	$131c,$0000
	dc.w	$0c78,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1cfc,$0000
	dc.w	$303e,$0000
	dc.w	$203e,$0000
	dc.w	$601f,$0000
	dc.w	$70ff,$0000
	dc.w	$1111,$0000
	dc.w	$4007,$0000
	dc.w	$601f,$0000
	dc.w	$203e,$0000
	dc.w	$303e,$0000
	dc.w	$1cfc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

ENEMY_A3:
	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0c38,$0000
	dc.w	$130c,$0000
	dc.w	$2dc6,$0000
	dc.w	$18c6,$0000
	dc.w	$50e3,$0000
	dc.w	$6f1f,$0000
	dc.w	$5555,$0000
	dc.w	$2019,$0000
	dc.w	$50e7,$0000
	dc.w	$18c6,$0000
	dc.w	$2dce,$0000
	dc.w	$131c,$0000
	dc.w	$0c78,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1cfc,$0000
	dc.w	$303e,$0000
	dc.w	$203e,$0000
	dc.w	$601f,$0000
	dc.w	$70ff,$0000
	dc.w	$0888,$0000
	dc.w	$4007,$0000
	dc.w	$601f,$0000
	dc.w	$203e,$0000
	dc.w	$303e,$0000
	dc.w	$1cfc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

ENEMY_A4:
	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0c38,$0000
	dc.w	$130c,$0000
	dc.w	$2dc6,$0000
	dc.w	$18c6,$0000
	dc.w	$50e3,$0000
	dc.w	$6f1f,$0000
	dc.w	$2aaa,$0000
	dc.w	$2019,$0000
	dc.w	$50e7,$0000
	dc.w	$18c6,$0000
	dc.w	$2dce,$0000
	dc.w	$131c,$0000
	dc.w	$0c78,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1cfc,$0000
	dc.w	$303e,$0000
	dc.w	$203e,$0000
	dc.w	$601f,$0000
	dc.w	$70ff,$0000
	dc.w	$4444,$0000
	dc.w	$4007,$0000
	dc.w	$601f,$0000
	dc.w	$203e,$0000
	dc.w	$303e,$0000
	dc.w	$1cfc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$7fff,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$03e0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ffc,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$7fff,$0000
	dc.w	$3ffe,$0000
	dc.w	$3ffe,$0000
	dc.w	$1ffc,$0000
	dc.w	$0ff8,$0000
	dc.w	$03e0,$0000

EXP_1:
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0100,$0000
	dc.w	$0460,$0000
	dc.w	$05d0,$0000
	dc.w	$02b0,$0000
	dc.w	$1158,$0000
	dc.w	$0d48,$0000
	dc.w	$0288,$0000
	dc.w	$05d0,$0000
	dc.w	$0200,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0100,$0000
	dc.w	$02c0,$0000
	dc.w	$0010,$0000
	dc.w	$0900,$0000
	dc.w	$1088,$0000
	dc.w	$0150,$0000
	dc.w	$1540,$0000
	dc.w	$0800,$0000
	dc.w	$0108,$0000
	dc.w	$0460,$0000
	dc.w	$0180,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0100,$0000
	dc.w	$03c0,$0000
	dc.w	$07f0,$0000
	dc.w	$0ef0,$0000
	dc.w	$1f78,$0000
	dc.w	$1ea8,$0000
	dc.w	$1ab8,$0000
	dc.w	$0ff8,$0000
	dc.w	$06f8,$0000
	dc.w	$07e0,$0000
	dc.w	$0180,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0280,$0000
	dc.w	$0420,$0000
	dc.w	$0800,$0000
	dc.w	$0008,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$1000,$0000
	dc.w	$0800,$0000
	dc.w	$0010,$0000
	dc.w	$0240,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0380,$0000
	dc.w	$07e0,$0000
	dc.w	$0ff0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$0ff8,$0000
	dc.w	$07f0,$0000
	dc.w	$03c0,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0380,$0000
	dc.w	$07e0,$0000
	dc.w	$0ff0,$0000
	dc.w	$0ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$1ff8,$0000
	dc.w	$0ff8,$0000
	dc.w	$07f0,$0000
	dc.w	$03c0,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

EXP_2:
	dc.w	$0200,$0000
	dc.w	$0700,$0000
	dc.w	$0ae0,$0000
	dc.w	$1140,$0000
	dc.w	$22a8,$0000
	dc.w	$4eac,$0000
	dc.w	$2afb,$0000
	dc.w	$c3f6,$0000
	dc.w	$af5a,$0000
	dc.w	$5364,$0000
	dc.w	$0d30,$0000
	dc.w	$28a2,$0000
	dc.w	$37ca,$0000
	dc.w	$2d54,$0000
	dc.w	$10a8,$0000
	dc.w	$0510,$0000

	dc.w	$0400,$0000
	dc.w	$0880,$0000
	dc.w	$1210,$0000
	dc.w	$2108,$0000
	dc.w	$4220,$0000
	dc.w	$0e22,$0000
	dc.w	$a2e0,$0000
	dc.w	$03e5,$0000
	dc.w	$0f58,$0000
	dc.w	$9364,$0000
	dc.w	$4131,$0000
	dc.w	$0021,$0000
	dc.w	$4708,$0000
	dc.w	$4d12,$0000
	dc.w	$2044,$0000
	dc.w	$08a8,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1df0,$0000
	dc.w	$3ef8,$0000
	dc.w	$7dd8,$0000
	dc.w	$71de,$0000
	dc.w	$dd1f,$0000
	dc.w	$fc1b,$0000
	dc.w	$f0a6,$0000
	dc.w	$ec9a,$0000
	dc.w	$7ecf,$0000
	dc.w	$3fdf,$0000
	dc.w	$78f6,$0000
	dc.w	$72ee,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1ff0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7ff8,$0000
	dc.w	$7ffe,$0000
	dc.w	$ffff,$0000
	dc.w	$ffff,$0000
	dc.w	$fffe,$0000
	dc.w	$fffe,$0000
	dc.w	$7fff,$0000
	dc.w	$3fff,$0000
	dc.w	$7ffe,$0000
	dc.w	$7ffe,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1ff0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7ff8,$0000
	dc.w	$7ffe,$0000
	dc.w	$ffff,$0000
	dc.w	$ffff,$0000
	dc.w	$fffe,$0000
	dc.w	$fffe,$0000
	dc.w	$7fff,$0000
	dc.w	$3fff,$0000
	dc.w	$7ffe,$0000
	dc.w	$7ffe,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

EXP_3:
	dc.w	$0200,$0000
	dc.w	$0700,$0000
	dc.w	$0ae0,$0000
	dc.w	$1140,$0000
	dc.w	$22a8,$0000
	dc.w	$4eac,$0000
	dc.w	$295b,$0000
	dc.w	$c336,$0000
	dc.w	$ac3a,$0000
	dc.w	$5004,$0000
	dc.w	$0f70,$0000
	dc.w	$29a2,$0000
	dc.w	$37ca,$0000
	dc.w	$2d54,$0000
	dc.w	$10a8,$0000
	dc.w	$0510,$0000

	dc.w	$0400,$0000
	dc.w	$0880,$0000
	dc.w	$1210,$0000
	dc.w	$2108,$0000
	dc.w	$4220,$0000
	dc.w	$0e22,$0000
	dc.w	$a080,$0000
	dc.w	$0145,$0000
	dc.w	$0a58,$0000
	dc.w	$9244,$0000
	dc.w	$41b1,$0000
	dc.w	$0021,$0000
	dc.w	$4708,$0000
	dc.w	$4d12,$0000
	dc.w	$2044,$0000
	dc.w	$08a8,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1df0,$0000
	dc.w	$3ef8,$0000
	dc.w	$7dd8,$0000
	dc.w	$71de,$0000
	dc.w	$dfff,$0000
	dc.w	$ff7b,$0000
	dc.w	$f666,$0000
	dc.w	$ee7a,$0000
	dc.w	$7fcf,$0000
	dc.w	$3fdf,$0000
	dc.w	$78f6,$0000
	dc.w	$72ee,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1ff0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7ff8,$0000
	dc.w	$7ffe,$0000
	dc.w	$ffff,$0000
	dc.w	$ff7f,$0000
	dc.w	$fe7e,$0000
	dc.w	$fe7e,$0000
	dc.w	$7fff,$0000
	dc.w	$3fff,$0000
	dc.w	$7ffe,$0000
	dc.w	$7ffe,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1ff0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7ff8,$0000
	dc.w	$7ffe,$0000
	dc.w	$ffff,$0000
	dc.w	$ff7f,$0000
	dc.w	$fe7e,$0000
	dc.w	$fe7e,$0000
	dc.w	$7fff,$0000
	dc.w	$3fff,$0000
	dc.w	$7ffe,$0000
	dc.w	$7ffe,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000


EXP_4:
	dc.w	$0200,$0000
	dc.w	$0700,$0000
	dc.w	$0ae0,$0000
	dc.w	$1300,$0000
	dc.w	$2028,$0000
	dc.w	$4014,$0000
	dc.w	$300b,$0000
	dc.w	$d08a,$0000
	dc.w	$a106,$0000
	dc.w	$4288,$0000
	dc.w	$1000,$0000
	dc.w	$2c16,$0000
	dc.w	$362a,$0000
	dc.w	$2d54,$0000
	dc.w	$10a8,$0000
	dc.w	$0510,$0000

	dc.w	$0400,$0000
	dc.w	$0880,$0000
	dc.w	$1210,$0000
	dc.w	$24c8,$0000
	dc.w	$4900,$0000
	dc.w	$1422,$0000
	dc.w	$a190,$0000
	dc.w	$0a41,$0000
	dc.w	$0254,$0000
	dc.w	$9300,$0000
	dc.w	$4811,$0000
	dc.w	$0205,$0000
	dc.w	$4548,$0000
	dc.w	$4d12,$0000
	dc.w	$2044,$0000
	dc.w	$08a8,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1df0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7938,$0000
	dc.w	$743e,$0000
	dc.w	$d19f,$0000
	dc.w	$fbcf,$0000
	dc.w	$e3da,$0000
	dc.w	$f38e,$0000
	dc.w	$781f,$0000
	dc.w	$3e1b,$0000
	dc.w	$7b76,$0000
	dc.w	$72ee,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$00c0,$0000
	dc.w	$0040,$0000
	dc.w	$0000,$0000
	dc.w	$0400,$0000
	dc.w	$0040,$0000
	dc.w	$0180,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1ff0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7938,$0000
	dc.w	$74fe,$0000
	dc.w	$f1df,$0000
	dc.w	$fbcf,$0000
	dc.w	$e7de,$0000
	dc.w	$f3ce,$0000
	dc.w	$799f,$0000
	dc.w	$3e1f,$0000
	dc.w	$7f7e,$0000
	dc.w	$7ffe,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

	dc.w	$0600,$0000
	dc.w	$0f80,$0000
	dc.w	$1ff0,$0000
	dc.w	$3ff8,$0000
	dc.w	$7938,$0000
	dc.w	$74fe,$0000
	dc.w	$f1df,$0000
	dc.w	$fbcf,$0000
	dc.w	$e7de,$0000
	dc.w	$f3ce,$0000
	dc.w	$799f,$0000
	dc.w	$3e1f,$0000
	dc.w	$7f7e,$0000
	dc.w	$7ffe,$0000
	dc.w	$3ffc,$0000
	dc.w	$0fb8,$0000

EXP_5:
	dc.w	$0200,$0000
	dc.w	$0300,$0000
	dc.w	$0a40,$0000
	dc.w	$1000,$0000
	dc.w	$0008,$0000
	dc.w	$0004,$0000
	dc.w	$2009,$0000
	dc.w	$8080,$0000
	dc.w	$2006,$0000
	dc.w	$0288,$0000
	dc.w	$0000,$0000
	dc.w	$0016,$0000
	dc.w	$102a,$0000
	dc.w	$2414,$0000
	dc.w	$10a8,$0000
	dc.w	$0510,$0000

	dc.w	$0400,$0000
	dc.w	$0880,$0000
	dc.w	$0210,$0000
	dc.w	$2488,$0000
	dc.w	$4900,$0000
	dc.w	$1422,$0000
	dc.w	$a090,$0000
	dc.w	$0a41,$0000
	dc.w	$0014,$0000
	dc.w	$8300,$0000
	dc.w	$4811,$0000
	dc.w	$0205,$0000
	dc.w	$4148,$0000
	dc.w	$4412,$0000
	dc.w	$2000,$0000
	dc.w	$08a8,$0000

	dc.w	$0600,$0000
	dc.w	$0b80,$0000
	dc.w	$0d50,$0000
	dc.w	$3488,$0000
	dc.w	$4908,$0000
	dc.w	$342e,$0000
	dc.w	$8099,$0000
	dc.w	$8ac1,$0000
	dc.w	$601a,$0000
	dc.w	$a38a,$0000
	dc.w	$4815,$0000
	dc.w	$1213,$0000
	dc.w	$5962,$0000
	dc.w	$600e,$0000
	dc.w	$35a8,$0000
	dc.w	$0fb8,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$00c0,$0000
	dc.w	$0040,$0000
	dc.w	$0000,$0000
	dc.w	$0400,$0000
	dc.w	$0040,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0600,$0000
	dc.w	$0b80,$0000
	dc.w	$0f50,$0000
	dc.w	$3488,$0000
	dc.w	$4908,$0000
	dc.w	$34ee,$0000
	dc.w	$a0d9,$0000
	dc.w	$8ac1,$0000
	dc.w	$641e,$0000
	dc.w	$a3ca,$0000
	dc.w	$4815,$0000
	dc.w	$1217,$0000
	dc.w	$596a,$0000
	dc.w	$641e,$0000
	dc.w	$35a8,$0000
	dc.w	$0fb8,$0000

	dc.w	$0600,$0000
	dc.w	$0b80,$0000
	dc.w	$0f50,$0000
	dc.w	$3488,$0000
	dc.w	$4908,$0000
	dc.w	$34ee,$0000
	dc.w	$a0d9,$0000
	dc.w	$8ac1,$0000
	dc.w	$641e,$0000
	dc.w	$a3ca,$0000
	dc.w	$4815,$0000
	dc.w	$1217,$0000
	dc.w	$596a,$0000
	dc.w	$641e,$0000
	dc.w	$35a8,$0000
	dc.w	$0fb8,$0000

EXP_6:
	dc.w	$0000,$0000
	dc.w	$0300,$0000
	dc.w	$0840,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0004,$0000
	dc.w	$0001,$0000
	dc.w	$8080,$0000
	dc.w	$0002,$0000
	dc.w	$0280,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$1020,$0000
	dc.w	$0000,$0000
	dc.w	$10a0,$0000
	dc.w	$0010,$0000

	dc.w	$0400,$0000
	dc.w	$0800,$0000
	dc.w	$0000,$0000
	dc.w	$0088,$0000
	dc.w	$0100,$0000
	dc.w	$1402,$0000
	dc.w	$0010,$0000
	dc.w	$0840,$0000
	dc.w	$0010,$0000
	dc.w	$8200,$0000
	dc.w	$4811,$0000
	dc.w	$0201,$0000
	dc.w	$0140,$0000
	dc.w	$4000,$0000
	dc.w	$0000,$0000
	dc.w	$0080,$0000

	dc.w	$0400,$0000
	dc.w	$0b00,$0000
	dc.w	$0c40,$0000
	dc.w	$0088,$0000
	dc.w	$0100,$0000
	dc.w	$1406,$0000
	dc.w	$0011,$0000
	dc.w	$88c0,$0000
	dc.w	$001a,$0000
	dc.w	$8280,$0000
	dc.w	$4811,$0000
	dc.w	$0201,$0000
	dc.w	$1960,$0000
	dc.w	$4000,$0000
	dc.w	$15a0,$0000
	dc.w	$0090,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$00c0,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0400,$0000
	dc.w	$0040,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0400,$0000
	dc.w	$0b00,$0000
	dc.w	$0c40,$0000
	dc.w	$0088,$0000
	dc.w	$0100,$0000
	dc.w	$14c6,$0000
	dc.w	$0011,$0000
	dc.w	$88c0,$0000
	dc.w	$041a,$0000
	dc.w	$82c0,$0000
	dc.w	$4811,$0000
	dc.w	$0201,$0000
	dc.w	$1960,$0000
	dc.w	$4000,$0000
	dc.w	$15a0,$0000
	dc.w	$0090,$0000

	dc.w	$0400,$0000
	dc.w	$0b00,$0000
	dc.w	$0c40,$0000
	dc.w	$0088,$0000
	dc.w	$0100,$0000
	dc.w	$14c6,$0000
	dc.w	$0011,$0000
	dc.w	$88c0,$0000
	dc.w	$041a,$0000
	dc.w	$82c0,$0000
	dc.w	$4811,$0000
	dc.w	$0201,$0000
	dc.w	$1960,$0000
	dc.w	$4000,$0000
	dc.w	$15a0,$0000
	dc.w	$0090,$0000

EXP_7:
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0040,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0004,$0000
	dc.w	$0101,$0000
	dc.w	$8000,$0000
	dc.w	$0020,$0000
	dc.w	$0200,$0000
	dc.w	$0000,$0000
	dc.w	$0020,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0400,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0088,$0000
	dc.w	$0000,$0000
	dc.w	$1000,$0000
	dc.w	$0100,$0000
	dc.w	$0800,$0000
	dc.w	$0020,$0000
	dc.w	$0200,$0000
	dc.w	$0800,$0000
	dc.w	$0020,$0000
	dc.w	$0000,$0000
	dc.w	$4000,$0000
	dc.w	$0000,$0000
	dc.w	$0080,$0000

	dc.w	$0400,$0000
	dc.w	$0000,$0000
	dc.w	$0440,$0000
	dc.w	$0088,$0000
	dc.w	$0000,$0000
	dc.w	$1004,$0000
	dc.w	$0101,$0000
	dc.w	$8800,$0000
	dc.w	$0020,$0000
	dc.w	$0200,$0000
	dc.w	$0800,$0000
	dc.w	$0020,$0000
	dc.w	$0800,$0000
	dc.w	$4000,$0000
	dc.w	$0000,$0000
	dc.w	$0080,$0000

	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000
	dc.w	$0000,$0000

	dc.w	$0400,$0000
	dc.w	$0000,$0000
	dc.w	$0440,$0000
	dc.w	$0088,$0000
	dc.w	$0000,$0000
	dc.w	$1004,$0000
	dc.w	$0101,$0000
	dc.w	$8800,$0000
	dc.w	$0020,$0000
	dc.w	$0200,$0000
	dc.w	$0800,$0000
	dc.w	$0020,$0000
	dc.w	$0800,$0000
	dc.w	$4000,$0000
	dc.w	$0000,$0000
	dc.w	$0080,$0000

	dc.w	$0400,$0000
	dc.w	$0000,$0000
	dc.w	$0440,$0000
	dc.w	$0088,$0000
	dc.w	$0000,$0000
	dc.w	$1004,$0000
	dc.w	$0101,$0000
	dc.w	$8800,$0000
	dc.w	$0020,$0000
	dc.w	$0200,$0000
	dc.w	$0800,$0000
	dc.w	$0020,$0000
	dc.w	$0800,$0000
	dc.w	$4000,$0000
	dc.w	$0000,$0000
	dc.w	$0080,$0000



; ---------------------------------------------------------------------
;
; Ab hier stehen die Routinen zur Verwaltung der Schüsse
;
; ---------------------------------------------------------------------

DEL_SHOOTS:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	#$0100,BLTCON0		; D wird auf Null gesetzt
	MOVE.W	#$0000,BLTCON1		; zweites Kontrollreg. setzen
	MOVE.W	#FIELD_B-SHOOT_B,BLTDMOD ; Modulo setzen
	LEA	SO_BE_LAST,A0		; Adresse der Adressen
	MOVE.W	SO_ALAST,D2		; Anzahl der Schüsse am Schirm
	MOVE.W	AKT_SO,SO_ALAST		; vorletzte wird letzte
DSO_LOOP2:
	SUBQ.W	#1,D2			; Schleifenzähler veringern
	BMI.S	DEL_SO_END		; wenn neg, dann beenden
	MOVE.L	(A0)+,D0		; da war das Schiff vor 2 Bildern
	MOVEQ	#4,D1			; 5 Planes müssen bearbeitet werden
DSO_LOOP1:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter löschen
	MOVE.W	#SO_BLIT,BLTSIZE	; Blitter Starten
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	DBRA	D1,DSO_LOOP1		; nächster Blit
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter löschen
	MOVE.W	#SO_BLIT,BLTSIZE	; Blitter Starten
	BRA.S	DSO_LOOP2		; nächster Schuß
DEL_SO_END:
	LEA	SO_LAST,A0		; Adresse der Adressen
	LEA	SO_BE_LAST,A1		; dito
	MOVE.W	AKT_SO,D0		; Anzahl der aktiven Schüsse
	BEQ.S	DSO_END			; wenn Null, beenden
	SUBQ.W	#1,D0			; zum Schleifenzähler machen
DSO_LOOP3:
	MOVE.L	(A0)+,(A1)+		; vorletzte wird letzte
	DBRA	D0,DSO_LOOP3		; Schleife
DSO_END:
	RTS

MOVE_SHOOTS:
	TST.B	J_RELEASED		; Knopf seit letztem Bild losgelassen?
	BEQ.S	TST_M_BUTTON		; wenn nicht, dann überspringen
	BTST	#7,CIAA_PRA		; Joystickknopf gedrückt?
	SF	J_RELEASED		; Knopf-flag auf "gedrückt" setzen
	BEQ.S	MO_BUTTON		; Wenn ja, dann überspringen
TST_M_BUTTON:
	TST.B	M_RELEASED		; Knopf seit letztem Bild losgelassen?
	BEQ.S	MO_NO_BUTTON		; wenn nicht, dann überspringen
	BTST	#6,CIAA_PRA		; Knopf gedrückt?
	SF	M_RELEASED		; Knopf-flag auf "gedrückt" setzen
	BNE.S	MO_NO_BUTTON		; Wenn nicht, dann überspringen
MO_BUTTON:
	CMP.W	#SHOOT_M,AKT_SO		; schon zuviele Schüsse?
	BEQ.S	MO_NO_BUTTON		; Dann nächsten Teil überspringen
	MOVE.W	AKT_SO,D3		; Anzahl der Schüsse
	LSL.W	#2,D3			; Auf Longwordzeiger bringen
	MOVE.L	SH_X,D0			; X-Position des Schiffs holen
	ADDI.L	#SHOOT_X,D0		; X-Offset dazuaddieren
	LEA	SO_X,A0			; Adresse der X-Positionen
	MOVE.L	D0,0(A0,D3.W)		; Position abspeichern
	MOVE.L	SH_Y,D0			; Y-Position des Schiffs holen
	ADDI.L	#SHOOT_Y,D0		; Y-Offset dazuaddieren
	LEA	SO_Y,A1			; Adresse der Y-Positionen
	MOVE.L	D0,0(A1,D3.W)		; Position abspeichern
	ADDQ.W	#1,AKT_SO		; einen Schuß mehr
	BRA.S	LOADED			; nächsten Teil überspringen
MO_NO_BUTTON:
	LEA	SO_X,A0			; Adresse der X-Werte nach A0
	LEA	SO_Y,A1			; Adresse der Y-Werte nach A1
	MOVE.W	AKT_SO,D3		; Anzahl der Schüsse
	SUBQ.W	#1,D3			; um Eins vermindern
	LSL.W	#2,D3			; Auf Longwordzeiger bringen
LOADED:
	LEA	SO_LAST,A2		; Adresse der Zwischenspeicher
	MOVEQ	#0,D4			; Zähler, wenn Schuß im Aus
MSO_LOOP:
	TST.W	D3			; Schleifenzähler testen
	BMI	TEST_BUTTONS		; Beenden, wenn negativ

	CMP.L	#MAXX_SO,0(A0,D3.W)	; mit dem Maximalwert vergleichen
	BLE.S	SHOOT_X_OK		; wenn kleiner oder gleich, dann OK
	SUBQ.W	#1,AKT_SO		; ein Stern weniger
	BEQ	TEST_BUTTONS			; beenden, wenn kein Schuß mehr
	MOVE.W	D3,D5			; Zeiger kopieren
	MOVE.W	D4,D6			; Zähler kopieren
MSO_COPY_LOOP:
	SUBQ.W	#1,D6			; Zähler veringern
	BMI	MSO_NEXT		; wenn negativ, dann überspringen
	MOVE.L	4(A0,D5),0(A0,D5)	; X-Position kopieren
	MOVE.L	4(A1,D5),0(A1,D5)	; Y-Position kopieren
	MOVE.L	4(A2,D5),0(A2,D5)	; Zwischenspeicher kopieren
	ADDQ.L	#4,D5			; Zeiger erhöhen
	BRA.S	MSO_COPY_LOOP		; Schleife
SHOOT_X_OK:

	MOVE.L	0(A0,D3.W),D0		; D0 mit X-Position laden
	MOVE.L	0(A1,D3.W),D1		; D1 mit Y-Position laden
	JSR	CALC_POS		; Position umrechnen

	LSL.W	#8,D1			; Shiftwert um 8 Bits nach rechts
	LSL.W	#4,D1			; Shiftwert um 4 Bits nach rechts
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	D1,BLTCON1		; zweites Kontrollreg. setzen
	ADDI.W	#$0fca,D1		; ABCD an und D=AB+Ac
	MOVE.W	D1,BLTCON0		; D wird auf Null gesetzt

	CLR.W	BLTAMOD			; Schattenmaske: kein Modulo
	CLR.W	BLTBMOD			; Schussdaten:  kein Modulo
	MOVE.W	#FIELD_B-SHOOT_B,BLTCMOD ; Modulo setzen
	MOVE.W	#FIELD_B-SHOOT_B,BLTDMOD ; Modulo setzen
	ADD.L	FIELD_BASE1,D0		; Adresse des Spielfelds zu D0
	ADD.L	D2,D0			; Y-Offset dazu
	MOVE.L	D0,(A2,D3)		; vorletzte Adresse wird letzte

	MOVE.L	BOB_BASE,D2		; Zeiger auf Schiffsdaten
	ADDI.L	#6*SHIP_P,D2		; Adresse der Schussdaten berechnen
	MOVE.L	D2,BLTBPTH		; Zeiger auf Schussdaten setzen
	ADDI.L	#5*SHOOT_P,D2		; Adresse der Schattenmaske

	MOVEQ	#4,D1			; 5 Planes müssen bearbeitet werden
MSO_LOOP2:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D2,BLTAPTH		; Zeiger auf Schattenmaske setzen
	MOVE.L	D0,BLTCPTH		; Dort liegt der Hintergrund
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter hinkopieren
	MOVE.W	#SO_BLIT,BLTSIZE	; Blitter Starten
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	DBRA	D1,MSO_LOOP2		; nächster Blit
	ADDI.L	#FIELD_P,D0		; Adresse der Kollisions-Plane
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D2,BLTAPTH		; Zeiger auf Schattenmaske setzen
	MOVE.L	D0,BLTCPTH		; Dort liegt der Hintergrund
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter hinkopieren
	MOVE.W	#SO_BLIT,BLTSIZE	; Blitter Starten

	ADDI.L	#SHOOT_S,0(A0,D3.W)	; Speed zur X-Position addieren
MSO_NEXT:
	SUBQ.W	#4,D3			; Schleifenzähler veringern
	ADDQ.W	#1,D4			; einen Schuß mehr
	BRA	MSO_LOOP		; wenn neg, dann beenden
TEST_BUTTONS:
	BTST	#7,CIAA_PRA		; Joystickknopf gedrückt?
	SNE	J_RELEASED		; Wenn ja, dann setzen
	BTST	#6,CIAA_PRA		; Mausknopf gedrückt?
	SNE	M_RELEASED		; Wenn ja, dann setzen
	RTS

SO_X		DS.L	SHOOT_M		; X-Positionen der Schüsse
SO_Y		DS.L	SHOOT_M		; Y-Positionen der Schüsse
SO_LAST:	DS.L	SHOOT_M		; Adresse vor einem Videobild
SO_BE_LAST:	DS.L	SHOOT_M		; Adresse vor zwei Videobildern
AKT_SO:		DC.W	0		; Anzahl der Schüsse auf dem Feld
SO_ALAST:	DC.W	0		; Anzahl vor einem Frame
M_RELEASED:	DC.B	0		; Flag für den Mausknopfzustand
J_RELEASED:	DC.B	0		; Flag für den Joys.knopfzustand



; ---------------------------------------------------------------------
;
; Ab hier stehen die Routinen zur Verwaltung der Angreifer
;
; ---------------------------------------------------------------------

DEL_ENEMYS:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	#$0100,BLTCON0		; D wird auf Null gesetzt
	MOVE.W	#$0000,BLTCON1		; zweites Kontrollreg. setzen
	MOVE.W	#FIELD_B-ENEMY_B,BLTDMOD ; Modulo setzen
	LEA	EN_BE_LAST,A0		; Adresse der Adressen
	MOVE.W	#EN1_N-1,D2		; Anzahl der Angreifer
DEN_LOOP2:
	MOVE.L	(A0)+,D0		; da war das Schiff vor 2 Bildern
	BEQ.S	DEN_NEXT		; wenn auf Null: kein Angreifer
	MOVEQ	#4,D1			; 5 Planes müssen bearbeitet werden
DEN_LOOP1:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter löschen
	MOVE.W	#EN_BLIT,BLTSIZE	; Blitter Starten
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	DBRA	D1,DEN_LOOP1		; nächster Blit
DEN_NEXT:
	DBRA	D2,DEN_LOOP2		; nächster Angreifer
DEL_EN_END:
	LEA	EN_LAST,A0		; Adresse der Adressen
	LEA	EN_BE_LAST,A1		; dito
	MOVE.W	#EN1_N-1,D0		; Anzahl der Angreifer
DEN_LOOP3:
	MOVE.L	(A0)+,(A1)+		; vorletzte wird letzte
	DBRA	D0,DEN_LOOP3		; Schleife
DEN_END:
	RTS

MOVE_ENEMYS:
	JSR	INIT_ENEMYS1		; Bewegungroutine anspringen
	LEA	EN_ANIM,A0		; Animationsphasen
	LEA	EN_X,A1			; Adresse der X-Werte nach A0
	LEA	EN_Y,A2			; Adresse der Y-Werte nach A1
	LEA	EN_LAST,A3		; Adresse der Zwischenspeicher
	LEA	EN_GFX,A4		; Adresse der Bobadressen
	MOVEQ	#0,D3			; Long-Offset
	MOVEQ	#0,D4			; Byte-Offset
	MOVEQ	#EN1_N-1,D5		; Zähler
MEN_LOOP:
	TST.B	(A0,D4)			; Nicht vorhanden ?
	BEQ	MEN_OFF			; dann nächsten Teil überspringen

	MOVE.L	(A1,D3),D0		; D0 mit X-Position laden
	MOVE.L	(A2,D3),D1		; D1 mit Y-Position laden
	JSR	CALC_POS		; Position umrechnen

	LSL.W	#8,D1			; Shiftwert um 8 Bits nach rechts
	LSL.W	#4,D1			; Shiftwert um 4 Bits nach rechts
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	D1,BLTCON1		; zweites Kontrollreg. setzen
	MOVE.W	D1,D7			; D1 zwischenspeichern
	ADDI.W	#$0fca,D1		; ABCD an und D=AB+Ac
	MOVE.W	D1,BLTCON0		; erstes Kontrollregister setzen

	CLR.W	BLTAMOD			; Schattenmaske: kein Modulo
	CLR.W	BLTBMOD			; Angreiferdaten:  kein Modulo
	MOVE.W	#FIELD_B-ENEMY_B,BLTCMOD ; Modulo setzen
	MOVE.W	#FIELD_B-ENEMY_B,BLTDMOD ; Modulo setzen
	ADD.L	FIELD_BASE1,D0		; Adresse des Spielfelds zu D0
	ADD.L	D2,D0			; Y-Offset dazu
	MOVE.L	D0,(A3,D3)		; neue Adresse abspeichern

	MOVEQ	#0,D2			; D2 löschen
	MOVE.B	(A0,D4),D2		; Animationsphase holen
	LSL.L	#2,D2			; auf Longwordzeiger bringen
	MOVE.L	(A4,D2),D2		; Adresse der Grafikdaten holen
	MOVE.L	D2,BLTBPTH		; Zeiger auf Angreiferdaten setzen
	ADDI.L	#5*ENEMY_P,D2		; Adresse der Schattenmaske

	MOVEQ	#4,D1			; 5 Planes müssen bearbeitet werden
MEN_LOOP2:
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.L	D2,BLTAPTH		; Zeiger auf Schattenmaske setzen
	MOVE.L	D0,BLTCPTH		; Dort liegt der Hintergrund
	MOVE.L	D0,BLTDPTH		; Dort soll der Blitter hinkopieren
	MOVE.W	#EN_BLIT,BLTSIZE	; Blitter starten
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	DBRA	D1,MEN_LOOP2		; nächster Blit

	CMP.B	#EXP_ST,(A0,D4)		; Explodiert der Angreifer ?
	BGE.S	MEN_NEXT		; dann keine Kollisionsabfrage

	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	D7,BLTCON1		; zweites Kontrollregister setzen
	MOVE.W	#$0cc0,BLTCON0		; erstes Kontrollregister setzen
	MOVE.W	#FIELD_B-ENEMY_B,BLTAMOD ; Bildschirmdaten: Modulo setzen
	MOVE.L	D0,BLTAPTH		; Schiffskollisionsplane
	MOVE.W	#EN_BLIT,BLTSIZE	; Blitter starten
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	DMACONR,D6		; DMA-Register auslesen
	BTST	#13,D6			; Blitter-Zero-Bit testen
	BNE.S	NOT_DEAD		; wenn auf 1, dann nicht getroffen
	MOVE.L	#START_OVER,MAIN_JMP+2	; Vektor der Hauptschleife verbiegen
NOT_DEAD:
	ADDI.L	#FIELD_P,D0		; eine Plane weiter gehen
	MOVE.L	D0,BLTAPTH		; Schiffskollisionsplane
	MOVE.L	D2,BLTBPTH		; Zeiger auf Schattenmaske setzen
	MOVE.W	#EN_BLIT,BLTSIZE	; Blitter starten
	JSR	WAIT_BLT		; auf Ende des Blits warten
	MOVE.W	DMACONR,D6		; DMA-Register auslesen
	BTST	#13,D6			; Blitter-Zero-Bit testen
	BNE.S	MEN_NEXT		; wenn auf 1, dann nicht getroffen
	MOVE.B	#EXP_ST-1,(A0,D4)	; Angreifer ausschalten
MEN_NEXT:
	ADDQ.W	#4,D3			; Long-Offset erhöhen
	ADDQ.W	#1,D4			; Byte-Offset erhöhen
	DBRA	D5,MEN_LOOP		; wenn neg, dann beenden
MEN_END:
	RTS
MEN_OFF:
	CLR.L	(A3,D3)			; Angreifer ausschalten
	BRA.S	MEN_NEXT		; weiter machen

EN1_N	EQU	12			; Anzahl der Angreifer
EN1_P	EQU	4			; Anzahl der Animationsphasen

INIT_ENEMYS1:
	MOVEQ	#EN_M-1,D0		; Anzahl der Angreifer
	LEA	EN_ANIM,A0		; Adresse der Animationsphasen
INIT_E1_LOOP1:
	CLR.B	(A0)+			; Angreifer löschen
	DBRA	D0,INIT_E1_LOOP1	; Schleife

	MOVEQ	#EN1_N-1,D1		; Anzahl der Angreifer
	LEA	EN_1,A0			; Adresse der Geschwindigkeiten
INIT_E1_LOOP2:
	MOVEQ	#0,D0			; D0 löschen
	JSR	FAST_RAND		; Zufallszahl holen
	ANDI.B	#$3,D0			; Zahlen zwischen 0 und 3
	ADDQ.B	#1,D0			; Zahlen zwischen 1 und 4
	MOVE.L	D0,(A0)+		; Angreifer löschen
	DBRA	D1,INIT_E1_LOOP2	; Schleife

	MOVE.W	#EN1_N,EN_AKT		; Anzahl der Angreifer abspeichern

	MOVEQ	#0,D0			; Angreifer am Schirm
	MOVEQ	#25,D1			; Wartezähler
	MOVEQ	#0,D2			; Byte-Offset
	MOVEQ	#0,D3			; Long-Offset
	MOVEQ	#0,D4			; Byte-Offset
	MOVEQ	#0,D5			; Long-Offset
	MOVEQ	#EN1_N-1,D6		; Zähler setzen

	LEA	EN_X,A0			; Adresse der X-Werte
	LEA	EN_Y,A1			; Adresse der Y-Werte
	LEA	EN_BE_LAST,A2		; Adresse vor zwei Videobildern
	LEA	EN_LAST,A3		; Adresse vor einem Videobild
	LEA	EN_ANIM,A4		; Adresse der Animationsphasen
	LEA	EN_1,A5			; Adresse des 1. Hilfsarays
	LEA	EN_MOVEM,A6		; Adresse des Zwischenspeichers
	MOVEM.L	D0-D3,-(A6)		; Register zwischenspeichern
	MOVEM.L	D4-D6/A0-A5,-(A6)	; Register zwischenspeichern
	MOVE.L	A6,EN_STACK		; Adresse des Pseudostacks ablegen
	MOVE.L	#MOVE_ENEMYS1,MOVE_ENEMYS+2 ; Vektor verbiegen	

MOVE_ENEMYS1:
	TST.W	EN_AKT			; alle Angreifer erledigt?
	BNE.S	ME1_NOT_FINISHED	; wenn nicht, weiter machen
	MOVE.L	#INIT_ENEMYS2,MOVE_ENEMYS+2 ; Vektor verbiegen	
ME1_NOT_FINISHED:
	MOVEA.L	EN_STACK,A6		; Adresse des Zwischenspeichers
	MOVEM.L	(A6)+,D4-D6/A0-A5	; Register holen
	MOVEM.L	(A6)+,D0-D3		; Register holen
	SUBQ.W	#1,D1			; Wartezähler erniedrigen
	BPL.S	ME1_LOOP		; wenn noch nicht -1, dann springen 
	CMP.W	#EN1_N,D0		; schon alle Angreifer am Schirm?
	BEQ.S	ME1_LOOP		; dann überspringen
	ADDQ.W	#1,D0			; Anzahl der Angreifer erhöhen
	MOVE.L	#367,(A0,D3)		; Anfangs X-Wert schreiben 367
	MOVE.L	#303,(A1,D3)		; Anfangs Y-Wert schreiben
	MOVE.L	#0,(A2,D3)		; Dummy-Adresse schreiben
	MOVE.B	#1,(A4,D2)		; Animationsphase schreiben
	MOVE.W	#7,D1			; Wartezähler neu setzen
	ADDQ.W	#1,D2			; Byte-Offset erhöhen
	ADDQ.W	#4,D3			; Long-Offset erhöhen
ME1_LOOP:
	TST.B	(A4,D4)			; wird Bob nicht angezeigt?
	BEQ.S	ME1_NOT_NEG2		; dann überspringen
	CMP.B	#EN1_P,(A4,D4)		; letzte Animationsphase?
	BEQ.S	ME1_LAST_ANIM		; dann überspringen
	CMP.B	#EXP_ED,(A4,D4)		; letzte Explosionsphase?
	BEQ.S	ME1_IS_DEAD		; dann endlich ausschalten
	ADDQ.B	#1,(A4,D4)		; sonst Animationsphase erhöhen
	BRA.S	ME1_IS_ANIMATED		; nächsten Teil überspringen
ME1_IS_DEAD:
	CLR.B	(A4,D4)			; Animationsphase auf Null
	SUBQ.W	#1,EN_AKT		; ein Angreifer weniger
	BRA.S	ME1_IS_ANIMATED		; nächsten Teil überspringen
ME1_LAST_ANIM:
	MOVE.B	#1,(A4,D4)		; auf erste Animationsphase stellen
ME1_IS_ANIMATED:
	MOVE.L	(A5,D5),D7		; Geschwindigkeit holen
	SUB.L	D7,(A0,D5)		; X-Position erniedrigen
	BPL.S	ME1_NOT_NEG1		; wenn positiv, dann springen
	CLR.B	(A4,D4)			; den Angreifer rauswerfen
	CLR.L	(A3,D5)			; Dummyadresse schreiben
	SUBQ.W	#1,EN_AKT		; ein Angreifer weniger
ME1_NOT_NEG1:
	SUBQ.L	#4,(A1,D5)		; Y-Position erniedrigen
	BPL.S	ME1_NOT_NEG2		; wenn positiv, dann springen
	CLR.B	(A4,D4)			; den Angreifer rauswerfen
	CLR.L	(A3,D5)			; Dummyadresse schreiben
	SUBQ.W	#1,EN_AKT		; ein Angreifer weniger
ME1_NOT_NEG2:
	ADDQ.W	#1,D4			; Byte-Offset erhöhen
	ADDQ.W	#4,D5			; Long-Offset erhöhen
	DBRA	D6,ME1_LOOP		; Schleife machen
ME1_END:
	MOVEM.L	D0-D3,-(A6)		; Register zwischenspeichern
	RTS

EN2_N	EQU	9			; Anzahl der Angreifer
EN2_P	EQU	4			; Anzahl der Animationsphasen
EN2_O	EQU	5			; Tabellenoffset zw. 2 Angreifern

INIT_ENEMYS2:
	MOVEQ	#EN_M-1,D0		; Anzahl der Angreifer
	LEA	EN_ANIM,A0		; Adresse der Animationsphasen
INIT_E2_LOOP1:
	CLR.B	(A0)+			; Angreifer löschen
	DBRA	D0,INIT_E2_LOOP1	; Schleife

	MOVE.W	#EN2_N,EN_AKT		; Anzahl der Angreifer abspeichern

	MOVEQ	#0,D0			; Angreifer am Schirm
	MOVEQ	#0,D1			; Wartezähler
	MOVEQ	#0,D2			; Byte-Offset
	MOVEQ	#0,D3			; Long-Offset
	MOVEQ	#0,D4			; Byte-Offset
	MOVEQ	#0,D5			; Long-Offset
	MOVEQ	#EN2_N-1,D6		; Zähler setzen
	MOVEQ	#0,D7			; Tabellenoffset

	LEA	EN_X,A0			; Adresse der X-Werte
	LEA	EN_Y,A1			; Adresse der Y-Werte
	LEA	EN_BE_LAST,A2		; Adresse vor zwei Videobildern
	LEA	EN_Y2,A3		; Adresse vor einem Videobild
	LEA	EN_ANIM,A4		; Adresse der Animationsphasen
	LEA	EN_X2,A5		; Adresse der Bewegungstabelle
	LEA	EN_MOVEM,A6		; Adresse des Zwischenspeichers
	MOVEM.L	D0-D3/D7,-(A6)		; Register zwischenspeichern
	MOVEM.L	D4-D6/A0-A5,-(A6)	; Register zwischenspeichern
	MOVE.L	A6,EN_STACK		; Adresse des Pseudostacks ablegen
	MOVE.L	#MOVE_ENEMYS2,MOVE_ENEMYS+2 ; Vektor verbiegen	

MOVE_ENEMYS2:
	TST.W	EN_AKT			; alle Angreifer erledigt?
	BNE.S	ME2_NOT_FINISHED	; wenn nicht, weiter machen
	MOVE.L	#INIT_ENEMYS1,MOVE_ENEMYS+2 ; Vektor verbiegen	
ME2_NOT_FINISHED:
	MOVEA.L	EN_STACK,A6		; Adresse des Zwischenspeichers
	MOVEM.L	(A6)+,D4-D6/A0-A5	; Register holen
	MOVEM.L	(A6)+,D0-D3/D7		; Register holen
	SUBQ.W	#1,D1			; Wartezähler erniedrigen
	BPL.S	ME2_LOOP		; wenn noch nicht -1, dann springen 
	CMP.W	#EN2_N,D0		; schon alle Angreifer am Schirm?
	BEQ.S	ME2_LOOP		; dann überspringen
	ADDQ.W	#1,D0			; Anzahl der Angreifer erhöhen
	MOVE.L	#0,(A2,D3)		; Dummy-Adresse schreiben
	MOVE.B	#1,(A4,D2)		; Animationsphase schreiben
	MOVE.W	#EN2_O-1,D1		; Wartezähler neu setzen
	ADDQ.W	#1,D2			; Byte-Offset erhöhen
	ADDQ.W	#4,D3			; Long-Offset erhöhen
ME2_LOOP:
	MOVE.L	(A5,D7.L),(A0,D5)	; X-Position schreiben
	MOVE.L	(A3,D7.L),(A1,D5)	; Y-Position schreiben
	SUBA.L	#EN2_O*4,A5		; einen Eintrag weiter
	SUBA.L	#EN2_O*4,A3		; einen Eintrag weiter
	TST.B	(A4,D4)			; wird Bob nicht angezeigt?
	BEQ.S	ME2_IS_ANIMATED		; dann überspringen
	CMP.B	#EN1_P,(A4,D4)		; letzte Animationsphase?
	BEQ.S	ME2_LAST_ANIM		; dann überspringen
	CMP.B	#EXP_ED,(A4,D4)		; letzte Explosionsphase?
	BEQ.S	ME2_IS_DEAD		; dann endlich ausschalten
	ADDQ.B	#1,(A4,D4)		; sonst Animationsphase erhöhen
	BRA.S	ME2_IS_ANIMATED		; nächsten Teil überspringen
ME2_IS_DEAD:
	CLR.B	(A4,D4)			; Animationsphase auf Null
	SUBQ.W	#1,EN_AKT		; ein Angreifer weniger
	BRA.S	ME2_IS_ANIMATED		; nächsten Teil überspringen
ME2_LAST_ANIM:
	MOVE.B	#1,(A4,D4)		; auf erste Animationsphase stellen
ME2_IS_ANIMATED:
	ADDQ.W	#1,D4			; Byte-Offset erhöhen
	ADDQ.W	#4,D5			; Long-Offset erhöhen
	DBRA	D6,ME2_LOOP		; Schleife machen
ME2_END:
	ADDQ.L	#4,D7			; einen Tabellenwert weiter gehen
	CMP.L	#4*(EN_TL1+EN2_N*EN2_O),D7 ; Tabellenende erreicht?
	BLE.S	ME2_NOT_TAB_END		; wenn nicht, nächsten Teil überspringen
	MOVE.L	#INIT_ENEMYS1,MOVE_ENEMYS+2 ; Vektor verbiegen	
ME2_NOT_TAB_END:
	MOVEM.L	D0-D3/D7,-(A6)		; Register zwischenspeichern
	RTS

EN_1:		DS.L	EN_M		; Hilfsarray #1
EN_X:		DS.L	EN_M		; X-Positionen der Schüsse
EN_Y:		DS.L	EN_M		; Y-Positionen der Schüsse
EN_LAST:	DS.L	EN_M		; Adresse vor einem Videobild
EN_BE_LAST:	DS.L	EN_M		; Adresse vor zwei Videobildern
		DS.L	15		; Platz zum zwischenspeichern
EN_MOVEM:				; Endadresse des Speichers
EN_STACK:	DS.L	1		; Adresse des Stacks
EN_GFX:		DC.L	0		; kein Angreifer
		DC.L	6*SHIP_P+6*SHOOT_P
		DC.L	6*SHIP_P+6*SHOOT_P+6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+2*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+3*6*ENEMY_P
		DC.L	0
		DC.L	6*SHIP_P+6*SHOOT_P+4*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+5*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+6*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+7*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+8*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+9*6*ENEMY_P
		DC.L	6*SHIP_P+6*SHOOT_P+10*6*ENEMY_P
EN_AKT:		DS.W	1		; Zähler der noch aktiven Angreifer
EN_ANIM:	DS.B	EN_M		; Zähler für die Animationsphasen
	EVEN
EN_TL1	EQU	212			; Länge einer Tabelle
EN_X2:
	DC.L	0,4,8,12,16,20,24,28,32,36
	DC.L	40,44,48,52,56,60,64,68,72,76
	DC.L	80,84,88,92,96,100,104,108,112,116
	DC.L	120,124,128,132,136,140,144,148,152,156
	DC.L	160,164,168,172,176,180,184,188,192,201
	DC.L	210,219,228,236,244,252,258,264,269,274
	DC.L	277,280,281,282,281,280,277,274,269,264
	DC.L	258,252,244,236,228,219,210,201,192,183
	DC.L	174,165,156,147,140,132,126,120,115,110
	DC.L	107,104,103,102,103,104,107,110,115,120
	DC.L	126,132,140,148,156,165,174,183,192,201
	DC.L	210,219,228,236,244,252,258,264,269,274
	DC.L	277,280,281,282,281,280,277,274,269,264
	DC.L	258,252,244,236,228,219,210,201,192,183
	DC.L	174,165,156,147,140,132,126,120,115,110
	DC.L	107,104,103,102,103,104,107,110,115,120
	DC.L	126,132,140,148,156,165,174,183,192,196
	DC.L	200,204,208,212,216,220,224,228,232,236
	DC.L	240,244,248,252,256,260,264,268,272,276
	DC.L	280,284,288,292,296,300,304,308,312,316
	DC.L	320,324,328,332,336,340,344,348,352,356
	DC.L	360,364
	DS.L	EN2_N*EN2_O
EN_Y2:
	DC.L	50,53,56,59,63,66,69,72,75,79
	DC.L	82,85,88,91,94,97,99,102,105,108
	DC.L	110,113,115,118,120,122,125,127,129,131
	DC.L	133,134,136,138,139,141,142,143,144,145
	DC.L	146,147,148,148,149,149,149,149,150,153
	DC.L	156,159,162,165,168,171,174,177,180,183
	DC.L	186,189,192,195,198,201,204,207,210,213
	DC.L	216,219,222,225,228,231,234,237,240,237
	DC.L	234,231,228,225,222,219,216,213,210,207
	DC.L	204,201,198,195,192,189,186,183,180,177
	DC.L	174,171,168,165,162,159,156,153,150,153
	DC.L	156,159,162,165,168,171,174,177,180,183
	DC.L	186,189,192,195,198,201,204,207,210,213
	DC.L	216,219,222,225,228,231,234,237,240,237
	DC.L	234,231,228,225,222,219,216,213,210,207
	DC.L	204,201,198,195,192,189,186,183,180,177
	DC.L	174,171,168,165,162,159,156,153,150,151
	DC.L	151,151,151,151,152,152,153,153,154,154
	DC.L	155,156,157,158,159,160,161,162,163,165
	DC.L	166,167,169,170,171,173,174,176,178,179
	DC.L	181,183,184,186,188,190,191,193,195,197
	DC.L	199,200
	DS.L	EN2_N*EN2_O


; ---------------------------------------------------------------------
;
; Ab hier stehen der Stack, unsere Variablen und Zwischenspeicher (Buffer)
;
; ---------------------------------------------------------------------

STACK_END:	DS.W	2048		; neuer Stack-Speicher
STACK:		DC.W	0		; oberes Stack-Ende
ADR7:		DC.L	0		; Zwischenspeicher fuer A7
PAGE0:		DS.L	62		; Zwischenspeicher der "Zeropage"
INTENA_BUF:	DC.W	0		; Zwischenspeicher des Int.-Registers
DMACON_BUF:	DC.W	0		; Zwischenspeicher des DMA-Kontrollreg.
CIAA_CRA_BUF:	DC.B	0		; Zwischenspeicher des Steuerregisters
CIAA_CRB_BUF:	DC.B	0		; Zwischenspeicher des Steuerregisters
WAVE_BASE:	DC.L	0		; Adresse unseres Speichers
INTUI_BASE:	DC.L	0		; Adresse der intuition-library
DOS_BASE:	DC.L	0		; Adresse der dos-library
BOB_BASE:	DC.L	0		; Adresse des Objektspeichers
TITLE_BASE:	DC.L	0		; Adresse des Titlebild-Speichers
FIELD_BASE:	DC.L	0		; Adresse des Spielfeld-Speichers
FIELD_BASE1:	DC.L	0		; Adresse des Spielfelds #1
FIELD_BASE2:	DC.L	0		; Adresse des Spielfelds #2
FILE:		DC.L	0		; Adresse des File-Handles
TITLE_CMAP:	DS.W	32		; Platz fuer die Titelbildfarben
STARS_DEL:	DS.L	STARS		; zu löschende Sterne
STARS_ADR:	DS.L	STARS		; letze benutzte Adresse
STARS_POS	DS.W	STARS		; X-Position des Sterns
STARS_SPEED:	DS.W	STARS		; Geschwindigkeit des Sterns
ERRORN:		DC.W	0		; Nummer der Fehlermeldung
REST		DC.L	0		; Anzahl der noch nicht gelesenen Bytes
POSITION	DC.L	0		; aktuelle Position im Buffer
BUFFER		DC.L	0		; Adresse des Buffers
ALERTS:		DC.L    ALERT0,ALERT1	; Adressen der Alert-Texte
		DC.L	ALERT2,ALERT3
		DC.L	ALERT4,ALERT5
		DC.L	ALERT6,ALERT7
		DC.L	ALERT8
MAIN_CMAP:	DC.W	$000,$444,$ef0,$f8c,$aac,$669,$337,$115
		DC.W	$8dc,$5aa,$387,$155,$baa,$967,$735,$514
		DC.W	$bbb,$888,$444,$ffa,$fb0,$f60,$b00,$900
		DC.W	$700,$000,$999,$666,$bba,$9a7,$674,$452
DOS_NAME:	DC.B	"dos.library",0
GFX_NAME:	DC.B	"gfx.library",0	
INTUI_NAME:	DC.B	"intuition.library",0
TITLE_NAME:	DC.B	"Title.pic"
ALERT0:		DC.B	0,16,16,"Fehler #0: kann nicht genuegend CHIP-memory"
		DC.B	" bekommen !",0,0
ALERT1:		DC.B	0,16,16,"Fehler #1: kann DOS-library nicht oeffnen !",0,0
ALERT2:		DC.B	0,16,16,"Fehler #2: erster Chunk kein FORM-Chunk !",0,0
ALERT3:		DC.B	0,16,16,"Fehler #3: zweiter Chunk kein ILBM-Chunk !",0,0
ALERT4:		DC.B	0,16,16,"Fehler #4: IFF-Bild breiter als gewuenscht !",0,0
ALERT5:		DC.B	0,16,16,"Fehler #5: IFF-Bild hoeher als gewuenscht !",0,0
ALERT6:		DC.B	0,16,16,"Fehler #6: kann IFF-Bild nicht oeffnen !",0,0
ALERT7:		DC.B	0,16,16,"Fehler #7: IFF-file kuerzer als erwartet !",0,0
ALERT8:		DC.B	0,16,16,"Fehler #8: kein Speicher für den "
		DC.B	"Read-Buffer da !",0,0

       END

