	IFND	includeflag
levelflag = 1
	INCLUDE	Work:Sources/T3/T3_Main
	ENDC

;
;                           JumpTable
;

	bra.w	Init_World
	bra.w	Init_Datas
	bra.w	Next_Level
	bra.w	Fade_Colors
	bra.w	StartFlash
	bra.w	Copy_Colors
	dc.l	Bob_Info_Tab_Adrs
	dc.l	B_coltab

COPCOL2	= $1a0

Sound		= $70200
world5_data	= $11200
Rotate_Buffer2	= $2e4a8
module_Buffer	= Rotate_Buffer2-7424

character	= world5_data+$0000
level_GFX	= world5_data+$B43A
Level1		= world5_data+$8000
Macros		= world5_data+$AF3A
belt_GFX	= world5_data+$B13A
stampf_GFX	= world5_data+$DF28
kreis_GFX	= world5_data+$12038
kreis_Buffer	= level_Buffer+4120
walker_GFX	= world5_data+$F728
leg_GFX		= world5_data+$10BF8
kreis_mod_buffer= Work_Buffer4+1000
electro_GFX	= world5_data+$134d8
walker_char_GFX	= electro_GFX+720
cannon_GFX	= world5_data+$13a28
canon_Buffer	= Work_Buffer3
contra_PACK	= world5_data+$14428
contra_GFX	= Rotate_Buffer2+17*128
Level2		= world5_data+$14428+8654
contra_flip	= module_Buffer
contra_flash	= Work_Buffer1
machine_PACK	= world5_data+$1670e
Level3		= machine_PACK+10806
machine_flip	= module_Buffer
machine_decrunch= kreis_GFX
machine_GFX	= machine_decrunch+33*128
Rotate_Buffer3	= Rotate_Buffer2+10240
little_PACK	= world5_data+$19248
little_GFX	= Rotate_Buffer2
little_flip	= Work_Buffer3
walker_flash	= world5_data+$1b530

	;-$1b5a0

;
;			    Level Daten
;
bob00 	= $00000
msk00 	= $000a8
bob01 	= $000d2
msk01 	= $001d2
bob02 	= $00212
msk02 	= $00312
bob03 	= $00352
msk03 	= $00452
bob04 	= $00492
msk04 	= $00c92
bob05 	= $00e92
msk05 	= $01092
bob06 	= $01112
msk06 	= $01252
bob07 	= $012a2
msk07 	= $01462
bob08 	= $014d2
msk08 	= $016b2
bob09 	= $0172a
msk09 	= $0191a
bob0a 	= $01996
msk0a 	= $01b96
bob0b 	= $01c16
msk0b 	= $01c96
bob0c 	= $01cb6
msk0c 	= $01d36
bob0d 	= $01d56
msk0d 	= $01f16
bob0e 	= $01f86
msk0e 	= $02136
bob0f 	= $021a2
msk0f 	= $02362
bob10 	= $023d2
msk10 	= $02582
bob11 	= $025ee
msk11 	= $026de
bob12 	= $0271a
msk12 	= $0281a
bob13 	= $0285a
msk13 	= $02a1a
bob14 	= $02a8a
msk14 	= $02ada


Abob00 	= $00000
Abob01 	= $00a80
Abob02 	= $015a8

		;AdressOffset,Anzahl Zeilen gesamt (Bob+maske),Breite pro Zeile
level_flipI:
		dc.w	bob05,32*5,32/8
		dc.w	bob0d,28*5,32/8
		dc.w	bob0e,27*5,32/8
		dc.w	bob0f,28*5,32/8
		dc.w	bob10,27*5,32/8
		dc.w	bob11,15*5,32/8
		dc.w	bob12,16*5,32/8
		dc.w	bob13,28*5,32/8
		dc.w	bob14,10*5,16/8
		dc.w	-1

canon_flipI:
		dc.w	Cbob00,32*4,32/8
		dc.w	Cbob01,32*4,32/8
		dc.w	Cbob02,32*4,32/8
		dc.w	Cbob03,32*4,32/8
		dc.w	Cbob04,32*4,32/8
		dc.w	-1

contra_flipI:
		dc.w	Tbob00,48*5,48/8
		dc.w	Tbob06,48*4,48/8
		dc.w	-1

machine_flipI:
		dc.w	Hbob00,112*5,112/8
		dc.w	-1

little_flipI:
		dc.w	Ibob0a,96*5,48/8
		dc.w	-1

Cue_Table1:	dc.w	0100,0113	;0 Start
		dc.w	0863,0561	;1 Kreis-Boss
		dc.w	0467,1425	;2
		dc.w	1485,1425	;3

Cue_Table2:	dc.w	26,177		;0 Start

Bob_Info_Tab_Adrs	dc.l	Diamond_Info_0
		;--1
		dc.l	Explo_Info_1	;1 Big Xplo
		dc.l	Explo_Info_2	;2 Small Xplo
		dc.l	Box_Info_1	;3 Extrabox
		dc.l	Box_Info_2	;4 Extrabox Deckel
		dc.l	Bonus_Info_1	;5 PowerUp
		dc.l	Rocket_Info_1	;6 Lenkrakete
		dc.l	Shoot_Info_1	;7 Schuss
		dc.l	CuePoint_Info_1	;8 Cuepoint
		dc.l	Mine_Info_1	;9 MinenExplo
		dc.l	Diamond_Info_1	;10 Diamant
		dc.l	Dorn_Info_1	;11 Dorn
		dc.l	Mutter_Info_1	;12 Mutter
		dc.l	Big_Info_1	;13 Big
		dc.l	Steel_Info_1	;14 Flamme
		dc.l	Canon_Info_1	;15 Kanone
		dc.l	Bullet_Info_1	;16 Kanonenkugel
		dc.l	Walker_Info_1	;17 Walker
		dc.l	BossWalker_Info_1	;18 Walker Flame
		dc.l	Belt_Info_4	;19 Flieband L
		dc.l	Belt_Info_1	;20 Flieband R
		dc.l	Stampf_Info_1	;21 Stampfer
		dc.l	Stampf_Info_2	;22 Stampfer upper
		dc.l	Kreis_Info_1	;23 Kreis-Boss
		dc.l	Contra_Info_1	;24 Contra-Boss
		dc.l	Rock_Info_1	;25 Rock schmal
		dc.l	Rock_Info_2	;26 Rock breit
		dc.l	CShot_Info_1	;27 Contra-Schuss
		dc.l	Hand_Info_1	;28 Contra-Hand
		dc.l	Machine_Info_1	;29 Machine-Boss I
		dc.l	Thruster_Info_1	;30 Walker-Thruster
		dc.l	BossCannon_Info_1	;31 Groe Kugel
		dc.l	BossCannon_Info_2	;32 Kleine Kugel
		dc.l	BossCannon_Info_3	;33 Kanonenrohr
		dc.l	Flame_Info_1	;34 Walker Flame
		dc.l	BossWalker_Info_2	;35 Walker Flame
		dc.l	Little_Info_1	;36 Walker Flame
		dc.l	Little_Info_2	;37 Walker Flame
		dc.l	Flash_Info_1	;38 Machine Flash

Explo_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	128		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Standart_BobAnim	;Routine, die Bob verwaltet
		dc.l	Explo_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Explo_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Standart_BobAnim	;Routine, die Bob verwaltet
		dc.l	Explo2_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Box_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Extrabox	;Routine, die Bob verwaltet
		dc.l	Box_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Box_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Box_Deckel	;Routine, die Bob verwaltet
		dc.l	Deckel_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Bonus_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Bonus	;Routine, die Bob verwaltet
		dc.l	Bonus1_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Shoot_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Shoot_Start	;Routine, die Bob verwaltet
		dc.l	Shoot_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Rocket_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	16		;Bob_I_Out_X_Val
		dc.w	16		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Rocket		;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Rocket_Info_2:	;Nur Dummy-Info, fr geflippte Rocket.
		dc.w	NORM+FLIP	;Bob_Mode
		dc.w	16		;Bob_I_Out_X_Val
		dc.w	16		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	-1*2		;A Modulo
		dc.w	-1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Rocket		;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

CuePoint_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	CuePointStart	;Routine, die Bob verwaltet
		dc.l	Rocket_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Mine_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	MineExplo	;Routine, die Bob verwaltet
		dc.l	MineExplo_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Diamond_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Diamond_Start2	;Routine, die Bob verwaltet
		dc.l	Diamond_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Diamond_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	1		;Blit-Breite in Wrtern
		dc.w	2		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Diamond		;Routine, die Bob verwaltet
		dc.l	Diamond_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$fffeffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Dorn_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Dorn_Start	;Routine, die Bob verwaltet
		dc.l	Dorn_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Mutter_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Start_Mutter	;Routine, die Bob verwaltet
		dc.l	Mutter_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Big_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	64		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	5		;Blit-Breite in Wrtern
		dc.w	10		;Blit-Breite in Bytes
		dc.w	20		;Hitpoints
		dc.l	Start_Big6	;Routine, die Bob verwaltet
		dc.l	Big_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Steel_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_steel	;Routine, die Bob verwaltet
		dc.l	Steel_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Canon_Info_1:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Start_Canon	;Routine, die Bob verwaltet
		dc.l	Canon_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	1		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Bullet_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_bullet	;Routine, die Bob verwaltet
		dc.l	Bullet_AnimTable;Zeiger auf nchste Anim

		dc.w	5		;Delay
		dc.w	5		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Walker_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	4		;Hitpoints
		dc.l	Walker_Start	;Routine, die Bob verwaltet
		dc.l	Walker_AnimTableL	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Flame_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Fire		;Routine, die Bob verwaltet
		dc.l	Fire_AnimTableL	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Belt_Info_1:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	3		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_BeltR	;Routine, die Bob verwaltet
		dc.l	Belt_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Belt_Info_2:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	3		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_BeltR	;Routine, die Bob verwaltet
		dc.l	Belt_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Belt_Info_3:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	3		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_BeltR	;Routine, die Bob verwaltet
		dc.l	Belt_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Belt_Info_4:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	3		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_BeltL	;Routine, die Bob verwaltet
		dc.l	Belt_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Stampf_Info_1:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	96		;Breite in Pixels
		dc.w	3		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	12		;Breite einer Zeile der Maske in Bytes
		dc.w	6*2		;A Modulo
		dc.w	6*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	6		;Blit-Breite in Wrtern
		dc.w	12		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Start_Stampf	;Routine, die Bob verwaltet
		dc.l	Stampf_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Stampf_Info_2:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	3		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Stampf_Slave	;Routine, die Bob verwaltet
		dc.l	Stampf_AnimTable2	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Kreis_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	96		;Breite in Pixels
		dc.w	48		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	12		;Breite einer Zeile der Maske in Bytes
		dc.w	6*2		;A Modulo
		dc.w	6*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	6		;Blit-Breite in Wrtern
		dc.w	12		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Kreis	;Routine, die Bob verwaltet
		dc.l	Kreis_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.


Contra_Info_1:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	64		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	12		;Breite einer Zeile der Maske in Bytes
		dc.w	6*2		;A Modulo
		dc.w	6*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	6		;Blit-Breite in Wrtern
		dc.w	12		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Start_Contra	;Routine, die Bob verwaltet
		dc.l	Contra_AnimTable1	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Rock_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	96		;Breite in Pixels
		dc.w	48		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Rock		;Routine, die Bob verwaltet
		dc.l	Rock_AnimTable1	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Rock_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	64		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Rock		;Routine, die Bob verwaltet
		dc.l	Rock_AnimTable2	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

CShot_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	64		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_shot	;Routine, die Bob verwaltet
		dc.l	Cshot_AnimTable1;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Hand_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	64		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	6		;Breite einer Zeile der Maske in Bytes
		dc.w	3*2		;A Modulo
		dc.w	3*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_hand	;Routine, die Bob verwaltet
		dc.l	Hand_AnimTable1	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Machine_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	96		;Breite in Pixels
		dc.w	48		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	14		;Breite einer Zeile der Maske in Bytes
		dc.w	7*2		;A Modulo
		dc.w	7*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	8		;Blit-Breite in Wrtern
		dc.w	16		;Blit-Breite in Bytes
		dc.w	100		;Hitpoints
		dc.l	Start_Machine	;Routine, die Bob verwaltet
		dc.l	Machine_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Thruster_Info_1:
		dc.w	FAST+BLOCK	;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	1		;Blit-Breite in Wrtern
		dc.w	2		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Thruster_Slave	;Routine, die Bob verwaltet
		dc.l	Thruster_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

BossCannon_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_Bslave	;Routine, die Bob verwaltet
		dc.l	BCannon_AnimTable1	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

BossCannon_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	16		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	1*2		;A Modulo
		dc.w	1*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_Bslave	;Routine, die Bob verwaltet
		dc.l	BCannon_AnimTable2	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

BossCannon_Info_3:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	32		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	handle_Bcannon	;Routine, die Bob verwaltet
		dc.l	BCannon_AnimTable3	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

BossWalker_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	64		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	5		;Blit-Breite in Wrtern
		dc.w	10		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Init_BigWalker	;Routine, die Bob verwaltet
		dc.l	BigWalker_AnimTable1	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

BossWalker_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	32		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	6		;Breite einer Zeile der Maske in Bytes
		dc.w	3*2		;A Modulo
		dc.w	3*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Init_BigWalker	;Routine, die Bob verwaltet
		dc.l	BigWalker_AnimTable2	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Little_Info_2:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	96		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	6		;Breite einer Zeile der Maske in Bytes
		dc.w	3*2		;A Modulo
		dc.w	3*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	100		;Hitpoints
		dc.l	handle_little	;Routine, die Bob verwaltet
		dc.l	Little_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Little_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	96		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	8		;Breite einer Zeile der Maske in Bytes
		dc.w	4*2		;A Modulo
		dc.w	4*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffff0000	;Bob_I_AFWM
		dc.w	5		;Blit-Breite in Wrtern
		dc.w	10		;Blit-Breite in Bytes
		dc.w	100		;Hitpoints
		dc.l	handle_little	;Routine, die Bob verwaltet
		dc.l	Little_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

Flash_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	64		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	48		;Breite in Pixels
		dc.w	96		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	10		;Breite einer Zeile der Maske in Bytes
		dc.w	5*2*4		;A Modulo
		dc.w	5*2*4		;B Modulo
		dc.w	planeb*4	;D Modulo
		dc.w	planeb		;Save Modulo
		dc.l	$ffffffff	;Bob_I_AFWM
		dc.w	5		;Blit-Breite in Wrtern
		dc.w	10		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	handle_machflash;Routine, die Bob verwaltet
		dc.l	Flash_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	6		;Delay Init
		dc.l	$ffffffff	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.

*---------------------------------------------------------------------------
*	Routine and AnimTable of     LITTLE
*---------------------------------------------------------------------------
		rsset	Bob_Special_1
Lluser0		rs.w	1
Lluser1		rs.w	1
Lluser2		rs.w	1
Llinit		rs.b	1
Llmode		rs.b	1
Llhit		rs.b	1
Llpos		rs.b	1
Llshot		rs.b	1
Llxlow		rs.b	1
Llylow		rs.b	1
Ldir		rs.b	1

init_little:
	move.l	a4,-(sp)

	lea	little_GFX,a0		;Source start
	lea	little_PACK,a1		;Dest   start
	lea	little_GFX+9260,a2	;Source end
	bsr	repack

	lea	little_flipI(pc),a3
	lea	little_GFX,a0
	lea	little_flip,a1
	jsr	Flip_Bobs

;	moveq	#0,d7
;	moveq	#1,d6
;	.do {
;		jsr	add_objectlast.w		;cape setup
;		move.l	#little_slave,O_HANDLE(a0)
;		move.l	#cape_spr,O_INFO(a0)
;		move.w	d7,O_PHA(a0)
;		st	O_SHOW(a0)
;		move.l	#$001f0023,O_XPOS(a0)
;		move.w	#150,lswait(a0)
;		addq.w	#1,d7
;		jsr	add_object.w
;		move.l	#little_slave,O_HANDLE(a0)
;		move.l	#cape_spr,O_INFO(a0)
;		move.w	d7,O_PHA(a0)
;		st	O_SHOW(a0)
;		move.l	#$001f0023,O_XPOS(a0)
;		move.w	#150,lswait(a0)
;		addq.w	#1,d7
;	} .loop d6

	lea	Area_Enter_Vector(pc),a1
	moveq	#36,d0
	bsr	Search_Last_Entry

	move.b	#20,Llmode(a4)
	st	Llinit(a4)
	clr.w	Llhit(a4)
	sf	Llshot(a4)
	sf	Llxlow(a4)
	sf	Llylow(a4)
	sf	Llpos(a4)
	sf	Ldir(a4)
	lea	.pow_tab1(pc),a0
	bsr	Make_Power
	move.w	d0,little_power

	move.l	(sp)+,a4
	rts
.pow_tab1:
	dc.w	80,80,60
	dc.w	150,250,140
	dc.w	200,300,160

little_power:	dc.w	0

handle_little:
	cmp.w	#4,Bob_Hit(a4)
	bne.s	.no_hit2
	st	Llhit(a4)
.no_hit2:
	bsr	Standart_Hit_Handler

	moveq	#100,d0
	sub.w	Bob_Power(a4),d0
	beq.s	.no_hit
	move.w	#100,Bob_Power(a4)
	sub.w	d0,little_power
	bpl.s	.no_hit
			move.w	#80,Lluser0(a4)		;Yes, init explosion-handler
			clr.w	Lluser1(a4)
			move.l	#handle_lexpl,Bob_Routine(a4)
			move.b	#BOB_NOCOL,Bob_Used(a4)
			st	no_time			;Do not decrement time
			move.b	#NORM,Bob_Race+1(a4)
			rts
.no_hit:
	moveq	#0,d0				;Jump to the current handler
	move.b	Llmode(a4),d0
	jmp	.lmode_tab(pc,d0.w)
.lmode_tab:
	bra.w	little_appear	;0
	bra.w	little_shot	;4
	bra.w	little_wait	;8
	bra.w	little_move	;12
	bra.w	little_beam	;16
first_wait:			;20		;Just wait for cape to fly off
	tst.b	Llinit(a4)
	beq.s	.no_init
		sf	Llinit(a4)
		move.w	#80+60,Lluser0(a4)
;		move.w	#2,O_PHA(a5)
;		st	O_SHOW(a5)
;		sf	O_COLEN(a5)
		move.b	#BOB_NOCOL,Bob_Used(a4)
		bsr	set_pos
.no_init:
	cmpi.w	#80,Lluser0(a4)
	blt.s	.lab1
		bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)
		bra.s	.lab0
.lab1:
		sf	Bob_BlitStatus(a4)
.lab0:
	subq.w	#1,Lluser0(a4)
	bpl.s	.no_next
		move.b	#4,Llmode(a4)
		st	Llinit(a4)
.no_next:
	rts
little_appear:					;The little man appears
	tst.b	Llinit(a4)			;Init ?
	beq.s	.no_init
		sf	Llinit(a4)		;Yes, setup variables
		move.w	#50,Lluser0(a4)
		move.b	#BOB_NOCOL,Bob_Used(a4)
		bsr	set_first_phase
		bsr	set_pos
.no_init:
	bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)
	subq.w	#1,Lluser0(a4)			;Time up ?
	bpl.s	.out
		addq.b	#4,Llmode(a4)		;Yes, next mode...
		st	Llinit(a4)
.out:
	rts

little_shot:					;Let little man shoot
	tst.b	Llinit(a4)			;Init ?
	beq.s	.no_init
		sf	Llinit(a4)		;Yes, init time & collision
		move.w	#90,Lluser0(a4)
		move.b	#BOB_TRUE,Bob_Used(a4)
.no_init:
	cmpi.w	#70,Lluser0(a4)			;Time to setup shot-phases ?
	bne.s	.no_set1
		bsr	set_phases		;Yes, setup phases
.no_set1:
	cmpi.w	#50,Lluser0(a4)			;Time to start shot ?
	bne.s	.no_set2
		not.b	Llshot(a4)
		beq.s	.lab1
			PLAY_FX	#$2f
			bsr	init_shot3	;1st type
			bra.s	.no_set2
.lab1:
			bsr	init_shot4	;2nd type
.no_set2:
	subq.w	#1,Lluser0(a4)			;Time up ?
	bpl.s	.out
		addq.b	#4,Llmode(a4)		;Yes, next mode...
		st	Llinit(a4)
.out:
	rts

little_wait:					;Just wait (to be hit)
	tst.b	Llinit(a4)			;Init ?
	beq.s	.no_init
		sf	Llinit(a4)		;Yes, setup wait-time
		move.w	#100,Lluser0(a4)
.no_init:
	cmpi.w	#50,Lluser0(a4)			;Time to lower arm ?
	bgt.s	.no_set1
		bsr	set_first_phase
.no_set1:
	subq.w	#1,Lluser0(a4)			;Time up ?
	bpl.s	.out
		tst.b	Llhit(a4)		;Yes, was the man hit ?
		bne.s	.lab1
			moveq	#12,d0		;No, move to next position
			bra.s	.lab0
.lab1:
			moveq	#16,d0		;Yes, beam to next position
.lab0:
		sf	Llhit(a4)		;Clear hit-memory
		move.b	d0,Llmode(a4)		;Setup next mode...
		st	Llinit(a4)
.out:
	rts

little_move:					;Move little man to next position
	tst.b	Llinit(a4)			;Init ?
	beq.s	.no_init
		sf	Llinit(a4)		;Yes, get next position
		bsr	next_pos
		moveq	#0,d0
		move.b	Llpos(a4),d0
		lea	Lpos_tab(pc),a0
		movem.w	0(a0,d0.w),d0-d1
		sub.w	Bob_X_Position(a4),d0		;Calc DX & DY to next position
		sub.w	Bob_Y_Position(a4),d1
		asl.w	#3,d0
		asl.w	#3,d1
		movem.w	d0-d1,Lluser0(a4)	;Store values
		sf	Llxlow(a4)
		sf	Llylow(a4)
		move.w	#31,Lluser2(a4)
		move.b	#BOB_TRUE,Bob_Used(a4)
;		st	O_COLEN(a5)		;Setup collision & phase
		bsr	set_first_phase
.no_init:
	move.b	Lluser0+1(a4),d0
	add.b	d0,Llxlow(a4)
	move.b	Lluser0(a4),d0
	ext.w	d0
	move.w	Bob_X_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_X_Position(a4)
	move.b	Lluser1+1(a4),d0
	add.b	d0,Llylow(a4)
	move.b	Lluser1(a4),d0
	ext.w	d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)

;	btst	#0,Lluser2+1(a4)		;Start "shadow-man" any 2nd frame
;	bne.s	.no_shadow
	subq.b	#1,fader_count
	bpl.s	.no_shadow
	move.b	#2,fader_count
		bsr	start_fader
.no_shadow:
	subq.w	#1,Lluser2(a4)			;Time up ?
	bpl.s	.out
		move.b	#4,Llmode(a4)		;Setup shooting-mode
		st	Llinit(a4)
.out:
	rts

fader_count:	dc.w	0

little_beam:					;Let man disappear & set him to new position
	tst.b	Llinit(a4)			;Init ?
	beq.s	.no_init
		sf	Llinit(a4)		;Yes, get new position-index
		bsr	next_pos
		move.w	#50,Lluser0(a4)		;Disappear in 1/2 s
		move.b	#BOB_NOCOL,Bob_Used(a4)
		bsr	set_first_phase
.no_init:
	bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)
	subq.w	#1,Lluser0(a4)			;Time up ?
	bpl.s	.out
			PLAY_FX	#$2e
		st	Llinit(a4)		;Yes, set appear-mode
		sf	Llmode(a4)
.out:
	rts

next_pos:					;Get index of next destination-position
	bsr	rnd
	andi.l	#$ffff,d0
	divu	#3,d0				;Get remainder: Values 0,1,2
	swap	d0
	add.w	d0,d0				;Convert to index
	add.w	d0,d0
	cmp.b	Llpos(a4),d0			;Check if position is identically to current one
	bne.s	.no_pos
		addq.b	#4,d0			;Yes, add 1 to index
		cmpi.b	#3<<2,d0		;Over the table-limit ?
		bne.s	.no_pos
			moveq	#0,d0		;Yes, reset value to zero
.no_pos:
	move.b	d0,Llpos(a4)			;Set new index
	rts

set_phases:					;Set phase according to player's position
	lea	Little_Info_2(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)

	move.w	T_posX,d0
	add.w	#16,d0
	cmp.w	Bob_X_Position(a4),d0			;Left or right side of little man ?
	bls.s	.lab1
		moveq	#22,d0
		sf	Ldir(a4)
		bra.s	.lab0
.lab1:
		moveq	#44,d0
		st	Ldir(a4)
.lab0:
	add.l	#Little_AnimTable,d0
	move.l	d0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	sf	Bob_BlitStatus(a4)

set_pos:					;Get position where to show the man
	lea	Lpos_tab(pc),a1
	moveq	#0,d0
	move.b	Llpos(a4),d0
	move.l	0(a1,d0.w),Bob_X_Position(a4)
	rts

set_first_phase:
	lea	Little_Info_1(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)

	move.l	#Little_AnimTable,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame

Lpos_tab:
	dc.w	31+16,35+32,238+16,35+32,132+16,99+32

	rsset	Bob_Special_1
Llswait	rs.w	1

little_slave:				;Cape slave
	subq.w	#1,Llswait(a4)
	bpl.s	.no_free
		bra	Out_Bob_Damage
.no_free:
	cmpi.w	#30,Llswait(a4)
	bge.s	.out
		btst	#0,Llswait+1(a4)
		beq.s	.set1
		sf	Bob_BlitStatus(a4)
		rts
.set1:
		move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
.out:
	rts


		rsset	Bob_Special_1
s3mode		rs.b	1
s3time		rs.b	1
s3xdir		rs.w	1
s3ydir		rs.w	1
s3xlow		rs.b	1
s3ylow		rs.b	1
s3user0		rs.w	1

init_shot3:
	move.l	a4,-(sp)
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	#Shot3_AnimTable,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.l	a4,a0
	move.l	(sp)+,a4

	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
	tst.b	Ldir(a4)
	beq.s	.lab1
		subq.w	#6,Bob_X_Position(a0)
		bra.s	.lab0
.lab1:
		addi.w	#36,Bob_X_Position(a0)
.lab0:
	addq.w	#8,Bob_Y_Position(a0)
	move.l	#handle_shot3,Bob_Routine(a0)	;Setup variables...
	clr.w	s3mode(a0)
	move.w	#30,s3user0(a0)
	clr.w	s3xlow(a0)
;	move.l	#shot3_spr,O_INFO(a0)
;	move.l	#shot3_col,O_COL(a0)
	move.w	#-2,Bob_Power(a0)
	rts

handle_shot3:
	moveq	#0,d0				;Handle current mode of shot
	move.b	s3mode(a4),d0
	jmp	.s3tab(pc,d0.w)
.s3tab:
	bra.w	.wait_start
	bra.w	.do_seek
.wait_start:					;Wait at the hand of the little man
	subq.b	#1,s3time(a4)
	bpl.s	.wait
		move.b	#16,s3time(a4)		;Start shot-smoke every 17th frame
;		bsr	init_shot3_slave
.wait:
	subq.w	#1,s3user0(a4)			;Time up ?
	bpl.s	.out
		addq.b	#4,s3mode(a4)		;Next mode
		moveq	#0,d6
		moveq	#0,d7
		move.w	T_posX,d6
		move.w	T_posY,d7		;Calc angle to player
		addi.w	#16+16,d6
		addi.w	#24+32,d7
		bsr	calc_ene_angle
		move.w	#128,d7
		sub.b	d1,d7
		move.b	d7,d0
		bsr	sin
		move.w	d0,d2
		move.b	d7,d0
		bsr	cos
		add.w	d0,d0
		add.w	d0,d0
		add.w	d2,d2
		add.w	d2,d2
		movem.w	d0/d2,s3xdir(a4)
.out:
	bra	Standart_BobAnim
.do_seek:					;Seek to player
	subq.b	#1,s3time(a4)			;Start shot-slave any 5th frame
	bpl.s	.no_start
		addq.b	#4,s3time(a4)
		bsr	init_shot3_slave
.no_start:
	move.b	s3xdir+1(a4),d0			;Handle movement
	add.b	d0,s3xlow(a4)
	move.b	s3xdir(a4),d0
	ext.w	d0
	move.w	Bob_X_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_X_Position(a4)
	move.b	s3ydir+1(a4),d0
	add.b	d0,s3ylow(a4)
	move.b	s3ydir(a4),d0
	ext.w	d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)

	bra	Standart_BobAnim

		rsset	Bob_Special_1
s3delay		rs.b	1

init_shot3_slave:				;Slave of shot type 3
	move.l	a4,-(sp)
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
	move.l	#shot3_slave,Bob_Routine(a0)
;	clr.w	O_PHA(a0)
;	st	O_SHOW(a0)
	sf	s3delay(a0)
	rts

shot3_slave:					;Handle shot 3 slave
	bra	Standart_BobAnim

Shot3_AnimTable:
		dc.l	main_GFX+Mbob0a,main_GFX+Mmsk0a
		dc.w	0,0,14,2,2,10,10
		dc.l	main_GFX+Mbob0b,main_GFX+Mmsk0b
		dc.w	0,2,7,2,2,10,10
		dc.l	main_GFX+Mbob0c,main_GFX+Mmsk0c
		dc.w	0,1,12,2,2,10,10
		dc.l	main_GFX+Mbob0d,main_GFX+Mmsk0d
		dc.w	0,0,14,2,2,10,10
		dc.l	main_GFX+Mbob0e,main_GFX+Mmsk0e
		dc.w	0,0,14,2,2,10,10
		dc.l	main_GFX+Mbob0f,main_GFX+Mmsk0f
		dc.w	0,1,14,2,2,10,10
		dc.l	main_GFX+Mbob10,main_GFX+Mmsk10
		dc.w	0,2,13,2,2,10,10
		dc.l	main_GFX+Mbob11,main_GFX+Mmsk11
		dc.w	0,2,13,2,2,10,10
		dc.w	ENTRY_END
		dc.l	Shot3_AnimTable

;--------------------------------------------------

		rsset	Bob_Special_1
s4xdir		rs.w	1
s4ydir		rs.w	1
s4bounce	rs.w	1
s4ylow		rs.b	1
s4delay		rs.b	1

init_shot4:
	move.l	a4,-(sp)
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	#Bounce_AnimTable,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)		;(2nd type of little man)
	tst.b	Ldir(a4)
	beq.s	.lab3
		subq.w	#6,Bob_X_Position(a0)
		bra.s	.lab2
.lab3:
		addi.w	#36,Bob_X_Position(a0)
.lab2:
	addq.w	#8,Bob_Y_Position(a0)
	move.l	#handle_shot4,Bob_Routine(a0)	;Setup variables
;	move.l	#shot4_spr,O_INFO(a0)
;	clr.w	O_PHA(a0)
	tst.b	Ldir(a4)
	bne.s	.lab1
		moveq	#2,d0
		bra.s	.lab0
.lab1:
		moveq	#-2,d0
.lab0:
	move.w	d0,s4xdir(a0)
	move.w	#$0096,s4ydir(a0)		;Set y-direction
	sf	s4ylow(a0)
	move.w	#5,s4bounce(a0)			;Bounce 6 times, then explode
	move.w	#-2,Bob_Power(a0)
	rts

handle_shot4:
	subq.b	#1,s4delay(a4)			;Animation delay down
	bpl.s	.no_anim
		addq.b	#5,s4delay(a4)		;Reset delay
		bsr	Get_Next_Bob_Frame
.no_anim:
	move.w	Bob_X_Position(a4),d0		;Reached x-border ?
	cmpi.w	#4+16,d0
	blt.s	.xturn
	cmpi.w	#316,d0
	blt.s	.noturn
.xturn:
		neg.w	s4xdir(a4)		;Turn x-direction...
.noturn:
	move.w	s4xdir(a4),d0			;Do x-movement
	add.w	d0,Bob_X_Position(a4)

	addi.w	#$0048,s4ydir(a4)		;Add gravitational speed-up to y-direction
	move.b	s4ydir+1(a4),d0			;Handle y-movement...
	add.b	d0,s4ylow(a4)
	move.b	s4ydir(a4),d0
	ext.w	d0
	move.w	Bob_Y_Position(a4),d1
	addx.w	d0,d1
	move.w	d1,Bob_Y_Position(a4)

	movem.w	Bob_X_Position(a4),d0-d1		;Test if ground / ceiling is hit...
	tst.w	s4ydir(a4)
	bpl.s	.lab1
		subq.w	#4,d1
		bra.s	.lab0
.lab1:
		addq.w	#4,d1
.lab0:
	bsr	check_obj_kollision
	beq.s	.out
		neg.w	s4ydir(a4)		;Negate y-direction
		bpl.s	.out
			bsr	start_fire	;Yes, start big mine-explosion
			subq.w	#1,s4bounce(a4)	;Bounced once, final bounce ?
			bpl.s	.out
				PLAY_FX	#13
				subi.w	#16,Bob_X_Position(a4)	;Yes, let shot explode
				subi.w	#16,Bob_Y_Position(a4)
				moveq	#0,d0
				bra	Standart_Destruction
.out:
	rts

		rsset	Bob_Special_1
fire_delay	rs.w	1

start_fire:				;Handle mine-fire of shot 4
	move.l	a4,-(sp)
	moveq	#9,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	move.w	Bob_X_Position(a4),Bob_X_Position(a0)
	subq.w	#8,Bob_X_Position(a0)
	cmp.w	#180,Bob_Y_Position(a4)
	blt.s	.set_upper
	move.w	#224-32-16,Bob_Y_Position(a0)
	bra.s	.set
.set_upper:
	move.w	#224-32-16-64,Bob_Y_Position(a0)
.set:
	move.l	#handle_fire,Bob_Routine(a0)
	move.w	#-2,Bob_Power(a0)
	move.w	#2,fire_delay(a0)
	rts

handle_fire:
	bra	Standart_BobAnim


Bounce_AnimTable:
	dc.l	little_GFX+Ibob02,little_GFX+Imsk02
	dc.w	0,0,13,2,2,10,10
	dc.l	little_GFX+Ibob03,little_GFX+Imsk03
	dc.w	0,0,13,2,2,10,10
	dc.l	little_GFX+Ibob04,little_GFX+Imsk04
	dc.w	0,0,13,2,2,10,10
	dc.l	little_GFX+Ibob05,little_GFX+Imsk05
	dc.w	0,0,12,2,2,10,10
	dc.l	little_GFX+Ibob06,little_GFX+Imsk06
	dc.w	0,0,13,2,2,10,10
	dc.l	little_GFX+Ibob07,little_GFX+Imsk07
	dc.w	0,0,12,2,2,10,10
	dc.l	little_GFX+Ibob08,little_GFX+Imsk08
	dc.w	0,0,13,2,2,10,10
	dc.l	little_GFX+Ibob09,little_GFX+Imsk09
	dc.w	0,0,13,2,2,10,10
	dc.w	ENTRY_END
	dc.l	Bounce_AnimTable

		rsset	Bob_Special_1
fade_time	rs.w	1

start_fader:				;Start one "shadow-object" of man
	move.l	a4,-(sp)
	lea	Area_Enter_Vector(pc),a1
	moveq	#36,d0
	bsr	Search_Bob_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	#handle_fader,Bob_Routine(a0)
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
;	move.w	O_PHA(a5),O_PHA(a0)
;	move.l	O_INFO(a5),O_INFO(a0)
	move.w	#10,fade_time(a0)	;Be alife just for 11 frames
	rts

handle_fader:
	bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)
	subq.w	#1,fade_time(a4)	;Time up ?
	bmi	Out_Bob_Damage
	rts

handle_lexpl:				;Handle explosion of little man
	subq.w	#1,Lluser1(a4)		;Delay down ?
	bpl.s	.out
		addq.w	#5,Lluser1(a4)	;Yes, reset delay...
		move.l	a4,-(sp)
		moveq	#1,d0
		lea	Area_Enter_Vector(pc),a1
		bsr	Search_Last_Entry
		move.l	a4,a0
		move.l	(sp)+,a4
		move.l	Bob_X_Position(a4),Bob_X_Position(a0)
		bsr	rnd
		andi.w	#63,d0
		subi.w	#24,d0
		add.w	d0,Bob_X_Position(a0)
		bsr	rnd
		andi.w	#63,d0
		subq.w	#8,d0
		add.w	d0,Bob_Y_Position(a0)
		btst	#0,Lluser0+1(a4)
		bne.s	.no_sound
		bsr	Play_Expl
.no_sound:
		subq.w	#1,Lluser0(a4)		;All explosions out ?
		bpl.s	.out
			move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)	;Yes, let man disappear
			bsr	StartFlash		;Start final flash
			move.l	#handle_bigexpl,Bob_Routine(a4)
			move.w	#110,exanz(a4)
			move.w	#15,exdelay(a4)
			lea	Little_Destruct(pc),a1
			jsr	AddHandler
			st	T_freeze
			bsr	Init_Diamondcount
.out:
	rts

Little_Destruct:
	cmp.w	#$fff,coltab
	bne.s	.out
	move.l	#Return,-4(a0)
	move.w	#-40,T_posX
	waitblt
	move.l	#character,bltdpth(a5)
	move.w	#0,bltdmod(a5)
	move.w	#$0100,bltcon0(a5)
	move.w	#$0000,bltcon1(a5)
	move.w	#64*0+16,bltsize(a5)
	waitblt
	bsr	Create_Pages
	waitblt
.out:
	rts
		rsset	Bob_Special_1
exanz		rs.w	1
exdelay		rs.w	1

handle_bigexpl:					;Make explosion-curtain
	tst.w	exdelay(a4)
	bpl.s	.no_new
		subq.w	#1,exdelay(a4)
.no_new:
	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	bsr	rnd
	andi.l	#$1ff,d0
	divu	#300,d0
	swap	d0
	add.w	#16,d0
	move.w	d0,Bob_X_Position(a0)
	bsr	rnd
	andi.l	#$ff,d0
	divu	#200,d0
	swap	d0
	add.w	#32,d0
	move.w	d0,Bob_Y_Position(a0)
	btst	#0,exanz+1(a4)
	beq.s	.no_sound
		bsr	Play_Expl
.no_sound:
	cmpi.w	#50,exanz(a4)
	bgt.s	.no_count
		bsr	Count_Diamonds
.no_count:
	subq.w	#1,exanz(a4)
	bpl.s	.out
		move.l	#handle_diamonds,Bob_Routine(a4)
		SONGPLAY #5
.out:
	rts

handle_diamonds:
		bsr	Count_Diamonds
		beq.s	.won
	rts
.won:
	move.w	#-1,Cue_Point
	move.b	#150,VBI_count
	bra	Out_Bob_Damage

Play_Expl:
	subq.b	#1,expl_verz
	bpl.s	.out
	bsr	rnd
	and.b	#1,d0
	move.b	d0,expl_verz
	bsr	rnd
	and.b	#$20,d0
	beq.s	.fx1
	PLAY_FX	#$1a
	rts
.fx1:
	PLAY_FX	#$1b
.out:
	rts

expl_verz:	dc.w	0

Ibob00 	= $00000
Imsk00 	= $000c0
Ibob01 	= $000f0
Imsk01 	= $004f0
Ibob02 	= $005f0
Imsk02 	= $00658
Ibob03 	= $00672
Imsk03 	= $006da
Ibob04 	= $006f4
Imsk04 	= $0075c
Ibob05 	= $00776
Imsk05 	= $007d6
Ibob06 	= $007ee
Imsk06 	= $00856
Ibob07 	= $00870
Imsk07 	= $008d0
Ibob08 	= $008e8
Imsk08 	= $00950
Ibob09 	= $0096a
Imsk09 	= $009d2
Ibob0a 	= $009ec
Imsk0a 	= $012ec
Ibob0b 	= $0152c
Imsk0b 	= $0212c


Little_AnimTable:
	dc.l	little_GFX+Ibob0b,little_GFX+Imsk0b
	dc.w	-4,-16,96,4,4-16,44,88
	dc.l	little_GFX+Ibob0a,little_GFX+Imsk0a
	dc.w	0,-16,96,4,4-16,40,88
	dc.l	little_flip-Ibob0a+Ibob0a,little_flip-Ibob0a+Imsk0a
	dc.w	0,-16,96,4,4-16,40,88

*---------------------------------------------------------------------------
*	Routine and AnimTable of     MACHINE
*---------------------------------------------------------------------------
Hbob00 	= $00000
Hmsk00 	= $01880
Hbob01 	= $01ea0
Hmsk01 	= $020a0
Hbob02 	= $02120
Hmsk02 	= $02270
Hbob03 	= $022c4
Hmsk03 	= $02324
Hbob04 	= $0233c
Hmsk04 	= $0253c

Start_Machine:
	move.w	#48+8,Bob_X_Position(a4)
	move.w	#-80,Bob_Y_Position(a4)
	move.l	a4,-(sp)
	moveq	#29,d0
	lea	Area_Enter_Vector(pc),a1
	moveq	#0,d1
	moveq	#-80,d2
	bsr	Search_Bob_Entry
	move.l	#Machine_Slave,Bob_Routine(a4)
	bsr	Get_Next_Bob_Frame
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	a0,Bob_Special_1(a4)
	move.l	#.move_in,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.b	#BOB_NOCOL,Bob_Used(a0)
	move.w	#2,Bob_Special_3(a4)
	st	T_freeze
	clr.w	T_joyforce
	sf	boss_killed

	rts

.move_in:
	move.l	Bob_Special_1(a4),a0
	cmp.w	#32,Bob_Y_Position(a4)
	beq.s	.move_ready
	addq.w	#1,Bob_Y_Position(a4)
.no_move:
	move.l	Bob_X_Position(a4),d0
	move.l	d0,Bob_X_Position(a0)
	add.w	#112,Bob_X_Position(a0)
.out:
	rts
.move_ready:
	or.w	#NOT_REFRESH,Bob_Race(a4)
	or.w	#NOT_REFRESH,Bob_Race(a0)
	subq.w	#1,Bob_Special_3(a4)
	bpl.s	.out
	;In den Hintergrund blitten!
	waitblt
	move.l	Scr_Show_Field(a6),bltapth(a5)
	move.w	#-1,bltalwm(a5)
	move.l	Scr_Refresh_Field(a6),bltdpth(a5)
	clr.w	bltamod(a5)
	clr.w	bltdmod(a5)
	move.w	#$09f0,bltcon0(a5)
	move.w	#64*4*144+22,bltsize(a5)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a0)
	move.b	#BOB_NOPLHIT,Bob_Used(a4)
	move.b	#BOB_NOPLHIT,Bob_Used(a0)
	move.l	a0,boss_ptr
	move.l	#Machine,Bob_Routine(a4)
	sf	T_freeze
	sf	boss_killed
	lea	.pow_tab(pc),a0			;Calc power of boss
	jsr	Make_Power
	move.w	d0,boss_power
	move.l	#Amode_tab,Amode_ptr(a4)
	st	Aminit(a4)

	waitblt

	move.l	Scr_Show_Field(a6),a0
	add.l	#planeb*4*84+16,a0
	move.l	a0,bltapth(a5)
	move.l	#Work_Buffer2,bltdpth(a5)

	move.w	#planeb-10,bltamod(a5)
	clr.w	bltdmod(a5)
	move.w	#64*7*4+5,bltsize(a5)
	waitblt

	lea	Work_Buffer2,a0
	lea	Work_Buffer1,a1
	moveq	#7,d0
	moveq	#10,d1
	bsr	Create_Red_Mask

	move.l	a4,-(sp)
	lea	Area_Enter_Vector(pc),a1
	move.w	#128,d1
	moveq	#84,d2
	moveq	#38,d0
	bsr	Search_Bob_Entry
	move.l	(sp)+,a4

	clr.w	Walker_Hit

	rts
.pow_tab:
	dc.w	80,80,65
	dc.w	110,130,80
	dc.w	140,180,110

handle_machflash:
	tst.w	boss_power
	ble	Out_Bob_Damage
	tst.w	Walker_Hit
	beq.s	.hide
	sf	Bob_BlitStatus(a4)
	rts
.hide:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	rts

Flash_AnimTable:
	dc.l	Work_Buffer1,Work_Buffer1
	dc.w	0,0,7,0,0,0,0


		rsset	Bob_Special_1
Amode_ptr	rs.l	1
Auser0		rs.w	1
Auser1		rs.w	1
Auser2		rs.w	1
Ablink		rs.b	1
Abindex		rs.b	1
Aminit		rs.b	1

Machine:
	bsr	handle_repos1				;Handle repos

	move.w	Bob_Hit(a4),Walker_Hit

	tst.w	Bob_Hit(a4)
	beq.s	.no_hit
	subq.w	#1,Bob_Hit(a4)
.no_hit:

;	move.l	boss_ptr,a0				;Handle hits on boss
;
;	move.b	O_HIT(a0),d2				;Handle hit-explos & sound-fx
;	.if (not zero) {
;		movem.l	a0/a5,-(sp)
;		movem.w	O_XPOS(a0),d6-d7
;		jsr	add_object.w			;Allocate explosion-object
;		move.l	a0,a5
;		tst.b	d2				;From which side ?
;		.if (minus) {
;			subi.w	#24,d6
;		} .else {
;			addi.w	#16,d6
;		}
;		jsr	rnd.w				;Random vertical offset
;		andi.w	#31,d0
;		addi.w	#54,d0
;		add.w	d0,d7
;		movem.w	d6-d7,O_XPOS(a5)
;		jsr	make_expl.w
;		PLAY_HIT #10				;Play hit-fx
;		movem.l	(sp)+,a0/a5
;		sf	O_HIT(a0)
;	}

	moveq	#100,d0
	sub.w	Bob_Power(a4),d0
	beq.s	.no_sub
	move.w	#100,Bob_Power(a4)
	sub.w	d0,boss_power
	bpl.s	.no_sub
			move.l	#Mhandle_expl,Bob_Routine(a4)	;Start explosion-handler
;			clr.l	speed(a5)
;			clr.w	ylow(a5)
			clr.w	Auser0(a4)
			move.w	#100,Auser1(a4)
;			sf	exsound(a5)
			move.l	#$15000,d0
			jmp	add_score
.no_sub:
	move.l	Amode_ptr(a4),a0			;Handle current mode
	moveq	#0,d0
	move.b	(a0),d0
	jmp	.handle_tab(pc,d0.w)
.handle_tab:
	bra.w	.do_wait1
	bra.w	.do_shot1
	bra.w	.do_shot2
.do_wait1:					;Wait 2s
	tst.b	Aminit(a4)
	beq.s	.no_init1
		sf	Aminit(a4)
		move.w	#2*60,Auser0(a4)
.no_init1:
	subq.w	#1,Auser0(a4)
	bmi	.next_step
	bra	.end_boss
.do_shot1:					;Start eye-shot (1st type of shots)
	tst.b	Aminit(a4)
	beq.s	.no_init2
		sf	Aminit(a4)		;Do init just once...
		move.w	#5,Auser0(a4)		;Start 6 laser-elements
		move.l	Bob_X_Position(a4),-(sp);Calc angle to player
		addi.w	#112-24,Bob_X_Position(a4)
		addi.w	#56,Bob_Y_Position(a4)
		move.w	T_posX,d6
		move.w	T_posY,d7
		addi.w	#16+16,d6
		addi.w	#24+32,d7
		bsr	calc_ene_angle
		move.w	#128,d7
		sub.b	d1,d7
		move.l	(sp)+,Bob_X_Position(a4)
		move.b	d7,d0
		bsr	sin			;Calc DX / DY
		move.w	d0,d2
		move.b	d7,d0
		bsr	cos
		add.w	d0,d0
		add.w	d2,d2
		movem.w	d0/d2,Auser1(a4)	;Remember DX, DY
		moveq	#64,d0
		sub.b	d7,d0
		move.b	d0,boss_angle
;		pea	(a5)
;		lea	boss1_turn0,a0		;Generate right angle of laser
;		move.w	#boss40,a1
;		lea	boss1_buffer0,a2
;		moveq	#64,d2
;		sub.b	d7,d2
;		jsr	turn.w
;		move.l	(sp)+,a5
.no_init2:
	subq.b	#1,Auser0(a4)			;Delay down ?
	bpl	.end_boss
	move.b	#11,Auser0(a4)			;Yes, reset it...

	PLAY_FX	#$2f

	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	#BShot_AnimTable4,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.w	#-2,Bob_Power(a4)
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
	addi.w	#112-24,Bob_X_Position(a0)
	addi.w	#56,Bob_Y_Position(a0)
	move.l	#handle_shot1,Bob_Routine(a0)
;	move.l	#shot1_spr,O_INFO(a0)
;	clr.w	O_PHA(a0)
;	st	O_SHOW(a0)
;	move.l	#shot1_col,O_COL(a0)
;	st	O_COLEN(a0)
	move.l	Auser1(a4),Bs1xdir(a0)
	clr.w	Bs1xlow(a0)
	move.b	#3,Breflex(a0)
	move.b	boss_angle,Bangle(a0)
	sf	Bhide(a0)
	tst.b	Auser0+1(a4)
	seq	Bflag(a0)
;	bsr	set_ballobj			;Eye-ball-object to cover eyes
;	move.l	#eye_spr,O_INFO(a0)

	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	#BShot_AnimTable4,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.w	#-2,Bob_Power(a4)
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
	addi.w	#112+24,Bob_X_Position(a0)
	addi.w	#56,Bob_Y_Position(a0)
	move.l	#handle_shot1,Bob_Routine(a0)
;	move.l	#shot1_spr,O_INFO(a0)
;	clr.w	O_PHA(a0)
;	st	O_SHOW(a0)
;	move.l	#shot1_col,O_COL(a0)
;	st	O_COLEN(a0)
	move.l	Auser1(a4),Bs1xdir(a0)
	clr.w	Bs1xlow(a0)
	move.b	#3,Breflex(a0)
	move.b	boss_angle,Bangle(a0)
	st	Bhide(a0)
	tst.b	Auser0+1(a4)
	seq	Bflag(a0)
;	bsr	set_ballobj
;	move.l	#eye_spr,O_INFO(a0)

	subq.b	#1,Auser0+1(a4)			;All laser elements out ?
	bmi	.next_step			;Yes...
	bra	.end_boss			;No...
.do_shot2:
	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry
	move.l	#BShot_AnimTable1,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.w	#-2,Bob_Power(a4)

	move.l	a4,a0
	move.l	(sp),a4
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
	move.l	a0,a4
	add.w	#80+32,Bob_X_Position(a4)
	addi.w	#90,Bob_Y_Position(a4)		;Calc angle to player
	move.w	T_posX,d6
	move.w	T_posY,d7
	addi.w	#16+16,d6
	addi.w	#24+32,d7
	bsr	calc_ene_angle
	move.w	#128,d2
	sub.b	d1,d2
	move.b	d2,Bangle(a4)
	move.l	#handle_shot2,Bob_Routine(a4)
;	move.w	#2,O_PHA(a5)
;	st	O_COLEN(a5)
	move.w	#6*60,Bs2time(a4)		;6s lifetime

	lea	boss1_buffer1(pc),a3
	tst.b	boss_killed			;1st or 2nd shot ?
	beq.s	.use
		lea	16*4(a3),a3		;Adjust position-buffer properly
.use:
	move.l	a3,Bbuffer(a4)

	moveq	#15,d0				;Init position-buffer
.set_buffer:
		move.l	Bob_X_Position(a4),(a3)+
	dbf	d0,.set_buffer
	addq.b	#1,boss_killed			;Remember that shot was started

	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry
	move.l	#BShot_AnimTable2,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.w	#-2,Bob_Power(a4)
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	#handle_s2slave,Bob_Routine(a0)
;	move.l	O_INFO(a5),O_INFO(a0)
;	move.w	#1,O_PHA(a0)
;	st	O_SHOW(a0)
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
;	move.l	O_COL(a5),O_COL(a0)
;	st	O_COLEN(a0)
	sf	Bs2flag(a0)
	move.l	a0,Bptr(a4)

	move.l	a0,a4

	move.l	a4,-(sp)
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry
	move.l	#BShot_AnimTable3,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.w	#-2,Bob_Power(a4)

	move.l	a4,a0
	move.l	(sp)+,a4

	move.l	#handle_s2slave,Bob_Routine(a0)	;2nd one...
;	move.l	O_INFO(a5),O_INFO(a0)
;	clr.w	O_PHA(a0)
;	st	O_SHOW(a0)
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
;	move.l	O_COL(a5),O_COL(a0)
;	st	O_COLEN(a0)
	sf	Bs2flag(a0)
	move.l	a0,Bptr(a4)

	move.l	(sp)+,a4			;Get next mode...

.next_step:
	move.l	Amode_ptr(a4),a0		;Get next step of movement
	addq.l	#1,a0
	tst.b	(a0)				;End of list ?
	bpl.s	.no_end
		lea	Amode_tab(pc),a0
.no_end:
	move.l	a0,Amode_ptr(a4)		;Set new pointer
	st	Aminit(a4)			;Set init-flag
.end_boss:
	rts

AWAIT1	equ 0
ASHOT1	equ 4
ASHOT2	equ 8

AEND	equ -1

Amode_tab:
	dc.b	AWAIT1,ASHOT1,AWAIT1,AWAIT1,AWAIT1
	dc.b	ASHOT2,AWAIT1,AWAIT1
	dc.b	ASHOT2,AWAIT1,AWAIT1,AWAIT1
	dc.b	AEND

boss_angle:	dc.b	0
	even

Mhandle_expl:					;Handle explosion of first phase
	subq.w	#1,Auser0(a4)			;Delay for next explosion down ?
	bpl.s	.no_explo
		addq.w	#2,Auser0(a4)		;Yes, reset & start explosion
		move.l	a4,-(sp)
		moveq	#1,d0
		lea	Area_Enter_Vector(pc),a1
		bsr	Search_Last_Entry
		move.l	a4,a0
		move.l	(sp)+,a4
		move.l	Bob_X_Position(a4),Bob_X_Position(a0)
		bsr	rnd
		andi.w	#127,d0
		add.w	#32,d0
		add.w	d0,Bob_X_Position(a0)
		bsr	rnd
		andi.w	#63,d0
		addq.w	#8,d0
		add.w	d0,Bob_Y_Position(a0)

		bsr	Play_Expl

		subq.w	#1,Auser1(a4)
		bpl.s	.no_explo

		
		bsr	StartFlash
		lea	MDestruct_Handler(pc),a1
		jsr	AddHandler
		bra	Out_Bob_Damage
.no_explo:
	rts
MDestruct_Handler:
		cmp.w	#$fff,coltab
		bne.s	.out
		move.l	#Return,-4(a0)
		bsr	init_little		;Yes, init next phase...
		st	boss_killed
		bsr	Create_Pages
.out:
		rts

		rsset	Bob_Special_1
Bs1xdir		rs.w	1
Bs1ydir		rs.w	1
Bs1xlow		rs.b	1
Bs1ylow		rs.b	1
Breflex		rs.b	1
Bflag		rs.b	1
Bhide		rs.b	1

handle_shot1:
	sf	Bob_BlitStatus(a4)
	tst.b	Bhide(a4)
	beq.s	.check1
	tst.w	half_pixel
	bne.s	.check_end
	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
	bra.s	.check_end
.check1:
	tst.w	half_pixel
	beq.s	.check_end
	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
.check_end:
	tst.w	boss_power			;Boss killed ?
	bmi	.free_shot1			;Yes, free shot

	move.b	Bs1xdir+1(a4),d0		;Move shot according to direction-vars...
	add.b	d0,Bs1xlow(a4)
	move.b	Bs1xdir(a4),d1
	ext.w	d1
	move.w	Bob_X_Position(a4),d0
	addx.w	d1,d0
	move.w	d0,Bob_X_Position(a4)
	move.b	Bs1ydir+1(a4),d0
	add.b	d0,Bs1ylow(a4)
	move.b	Bs1ydir(a4),d1
	ext.w	d1
	move.w	Bob_Y_Position(a4),d0
	addx.w	d1,d0
	move.w	d0,Bob_Y_Position(a4)

	moveq	#0,d0				;X-border reached ?
	move.w	Bob_X_Position(a4),d1
	sub.w	#16,d1
	cmpi.w	#304,d1
	bls.s	.no_border1
		move.w	#128,d1
		sub.b	Bangle(a4),d1
		move.b	d1,Bangle(a4)
		neg.w	Bs1xdir(a4)
		subq.b	#1,Breflex(a4)		;Bounce maximum reached ?
		bmi.s	.free_shot1
		moveq	#-1,d0			;No!
.no_border1:
	move.w	Bob_Y_Position(a4),d1
	sub.w	#32,d1
	cmpi.w	#224-32,d1			;Same as above: Y-borders
	bls.s	.no_border2
		move.w	#128,d1
		sub.b	Bangle(a4),d1
		move.b	d1,Bangle(a4)
		neg.w	Bs1ydir(a4)
		subq.b	#1,Breflex(a4)
		bmi.s	.free_shot1
		moveq	#-1,d0
.no_border2:
	tst.w	d0				;Bounced at borders ?
	beq.s	.out
		bsr	.set_ballobj
.out:
	moveq	#0,d0
	move.b	Bangle(a4),d0
	addq.b	#8,d0
	and.w	#$fff0,d0
	mulu	#40,d0
	add.l	#Rotate_Buffer3,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)
	rts

.free_shot1:					;Let shot explode
	subi.w	#16,Bob_X_Position(a4)
	subi.w	#16,Bob_Y_Position(a4)
	moveq	#0,d0
	bra	Standart_Destruction

.set_ballobj:
	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry
	move.l	#BShot_AnimTable1,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)
	move.l	#handle_ballobj,Bob_Routine(a0)
;	move.l	O_INFO(a4),O_INFO(a0)
;	move.w	#4,O_PHA(a0)
;	st	O_SHOW(a0)
	move.w	#13,Bob_Special_1(a0)			;Stay for 14 frames
	clr.w	Bob_Special_2(a0)
	move.b	Bflag(a4),Bob_Special_3(a0)		;Copy last-shot-flag
	rts

handle_ballobj:
	subq.w	#1,Bob_Special_1(a4)			;Time over ?
	bpl.s	.stay
;		tst.b	O_USR2(a5)		;Last ball-object ?
;		beq.s	free_now		;No, free it imediately
;		subq.w	#1,O_USR1(a5)		;Yes, do fade-amimation
;		.if (minus) {
;			addq.w	#5,O_USR1(a5)	;Reset delay...
;			addq.w	#1,O_PHA(a5)	;Do animation
;			cmpi.w	#7,O_PHA(a5)
;			.if (equal) {		;Faded out ?
;		free_now:
;				move.l	a5,a0	;Free object...
;				jmp	free_object.w
;			}
;		}
	bra	Out_Bob_Damage
.stay:
	rts



boss1_buffer1:
	dcb.l	32,0

		rsset	Bob_Special_1	;Main-Shot
Bptr		rs.l	1
Bbuffer		rs.l	1
Bs2time		rs.w	1
Bs2xlow		rs.b	1
Bs2ylow		rs.b	1
Bangle		rs.b	1

		rsset	Bob_Special_1	;Slave-Shot
		rs.l	1
Bs2flag		rs.b	1

handle_shot2:
	tst.w	boss_power			;Boss killed ?
	bmi	.kill_shot2

	move.w	T_posX,d6			;Calc new angle...
	move.w	T_posY,d7
	addi.w	#16+16,d6
	addi.w	#24+32,d7
	bsr	calc_ene_angle
	move.w	#128,d2
	sub.b	d1,d2
	sub.b	Bangle(a4),d2
	cmpi.b	#128,d2				;Decide which direction to turn to
	bhs.s	.lab1
		moveq	#1,d0
		bra.s	.lab0
.lab1:
		moveq	#-1,d0
.lab0:
	add.b	d0,Bangle(a4)			;Turn...
	move.b	Bangle(a4),d7			;Calc DX/DY
	move.b	d7,d0
	bsr	sin
	move.w	d0,d2
	move.b	d7,d0
	bsr	cos
	move.w	d0,d1
	asr.w	#1,d1
	add.w	d1,d0
	move.w	d2,d1
	asr.w	#1,d1
	add.w	d1,d2
	move.w	d0,d3		;"float"-part
	move.w	d2,d4
	asr.w	#8,d3		;Int-part
	asr.w	#8,d4
	add.b	d0,Bs2xlow(a4)	;Move shot object...
	ext.w	d3
	move.w	Bob_X_Position(a4),d1
	addx.w	d3,d1
	move.w	d1,Bob_X_Position(a4)
	add.b	d2,Bs2ylow(a4)
	ext.w	d4
	move.w	Bob_Y_Position(a4),d1
	addx.w	d4,d1
	move.w	d1,Bob_Y_Position(a4)

	move.l	Bbuffer(a4),a0		;"Scroll" new position into buffer
	lea	16*4(a0),a0
	lea	-4(a0),a1
	moveq	#14,d0
.scroll:
		move.l	-(a1),-(a0)
	dbf	d0,.scroll
	move.l	Bob_X_Position(a4),(a1)

	move.l	Bptr(a4),a0		;Set slave's positions
	move.l	8*4(a1),Bob_X_Position(a0)
	move.l	Bptr(a0),a0
	move.l	15*4(a1),Bob_X_Position(a0)

	subq.w	#1,Bs2time(a4)		;Lifetime over ?
	bpl.s	.no_kill
.kill_shot2:
		subq.b	#1,boss_killed	;Yes, free shot's buffer
		move.l	Bptr(a4),a0	;Make slaves explode...
		subi.w	#12,Bob_X_Position(a0)
		subi.w	#12,Bob_Y_Position(a0)
		st	Bs2flag(a0)
		move.l	Bptr(a0),a0
		subq.w	#8,Bob_X_Position(a0)
		subq.w	#8,Bob_Y_Position(a0)
		st	Bs2flag(a0)
		subi.w	#16,Bob_X_Position(a4)	;Let master-shot explode
		subi.w	#16,Bob_Y_Position(a4)
		moveq	#0,d0
		bra	Standart_Destruction
.no_kill:

	bsr	Test_Bob_Out
	tst.b	Bob_Used(a4)
	bpl.s	.end

.free_shot2:
	subq.b	#1,boss_killed		;Free buffer, slaves & master
	move.l	Bptr(a4),a0
	st	Bs2flag(a0)
	move.l	Bptr(a0),a0
	st	Bs2flag(a0)
.end:
	rts

handle_s2slave:
	tst.b	Bs2flag(a4)		;Slave-shot just waits to be freed...
	beq.s	.out
	moveq	#0,d0
	bra	Standart_Destruction
.out:
	rts

BShot_AnimTable1:
	dc.l	machine_GFX+Hbob01,machine_GFX+Hmsk01
	dc.w	-16,-16,32,8-16,8-16,16,16
BShot_AnimTable2:
	dc.l	machine_GFX+Hbob02,machine_GFX+Hmsk02
	dc.w	-12,-11,21,8-12,8-12,16,16
BShot_AnimTable3:
	dc.l	machine_GFX+Hbob03,machine_GFX+Hmsk03
	dc.w	-8,-8,16,4-8,4-8,8,8

BShot_AnimTable4:
	dc.l	machine_GFX+Hbob04,machine_GFX+Hmsk04
	dc.w	-16,-16,32,8-16,8-16,16,16


Machine_Slave:
	tst.b	boss_killed
	bmi	Out_Bob_Damage
	rts

Machine_AnimTable:
	dc.l	machine_GFX+Hbob00,machine_GFX+Hmsk00
	dc.w	0,0,112,71,0,82,73
	dc.l	machine_flip+Hbob00,machine_flip+Hmsk00
	dc.w	0,0,112,-24,73,48,33

*---------------------------------------------------------------------------
*	Routine and AnimTable of     CONTRA
*---------------------------------------------------------------------------
		rsset	Bob_Special_1
Tmode_ptr	rs.l	1		;Main
Tuser0		rs.w	1
Tuser1		rs.w	1
Tbinit		rs.b	1
Tswing		rs.b	1
Tindex		rs.b	1

		rsset	Bob_Special_1	;Slave
Tptr		rs.l	1

Tbob00 	= $00000
Tmsk00 	= $00480
Tbob01 	= $005a0
Tmsk01 	= $008a0
Tbob02 	= $00960
Tmsk02 	= $00b60
Tbob03 	= $00be0
Tmsk03 	= $00ce0
Tbob04 	= $00d20
Tmsk04 	= $00ef0
Tbob05 	= $00000+3940
Tbob06 	= $00c00+3940

Start_Contra:
	move.l	#Repos_Player_Dead,Dead_Vector

	move.l	#mode_tab,Tmode_ptr(a4)
	st	Tbinit(a4)
	move.l	#Contra,Bob_Routine(a4)
	move.w	#128,Bob_X_Position(a4)
	move.w	#146,Bob_Y_Position(a4)

	waitblt
	move.w	#planeb2-2,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.w	#-1,bltalwm(a5)
	move.w	#$09f0,bltcon0(a5)
	lea	walker_map(pc),a0
	move.l	#Rotate_Buffer2+11000,d0
	moveq	#1,d6
.yloop:
	moveq	#25,d7
.xloop:
	moveq	#0,d1
	move.b	(a0)+,d1
	asl.w	#7,d1
	add.l	#character,d1
	waitblt
	move.l	d1,bltapth(a5)
	move.l	d0,bltdpth(a5)

	move.w	#64*16*4+1,bltsize(a5)

	waitblt

	addq.l	#2,d0

	dbf	d7,.xloop

	add.l	#16*planeb2*4-52,d0
	dbf	d6,.yloop

	move.l	#Rotate_Buffer2+11000+28,d0
	move.l	#contra_GFX+Tbob01,d1

	move.w	#$0fca,bltcon0(a5)
	move.w	#$0000,bltcon1(a5)
	move.w	#0,bltamod(a5)
	move.w	#6*3,bltbmod(a5)

	move.w	#52*4-6,bltcmod(a5)
	move.w	#52*4-6,bltdmod(a5)
	moveq	#3,d7
.loop1:
	move.l	#contra_GFX+Tmsk01,bltapth(a5)
	move.l	d1,bltbpth(a5)
	move.l	d0,bltcpth(a5)
	move.l	d0,bltdpth(a5)

	move.w	#64*32+3,bltsize(a5)
	waitblt
	add.l	#52,d0
	addq.l	#6,d1
	dbf	d7,.loop1

	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)

	moveq	#4,d7				;Allocate 5 rocks
.init:
		move.w	d7,-(sp)
		bsr	init_rock
		move.w	(sp)+,d7
	dbf	d7,.init

	moveq	#10+16,d0				;Allocate the two hands
	move.w	#144+16,d1
	moveq	#6,d2
	bsr	init_hand

	sf	boss_move
	clr.w	vpan1
	sf	boss_killed

	lea	.pow_tab(pc),a0			;Calc power
	jsr	Make_Power
	move.w	d0,boss_power

	move.w	#100,Bob_Power(a4)

	st	no_time

	lea	contra_GFX+Tbob05,a0
	lea	contra_flash,a1
	moveq	#64,d0
	moveq	#12,d1
	bsr	Create_Red_Mask

	move.l	#contra_flash,bltapth(a5)
	move.l	#contra_GFX+Tbob05,bltbpth(a5)
	move.l	#contra_flash,bltdpth(a5)
	move.w	#0,bltamod(a5)
	move.w	#0,bltbmod(a5)
	move.w	#0,bltdmod(a5)

	move.w	#$0dfc,bltcon0(a5)
	move.w	#64*64*4+6,bltsize(a5)
	waitblt

	rts
.pow_tab:
	dc.w	50,120,50
	dc.w	130,220,80
	dc.w	200,300,120

Create_Red_Mask:
	waitblt
	move.l	d1,d2
	add.w	d2,d2
	add.w	d2,d2
	sub.w	d1,d2

	move.w	#-1,bltalwm(a5)
	move.w	d2,bltamod(a5)
	move.w	d2,bltbmod(a5)
	move.w	d2,bltcmod(a5)
	move.w	d2,bltdmod(a5)

	move.l	a0,bltapth(a5)
	add.l	d1,a0
	move.l	a0,bltbpth(a5)
	add.l	d1,a0
	move.l	a0,bltcpth(a5)

	move.l	a1,bltdpth(a5)

	move.w	#$0f02,bltcon0(a5)
	move.w	#$0000,bltcon1(a5)

	move.w	d1,d2
	lsr.w	#1,d2

	move.w	d0,d3
	asl.w	#6,d3
	or.w	d2,d3
	move.w	d3,bltsize(a5)
	waitblt
	add.l	d1,a0
	move.l	a0,bltapth(a5)
	move.l	a1,bltbpth(a5)
	move.l	a1,bltdpth(a5)
	move.w	#$0fc0,bltcon0(a5)
	move.w	d3,bltsize(a5)
	waitblt

	move.w	#$09f0,bltcon0(a5)
	move.l	a1,bltapth(a5)
	add.l	d1,a1
	move.l	a1,bltdpth(a5)
	move.w	d3,bltsize(a5)
	waitblt
	move.l	a1,bltapth(a5)
	add.l	d1,a1
	move.l	a1,bltdpth(a5)
	move.w	d3,bltsize(a5)
	waitblt
	move.l	a1,bltapth(a5)
	add.l	d1,a1
	move.l	a1,bltdpth(a5)
	move.w	d3,bltsize(a5)
	waitblt

	rts

Contra:
	move.w	vpan1,ovpan1
	sf	boss_move			;Clear rock-shock-flag
	bsr	handle_platforms		;Handle standing of player

	bsr	handle_repos1			;Handle player-repos

	tst.w	Bob_Hit(a4)
	beq.s	.no_hit2
	subq.w	#1,Bob_Hit(a4)
.no_hit2:
	move.w	#100,d0
	sub.w	Bob_Power(a4),d0
	beq.s	.no_hit
	move.w	#100,Bob_Power(a4)
	sub.w	d0,boss_power
.no_hit:
	tst.w	boss_power
	bgt.s	.no_killed
		cmpi.w	#40,vpan1		;Open door ?
		blt.s	.no_killed
			tst.b	boss_killed		;Allready initialized ?
			bne.s	.no_killed
				st	boss_killed	;No, init now
				move.l	#end_modes,Tmode_ptr(a4)
				st	Tbinit(a4)
				move.l	#$10000,d0
				jsr	add_score
				move.b	#BOB_NOCOL,Bob_Used(a4)
.no_killed:
	tst.w	boss_power			;Do not swing, if dead...
	bmi.s	.no_swing
		bsr	.handle_swing		;Handle swinging
.no_swing:
	move.l	Tmode_ptr(a4),a0		;Jump to current handler
	moveq	#0,d0
	move.b	(a0),d0
	jmp	.handler_tab(pc,d0.w)
.handler_tab:
	bra.w	.do_movein
	bra.w	.do_open
	bra.w	.do_close
	bra.w	.do_wait1
	bra.w	.do_shoot
	bra.w	.do_expl
	bra.w	.do_exit
.do_movein:					;Move boss in (eg. the hands appear)
	tst.b	Tbinit(a4)
	beq.s	.no_init1
		sf	Tbinit(a4)
		move.w	#60,Tuser0(a4)		;Wait 60 frames before hands appear
.no_init1:
	subq.w	#1,Tuser0(a4)			;Time over ?
	bpl	.end_boss
;	move.l	boss_ptr,a0			;Yes, setup hands & add trash
;	st	O_SHOW(a0)
;	move.l	ptr(a0),-(sp)
;	bsr	init_trash
;	move.l	(sp)+,a0
;	st	O_SHOW(a0)
;	bsr	init_trash
;	PLAY_FX	#11
	bra	.next_step
.do_open:					;Open the "door"
	tst.b	Tbinit(a4)
	beq.s	.handle_move
		sf	Tbinit(a4)		;Init parameters
		move.l	#open_tab,Tuser0(a4)
.handle_move:
	move.l	Tuser0(a4),a0			;Get next move-value
	move.b	(a0)+,d0
	cmpi.b	#100,d0				;Reached end of list mark ?
	beq	.next_step			;Yes, next step...
	move.l	a0,Tuser0(a4)
	ext.w	d0				;Move door-playfield (A)
	sub.w	d0,vpan1
	tst.b	T_stand				;Standing on platforms ?
	beq	.end_boss
	cmp.w	#140,T_posY
	bgt	.end_boss
	move.w	d0,T_forceY			;Yes, move player up, too.
	bra	.end_boss
.do_close:					;Close the door
	tst.b	Tbinit(a4)
	beq.s	.no_init2
		sf	Tbinit(a4)		;Init parameters
		move.l	#close_tab,Tuser0(a4)
.no_init2:
	cmpi.l	#close_tab+25,Tuser0(a4)	;Check if door reached floor
	seq	boss_move			;=> rock-shock is set
	bne.s	.handle_move
		PLAY_FX	#$2c
	bra	.handle_move			;Use open-handler...
.do_wait1:
	tst.b	Tbinit(a4)
	beq.s	.no_init3
		sf	Tbinit(a4)		;Init 1s waiting-period
		move.w	#60,Tuser0(a4)
.no_init3:
	subq.w	#1,Tuser0(a4)			;Over ?
	bpl	.end_boss			;No...
	bra	.next_step			;Yes...
.do_shoot:
	tst.b	Tbinit(a4)
	beq.s	.no_init4
		sf	Tbinit(a4)		;Init 14 shot to be started
		move.w	#13,Tuser0(a4)
		clr.w	Tuser1(a4)
.no_init4:
	subq.w	#1,Tuser1(a4)			;Delay over ?
	bpl	.end_boss
	move.w	#12,Tuser1(a4)			;Yes, reset delay...
	PLAY_FX	#$2e
	moveq	#27,d0
	move.l	a4,-(sp)
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	tst.w	d7
	bmi.s	.no_bob
	move.l	a0,-(sp)
	move.l	Bob_X_Position(a4),-(sp)	;Calc angle to player
	addi.w	#28,Bob_X_Position(a4)
	addi.w	#34,Bob_Y_Position(a4)
	move.w	T_posX,d6
	move.w	T_posY,d7
	addi.w	#16+16,d6
	addi.w	#24+32,d7
	bpl.s	.ok
	moveq	#0,d7
.ok:
	bsr	calc_ene_angle
	moveq	#127,d7
	sub.b	d1,d7
	bsr	rnd				;Add random error (ca. +/- 8)
	andi.w	#15,d0
	subq.w	#8,d0
	add.w	d0,d7
	move.l	(sp)+,Bob_X_Position(a4)
	move.b	d7,d0				;Set shot-direction
	bsr	sin
	move.w	d0,d2
	move.b	d7,d0
	bsr	cos
	add.w	d0,d0				;Speed up a little...
	add.w	d2,d2
	move.l	(sp)+,a0
	movem.w	d0/d2,Ssxdir(a0)
	move.l	Bob_X_Position(a4),Bob_X_Position(a0)		;Set shot's start-position
	addi.w	#28,Bob_X_Position(a0)
	addi.w	#34,Bob_Y_Position(a0)
.no_bob:
	subq.w	#1,Tuser0(a4)			;All shots started ?
	bpl	.end_boss			;No...
	bra	.next_step			;Yes, next step...
.do_expl:
	tst.b	Tbinit(a4)			;Handle death of boss
	beq.s	.no_init5
		sf	Tbinit(a4)
		move.w	#80,Tuser0(a4)		;80 explosion to come...
		clr.w	Tuser1(a4)
.no_init5:
	subq.w	#1,Tuser1(a4)			;Delay over ?
	bpl	.end_boss
	btst	#0,Tuser0+1(a4)
	bne.s	.no_sound
		bsr	Play_Expl
.no_sound:
	addq.w	#3,Tuser1(a4)			;Yes, reset delay...
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	move.l	a4,-(sp)
	bsr	Search_Last_Entry
	move.l	a4,a0
	move.l	(sp)+,a4

	move.l	Bob_X_Position(a4),Bob_X_Position(a0)		;Set base-position
	jsr	rnd				;Add random offset
	andi.w	#127,d0
	subi.w	#20,d0
	add.w	d0,Bob_X_Position(a0)
	jsr	rnd
	andi.w	#63,d0
	subi.w	#16,d0
	add.w	d0,Bob_Y_Position(a0)

	subq.w	#1,Tuser0(a4)			;All explosions done ?
	bmi	.next_step			;Yes...
	bra	.end_boss			;No...
.do_exit:
;	moveq	#2,d0				;Boss is dead:
;	move.l	col_ptr.w,a0			;Fade down and init THE MACHINE
;	jsr	fade_out.w
;	jsr	wait_fade.w
;	move.l	#init_machine,fx_handler2.w
	move.l	#Handle_Win,Bob_Routine(a4)
	rts
.next_step:
	move.l	Tmode_ptr(a4),a0		;Get next mode...
	addq.w	#1,a0
	tst.b	(a0)				;End of list ?
	bpl.s	.no_end
		lea	mode_tab+1(pc),a0	;Reset to 2nd action (no move-in twice!)
.no_end:
	move.l	a0,Tmode_ptr(a4)
	st	Tbinit(a4)			;Set init-flag to TRUE
.end_boss:
;	move.w	O_XPOS(a5),hpan2.w		;Convert to playfield-positions
;	move.w	O_YPOS(a5),d0
;	neg.w	d0
;	move.w	d0,vpan2.w

;	move.l	boss_ptr,a3			;Set "door-hands"
;	move.w	#160,d0
;	sub.w	vpan1.w,d0
;	move.w	d0,Bob_Y_Position(a3)
;	move.l	Tptr(a3),a3
;	move.w	#186,Bob_Y_Position(a3)
;	move.l	ptr(a3),a3
;
;	tst.w	boss_power
;	.if.l (plus) {
;		move.l	O_XPOS(a5),-(sp)	;Calc angle to player
;		addi.w	#28,O_XPOS(a5)
;		addi.w	#34,O_YPOS(a5)
;		movem.w	pl_xpos.w,d6-d7
;		addi.w	#16,d6
;		addi.w	#24,d7
;		jsr	calc_angle.w
;		moveq	#127,d7
;		sub.b	d1,d7
;		move.l	(sp)+,O_XPOS(a5)
;		move.b	d7,d0
;		jsr	sin.w
;		move.w	d0,d2
;		move.b	d7,d0
;		jsr	cos.w
;		asr.w	#6,d0
;		asr.w	#6,d2
;		add.w	O_XPOS(a5),d0
;		add.w	O_YPOS(a5),d2
;		addi.w	#26,d0
;		addi.w	#28,d2
;		movem.w	d0/d2,O_XPOS(a4)		;Write into eye-slaves
;		move.w	#2,O_PHA(a4)
;		cmpi.w	#20,vpan1.w			;No collision, if door is closed
;		sgt	O_COLEN(a4)
;		move.l	ptr(a4),a4
;		addi.w	#40,d0				;Now the same for the right eye
;		movem.w	d0/d2,O_XPOS(a4)
;		move.w	#2,O_PHA(a4)
;		cmpi.w	#20,vpan1.w
;		sgt	O_COLEN(a4)
;	} .else {
;		sf	O_SHOW(a4)			;Boss is dead, just
;		sf	O_COLEN(a4)			;hide eyes. No collision.
;		move.l	ptr(a4),a4
;		sf	O_SHOW(a4)
;		sf	O_SHOW(a4)
;	}

	moveq	#64,d1
	moveq	#12*4,d2
	move.l	#contra_GFX+Tbob05,d3
	tst.w	Bob_Hit(a4)
	beq.s	.normal
	move.l	#contra_flash,d3
.normal:
	bsr	calc_visible

	cmp.b	#BOB_NOCOL,Bob_Used(a4)
	beq.s	.off
	move.b	#BOB_NOPLHIT,Bob_Used(a4)
.off:
	rts

.handle_swing:					;Handle swing of boss' head
	subq.b	#1,Tswing(a4)				;Next swing-offset ?
	bpl.s	.swing_out
		addq.b	#2,Tswing(a4)			;Yes, handle swinging
		addq.b	#2,Tindex(a4)
		andi.b	#14,Tindex(a4)
		moveq	#0,d0
		move.b	Tindex(a4),d0
		move.w	.swing_tab(pc,d0.w),d0
		add.w	d0,Bob_Y_Position(a4)
.swing_out:
	rts

.swing_tab:
	dc.w	-1,-1,1,1,1,1,-1,-1


Handle_Win:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	bsr	handle_platforms		;Handle standing of player
	move.w	#-1,Cue_Point
	rts

	rsset	Bob_Special_1
Rflag	rs.b	1
Rmode	rs.b	1
Rcount	rs.w	1
Rrydir	rs.w	1
Rrylow	rs.b	1

init_rock:					;Init rock-handler
	move.l	a4,-(sp)
	lea	Area_Enter_Vector(pc),a1

	moveq	#0,d2				;Set random position

	bsr	rnd
	andi.l	#$ffff,d0
	divu	#320,d0                         ;Values 0-319
	swap	d0
	move.w	d0,d1

	bsr	rnd
	and.w	#1,d0
	add.w	#25,d0

	bsr	Search_Bob_Entry
	tst.w	d7
	bmi.s	.no_bob
	clr.w	Rflag(a4)

	move.b	#BOB_NOCOL,Bob_Used(a4)
.no_bob:
	move.l	(sp)+,a4
	rts

Rock:
	moveq	#0,d0
	tst.w	boss_power                      ;Boss dead, rock explodes...
	bmi	Standart_Destruction

	moveq	#0,d0                           ;Jump to current handler
	move.b	Rmode(a4),d0
	jmp	.rock_tab(pc,d0.w)
.rock_tab:
	bra.w	.move_down
	bra.w	.shock_wait
	bra.w	.fall_wait
	bra.w	.do_fall
.move_down:					;Rock moves slowly into the screen
	cmpi.w	#-24+32,Bob_Y_Position(a4)
	bge.s	.next1
		not.b	Rflag(a4)		;Move down in 30Hz
		bne.s	.out1
			addq.w	#1,Bob_Y_Position(a4)
.out1:
		rts
.next1:
	addq.b	#4,Rmode(a4)			;Next mode...
	rts

.shock_wait:
	tst.b	boss_move			;Rock-shock ?
	beq.s	.out1
		bsr	rnd			;Yes, init shaking-phase
		andi.w	#31,d0			;Set random delay
		addi.w	#20,d0
		move.w	d0,Rcount(a4)
		addq.b	#4,Rmode(a4)		;Next mode
	rts
.fall_wait:
	not.b	Rflag(a4)			;Let rock shake (left/right)
	beq.s	.lab1
		moveq	#1,d0
	bra.s	.lab0
.lab1:
		moveq	#-1,d0
.lab0:
	add.w	d0,Bob_X_Position(a4)
	subq.w	#1,Rcount(a4)			;Delay over ?
	bpl.s	.out1
		addq.b	#4,Rmode(a4)		;Yes, next mode
		sf	Rrylow(a4)		;Init fall-down-speed
		clr.w	Rrydir(a4)
		move.b	#BOB_TRUE,Bob_Used(a4)	;Collision now on !
	rts
.do_fall:					;Falling down...
	cmpi.w	#$0300,Rrydir(a4)		;Maximum speed reached ?
	bge.s	.no_speedup
		addi.w	#$0048,Rrydir(a4)	;No, speed up
.no_speedup:
	move.b	Rrydir+1(a4),d0			;Move rock down...
	add.b	d0,Rrylow(a4)
	move.b	Rrydir(a4),d1
	ext.w	d1
	move.w	Bob_Y_Position(a4),d0
	addx.w	d1,d0
	move.w	d0,Bob_Y_Position(a4)
	move.w	Bob_Y_Position(a4),d1		;Test for ground...
	addi.w	#14,d1
	cmp.w	#176+20,d1
	blt.s	.out
		moveq	#0,d0
		bsr	Standart_Destruction
		bra	init_rock		;... and init new rock
.out:
	rts

Rock_AnimTable1:
	dc.l	contra_GFX+Tbob03,contra_GFX+Tmsk03
	dc.w	0,0,32,2,2,14,28

Rock_AnimTable2:
	dc.l	contra_GFX+Tbob02,contra_GFX+Tmsk02
	dc.w	0,0,32,2,2,28,28

;------------------------------------------

		rsset	Bob_Special_1
Hhuser0		rs.w	1
Hhuser1		rs.w	1
Hdirflag	rs.b	1
Hhmode		rs.b	1

init_hand:				;Init hand at d0,d1
	move.l	a4,-(sp)
	movem.w	d0-d2,-(sp)

	moveq	#28,d0
	lea	Area_Enter_Vector(pc),a1

	bsr	Search_Bob_Entry

	move.l	(sp)+,Bob_X_Position(a4)
	move.w	(sp)+,d0	;O_PHA(a0)
;	move.l	#handle_hand,O_HANDLE(a0)
	move.w	#90,Hhuser0(a4)
;	cmpi.w	#5,O_PHA(a4)
;	seq	dirflag(a4)
	sf	Hhmode(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	(sp)+,a4
	rts

handle_hand:
	moveq	#0,d0
	tst.w	boss_power			;Boss dead ?
	bmi	Standart_Destruction

	moveq	#0,d0				;What's out little hand ?
	move.b	Hhmode(a4),d0
	jmp	.hand_tab(pc,d0.w)
.hand_tab:
	bra.w	.check_player
	bra.w	.hand_fadein
	bra.w	.hand_swingout
	bra.w	.hand_fadeout
.check_player:
	cmpi.w	#20,vpan1			;Check, if player is in range
	blt.s	.door_closed
		move.w	Bob_X_Position(a4),d0
		sub.w	#16,d0
		move.w	d0,d1
		tst.b	Hdirflag(a4)		;Which side ?
		bne.s	.lab1
			addi.w	#100,d1		;Left...
		bra.s	.lab0
.lab1:
			subi.w	#100,d0		;Right...
.lab0:
		cmp.w	T_posX,d0		;Inside range ?
		bgt.s	.no
		cmp.w	T_posX,d1
		blt.s	.no
		subq.w	#1,Hhuser0(a4)		;Yes, countdown is running
		bpl.s	.out
			addq.b	#4,Hhmode(a4)	;Ok, now then hand is comming
			clr.l	Hhuser0(a4)
.out:
	bra	.hand_end
.door_closed:
	tst.w	vpan1				;No starting of the hand, check
	bne.s	.no				;If door is closed...
		cmpi.w	#160,T_posX		;Set hand on player's side
		blt.s	.left
			move.w	#262+16,Bob_X_Position(a4)
			move.l	#Hand_AnimTable1,Bob_Next_Anim(a4)
			bsr	Get_Next_Bob_Frame
			st	Hdirflag(a4)
			bra.s	.no
.left:
			move.w	#10+16,Bob_X_Position(a4)
			move.l	#Hand_AnimTable2,Bob_Next_Anim(a4)
			bsr	Get_Next_Bob_Frame
			sf	Hdirflag(a4)
.no:
	move.w	#90,Hhuser0(a4)			;Reset chatch-delay
	bra	.hand_end
.hand_fadein:					;The hand slowly is moveing in...
	subq.w	#1,Hhuser1(a4)			;(actually: fadeing in)
	bpl	.out
		move.w	#10,Hhuser1(a4)
		addq.w	#1,Hhuser0(a4)
		move.w	Hhuser0(a4),d0
		cmpi.w	#4,d0			;Full brightness ?
		blo	.set_fadecol
		addq.b	#4,Hhmode(a4)		;Yes, next mode
		move.b	#BOB_TRUE,Bob_Used(a4)
	bra	.hand_end
.hand_swingout:					;Move hand to the centre (very fast)
	tst.b	Hdirflag(a4)
	bne.s	.left1
		addq.w	#4,Bob_X_Position(a4)
		cmpi.w	#60+16,Bob_X_Position(a4)
		bgt.s	.next
	bra	.hand_end
.left1:
		subq.w	#4,Bob_X_Position(a4)
		cmpi.w	#212+16,Bob_X_Position(a4)
		blt.s	.next
	bra	.hand_end
.next:						;Reached finally position.
	addq.b	#4,Hhmode(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	clr.w	Hhuser0(a4)			;Fade back to darkness...
	move.w	#3,Hhuser1(a4)
	bra	.hand_end
.hand_fadeout:					;Fade down & move back
	subq.w	#1,Hhuser0(a4)			;Next fade-step ?
	bpl.s	.no_fade
		addq.w	#8,Hhuser0(a4)		;Yes, reset delay
		subq.w	#1,Hhuser1(a4)		;Dec. lightness-factor
		bpl.s	.no_clear
			clr.w	Hhuser1(a4)	;and watch for lower border
.no_clear:
		move.w	Hhuser1(a4),d0		;Set colours
		bsr	.set_fadecol
.no_fade:
	tst.w	vpan1				;Doors closed ?
	beq.s	.next1				;Just reset now...
	tst.b	Hdirflag(a4)			;No, so move hand back
	bne.s	.right
		subq.w	#1,Bob_X_Position(a4)
		cmpi.w	#10,Bob_X_Position(a4)	;Back ?
		beq.s	.next1			;Yes...
	bra	.hand_end
.right:
	addq.w	#1,Bob_X_Position(a4)
	cmpi.w	#262+16,Bob_X_Position(a4)		;Back ?
	beq.s	.next1				;Yes...
	bra	.hand_end
.next1:
	sf	Hhmode(a4)                      ;Reset to first mode &
	move.w	#70,Hhuser0(a4)                 ;set darkest colours
	moveq	#0,d0
	bra	.set_fadecol

.set_fadecol:					;Set fade-pal no. d0
	cmp.w	#2,d0
	blo.s	.check_off
	tst.w	Bob_Status(a4)
	bne.s	.ok
	bsr	Get_Next_Bob_Frame
	st	Bob_Status(a4)
	bra.s	.hand_end
.check_off:
	tst.w	Bob_Status(a4)
	beq.s	.ok
	move.l	Bob_Act_Anim(a4),d0
	sub.l	#22,d0
	move.l	d0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	sf	Bob_Status(a4)
.ok:

.hand_end:
	moveq	#64,d1
	moveq	#6,d2
	move.l	Bob_Act_Anim(a4),a0
	move.l	4(a0),d3
	move.l	(a0),d4

	move.l	#176,d0
	sub.w	ovpan1,d0
	cmp.w	#176,d0
	beq.s	.hide
	sf	Bob_BlitStatus(a4)
	sub.w	Bob_Y_Position(a4),d0
	add.w	#32,d0
	bmi.s	.show
	move.w	d0,Bob_Y_Offset(a4)
	mulu	d2,d0
	add.l	d0,d3
	move.l	d3,Bob_Mask(a4)
	add.l	d0,d0
	add.l	d0,d0
	add.l	d4,d0
	move.l	d0,Bob_Graphics(a4)
	rts
.show:
	clr.w	Bob_Y_Offset(a4)
	rts
.hide:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	rts

Hand_AnimTable1:
	dc.l	contra_GFX+Tbob06,contra_GFX+Tmsk00
	dc.w	0,0,48,2,2,40,40
	dc.l	contra_GFX+Tbob00,contra_GFX+Tmsk00
	dc.w	0,0,48,2,2,40,40
Hand_AnimTable2:
	dc.l	contra_flip+Tbob01,contra_flip+Tmsk00
	dc.w	0,0,48,2,2,40,40
	dc.l	contra_flip+Tbob00,contra_flip+Tmsk00
	dc.w	0,0,48,2,2,40,40

;------------------------------------------

	rsset	Bob_Special_1
Ssxdir	rs.w	1
Ssydir	rs.w	1
Ssxlow	rs.b	1
Ssylow	rs.b	1

handle_shot:
	move.b	Ssxdir+1(a4),d0			;Move shot according to direction-vars...
	add.b	d0,Ssxlow(a4)
	move.b	Ssxdir(a4),d1
	ext.w	d1
	move.w	Bob_X_Position(a4),d0
	addx.w	d1,d0
	move.w	d0,Bob_X_Position(a4)
	move.b	Ssydir+1(a4),d0
	add.b	d0,Ssylow(a4)
	move.b	Ssydir(a4),d1
	ext.w	d1
	move.w	Bob_Y_Position(a4),d0
	addx.w	d1,d0
	move.w	d0,Bob_Y_Position(a4)

	bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)

	bra	Test_Bob_Out

Cshot_AnimTable1:
	dc.l	contra_GFX+Tbob04,contra_GFX+Tmsk04
	dc.w	0,0,29,2,2,28,28

calc_visible:
	move.l	#176,d0
	sub.w	ovpan1,d0
	cmp.w	#176,d0
	beq.s	.hide
	tst.w	boss_power
	bmi.s	.no_coll
	move.b	#BOB_TRUE,Bob_Used(a4)
.no_coll:
	sf	Bob_BlitStatus(a4)
	sub.w	Bob_Y_Position(a4),d0
	add.w	#32,d0
	bmi.s	.show
	move.w	d0,Bob_Y_Offset(a4)
	mulu	d2,d0
	add.l	d3,d0
	move.l	d0,Bob_Graphics(a4)
	rts
.show:
	clr.w	Bob_Y_Offset(a4)
	rts
.hide:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	rts

handle_platforms:
	lea	.platform_tab(pc),a0		;all 4 platforms...
	moveq	#3,d7
.loop:
		movem.w	(a0)+,d0-d2
		sub.w	vpan1,d1
		bsr	check_foot_frame
		bne.s	.found_plat
	dbf	d7,.loop
	move.w	#0,d0
	move.w	#176+32,d1
	move.w	#400,d2
	bsr	check_foot_frame
	bne.s	.found_plat
	rts					;Not found...

.found_plat:
	st	T_stand
	bsr	alias_feet
	rts

.platform_tab:
	dc.w	36+16,128+16,36+40+16
	dc.w	244+16,128+16,244+40+16
	dc.w	132+16,80+16+16,132+8+16
	dc.w	180+16,80+16+16,180+8+16

Contra_Clist:
	move.w	#Coplab5&$ffff,Wrap_Function+6
	move.l	Act_Scr_Structure,a6
	move.l	Scr_Supply_Field(a6),d0
	move.l	Scr_Show_Field(a6),Scr_Supply_Field(a6)
	move.l	d0,Scr_Show_Field(a6)
	not.w	Scr_Screen_num(a6)

Contra_SetClist:

	lea	Coplab4(pc),a0
	move.w	Scr_X_Level_Pos(a6),d0
	and.w	#15,d0
	moveq	#15,d1
	sub.w	d0,d1
	move.w	d1,d0
	lsl.w	#4,d0
	or.w	d0,d1
	move.w	d1,2(a0)

	lea	Coplab1(pc),a0
	moveq	#0,d1
	move	Scr_Y_Play_Anf(a6),d0
	mulu	Scr_Plane_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	add.l	d1,d0
	add.l	Scr_Show_Field(a6),d0

	swap	d0
	move	d0,2(a0)
	swap	d0
	move	d0,6(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,10(a0)
	swap	d0
	move	d0,14(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,18(a0)
	swap	d0
	move	d0,22(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,26(a0)
	swap	d0
	move	d0,30(a0)

	lea	Coplab2(pc),a0
	move.w	Clist_oldcolpos,d1
	move.w	#COPCOL2,4(a0,d1.w)	;Farbding wieder reinschreiben.

	move.w	#176,d0
	add.w	#$30,d0
	cmp.w	#$ff,d0
	bhs.s	.no_copjump
	sub.w	#$30,d0
	asl.w	#3,d0

	move.w	d0,Clist_oldcolpos
	move.w	#$008a,4(a0,d0.w)	;Jump auslsen.
	move.w	6(a0,d0.w),d1		;Diese Farbe wurde geschrieben.

	lea	8(a0,d0.w),a0		;Zu dieser Adresse returned der Copper.
	move.l	a0,d0

.no_copjump:

	lea	Coplab5(pc),a0
	move.w	d0,38(a0)		;LO-Word
	swap	d0
	move.w	d0,34(a0)		;HI-Word
.dont_update:
	move.w	boss_xdir,d0
	add.w	d0,boss_posx

	lea	Coplab5(pc),a0		;Bplpt fr Wrap
	move.l	#Rotate_Buffer2+11000,d0
	move.w	d0,18(a0)
	add.l	#planeb2,d0
	move.w	d0,22(a0)
	add.l	#planeb2,d0
	move.w	d0,26(a0)
	add.l	#planeb2,d0
	move.w	d0,30(a0)

	swap	d0
	move.w	d0,2(a0)
	move.w	d0,6(a0)
	move.w	d0,10(a0)
	move.w	d0,14(a0)

	lea	Sprlab(pc),a0
	bsr	Set_Sprites

	tst.b	Col_Flag
	beq.s	.no_col
	lea	$dff1b0,a1
	lea	Col_Buffer(pc),a0
	tst.b	Col_Init_Flag
	beq.s	.no_init2
	lea	Col_Buffer2(pc),a0
.no_init2:
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	sf	Col_Flag
.no_col:
	move.w	#32,d0
	add.w	vpan1,d0
	move.w	d0,Scr_Y_Play_Anf(a6)

	rts


vpan1:	dc.w	0
ovpan1:	dc.w	0


TMOVEIN	equ 0
TOPEN	equ 4
TCLOSE	equ 8
TWAIT1	equ 12
TSHOOT	equ 16
TEXPLO	equ 20
TEXITB	equ 24

TEND	equ -1

mode_tab:
	dc.b	TMOVEIN
	dc.b	TWAIT1,TWAIT1,TWAIT1,TOPEN,TCLOSE,TWAIT1,TWAIT1,TWAIT1
	dc.b	TWAIT1,TOPEN,TSHOOT,TCLOSE,TWAIT1,TOPEN,TWAIT1,TWAIT1
	dc.b	TWAIT1,TWAIT1,TCLOSE,TOPEN,TCLOSE,TWAIT1,TWAIT1,TOPEN
	dc.b	TSHOOT,TCLOSE
	dc.b	TEND
end_modes:
	dc.b	TEXPLO,TCLOSE,TWAIT1,TEXITB
	even

open_tab:
	dc.b	-1,0,-1,0,-1,0,-1,-1,-1,-1
	dc.b	-1,-1,-1,-1,-1,-1,-1,-1	;,-1,-1
	dc.b	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
	dc.b	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
	dc.b	-1,-2,-1,-2,-1,-2,-2,-2,0,1,2
	dc.b	0,-1
	dc.b	100

close_tab:
	dc.b	0,0,1,0,1,1,2,1,2,1
	dc.b	2,2,2,2,2,3,2,3,2,3
	dc.b	3,3,3,3,2
	dc.b	0,-2,-1,-1,0,-1,0,1,2,2
	dc.b	0,-2,-1,-1,0,-1,0,1,2,2
	dc.b	100

	even
platform_tab:
	dc.w	36,128,40
	dc.w	244,128,40
	dc.w	132,80,8
	dc.w	180,80,8

	even

Contra_AnimTable1:
	dc.l	contra_GFX+Tbob05,0
	dc.w	0,0,64,4,24,88,20

*---------------------------------------------------------------------------
*	Routine and AnimTable of     BIGWALKER
*---------------------------------------------------------------------------
Init_BigWalker:
	move.w	Scr_Y_Level_Pos(a6),d0
	add.w	T_posY,d0
	cmp.w	#1130,d0
	blt	Out_Bob
		moveq	#3,d0
		bsr	Start_Sound_Fade
		moveq	#$27,d0
		move.b	#41,xplo_time
		bsr	Start_Effekt


	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Create_BigWalker,Bob_Routine(a4)
	move.l	#Repos_Player_Dead,Dead_Vector
	move.w	Scr_X_Level_Pos(a6),d0
	and.w	#$fff0,d0
	move.w	d0,gfx_xpos
	sf	gfx_flag
	clr.w	gfx_ptr
	st	no_time

	move.w	#960,Scr_X_Fix(a6)
	move.w	#1280,Scr_Y_Fix(a6)

	st	Boss_flag

	add.w	#55,Bob_X_Position(a4)
	sub.w	#10,Bob_Y_Position(a4)
	bsr	Init_Walker_Objects

	rts

clear_walker_char:
	lea	character+128*45,a0
	moveq	#15,d7
.clear:
	clr.w	(a0)+
	clr.w	(a0)+
	move.w	#$ffff,(a0)+
	clr.w	(a0)+
	dbf	d7,.clear
	rts

reset_walker_char:
	lea	character+128*45,a0
	lea	walker_char_GFX,a1
	moveq	#16*4-1,d7
.reset:
	move.w	(a1)+,(a0)+
	dbf	d7,.reset
	rts

Create_BigWalker:
	move.w	Scr_X_Level_Pos(a6),d1
	cmp.w	#740,d1
	blt.s	.do_not_blit
	tst.b	gfx_flag
	bne.s	.blit_first
	move.w	gfx_xpos,d0
	and.w	#$fff0,d1
	cmp.w	d0,d1
	beq.s	.do_not_blit
	move.w	d1,gfx_xpos
.blit_first
	and.w	#$fff0,d1
	waitblt
	move.l	Scr_Supply_Field(a6),d0
	lsr.w	#3,d1
	add.w	d1,d0
	lea	Walker_BlitTable(pc),a0
	move.w	gfx_ptr,d2
	add.l	(a0,d2.w),d0
	move.l	4(a0,d2.w),bltapth(a5)
	bmi.s	.ready
	move.l	d0,bltdpth(a5)
	move.w	#planeb-2,bltdmod(a5)
	move.w	#$09f0,bltcon0(a5)
	move.w	#0,bltamod(a5)
	move.w	#-1,bltalwm(a5)
	move.w	8(a0,d2.w),bltsize(a5)
	tst.b	gfx_flag
	bne.s	.blit_second
	st	gfx_flag			;Nchstes Frame auch blitten!
.do_not_blit:
	bra	Handle_BigWalker
.blit_second:
	waitblt
	move.l	Scr_Refresh_Field(a6),d0
	add.w	d1,d0
	lea	Walker_BlitTable(pc),a0
	add.l	(a0,d2.w),d0
	move.l	4(a0,d2.w),bltapth(a5)
	move.l	d0,bltdpth(a5)
	move.w	#planeb-2,bltdmod(a5)
	move.w	8(a0,d2.w),bltsize(a5)

	sf	gfx_flag
	add.w	#10,gfx_ptr
	bra	Handle_BigWalker

.ready:
	move.l	#Handle_BigWalker,Bob_Routine(a4)
	bra	Handle_BigWalker

gfx_xpos:	dc.w	0
gfx_flag:	dc.w	0
gfx_ptr:	dc.w	0
Walker_Offset:	dc.w	0
Old_WOffset:	dc.w	0

w_start	= 40+4*20*planeb

Walker_BlitTable:
	dc.l	w_start+4*planeb*37,walker_GFX+8*0
	dc.w	64*4*59+1

	dc.l	w_start+4*planeb*28,walker_GFX+8*59
	dc.w	64*4*59+1

	dc.l	w_start+4*planeb*25,walker_GFX+8*118
	dc.w	64*4*65+1

	dc.l	w_start+4*planeb*23,walker_GFX+8*183
	dc.w	64*4*67+1

	dc.l	w_start+4*planeb*4,walker_GFX+8*250
	dc.w	64*4*90+1

	dc.l	w_start+4*planeb*4,walker_GFX+8*340
	dc.w	64*4*91+1

	dc.l	w_start+4*planeb*9,walker_GFX+8*431
	dc.w	64*4*87+1

	dc.l	w_start+4*planeb*28,walker_GFX+8*518
	dc.w	64*4*68+1

	dc.l	w_start+4*planeb*50,walker_GFX+8*586
	dc.w	64*4*46+1

	dc.l	w_start+4*planeb*61,walker_GFX+8*632
	dc.w	64*4*34+1

	dc.l	-1,-1

		rsset	Bob_Special_1	;Master
Wptr		rs.l	1
Wmode_ptr	rs.l	1
Wphase		rs.w	1
Wuser0		rs.w	1
Wwinit		rs.b	1
Wswing		rs.b	1

		rsset	Bob_Special_1	;Slave 1
		rs.l	1
Woffset		rs.w	1
Windex		rs.b	1
Wflag		rs.b	1
Wetime		rs.w	1
W_PHA		rs.w	1

		rsset	Bob_Special_1	;Cannon
		rs.l	1
Wdelay		rs.w	1
Wangle		rs.b	1
		rs.b	1

		rsset	Bob_Special_1	;Cannon
		rs.l	1
Wtdelay		rs.w	1
Wtmode		rs.b	1
		rs.b	1

Init_Walker_Objects:
	move.l	a4,-(sp)
		movem.w	Bob_X_Position(a4),d1-d2
		add.w	#63,d1
;		add.w	#85,d2
		lea	Area_Enter_Vector(pc),a1
		moveq	#30,d0
		bsr	Search_Bob_Entry

	move.l	(sp)+,a4

	lea	handler_tab(pc),a0
	move.l	a4,a3			;Allocate feet & legs
	moveq	#3,d6
	move.l	a4,-(sp)
.alloc_legs:
		movem.l	a0/a3/d6,-(sp)
		lea	Area_Enter_Vector(pc),a1
		moveq	#1,d0
		bsr	Search_Bob_Entry
		move.b	#BOB_NOCOL,Bob_Used(a4)
		movem.l	(sp)+,a0/a3/d6
		move.l	(a0)+,Bob_Routine(a4)
		move.w	d6,W_PHA(a4)
		sf	Wflag(a4)
		move.l	a4,Wptr(a3)
		move.l	a4,a3
	dbf	d6,.alloc_legs

	move.l	(sp)+,a4

;	st	boss_move		;No rope yet...
;	lea	boss_ptr-ptr,a4		;Allocate collsion-objects
;	lea	boss_tab(pc),a6
;	moveq	#3,d4
;	.do {
;		jsr	add_object.w
;		move.l	(a6)+,O_HANDLE(a0)
;		move.w	d4,O_PHA(a0)
;		move.l	#boss_col,O_COL(a0)
;		st	O_COLEN(a0)
;		sf	O_PHITEN(a0)
;		sf	O_POW(a0)
;		sf	flag(a0)
;		move.l	a0,ptr(a4)
;		move.l	a0,a4
;	} .loop d4
;
	sf	boss_killed			;Cannons do not shoot

	move.l	a4,-(sp)
	moveq	#1,d0
	movem.w	Bob_X_Position(a4),d1-d2
	lea	Area_Enter_Vector(pc),a1
	add.w	#102,d2
	addq.w	#5,d1
	bsr	Search_Last_Entry		;Allocate cannon-objects
	move.l	#WCannon_AnimTable1,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
;	move.l	a0,ptr(a4)
;	move.l	a0,a4
	move.l	#Whandle_cannon,Bob_Routine(a4)
	move.b	#84,Wangle(a4)
	sf	Wflag(a4)
	clr.w	Wdelay(a4)
	move.l	a4,-(sp)
	lea	Area_Enter_Vector(pc),a1
	moveq	#1,d0
	bsr	Search_Bob_Entry		;... the cannon itself ...
	move.l	#WCannon_AnimTable2,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.l	(sp)+,a0
	move.l	a4,Wptr(a0)
	move.l	#Handle_Walker_Slave,Bob_Routine(a4)
	sf	Wflag(a4)

	move.l	(sp)+,a4
;
;	jsr	add_objectlast.w		;Allocate thruster
;	move.l	a0,ptr(a4)
;	move.l	#handle_thruster,O_HANDLE(a0)
;	move.l	#thruster_spr,O_INFO(a0)
;	move.l	#thruster_col,O_COL(a0)
;	clr.w	O_PHA(a0)
;	sf	flag(a0)
;	clr.w	tdelay(a0)
;	sf	tmode(a0)
;
	move.b	#BOB_NOPLHIT,Bob_Used(a4)

	move.l	Wptr(a4),a3			;Init walking-variables
	clr.w	Wphase(a4)
	clr.w	Woffset(a3)
	move.w	#120,Wetime(a3)			;2s time until electrical disturbance

	bsr	calc_bosspos			;Set all slaves to correct positions

;	move.l	#handle_battle,O_HANDLE(a5)
	sf	Wwinit(a4)			;Wait 0 frames at the beginning
	clr.w	Wuser0(a4)
	move.l	#modes,Wmode_ptr(a4)

	lea	.pow_tab(pc),a0			;Calc power-level of boss
	bsr	Make_Power
	move.w	d0,boss_power
	move.w	#100,Bob_Power(a4)
	rts

.pow_tab:	dc.w	25,60,25
		dc.w	70,100,60
		dc.w	115,130,95

Init_Walker_2:
	lea	Walker_Macro_List(pc),a0
	bsr	change_collisions
	lea	custom,a5
	waitblt
	move.w	#planeb2-2,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.w	#-1,bltalwm(a5)
	move.w	#$09f0,bltcon0(a5)
	lea	walker_map(pc),a0
	move.l	Scr_Refresh_Field(a6),d0
	add.l	#186*planeb*4,d0
	moveq	#1,d6
.yloop:
	moveq	#25,d7
.xloop:
	moveq	#0,d1
	move.b	(a0)+,d1
	asl.w	#7,d1
	add.l	#character,d1
	waitblt
	move.l	d1,bltapth(a5)
	move.l	d0,bltdpth(a5)

	move.w	#64*16*4+1,bltsize(a5)

	waitblt

	addq.l	#2,d0

	dbf	d7,.xloop

	add.l	#16*planeb2*4-52,d0
	dbf	d6,.yloop

	lea	Create_WBackground(pc),a1
	jmp	AddHandler

walker_map:
	dc.b	68,67,68,70,71,67,68,67,68,70,71,67,68,67,68,70,71,67,68,67,68,70,71,67,68,67
	dc.b	76,75,76,78,79,75,76,75,76,78,79,75,76,75,76,78,79,75,76,75,76,78,79,75,76,75

Create_WBackground:
	move.l	#Return,-4(a0)
	waitblt
	move.w	#planeb-2,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.w	#-1,bltalwm(a5)
	move.w	#$09f0,bltcon0(a5)

	move.l	Scr_Show_Field(a6),d0
	bsr	.clear_bottom
	move.l	Scr_Supply_Field(a6),d0
	bsr	.clear_bottom
	move.l	Scr_Refresh_Field(a6),d0
	bsr	.clear_bottom


	rts

.clear_bottom:
	add.l	#176*planeb*4,d0
	moveq	#0,d1
	move.w	Scr_X_Level_Pos(a6),d1
	lsr.w	#3,d1
	add.l	d1,d0
	moveq	#19,d7
.xloop2:
	waitblt
	move.l	#character+45*128,bltapth(a5)
	move.l	d0,bltdpth(a5)

	move.w	#64*4*4+1,bltsize(a5)

	waitblt

	addq.l	#2,d0

	dbf	d7,.xloop2
	rts	


Walker_Macro_List:
	dc.b	67,68,70,71,0
	even

change_collisions:
	move.l	Macro_Pointer(pc),a1
.loop:
	moveq	#0,d0
	move.b	(a0)+,d0
	beq.s	.end
	add.w	d0,d0
	eor.b	#%1111,1(a1,d0.w)
	bra.s	.loop
.end:
	rts

Walker_Stand:
	move.l	Act_Scr_Structure,a6
	move.w	Scr_X_Level_Pos(a6),d0
	move.w	Scr_Y_Level_Pos(a6),d1
	add.w	#176,d1
	move.w	d0,d2
	add.w	#320,d2
	bsr	check_foot_frame
	beq.s	.no_stand
	st	T_stand
	bsr	alias_feet
	move.w	boss_xdir,T_forceX
	neg.w	T_forceX
.no_stand:
	rts

planeb2	= 52

Thruster_Slave:
	sf	Bob_BlitStatus(a4)
	tst.w	boss_power
	ble.s	.no_show
	tst.w	Walker_Hit
	bne.s	.show
.no_show:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
.show:
	move.w	#1280+24,d1
	add.w	Old_WOffset,d1
	move.w	d1,Bob_Y_Position(a4)

	cmp.b	#2,boss_killed
	beq	Out_Bob_Damage
	move.b	#BOB_NOCOL,Bob_Used(a4)
	rts

Thruster_AnimTable:
	dc.l	walker_flash,0
	dc.w	0,0,14,4,4,20,20

BigWalker_Clist:
	move.w	#Coplab5&$ffff,Wrap_Function+6
	move.l	Act_Scr_Structure,a6
	move.l	Scr_Supply_Field(a6),d0
	move.l	Scr_Show_Field(a6),Scr_Supply_Field(a6)
	move.l	d0,Scr_Show_Field(a6)
	not.w	Scr_Screen_num(a6)
BigWalker_SetClist:
	move.w	#1280,d0
	add.w	Walker_Offset,d0
	move.w	d0,Scr_Y_Level_Pos(a6)
	move.w	d0,Scr_Y_Fix(a6)

	lea	Coplab4(pc),a0
	move.w	Scr_X_Level_Pos(a6),d0
	and.w	#15,d0
	moveq	#15,d1
	sub.w	d0,d1
	move.w	d1,d0
	lsl.w	#4,d0
	or.w	d0,d1
	move.w	d1,2(a0)

	lea	Coplab1(pc),a0
	moveq	#0,d1
	move	Scr_Y_Play_Anf(a6),d0
	sub.w	Old_WOffset,d0
	mulu	Scr_Plane_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	add.l	d1,d0
	add.l	Scr_Show_Field(a6),d0

	swap	d0
	move	d0,2(a0)
	swap	d0
	move	d0,6(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,10(a0)
	swap	d0
	move	d0,14(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,18(a0)
	swap	d0
	move	d0,22(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,26(a0)
	swap	d0
	move	d0,30(a0)

	lea	Coplab2(pc),a0
	move.w	Clist_oldcolpos,d1
	move.w	#COPCOL2,4(a0,d1.w)	;Farbding wieder reinschreiben.

	move.w	#176,d0
	add.w	#$30,d0
	cmp.w	#$ff,d0
	bhs.s	.no_copjump
	sub.w	#$30,d0
	asl.w	#3,d0

	move.w	d0,Clist_oldcolpos
	move.w	#$008a,4(a0,d0.w)	;Jump auslsen.
	move.w	6(a0,d0.w),d1		;Diese Farbe wurde geschrieben.

	lea	8(a0,d0.w),a0		;Zu dieser Adresse returned der Copper.
	move.l	a0,d0

.no_copjump:

	lea	Coplab5(pc),a0
	move.w	d0,38(a0)		;LO-Word
	swap	d0
	move.w	d0,34(a0)		;HI-Word
.dont_update:
	move.w	boss_xdir,d0
	add.w	d0,boss_posx

	lea	Coplab5(pc),a0		;Bplpt fr Wrap
	moveq	#0,d0
	move.w	boss_posx,d0
	divu	#96,d0
	swap	d0
	lsr.w	#3,d0
	add.l	Scr_Refresh_Field(a6),d0
	add.l	#186*planeb*4,d0
	move.w	d0,18(a0)
	add.l	#planeb2,d0
	move.w	d0,22(a0)
	add.l	#planeb2,d0
	move.w	d0,26(a0)
	add.l	#planeb2,d0
	move.w	d0,30(a0)

	move.w	boss_posx,d0
	and.w	#15,d0
	moveq	#15,d1
	sub.w	d0,d1
	move.w	d1,d0
	lsl.w	#4,d0
	or.w	d0,d1

	move.w	d1,42(a0)

	lea	Sprlab(pc),a0
	bsr	Set_Sprites

	tst.b	Col_Flag
	beq.s	.no_col
	lea	$dff1b0,a1
	lea	Col_Buffer(pc),a0
	tst.b	Col_Init_Flag
	beq.s	.no_init2
	lea	Col_Buffer2(pc),a0
.no_init2:
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	sf	Col_Flag
.no_col:
	rts



calc_bosspos:					;Calc all slave's positions
;	move.l	ptr(a4),a0			;1st: Playfield B
;	move.w	O_XPOS(a5),hpan2.w
;	move.w	O_YPOS(a5),d0
;	add.w	offset(a0),d0
;	neg.w	d0
;	move.w	d0,vpan2.w

;	move.l	Bob_X_Position(a4),d1		;2nd: All collision-slaves
;	add.w	Woffset(a0),d1
;	move.l	boss_ptr,a0
;	moveq	#4,d0
;	.do {
;		move.l	d1,O_XPOS(a0)
;		move.l	ptr(a0),a0
;	} .loop d0
;	move.l	ptr(a0),a0			;Do not set cannon's slave
;	move.l	d1,O_XPOS(a0)

	move.w	Wphase(a4),d0			;Calc position of the legs
	add.w	d0,d0
	add.w	d0,d0
	lea	.phase_tab(pc),a0
	move.l	0(a0,d0.w),a0			;Get phase-offset-table
	movem.w	Bob_X_Position(a4),d6-d7
	move.l	Wptr(a4),a1
	moveq	#3,d5				;Set positions
.set_legs:
		move.w	d6,d0
		move.w	d7,d1
		add.w	(a0)+,d0
		add.w	(a0)+,d1
		movem.w	d0-d1,Bob_X_Position(a1)
		move.l	Wptr(a1),a1
	dbf	d5,.set_legs
	rts

.phase_tab:
	dc.l	.pha7,.pha6,.pha5,.pha4,.pha3,.pha2,.pha1,.pha0
.pha0:	dc.w	66,105,92,88,72,86,37,105
.pha1:	dc.w	64,105,91,87,86,83,65,97
.pha2:	dc.w	61,104,89,85,99,79,92,89
.pha3:	dc.w	54,104,85,86,101,82,98,97
.pha4:	dc.w	48,104,82,86,103,84,103,104
.pha5:	dc.w	51,99,82,83,102,84,91,105
.pha6:	dc.w	54,95,82,81,102,84,80,105
.pha7:	dc.w	60,100,87,84,87,85,59,105

Handle_BigWalker:
	bsr	Walker_Stand
	bsr	handle_repos1			;Handle backdrop

	move.w	Bob_Hit(a4),Walker_Hit
	tst.w	Bob_Hit(a4)
	beq.s	.no_flash
	subq.w	#1,Bob_Hit(a4)
.no_flash:
	moveq	#100,d0
	sub.w	Bob_Power(a4),d0
	beq.s	.no_hit
	move.w	#100,Bob_Power(a4)
	sub.w	d0,boss_power
.no_hit:
	tst.w	boss_power			;Boss killed ?
	bpl.s	.no_destruct
	move.l	Wptr(a4),a3			;Jump to current handler...
	clr.w	Woffset(a3)
	clr.w	Walker_Offset
	clr.w	Old_WOffset
		lea	Walker_Macro_List(pc),a0
		bsr	change_collisions
		move.l	#Whandle_expl,Bob_Routine(a4)
		move.w	#90,Wuser0(a4)			;90 Explosions
		sf	boss_killed			;Disable cannon
;		clr.w	forcex
		clr.w	boss_xdir
;		jsr	init_bullets.w
		move.l	#$9000,d0
		jsr	add_score
		bra	.end_boss
.no_destruct:
	move.l	Wptr(a4),a3			;Jump to current handler...
	moveq	#0,d0
	move.l	Wmode_ptr(a4),a0
	move.b	(a0),d0
	jmp	.mode_tab(pc,d0.w)
.mode_tab:
	bra.w	.do_walkin			;Walking in
	bra.w	.do_wait			;Waiting
	bra.w	.do_right1
	bra.w	.do_left1
.do_right1:
	tst.b	Wwinit(a4)
	beq.s	.do_right
		sf	Wwinit(a4)
		move.w	#94,Wuser0(a4)
.do_right:
	bsr	.handle_swing			;No, let body swing
;	move.w	#1,forcex
	move.w	#1,boss_xdir
;	addq.w	#1,O_XPOS(a5)
	subq.b	#1,Wuser0(a4)			;Handle animation...
	bpl.s	.no_anim1
		addq.b	#8,Wuser0(a4)
		subq.w	#1,Wphase(a4)
		andi.w	#7,Wphase(a4)
		cmp.w	#3,Wphase(a4)
		bne.s	.no_anim1
		PLAY_FX	#$2c
.no_anim1:
	subq.b	#1,Wuser0+1(a4)
	bmi	.next_step
	bra	.end_boss
.do_left1:
	tst.b	Wwinit(a4)
	beq.s	.do_left
		sf	Wwinit(a4)
		move.w	#94,Wuser0(a4)
.do_left:
	bsr	.handle_swing			;No, let body swing
;	move.w	#-1,forcex
	move.w	#-1,boss_xdir
;	subq.w	#1,O_XPOS(a5)
	subq.b	#1,Wuser0(a4)			;Handle animation...
	bpl.s	.no_anim2
		addq.b	#8,Wuser0(a4)
		addq.w	#1,Wphase(a4)
		andi.w	#7,Wphase(a4)
		bne.s	.no_anim2
		PLAY_FX	#$2c
.no_anim2:
	subq.b	#1,Wuser0+1(a4)
	bmi	.next_step
	bra	.end_boss
.do_wait:
	tst.b	Wwinit(a4)			;Init ?
	beq.s	.no_init
		sf	Wwinit(a4)
		st	boss_killed		;Cannon is on
		sf	boss_move
		move.w	#2*50,Wuser0(a4)	;Wait 2 sec.
;		clr.w	forcex
		clr.w	boss_xdir
.no_init:
	tst.b	Windex(a3)			;Swinging on the "reset-point" ?
	beq.s	.no_swing
		bsr	.handle_swing
.no_swing:
	subq.w	#1,Wuser0(a4)			;Time over ?
	bmi	.next_step
	bra	.end_boss
.do_walkin:
	cmpi.w	#960,Scr_X_Level_Pos(a6)	;Reached position ?
	bge	.init_step			;Yes, start next step
;	bsr	.handle_swing			;No, let body swing
;	subq.w	#1,O_XPOS(a5)			;Move in
;	subq.w	#1,Wuser0(a4)			;Handle animation...
;	bpl.s	.no_anim3
;		addq.w	#8,Wuser0(a4)
;		addq.w	#1,Wphase(a4)
;		andi.w	#7,Wphase(a4)
;.no_anim3:
	bra	.end_boss
.init_step:
	cmp.l	#BigWalker_Clist,Clist_Handler
	move.l	#BigWalker_SetClist,Clist_Fade_Handler
	beq.s	.next_step
	move.l	#BigWalker_Clist,Clist_Handler
	move.l	#BigWalker_SetClist,Clist_Fade_Handler
	bsr	Init_Walker_2
.next_step:
	move.l	Wmode_ptr(a4),a0		;Get next step of movemnet
	addq.l	#1,a0
	tst.b	(a0)				;End of list ?
	bpl.s	.use
		lea	modes(pc),a0
.use:
	move.l	a0,Wmode_ptr(a4)		;Set new pointer
	st	Wwinit(a4)			;Set init-flag
.end_boss:
	move.l	Wptr(a4),a3
	move.w	Walker_Offset,Old_WOffset
	move.w	Woffset(a3),Walker_Offset
	tst.b	T_hit
	bne	.no_stand
	movem.w	Bob_X_Position(a4),d0-d1	;Check, if player is on the walker's back
	add.w	Woffset(a3),d1
	addi.w	#98,d0
	addi.w	#25,d1
	moveq	#65,d2
	moveq	#0,d4
	bsr	check_slope
	beq.s	.not_on1
.set_slope:
		subi.w	#48,d1
		move.w	d1,T_posY
		st	T_stand
		bra.s	.on_slope
.not_on1:
		movem.w	Bob_X_Position(a4),d0-d1
		addq.w	#1,d0			;Standing on front slope ?
		addi.w	#25,d1
		add.w	Woffset(a3),d1
		moveq	#32,d2
		moveq	#-1,d4
		bsr	check_slope
		bne.s	.set_slope
		movem.w	Bob_X_Position(a4),d0-d1	;No, but is he on the top ?
		add.w	Woffset(a3),d1
		addi.w	#33,d0
		addi.w	#25,d1
		move.w	d0,d2
		add.w	#65,d2
		jsr	check_foot_frame
		beq.s	.no_stand
		move.w	Bob_Y_Position(a4),d1		;Yes...
		add.w	Woffset(a3),d1
		add.w	#26,d1
		jsr	alias_feet
		st	T_stand
.on_slope:
	subq.w	#1,Wetime(a3)			;Time over ?
	bpl	calc_bosspos
	bsr	init_electro			;Yes, start electro every 16 frames
	move.w	#15,Wetime(a3)
	bra	calc_bosspos			;Calc slave's positions
.no_stand:
	move.l	Wptr(a4),a3
	move.w	#80,Wetime(a3)			;Player is NOT standing anywhere on the walker...
	bra	calc_bosspos


.handle_swing:					;Handle swing of the walker's body
	move.l	Wptr(a4),a0
	subq.b	#1,Wswing(a4)				;Next swing-offset ?
	bpl.s	.out
		addq.b	#4,Wswing(a4)			;Yes, handle swinging
		addq.b	#2,Windex(a0)
		andi.b	#14,Windex(a0)
		moveq	#0,d0
		move.b	Windex(a0),d0
		move.w	.swing_tab(pc,d0.w),Woffset(a0)
.out:
	rts
.swing_tab:
	dc.w	0,-1,-2,-3,-4,-3,-2,-1

Whandle_cannon:
	cmp.b	#2,boss_killed			;Cannon-slave to be freed ?
	beq	Out_Bob_Damage

	tst.w	boss_power			;Collision only if alife
	bpl.s	.no_collision
		move.b	#BOB_NOCOL,Bob_Used(a4)
		bra.s	.no_work
.no_collision:
	move.w	#1280+111,d1
	add.w	Old_WOffset,d1
	move.w	d1,Bob_Y_Position(a4)

	move.l	Bob_X_Position(a4),-(sp)	;Calc angle to player
	subq.w	#4,Bob_X_Position(a4)
;	addi.w	#70,Bob_Y_Position(a4)
	move.w	T_posX,d6
	move.w	T_posY,d7
	addi.w	#16,d6
	addi.w	#24,d7
	add.w	Scr_X_Level_Pos(a6),d6
	add.w	Scr_Y_Level_Pos(a6),d7
	bsr	calc_ene_angle
	move.l	(sp)+,Bob_X_Position(a4)

	moveq	#127,d0				;Turn cannon to new angle
	sub.b	d1,d0				;(Target player)
	andi.b	#$fe,d0
	cmp.b	Wangle(a4),d0
	beq.s	.no_work
	bls.s	.lower
			moveq	#1,d0
		bra.s	.higher
.lower:
			moveq	#-1,d0
.higher:
		add.b	d0,Wangle(a4)
		cmpi.b	#50,Wangle(a4)		;Minimum reached ?
		bhs.s	.higher2
			move.b	#50,Wangle(a4)
		bra.s	.no_work
.higher2:
			cmpi.b	#148,Wangle(a4)	;Maximum reached ?
			bls.s	.no_work
				move.b	#148,Wangle(a4)
.no_work:
	move.l	Wptr(a4),a3			;Calc offset of turning object
	move.b	Wangle(a4),d0
	jsr	sin
	move.w	d0,d2
	move.b	Wangle(a4),d0
	jsr	cos
	asr.w	#4,d0
	asr.w	#4,d2
	add.w	Bob_X_Position(a4),d0
	add.w	Bob_Y_Position(a4),d2
;	addi.w	#16-4,d0
;	addi.w	#16+70,d2
	movem.w	d0/d2,Bob_X_Position(a3)	;Write into cannon's sub-slave

	tst.b	boss_killed			;Cannon on ?
	beq.s	.no_shoot
		subq.w	#1,Wdelay(a4)		;Delay down ?
		bpl.s	.no_shoot
			move.w	#120,Wdelay(a4)	;Yes, reset delay

			move.b	Wangle(a4),d0	;Calc direction of bullet
			jsr	sin
			move.w	d0,d3
			move.b	Wangle(a4),d0
			jsr	cos
			move.w	d0,d2
			asr.w	#2,d2
			asr.w	#2,d3
			movem.w	Bob_X_Position(a3),d0-d1 ;Calc 1st position of bullet
			move.w	d2,d4
			move.w	d3,d5
			asr.w	#2,d4
			asr.w	#2,d5
			add.w	d4,d0
			add.w	d5,d1
			subq.w	#3,d0		;GFX-correction of position
			subq.w	#3,d1
			bsr	Start_Shoot	;Start bullet
.no_shoot:

	move.w	#68,d0
	sub.b	Wangle(a4),d0

	and.w	#$00f8,d0
	mulu	#80,d0

	add.l	#Rotate_Buffer2,d0

	move.l	Wptr(a4),a3			;Calc offset of turning object
	move.l	d0,Bob_Graphics(a3)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a3)

	rts

WCannon_AnimTable1:
	dc.l	walker_char_GFX+128,kreis_GFX+Kmsk02+3840
	dc.w	-16,-16,32,-16+4,-16+4,24,24

WCannon_AnimTable2:
	dc.l	kreis_GFX+Kbob02+3840,kreis_GFX+Kmsk02+3840
	dc.w	-16,-16,32,-16+4,-16+4,24,24

Whandle_expl:					;Boss dies...
	bsr	handle_repos1			;Handle backdrop

	subq.b	#1,Wuser0(a4)			;Delay down ?
	bpl	.no_xplo
		addq.b	#2,Wuser0(a4)		;Yes, reset it

		move.l	a4,-(sp)
		jsr	rnd
		move.w	d0,d1
		andi.w	#127,d1
		add.w	Bob_X_Position(a4),d1
		jsr	rnd
		move.w	d0,d2
		andi.w	#63,d2
		add.w	Bob_Y_Position(a4),d2

		lea	Area_Enter_Vector(pc),a1
		moveq	#1,d0
		bsr	Search_Last_Entry		;Add one explosion
		move.l	(sp)+,a4

		btst	#0,Wuser0+1(a4)
		bne.s	.no_sound
		bsr	Play_Expl
.no_sound:
		subq.b	#1,Wuser0+1(a4)		;All explosions out ?
		bpl	.no_xplo

			move.l	Wptr(a4),a0	;Free slaves etc.
			moveq	#3,d0
.loop:
				st	Wflag(a0)
				move.l	Wptr(a0),a0
			dbf	d0,.loop

;			move.l	boss_ptr,a0
;			moveq	#6,d0
;			.do {
;				st	flag(a0)
;				move.l	ptr(a0),a0
;			} .loop d0

;												sf	no_scroll.w
			sf	Boss_flag
;			sf	sprpri.w
;			jsr	set_backdrop.w
;
			bsr	StartFlash

			lea	Destroy_Walker(pc),a1
			jsr	AddHandler

			bsr	Out_Bob_Damage

	SONGCONT #1

	moveq	#$19,d0
	bsr	Start_Effekt

.no_xplo:
	rts

Destroy_Walker:
	cmp.w	#$fff,coltab
	bne.s	.out
	move.l	#Return,-4(a0)
	clr.w	Scr_X_Fix(a6)
	clr.w	Scr_Y_Fix(a6)
	bsr	Create_Pages
	move.b	#2,boss_killed
			move.l	#Player_Dead,Dead_Vector
			move.l	#Level1_Clist,Clist_Handler
	move.l	#SetClist,Clist_Fade_Handler

			sf	no_time

.out:
	rts

check_slope:
	cmp.b	#1,T_state
	beq.s	.no
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	add.w	#16,d1
	move.w	T_posX,d3		;Player inside slope-area ?
	addi.w	#16,d3
	cmp.w	d0,d3
	ble.s	.no
		add.w	d0,d2
		cmp.w	d2,d3
		bge.s	.no
			sub.w	d0,d3
			tst.w	d4			;Right slope ?
			bne.s	.left
				add.w	d3,d1		;Yes...
			bra.s	.right
.left:
				sub.w	d3,d2		;No, it's a left slope
				sub.w	d0,d2
				add.w	d2,d1
.right:
			move.w	d1,d0
			move.w	d1,d2
			subq.w	#2,d2
			addq.w	#8,d1
			move.w	T_posY,d3
			addi.w	#48,d3
			cmp.w	d2,d3
			blt.s	.no
				cmp.w	d1,d3
				bgt.s	.no
					move.w	d0,d1
					moveq	#-1,d0
					rts
.no:
	moveq	#0,d0
	rts

		rsset	Bob_Special_1
Weptr		rs.l	1
Wecnt		rs.w	1
Wexdir		rs.w	1
Weydir		rs.w	1
Wedelay		rs.w	1

init_electro:
	move.l	a4,-(sp)
	lea	Area_Enter_Vector(pc),a1
	moveq	#2,d0
	move.w	#140,d1
	add.w	Bob_X_Position(a4),d1
	move.w	#63,d2
	add.w	Bob_Y_Position(a4),d2

	bsr	Search_Bob_Entry
	tst.w	d7
	bmi.s	.no_gfx
	move.l	#electro_AnimTable,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
.no_gfx:
	move.l	a4,a0
	move.l	(sp)+,a4
	tst.w	d7
	bmi.s	.no_obj
	move.l	#handle_electro,Bob_Routine(a0)	;Set parameter
	move.w	#-2,Bob_Power(a0)

	clr.w	Wecnt(a0)			;Setup delays etc.
	move.l	#electro_tab,Weptr(a0)
	clr.w	Wedelay(a0)
.no_obj:
	PLAY_FX	#$2d
	rts

handle_electro:
	tst.w	boss_power			;Boss dead ?
	bmi	Out_Bob_Damage			;Yes -> Free electro

	subq.w	#1,Wecnt(a4)			;Next movement ?
	bpl.s	.no_next
		move.l	Weptr(a4),a0		;Yes, setup new directions etc.
		move.w	(a0)+,Wecnt(a4)
		move.l	(a0)+,Wexdir(a4)
		move.l	a0,Weptr(a4)
		tst.w	Wecnt(a4)		;Last one ?
		bmi	Out_Bob_Damage
;		.if (minus) {
;	free_electro:				;Yes, "free" object
;			subi.w	#12,O_XPOS(a5)
;			subi.w	#12,O_YPOS(a5)
;			jmp	make_hit.w
;		}
.no_next:
	movem.w	Wexdir(a4),d0-d1		;Move electro with current direction
	add.w	d0,Bob_X_Position(a4)
	add.w	d1,Bob_Y_Position(a4)

	bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)

	bra	Standart_BobAnim

Ebob00 	= $00000
Emsk00 	= $00068
Ebob01 	= $00082
Emsk01 	= $000f2
Ebob02 	= $0010e
Emsk02 	= $00166
Ebob03 	= $0017c
Emsk03 	= $001dc
Ebob04 	= $001f4
Emsk04 	= $0024c
Ebob05 	= $00262
Emsk05 	= $002ba


electro_AnimTable:
	dc.l	electro_GFX+Ebob00,electro_GFX+Emsk00
	dc.w	0,1,13,0,0,16,10
	dc.l	electro_GFX+Ebob01,electro_GFX+Emsk01
	dc.w	0,1,14,0,0,16,10
	dc.l	electro_GFX+Ebob02,electro_GFX+Emsk02
	dc.w	0,4,11,0,0,16,10
	dc.l	electro_GFX+Ebob03,electro_GFX+Emsk03
	dc.w	0,2,12,0,0,16,10
	dc.l	electro_GFX+Ebob04,electro_GFX+Emsk04
	dc.w	0,0,11,0,0,16,10
	dc.l	electro_GFX+Ebob05,electro_GFX+Emsk05
	dc.w	0,0,11,0,0,16,10
	dc.w	ENTRY_END
	dc.l	electro_AnimTable

electro_tab:
	dc.w	50,-1,-1
	dc.w	20,-1,0
	dc.w	6,-1,1
	dc.w	40,-1,0
	dc.w	20,-1,1
	dc.w	-1


boss_xdir:	dc.w	0
boss_posx:	dc.w	0
boss_move:	dc.b	0
boss_power:	dc.w	0
Walker_Hit:	dc.w	0

WALK_IN		equ 0
WAIT		equ 4
RIGHT1		equ 8
LEFT1		equ 12
WEND		equ -1

modes:	dc.b	WALK_IN
	dc.b	WAIT,RIGHT1,RIGHT1,RIGHT1,RIGHT1,RIGHT1
	dc.b	WAIT,LEFT1,LEFT1,LEFT1,LEFT1,LEFT1
	dc.b	WAIT
	dc.b	WEND

	even


handle_slave_start:
	bsr	set_leg_frame
	move.l	#Handle_Walker_Slave,Bob_Routine(a4)
	rts

handle_slave1_start:
	bsr	set_leg_frame
	move.l	#Handle_Walker_Slave1,Bob_Routine(a4)
	rts

Handle_Walker_Slave:
	bsr	free_me
	rts

Handle_Walker_Slave1:
	moveq	#0,d0
	move.w	Walker_Offset(pc),d0
	add.w	#1395,d0

	move.w	Bob_Y_Position(a4),d1
	sub.w	d1,d0

	;d0 Pixel am oberen Rand abschneiden.
	move.w	d0,Bob_Y_Offset(a4)
	moveq	#32,d1
	sub.w	d0,d1
	move.w	d1,Bob_Height(a4)

	move.w	d0,d1
	add.w	d1,d1
	add.w	d1,d0
	add.w	d0,d0	;*6

	move.l	#leg_GFX+Lmsk03,d2
	add.l	d0,d2
	move.l	d2,Bob_Mask(a4)
	add.w	d0,d0
	add.w	d0,d0
	move.l	#leg_GFX+Lbob03,d2
	add.l	d0,d2
	move.l	d2,Bob_Graphics(a4)

	bsr	free_me
	rts

free_me:
	cmp.b	#2,boss_killed
	beq	Out_Bob_Damage
	rts

set_leg_frame:
	move.w	W_PHA(a4),d0
	asl.w	#3,d0
	lea	.leg_tab(pc),a0
	move.l	(a0,d0.w),Bob_Next_Anim(a4)
	move.l	4(a0,d0.w),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
	bra	Get_Next_Bob_Frame

.leg_tab:
	dc.l	BigWalker_AnimTable1,BossWalker_Info_1
	dc.l	BigWalker_AnimTable3,BossWalker_Info_2
	dc.l	BigWalker_AnimTable4,BossWalker_Info_2
	dc.l	BigWalker_AnimTable2,BossWalker_Info_1

handler_tab:
	dc.l	handle_slave_start,handle_slave1_start
	dc.l	handle_slave_start,handle_slave_start

Lbob00 	= $00000
Lmsk00 	= $00600
Lbob01 	= $00780
Lmsk01 	= $00a80
Lbob02 	= $00b40
Lmsk02 	= $00600
Lbob03 	= $01140
Lmsk03 	= $00a80

BigWalker_AnimTable1:
	dc.l	leg_GFX+Lbob00,leg_GFX+Lmsk00
	dc.w	0,0,48,80,0,16,16
BigWalker_AnimTable2:
	dc.l	leg_GFX+Lbob02,leg_GFX+Lmsk02
	dc.w	0,0,48,0,0,32,32
BigWalker_AnimTable3:
	dc.l	leg_GFX+Lbob01,leg_GFX+Lmsk01
	dc.w	0,0,32,0,0,0,0
BigWalker_AnimTable4:
	dc.l	leg_GFX+Lbob03,leg_GFX+Lmsk03
	dc.w	0,0,32,0,0,0,0

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Kreis-Boss
*---------------------------------------------------------------------------
Kbob00	= $00000
Kmsk00	= $00000
Kbob01	= $00000
Kmsk01	= $00000
Kbob02 	= $00000
Kmsk02 	= $00200
Kbob03 	= $00280
Kmsk03 	= $00300
Kbob04 	= $00320
Kmsk04 	= $00520

Start_Kreis:
	cmp.w	#270,Scr_Y_Level_Pos(a6)
	blt	Out_Bob
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.w	#$2d7,Scr_X_Fix(a6)
	move.l	#.Create_second_part,Bob_Routine(a4)

		sf	boss_killed
		move.l	a4,-(sp)
		sf	d2
		lea	modes0(pc),a0
		bsr	init_cannon
		st	d2
		lea	modes1(pc),a0
		bsr	init_cannon
		move.l	(sp)+,a4
	lea	Control_Kreis_Destruction(pc),a1
	jsr	AddHandler

		moveq	#3,d0
			bsr	Start_Sound_Fade
		moveq	#$27,d0
		move.b	#41,xplo_time
		bsr	Start_Effekt

	st	Boss_flag

	bsr	Create_Background
	rts

.Create_second_part:
	lea	adress_list+48*2(pc),a0
	lea	module_list+48(pc),a1
	lea	module_buffer+48*2(pc),a3

	move.w	#2*3,bltbmod(a5)
	move.w	#2*3,bltcmod(a5)
	move.w	#-1,bltalwm(a5)

	move.l	a4,-(sp)

	moveq	#kreis_anz/2-1,d7
	moveq	#48,d1
	bsr	mod_set_loop

	move.l	(sp)+,a4

	bra	Out_Bob_Damage


Restore_Background:
	lea	adress_list(pc),a0
	lea	module_buffer(pc),a1
	move.l	Macro_Pointer,a3
	moveq	#kreis_anz-1,d7
.restore_map:
	sub.l	a2,a2
	move.w	(a0)+,a2
	add.l	Scr_Level(a6),a2
	moveq	#0,d0
	move.b	(a2),d0
	move.b	(a1)+,(a2)
	add.w	d0,d0
	move.b	(a1)+,1(a3,d0.w)
	dbf	d7,.restore_map

	lea	module_list(pc),a0
	move.w	#0,bltamod(a5)
	move.w	#0,bltdmod(a5)
	move.w	#-1,bltalwm(a5)
	moveq	#96-1,d7
	move.l	#module_Buffer,d1
	move.w	#$09f0,bltcon0(a5)
.mod_copy_loop:
	moveq	#0,d0
	move.b	(a0)+,d0
	asl.w	#7,d0
	add.l	#character,d0
	waitblt
	move.l	d1,bltapth(a5)
	move.l	d0,bltdpth(a5)
	move.w	#64*16*4+1,bltsize(a5)
	add.l	#128,d1
	cmp.w	#37,d7
	bne.s	.no_switch
	move.l	#Work_Buffer2,d1
.no_switch:
	dbf	d7,.mod_copy_loop

	rts

Create_Background:
	waitblt
	lea	module_list(pc),a0
	move.w	#0,bltamod(a5)
	move.w	#0,bltdmod(a5)
	move.w	#-1,bltalwm(a5)
	moveq	#96-1,d7
	move.l	#module_Buffer,d1
	move.w	#$09f0,bltcon0(a5)
.mod_copy_loop:
	moveq	#0,d0
	move.b	(a0)+,d0
	asl.w	#7,d0
	add.l	#character,d0
	waitblt
	move.l	d0,bltapth(a5)
	move.l	d1,bltdpth(a5)
	move.w	#64*16*4+1,bltsize(a5)
	add.l	#128,d1
	cmp.w	#37,d7
	bne.s	.no_switch
	move.l	#Work_Buffer2,d1
.no_switch:
	dbf	d7,.mod_copy_loop

	lea	adress_list(pc),a0
	lea	module_list(pc),a1
	lea	module_buffer(pc),a3

	move.w	#2*3,bltbmod(a5)
	move.w	#2*3,bltcmod(a5)

	moveq	#kreis_anz/2-1,d7
	moveq	#0,d1
mod_set_loop:
	sub.l	a2,a2
	move.w	(a0)+,a2
	add.l	Scr_Level(a6),a2
	moveq	#0,d0
	move.b	(a2),d0
	move.b	d0,(a3)+

	asl.w	#7,d0
	move.b	(a1)+,(a2)
	moveq	#0,d2
	move.b	(a2),d2
	move.w	d2,d3
	add.w	d3,d3
	move.l	a2,-(sp)
	move.l	Macro_Pointer(pc),a2
	move.b	1(a2,d3.w),(a3)+
	sf	1(a2,d3.w)
	move.l	(sp)+,a2

	asl.w	#7,d2
	add.l	#character,d2
	add.l	#character,d0
	waitblt
	move.w	#0,bltamod(a5)
	move.w	#0,bltdmod(a5)
	move.l	d2,bltdpth(a5)
	move.l	d0,bltapth(a5)
	move.w	#$09f0,bltcon0(a5)
	move.w	#64*16*4+1,bltsize(a5)

	bsr	.get_kreis_module

	moveq	#4-1,d6
	waitblt
	move.w	#$0000,bltcon1(a5)
	move.w	#$0fca,bltcon0(a5)
	move.w	#2*3,bltdmod(a5)
.plane_loop:
	waitblt
	move.l	d4,bltapth(a5)
	move.l	d3,bltbpth(a5)
	move.l	d2,bltcpth(a5)
	move.l	d2,bltdpth(a5)
	move.w	#64*16+1,bltsize(a5)
	addq.l	#2,d3
	addq.l	#2,d2
	dbf	d6,.plane_loop
	addq.w	#1,d1
	dbf	d7,mod_set_loop

	rts

.get_kreis_module:
	cmp.w	#24,d1
	blt.s	.left_upper
	cmp.w	#48,d1
	blt.s	.right_upper
	cmp.w	#72,d1
	blt	.right_lower

.left_lower:
	move.l	d1,-(sp)
	sub.l	#72,d1
	move.l	d1,d3
	asl.w	#7,d3
	add.l	#kreis_GFX+120,d3
	move.l	d1,d4
	asl.w	#5,d4
	add.l	#kreis_GFX+3072+30,d4

	move.w	#-4,bltamod(a5)
	move.w	#-10,bltbmod(a5)

	move.l	(sp)+,d1
	rts

.left_upper:
	;linke, obere Hlfte.
	move.l	d1,d3
	asl.w	#7,d3
	add.l	#kreis_GFX,d3
	move.l	d1,d4
	asl.w	#5,d4
	add.l	#kreis_GFX+3072,d4

	rts

.right_upper:
	move.l	d1,-(sp)
	sub.l	#24,d1
	move.l	d1,d3
	asl.w	#7,d3
	add.l	#kreis_GFX,d3
	move.l	d1,d4
	asl.w	#5,d4
	add.l	#kreis_GFX+3072,d4

	;X-Flip ausfhren

	move.l	d3,a4
	movem.l	a0/a1,-(sp)
	lea	flip_table,a0
	lea	kreis_mod_buffer,a1
	moveq	#63,d3
	bsr	.x_flip_module
	move.l	d4,a4
	moveq	#15,d3
	bsr	.x_flip_module

	move.l	#kreis_mod_buffer,d3
	move.l	d3,d4
	add.l	#128,d4
	movem.l	(sp)+,a0/a1
	move.l	(sp)+,d1
	rts

.right_lower:
	move.l	d1,-(sp)
	sub.l	#48,d1
	move.l	d1,d3
	asl.w	#7,d3
	add.l	#kreis_GFX,d3
	move.l	d1,d4
	asl.w	#5,d4
	add.l	#kreis_GFX+3072,d4

	;X-Flip ausfhren

	move.l	d3,a4
	movem.l	a0/a1,-(sp)
	lea	flip_table,a0
	lea	kreis_mod_buffer,a1
	moveq	#63,d3
	bsr.s	.x_flip_module
	move.l	d4,a4
	moveq	#15,d3
	bsr.s	.x_flip_module

	move.l	#kreis_mod_buffer,d3
	move.l	d3,d4
	add.l	#128+2*15,d4

	add.l	#2*4*15,d3

	move.w	#-4,bltamod(a5)
	move.w	#-10,bltbmod(a5)

	movem.l	(sp)+,a0/a1
	move.l	(sp)+,d1
	rts

.x_flip_module:
	moveq	#0,d0
.flip_loop:
	move.b	(a4),d0
	move.b	(a0,d0.w),1(a1)
	move.b	1(a4),d0
	move.b	(a0,d0.w),(a1)
	addq.l	#2,a4
	addq.l	#2,a1
	dbf	d3,.flip_loop

	rts

k_pos	=	130*27+47
kreis_anz	= 96

module_list:
	dc.b	100,101,102,103,104,105,106,107,108,109
	dc.b	110,111,112,113,114,115,116,117,118,119
	dc.b	120,121,122,123,124,125,126,127,128,129
	dc.b	130,131,136,137,144,145,146,147,65,149
	dc.b	95
	dc.b	96,97,202,203,94,99,206,207,208,209
	dc.b	210,211,212,213,214,215,216,217,219
	dc.b	45,221,222,223,224,225,226,227,228,229
	dc.b	230,231,98,82,234,235,83,85,238,239
	dc.b	86,87,92,93,90,91,246,247,248,249
	dc.b	250,251,252,253,254,255

adress_list:
	dc.w	k_pos+levelb1*0+3,k_pos+levelb1*0+4,k_pos+levelb1*0+5,k_pos+levelb1*0+6
	dc.w	k_pos+levelb1*1+2,k_pos+levelb1*1+3,k_pos+levelb1*1+4,k_pos+levelb1*1+5,k_pos+levelb1*1+6
	dc.w	k_pos+levelb1*2+1,k_pos+levelb1*2+2,k_pos+levelb1*2+3,k_pos+levelb1*2+4
	dc.w	k_pos+levelb1*3+0,k_pos+levelb1*3+1,k_pos+levelb1*3+2,k_pos+levelb1*3+3
	dc.w	k_pos+levelb1*4+0,k_pos+levelb1*4+1,k_pos+levelb1*4+2
	dc.w	k_pos+levelb1*5+0,k_pos+levelb1*5+1
	dc.w	k_pos+levelb1*6+0,k_pos+levelb1*6+1

	dc.w	k_pos+levelb1*0+10,k_pos+levelb1*0+9,k_pos+levelb1*0+8,k_pos+levelb1*0+7
	dc.w	k_pos+levelb1*1+11,k_pos+levelb1*1+10,k_pos+levelb1*1+9,k_pos+levelb1*1+8,k_pos+levelb1*1+7
	dc.w	k_pos+levelb1*2+12,k_pos+levelb1*2+11,k_pos+levelb1*2+10,k_pos+levelb1*2+9
	dc.w	k_pos+levelb1*3+13,k_pos+levelb1*3+12,k_pos+levelb1*3+11,k_pos+levelb1*3+10
	dc.w	k_pos+levelb1*4+13,k_pos+levelb1*4+12,k_pos+levelb1*4+11
	dc.w	k_pos+levelb1*5+13,k_pos+levelb1*5+12
	dc.w	k_pos+levelb1*6+13,k_pos+levelb1*6+12

	dc.w	k_pos+levelb1*13+10,k_pos+levelb1*13+9,k_pos+levelb1*13+8,k_pos+levelb1*13+7
	dc.w	k_pos+levelb1*12+11,k_pos+levelb1*12+10,k_pos+levelb1*12+9,k_pos+levelb1*12+8,k_pos+levelb1*12+7
	dc.w	k_pos+levelb1*11+12,k_pos+levelb1*11+11,k_pos+levelb1*11+10,k_pos+levelb1*11+9
	dc.w	k_pos+levelb1*10+13,k_pos+levelb1*10+12,k_pos+levelb1*10+11,k_pos+levelb1*10+10
	dc.w	k_pos+levelb1*9+13,k_pos+levelb1*9+12,k_pos+levelb1*9+11
	dc.w	k_pos+levelb1*8+13,k_pos+levelb1*8+12
	dc.w	k_pos+levelb1*7+13,k_pos+levelb1*7+12

	dc.w	k_pos+levelb1*13+3,k_pos+levelb1*13+4,k_pos+levelb1*13+5,k_pos+levelb1*13+6
	dc.w	k_pos+levelb1*12+2,k_pos+levelb1*12+3,k_pos+levelb1*12+4,k_pos+levelb1*12+5,k_pos+levelb1*12+6
	dc.w	k_pos+levelb1*11+1,k_pos+levelb1*11+2,k_pos+levelb1*11+3,k_pos+levelb1*11+4
	dc.w	k_pos+levelb1*10+0,k_pos+levelb1*10+1,k_pos+levelb1*10+2,k_pos+levelb1*10+3
	dc.w	k_pos+levelb1*9+0,k_pos+levelb1*9+1,k_pos+levelb1*9+2
	dc.w	k_pos+levelb1*8+0,k_pos+levelb1*8+1
	dc.w	k_pos+levelb1*7+0,k_pos+levelb1*7+1

module_buffer:
	ds.b	96*2

;----------------------------------------

boss_xpos:	dc.w	kreis_x+112
boss_ypos:	dc.w	kreis_y+112

boss_killed:	dc.b	0
		dc.b	0
boss_ptr:	dc.l	0

		rsset	Bob_Special_1		;Master (Cannon)
Cptr		rs.l	1
Cangle		rs.w	1
Cmode_ptr	rs.l	1
Cuser0		rs.w	1
Ccinit		rs.b	1
Cflag		rs.b	1

		rsset	Bob_Special_1		;Slave 1 (Cannon)
		rs.l	1
Cdir		rs.w	1

init_cannon:
	movem.l	a0/d2,-(sp)
	moveq	#0,d1
	moveq	#0,d2
	lea	Area_Enter_Vector(pc),a1
	moveq	#33,d0
	bsr	Search_Bob_Entry
	movem.l	(sp)+,a0/d2

	move.l	a4,-(sp)
	moveq	#0,d0
	move.b	T_power,d0			;Calculate power
	add.b	d0,d0
	add.b	d0,d0
	addi.b	#100,d0
	move.w	d0,Bob_Power(a4)
	move.l	a0,Cmode_ptr(a4)			;Set movement-table
	sf	Ccinit(a4)			;Set first 4 sec. as waiting-time
	move.w	#4*60,Cuser0(a4)
	move.b	d2,Cflag(a4)			;Set 1st or 2nd cannon
	bne.s	.set_2
		move.b	#64,Cangle(a4)		;Start angle
	bra.s	.set_1
.set_2:
		move.b	#64+128,Cangle(a4)
.set_1:

	move.l	a4,-(sp)
	moveq	#32,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry		;Add 1st small ball
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	a4,a0
	move.l	(sp)+,a4

	move.l	a0,Cptr(a4)
	move.l	a0,a4
	sf	Cflag(a4)
	clr.w	Cdir(a4)			;Direction-Var. of master (no space in master-object)

	move.l	a4,-(sp)
	moveq	#31,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry		;Add "turning-object"
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	(sp)+,a0
	move.l	a4,Cptr(a0)
	sf	Cflag(a4)

	move.l	a4,-(sp)
	moveq	#32,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry		;Add 2nd small ball
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	(sp)+,a0
	move.l	a4,Cptr(a0)
	sf	Cflag(a4)

	move.l	(sp)+,a4

	bsr	calc_positions			;Calc positions for the 1st time
	rts

handle_Bcannon:
	bsr	Standart_Hit_Handler
	bne.s	.no_destruct
		PLAY_FX	#$29
		sf	global_startsound
		move.l	#handle_expl,Bob_Routine(a4)
		clr.w	Cuser0(a4)		;Delay
		move.w	#20,Cmode_ptr(a4)	;Number of explosions
		rts
.no_destruct:
	move.l	Cptr(a4),a3
	move.l	Cmode_ptr(a4),a0		;Handle movements
	moveq	#0,d0
	move.b	(a0),d0
	add.w	d0,d0
	add.w	d0,d0
	jmp	.mode_tab(pc,d0.w)
.mode_tab:
	bra.w	.do_wait1
	bra.w	.do_dec16
	bra.w	.do_dec32
	bra.w	.do_dec64
	bra.w	.do_inc16
	bra.w	.do_inc32
	bra.w	.do_inc64
.do_wait1:					;Wait 100 frames & slow down
	tst.b	Ccinit(a4)
	beq.s	.lab0
		sf	Ccinit(a4)
		move.w	#60,Cuser0(a4)
.lab0:
	cmpi.w	#15,Cuser0(a4)			;Time ready to shoot ?
	bne.s	.no_shot
		move.b	Cangle(a4),d3		;Calc start-position
		move.b	d3,d0
		jsr	sin
		move.l	d0,d2
		move.b	d3,d0
		jsr	cos
		muls	#80,d0
		muls	#80,d2
		asr.l	#8,d0
		asr.l	#8,d2
		add.w	boss_xpos,d0
		add.w	boss_ypos,d2
		movem.w	d0/d2,-(sp)
		move.b	#128,d4			;Calc start-angle (DX,DY)
		add.b	Cangle(a4),d4
		move.b	d4,d0
		jsr	sin
		move.w	d0,d3
		move.b	d4,d0
		jsr	cos
		move.w	d0,d2
		asr.w	#1,d2
		asr.w	#1,d3
		movem.w	(sp)+,d0-d1		;Start bullet
		bsr	Start_Shoot
.no_shot:
	tst.w	Cdir(a3)			;Slow down neccessary ?
	beq.s	.done2
		bpl.s	.left
			addi.w	#$0020,Cdir(a3)
			bmi.s	.done
			clr.w	Cdir(a3)
			bra.s	.done
.left:
			subi.w	#$0020,Cdir(a3)
			bpl.s	.done
			clr.w	Cdir(a3)
			bra.s	.done
.done2:
	tst.b	kreis_sound
	beq.s	.done
	sf	kreis_sound
	PLAY_FX	#$29
	sf	global_startsound
.done:
	subq.w	#1,Cuser0(a4)			;Time up ?
	bmi	.next_step
	bra	.end_cannon
.do_dec16:
	tst.b	Ccinit(a4)			;Decrement angle...
	beq	.do_dec
		st	kreis_sound
		PLAY_FX	#$28
		move.b	#$28,global_startsound
		move.b	#$29,global_stopsound
		sf	Ccinit(a4)
		move.w	#15,Cuser0(a4)
	bra	.do_dec
.do_dec32:
	tst.b	Ccinit(a4)
	beq.s	.do_dec
		st	kreis_sound
		PLAY_FX	#$28
		move.b	#$28,global_startsound
		move.b	#$29,global_stopsound
		sf	Ccinit(a4)
		move.w	#31,Cuser0(a4)
	bra	.do_dec
.do_dec64:
	tst.b	Ccinit(a4)
	beq.s	.do_dec
		st	kreis_sound
		PLAY_FX	#$28
		move.b	#$28,global_startsound
		move.b	#$29,global_stopsound
		sf	Ccinit(a4)
		move.w	#63,Cuser0(a4)
.do_dec:
	cmpi.w	#-2<<8,Cdir(a3)
	ble.s	.no_sub
		subi.w	#$0010,Cdir(a3)
.no_sub:
	subq.w	#1,Cuser0(a4)
	bpl	.end_cannon
	bra	.next_step
.do_inc16:					;Increment angle...
	tst.b	Ccinit(a4)
	beq	.do_inc
		st	kreis_sound
		PLAY_FX	#$28
		move.b	#$28,global_startsound
		move.b	#$29,global_stopsound
		sf	Ccinit(a4)
		move.w	#15,Cuser0(a4)
	bra	.do_inc
.do_inc32:
	tst.b	Ccinit(a4)
	beq	.do_inc
		st	kreis_sound
		PLAY_FX	#$28
		move.b	#$28,global_startsound
		move.b	#$29,global_stopsound
		sf	Ccinit(a4)
		move.w	#31,Cuser0(a4)
	bra	.do_inc
.do_inc64:
	tst.b	Ccinit(a4)
	beq	.do_inc
		st	kreis_sound
		PLAY_FX	#$28
		move.b	#$28,global_startsound
		move.b	#$29,global_stopsound
		sf	Ccinit(a4)
		move.w	#63,Cuser0(a4)
.do_inc:
	cmpi.w	#2<<8,Cdir(a3)
	bge.s	.no_add
		addi.w	#$0010,Cdir(a3)
.no_add:
	subq.w	#1,Cuser0(a4)
	bpl	.end_cannon
.next_step:
	move.l	Cmode_ptr(a4),a0			;Get next step of movemnet
	addq.l	#1,a0
	tst.b	(a0)				;End of list ?
	bpl.s	.no_end
		tst.b	Cflag(a4)		;Yes, 1st or 2nd cannon ?
		bne.s	.sec
			lea	modes0(pc),a0
		bra.s	.no_end
.sec:
			lea	modes1(pc),a0
.no_end:
	move.l	a0,Cmode_ptr(a4)		;Set new pointer
	st	Ccinit(a4)			;Set init-flag
.end_cannon:

	move.w	Cdir(a3),d0			;Move cannon
	add.w	d0,Cangle(a4)

	move.w	#196,d0
	sub.b	Cangle(a4),d0

	and.w	#$00f8,d0
	mulu	#80,d0

	add.l	#Rotate_Buffer2,d0

;	move.l	Cptr(a4),a0
;	move.l	Cptr(a0),a0

	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)

calc_positions:					;Calc positions
	movem.l	a4-a6,-(sp)
	move.l	a4,a5
	lea	angle_tab(pc),a6
	moveq	#3,d4				;Calc all 4 positions
.loop:
		move.b	Cangle(a5),d3
		add.b	(a6)+,d3		;Get angle-delta
		move.b	d3,d0
		jsr	sin
		move.w	d0,d2
		move.b	d3,d0
		jsr	cos
		moveq	#100,d1
		sub.b	(a6)+,d1		;Get radius-delta
		muls	d1,d0
		muls	d1,d2
		asr.l	#8,d0
		asr.l	#8,d2
		add.w	boss_xpos,d0
		add.w	boss_ypos,d2
		movem.w	d0/d2,Bob_X_Position(a4)
		move.l	Cptr(a4),a4
	dbf	d4,.loop
	movem.l	(sp)+,a4-a6
	rts

angle_tab:
	dc.b	-1,15,-8,0,0,0,8,0

handle_expl:
	subq.w	#1,Cuser0(a4)			;Next explosion ?
	bpl.s	.out
	addq.w	#3,Cuser0(a4)			;Yes, reset delay

		bsr	Play_Expl

	movem.w	Bob_X_Position(a4),d1-d2
	jsr	rnd
	and.w	#31,d0
	sub.w	#32,d0
	add.w	d0,d1
	jsr	rnd
	and.w	#31,d0
	sub.w	#32,d0
	add.w	d0,d2

	move.l	a4,-(sp)
	moveq	#1,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry		;Add explosion
	move.l	(sp)+,a4

	subq.w	#1,Cmode_ptr(a4)		;All explosions started ?
	bpl.s	.out
		addq.b	#1,boss_killed		;Yes, add to the statistics...
		move.l	Cptr(a4),a0		;Free slaves...
		st	Cflag(a0)
		move.l	Cptr(a0),a0
		st	Cflag(a0)
		move.l	Cptr(a0),a0
		st	Cflag(a0)
		moveq	#0,d0
		bra	Standart_Destruction
.out:
	rts

handle_Bslave:					;Slaves: Just waiting to be freed
	moveq	#0,d0
	tst.b	Cflag(a4)
	bne	Standart_Destruction
.out:
	rts

bdelay	dc.w	0
bangle	dc.w	0
kreis_sound:	dc.w	0

Control_Kreis_Destruction:
	cmp.w	#520,Scr_Y_Level_Pos(a6)
	ble.s	.no_fix
	move.w	#520,Scr_Y_Fix(a6)
	bra.s	.do_fix
.no_fix:
	move.w	#520,Scr_Down_Fix(a6)
	clr.w	Scr_Y_Fix(a6)
.do_fix:
	cmp.b	#2,boss_killed
	bne	.out
	bsr	handle_repos1

	subq.w	#1,bdelay			;Setup explosions of first "go-round"
	bpl.s	.no_explo
	move.l	a0,-(sp)
		addq.w	#2,bdelay
		addq.w	#8,bangle
		move.w	bangle,d6
		bsr	set_expl
		move.b	bangle,d0
		andi.b	#15,d0
		bne.s	.no_sound
		bsr	Play_Expl
.no_sound:
	move.l	(sp)+,a0
.no_explo:
	cmpi.w	#255,bangle			;Gone round once ?
	bls.s	.no_end

	move.l	a0,-(sp)
		bsr	StartFlash
		moveq	#0,d6			;Start circle of 32 explosions
		moveq	#31,d7
.loop:
			bsr	set_expl
			addq.b	#8,d6
		dbf	d7,.loop

		move.l	#$10000,d0			;Add score
		jsr	add_score

	SONGPLAY #1

	moveq	#$19,d0
	bsr	Start_Effekt

		sf	Boss_flag

	move.w	#1,Cue_Point

	move.l	(sp)+,a0

	move.l	#Control_Kreis2,-4(a0)
	st	boss_killed
	clr.w	Scr_X_Fix(a6)
	bsr	Restore_Background
.no_end:
.out:
	rts

Control_Kreis2:
	cmp.w	#$fff,coltab
	bne.s	.out
	move.l	#Return,-4(a0)
	bsr	Create_Pages

	lea	canon_flipI(pc),a3
	lea	cannon_GFX,a0
	lea	canon_Buffer,a1
	jsr	Flip_Bobs

.out:
	rts

set_expl:
	move.l	d7,-(sp)
	lea	Area_Enter_Vector(pc),a1
	moveq	#1,d0
	bsr	Search_Last_Entry
	tst.w	d7
	bmi.s	.no
	move.b	d6,d0
	jsr	sin
	move.w	d0,d2
	move.b	d6,d0
	jsr	cos
	muls	#110,d0
	muls	#110,d2
	asr.l	#8,d0
	asr.l	#8,d2
	add.w	boss_xpos,d0
	add.w	boss_ypos,d2
	subq.w	#8,d0
	subq.w	#8,d2
	movem.w	d0/d2,Bob_X_Position(a4)
.no:
	move.l	(sp)+,d7
	rts


;--------------------------------------------

WAIT1	equ	0
DEC16	equ	1
DEC32	equ	2
DEC64	equ	3
INC16	equ	4
INC32	equ	5
INC64	equ	6
END	equ	-1

modes0:
	dc.b	WAIT1,INC64,INC64,WAIT1,INC64,INC64
	dc.b	INC32,DEC64,WAIT1,DEC32,DEC16,INC16
	dc.b	END
modes1:
	dc.b	WAIT1,INC64,INC64,WAIT1,INC64,INC64
	dc.b	DEC32,DEC64,WAIT1,DEC32,INC32
	dc.b	END

	even
BCannon_AnimTable1:
	dc.l	kreis_GFX+Kbob02+3840,kreis_GFX+Kmsk02+3840
	dc.w	-16,-16,32,-16+4,-16+4,24,24

BCannon_AnimTable2:
	dc.l	kreis_GFX+Kbob03+3840,kreis_GFX+Kmsk03+3840
	dc.w	-8,-8,16,0,0,0,0

BCannon_AnimTable3:
	dc.l	kreis_GFX+Kbob04+3840,kreis_GFX+Kmsk04+3840
	dc.w	-16,-16,32,0,0,0,0

Kreis_Slave:
;	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	tst.b	boss_killed
	bmi.s	.destruct
	move.b	#BOB_NOCOL,Bob_Used(a4)
	bra	Use_Background_Kreis

.destruct:
	move.w	Bob_Special_1(a4),d6
	moveq	#1,d0
	bsr	Use_Background
	bra	Out_Bob_Damage

kreis_x	=	$2f0+16
kreis_y	=	464

Kreis_Positions:
	dc.w	kreis_x+16,kreis_y
	dc.w	kreis_x,kreis_y+48,24,64
	dc.w	kreis_x+112,kreis_y,25,48
	dc.w	kreis_x+112+48,kreis_y+48,26,64
	dc.w	kreis_x+112+48,kreis_y+112,27,64
	dc.w	kreis_x,kreis_y+112,28,64
	dc.w	kreis_x+112,kreis_y+112+64,29,48
	dc.w	kreis_x+16,kreis_y+112+64,30,48

Kreis_AnimTable:
	dc.l	kreis_GFX+Kbob00,kreis_GFX+Kmsk00
	dc.w	0,0,48,0,0,0,0
Kreis_AnimTable2:
	dc.l	kreis_GFX+Kbob01,kreis_GFX+Kmsk01
	dc.w	0,0,64,0,0,0,0
Kreis_AnimTable3:
	dc.l	kreis_Buffer+Kbob00,kreis_Buffer+Kmsk00
	dc.w	0,0,48,0,0,0,0
Kreis_AnimTable4:
	dc.l	kreis_Buffer+Kbob01,kreis_Buffer+Kmsk01
	dc.w	0,0,64,0,0,0,0
Kreis_AnimTable5:
	dc.l	kreis_Buffer+Kbob01+63*8*4,kreis_Buffer+Kmsk01+63*8
	dc.w	0,0,64,0,0,0,0
Kreis_AnimTable6:
	dc.l	kreis_GFX+Kbob01+63*8*4,kreis_GFX+Kmsk01+63*8
	dc.w	0,0,64,0,0,0,0
Kreis_AnimTable7:
	dc.l	kreis_Buffer+Kbob00+47*12*4,kreis_Buffer+Kmsk00+47*12
	dc.w	0,0,48,0,0,0,0
Kreis_AnimTable8:
	dc.l	kreis_GFX+Kbob00+47*12*4,kreis_GFX+Kmsk00+47*12
	dc.w	0,0,48,0,0,0,0

Use_Background_Kreis:
	;Feststellen, ob das Bob links an den Rand stsst.
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	bmi	.out

	bset	#BOB_URGENT,Bob_BlitStatus(a4)	;Bob auf jeden Fall blitten !

	;Feststellen, ob was geblittet werden muss :

	tst.w	Scr_Screen_num(a6)
	beq.s	.use_sec
	lea	Bob_Special_2(a4),a3
	bra.s	.use_first
.use_sec:
	lea	Bob_Special_3(a4),a3
.use_first:

	move.w	Bob_Y_Position(a4),d0
	add.w	Scr_Y_Level_Pos(a6),d0
	cmp.w	(a3),d0
	beq	.no_difference

	;Es muss was dargestellt werden.

	move.w	d0,(a3)


	movem.w	Bob_X_Position(a4),d0-d1

	bsr	Calc_Adress			;1.Blitadresse berechnet!

	move.w	Bob_Y_Position(a4),d1
	sub.w	Scr_Y_Level_Pos(a6),d1

	move.w	Scr_Plane_Height(a6),d3
	sub.w	Scr_Y_Play_Anf(a6),d3
	cmp.w	d3,d1
	bge.s	.no_wrap
	add.w	Bob_Height(a4),d1
	cmp.w	d3,d1
	blt.s	.no_wrap

	bclr	#0,Bob_Status(a4)		;Wir sind IN der Wrap-Zeile,
	rts					;Nix blitten. (Einfach aus der Affre gezogen!)

.no_wrap:
	rts

	add.l	Scr_Refresh_Field(a6),d4
	waitblt
	move.l	Bob_Graphics(a4),d2
	move.l	Bob_Mask(a4),d3
	move.w	Bob_to_Info_Offs(a4),d7
	move.l	Bob_I_AFWM(a4,d7.w),bltafwm(a5)

	move.w	Bob_X_Position(a4),d0
	add.w	Bob_X_Offset(a4),d0

	and.w	#15,d0
	ror.w	#4,d0
	move.w	d0,bltcon1(a5)
	or.w	#$0fca,d0
	move.w	d0,bltcon0(a5)

	moveq	#0,d1
	move.w	Bob_I_Bytes(a4,d7.w),d1
	move.w	Bob_I_A_Modulo(a4,d7.w),d0
	sub.w	d1,d0
	move.w	d0,bltamod(a5)
	move.w	Bob_I_B_Modulo(a4,d7.w),d0
	sub.w	d1,d0
	move.w	d0,bltbmod(a5)
	move.w	Bob_I_D_Modulo(a4,d7.w),d0
	sub.w	d1,d0
	move.w	d0,bltcmod(a5)
	move.w	d0,bltdmod(a5)

	move.w	Bob_Height(a4),d0
	asl.w	#6,d0
	add.w	Bob_I_Words(a4,d7.w),d0

	move.w	Bob_I_Mask_Width(a4,d7.w),d1
	move.w	Bob_I_Depth(a4,d7.w),d7
	subq.w	#1,d7
.blitloop:
	move.l	d4,bltdpth(a5)
	move.l	d4,bltcpth(a5)

	move.l	d2,bltbpth(a5)
	move.l	d3,bltapth(a5)

	move.w	d0,bltsize(a5)


	add.l	#planeb,d4
	add.l	d1,d2

	waitblt
	dbf	d7,.blitloop

	bset	#1,Bob_Status(a4)	;Bob nur noch 1 Frame lang blitten!
	bset	#BOB_URGENT,Bob_BlitStatus(a4)	;Bob AUF JEDEN FALL BLITTEN!!!!!

	rts

.already_there:
	bclr	#1,Bob_Status(a4)
	beq	.out
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
.out:
	rts

.no_difference:
	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
	rts

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Diamond2
*---------------------------------------------------------------------------
Diamond_Start2:
	tst.w	Bob_Special_4(a4)
	beq	Diamond_Start
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	bra	Diamond_Start

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Stampf
*---------------------------------------------------------------------------
Sbob00 	= $00000
Sbob01 	= $00600

Start_Stampf:
	lea	Stampf_Handler(pc),a1
	jsr	AddHandler
	bset	#BOB_URGENT,Bob_BlitStatus(a4)
	move.w	#170,Bob_Y_Position(a4)
	move.l	#Stampf_Wait,Bob_Routine(a4)
	moveq	#0,d1
	moveq	#0,d2
	lea	Area_Enter_Vector(pc),a1
	moveq	#22,d0
	move.l	a4,-(sp)
	bsr	Search_Last_Entry
	bset	#BOB_URGENT,Bob_BlitStatus(a4)
	move.l	a4,a0
	move.l	(sp)+,a4
	move.l	a4,Bob_Special_1(a0)
	sf	Bob_Special_1+1(a4)
	move.b	#BOB_HURTWHEEL,Bob_Used(a4)
Stampf_Wait:
	addq.b	#1,Stampf_present
	move.w	Bob_Special_4(a4),d0
	cmp.b	Stampf_pos,d0
	bne.s	.out
	move.l	#Stampf,Bob_Routine(a4)	
.out:
	bra	Test_Bob_Out

Stampf:
	addq.b	#1,Stampf_present
	tst.b	Bob_Special_1(a4)
	bne	.wait
	tst.b	Bob_Special_1+1(a4)
	beq.s	.move_1
	bmi.s	.move_2

	;Zuschlagen.

	addq.w	#7,Bob_Y_Position(a4)
	cmp.w	#320,Bob_Y_Position(a4)
	blt.s	.out
	move.w	#320,Bob_Y_Position(a4)
	st	Bob_Special_1+1(a4)		;Als nchstes einfahren.
	PLAY_FX	#$2c
	bra.s	.out

.move_1:
	addq.w	#2,Bob_Y_Position(a4)
	cmp.w	#200,Bob_Y_Position(a4)
	bne.s	.out
	st	Bob_Special_1(a4)
	move.w	#15,Bob_Special_2(a4)
	move.b	#1,Bob_Special_1+1(a4)		;Als nchstes zuschlagen.
	bra.s	.out

.move_2:
	subq.w	#5,Bob_Y_Position(a4)
	cmp.w	#170,Bob_Y_Position(a4)
	bgt.s	.out
	move.w	#170,Bob_Y_Position(a4)
	sf	Bob_Special_1+1(a4)		;Als nchstes rauslugen.
	st	Bob_Special_1(a4)
	move.w	#40,Bob_Special_2(a4)
	bra.s	.out

.wait:
	subq.w	#1,Bob_Special_2(a4)
	bpl.s	.out
	sf	Bob_Special_1(a4)
.out:
	bra	Test_Bob_Out

Stampf_Slave:
	move.l	Bob_Special_1(a4),a0
	tst.b	Bob_Used(a0)
	bmi	Out_Bob_Damage
	move.l	Bob_X_Position(a0),Bob_X_Position(a4)
	add.w	#16,Bob_X_Position(a4)
	sub.w	#144,Bob_Y_Position(a4)
	rts

Stampf_AnimTable:
	dc.l	stampf_GFX+Sbob00,0
	dc.w	0,0,32,2,2,90,28

Stampf_AnimTable2:
	dc.l	stampf_GFX+Sbob01,0
	dc.w	0,0,144,2,2,60,140

Stampf_Handler:
	tst.b	Stampf_present
	beq.s	.kill
	sf	Stampf_present
	subq.w	#1,Stampf_verz
	bpl.s	.out
	move.w	#100,Stampf_verz
	addq.b	#1,Stampf_pos
	cmp.b	#3,Stampf_pos
	blt.s	.out
	sf	Stampf_pos
.out:
	rts
.kill:
	move.l	#Return,-4(a0)
	rts

Stampf_present:	dc.b	0
Stampf_pos:	dc.b	-1
Stampf_verz:	dc.w	50


*---------------------------------------------------------------------------
*	Routine and AnimTable of     Belt
*---------------------------------------------------------------------------
Bbob00 	= $00000
Bbob01 	= $00060
Bbob02 	= $000c0
Bbob03 	= $00120
Bbob04 	= $00180
Bbob05 	= $001e0
Bbob06 	= $00240
Bbob07 	= $002a0

Start_BeltR:
	lea	Belt_Anim_Handler(pc),a1
	jsr	AddHandler
	move.l	#BeltR,Bob_Routine(a4)

	moveq	#64,d0
	tst.w	Bob_Special_4(a4)
	beq.s	.set2
	moveq	#48,d0
	lea	Belt_Info_2(pc),a0
	cmp.w	#1,Bob_Special_4(a4)
	beq.s	.set
	moveq	#32,d0
	lea	Belt_Info_3(pc),a0
.set:
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
.set2:
	move.w	d0,Bob_Special_1(a4)
BeltR:
	moveq	#1,d7
	bsr	Belt_Move_Player
	move.l	Belt_Right_Anim,Bob_Graphics(a4)
	bra	Test_Bob_Out

Belt_Move_Player:
	movem.w	Bob_X_Position(a4),d0-d1	;Check, if player is standing on "Mutter"
	subq.w	#1,d1
	move.w	d0,d2
	add.w	Bob_Special_1(a4),d2
	jsr	check_foot_frame
	beq.s	.no_move
	move.w	d7,T_forceX
.no_move:
	rts

Start_BeltL:
	lea	Belt_Anim_Handler(pc),a1
	jsr	AddHandler
	move.l	#BeltL,Bob_Routine(a4)

	moveq	#64,d0
	tst.w	Bob_Special_4(a4)
	beq.s	.set2
	moveq	#48,d0
	lea	Belt_Info_2(pc),a0
	cmp.w	#1,Bob_Special_4(a4)
	beq.s	.set
	moveq	#32,d0
	lea	Belt_Info_3(pc),a0
.set:
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
.set2:
	move.w	d0,Bob_Special_1(a4)

BeltL:
	moveq	#-1,d7
	bsr	Belt_Move_Player
	move.l	Belt_Left_Anim,Bob_Graphics(a4)
	bra	Test_Bob_Out

Belt_Anim_Handler:
	subq.w	#1,Belt_Verz
	bpl.s	.out
	addq.w	#1,Belt_Verz
	addq.w	#4,Belt_Pos
	and.w	#3*4,Belt_Pos
	move.w	Belt_Pos,d0
	lea	Belt_GraphicTable(pc),a1
	move.l	(a1,d0.w),Belt_Left_Anim
	move.l	16(a1,d0.w),Belt_Right_Anim
.out:
	rts
Belt_Verz:	dc.w	0
Belt_Pos:	dc.w	0

Belt_Left_Anim:	dc.l	0
Belt_Right_Anim:dc.l	0


Belt_GraphicTable:	dc.l	belt_GFX+Bbob00,belt_GFX+Bbob01,belt_GFX+Bbob02,belt_GFX+Bbob03
			dc.l	belt_GFX+Bbob04,belt_GFX+Bbob05,belt_GFX+Bbob06,belt_GFX+Bbob07

Belt_AnimTable:
	dc.l	belt_GFX+Bbob00,0
	dc.w	0,0,3,0,0,0,0

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Canon
*---------------------------------------------------------------------------
	rsset	Bob_Special_1		;Main
Kdelay		rs.w	1
K_PHA		rs.w	1

	rsset	Bob_Special_1		;Bullet
Kdir		rs.w	1
Kwait		rs.w	1
Kbudelay	rs.w	1

Start_Canon:
	tst.w	Bob_Special_4(a4)				;Which side ?
	beq.s	.to_left
	move.l	#Canon_AnimTable_L,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
		moveq	#0,d0
		bra.s	.to_right
.to_left:
		moveq	#1,d0
.to_right:
	move.w	d0,K_PHA(a4)
	jsr	rnd
	andi.w	#31,d0
	move.w	d0,Kdelay(a4)
	move.w	#12,Bob_Power(a4)		;Set dynamic power
	move.b	T_power,d0
	asl.b	#3,d0
	add.w	d0,Bob_Power(a4)
	move.l	#Canon,Bob_Routine(a4)
	move.b	#1<<BOB_URGENT,Bob_BlitStatus(a4)

Canon:
	tst.w	Bob_Power(a4)
	beq	.destruct
	moveq	#0,d0
	move.b	Bob_Status+1(a4),d0
	
	tst.w	Bob_Hit(a4)
	beq.s	.no_hit
	subq.w	#1,Bob_Hit(a4)
	moveq	#8,d0
.no_hit:
	bsr.s	.set_graphic

	tst.b	Bob_Status+1(a4)
	beq.s	.no_anim
	subq.b	#1,Bob_Status(a4)
	bpl.s	.no_anim
	move.b	#2,Bob_Status(a4)
	addq.b	#1,Bob_Status+1(a4)
	cmp.b	#8,Bob_Status+1(a4)
	bne.s	.no_anim
	clr.w	Bob_Status(a4)
.no_anim:

	subq.w	#1,Kdelay(a4)			;Next shot ?
	bpl	.no_shot
		move.w	#150,Kdelay(a4)		;Yes, reset delay

		PLAY_FX	#$1b

		move.w	#$0301,Bob_Status(a4)

		move.l	a4,-(sp)
		movem.w	Bob_X_Position(a4),d1-d2
		addq.w	#8,d1
		addq.w	#8,d2
		moveq	#16,d0
		lea	Area_Enter_Vector(pc),a1
		bsr	Search_Bob_Entry	;Add shot-object behind "kanone"
		move.l	a4,a0
		move.l	(sp)+,a4

		tst.w	d7
		bmi.s	.no_shot
		clr.w	Kbudelay(a0)
		moveq	#2,d0
		tst.w	K_PHA(a4)		;Set right direction into bullet
		beq.s	.to_right
			moveq	#-2,d0
.to_right:
		move.w	d0,Kdir(a0)
		move.w	#7,Kwait(a0)		;No collision with background in the 1st 7 frames
.no_shot:
	bra	Test_Bob_Out

.destruct:
	moveq	#$70,d0
	bra	Standart_Destruction

.set_graphic:
	add.w	d0,d0
	add.w	d0,d0
	tst.w	K_PHA(a4)
	bne.s	.set_it
	add.w	#9*4,d0
.set_it:
	lea	.gfx_table(pc),a0
	move.l	(a0,d0.w),Bob_Graphics(a4)
	rts

Canon_flip	= level_Buffer-bob05
Canon_flip2	= canon_Buffer

.gfx_table:
	dc.l	level_GFX+bob05
	dc.l	cannon_GFX+Cbob03
	dc.l	cannon_GFX+Cbob02
	dc.l	cannon_GFX+Cbob01
	dc.l	cannon_GFX+Cbob00
	dc.l	cannon_GFX+Cbob01
	dc.l	cannon_GFX+Cbob02
	dc.l	cannon_GFX+Cbob03

	dc.l	cannon_GFX+Cbob04

	dc.l	Canon_flip+bob05
	dc.l	Canon_flip2+Cbob03
	dc.l	Canon_flip2+Cbob02
	dc.l	Canon_flip2+Cbob01
	dc.l	Canon_flip2+Cbob00
	dc.l	Canon_flip2+Cbob01
	dc.l	Canon_flip2+Cbob02
	dc.l	Canon_flip2+Cbob03

	dc.l	Canon_flip2+Cbob04

Cbob00 	= $00000
Cbob01 	= $00200
Cbob02 	= $00400
Cbob03 	= $00600
Cbob04 	= $00800

Canon_AnimTable:
		dc.l	cannon_GFX+Cbob00,0
		dc.w	0,0,32,8,2,16,28


Canon_AnimTable_L:
		dc.l	Canon_flip+bob05,0
		dc.w	0,0,32,8,2,16,28

;--------------------------------------------

;	rsset	O_USR0
;sdelay	rs.w	1
;
;handle_sexpl:
;	movem.w	scroll1+xdir.w,d0-d1
;	sub.w	d0,O_XPOS(a5)
;	sub.w	d1,O_YPOS(a5)
;
;	subq.w	#1,sdelay(a5)
;	.if (minus) {
;		addq.w	#5,sdelay(a5)
;		addq.w	#1,O_PHA(a5)
;		cmpi.w	#4,O_PHA(a5)
;		.if (equal) {
;			move.l	a5,a0
;			jmp	free_object.w
;		}
;	}
;	rts

;--------------------------------------------

handle_bullet:
	move.w	Kdir(a4),d2			;Move bullet
	add.w	d2,Bob_X_Position(a4)

	tst.w	Kwait(a4)			;Wait over ?
	beq.s	.check
		subq.w	#1,Kwait(a4)		;No...
	bra.s	.out
.check:
		movem.w	Bob_X_Position(a4),d0-d1;Yes, check for collision
		addq.w	#4,d1
		tst.w	d2
		bmi.s	.do_check
			addq.w	#8,d0
.do_check:
		jsr	check_obj_kollision	;Let explode if neccessary
		beq.s	.out
;			PLAY_FX	#25
			subq.w	#8,Bob_X_Position(a4)
			subq.w	#8,Bob_Y_Position(a4)
			moveq	#0,d0
			bra	Standart_Destruction
.out:
	bra	Standart_BobAnim

Bullet_AnimTable:
		dc.l	level_GFX+bob0b,level_GFX+msk0b
		dc.w	0,0,16,2,2,12,12
		dc.l	level_GFX+bob0c,level_GFX+msk0c
		dc.w	0,0,16,2,2,12,12
		dc.w	ENTRY_END
		dc.l	Bullet_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Big6
*---------------------------------------------------------------------------
	rsset	Bob_Special_1		;BIG6
Bptr2	rs.l	1
Bdelay	rs.w	1
Bflag2	rs.b	1
Bwait	rs.b	1
Bindex	rs.w	1
Bswing	rs.b	1

Start_Big6:
	cmpi.b	#2,T_power
	blt.s	.ok
		move.w	#40,Bob_Power(a4)
.ok:
	clr.w	Bdelay(a4)
	clr.l	Bflag2(a4)
	sf	Bswing(a4)

	move.l	#Big6,Bob_Routine(a4)
Big6:
	bsr	Standart_Hit_Handler
	beq	.destruct

	tst.b	Bflag2(a4)			;Shooting ?
	beq.s	.no_shots
		PLAY_FX	#$2a
		move.b	#$2a,global_startsound
		move.b	#$2b,global_stopsound

		subq.b	#1,Bwait(a4)		;Delay over ?
		bpl.s	.no_shots
			add.b	#11,Bwait(a4)	;Reset delay and release flame
			bsr	init_Steel

.no_shots:
	subq.w	#1,Bdelay(a4)			;Handle phase-delay
	bpl.s	.no_phases
	tst.b	Bflag2(a4)
	bne.s	.switch
	tst.b	big_shooting
	bne.s	.no_shoot
.switch:
		not.b	Bflag2(a4)
		beq.s	.waiting
			st	big_shooting
			move.w	#70,Bdelay(a4)
			bsr	big_sound_on
		bra.s	.no_phases
.waiting:
			sf	big_shooting
			move.w	#120,Bdelay(a4)		;Waiting-Time
			bsr	big_sound_off

.no_phases:
	subq.b	#1,Bswing(a4)				;Next swing-offset ?
	bpl.s	.no_swing
		addq.b	#4,Bswing(a4)			;Yes, handle swinging
		addq.w	#2,Bindex(a4)
		andi.w	#14,Bindex(a4)
		move.w	Bindex(a4),d0
		move.w	.swing_tab(pc,d0.w),d0
		add.w	d0,Bob_Y_Position(a4)
.no_swing:
	bsr	Test_Bob_Out
	tst.b	Bob_Used(a4)
	bpl.s	.out
		sf	big_shooting
	tst.b	Bflag2(a4)
	beq.s	.no_sound2
	bsr	big_sound_off
.no_sound2:
.out:
	rts
.no_shoot:
	addq.w	#1,Bdelay(a4)
	bra.s	.no_phases
.destruct:
	tst.b	Bflag2(a4)
	beq.s	.no_sound1
	bsr	big_sound_off
.no_sound1:
	sf	big_shooting
	move.l	#$210,d0
	bra	Standart_Destruction

.swing_tab:
	dc.w	-1,-1,1,1,1,1,-1,-1

big_sound_on:
	tst.b	big_sound_count
	bne.s	.no_new
	PLAY_FX	#$2a
		move.b	#$2a,global_startsound
		move.b	#$2b,global_stopsound
.no_new:
	addq.b	#1,big_sound_count
	rts

big_sound_off:
	subq.b	#1,big_sound_count
	bne.s	.no_stop
	PLAY_FX	#$2b
	sf	global_startsound
.no_stop:
	rts

big_shooting:	dc.b	0
big_sound_count:dc.b	0

Big_AnimTable:
		dc.l	level_GFX+bob04,level_GFX+msk04
		dc.w	0,0,64,2,2,62,62

init_Steel:
	movem.w	Bob_X_Position(a4),d1-d2
	lea	Area_Enter_Vector(pc),a1
	moveq	#14,d0

	move.l	a4,-(sp)
	bsr	Search_Last_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	tst.w	d7
	bmi.s	.no
	addi.w	#16,Bob_X_Position(a0)
	addi.w	#32,Bob_Y_Position(a0)

	move.l	#handle_steel,Bob_Routine(a0)		;Set parameters
	move.w	#3,Bdelay(a0)
	move.b	#60,Bwait(a0)				;Just show for 60 frames
.no:
	rts

handle_steel:
	subq.b	#1,Bwait(a4)			;Time up ?
	beq	Out_Bob_Damage

	addq.w	#2,Bob_Y_Position(a4)			;Move down
	movem.w	Bob_X_Position(a4),d0-d1		;Ground reached ?
	addi.w	#16,d0
	addi.w	#12,d1
	jsr	check_slope_kollision
	bne	Out_Bob_Damage

	subq.w	#1,Bdelay(a4)			;Phase-Delay over ?
	bpl.s	.out
		addq.w	#5,Bdelay(a4)
		cmpi.w	#4,Bob_Status(a4)
		beq.s	.out
		addq.w	#1,Bob_Status(a4)		;Yes, increase phase
		bsr	Get_Next_Bob_Frame
.out:
	bchg	#NO_BOBBLIT,Bob_BlitStatus(a4)
	bra	Test_Bob_Out

Steel_AnimTable:
		dc.l	level_GFX+bob06,level_GFX+msk06
		dc.w	0,5,20,2,2,28,24
		dc.l	level_GFX+bob07,level_GFX+msk07
		dc.w	0,1,28,2,2,28,24
		dc.l	level_GFX+bob08,level_GFX+msk08
		dc.w	0,1,30,2,2,28,24
		dc.l	level_GFX+bob09,level_GFX+msk09
		dc.w	0,0,31,2,2,28,24
		dc.l	level_GFX+bob0a,level_GFX+msk0a
		dc.w	0,0,32,2,2,28,24

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Mutter
*---------------------------------------------------------------------------
	rsset	Bob_Special_1
Mdelay	rs.b	1
Mdir	rs.b	1
My1	rs.w	1
My2	rs.w	1
Mstand	rs.b	1

Start_Mutter:
	move.b	#BOB_NOPLHURT,Bob_Used(a4)
;	move.b	#1,O_COLEN(a5)			;Collision, but no power-sub

	sf	Mdelay(a4)			;Clear anim-delay
	sf	Mdir(a4)
	move.w	Bob_Special_4(a4),d0
	bpl.s	.ok
	move.b	#1,Mdir(a4)
	neg.w	d0
.ok:
	move.w	d0,d1
	lsr.w	#7,d1
	and.w	#$fffe,d1
	and.w	#$ff,d0
	add.w	d0,d0
	neg.w	d0

	add.w	Bob_Y_Position(a4),d0
	add.w	Bob_Y_Position(a4),d1
	cmp.w	d0,d1
	bge.s	.ok2
		exg	d0,d1
.ok2:
	movem.w	d0-d1,My1(a4)
	sf	Mstand(a4)			;clear stand-flag
	clr.w	Bob_Status(a4)
	move.l	#Mutter,Bob_Routine(a4)

Mutter:
	movem.w	Bob_X_Position(a4),d0-d1	;Check, if player is standing on "Mutter"
	addq.w	#4,d0
	move.w	d0,d2
	add.w	#24,d2
	jsr	check_foot_frame
	sne	d1

	moveq	#1,d0
	tst.b	Mdir(a4)			;Set direction
	bne.s	.down	
	moveq	#-1,d0
.down:

	add.w	d0,Bob_Y_Position(a4)			;Move "Mutter"

	tst.b	d1				;Anyone standing on it ?
	beq.s	.no_one
			move.w	Bob_Y_Position(a4),d1
			jsr	alias_feet
		st	T_stand			;Set soft-stand-flag
.no_one:
	move.b	d1,Mstand(a4)			;Remember standing player

	move.w	d0,-(sp)

	movem.w	Bob_X_Position(a4),d0-d1
	addq.w	#8,d0
	subq.w	#8,d1
	tst.b	Mdir(a4)
	beq.s	.check_up
	add.w	#32,d1
.check_up:
	cmp.w	#32,d1
	ble.s	.turn
	jsr	check_obj_kollision
	bne.s	.turn

	btst	#7,d1
	beq.s	.no_turn

;	bra.s	.no_turn

;	movem.w	My1(a4),d2-d3			;Check movement bounderies
;	cmp.w	Bob_Y_Position(a4),d2
;	bgt.s	.turn
;	cmp.w	Bob_Y_Position(a4),d3
;	bge.s	.no_turn
.turn:
	eori.b	#1,Mdir(a4)
.no_turn:

	tst.b	Mstand(a4)			;Player between walls ?
	beq.s	.not_standing
		move.w	T_posX,d0
		move.w	T_posY,d1
		cmp.w	#22,T_anim
		bne.s	.no_duck
			addi.w	#10,d1
.no_duck:
		tst.w	d1
		bmi.s	.out_of_screen
		jsr	check_kollision
		beq.s	.not_standing
.out_of_screen:
			jsr	make_plhit
			tst.b	Mdir(a4)	;"Mutter" moves down
			bne.s	.not_standing
				eori.b	#1,Mdir(a4)
.not_standing:
	move.w	(sp)+,d0

	subq.b	#1,Mdelay(a4)			;Do animation in the right
	bpl.s	.no_anim
		addq.b	#4,Mdelay(a4)
		add.w	d0,Bob_Status(a4)
		bpl.s	.checkl
			move.w	#2,Bob_Status(a4)
		bra.s	.no_anim
.checkl:
			cmpi.w	#3,Bob_Status(a4)
			bne.s	.no_anim
				clr.w	Bob_Status(a4)
.no_anim:
	move.w	Bob_Status(a4),d0
	add.w	d0,d0
	add.w	d0,d0
	lea	.mutter_tab(pc),a0
	move.l	(a0,d0.w),Bob_Graphics(a4)

		move.w	Bob_X_Out(a4),d0
		lsr.w	#1,d0
		cmp.w	Bob_Out_X_Val(a4),d0
		bhs.s	.free_mutter

	movem.w	My1(a4),d0-d1		;Both ends of movement out of screen ?
	sub.w	Scr_Y_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	addi.w	#100,d0
	addi.w	#100,d1
	cmpi.w	#208+200,d0
	blo.s	.out
		cmpi.w	#208+200,d1
		bhs.s	.free_mutter
.out:
	rts

.free_mutter:
	bra	Out_Bob

.mutter_tab:
	dc.l	level_GFX+bob01,level_GFX+bob02,level_GFX+bob03

Mutter_AnimTable:
		dc.l	level_GFX+bob01,level_GFX+msk01
		dc.w	0,0,16,6,4,20,9

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Dorn
*---------------------------------------------------------------------------
	rsset	Bob_Special_1
Ddir	rs.w	1
Dwait	rs.w	1
Dcount	rs.w	1

Dorn_Start:
	clr.w	Dwait(a4)			;No wait
	move.w	#1,Ddir(a4)			;Move down
	move.w	#20,Dcount(a4)			;20 times
	move.l	#Dorn,Bob_Routine(a4)
	move.w	#21,Bob_Height(a4)

Dorn:
	tst.w	Dwait(a4)			;Waiting ?
	beq.s	.no_wait
		subq.w	#1,Dwait(a4)		;Wait...
		bra.s	.end_dorn
.no_wait:
	move.w	Ddir(a4),d0			;Move dorn
	add.w	d0,Bob_Y_Position(a4)
	sub.w	d0,Bob_Height(a4)

	subq.w	#1,Dcount(a4)			;Move over ?
	bpl.s	.end_dorn
		tst.w	d0			;Next down ?
		bpl.s	.up
			moveq	#1,d0		;Yes...
			moveq	#10,d1
			moveq	#19,d2
		bra.s	.down
.up:
			moveq	#-2,d0		;No, up...
			moveq	#50,d1
			moveq	#9,d2
.down:
		move.w	d2,Dcount(a4)		;Number of frames to move
		move.w	d1,Dwait(a4)		;Next waiting-time (before move)
		move.w	d0,Ddir(a4)		;Next direction

.end_dorn:
	tst.w	Bob_Height(a4)
	bne.s	.set_on
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	bra	Test_Bob_Out
.set_on:
	sf	Bob_BlitStatus(a4)
	bra	Test_Bob_Out

Dorn_AnimTable:
		dc.l	level_GFX+bob00,level_GFX+msk00
		dc.w	0,0,16,2,2,12,11

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Diamond
*---------------------------------------------------------------------------
Diamond_Start:
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Diamond,Bob_Routine(a4)
	move.w	Bob_X_Position(a4),d0
	and.w	#15,d0
	bne	Diamond
	lea	Diamond_Info_2(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
Diamond:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1

	move.w	T_posX,d2
	move.w	T_posY,d3
	add.w	#10,d2
	addq.w	#4,d3

	move.w	d2,d4
	move.w	d3,d5

	add.w	#18,d4
	add.w	#24,d5

	cmp.w	d4,d0
	bgt	.no_collect

	move.l	Bob_Act_Anim(a4),a0

	add.w	18(a0),d0
	cmp.w	d2,d0
	blt.s	.no_collect

	cmp.w	d5,d1
	bgt.s	.no_collect
	add.w	20(a0),d1
	cmp.w	d3,d1
	blt.s	.no_collect

	addq.w	#1,Diamond_Count

	PLAY_FX	#$1d

	bra	Out_Bob_Damage

.no_collect:
	tst.b	Bob_Special_1(a4)
	beq.s	.flashing
	subq.w	#1,Bob_Special_2(a4)
	bpl	Test_Bob_Out
	sf	Bob_Special_1(a4)

.flashing:
	subq.b	#1,Bob_Special_3(a4)
	bpl	Test_Bob_Out
	move.b	#2,Bob_Special_3(a4)
	addq.b	#1,Bob_Special_1+1(a4)
	bsr	Get_Next_Bob_Frame
	cmp.b	#4,Bob_Special_1+1(a4)
	bne	Test_Bob_Out
	move.w	#$0100,Bob_Special_1(a4)
	jsr	rnd
	and.w	#511,d0
	move.w	d0,Bob_Special_2(a4)	;Nchster Wait-Wert!
	bra	Test_Bob_Out

Diamond_AnimTable:
		dc.l	main_GFX+Mbob29,main_GFX+Mmsk29
		dc.w	0,0,16,2,2,12,11
		dc.l	main_GFX+Mbob2a,main_GFX+Mmsk2a
		dc.w	0,0,16,2,2,12,11
		dc.l	main_GFX+Mbob2b,main_GFX+Mmsk2b
		dc.w	0,0,16,2,2,12,11
		dc.l	main_GFX+Mbob2a,main_GFX+Mmsk2a
		dc.w	0,0,16,2,2,12,11
		dc.w	ENTRY_END
		dc.l	Diamond_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of     MineExplo
*---------------------------------------------------------------------------
MineExplo:
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	move.w	d0,d2
	move.w	d1,d3
	add.w	#16,d2
	add.w	#32,d3
	jsr	check_rec
	beq.s	.no_hit
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.powerok
	subq.w	#6,Bob_Power(a0)
	bpl.s	.powerok
	clr.w	Bob_Power(a0)
.powerok:
	move.w	#4,Bob_Hit(a0)
.no_hit:
	bra	Standart_BobAnim

MineExplo_AnimTable:
		dc.l	main_GFX+Mbob26,main_GFX+Mmsk26
		dc.w	0,16,16,2,2,12,11
		dc.l	main_GFX+Mbob27,main_GFX+Mmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main_GFX+Mbob28,main_GFX+Mmsk28
		dc.w	0,0,32,2,2,12,11
		dc.l	main_GFX+Mbob27,main_GFX+Mmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main_GFX+Mbob28,main_GFX+Mmsk28
		dc.w	0,0,32,2,2,12,11
		dc.l	main_GFX+Mbob27,main_GFX+Mmsk27
		dc.w	0,6,26,2,2,12,11
		dc.l	main_GFX+Mbob28,main_GFX+Mmsk28
		dc.w	0,0,32,2,2,12,11
		dc.w	END_OUT_DAMAGE


handle_repos1:
	tst.b	T_state
	bne.s	.out
	tst.b	T_hit
	bne.s	.out
	move.w	T_posX,reposX
	move.w	T_posY,reposY
	move.b	T_face,repos_face
.out:
	rts

reposX:	dc.w	0
reposY:	dc.w	0
repos_face:	dc.w	0

Repos_Player_Dead:
	jsr	Die_Player
	move.w	reposX(pc),T_posX
	move.w	reposY(pc),T_posY
	move.w	repos_face(pc),T_face
	move.b	#50,T_flash
	jmp	GameLoop

*---------------------------------------------------------------------------
*	Routine and AnimTable of      CuePoint
*---------------------------------------------------------------------------

CuePointStart:
	move.l	#CuePoint,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)

CuePoint:
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	move.w	d0,d2
	move.w	d1,d3
	add.w	#100,d2
	moveq	#0,d4
	move.b	Bob_Special_4+1(a4),d4
	lsl.b	#4,d4
	sub.w	d4,d1			;Die Obere Grenze berechnen.

	move.w	T_posX,d4
	add.w	#10,d4
	cmp.w	d2,d4
	bgt.s	.no_kolli
	add.w	#18,d4
	cmp.w	d0,d4
	blt.s	.no_kolli
	move.w	T_posY,d4
	addq.w	#4,d4
	cmp.w	d3,d4
	bgt.s	.no_kolli
	add.w	#24,d4
	cmp.w	d1,d4
	blt.s	.no_kolli
	move.b	Bob_Special_4(a4),Cue_Point+1
.no_kolli:
	bra	Test_Bob_Out2

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Rocket
*---------------------------------------------------------------------------

Rocket_AnimTable:
		dc.l	main_Buffer+Mbob18-Mbob18,main_Buffer+Mmsk18-Mbob18
		dc.w	0,0,13,2,2,12,11
		dc.l	main_Buffer+Mbob19-Mbob18,main_Buffer+Mmsk19-Mbob18
		dc.w	0,0,14,2,2,12,11
		dc.l	main_Buffer+Mbob1a-Mbob18,main_Buffer+Mmsk1a-Mbob18
		dc.w	0,0,13,2,2,12,11
		dc.l	main_Buffer+Mbob1b-Mbob18,main_Buffer+Mmsk1b-Mbob18
		dc.w	0,0,15,2,2,12,11

		dc.l	main_GFX+Mbob1c,main_GFX+Mmsk1c
		dc.w	0,0,15,2,2,12,11
		dc.l	main_GFX+Mbob1b,main_GFX+Mmsk1b
		dc.w	0,0,15,2,2,12,11
		dc.l	main_GFX+Mbob1a,main_GFX+Mmsk1a
		dc.w	0,0,13,2,2,12,11
		dc.l	main_GFX+Mbob19,main_GFX+Mmsk19
		dc.w	0,0,14,2,2,12,11

		dc.l	main_GFX+Mbob18,main_GFX+Mmsk18
		dc.w	0,0,13,2,2,12,11

		dc.l	main_GFX+Mbob18+12*4*2,main_GFX+Mmsk18+12*2
		dc.w	0,0,13,2,2,12,11
		dc.l	main_GFX+Mbob19+13*4*2,main_GFX+Mmsk19+13*2
		dc.w	0,0,14,2,2,12,11
		dc.l	main_GFX+Mbob1a+12*4*2,main_GFX+Mmsk1a+12*2
		dc.w	0,0,13,2,2,12,11
		dc.l	main_GFX+Mbob1b+14*4*2,main_GFX+Mmsk1b+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_GFX+Mbob1c+14*4*2,main_GFX+Mmsk1c+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_Buffer+Mbob1b-Mbob18+14*4*2,main_Buffer+Mmsk1b-Mbob18+14*2
		dc.w	0,0,15,2,2,12,11
		dc.l	main_Buffer+Mbob1a-Mbob18+12*4*2,main_Buffer+Mmsk1a-Mbob18+12*2
		dc.w	0,0,13,2,2,12,11


*---------------------------------------------------------------------------
*	Routine and AnimTable of      Shoot
*---------------------------------------------------------------------------

Shoot_AnimTable:
		dc.l	main_GFX+Mbob17,main_GFX+Mmsk17
		dc.w	0,0,7,1,1,5,5
		dc.w	ENTRY_END
		dc.l	Shoot_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Bonus1-4
*---------------------------------------------------------------------------


Bonus1_AnimTable:
		dc.l	main_GFX+Mbob16,main_GFX+Mmsk16
		dc.w	0,0,12,BONUS_POWER,2,12,8
Bonus2_AnimTable:
		dc.l	main_GFX+Mbob1f,main_GFX+Mmsk1f
		dc.w	0,0,16,BONUS_WEAPON3,2,12,19
Bonus3_AnimTable:
		dc.l	main_GFX+Mbob1e,main_GFX+Mmsk1e
		dc.w	0,0,16,BONUS_WEAPON2,2,12,19
Bonus4_AnimTable:
		dc.l	main_GFX+Mbob1d,main_GFX+Mmsk1d
		dc.w	0,0,16,BONUS_WEAPON1,2,12,19
Bonus5_AnimTable:
		dc.l	main_GFX+Mbob18,main_GFX+Mmsk18
		dc.w	0,0,13,BONUS_ROCKET,2,12,11
Bonus6_AnimTable:
		dc.l	main_GFX+Mbob23,main_GFX+Mmsk23
		dc.w	0,0,16,BONUS_SHIELD,2,12,12
Bonus7_AnimTable:
		dc.l	main_GFX+Mbob24,main_GFX+Mmsk24
		dc.w	0,0,16,BONUS_ONEUP,2,12,12

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Extrabox
*---------------------------------------------------------------------------

Box_AnimTable:
		dc.l	main_GFX+Mbob20,main_GFX+Mmsk20
		dc.w	0,0,24,2,2,28,20
		dc.l	main_GFX+Mbob22,main_GFX+Mmsk22
		dc.w	0,10,14,2,2,28,20
		dc.w	ENTRY_END
		dc.l	Box_AnimTable

Deckel_AnimTable:
		dc.l	main_GFX+Mbob21,main_GFX+Mmsk21
		dc.w	0,0,19,2,2,28,20

*---------------------------------------------------------------------------
*	Routine and AnimTable of      BigExplo
*---------------------------------------------------------------------------

Explo_AnimTable:
		dc.l	main_GFX+Mbob00,main_GFX+Mmsk00
		dc.w	0,13,18,0,0,0,0
		dc.l	main_GFX+Mbob01,main_GFX+Mmsk01
		dc.w	0,5,27,0,0,0,0
		dc.l	main_GFX+Mbob02,main_GFX+Mmsk02
		dc.w	0,2,30,0,0,0,0
		dc.l	main_GFX+Mbob03,main_GFX+Mmsk03
		dc.w	0,0,32,0,0,0,0
		dc.l	main_GFX+Mbob04,main_GFX+Mmsk04
		dc.w	0,0,32,0,0,0,0
		dc.l	main_GFX+Mbob05,main_GFX+Mmsk05
		dc.w	0,0,32,0,0,0,0
		dc.l	main_GFX+Mbob06,main_GFX+Mmsk06
		dc.w	0,0,31,0,0,0,0
		dc.l	main_GFX+Mbob07,main_GFX+Mmsk07
		dc.w	0,0,27,0,0,0,0
		dc.l	main_GFX+Mbob08,main_GFX+Mmsk08
		dc.w	0,0,24,0,0,0,0
		dc.l	main_GFX+Mbob09,main_GFX+Mmsk09
		dc.w	0,0,16,0,0,0,0
		dc.w	END_OUT_DAMAGE

Explo2_AnimTable:
		dc.l	main_GFX+Mbob0a,main_GFX+Mmsk0a
		dc.w	0,0,14,0,0,0,0
		dc.l	main_GFX+Mbob0b,main_GFX+Mmsk0b
		dc.w	0,2,7,0,0,0,0
		dc.l	main_GFX+Mbob0c,main_GFX+Mmsk0c
		dc.w	0,1,12,0,0,0,0
		dc.l	main_GFX+Mbob0d,main_GFX+Mmsk0d
		dc.w	0,0,14,0,0,0,0
		dc.l	main_GFX+Mbob0e,main_GFX+Mmsk0e
		dc.w	0,0,14,0,0,0,0
		dc.l	main_GFX+Mbob0f,main_GFX+Mmsk0f
		dc.w	0,1,14,0,0,0,0
		dc.l	main_GFX+Mbob10,main_GFX+Mmsk10
		dc.w	0,2,13,0,0,0,0
		dc.l	main_GFX+Mbob11,main_GFX+Mmsk11
		dc.w	0,2,13,0,0,0,0
		dc.w	END_OUT_DAMAGE
*---------------------------------------------------------------------------
*	Routine and AnimTable of      Walker_Sky
*---------------------------------------------------------------------------
Walker_Sky_Start:
	move.l	#Walker_Sky,Bob_Routine(a4)
	moveq	#1,d0
	move.l	#Walker_Sky_AnimTableR,Bob_Next_Anim(a4)
	btst	#0,Bob_Special_4+1(a4)
	bne.s	.ok2
	move.l	#Walker_Sky_AnimTableL,Bob_Next_Anim(a4)
	moveq	#-1,d0
.ok2:
	move.w	d0,Bob_Special_4(a4)
	bsr	Get_Next_Bob_Frame
	move.l	a4,-(sp)
	moveq	#34,d0
	moveq	#100,d1
	moveq	#100,d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Last_Entry
	move.l	a4,a0
	move.l	(sp)+,a4
	tst.w	d7
	bmi	Out_Bob
	move.b	#BOB_NOCOL,Bob_Used(a0)		;Kein Kollision-Check.
	move.l	a0,Bob_Special_5(a4)		;Gegenseitig Eintragen!
	tst.w	Bob_Special_4(a4)
	bpl.s	.ok
	move.l	#Fire_AnimTableL,Bob_Next_Anim(a0)
.ok:

Walker_Sky:
	bsr	Standart_Hit_Handler
	beq	.kill_me

	movem.w	Bob_X_Position(a4),d0-d1
	move.w	d0,d2
	add.w	#32,d2
	addq.w	#1,d1
	jsr	check_foot_frame
	beq.s	.no_one_stands_on_me

	st	T_force_jump
	clr.b	T_state
.kill_me:
	move.l	Bob_Special_5(a4),a1
	move.b	#BOB_FALSE,Bob_Used(a1)		;Fire killen!

	IFNE	CountBobs
	move.b	T_time,d0
	move.b	#0,ccr
	moveq	#1,d1
	sbcd	d1,d0
	move.b	d0,T_time
	ENDC

	moveq	#$50,d0
	bra	Standart_Destruction

.no_one_stands_on_me:
	subq.b	#1,Bob_Special_1(a4)
	bpl.s	.an_ok
	addq.b	#2,Bob_Special_1(a4)
	addq.b	#2,Bob_Special_1+1(a4)
	and.b	#31,Bob_Special_1+1(a4)
	moveq	#0,d0
	move.b	Bob_Special_1+1(a4),d0
	lea	.wiggle_tab(pc),a0
	move.w	(a0,d0.w),d1
	add.w	d1,Bob_Y_Position(a4)
.an_ok:
	move.w	Bob_Special_4(a4),d0
	add.w	d0,Bob_X_Position(a4)
	tst.w	d0
	bmi.s	.to_left

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	jsr	check_obj_kollision
	beq	.no_change

	move.l	#Walker_Sky_AnimTableL,Bob_Next_Anim(a4)
	move.l	Bob_Special_5(a4),a1
	move.l	#Fire_AnimTableL,Bob_Next_Anim(a1)

	bsr	Get_Next_Bob_Frame
	neg.w	Bob_Special_4(a4)
	bra	.no_change

.to_left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	jsr	check_obj_kollision
	beq	.no_change

	move.l	Bob_Special_5(a4),a1
	move.l	#Fire_AnimTableR,Bob_Next_Anim(a1)
	move.l	#Walker_Sky_AnimTableR,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	neg.w	Bob_Special_4(a4)
	bra	.no_change

.no_change:
	move.l	Bob_Special_5(a4),a1

	movem.w	Bob_X_Position(a4),d0-d1
	tst.w	Bob_Special_4(a4)
	bmi.s	.left
	sub.w	#5,d0
	add.w	#14,d1
	bra.s	.set
.left:
	add.w	#14,d1
	add.w	#21,d0
.set:
	movem.w	d0-d1,Bob_X_Position(a1)

	bsr	Test_Bob_Out
	tst.b	Bob_Used(a4)
	bpl	.out
	move.l	Bob_Special_5(a4),a1
	st	Bob_Used(a1)

	IFNE	CountBobs
	move.b	T_time,d0
	move.b	#0,ccr
	moveq	#1,d1
	sbcd	d1,d0
	move.b	d0,T_time
	ENDC

.out:
	rts

.wiggle_tab:
swing_tab:	dc.w	0,-1,0,-1,0,1,0,1,0,1,0,1,0,-1,0,-1

Walker_Flip	= level_Buffer-bob05+bob06-bob0d

Walker_Sky_AnimTableR:
	dc.l	level_GFX+bob13,level_GFX+msk13
	dc.w	0,0,28,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Walker_Sky_AnimTableR

Walker_Sky_AnimTableL:
	dc.l	Walker_Flip+bob13,Walker_Flip+msk13
	dc.w	0,0,28,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Walker_Sky_AnimTableL

Fire:
	eor.b	#2,Bob_BlitStatus(a4)
	bra	Get_Next_Bob_Frame

Fire_AnimTableR:
	dc.l	level_GFX+bob14,level_GFX+msk14
	dc.w	0,0,10,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Fire_AnimTableR

Fire_AnimTableL:
	dc.l	Walker_Flip+bob14,Walker_Flip+msk14
	dc.w	0,0,10,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Fire_AnimTableL

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Walker
*---------------------------------------------------------------------------

Walker_Start:
	movem.w	Bob_X_Position(a4),d0-d1
	add.w	#16,d0
	add.w	#28,d1
	jsr	check_obj_kollision
	beq	Walker_Sky_Start
	moveq	#-1,d0
	btst	#0,Bob_Special_4+1(a4)
	beq.s	.ok
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	moveq	#1,d0
.ok:
	move.w	d0,Bob_Special_5(a4)
	move.l	#Walker_Ground,Bob_Routine(a4)
	sf	Bob_Special_7(a4)
	btst	#4,Bob_Special_4+1(a4)
	bne	Walker_Ground
	clr.w	Bob_Special_6(a4)
	st	Bob_Special_7(a4)
	bra	Walker_Ground

Walker_Ground:
	moveq	#$50,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	bsr	Walker_handle_shots

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1

	move.w	d0,d2
	add.w	#32,d2
	addq.w	#1,d1
	jsr	check_foot_frame
	beq.s	.no_one_stands_on_me

	tst.b	T_state
	bpl.s	.no_one_stands_on_me			;Spieler springt nicht drauf!

	st	T_force_jump
	clr.b	T_state

	PLAY_FX	#$18

	move.l	#Walker_maniac,Bob_Routine(a4)
	move.l	#Area_Enter_Vector,Bob_Entry_Adress(a4)	;Walker ist tot!
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#$00010001,Bob_Anim_Delay(a4)

	lea	Walker_MAnimTableR(pc),a0
	move.w	Bob_Special_5(a4),d0
	add.w	d0,d0
	add.w	d0,d0
	move.w	d0,Bob_Special_5(a4)
	bpl.s	.set
	lea	Walker_MAnimTableL(pc),a0
.set:
	move.l	a0,Bob_Next_Anim(a4)
	jsr	Get_Next_Bob_Frame
	jmp	Test_Bob_Out

.no_one_stands_on_me:
	move.w	Bob_Special_5(a4),d0
	add.w	d0,Bob_X_Position(a4)

	tst.w	d0
	bmi.s	.left

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_r
	add.w	#12,d1
	subq.w	#8,d0

	jsr	check_obj_kollision
	bne	Standart_BobAnim

	;Should Walker fall ?

	btst	#1,Bob_Special_4+1(a4)
	beq.s	.change_r

	move.l	#Walker_Fall,Bob_Routine(a4)
	jmp	Test_Bob_Out

.change_r:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableL,Bob_Next_Anim(a4)
	jmp	Get_Next_Bob_Frame

.left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_l
	add.w	#12,d1
	addq.w	#8,d0
	jsr	check_obj_kollision
	bne	Standart_BobAnim

	btst	#1,Bob_Special_4+1(a4)
	beq.s	.change_l

	move.l	#Walker_Fall,Bob_Routine(a4)
	jmp	Test_Bob_Out

.change_l:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	jmp	Get_Next_Bob_Frame

Walker_maniac:
	move.w	Bob_Special_5(a4),d0
	add.w	d0,Bob_X_Position(a4)
	tst.w	d0
	bmi.s	.left
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	jsr	check_obj_kollision
	beq	.check_fall
.destruct:
	add.w	#8,Bob_Y_Position(a4)
	bra	Standart_Destruction

.left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	jsr	check_obj_kollision
	bne	.destruct

.check_fall:
	movem.w	Bob_X_Position(a4),d0-d1
	add.w	#28,d1
	add.w	#16,d0
	jsr	check_obj_kollision
	bne.s	.goon

	addq.w	#4,Bob_Y_Position(a4)
.goon:
	jmp	Standart_BobAnim

Walker_Fall:
	moveq	#$50,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	bsr	Walker_handle_shots

	move.w	Bob_Special_5(a4),d0
	add.w	d0,Bob_X_Position(a4)

	addq.w	#3,Bob_Y_Position(a4)

	tst.w	d0
	bmi.s	.left

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	add.w	#32,d0

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_r
	add.w	#12,d1
	subq.w	#8,d0

	jsr	check_obj_kollision
	bne.s	.normal

	jmp	Standart_BobAnim

.change_r:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableL,Bob_Next_Anim(a4)
	jmp	Get_Next_Bob_Frame

.left:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	add.w	#16,d1

	movem.w	d0-d1,-(sp)
	jsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne	.change_l
	add.w	#12,d1
	addq.w	#8,d0
	jsr	check_obj_kollision
	bne.s	.normal

	jmp	Standart_BobAnim

.change_l:
	neg.w	Bob_Special_5(a4)
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	jmp	Get_Next_Bob_Frame

.normal:
	move.l	#Walker_Ground,Bob_Routine(a4)
	jmp	Test_Bob_Out

Walker_handle_shots:
;	tst.b	Bob_Special_5(a4)			;Maniac ?
;	bne.s	.no_shoot
		tst.b	Bob_Special_7(a4)			;Shot allowed ?
		beq.s	.no_shoot
			subq.w	#1,Bob_Special_6(a4)		;Delay down ?
			bpl.s	.no_shoot
				move.w	#100,Bob_Special_6(a4)
				move.l	Bob_X_Position(a4),-(sp)	;Calc angle to player
				addi.w	#16,Bob_X_Position(a4)
				addq.w	#8,Bob_Y_Position(a4)
				move.w	T_posX,d6
				move.w	T_posY,d7
				add.w	Scr_X_Level_Pos(a6),d6
				add.w	Scr_Y_Level_Pos(a6),d7
				addi.w	#16,d6
				addi.w	#24,d7
				jsr	calc_ene_angle
				moveq	#127,d7
				sub.b	d1,d7
				move.l	(sp)+,Bob_X_Position(a4)
				move.b	d7,d0
				jsr	sin
				move.w	d0,d3
				move.b	d7,d0
				jsr	cos
				move.w	d0,d2
				asr.w	#2,d2
				asr.w	#2,d3
				move.w	d2,d0
				move.w	d3,d1
				asr.w	#2,d0
				asr.w	#2,d1
				add.w	d0,d2
				add.w	d1,d3
				movem.w	Bob_X_Position(a4),d0-d1
				addq.w	#8,d0
				addq.w	#8,d1
				tst.w	Bob_Special_2(a4)		;Walking right ?
				bmi.s	.not_left
					addi.w	#16,d0
.not_left:
				jsr	Start_Shoot
.no_shoot:
	rts



Walker_AnimTableR:
		dc.l	level_GFX+bob0d,level_GFX+msk0d
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob0e,level_GFX+msk0e
		dc.w	0,1,27,2,2,28,24
		dc.l	level_GFX+bob0f,level_GFX+msk0f
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob10,level_GFX+msk10
		dc.w	0,1,27,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_AnimTableR

Walker_MAnimTableR:
		dc.l	level_GFX+bob11,level_GFX+msk11
		dc.w	0,13,15,2,2,28,24
		dc.l	level_GFX+bob12,level_GFX+msk12
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableR


Walker_AnimTableL:
		dc.l	Walker_Flip+bob0d,Walker_Flip+msk0d
		dc.w	0,0,28,2,2,28,24
		dc.l	Walker_Flip+bob0e,Walker_Flip+msk0e
		dc.w	0,1,27,2,2,28,24
		dc.l	Walker_Flip+bob0f,Walker_Flip+msk0f
		dc.w	0,0,28,2,2,28,24
		dc.l	Walker_Flip+bob10,Walker_Flip+msk10
		dc.w	0,1,27,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_AnimTableL

Walker_MAnimTableL:
		dc.l	Walker_Flip+bob11,Walker_Flip+msk11
		dc.w	0,13,15,2,2,28,24
		dc.l	Walker_Flip+bob12,Walker_Flip+msk12
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableL

;--------------------------------------------------------------------------
Next_Level:
	clr.w	Cue_Point
	addq.w	#1,act_level
	move.w	act_level,d0
	cmp.w	#1,d0
	beq	Init_Level_1
	cmp.w	#2,d0
	beq	Init_Level_2
	cmp.w	#3,d0
	beq	Init_Level_3
	st	Cue_Point+1
	rts

act_level:	dc.w	Level

Copy_Colors:
	lea	S_coltab(pc),a0
	lea	B_coltab+32(pc),a1
	move.l	16(a0),16(a1)
	rts

Init_World:
	lea	Rocket_AnimTable_Pointer(pc),a0
	move.l	#Rocket_AnimTable,(a0)
	move.l	#Rocket_Info_1,4(a0)
	move.l	#Rocket_Info_2,8(a0)
	move.l	#Col_lab2,Color_Pointer
	lea	Main_Clist,a0
	move.l	a0,cop1lch(a5)

	move.w	#$600,T_time

	move.l	#Macros,Macro_Pointer
	move.l	#Jump_Speed1,Jump_Start_Speed
	move.l	#Jump_Verz1,Jump_Verz_Lab
	move.l	Act_Scr_Structure,a6
	move.l	#character,Scr_Character(a6)
	lea	Sound,a0
	move.l	(a0)+,d1
	add.l	a0,d1
	move.l	a0,d0
	jsr	TFMX+52

	jsr	init_parallax
	jsr	set_copcolors

	moveq	#14,d7
	lea	Score+3648+2,a0
	lea	Col_lab1,a1
.setcol2:
	move.w	(a0)+,2(a1)
	addq.l	#4,a1
	dbf	d7,.setcol2

	lea	level_flipI(pc),a3
	lea	level_GFX,a0
	lea	level_Buffer,a1
	jsr	Flip_Bobs

	lea	canon_flipI(pc),a3
	lea	cannon_GFX,a0
	lea	canon_Buffer,a1
	jsr	Flip_Bobs

	lea	main_flipI,a3
	lea	main_GFX,a0
	lea	main_Buffer,a1
	jsr	Flip_Bobs

	move.l	#main_GFX+Mbob29,Diamond_Pointer
	st	Plane_flag

	move.w	#87,DATA_ALL_DIAMONDS
	move.w	#8,DATA_ALL_LIFES

	;a0 = Pointer auf Quell-Daten (Normales interleaved Bob)
	;a1 = Pointer auf Chunky-Mode-Buffer
	;a2 = Pointer auf Leere Rotate-Info Struktur, die mit Daten gefllt wird.
	;a3 = Pointer auf Quell-Maske (Einfache Masken-Plane)
	;d0 = Seitenlnge des Objekts (In Pixeln).
	;d1 = Planetiefe des Objekts

	lea	kreis_GFX+Kbob04+3840,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	kreis_GFX+Kmsk04+3840,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	move.l	#Rotate_Buffer2,Dest_Obj
	clr.w	Angle_Obj

.rotate_it:
	lea	Work_Buffer1,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	move.w	Angle_Obj,d0
	jsr	Do_Rotate

	move.l	Dest_Obj,a0
	lea	4*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Convert_to_Bitplane

	add.l	#640,Dest_Obj
	addq.b	#8,Angle_Obj+1
	bne	.rotate_it

	rts

Init_Datas:
	sf	big_shooting
	move.b	#1,big_sound_count
	bsr	big_sound_off
	rts

Init_Level_1:
	SONGPLAY #0

	move.l	#Col_lab2,Color_Pointer
;	move.l	#Handle_Player,Player_Vector
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.l	#SetClist,Clist_Fade_Handler
	move.w	#levelb1,Scr_Level_Width(a6)
	move.l	#Level1-1-levelb1,Scr_Level_Pointer(a6)
	move.l	#Level1,Scr_Level(a6)
	move.w	#levelb1*16-320+16,Scr_X_Max(a6)
	move.w	#levelh1*16-208,Scr_Y_Max(a6)
	move.w	#(16+22)/2+1,Scr_AnzSupplyPlates(a6)
	move.l	#Area1+4,Area_Vector
	move.w	#33,Scr_BA_Anz_Area_X(a6)
	move.l	#Cue_Table1,Act_Cue_Table
	move.l	#Level1_SFX,SFX_Handler

	lea	canon_flipI(pc),a3
	lea	cannon_GFX,a0
	lea	canon_Buffer,a1
	jsr	Flip_Bobs

	rts

Level1_SFX:
	tst.b	Boss_flag
	bne.s	.no_clear
	clr.w	Scr_Y_Fix(a6)
.no_clear:
	move.w	Scr_X_Level_Pos(a6),d0
	move.w	Scr_Y_Level_Pos(a6),d1
	cmp.w	#1100,d1
	blt.s	.no_scroll
	tst.w	Scr_X_Speed(a6)
	beq.s	.no_scroll
	bpl.s	.to_right
	cmp.w	#440,d0
	blt.s	.no_scroll
	cmp.w	#449,d0
	bgt.s	.no_reset2
	bsr	reset_walker_char
.no_reset2:
	cmp.w	#1330,d0
	bgt.s	.no_scroll
	cmp.w	#1325,d0
	blt.s	.no_scroll
	bsr	clear_walker_char
	bra.s	.no_scroll
.to_right:
	cmp.w	#1330,d0
	bgt.s	.no_scroll
	cmp.w	#1325,d0
	blt.s	.no_reset1
	bsr	reset_walker_char
	bra.s	.no_scroll
.no_reset1:
	cmp.w	#460,d0
	bgt.s	.no_scroll
	cmp.w	#450,d0
	blt.s	.no_scroll
	bsr	clear_walker_char

.no_scroll:

	move.w	Scr_X_Level_Pos(a6),d0
	add.w	T_posX,d0
	move.w	Scr_Y_Level_Pos(a6),d1
	move.w	d1,d2
	add.w	T_posY,d1

	cmp.w	#820,d0
	ble.s	.no_fix1
	cmp.w	#1613,d0
	bge.s	.no_fix1
	cmp.w	#337,d1
	bgt.s	.no_fix1
	cmp.w	#$a0,d2
	ble.s	.no_fix1
	move.w	#$c0,Scr_Y_Fix(a6)
.no_fix1:
	cmp.w	#590,d0
	bgt.s	.no_fix2
	cmp.w	#257,d1
	bgt.s	.no_fix2
	cmp.w	#113,d2
	bgt.s	.do_fix2
	move.w	#113,Scr_Down_Fix(a6)
	bra.s	.no_fix2
.do_fix2:
	move.w	#113,Scr_Y_Fix(a6)
.no_fix2:

	cmp.w	#2075,d0
	bge.s	.won
	cmp.w	#2036,d0
	blt.s	.out
	cmp.w	#475,d1
	blt.s	.out
	cmp.w	#520,d1
	bgt.s	.out
	st	T_freeze
	st	T_runout
	move.b	#1<<RIGHT,T_joyforce
.out:
	rts
.won:
	move.w	#-1,Cue_Point
	rts

Init_Level_2:
	SONGPLAY #3

	move.l	#Col_lab2,Color_Pointer
;	move.l	#Handle_Player,Player_Vector
	move.l	Act_Scr_Structure,a6
	move.l	#Contra_Clist,Clist_Handler
	move.l	#Contra_SetClist,Clist_Fade_Handler
	move.w	#levelb2,Scr_Level_Width(a6)
	move.l	#Level2-1-levelb2,Scr_Level_Pointer(a6)
	move.l	#Level2,Scr_Level(a6)
	move.w	#16,Scr_X_Max(a6)
	move.w	#32,Scr_Y_Max(a6)
	move.w	#(16+22)/2+1,Scr_AnzSupplyPlates(a6)
	move.l	#Area2,Area_Vector
	move.w	#5,Scr_BA_Anz_Area_X(a6)
	move.l	#Cue_Table2,Act_Cue_Table
	move.l	#Level1_SFX,SFX_Handler
	move.w	#16,Scr_X_Fix(a6)
	move.w	#32,Scr_Y_Fix(a6)

	lea	Rotate_Buffer2,a0	;Source start
	lea	contra_PACK,a1		;Dest   start
	lea	Rotate_Buffer2+10340,a2	;Source end
	bsr	repack


	waitblt
	move.l	#Rotate_Buffer2,bltapth(a5)
	move.w	#$09f0,bltcon0(a5)
	move.l	#-1,bltafwm(a5)
	move.w	#0,bltamod(a5)
	move.w	#0,bltdmod(a5)
	move.l	#character,bltdpth(a5)
	move.w	#64*16*4+17,bltsize(a5)

	waitblt

	lea	contra_flipI(pc),a3
	lea	contra_GFX,a0
	lea	contra_flip,a1
	jsr	Flip_Bobs

	rts

Init_Level_3:
	SONGPLAY #4

	move.l	#Col_lab2,Color_Pointer
	move.l	#Handle_Player,Player_Vector
	move.l	#Repos_Player_Dead,Dead_Vector
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.l	#SetClist,Clist_Fade_Handler
	move.w	#levelb2,Scr_Level_Width(a6)
	move.l	#Level3-1-levelb2,Scr_Level_Pointer(a6)
	move.l	#Level3,Scr_Level(a6)
	move.w	#16,Scr_X_Max(a6)
	move.w	#32,Scr_Y_Max(a6)
	move.w	#(16+22)/2+1,Scr_AnzSupplyPlates(a6)
	move.l	#Area3,Area_Vector
	move.w	#5,Scr_BA_Anz_Area_X(a6)
	move.l	#Cue_Table2,Act_Cue_Table
	move.l	#Level1_SFX,SFX_Handler
	move.w	#16,Scr_X_Fix(a6)
	move.w	#32,Scr_Y_Fix(a6)

	lea	machine_decrunch,a0	;Source start
	lea	machine_PACK,a1		;Dest   start
	lea	machine_decrunch+13884,a2	;Source end
	bsr	repack

	waitblt
	move.l	#machine_decrunch,bltapth(a5)
	move.w	#$09f0,bltcon0(a5)
	move.l	#-1,bltafwm(a5)
	move.w	#0,bltamod(a5)
	move.w	#0,bltdmod(a5)
	move.l	#character,bltdpth(a5)
	move.w	#64*16*4+33,bltsize(a5)

	waitblt

	bsr	.flip_modules

	lea	B_coltab(pc),a1
	lea	D_coltab(pc),a0
	moveq	#15,d7
.copy:
	move.w	(a0)+,(a1)+
	dbf	d7,.copy

	lea	machine_flipI(pc),a3
	lea	machine_GFX,a0
	lea	machine_flip,a1
	jsr	Flip_Bobs

	lea	Macros,a0
	sf	2*37+1(a0)
	sf	2*44+1(a0)
	move.b	#%1111,2*30+1(a0)
	move.b	#%1111,2*31+1(a0)
	move.b	#%1111,2*63+1(a0)

	lea	machine_GFX+Hbob04,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	machine_GFX+Hmsk04,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	move.l	#Rotate_Buffer3,Dest_Obj
	clr.w	Angle_Obj

.rotate_it:
	lea	Work_Buffer1,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	move.w	Angle_Obj,d0
	jsr	Do_Rotate

	move.l	Dest_Obj,a0
	lea	4*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Convert_to_Bitplane

	add.l	#640,Dest_Obj
	add.b	#16,Angle_Obj+1
	bne	.rotate_it

	rts

.flip_modules:
	lea	flip_table,a0
	lea	.flip_info(pc),a1
	lea	character+33*128,a2
	lea	character,a3
	moveq	#0,d1
.loop:
	moveq	#0,d0
	move.b	(a1)+,d0
	bmi.s	.end
	asl.w	#7,d0
	moveq	#16*4-1,d7
.charloop:
	move.b	(a3,d0.w),d1
	move.b	(a0,d1.w),1(a2)
	move.b	1(a3,d0.w),d1
	move.b	(a0,d1.w),(a2)
	addq.l	#2,a2
	addq.w	#2,d0
	dbf	d7,.charloop
	bra.s	.loop
.end:
	rts

.flip_info:
	dc.b	24,25,26,27,28,29,21,22,23,18,19,20,15,16,17
	dc.b	12,13,14,9,10,11,6,7,8,3,4,5,0,1,2,30
	dc.b	-1

	even

	;Speed_pack V1.0
	; 1990 by A.U.D.I.O.S Entertainment
	;benutzt den ByteRun1 Algorithmus zum Packen gleicher Bytes

	;18.12.1990 18:02

;	lea	$10000,a0	;Source start
;	lea	$50000,a1	;Dest   start
;	lea	$2180a,a2	;Source end
;	bsr	repack

repack:
	moveq	#127,d7
.in:
	cmp.l	a0,a2
	ble.s	.out
	moveq	#0,d0
	move.b	(a1)+,d0
	bmi	.nofollow
	move.b	(a1)+,d1
.loop:
	move.b	d1,(a0)+
	dbf	d0,.loop
	bra.s	.in
.nofollow:
	and.b	d7,d0
.loop2:
	move.b	(a1)+,(a0)+
	dbf	d0,.loop2
	bra.s	.in
.out:
	rts

Level1_Clist:
	move.w	#Coplab3&$ffff,Wrap_Function+6
	move.l	Act_Scr_Structure,a6
	move.l	Scr_Supply_Field(a6),d0
	move.l	Scr_Show_Field(a6),Scr_Supply_Field(a6)
	move.l	d0,Scr_Show_Field(a6)
	not.w	Scr_Screen_num(a6)
SetClist:
	lea	Coplab4(pc),a0
	move.w	Scr_X_Level_Pos(a6),d0
	and.w	#15,d0
	moveq	#15,d1
	sub.w	d0,d1
	move.w	d1,d0
	lsl.w	#4,d0
	or.w	d0,d1
	move.w	d1,2(a0)

	lea	Coplab1(pc),a0
	moveq	#0,d1
	move	Scr_Y_Play_Anf(a6),d0
	mulu	Scr_Plane_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	add.l	d1,d0
	add.l	Scr_Show_Field(a6),d0

	swap	d0
	move	d0,2(a0)
	swap	d0
	move	d0,6(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,10(a0)
	swap	d0
	move	d0,14(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,18(a0)
	swap	d0
	move	d0,22(a0)
	add.l	#planeb,d0
	swap	d0
	move	d0,26(a0)
	swap	d0
	move	d0,30(a0)

	lea	Coplab2(pc),a0
	move.w	Clist_oldcolpos,d1
	move.w	#COPCOL2,4(a0,d1.w)	;Farbding wieder reinschreiben.

	tst.b	Col_Init_Flag
	beq.s	.no_init1
	bsr	init_parallax
.no_init1:

	move.w	Scr_Plane_Height(a6),d0
	sub.w	Scr_Y_Play_Anf(a6),d0
	add.w	#$30,d0
	cmp.w	#$ff,d0
	bhs.s	.no_copjump
	sub.w	#$30,d0
	asl.w	#3,d0

	move.w	d0,Clist_oldcolpos
	move.w	#$008a,4(a0,d0.w)	;Jump auslsen.
	move.w	6(a0,d0.w),d1		;Diese Farbe wurde geschrieben.

	lea	8(a0,d0.w),a0		;Zu dieser Adresse returned der Copper.
	move.l	a0,d0

.no_copjump:

	lea	Coplab3(pc),a0
	move.w	d0,26(a0)		;LO-Word
	swap	d0
	move.w	d0,22(a0)		;HI-Word
	move.w	d1,18(a0)		;Farbwert
.dont_update:
	lea	Coplab3(pc),a0		;Bplpt fr Wrap
	moveq	#0,d0
	move.w	Scr_X_Level_Pos(a6),d0
	lsr.w	#3,d0
	add.l	Scr_Show_Field(a6),d0

	move.w	d0,2(a0)
	add.l	#planeb,d0
	move.w	d0,6(a0)
	add.l	#planeb,d0
	move.w	d0,10(a0)
	add.l	#planeb,d0
	move.w	d0,14(a0)

	lea	Sprlab(pc),a0
	bsr	Set_Sprites

	tst.b	Col_Flag
	beq.s	.no_col
	lea	$dff1b0,a1
	lea	Col_Buffer(pc),a0
	tst.b	Col_Init_Flag
	beq.s	.no_init2
	lea	Col_Buffer2(pc),a0
.no_init2:
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	sf	Col_Flag
.no_col:
	rts


Set_Sprites:
	lea	sprite_adr,a1
	lea	sprite_pos,a2
	moveq	#7,d7
.set_spr:
	move.l	(a1)+,d0
	move.l	d0,a3
	move.l	(a2)+,(a3)		;Position setzen.
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	lea	8(a0),a0
	dbf	d7,.set_spr
	rts

Col_Buffer2:	dc.l	0,0,0


Clist_oldcolpos:	dc.w	0
Clist_oldcolpos2:	dc.w	0

	;d0 nicht benutzen
init_parallax:
	rts

	move.l	#-1,bltafwm(a5)
	move.w	#$09f0,bltcon0(a5)
	move.w	#$0000,bltcon1(a5)
	move.w	#6,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.l	#parallax,d3
	move.l	#Coplab2+6,bltdpth(a5)
	move.l	d3,bltapth(a5)
	move.w	#64*$d0+1,bltsize(a5)
.bwait0:
	btst	#14,dmaconr(a5)
	bne	.bwait0
	rts

para_old:	dc.w	0

Clist_Fade_Handler:	dc.l	SetClist

Fade_Colors:
	move.l	Clist_Fade_Handler(pc),a4
	move.l	Act_Scr_Structure,a6
	st	Col_Init_Flag
	tst.w	d0
	bmi.s	.fade_out
.fade_in:
	bsr	Wait_tof

	st	Col_Flag
	jsr	(a4)
	bsr	set_weapon_colors
	jsr	set_copcolors

	addq.w	#1,Fade_Position
	bsr	Fade_to_Dest

	cmp.w	#16,Fade_Position
	bne	.fade_in
	st	Col_Flag
	jsr	(a4)
	bsr	set_weapon_colors
	jsr	set_copcolors
	sf	Col_Init_Flag
	rts


.fade_out:
	bsr	Wait_tof

	st	Col_Flag
	jsr	(a4)
	bsr	set_weapon_colors
	jsr	set_copcolors

	subq.w	#1,Fade_Position
	bsr	Fade_to_Dest

	tst.w	Fade_Position
	bne	.fade_out
	sf	Col_Init_Flag
	rts

Wait_tof:
	move.l	$dff004,d0
	and.l	#$1ff00,d0
	cmp.l	#$12000,d0
	bne.s	Wait_tof
	rts


Fade_to_Dest:
	move.w	Fade_Position(pc),d7
	lea	B_parallax,a0		;Source
	lea	parallax,a1		;Destination
	move.w	#207,d6
	bsr	Do_Fade_colors
	lea	B_coltab,a0		;Source
	lea	coltab,a1		;Destination
	move.w	#31,d6
	bsr	Do_Fade_colors
	lea	Col_Buffer,a0		;Source
	lea	Col_Buffer2,a1		;Destination
	move.w	#5,d6
	bsr	Do_Fade_colors
	lea	C_coltab,a0		;Source
	lea	C_buffer,a1		;Destination
	move.w	#13,d6
	bsr	Do_Fade_colors
	rts


Do_Fade_colors:
	move.b	(a0)+,d1
	and.w	#15,d1
	mulu	d7,d1
	lsr.w	#4,d1
	move.b	d1,(a1)+
	moveq	#0,d0
	move.b	(a0)+,d0
	move.b	d0,d1
	and.w	#15,d1
	mulu	d7,d1
	lsr.w	#4,d1
	lsr.b	#4,d0
	mulu	d7,d0
	and.b	#$f0,d0
	or.b	d0,d1
	move.b	d1,(a1)+
	dbf	d6,Do_Fade_colors
	rts

set_weapon_colors:
	lea	$dff1a2,a1
	move.w	Col_Buffer2+8,d0
	move.w	d0,8(a1)
	move.w	d0,(a1)+
	move.w	Col_Buffer2+10,d0
	move.w	d0,8(a1)
	move.w	d0,(a1)
	rts

StartFlash:
	sf	KillFlash
	lea	Flash_Handler(pc),a1
	jmp	AddHandler

Flash_Handler:
	tst.b	KillFlash
	bne	.kill
	tst.b	flash_mode
	bne.s	.fade_down

	addq.b	#2,flash_count
	cmp.b	#18,flash_count
	bne.s	.do_flash
	st	flash_mode
	bra.s	.fade_down
.do_flash:
	lea	coltab,a0
	moveq	#31,d7
	bsr	.color_up


	lea	parallax,a0
	move.w	#208-1,d7
	bsr	.color_up

	bra	.set_colors

.fade_down:
	subq.b	#1,flash_count
	bmi	.kill
	lea	coltab,a0
	lea	B_coltab(pc),a1
	moveq	#31,d7
	bsr	.color_down

	lea	parallax,a0
	lea	B_parallax(pc),a1
	move.w	#208-1,d7
	bsr	.color_down

	bra	.set_colors

.color_up:
	move.w	(a0),d0
	move.w	d0,d1
	and.w	#15,d1
	addq.b	#2,d1
	cmp.b	#15,d1
	ble.s	.ok1
	move.b	#15,d1
.ok1:
	and.w	#$0f0,d0
	add.w	#$020,d0
	cmp.w	#$0f0,d0
	ble.s	.ok2
	move.w	#$0f0,d0
.ok2:
	or.w	d0,d1
	move.w	(a0),d0
	and.w	#$f00,d0
	add.w	#$200,d0
	cmp.w	#$f00,d0
	ble.s	.ok3
	move.w	#$f00,d0
.ok3:
	or.w	d0,d1
	move.w	d1,(a0)+
	dbf	d7,.color_up
	rts

.color_down:
	move.w	(a0),d0
	move.w	(a1),d2
	and.w	#$00f,d2
	move.w	d0,d1
	and.w	#$00f,d1
	cmp.w	d2,d1
	beq.s	.ok4
	subq.w	#1,d1
.ok4:
	move.w	(a1),d2
	and.w	#$0f0,d2
	and.w	#$0f0,d0
	cmp.w	d2,d0
	beq.s	.ok5
	sub.w	#$010,d0
.ok5:
	or.w	d0,d1

	move.w	(a0),d0
	move.w	(a1),d2
	and.w	#$f00,d2
	and.w	#$f00,d0
	cmp.w	d2,d0
	beq.s	.ok6
	sub.w	#$100,d0
.ok6:
	or.w	d0,d1
	move.w	d1,(a0)+
	addq.l	#2,a1
	dbf	d7,.color_down
	rts

.set_colors:
;	bsr	init_parallax

	move.w	coltab,Back_Color1+2

	jmp	set_copcolors

.kill:
	move.l	#Return,-4(a0)
	sf	flash_mode
	sf	flash_count
	sf	KillFlash
	rts

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
levelb1	=	130
levelh1	=	93
levelb2	=	20
levelh2	=	13

;--------------------------------------------------------------------------
Bob_Plates_Pointer

	Even
B_coltab:
	dc.w	$0000,$0AAA,$0333,$0666,$0030,$0630,$06BF,$0061
	dc.w	$0050,$0A62,$0E96,$0FD0,$0C20,$025C,$0ECA,$0FFF

	dc.w	$000,$8c1,$080,$fff,$442,$8c1,$080,$fff
	dc.w	$8ae,$26a,$e00,$820,$ea2,$aaa,$666,$000

C_coltab:
	dc.w	$06A6,$0232,$0464,$0430,$04B9,$0690
	dc.w	$0060,$0760,$0894,$09D0,$0720,$0467,$0460,$09F9

D_coltab:
	dc.w	$0000,$08AC,$0445,$0668,$0ECE,$0842,$0A8C,$062B
	dc.w	$0071,$0A64,$0EA8,$0FE0,$0C00,$086C,$0ECA,$0FFF

C_buffer:	ds.w	15

	Even
Main_Clist:
Col_lab2:
	dc.w	$0182,$0000
	dc.w	$0184,$0000
	dc.w	$0186,$0000
	dc.w	$0188,$0000
	dc.w	$018a,$0000
	dc.w	$018c,$0000
	dc.w	$018e,$0000
	dc.w	$0190,$0000
	dc.w	$0192,$0000
	dc.w	$0194,$0000
	dc.w	$0196,$0000
	dc.w	$0198,$0000
	dc.w	$019a,$0000
	dc.w	$019c,$0000
	dc.w	$019e,$0000

Sprlab:
	dc.w	$0120,$0000
	dc.w	$0122,$0000
	dc.w	$0124,$0000
	dc.w	$0126,$0000
	dc.w	$0128,$0000
	dc.w	$012a,$0000
	dc.w	$012c,$0000
	dc.w	$012e,$0000
	dc.w	$0130,$0000
	dc.w	$0132,$0000
	dc.w	$0134,$0000
	dc.w	$0136,$0000
	dc.w	$0138,$0000
	dc.w	$013a,$0000
	dc.w	$013c,$0000
	dc.w	$013e,$0000

	dc.w	$008e,$3091
	dc.w	$0090,$18c1
	dc.w	$0092,$0038
	dc.w	$0094,$00d0
	dc.w	$0108,planeb*4-40
	dc.w	$010a,planeb*4-40
	dc.w	$0100,$4000
	dc.w	$0104,4+4*8
Coplab4:
	dc.w	$0102,$0000

Coplab1:
	dc.w	$00e0,$0004
	dc.w	$00e2,0
	dc.w	$00e4,$0004
	dc.w	$00e6,0+planeb
	dc.w	$00e8,$0004
	dc.w	$00ea,0+planeb*2
	dc.w	$00ec,$0004
	dc.w	$00ee,0+planeb*3
Wrap_Function:
	dc.w	$0084,Coplab3/$10000
	dc.w	$0086,Coplab3&$ffff

	dc.w	$3001,$fffe
Back_Color1:
	dc.w	$0180,$0000

Coplab2:
line	SET	$30

	REPT	$d0
	dc.b	line,$07
	dc.w	$fffe,COPCOL2,0

line	SET	line+1

	ENDR

Copjumpin:
	dc.w	$fedf,$fffe
	dc.w	$0100,$0000
	dc.w	$0180,$0000
	dc.w	$ffdf,$fffe

	dc.w	$0092,$0040
	dc.w	$00e0,Score/$10000
	dc.w	$00e2,Score&$ffff
	dc.w	$00e4,(Score+912)/$10000
	dc.w	$00e6,(Score+912)&$ffff
	dc.w	$00e8,(Score+912*2)/$10000
	dc.w	$00ea,(Score+912*2)&$ffff
	dc.w	$00ec,(Score+912*3)/$10000
	dc.w	$00ee,(Score+912*3)&$ffff
	dc.w	$0102,$0000
	dc.w	$0108,$0000
	dc.w	$010a,$0000

	dc.w	$0192,$008

	dc.w	$0007,$fffe
	dc.w	$0100,$4000

Col_lab1:
	dc.w	$0182,$0000
	dc.w	$0184,$0000
	dc.w	$0186,$0000
	dc.w	$0188,$0000
	dc.w	$018a,$0000
	dc.w	$018c,$0000
	dc.w	$018e,$0000
	dc.w	$0190,$0000
	dc.w	$0192,$0000
	dc.w	$0194,$0000
	dc.w	$0196,$0000
	dc.w	$0198,$0000
	dc.w	$019a,$0000
	dc.w	$019c,$0000
	dc.w	$019e,$0000

	dc.w	$0140,$0000
	dc.w	$0148,$0000
	dc.w	$0150,$0000
	dc.w	$0158,$0000
	dc.w	$0160,$0000
	dc.w	$0168,$0000
	dc.w	$0170,$0000
	dc.w	$0178,$0000

	dc.w	$0101,$fffe,$0192,$0006

	dc.w	$0a01,$fffe,$0182,$e00
	dc.w	$0184,$e82,$0186,$ec0
	dc.w	$0188,$0c1,$018a,$080

	dc.w	$0b01,$fffe,$0190,$e82
	dc.w	$0d01,$fffe,$0190,$ec0

	dc.w	$0182,$a00,$0184,$a50
	dc.w	$0186,$a80,$0188,$080
	dc.w	$018a,$060
	dc.w	$0f01,$fffe,$0190,$fff
	dc.w	$1001,$fffe,$0190,$ec0
	dc.w	$0182,$888
	dc.w	$1101,$fffe,$0182,$aaa
	dc.w	$1201,$fffe,$0190,$e82
	dc.w	$0182,$ccc
	dc.w	$1301,$fffe,$0182,$aaa
	dc.w	$1401,$fffe,$0190,$e00
	dc.w	$0182,$888
	dc.w	$1701,$fffe,$0192,$0004

	dc.w	$ffff,$fffe

Coplab3:
	dc.w	$00e2,0
	dc.w	$00e6,0
	dc.w	$00ea,0+planeb*2
	dc.w	$00ee,0+planeb*3
	dc.w	COPCOL2,$0000

	dc.w	$0084,$0000
	dc.w	$0086,$0000
	dc.w	$008a,$0001

Coplab5:
	dc.w	$00e0,GameBpl2/$10000
	dc.w	$00e4,GameBpl2/$10000
	dc.w	$00e8,GameBpl2/$10000
	dc.w	$00ec,GameBpl2/$10000

	dc.w	$00e2,0
	dc.w	$00e6,0
	dc.w	$00ea,0+planeb*2
	dc.w	$00ee,0+planeb*3

	dc.w	$0084,$0000
	dc.w	$0086,$0000
	dc.w	$0102,$0000

	dc.w	$0108,planeb2*4-40
	dc.w	$010a,planeb2*4-40

	dc.w	$008a,$0001

B_parallax:	incbin	work:sources/t3/bitplanes/w3_copper2.col

Area1:		incbin	work:sources/t3/areas/area.bin
Area2:
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,.Q1-Area2,-1,-1
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,-1,-1,-1
.Q1:
	dc.b	0,24
	dc.w	0,0,0
	dc.w	-1

Area3:
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,.Q1-Area3,-1,-1
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,-1,-1,-1
	dc.w	-1,-1,-1,-1,-1
.Q1:
	dc.b	0,29
	dc.w	0,0,0
	dc.w	-1
