

 *
 *         TURRICAN III AMIGA
 * (C) 1992,93 SOFTGOLD/RAINBOW ARTS
 * (P) 1992,93 NEON
 *
 * original version (p) 1992  FACTOR 5
 * original GFX & co-design   KAIKO
 * original Music-score & SFX KAIKO
 * original Characters        Manfred Trenz
 *
 * started :        12-12-1992
 * finishing date : 14- 4-1993 ???
 *

	INCDIR	work:sources/t3/areas

	;/* Hardware-include-file      */
	;/* (p) 1990 by Peter Thierolf */

custom	= $dff000

bltddat	= $000
dmaconr	= $002
vposr	= $004
vhposr	= $006
dskdatr	= $008
joy0dat	= $00a
joy1dat	= $00c
clxdat	= $00e
adkconr	= $010
pot0dat	= $012
pot1dat	= $014
potgor	= $016
serdatr	= $018
dskbytr	= $01a
intenar	= $01c
intreqr	= $01e
dskpth	= $020
dskptl	= $022
dsklen	= $024
dskdat	= $026
refptr	= $028
vposw	= $02a
vhposw	= $02c
copcon	= $02e
serdat	= $030
serper	= $032
potgo	= $034
joytest	= $036
strequ	= $038
strvbl	= $03a
strhor	= $03c
strlong	= $03e
bltcon0	= $040
bltcon1	= $042
bltafwm	= $044
bltalwm	= $046
bltcpth	= $048
bltcptl	= $04a
bltbpth	= $04c
bltbptl	= $04e
bltapth	= $050
bltaptl	= $052
bltdpth	= $054
bltdptl	= $056
bltsize	= $058

bltcmod	= $060
bltbmod	= $062
bltamod	= $064
bltdmod	= $066

bltcdat	= $070
bltbdat	= $072
bltadat	= $074

dsksync	= $07e
cop1lch	= $080
cop1lcl	= $082
cop2lch	= $084
cop2lcl	= $086
copjmp1	= $088
copjmp2	= $08a
copins	= $08c
diwstrt	= $08e
diwstop	= $090
ddfstrt	= $092
ddfstop	= $094
dmacon	= $096
clxcon	= $098
intena	= $09a
intreq	= $09c
adkcon	= $09e

audlch	= $000
audlcl	= $002
audlen	= $004
audper	= $006
audvol	= $008
auddat	= $00a

aud0	= $0a0
aud1	= $0b0
aud2	= $0c0
aud3	= $0e0

bpl1pth	= $0e0
bpl1ptl	= $0e2
bpl2pth	= $0e4
bpl2ptl	= $0e6
bpl3pth	= $0e8
bpl3ptl	= $0ea
bpl4pth	= $0ec
bpl4ptl	= $0ee
bpl5pth	= $0f0
bpl5ptl	= $0f2
bpl6pth	= $0f4
bpl6ptl	= $0f6

bplcon0	= $100
bplcon1	= $102
bplcon2	= $104

bpl1mod	= $108
bpl2mod	= $10a

bpl1dat	= $110
bpl2dat	= $112
bpl3dat	= $114
bpl4dat	= $116
bpl5dat	= $118
bpl6dat	= $11a

spr0pth	= $120
spr0ptl	= $122
spr1pth	= $124
spr1ptl	= $126
spr2pth	= $128
spr2ptl	= $12a
spr3pth	= $12c
spr3ptl	= $12e
spr4pth	= $130
spr4ptl	= $132
spr5pth	= $134
spr5ptl	= $136
spr6pth	= $138
spr6ptl	= $13a
spr7pth	= $13c
spr7ptl	= $13e

sprpos	= $000
sprctl	= $002
sprdata	= $004
sprdatb	= $006

spr0	= $140
spr1	= $148
spr2	= $150
spr3	= $158
spr4	= $160
spr5	= $168
spr6	= $170
spr7	= $178

color	= $180

	;/* Cia's */

ciaa	= $bfe001
ciab	= $bfd000

pra	= $000
prb	= $100
ddra	= $200
ddrb	= $300
talo	= $400
tahi	= $500
tblo	= $600
tbhi	= $700
todlo	= $800
todmid	= $900
todhi	= $a00
sdr	= $c00
icr	= $d00
cra	= $e00
crb	= $f00

Buffer		= $2ebae
Rotate_Buffer	= Buffer+24308

GameBpl0	= $40000
GameBpl1	= $50000
GameBpl2	= $60000

BSS_buffer	= GameBpl2+$b200

character	= $10000
BG_Chars	= character+32128
Level1		= $18000
Level2		= $78000
Level3		= $70000

SpriteAdr	= $25200
SpriteBuffer	= Buffer

RopeBob		= $20c00
AD_Bob		= $20c80

level_GFX	= $215c0
level_Buffer	= $4d120
level_flip_len	= 10790
main_GFX	= $1e000
main_Buffer	= level_Buffer+level_flip_len
main_flip_len	= 700

para_GFX	= $2b340
para_chars	= $2c8a6
elevator_chars	= $2b100

boss_GFX	= $2daa6

Score		= $5d000

Coll_Anker	= BSS_buffer		;Collision-Tables
Coll_Buffer	= BSS_buffer+16*4

parallax	= BSS_buffer+2000
parallax2	= parallax+208*2
parallax3	= parallax2+109*2
Rest_List1	= parallax3+32
Rest_List2	= Rest_List1+$600

Work_Buffer1	= Rest_List2+$600
Work_Buffer2	= Work_Buffer1+2116
Work_Buffer3	= Work_Buffer2+2116
Work_Buffer4	= Work_Buffer3+2116

;Joy-flags

DOWN	= 0
JUMP	= 1
LEFT	= 2
RIGHT	= 3
FIRE	= 4

MAX_ROPE	= 128
BOB_MAXIMUM	EQU	50

TARGET_VERZ	= 30
COPCOL		= $188

COLORTEST	= 0
CountBobs	= 1
SpeedCheck	= 0
BobTest		= 0
Level		= 0

	dc.l	$a00
	dc.l	$a00
	ORG	$a00

Start:
	move.w	#$000,$dff180

	lea	BSS_buffer,a0
	move.w	#$1380-1,d0
.clear_bss:
	clr.l	(a0)+
	dbf	d0,.clear_bss

	lea	custom,a5
	lea	Main_Clist,a0
	move.l	a0,cop1lch(a5)
	bsr	Init_keys

	move.w	#$87e0,dmacon(a5)
	move.w	#$7fff,intena(a5)
	move.w	#$c008,intena(a5)
	move.w	#$0000,bltcon1(a5)

	bsr	init_score_line

	bsr	init_rnd

	jsr	init_parallax
	bsr	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	Rest_List1,a0
	clr.l	(a0)

	lea	Rest_List2,a0
	clr.l	(a0)

	;Player Sprites X-Flip.

	lea	SpriteAdr,a0		;Quell-adr
	lea	SpriteBuffer,a1		;Ziel-adr
	move.w	#s_len-1,d7		:Quell-len in Bytes.
;	move.w	#$0f0,$dff180

	bsr	Flip_Sprites

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

	lea	main_flipI(pc),a3
	lea	main_GFX,a0
	lea	main_Buffer,a1
	bsr	Flip_Bobs

	;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	level_GFX+bob13,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1(pc),a2
	lea	level_GFX+msk13,a3
	moveq	#32,d0
	moveq	#4,d1
	bsr	Convert_to_Rotate

	move.l	#Rotate_Buffer,Dest_Obj
	clr.w	Angle_Obj

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

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

	lea	Work_Buffer2,a1
	lea	Rot_Info1(pc),a2
	bsr	Convert_to_Bitplane

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


	move.b	#0,T_weapon
	move.b	#0,T_weapon_new
	bsr	select_weapon

	move.b	#64,T_energy		;Volle Energie!
	move.w	#1024,T_wenergy		;Volle Energie!
	bsr	select_weapon
	sf	T_flash
	clr.l	T_speedY
	clr.b	T_rocket_anz

	jsr	Next_Level

Init_Level:
	clr.l	Dol_Speed_X
	clr.l	Dol_Speed_Y
	clr.w	Accel_Flag_X
	clr.l	T_Ispeed_X
	clr.l	T_Ispeed_Y
	clr.b	T_rocket_anz

	move.l	#Player_Dead,Dead_Vector
	lea	BSS_buffer,a0
	move.w	#816,d0
.clear:
	clr.l	(a0)+
	dbf	d0,.clear

	lea	Bob_Structure,a0
	move.w	#(BOB_MAXIMUM*BOB_ENTRY_LENGTH)-1,d7
.clear2:
	move.b	#BOB_FALSE,(a0)+
	dbf	d7,.clear2

	move.w	#AnimEntryLen*MaxAnim-1,d7
	lea	AnimList(pc),a0
.clear3:
	move.b	#-1,(a0)+
	dbf	d7,.clear3

	move.l	Act_Scr_Structure,a6
	clr.l	Scr_Up_Fix(a6)
	clr.l	Scr_X_Fix(a6)
	bsr	Set_Player

	move.l	Act_Scr_Structure,a6
	jsr	Create_Pages

	IFEQ	BobTest
	bsr	EnterScreen			;Alle Gegner eintragen.
	ELSEIF
	move.w	#100,d1
	move.w	#50,d2

	moveq	#14,d0
	lea	Area_Enter_Vector(pc),a1
	moveq	#9,d7

.loop:
	movem.l	d0-d2/d7/a1,-(sp)
	jsr	Search_Bob_Entry
	movem.l	(sp)+,d0-d2/d7/a1

	add.w	#32,d1
	cmp.w	#250,d1
	blt.s	.ok
	move.w	#100,d1
	add.w	#32,d2
.ok:
	dbf	d7,.loop

	ENDC

	st	Col_Init_Flag
	bsr	game
	bsr	game
	sf	Col_Init_Flag

	clr.w	Fade_Position
	moveq	#1,d0
	jsr	Fade_Colors

.wait_tof:
	move.l	vposr(a5),d0
	and.l	#$1ff00,d0
	cmp.l	#$10100,d0
	blt.s	.wait_tof
	cmp.l	#$12000,d0
	bgt.s	.wait_tof

	bsr	game

	tst.b	T_dead
	beq.s	.no_dead
	subq.b	#1,T_dead
	bne	.no_dead
	move.l	Dead_Vector(pc),a0
	jsr	(a0)
.no_dead:

	tst.b	Cue_Point+1
	bmi.s	.level_clear

	tst.b	pause_flag
	bne.s	.do_pause

	cmp.b	#$64,G_keycode
	bne.s	.no_pause
	clr.b	G_keycode
	st	pause_flag
.no_pause:
	btst	#6,$bfe001
	bne	.wait_tof

	rts
.level_clear:
	move.w	#15,Fade_Position
	moveq	#-1,d0
	jsr	Fade_Colors

	jsr	Next_Level
	bra	Init_Level
.do_pause:
	btst	#6,$bfe001
	beq	Return
	cmp.b	#$64,G_keycode
	beq.s	.stop_pause
	cmp.b	#$40,G_keycode
	bne.s	.do_pause
	clr.b	G_keycode
	bra	.wait_tof

.stop_pause:
	clr.b	G_keycode
	clr.b	pause_flag
	bra	.wait_tof

pause_flag:	dc.b	0
	even

game:
	move.w	#$000,$dff180

	eor.w	#1,half_pixel

	clr.l	quarter_pixel
	addq.w	#1,help_pixel
	move.w	help_pixel,d0
	and.w	#7,d0
	bne.s	.no_eights
	addq.w	#1,eights_pixel
.no_eights:
	and.w	#3,d0
	beq.s	.no_quarter
	addq.w	#1,quarter_pixel
.no_quarter:

	IFNE	COLORTEST
	move.w	#$f00,$dff180
	ENDC
	tst.b	T_mine
	bne.s	.no_spec
	move.l	SW_spec_rout(pc),a0
	jsr	(a0)
.no_spec:

	move.l	Clist_Handler(pc),a0
	jsr	(a0)

	IFNE	COLORTEST
	move.w	#$00f,$dff180
	ENDC
	bsr	make_collision

	move.l	SFX_Handler(pc),a0
	jsr	(a0)

	bsr	RestoreBobs		;Bobs lschen
	jsr	Scroll			;Playfield scrollen
	move.w	Scr_Y_Level_Pos(a6),d0
	lsr.w	#1,d0
	move.w	d0,para_ypos				;Parallax scrollen.

	bsr	Calc_Blit_Adrs
	bsr	JoyStick		;Joystick/Joypad auslesen

	IFNE	COLORTEST
	move.w	#$ff0,$dff180
	ENDC
	bsr	Handle_Player		;Spieler verwalten

	IFNE	COLORTEST
	move.w	#$f0f,$dff180
	ENDC

	move.l	Act_Scr_Structure,a6

	bsr	BG_Anim
	move.w	SW_power,d0
	move.b	d0,T_time
	bsr	show_score_line
	bsr	ExecuteHandler
	bsr	change_weapons


	IFNE	COLORTEST
	move.w	#$0f0,$dff180
	ENDC
	bsr	Motion_Control		;Scrolling handlen.

	bsr	Show_SWeapons		;Sprite-Schsse darstellen.
	IFNE	COLORTEST
	move.w	#$004,$dff180
	ENDC

	bsr	Area_Check

	bsr	check_weapons

	IFNE	COLORTEST
	move.w	#$0f0,$dff180
	ENDC
	bsr	Blit_Rope
	bsr	Bob_System

	IFNE	COLORTEST
	move.w	#$f00,$dff180
	ENDC
	bsr	Anim_Player		;Spieler-Sprites bewegen.


	IFNE	COLORTEST
	move.w	#$000,$dff180
	ENDC

	cmp.b	#$11,G_keycode
	bne.s	.no_weapon
	clr.b	G_keycode
	addq.b	#1,T_weapon_new
	cmp.b	#3,T_weapon_new
	blt.s	.no_weapon
	clr.b	T_weapon_new

.no_weapon:

	cmp.b	#$19,G_keycode
	bne.s	.no_power_up
	clr.b	G_keycode
	addq.b	#1,T_power_new
	cmp.b	#3,T_power_new
	bne.s	.no_power_up
	clr.b	T_power_new

.no_power_up:

	cmp.b	#$27,G_keycode
	bne.s	.no_kill
	clr.b	G_keycode
	clr.b	T_energy

.no_kill:
	cmp.b	#$13,G_keycode
	bne.s	.no_rocket
	clr.b	G_keycode
	eor.b	#1,T_rocket
.no_rocket:

	cmp.b	#$33,G_keycode
	bne.s	.no_color
	lea	parallax,a0
	move.w	#$006,d0
	move.w	#511,d7
.loop2:
	move.w	d0,(a0)+
	dbf	d7,.loop2
	clr.b	G_keycode
.no_color:
	rts

Dead_Vector:	dc.l	Player_Dead
Clist_Handler:	dc.l	Return
SFX_Handler:	dc.l	Return

Player_Dead:
	bsr	Die_Player
	lea	AnimList(pc),a0
.aloop:
	move.l	(a0),d0
	beq	.anext
	bmi	.aend
	bsr	Out_Anim
.anext:
	lea	AnimEntryLen(a0),a0
	bra	.aloop
.aend:
	move.l	Act_Bob_Structure,a4
	moveq	#BOB_MAXIMUM-1,d7
.loop:
	tst.b	Bob_Used(a4)
	bmi.s	.next
	bsr	Out_Bob
.next:
	lea	BOB_ENTRY_LENGTH(a4),a4
	dbf	d7,.loop

	jsr	SetClist

	move.w	#15,Fade_Position
	moveq	#-1,d0
	jsr	Fade_Colors

	move.l	Act_Scr_Structure,a6
	clr.l	Scr_X_Fix(a6)

	bra	Init_Level

Die_Player:
	move.b	T_lifes,d0
	move.b	#0,ccr
	moveq	#1,d1
	sbcd	d1,d0
	move.b	d0,T_lifes

	sf	T_dead
	sf	T_dieing
	sf	T_hit
	sf	T_rope
	sf	T_swing
	sf	T_targeting
	sf	T_wheel
	clr.b	T_state

	tst.b	T_power
	beq.s	.no_powerdown
	subq.b	#1,T_power
	move.b	T_power,T_power_new
.no_powerdown:
	move.b	#64,T_energy		;Volle Energie!
	move.w	#1024,T_wenergy		;Volle Energie!

	bsr	select_weapon
	sf	T_flash
	clr.l	T_speedY
	clr.b	T_rocket_anz

	rts

RoutRts:
Return:	rts

set_copcolors:
	lea	coltab+32,a0
	lea	$dff180+32,a1
	moveq	#15,d7
.copcols:
	move.w	(a0)+,(a1)+
	dbf	d7,.copcols

	moveq	#14,d7
	lea	coltab+2,a0
	lea	Col_lab2,a1
.setcol1:
	move.w	(a0)+,2(a1)
	addq.l	#4,a1
	dbf	d7,.setcol1
	rts

Angle_Obj:	dc.w	0
Dest_Obj:	dc.l	0

*----------------------------------------------------------------------------
waitblt:		MACRO

.w1\@	btst	#14,dmaconr(a5)
	bne.s	.w1\@

	ENDM
*----------------------------------------------------------------------------
FlipBlock_4_Planes:	MACRO

	waitblt
	move	Scr_Blt_A_Flip_Mod(a6),bltamod(a5)
	move	Scr_Blt_D_Flip_Mod(a6),bltdmod(a5)
	move.l	(a0,d0.w),a0
	add	Scr_Blt_Flip_Add(a6),a0

	movem.l	d3/a2-a3,-(sp)

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	adda.w	#40,a0
	add.w	#planeb,a2
	add.w	#planeb,a3
	add.l	#planeb,d3

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	add	#40,a0
	add	#planeb,a2
	add	#planeb,a3
	add.l	#planeb,d3

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	add	#40,a0
	add	#planeb,a2
	add	#planeb,a3
	add.l	#planeb,d3

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)

	move	Scr_Blt_A_Modulo(a6),bltamod(a5)
	move	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	movem.l	(sp)+,d3/a2-a3

	ENDM

*---------------------------------------------------------------------
FlipBlock_3_Planes:	MACRO

	waitblt
	move	Scr_Blt_A_Flip_Mod(a6),bltamod(a5)
	move	Scr_Blt_D_Flip_Mod(a6),bltdmod(a5)
	move.l	(a0,d0.w),a0
	add	Scr_Blt_Flip_Add(a6),a0

	movem.l	d3/a2-a3,-(sp)

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	add	#40,a0
	add	#planeb,a2
	add	#planeb,a3
	add.l	#planeb,d3

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	add	#40,a0
	add	#planeb,a2
	add	#planeb,a3
	add.l	#planeb,d3

	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
 	move	Scr_Blt_Flip_Size(a6),bltsize(a5)
	waitblt

	move	Scr_Blt_A_Modulo(a6),bltamod(a5)
	move	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	movem.l	(sp)+,d3/a2-a3

	ENDM

	*----------------------------------------------------------------------------
	*------------------------- FLIP & ROTATION SYSTEM ---------------------------
	*----------------------------------------------------------------------------

	;Requirements :
	;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

Convert_to_Rotate:
	move.w	d0,d7
	move.w	d0,Rot_I_OBJ_Width(a2)
	move.w	d1,Rot_I_OBJ_Planes(a2)
	;Gre des Puffers berechnen (ZeilenModulo etc.)

	mulu	d0,d0		; L^2
	add.w	d0,d0		; *2
	bsr	sqrt
	addq.w	#1,d0
	and.w	#$fffe,d0
	move.w	d0,Rot_I_Width(a2)
	mulu	d0,d0		; Die Buffergre ist nun berechnet.
	move.w	d0,Rot_I_Size(a2)

	subq.w	#1,d0
	moveq	#0,d1
.clear:
	move.b	d1,(a1,d0.w)	;Lschen des Chunky-Buffers
	dbf	d0,.clear

	moveq	#0,d0
	move.w	Rot_I_Width(a2),d0
	sub.w	d7,d0
	lsr.w	#1,d0		;Soviele Bytes stehen an allen Rndern ber.

	move.l	d0,d1
	mulu	Rot_I_Width(a2),d0
	add.w	d0,d1		;Offset auf den Start-pixel im Dest-Buffer.
	move.w	d1,Rot_I_Offset(a2)
	lea	(a1,d1.w),a1
				;Y-Counter steht in d7.
	move.w	d7,d0
	lsr.w	#3,d0		;Modulo fr nchste BitPlane.
	move.w	d0,Rot_I_OBJ_Mod(a2)

	move.w	Rot_I_OBJ_Mod(a2),d0
	move.w	Rot_I_OBJ_Planes(a2),d1
	subq.w	#1,d1
	mulu	d1,d0
	move.w	d0,Rot_I_OBJ_Mod2(a2)

	move.w	Rot_I_OBJ_Planes(a2),a4

	subq.w	#1,d7		;Fr DBF anpassen
.loopy:
	move.w	Rot_I_OBJ_Width(a2),d6
	lsr.w	#3,d6		;Nur die Bytes beachten.
	subq.w	#1,d6		;Fr DBF anpassen
.loopx:
	cmp.w	#1,a4		;Nur eine Plane ?
	beq.s	.all_planes
	move.w	Rot_I_OBJ_Mod(a2),d5
	move.b	(a0,d5),d1
	cmp.w	#2,a4		;Zwei Planes ?
	beq.s	.all_planes
	add.w	Rot_I_OBJ_Mod(a2),d5
	move.b	(a0,d5),d2
	cmp.w	#3,a4		;Drei Planes ?
	beq.s	.all_planes
	add.w	Rot_I_OBJ_Mod(a2),d5
	move.b	(a0,d5),d3
.all_planes:
	move.b	(a0)+,d0
	move.b	(a3)+,d4
	move.w	d6,-(sp)
	moveq	#7,d6
.loopbyte:
	moveq	#0,d5
	lsl.b	#1,d4			;Die Maske ganz oben!
	addx.b	d5,d5
	lsl.b	#1,d3
	addx.b	d5,d5
	lsl.b	#1,d2
	addx.b	d5,d5
	lsl.b	#1,d1
	addx.b	d5,d5
	lsl.b	#1,d0
	addx.b	d5,d5
	move.b	d5,(a1)+
	dbf	d6,.loopbyte
	move.w	(sp)+,d6
	dbf	d6,.loopx

	move.w	Rot_I_OBJ_Mod2(a2),d0
	lea	(a0,d0.w),a0		;Zur Nchsten Quell-Zeile skippen.

	move.w	Rot_I_Width(a2),d0
	sub.w	Rot_I_OBJ_Width(a2),d0
	lea	(a1,d0.w),a1		;Zur Nchsten Dest Zeile skippen.

	dbf	d7,.loopy
	move.w	Rot_I_Width(a2),Rot_I_BUF_Width(a2)	;Normalerweise ist der Buffer gleich gro!
	clr.w	Rot_I_Single_Call(a2)
	rts

	;Requirements:
	;a0 = Pointer auf Ziel-Daten (Normales interleaved Bob)
	;a1 = Pointer auf Chunky-Mode-Buffer (Schon mit Offset !!)
	;a2 = Pointer auf gefllte Rotate-Info-Struktur
	;a3 = Pointer auf Ziel-Maske (Einfache Masken-Plane)

Convert_to_Bitplane:
	move.w	Rot_I_OBJ_Width(a2),d7
Convert_to_Bitplane2:
	move.w	Rot_I_OBJ_Planes(a2),a4
	subq.w	#1,d7		;Fr DBF anpassen
.loopy:
	move.w	Rot_I_OBJ_Width(a2),d6
	lsr.w	#3,d6		;Nur die Bytes beachten.
	subq.w	#1,d6		;Fr DBF anpassen
.loopx:
	move.w	d6,-(sp)
	moveq	#7,d6

	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
.loopbyte:
	move.b	(a1)+,d5
	beq.s	.empty

	lsr.b	#1,d5
	roxl.b	#1,d0
	lsr.b	#1,d5
	roxl.b	#1,d1
	lsr.b	#1,d5
	roxl.b	#1,d2
	lsr.b	#1,d5
	roxl.b	#1,d3
	lsr.b	#1,d5
	roxl.b	#1,d4
.back:
	dbf	d6,.loopbyte

	move.w	Rot_I_OBJ_Mod(a2),d5
	move.b	d1,(a0,d5)
	add.w	Rot_I_OBJ_Mod(a2),d5
	move.b	d2,(a0,d5)
	add.w	Rot_I_OBJ_Mod(a2),d5
	move.b	d3,(a0,d5)
.all_planes:
	move.b	d0,(a0)+
	move.b	d4,(a3)+

	move.w	(sp)+,d6
	dbf	d6,.loopx

	adda.w	Rot_I_OBJ_Mod2(a2),a0	;Zur Nchsten Dest Zeile skippen.

	move.w	Rot_I_BUF_Width(a2),d0
	sub.w	Rot_I_OBJ_Width(a2),d0
	lea	(a1,d0.w),a1		;Zur Nchsten Quell Zeile skippen.

	dbf	d7,.loopy
	rts

.empty:
	add.b	d0,d0
	add.b	d1,d1
	add.b	d2,d2
	add.b	d3,d3
	add.b	d4,d4
	bra.s	.back

Convert_to_Bitplane3:
	move.w	Rot_I_OBJ_Planes(a2),a4
	subq.w	#1,d7		;Fr DBF anpassen
.loopy:
	move.w	Rot_I_OBJ_Width(a2),d6
	lsr.w	#3,d6		;Nur die Bytes beachten.
	subq.w	#1,d6		;Fr DBF anpassen
.loopx:
	move.w	d6,-(sp)
	moveq	#7,d6

	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
.loopbyte:
	move.b	(a1)+,d5
	beq.s	.empty

	lsr.b	#1,d5
	roxl.b	#1,d0
	lsr.b	#1,d5
	roxl.b	#1,d1
	lsr.b	#1,d5
	roxl.b	#1,d2
	lsr.b	#2,d5
	roxl.b	#1,d4
.back:
	dbf	d6,.loopbyte

	move.w	Rot_I_OBJ_Mod(a2),d5
	move.b	d1,(a0,d5)
	add.w	Rot_I_OBJ_Mod(a2),d5
	move.b	d2,(a0,d5)
.all_planes:
	move.b	d0,(a0)+
	move.b	d4,(a3)+

	move.w	(sp)+,d6
	dbf	d6,.loopx

	adda.w	Rot_I_OBJ_Mod2(a2),a0	;Zur Nchsten Dest Zeile skippen.

	move.w	Rot_I_BUF_Width(a2),d0
	sub.w	Rot_I_OBJ_Width(a2),d0
	lea	(a1,d0.w),a1		;Zur Nchsten Quell Zeile skippen.

	dbf	d7,.loopy
	rts

.empty:
	add.b	d0,d0
	add.b	d1,d1
	add.b	d2,d2
	add.b	d4,d4
	bra.s	.back

Rot_I_OBJ_Width		rs.w	1
Rot_I_OBJ_Planes	rs.w	1
Rot_I_OBJ_Mod		rs.w	1
Rot_I_OBJ_Mod2		rs.w	1
Rot_I_BUF_Width		rs.w	1
Rot_I_Width		rs.w	1
Rot_I_Offset		rs.w	1
Rot_I_Size		rs.w	1
Rot_I_Single_Call	rs.w	1
Rot_I_ENTRY_LENGTH	rs.w	0

Rot_Info1:	ds.w	Rot_I_ENTRY_LENGTH

	;Requirements :
	;a0 = Pointer auf Quell-Chunky-Mode-Buffer
	;a1 = Pointer auf Ziel-Chunky-Mode-Buffer
	;a2 = Pointer auf gefllte Rotate-Info-Struktur
	;d0 = Zoom-Faktor im 16:16 Fix Format.

Do_Zoom:
	move.w	Rot_I_BUF_Width(a2),d1
	mulu	d1,d1			;Gre des Ziel-Buffers.
	lsr.w	#2,d1
	subq.w	#1,d1
	move.l	a1,a3
.clear:
	clr.l	(a3)+			;Lschen des Ziel-Buffers.
	dbf	d1,.clear

	add.w	Rot_I_Offset(a2),a0

	move.l	d0,d1
	swap	d1

	moveq	#0,d2
	moveq	#0,d3
	moveq	#0,d4
	;Feststellen, wieviele Pixel breit die Destination wird.
	;Und ausrechnen der Offsets.
	lea	Offset_Table(pc),a3
.loop:
	add.l	d1,d2
	addx.w	d3,d2
	move.w	d2,(a3)+
	addq.w	#1,d4
	cmp.w	Rot_I_OBJ_Width(a2),d2	;Vergleichen mit der Ursprnglichen Breite.
	blt.s	.loop

	;In d4 steht die Breite/Hhe in Pixeln.

	move.w	Rot_I_BUF_Width(a2),d5
	sub.w	d4,d5
	lsr.w	#1,d5			;Soviel Pixel mssen am linken Rand frei sein.

	add.w	d5,a1

	mulu	Rot_I_BUF_Width(a2),d5
	add.w	d5,a1

	moveq	#0,d0
	subq.w	#1,d4
	move.w	d4,d6

.loopy:
	move.w	d4,d5

	move.l	a1,a3
	lea	Offset_Table(pc),a4
.loopx:
	move.w	(a4)+,d2		;8
	move.b	(a0,d2.w),(a3)+		;18
	dbf	d5,.loopx		;10

	tst.w	d6			;Hiermit spare ich einmal die Multipliziererei.
	beq.s	.out

	adda.w	Rot_I_BUF_Width(a2),a1
	add.l	d1,d0
	addx.w	d3,d0
	move.w	d0,d3
	clr.w	d0
	mulu	Rot_I_Width(a2),d3
	lea	(a0,d3.w),a0
	moveq	#0,d3

	dbf	d6,.loopy
.out:
	lea	custom,a5
	rts

Offset_Table:
	ds.w	32*2

	;a0 = Pointer auf Quell-Chunky-Mode-Buffer
	;a1 = Pointer auf Ziel-Chunky-Mode-Buffer
	;a2 = Pointer auf gefllte Rotate-Info-Struktur
	;d0 = Rotier-Winkel von 0-255

	;VORSICHT ! IST NOCH AUF 32er OBJEKTE BESCHRNKT!!!

Do_Rotate:
	move.l	a0,-(sp)
	lea	Offset_Table(pc),a3

	;Berechnen der Steigung der Einzellinien, aus denen das Objekt entsteht

	move.b	d0,Angle

	bsr	cos
	ext.l	d0
	asl.l	#8,d0
	move.l	d0,X_Add

	move.b	Angle,d0
	bsr	sin
	ext.l	d0
	asl.l	#8,d0
	move.l	d0,Y_Add

	;Berechnen des Startpunkts

	move.w	Rot_I_OBJ_Width(a2),d0
	lsr.w	#1,d0
	mulu	d0,d0
	add.w	d0,d0
	bsr	sqrt
	move.w	d0,d6

	move.b	#64+32,d0
	sub.b	Angle(pc),d0
	move.w	d0,-(sp)
	bsr	cos
	muls	d6,d0
	asr.l	#8,d0

	move.w	Rot_I_Width(a2),d4
	lsr.w	#1,d4			;X0 / Y0

	add.w	d4,d0
	move.w	d0,d5			;X1

	move.w	(sp)+,d0
	bsr	sin
	neg.w	d0
	muls	d6,d0
	asr.l	#8,d0
	add.w	d4,d0			;Y1
	mulu	Rot_I_Width(a2),d0	;*Breite des Buffers
	add.w	d0,d5			;Offset fr den Startpunkt.

	;Offsets fr eine einzelne Linie ausrechnen.

	move.w	d5,(a3)+

	moveq	#0,d0
	moveq	#0,d1

	move.l	X_Add,d2
	move.l	Y_Add,d3
	swap	d2
	swap	d3			;Vorkomma-Anteil nach unten bringen.
	moveq	#31-1,d7		;Noch 31 Punkte berechnen.
.loop1:
	moveq	#0,d6
	add.l	d2,d0
	addx.w	d6,d0
	add.l	d3,d1
	addx.w	d6,d1
	add.w	d0,d5
	clr.w	d0
	move.w	d1,d6
	muls	Rot_I_Width(a2),d6
	add.w	d6,d5
	clr.w	d1
	move.w	d5,(a3)+
	dbf	d7,.loop1

	move.l	Y_Add,d2
	move.l	X_Add,d3
	neg.l	d2
	swap	d2
	swap	d3			;Vorkomma-Anteil nach unten bringen.

	;Offsets zur nchsten Zeile berechnen. (32 Stck)

	clr.w	(a3)+			;Erster Offset ist Null!

	moveq	#0,d0
	moveq	#0,d1

	moveq	#0,d5

	moveq	#31-1,d7
.loop2:
	moveq	#0,d6
	add.l	d2,d0
	addx.w	d6,d0
	add.l	d3,d1
	addx.w	d6,d1
	add.w	d0,d5
	clr.w	d0
	move.w	d1,d6
	muls	Rot_I_Width(a2),d6
	add.w	d6,d5
	clr.w	d1
	sub.w	-2(a3),d5		;Nur die Differenzen zhlen.
	move.w	d5,(a3)+
	dbf	d7,.loop2

	;Kopieren des Puffers in den Ziel-Buffer!

	move.l	(sp)+,a0

	lea	Offset_Table+64+2(pc),a4		;Y-Offsets
	moveq	#32-1,d6
	tst.w	Rot_I_Single_Call(a2)
	beq.s	.loopy
	moveq	#16-1,d6
.loopy:
	moveq	#32-1,d7
	lea	Offset_Table(pc),a3	;X-Offsets
.loopx:
	move.w	(a3)+,d0
	move.b	(a0,d0.w),(a1)+
	dbf	d7,.loopx
	add.w	(a4)+,a0
	dbf	d6,.loopy
	rts

Do_Copy:
	lea	Offset_Table+64+2(pc),a4		;Y-Offsets
	lea	32*16(a1),a1
	moveq	#16-1,d6
.skip:
	add.w	(a4)+,a0
	dbf	d6,.skip

	moveq	#16-1,d6
.loopy:
	moveq	#32-1,d7
	lea	Offset_Table(pc),a3	;X-Offsets
.loopx:
	move.w	(a3)+,d0
	move.b	(a0,d0.w),(a1)+
	dbf	d7,.loopx
	add.w	(a4)+,a0
	dbf	d6,.loopy
	rts

X_Add:	dc.l	0
Y_Add:	dc.l	0
Angle:	dc.w	0

Flip_Sprites:
	lea	flip_table(pc),a2
	moveq	#0,d0
	lsr.w	#1,d7
.next_one:
	move.b	(a0)+,d0
	move.b	(a2,d0.w),1(a1)
	move.b	(a0)+,d0
	move.b	(a2,d0.w),(a1)
	addq.l	#2,a1
	dbf	d7,.next_one
	rts

Flip_Bobs:
	lea	flip_table(pc),a2
	moveq	#0,d0
.bob_loop:
	tst.w	(a3)
	bmi.s	.end_of_list
	move.l	a0,-(sp)
	adda.w	(a3)+,a0
	move.w	(a3)+,d7
	subq.w	#1,d7
.y_loop:
	move.w	(a3),d6
	subq.w	#1,d6
.x_loop:
	move.b	(a0)+,d0
	move.b	(a2,d0.w),(a1,d6.w)
	dbf	d6,.x_loop
	adda.w	(a3),a1
	dbf	d7,.y_loop
	move.l	(sp)+,a0
	addq.l	#2,a3
	bra.s	.bob_loop

.end_of_list:
	rts


flip_table:
	dc.b	$00,$80,$40,$c0,$20,$a0,$60,$e0
	dc.b	$10,$90,$50,$d0,$30,$b0,$70,$f0

	dc.b	$08,$88,$48,$c8,$28,$a8,$68,$e8
	dc.b	$18,$98,$58,$d8,$38,$b8,$78,$f8

	dc.b	$04,$84,$44,$c4,$24,$a4,$64,$e4
	dc.b	$14,$94,$54,$d4,$34,$b4,$74,$f4

	dc.b	$0c,$8c,$4c,$cc,$2c,$ac,$6c,$ec
	dc.b	$1c,$9c,$5c,$dc,$3c,$bc,$7c,$fc

	dc.b	$02,$82,$42,$c2,$22,$a2,$62,$e2
	dc.b	$12,$92,$52,$d2,$32,$b2,$72,$f2

	dc.b	$0a,$8a,$4a,$ca,$2a,$aa,$6a,$ea
	dc.b	$1a,$9a,$5a,$da,$3a,$ba,$7a,$fa

	dc.b	$06,$86,$46,$c6,$26,$a6,$66,$e6
	dc.b	$16,$96,$56,$d6,$36,$b6,$76,$f6

	dc.b	$0e,$8e,$4e,$ce,$2e,$ae,$6e,$ee
	dc.b	$1e,$9e,$5e,$de,$3e,$be,$7e,$fe

	dc.b	$01,$81,$41,$c1,$21,$a1,$61,$e1
	dc.b	$11,$91,$51,$d1,$31,$b1,$71,$f1

	dc.b	$09,$89,$49,$c9,$29,$a9,$69,$e9
	dc.b	$19,$99,$59,$d9,$39,$b9,$79,$f9

	dc.b	$05,$85,$45,$c5,$25,$a5,$65,$e5
	dc.b	$15,$95,$55,$d5,$35,$b5,$75,$f5

	dc.b	$0d,$8d,$4d,$cd,$2d,$ad,$6d,$ed
	dc.b	$1d,$9d,$5d,$dd,$3d,$bd,$7d,$fd

	dc.b	$03,$83,$43,$c3,$23,$a3,$63,$e3
	dc.b	$13,$93,$53,$d3,$33,$b3,$73,$f3

	dc.b	$0b,$8b,$4b,$cb,$2b,$ab,$6b,$eb
	dc.b	$1b,$9b,$5b,$db,$3b,$bb,$7b,$fb

	dc.b	$07,$87,$47,$c7,$27,$a7,$67,$e7
	dc.b	$17,$97,$57,$d7,$37,$b7,$77,$f7

	dc.b	$0f,$8f,$4f,$cf,$2f,$af,$6f,$ef
	dc.b	$1f,$9f,$5f,$df,$3f,$bf,$7f,$ff

	*----------------------------------------------------------------------------
	*------------------------------ SCROLL CAMERA -------------------------------
	*----------------------------------------------------------------------------

Set_Player:
	move.w	Cue_Point(pc),d1
	add.w	d1,d1
	add.w	d1,d1
	move.l	Act_Cue_Table(pc),a0
	move.w	(a0,d1.w),d0
	move.w	2(a0,d1.w),d1
	move.w	d0,T_posX
	move.w	d1,T_posY

	sub.w	#150,d0
	sub.w	#90,d1
	cmp.w	#16,d0
	bge.s	.ok1
	moveq	#16,d0
.ok1:
	cmp.w	Scr_X_Max(a6),d0
	ble.s	.ok2
	move.w	Scr_X_Max(a6),d0
.ok2:
	cmp.w	#32,d1
	bge.s	.ok3
	moveq	#32,d1
.ok3:
	cmp.w	Scr_Y_Max(a6),d1
	ble.s	.ok4
	move.w	Scr_Y_Max(a6),d1
.ok4:
	move.w	d0,Scr_X_Level_Pos(a6)
	move.w	d1,Scr_Y_Level_Pos(a6)
	move.w	d0,Scr_X_Level_Pos_Old(a6)
	move.w	d1,Scr_Y_Level_Pos_Old(a6)
	sub.w	d0,T_posX
	sub.w	d1,T_posY
	move.w	Scr_Plane_Height(a6),d0
	divu	d0,d1
	swap	d1
	move.w	d1,Scr_Y_Play_Anf(a6)
	rts

Cue_Point:	dc.w	0
Act_Cue_Table:	dc.l	Cue_Table1


Motion_Control:
	move.l	Act_Scr_Structure,a6

	;X-Scroll-handler.

	clr.w	Scr_X_Speed(a6)		;Vorkomma-Anteil lschen.
	move.w	T_posX,d0
	cmp.w	#80,d0
	blt	.x_scroll_maxl
	cmp.w	#100,d0
	blt	.x_scroll_scaledl
	cmp.w	#220,d0
	bgt	.x_scroll_maxr
	cmp.w	#180,d0
	bgt	.x_scroll_scaledr

	cmp.w	#130,d0
	blt	.x_check_flag
	cmp.w	#150,d0
	bgt	.x_check_flag

.x_slowdown:
	;Scroll-Speed Verzgern bis auf 0.
	clr.b	Accel_Flag_X
	clr.l	T_Ispeed_X		;Interne Speed lschen.
	tst.l	Dol_Speed_X
	beq	.done_x
	bpl	.x_sub

	add.l	#$00004000,Dol_Speed_X
	bmi	.done_x
	clr.l	Dol_Speed_X
	bra	.done_x

.x_sub:
	sub.l	#$00004000,Dol_Speed_X
	bpl	.done_x
	clr.l	Dol_Speed_X
	bra	.done_x

.x_check_flag:
	tst.b	Accel_Flag_X
	beq	.x_slowdown
	bpl	.x_scroll_scaledr
.x_scroll_scaledl:
	bsr	.x_set_max
	move.b	#-1,Accel_Flag_X
	sub.l	#$00004000,Dol_Speed_X
	move.l	T_Ispeed_X,d0
	neg.l	d0
	cmp.l	Dol_Speed_X,d0
	ble	.done_x
	move.l	d0,Dol_Speed_X
	bra	.done_x
.x_scroll_scaledr:
	bsr	.x_set_max
	move.b	#1,Accel_Flag_X
	add.l	#$00004000,Dol_Speed_X
	move.l	T_Ispeed_X,d0
	cmp.l	Dol_Speed_X,d0
	bge	.done_x
	move.l	d0,Dol_Speed_X
	bra	.done_x

.x_set_max:
	tst.l	T_Ispeed_X
	beq.s	.x_do
	move.l	T_Mspeed_X,d0
	cmp.l	T_Ispeed_X,d0
	blt.s	.x_dont
.x_do:
	move.l	T_Mspeed_X,T_Ispeed_X
.x_dont:
	rts

.x_scroll_maxl:
	bsr.s	.x_set_max
	move.l	T_Ispeed_X,d0
	neg.l	d0
	move.l	d0,Dol_Speed_X
	bra.s	.done_x

.x_scroll_maxr:
	bsr.s	.x_set_max
	move.l	T_Ispeed_X,Dol_Speed_X
	bra	.done_x
.done_x:


	;Y-Scroll-handler.
	clr.w	Scr_Y_Speed(a6)		;Vorkomma-Anteil lschen.
	move.w	T_posY,d0
	cmp.w	#25,d0		;5
	blt	.y_scroll_maxl
	cmp.w	#35,d0		;15
	blt	.y_scroll_scaledl
	cmp.w	#50,d0		;25
	blt	.y_check_flag

	cmp.w	#150,d0
	bgt	.y_scroll_maxr
	cmp.w	#135,d0
	bgt	.y_scroll_scaledr
	cmp.w	#125,d0
	bgt	.y_check_flag

.y_slowdown:
	;Scroll-Speed Verzgern bis auf 0.
	clr.b	Accel_Flag_Y

	clr.l	T_Ispeed_Y

	tst.l	Dol_Speed_Y
	beq	.done_y
	bpl	.y_sub

	add.l	#$00008000,Dol_Speed_Y
	bmi	.done_y
	clr.l	Dol_Speed_Y
	bra	.done_y

.y_sub:
	sub.l	#$00008000,Dol_Speed_Y
	bpl	.done_y
	clr.l	Dol_Speed_Y
	bra	.done_y

.y_check_flag:
	tst.b	Accel_Flag_Y
	beq	.y_slowdown
	bpl	.y_scroll_scaledr
.y_scroll_scaledl:
	bsr	.y_set_max
	move.b	#-1,Accel_Flag_Y
	sub.l	#$00008000,Dol_Speed_Y
	move.l	T_Ispeed_Y,d0
	neg.l	d0
	cmp.l	Dol_Speed_Y,d0
	ble	.done_y
	move.l	d0,Dol_Speed_Y
	bra	.done_y
.y_scroll_scaledr:
	bsr	.y_set_max
	move.b	#1,Accel_Flag_Y
	add.l	#$00008000,Dol_Speed_Y
	move.l	T_Ispeed_Y,d0
	cmp.l	Dol_Speed_Y,d0
	bge	.done_y
	move.l	d0,Dol_Speed_Y
	bra	.done_y

.y_set_max:
	tst.l	T_Ispeed_Y
	beq.s	.y_do
	move.l	T_Mspeed_Y,d0
	cmp.l	T_Ispeed_Y,d0
	blt.s	.y_dont
.y_do:
	move.l	T_Mspeed_Y,T_Ispeed_Y
.y_dont:
	rts

.y_scroll_maxl:
	bsr	.y_set_max
	move.l	T_Ispeed_Y,d0
	neg.l	d0
	move.l	d0,Dol_Speed_Y
	bra.s	.done_y

.y_scroll_maxr:
	bsr	.y_set_max
	move.l	T_Ispeed_Y,Dol_Speed_Y
	bra	.done_y
.done_y:

	;Dolly-speed auf den Screen addieren.

	move.w	Scr_X_Fix(a6),d0
	beq.s	.x_no_fix
	clr.l	Scr_X_Speed(a6)
	moveq	#-1,d1
	cmp.w	Scr_X_Level_Pos(a6),d0
	beq.s	.x_fix
	blt.s	.x_set
	moveq	#1,d1
.x_set:
	move.w	d1,Scr_X_Speed(a6)
	cmp.w	#-4,T_posX
	bge.s	.not_left
	move.w	#-4,T_posX
.not_left:
	cmp.w	#280,T_posX
	ble.s	.x_fix
	move.w	#280,T_posX
	bra.s	.x_fix
.x_no_fix:
	move.l	Dol_Speed_X(pc),d0
	add.l	d0,Scr_X_Speed(a6)	;Die Anzahl der zu scrollenden Pixel berechnen.
.x_fix:
	move.w	Scr_Y_Fix(a6),d0
	beq.s	.y_no_fix
	clr.l	Scr_Y_Speed(a6)
	moveq	#-1,d1
	cmp.w	Scr_Y_Level_Pos(a6),d0
	beq.s	.y_fix
	blt.s	.y_set
	moveq	#1,d1
.y_set:
	move.w	d1,Scr_Y_Speed(a6)
	bra.s	.y_fix
.y_no_fix:

	move.l	Dol_Speed_Y(pc),d0
	add.l	d0,Scr_Y_Speed(a6)	;Die Anzahl der zu scrollenden Pixel berechnen.
.y_fix:
	rts

Dol_Speed_X:	dc.l	0
Dol_Speed_Y:	dc.l	0
Accel_Flag_X:	dc.b	0
Accel_Flag_Y:	dc.b	0
T_Ispeed_X:	dc.l	0
T_Ispeed_Y:	dc.l	0

T_lifes:	dc.b	$10
T_score:	dc.b	$00,$00,$00
T_time:		dc.w	0
T_wenergy:	dc.w	32
T_energy:	dc.b	64
T_bombs:	dc.b	0

O_lifes:	dc.b	$ff
O_score:	dc.b	$ff,$ff,$ff
O_time:		dc.w	0
O_energy:	dc.b	0
O_bombs:	dc.b	3
O_wenergy:	dc.b	32

	even

add_score:
	lea	help,a0
	lea	T_score+3(pc),a1
	move.l	d0,(a0)+
	move.w	#0,ccr
	abcd	-(a0),-(a1)
	abcd	-(a0),-(a1)
	abcd	-(a0),-(a1)
	rts

sub_energy:
	sub.b	d0,T_energy
	bpl.s	.ok
	clr.b	T_energy
.ok:
	rts

show_score_line:
	subq.b	#1,.verz
	bpl.s	.no_new
	move.b	#50,.verz
	addq.b	#1,T_bombs
	and.b	#7,T_bombs

.no_new:
	lea	Score+3680,a2		;Font
	moveq	#0,d0
	move.b	T_lifes,d0
	cmp.b	O_lifes,d0
	beq.s	.no_lifes
	move.b	d0,O_lifes
	lea	Score+(8*38)+5,a0
	bsr	print_byte
.no_lifes:
	moveq	#0,d0
	move.b	T_score,d0
	cmp.b	O_score,d0
	beq.s	.no_score1
	move.b	d0,O_score
	lea	Score+(8*38)+9,a0
	bsr	print_byte
.no_score1:
	moveq	#0,d0
	move.b	T_score+1,d0
	cmp.b	O_score+1,d0
	beq.s	.no_score2
	move.b	d0,O_score+1
	lea	Score+(8*38)+11,a0
	bsr	print_byte
.no_score2:
	moveq	#0,d0
	move.b	T_score+2,d0
	cmp.b	O_score+2,d0
	beq.s	.no_score3
	move.b	d0,O_score+2
	lea	Score+(8*38)+13,a0
	bsr	print_byte
.no_score3:
	moveq	#0,d0
	move.b	T_time,d0
	cmp.b	O_time,d0
	beq.s	.no_time
	move.b	d0,O_time
	lea	Score+(8*38)+18,a0
	bsr	print_byte
.no_time:
	move.w	#38-2,bltdmod(a5)
.bomb_loop
	move.b	T_bombs,d0
	cmp.b	O_bombs,d0
	beq.s	.no_bomb
	bgt.s	.more
	cmp.b	#3,T_bombs
	bge.s	.set_bombanz
	cmp.b	#3,O_bombs
	ble.s	.ok
	move.b	#3,O_bombs
.ok:
	moveq	#0,d1
	move.b	O_bombs,d1
	subq.b	#1,d1
	add.w	d1,d1
	neg.l	d1
	add.l	#Score+(7*38)+26,d1
	bsr	.clr_bomb
	subq.b	#1,O_bombs
	bra.s	.bomb_loop
.more:
	cmp.b	#3,O_bombs
	bge.s	.set_bombanz
	addq.b	#1,O_bombs
	moveq	#0,d1
	move.b	O_bombs,d1
	subq.b	#1,d1
	add.w	d1,d1
	neg.l	d1
	add.l	#Score+(7*38)+26,d1

	move.l	#Score+3680+320,d0	;Source
	bsr	.set_bomb
	bra.s	.bomb_loop
.set_bombanz:
	move.b	T_bombs,O_bombs
.no_bomb:
	move.b	T_energy,d0
	cmp.b	O_energy,d0
	beq.s	.no_energy
	blt.s	.lower
	bsr	.add_energy
	bra.s	.no_energy
.lower:
	bsr	.sub_energy
.no_energy:
	move.w	T_wenergy,d0
	lsr.w	#4,d0
	cmp.b	O_wenergy,d0
	beq.s	.no_wenergy
	blt.s	.wlower
	bsr	.add_wenergy
	bra.s	.no_wenergy
.wlower:
	bsr	.sub_wenergy
.no_wenergy:
	rts

.add_energy:
	addq.b	#1,O_energy
	moveq	#0,d0
	move.b	O_energy,d0
	move.b	d0,d1
	lsr.b	#3,d0
	move.l	d0,a1
	add.l	#Score+3680+320+128+1,a1
	add.l	#Score+(8*38)+29,d0
	move.l	d0,a0
	moveq	#0,d2
	move.b	#$ff,d2
	and.w	#7,d1
	bne.s	.do_shift
	subq.l	#1,a1
	subq.l	#1,a0
	moveq	#0,d2
	bra.s	.no_shift
.do_shift:
	lsr.w	d1,d2
.no_shift:
	move.b	d2,d3
	not.b	d3
	moveq	#0,d0
	or.b	d2,d0
	move.b	d0,(a0)
	move.b	d0,912*3(a0)
	and.b	d3,d0
	move.b	d0,912(a0)
	move.b	d0,912*2(a0)
	move.b	912*0(a0),6*38(a0)
	move.b	912*1(a0),912*1+6*38(a0)
	move.b	912*2(a0),912*2+6*38(a0)
	move.b	912*3(a0),912*3+6*38(a0)
	add.l	#38,a0
	move.b	(a1),d0
	or.b	d2,d0
	move.b	d0,(a0)
	move.b	10(a1),d0
	and.b	d3,d0
	move.b	d0,912(a0)
	move.b	20(a1),d0
	and.b	d3,d0
	move.b	d0,912*2(a0)
	move.b	30(a1),d0
	or.b	d2,d0
	move.b	d0,912*3(a0)
	bra	.copy_line

.sub_energy:
	subq.b	#1,O_energy
	moveq	#0,d0
	move.b	O_energy,d0
	move.b	d0,d1
	lsr.b	#3,d0
	add.l	#Score+(8*38)+29,d0
	move.l	d0,a0
	moveq	#0,d2
	move.b	#$ff,d2
	and.w	#7,d1
	lsr.w	d1,d2
	move.b	d2,d3
	not.b	d3
	or.b	d2,(a0)
	and.b	d3,912(a0)
	and.b	d3,912*2(a0)
	or.b	d2,912*3(a0)
	move.b	912*0(a0),6*38(a0)
	move.b	912*1(a0),912*1+6*38(a0)
	move.b	912*2(a0),912*2+6*38(a0)
	move.b	912*3(a0),912*3+6*38(a0)
	add.l	#38,a0
	or.b	d2,(a0)
	and.b	d3,912(a0)
	and.b	d3,912*2(a0)
	or.b	d2,912*3(a0)
.copy_line:
	move.b	(a0),d0
	move.b	d0,38(a0)
	move.b	d0,38*2(a0)
	move.b	d0,38*3(a0)
	move.b	d0,38*4(a0)
	move.b	912(a0),d0
	move.b	d0,912+38(a0)
	move.b	d0,912+38*2(a0)
	move.b	d0,912+38*3(a0)
	move.b	d0,912+38*4(a0)
	move.b	912*2(a0),d0
	move.b	d0,912*2+38(a0)
	move.b	d0,912*2+38*2(a0)
	move.b	d0,912*2+38*3(a0)
	move.b	d0,912*2+38*4(a0)
	move.b	912*3(a0),d0
	move.b	d0,912*3+38(a0)
	move.b	d0,912*3+38*2(a0)
	move.b	d0,912*3+38*3(a0)
	move.b	d0,912*3+38*4(a0)
	rts

.add_wenergy:
	addq.b	#1,O_wenergy
	moveq	#0,d0
	move.b	O_wenergy,d0
	move.b	d0,d1
	lsr.b	#3,d0
	add.l	#Score+(15*38)+29,d0
	move.l	d0,a0
	moveq	#0,d2
	move.b	#$ff,d2
	and.w	#7,d1
	bne.s	.do_wshift
	subq.l	#1,a1
	subq.l	#1,a0
	moveq	#0,d2
	bra.s	.no_wshift
.do_wshift:
	lsr.w	d1,d2
.no_wshift:
	move.b	d2,d3
	not.b	d3
	moveq	#0,d0
	or.b	d2,d0
	move.b	d0,(a0)
	move.b	d0,912*3(a0)
	and.b	d3,d0
	move.b	d0,912(a0)
	move.b	d0,912*2(a0)
	move.b	912*0(a0),6*38(a0)
	move.b	912*1(a0),912*1+6*38(a0)
	move.b	912*2(a0),912*2+6*38(a0)
	move.b	912*3(a0),912*3+6*38(a0)
	add.l	#38,a0
	moveq	#-1,d0
	or.b	d2,d0
	move.b	d0,(a0)
	moveq	#0,d0
	and.b	d3,d0
	move.b	d0,912(a0)
	move.b	d0,912*2(a0)
	or.b	d2,d0
	move.b	d0,912*3(a0)
	bra	.copy_line

.sub_wenergy:
	subq.b	#1,O_wenergy
	moveq	#0,d0
	move.b	O_wenergy,d0
	move.b	d0,d1
	lsr.b	#3,d0
	add.l	#Score+(15*38)+29,d0
	move.l	d0,a0
	moveq	#0,d2
	move.b	#$ff,d2
	and.w	#7,d1
	lsr.w	d1,d2
	move.b	d2,d3
	not.b	d3
	or.b	d2,(a0)
	and.b	d3,912(a0)
	and.b	d3,912*2(a0)
	or.b	d2,912*3(a0)
	move.b	912*0(a0),6*38(a0)
	move.b	912*1(a0),912*1+6*38(a0)
	move.b	912*2(a0),912*2+6*38(a0)
	move.b	912*3(a0),912*3+6*38(a0)
	add.l	#38,a0
	or.b	d2,(a0)
	and.b	d3,912(a0)
	and.b	d3,912*2(a0)
	or.b	d2,912*3(a0)
	bra	.copy_line

.clr_bomb:
	move.w	#$01ff,bltcon0(a5)
	move.l	d1,bltdpth(a5)
	move.w	#64*16+1,bltsize(a5)
	waitblt
	add.l	#38*24,d1
	move.w	#$0100,bltcon0(a5)
	move.l	d1,bltdpth(a5)
	move.w	#64*16+1,bltsize(a5)
	waitblt
	add.l	#38*24,d1
	move.l	d1,bltdpth(a5)
	move.w	#64*16+1,bltsize(a5)
	waitblt
	add.l	#38*24,d1
	move.w	#$01ff,bltcon0(a5)
	move.l	d1,bltdpth(a5)
	move.w	#64*16+1,bltsize(a5)
	waitblt
	rts

.set_bomb:
	move.l	d0,bltapth(a5)
	move.w	#$09f0,bltcon0(a5)
	move.l	#-1,bltafwm(a5)
	move.w	#0,bltamod(a5)
	moveq	#3,d7
.bloop:
	move.l	d1,bltdpth(a5)
	move.w	#64*16+1,bltsize(a5)
	waitblt
	add.l	#38*24,d1
	dbf	d7,.bloop
	rts

.verz:	dc.w	0

print_byte:
	move.w	d0,-(sp)
	lsr.b	#4,d0
	bsr	pr_nibble
	move.w	(sp)+,d0
	and.b	#$0f,d0
pr_nibble:
	asl.w	#5,d0
	lea	(a2,d0.w),a1
	move.b	(a1)+,912*3(a0)
	move.b	(a1)+,(912*3)+(38*1)(a0)
	move.b	(a1)+,(912*3)+(38*2)(a0)
	move.b	(a1)+,(912*3)+(38*3)(a0)
	move.b	(a1)+,(912*3)+(38*4)(a0)
	move.b	(a1)+,(912*3)+(38*5)(a0)
	move.b	(a1)+,(912*3)+(38*6)(a0)
	move.b	(a1)+,(912*3)+(38*7)(a0)
	move.b	(a1)+,(912*3)+(38*8)(a0)
	move.b	(a1)+,(912*3)+(38*9)(a0)
	move.b	(a1)+,(912*3)+(38*10)(a0)
	move.b	(a1)+,(912*3)+(38*11)(a0)
	move.b	(a1)+,(912*3)+(38*12)(a0)
	move.b	(a1)+,(912*3)+(38*13)(a0)
	move.b	(a1)+,(912*3)+(38*14)(a0)
	move.b	(a1)+,(912*3)+(38*15)(a0)

	move.b	(a1)+,(a0)
	move.b	(a1)+,(912*0)+(38*1)(a0)
	move.b	(a1)+,(912*0)+(38*2)(a0)
	move.b	(a1)+,(912*0)+(38*3)(a0)
	move.b	(a1)+,(912*0)+(38*4)(a0)
	move.b	(a1)+,(912*0)+(38*5)(a0)
	move.b	(a1)+,(912*0)+(38*6)(a0)
	move.b	(a1)+,(912*0)+(38*7)(a0)
	move.b	(a1)+,(912*0)+(38*8)(a0)
	move.b	(a1)+,(912*0)+(38*9)(a0)
	move.b	(a1)+,(912*0)+(38*10)(a0)
	move.b	(a1)+,(912*0)+(38*11)(a0)
	move.b	(a1)+,(912*0)+(38*12)(a0)
	move.b	(a1)+,(912*0)+(38*13)(a0)
	move.b	(a1)+,(912*0)+(38*14)(a0)
	move.b	(a1)+,(912*0)+(38*15)(a0)
	addq.l	#1,a0
	rts

init_score_line:
	move.l	#Score+(8*38)+30,d0
	move.w	#38-8,bltdmod(a5)
	move.w	#$01ff,bltcon0(a5)
	move.l	d0,bltdpth(a5)
	move.w	#64*14+4,bltsize(a5)
	waitblt
	move.w	#$0100,bltcon0(a5)
	add.l	#912,d0
	move.l	d0,bltdpth(a5)
	move.w	#64*14+4,bltsize(a5)
	waitblt
	add.l	#912,d0
	move.l	d0,bltdpth(a5)
	move.w	#64*14+4,bltsize(a5)
	waitblt
	move.w	#$01ff,bltcon0(a5)
	add.l	#912,d0
	move.l	d0,bltdpth(a5)
	move.w	#64*14+4,bltsize(a5)
	waitblt

	move.l	#Score+(8*38)+29,a0
	moveq	#13,d7
.loop:
	st	(a0)
	sf	912(a0)
	sf	912*2(a0)
	st	912*3(a0)
	add.l	#38,a0
	dbf	d7,.loop

	clr.b	O_energy
	clr.b	O_wenergy

	moveq	#-1,d0
	move.l	d0,O_lifes
	move.b	d0,O_time
	move.b	#3,O_bombs

	bra	show_score_line

	*----------------------------------------------------------------------------
	*----------------------------- BG Anim System -------------------------------
	*----------------------------------------------------------------------------
BG_Anim:
	lea	AnimList(pc),a0
.loop:
	move.l	(a0),d0
	beq	.next
	bmi	.end

	move.w	Scr_Scrolled_X(a6),d1
	sub.w	d1,AnimXpos(a0)
	move.w	Scr_Scrolled_Y(a6),d1
	sub.w	d1,AnimYpos(a0)

	move.l	AnimRout(a0),a1
	movem.l	a0/d0,-(sp)
	jsr	(a1)
	movem.l	(sp)+,a0/d0
	bne	.next

	cmp.w	#-16,AnimXpos(a0)
	blt.s	.test
	cmp.w	#304,AnimXpos(a0)
	bge.s	.test
	cmp.w	#-16,AnimYpos(a0)
	blt.s	.test
	cmp.w	#208,AnimYpos(a0)
	bge.s	.test

	add.l	Scr_Supply_Field(a6),d0

	moveq	#0,d1
	move.w	AnimChar(a0),d1
	lsl.w	#7,d1

	add.l	#BG_Chars,d1
	move.l	d1,bltapth(a5)
	move.w	#0,bltamod(a5)
	move.l	d0,bltdpth(a5)
	move.w	#planeb-2,bltdmod(a5)
	move.w	#$09f0,bltcon0(a5)
	move.w	#64*16*4+1,bltsize(a5)
	waitblt
.next:
	lea	AnimEntryLen(a0),a0
	bra	.loop
.end:
	rts

.test:
	move.w	AnimXpos(a0),d0
	bpl.s	.xpos
	neg.w	d0
	bra.s	.xneg
.xpos:
	sub.w	#304,d0
.xneg:
	move.w	AnimYpos(a0),d1
	bpl.s	.ypos
	neg.w	d1
	bra.s	.yneg
.ypos:
	sub.w	#208,d1
.yneg:
	cmp.w	#128,d0
	bgt.s	.out
	cmp.w	#128,d1
	blt.s	.next
.out:
Out_Anim:
	clr.l	AnimSAdr(a0)
	move.l	AnimArea(a0),a1
	clr.b	(a1)			;Wiedereintragen!
	rts

	;d0 = Info
	;d1 = X-Pos
	;d2 = Y-Pos

Search_Anim_Entry:
	lea	AnimList(pc),a4
	lea	AnInfoList(pc),a3
.search:
	move.l	(a4),d7
	bmi.s	.insert
	beq.s	.insert
	lea	AnimEntryLen(a4),a4
	bra	.search
.insert:
	sub.w	Scr_Y_Level_Pos(a6),d2
	move.w	d1,d3
	sub.w	Scr_X_Level_Pos(a6),d3
	move.w	d3,AnimXpos(a4)
	move.w	d2,AnimYpos(a4)
	and.w	#127,d0
	asl.w	#2,d0		;*4
	move.l	(a3,d0.w),AnimRout(a4)
	clr.w	AnimChar(a4)

	add.w	Scr_Y_Play_Anf(a6),d2
	bpl.s	.not_neg
	add.w	Scr_Plane_Height(a6),d2
	bra.s	.not_over
.not_neg:
	cmp.w	Scr_Plane_Height(a6),d2
	blt.s	.not_over
	sub.w	Scr_Plane_Height(a6),d2
.not_over:
	mulu	Scr_Plane_Width(a6),d2
	asr.w	#3,d1
	and.w	#$fffe,d1
	ext.l	d1
	add.l	d1,d2
	move.l	d2,AnimSAdr(a4)

	move.l	a1,AnimArea(a4)

	tst.l	d7
	beq.s	.out
	move.l	d7,AnimEntryLen(a4)
.out:
	rts


AnInfoList:
	dc.l	Flashlight

	rsreset
AnimSAdr	rs.l	1
AnimXpos	rs.w	1
AnimYpos	rs.w	1
AnimRout	rs.l	1
AnimChar	rs.w	1
AnimArea	rs.l	1
AnimEntryLen	rs.l	0

MaxAnim	= 10

AnimList:	dcb.b	AnimEntryLen*MaxAnim,-1

Flashlight:
	lea	Flashlight_Handler(pc),a1
	tst.w	Flash_ident
	bpl.s	.no_add
	bsr	AddHandler
	clr.w	Flash_ident
.no_add:
	addq.w	#1,Flash_ident
	move.w	Flash_Char(pc),d0
	bmi.s	.out
	move.w	d0,AnimChar(a0)
	moveq	#0,d7
.out:
	rts

Flashlight_Handler:
	subq.w	#1,Flash_ident
	bmi	.kill
	subq.w	#1,Flash_verz
	bpl.s	.no_new
	cmp.w	#4,Flash_Char
	beq.s	.waiting
	tst.w	Flash_Char
	bmi.s	.waiting
	move.w	#3,Flash_verz
	addq.w	#1,Flash_Char
	cmp.w	#4,Flash_Char
	bne	.no_new
	clr.w	Flash_Char
.waiting:
	subq.w	#1,Flash_verz2
	bpl.s	.no_new
	tst.w	Flash_Char
	bmi.s	.start_again
	cmp.w	#4,Flash_Char
	beq.s	.stop
	move.w	#0,Flash_verz2
	move.w	#4,Flash_Char
	bra.s	.no_new
.stop:
	move.w	#300,Flash_verz2
	move.w	#-1,Flash_Char
	bra.s	.no_new
.start_again:
	move.w	#15,Flash_verz2
	clr.w	Flash_Char
.no_new:
	clr.w	Flash_ident
	rts

.kill:
	move.l	#Return,-4(a0)
	rts

Flash_ident:	dc.w	-1
Flash_Char:	dc.w	0
Flash_verz:	dc.w	0
Flash_verz2:	dc.w	0

	*----------------------------------------------------------------------------
	*----------------------------- Special Handler ------------------------------
	*----------------------------------------------------------------------------
ExecuteHandler:
	lea	Handler_List(pc),a0
	moveq	#Max_Handler-1,d7
.loop:
	move.l	(a0)+,a1
	movem.l	a0/d7,-(sp)
	jsr	(a1)
	movem.l	(sp)+,a0/d7
	dbf	d7,.loop
	rts

AddHandler:
	lea	Handler_List(pc),a2
	moveq	#Max_Handler-1,d7
.search:
	cmp.l	(a2),a1
	beq.s	.dont_add
	addq.l	#4,a2
	dbf	d7,.search

	lea	Handler_List(pc),a2
	move.l	#Return,d0
	moveq	#Max_Handler-1,d7
.search2:
	cmp.l	(a2),d0
	beq.s	.add
	addq.l	#4,a2
	dbf	d7,.search2
.dont_add:
	rts
.add:
	move.l	a1,(a2)
	rts

Max_Handler	= 4
Handler_List:
		dcb.l	Max_Handler,Return

	*----------------------------------------------------------------------------
	*------------------------------- Bob System ---------------------------------
	*----------------------------------------------------------------------------

RestoreBobs:
	tst.w	Scr_Screen_num(a6)
	beq	.use_list1
	lea	Rest_List2,a0
	bra.s	.use_list2
.use_list1:
	lea	Rest_List1,a0
.use_list2:
	move.l	a0,Rest_Pointer			;Hierhin die neuen Requests eintragen.

	move.w	Scr_Supply_Field(a6),bltdpth(a5)
	move.w	Scr_Refresh_Field(a6),bltapth(a5)

	move.l	#-1,bltafwm(a5)
	move.w	RestFunction,bltcon0(a5)
	move.w	#$0000,bltcon1(a5)

	bra	.first
.loop:
	move.w	(a0)+,d1
	move.w	d1,bltamod(a5)
	move.w	d1,bltdmod(a5)
	move.l	(a0)+,d2
	move.w	d2,bltdptl(a5)
	move.w	d2,bltaptl(a5)
	move.w	d0,bltsize(a5)
.bwait0:
	btst	#14,dmaconr(a5)
	bne	.bwait0
.first:
	move.w	(a0)+,d0
	bne	.loop
.last:
	rts

RestFunction:	dc.w	$09f0
Rest_Pointer:	dc.l	0

Blit_Rope:
	tst.b	T_rope
	beq	.out
	tst.b	T_targeting
	bmi.s	.out
	tst.b	R_blink
	beq.s	.dont_blink
	subq.b	#1,R_blvz
	bpl.s	.dont_blink
	move.b	#0,R_blvz
	tst.b	Scr_Screen_num(a6)
	bne.s	.dont_blink
	move.b	#2,R_blvz
	eor.b	#$80,R_blink
.dont_blink:

	move.l	Scr_Supply_Field(a6),d0
	move.l	d0,bltdpth(a5)
	move.l	d0,bltcpth(a5)
	lea	dmaconr(a5),a4
	move.l	Rest_Pointer,a3
	lea	rope_coords(pc),a2

	tst.b	T_targeting
	bne	.skip0

	tst.w	Scr_Screen_num(a6)
	beq.s	.skip0
	addq.l	#4,a2
.skip0:
	moveq	#7,d7
.rope_loop:
	move.w	(a2)+,d0
	move.w	(a2)+,d1
	bmi.s	.end
	bsr.s	BlitRopeBall
	addq.l	#4,a2
.dont_show:
	dbf	d7,.rope_loop
.end:
	move.l	a3,Rest_Pointer
	clr.w	(a3)
.out:
	tst.b	R_blink
	bpl.s	.no_off
	tst.w	Scr_Screen_num(a6)
	beq.s	.no_off
	eor.b	#$80,R_blink
.no_off:
	rts


BlitRopeBall: 
	move.l	#RopeBob,d2
	tst.b	R_blink
	bpl.s	.no_blink
	move.l	#RopeBob+Rmsk01,d2
.no_blink:
	move.l	d2,bltbpth(a5)
	move.l	#RopeBob+Rmsk01,bltapth(a5)

	move.w	Scr_X_Level_Pos(a6),d2
	and.w	#15,d2
	add.w	d2,d0
	move.w	d0,d2
	lsr.w	#3,d0
	and.l	#$fffe,d0

	move.w	Scr_Plane_Height(a6),d3
	sub.w	Scr_Y_Play_Anf(a6),d3
	cmp.w	d3,d1
	bge.s	.under_wrap

	subq.w	#8,d3
	cmp.w	d3,d1
	bgt	.in_wrap

	;Komplett drber.

	add.l	Scr_Blt_Adr1(a6),d0
	bra.s	.goon
.under_wrap:

	;Komplett drunter.

	add.l	Scr_Blt_Adr2(a6),d0
	sub.w	d3,d1
.goon:
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d0

	move.l	d0,4(a3)

	and.w	#15,d2
	cmp.w	#7,d2
	blt	.blit_small

	move.l	#$ffff0000,bltafwm(a5)
	moveq	#planeb-4,d3
	move.l	#$fffefffe,d4
	move.w	#64*8*4+2,d5
	bra.s	.blit_it
.blit_small:
	move.l	#-1,bltafwm(a5)
	moveq	#planeb-2,d3
	moveq	#0,d4
	move.w	#64*8*4+1,d5
.blit_it:
	ror.w	#4,d2
	move.w	d2,bltcon1(a5)
	or.w	#$0fca,d2
	move.w	d2,bltcon0(a5)

	add.w	Scr_Supply_Field+2(a6),d0

	move.w	d0,bltdpth+2(a5)
	move.w	d0,bltcpth+2(a5)
	move.w	d3,bltdmod(a5)
	move.w	d3,bltcmod(a5)
	move.w	d3,2(a3)
	move.l	d4,bltbmod(a5)
	move.w	d5,bltsize(a5)
.bwait0:
	btst	#14,(a4)
	bne	.bwait0
	move.w	d5,(a3)

	addq.l	#8,a3

	rts
.in_wrap:
	move.w	d3,d5
	sub.w	d1,d5
	addq.w	#8,d5

	move.l	d0,-(sp)
	add.l	Scr_Blt_Adr1(a6),d0	;Adresse fr obere Hlfte
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d0

	move.l	d0,4(a3)
	asl.w	#8,d5

	and.w	#15,d2
	cmp.w	#7,d2
	blt	.blit_small2

	move.l	#$ffff0000,bltafwm(a5)
	moveq	#planeb-4,d3
	move.l	#$fffefffe,d4
	or.w	#2,d5
	bra.s	.blit_it2
.blit_small2:
	move.l	#-1,bltafwm(a5)
	moveq	#planeb-2,d3
	moveq	#0,d4
	or.w	#1,d5
.blit_it2:
	ror.w	#4,d2
	move.w	d2,bltcon1(a5)
	or.w	#$0fca,d2
	move.w	d2,bltcon0(a5)

	add.w	Scr_Supply_Field+2(a6),d0

	move.w	d0,bltdpth+2(a5)
	move.w	d0,bltcpth+2(a5)
	move.w	d3,bltdmod(a5)
	move.w	d3,bltcmod(a5)
	move.w	d3,2(a3)
	move.l	d4,bltbmod(a5)
	move.w	d5,bltsize(a5)
.bwait1:
	btst	#14,(a4)
	bne	.bwait1
	move.w	d5,(a3)

	addq.l	#8,a3
	move.w	d3,2(a3)

	move.l	(sp)+,d0
	add.l	Scr_Blt_Adr2(a6),d0
	move.l	d0,4(a3)
	add.w	Scr_Supply_Field+2(a6),d0

	move.w	d0,bltdpth+2(a5)
	move.w	d0,bltcpth+2(a5)
	move.w	d5,d6
	and.w	#$003f,d6
	and.w	#$ffc0,d5
	or.w	#64*8*4,d6
	sub.w	d5,d6
	move.w	d6,bltsize(a5)
.bwait2:
	btst	#14,(a4)
	bne	.bwait2
	move.w	d6,(a3)

	addq.l	#8,a3


	rts

	;Rope-bobs

Rbob00	= $000000
Rmsk01	= $000040

	*----------------------------------------------------------------------------
	*----------------------------- PLAYER CONTROL -------------------------------
	*----------------------------------------------------------------------------

Start_dieing:
	st	T_dieing
	move.l	#die_tab,T_speedY
	clr.w	death_vz
	sf	T_flash
	clr.w	T_ansize
	clr.w	T_anpos

Handle_death:
	tst.b	T_dieing
	bpl.s	.exploding
	sf	T_flash			;No flickering
	subq.w	#1,death_vz		;Phase over ?
	bpl.s	.no_new
	move.l	T_speedY,a0		;Yes, set next anim.-phase
	move.w	(a0)+,d0
	bmi.s	.anim_over

	move.w	d0,T_anim
	move.w	(a0)+,death_vz
	move.l	a0,T_speedY
	bra	T_handle_end
.anim_over:
	neg.b	T_dieing
	move.w	#60,T_speedY
	st	T_flash
.no_new:
	bra	T_handle_end

.exploding:
	subq.w	#1,T_speedY
	bmi.s	.die

	subq.w	#1,death_vz
	bpl	T_handle_end
	addq.w	#8,death_vz

	bsr	rnd
	andi.w	#63,d0
	add.w	T_posY,d0
	sub.w	#32,d0
	move.w	d0,d2
	bsr	rnd
	and.w	#31,d0
	add.w	T_posX,d0
	sub.w	#16,d0
	move.w	d0,d1
	jsr	Start_Explo2

	bra	T_handle_end

.die:
	tst.b	T_dead
	bne	T_handle_end
	move.b	#50,T_dead			;End of death-show
	bra	T_handle_end

fast_die:
	move.b	#1,T_dead
	bra	T_handle_end

die_tab:
	dc.w	25,8,26,6,27,12,-1

death_vz:	dc.w	0

Handle_Player:
	tst.w	half_pixel
	beq.s	.no_shield
	tst.b	T_shield
	beq.s	.no_shield
	subq.b	#1,T_shield
.no_shield:
	move.l	Act_Scr_Structure,a6

	move.w	Scr_Scrolled_X(a6),d0	;Player mitscrollen X
	sub.w	d0,T_posX
	sub.w	d0,R_xpos

	move.w	Scr_Scrolled_Y(a6),d0	;mitscrollen Y
	sub.w	d0,T_posY
	sub.w	d0,R_ypos

	move.w	T_posX,T_oldX
	move.w	T_posY,T_oldY

	tst.b	smart_bomb
	beq	.no_bomb
	move.b	#1<<DOWN,JoyFlags	;Hinknien, wenn die Smartbomb explodiert!
.no_bomb:

	tst.b	T_dieing
	bne	Handle_death

	cmp.w	#220,T_posY
	bgt	fast_die

	tst.b	T_wheel			;Player rollt als Wheel rum.
	bne	T_do_wheel

	tst.b	T_force_jump
	beq.s	.no_jump
	bmi.s	.start_force
	bset	#JUMP,JoyFlags
	subq.b	#1,T_force_jump
	bra.s	.no_jump
.start_force:
	move.b	#10,T_force_jump
	bset	#JUMP,JoyFlags
	bra	start_jump
.no_jump:

	tst.b	T_hit
	bne.s	.no_button
	bsr	T_handle_button		;Kmmert sich um den kmmerlichen einen Button!
.no_button:
	tst.b	T_swing
	bne	T_do_swing

	tst.b	T_state			;Player Status
	bmi	T_falling
	bne	T_jumping

	tst.b	T_rope
	bne	T_handle_rope
no_target:
	bsr	Test_feet
	beq	start_fall

	tst.b	T_energy
	beq	Start_dieing

	tst.b	T_hit
	bne.s	.no_duck
	btst	#DOWN,JoyFlags
	bne	T_duck
.no_duck:
	move.w	T_forceY,d0
	beq.s	.nonew
	bpl.s	.oky
	neg.w	d0
.oky:
	move.w	d0,T_Mspeed_Y
.nonew:
	move.w	#23,T_newanim
	bsr	T_move_x
	beq	.no_xmove
	move.l	#T_walk_tab,T_antab
	move.w	#8,T_ansize
	move.w	#3,T_anspeed
	bra	.xmove
.no_xmove:
	move.w	T_newanim,T_anim
	clr.w	T_ansize
	clr.w	T_anpos
.xmove:
	move.b	T_hit,d0
	or.b	T_rejump,d0
	beq	.ask_start
	btst	#JUMP,JoyFlags
	sne	T_rejump
	bra	T_handle_end

.ask_start:
	btst	#JUMP,JoyFlags
	bne	start_jump
	bra	T_handle_end


T_duck:
	move.w	#22,T_anim
	clr.w	T_ansize
	clr.b	T_rejump
	tst.b	T_rope
	bne.s	.dont_ask
	tst.w	T_wenergy
	beq	.dont_ask
	tst.b	G_keytab+2
	bpl.s	.start_wheel
	cmp.b	#$10,G_keycode
	bne.s	.dont_ask
	st	smart_bomb
.dont_ask:
	move.w	T_forceX,d6
	bsr	T_move_no_dir
	btst	#LEFT,JoyFlags
	bne	.left
	btst	#RIGHT,JoyFlags
	bne	.right
	bra	T_handle_end

.left:
	clr.w	T_face
	bra	T_handle_end

.right:
	move.w	#-1,T_face
	bra	T_handle_end

.start_wheel:
	st	G_keytab+2
	st	T_wheel
	clr.l	T_speedY
	bra	T_handle_end

Test_feet:
	tst.b	T_stand
	bne	.out2
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	add.w	#31,d1
	movem.w	d0-d1,-(sp)
	bsr	check_kollision
	bne.s	.out
	movem.w	(sp),d0-d1
	subq.w	#8,d0
	bsr	check_kollision
	bne.s	.out
	movem.w	(sp)+,d0-d1
	addq.w	#8,d0
	bsr	check_kollision
	rts
.out:
	movem.w	(sp)+,d0-d1
.out2:
	rts

T_handle_rope:
	tst.b	T_targeting
	beq	no_target

	move.w	T_forceX,d6
	beq.s	.no_move
	bpl.s	.force_right


	;To the left
	bsr	Test_side
	beq.s	.no_move
	move.w	T_posX,d0
	add.w	d6,d0
	bmi.s	.no_move	;Ausm Rand.
	bra.s	.do_move
.force_right:
	bsr	Test_side
	beq.s	.no_move
	move.w	T_posX,d0
	add.w	d6,d0
	cmp.w	#320-26,d0
	bgt.s	.no_move	;Ausm Rand.
.do_move:
	add.w	d6,T_posX
.no_move:

	bsr	Test_feet
	bne.s	.on_ground
	sf	T_rope
	sf	T_targeting
	sf	T_swing
	sf	T_startswing

.on_ground:
	tst.b	T_targeting
	bpl	.not_searching
	clr.b	R_blink

	btst	#FIRE,JoyFlags
	beq	.stop_targeting

	btst	#LEFT,JoyFlags
	bne	.left
	btst	#RIGHT,JoyFlags
	bne	.right
.out:
	bra	T_handle_end

.left:
	subq.b	#1,T_target_anvz
	bpl	.out
	move.b	#3,T_target_anvz
	tst.w	T_face
	bne	.l_right
	cmp.w	#19,T_anim
	bgt	.out
	addq.w	#1,T_anim
	bra	T_handle_end

.l_right:
	cmp.w	#8,T_anim
	bne	.sub
	clr.w	T_face
	bra	T_handle_end

.sub:
	subq.w	#1,T_anim
	bra	T_handle_end

.right:
	subq.b	#1,T_target_anvz
	bpl	.out
	move.b	#3,T_target_anvz
	tst.w	T_face
	beq	.r_left
	cmp.w	#19,T_anim
	bgt	.out
	addq.w	#1,T_anim
	bra	T_handle_end

.r_left:
	cmp.w	#8,T_anim
	bne	.sub
	move.w	#-1,T_face
	bra	T_handle_end

.stop_targeting:
	move.b	#1,T_targeting
	move.w	#10,R_radius1
	move.w	T_anim,d0
	subq.w	#8,d0
	lea	deg_tab(pc),a0
	move.b	(a0,d0.w),d0
	tst.w	T_face
	bne	.to_right
	move.w	#128,d1
	exg	d0,d1
	sub.w	d1,d0
.to_right:
	add.b	#128,d0
	move.w	d0,R_angle

.not_searching:
	cmp.b	#1,T_targeting
	bne	.not_out

	move.w	R_radius1(pc),d7
	addq.w	#8,d7
	bsr	Rope_inout

	move.w	T_posX(pc),d4			;Get player's position
	move.w	T_posY(pc),d5			;Get player's position
	addi.w	#14,d4
	addi.w	#3,d5
	move.w	R_angle(pc),d0			;Get angle
	bsr	sin				;Calc SIN(X)
	move.w	d0,d2
	move.w	R_angle(pc),d0			;Get angle
	bsr	cos				;Calc COS(X)
	muls	R_radius1(pc),d0		;R*COS(X)
	muls	R_radius1(pc),d2		;R*SIN(X)
	asr.l	#8,d0				;Adjust to normal range
	asr.l	#8,d2
	sub.w	d0,d4				;PX-R*COS(X)
	add.w	d2,d5				;PY+R*SIN(X)

	cmpi.w	#320,d4				;Out of screen ?
	bhs.s	.missed
	cmpi.w	#200,d5
	bhs.s	.missed

	movem.w	d4-d5,-(sp)
	move.w	d4,d0				;Found background ?
	move.w	d5,d1
	subq.w	#8,d0
	bsr	check_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.found_back

	move.w	d0,d2				;Hit any objects
	move.w	d1,d3
	addq.w	#4,d2
	addq.w	#4,d3
	bsr	check_rec
	tst.w	d0
	beq.s	.no_check

	tst.b	Bob_RopeEnable(a0)
	bne.s	.found_obj

.no_check:
	cmp.w	#MAX_ROPE,R_radius1	;Rope moved out to maximum ?
	blt	T_handle_end

.missed:
	move.b	#2,T_targeting		;Missing, switch to "move-in"
	bra	T_handle_end
.found_obj:				;Attached to object
	st	T_ropeobj
	st	Bob_Rope(a0)		;Tell object that player is attached
	bra.s	.rope_ok
.found_back:				;Attached to background
	sf	T_ropeobj
.rope_ok:
	sf	T_targeting.w		;"Start the rope"-squence ends
	bra	T_handle_end

.not_out:
	cmp.w	#20,R_radius1
	ble	.stop_rope
	move.w	R_radius1(pc),d7
	subq.w	#8,d7
	bsr	Rope_inout
	bra	T_handle_end
.stop_rope:
	clr.b	T_targeting
	clr.b	T_rope
	move.l	#-1,rope_coords
	bra	T_handle_end

deg_tab:
	dc.b	64,61,53,46,41,35,28,21,13,6,0,-11,-19
	even

start_jump:
	tst.b	T_button_longpressed
	beq.s	.doit
	tst.b	T_rope
	beq.s	.doit
	sf	T_rope
	sf	T_swing
	clr.w	T_target_count
	bra	stop_swing
.doit:
	st	T_rejump
	move.b	#1,T_state		;Jumping state.
	move.l	#-$00066000,T_speedY
	bra	T_handle_end

T_jumping:
	move.l	#$00050000,T_Mspeed_Y
	move.w	#21,T_newanim
	clr.w	T_ansize

	move.l	T_speedY,d0
	move.l	T_posY,d6
	add.l	d0,T_posY
	add.l	#$00004800,T_speedY
	bpl	.end_jump
	btst	#JUMP,JoyFlags
	bne	.jump1

	;Sprung abbrechen, wg. Knopf losgelassen.

	cmp.l	#-$00028000,T_speedY
	bgt	.jump1
	move.l	#-$00028000,T_speedY

.jump1:
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	addq.w	#3,d1
	bsr	check_kollision
	bne	.end_jump2
.jump0:
	tst.b	T_rope
	beq.s	.no_rope

	move.w	T_posX,d0
	move.w	T_posY,d1
	add.w	#14,d0
	addq.w	#3,d1
	movem.w	R_xpos,d2-d3
	bsr	check_rope
	bne	.end_jump2

.no_rope:
	bsr	T_move_x
	move.w	T_newanim,T_anim
	bra	T_handle_end

.end_jump2:
	move.l	d6,T_posY
	sf	T_restand
.end_jump0:
	move.b	#-1,T_state		;Falling!
	clr.l	T_speedY
	bsr	T_move_x
	st	T_rejump
	move.w	T_newanim,T_anim
	bra	T_handle_end

.end_jump:
	st	T_restand
	bra.s	.end_jump0

start_fall:
	move.b	#-1,T_state
	bsr	T_move_x
	bra	T_handle_end		;Spieler fllt!

T_falling:
	move.l	#$00050000,T_Mspeed_Y

	move.w	#21,T_newanim
	clr.w	T_ansize

	move.l	T_posY,d6
	move.l	T_speedY,d0
	add.l	d0,T_posY
	add.l	#$00006000,T_speedY
	cmp.l	#$00050000,T_speedY
	blt	.move_x
	move.l	#$00050000,T_speedY

.move_x:
	tst.b	T_rope
	beq.s	.no_rope
	movem.w	R_xpos,d2-d3
	move.w	T_posX,d0
	move.w	T_posY,d1
	add.w	#14,d0
	addq.w	#3,d1

	bsr	check_rope
	beq.s	.no_rope
	bsr	calc_angle
	cmp.w	#128,d0
	ble.s	.no_rope

	move.l	d6,T_posY

	bra	T_start_swing

.no_rope:
	bsr	T_move_x
	move.w	T_newanim,T_anim

	bsr	Test_feet
	beq	.no_ground_found

	tst.b	T_stand
	bne.s	.on_object

	tst.b	T_restand
	bne	T_handle_end		;Von Anfang des Fallens an im Background,
					;stehenbleiben NICHT erlaubt! (sonst landet man in der Grafik)
	bsr	T_floor_align

.on_object:
	move.b	#0,T_state
	bra	T_handle_end

.no_ground_found:
	clr.b	T_restand
	bra	T_handle_end


T_floor_align:
	;Align to Ground.
	move.w	T_posY,d1
	add.w	#31,d1
	add.w	Scr_Y_Level_Pos(a6),d1
	and.w	#$fff8,d1
	sub.w	Scr_Y_Level_Pos(a6),d1
	sub.w	#31,d1
	move.w	d1,T_posY
	rts

* --------------------
* Wheel bearbeiten
* --------------------

T_do_wheel:
	move.l	#$00040000,T_Mspeed_X

	tst.w	T_wenergy
	beq.s	.stand_up

	tst.b	T_rejump
	bne	.dont_ask

	btst	#JUMP,JoyFlags
	beq	.dont_ask

	;Rad ist beendet.
.stand_up:
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	add.w	#8,d1
	bsr	check_kollision
	bne	.dont_ask
	sf	T_wheel			;Aufgesprungen!
	clr.w	T_anpos
	bra	T_handle_end

.dont_ask:
	btst	#JUMP,JoyFlags
	sne	T_rejump

	subq.w	#1,T_wenergy

	move.l	#T_roll_tab,T_antab
	move.w	#4,T_ansize
	move.w	#1,T_anspeed

	bsr	Test_feet
	bne	.is_ground

	bsr	T_handle_button_wheel
	beq.s	.no_button
	st	T_mine
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	bsr	Search_Mine
	bpl	.no_button
	move.w	d0,(a1)
	move.w	d1,2(a1)
	move.w	#1,4(a1)
.no_button:
	;Kein Grund unter den Fssen.
	tst.w	T_speedY
	bpl	.dont_check_head

	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	add.w	#8,d1
	bsr	check_kollision
	beq	.dont_check_head
	;Kopf ist Kollidiert.

	clr.w	T_speedY

.dont_check_head:
	cmp.w	#5,T_speedY
	bge	.nobounce
	add.l	#$00007000,T_speedY
	bra	.nobounce

.is_ground:
	bsr	T_floor_align

	bsr	T_handle_button_wheel
	beq.s	.no_button2
	st	T_mine
	bsr	Search_Mine
	bpl	.no_button2
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	add.w	#10,d0
	add.w	#28,d1
	move.w	d0,(a1)
	move.w	d1,2(a1)
	move.w	#0,4(a1)
	move.w	#30,6(a1)
.no_button2:

	btst	#LEFT,JoyFlags
	bne	.left
	btst	#RIGHT,JoyFlags
	beq	.nodir
	move.w	#-1,T_face
	bra.s	.nodir
.left:
	clr.w	T_face
.nodir:
	neg.l	T_speedY
	beq	.nobounce

	bpl	.subit
	add.l	#$1c000,T_speedY
	ble.s	.nobounce
	clr.l	T_speedY
	bra.s	.nobounce
.subit:
	sub.l	#$1c000,T_speedY
	bpl.s	.nobounce
	clr.l	T_speedY
.nobounce:
	move.l	T_speedY,d0
	add.l	d0,T_posY


	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1

	tst.w	T_face
	bne	.check_right
	tst.w	d0
	ble	.change_dir
	sub.w	#16,d0
	moveq	#-4,d5
	bra.s	.checkit
.check_right:
	cmp.w	#320-16,d0
	bge	.change_dir
	add.w	#12,d0
	moveq	#4,d5
.checkit:
	add.w	#16,d1
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	movem.w	(sp)+,d0/d1
	bne	.change_dir
	addq.w	#8,d1
	bsr	check_kollision
	bne	.change_dir
	add.w	d5,T_posX
	bra	T_handle_end

.change_dir:
	not.w	T_face
	bra	T_handle_end

T_handle_end:
	move.w	T_forceY,d2
	beq.s	.no_forceY

	tst.b	T_rope
	beq.s	.do_force
	tst.b	T_targeting
	bne.s	.do_force
	move.w	T_posX,d0
	move.w	T_posY,d1
	add.w	d2,d1
	add.w	#14,d0
	add.w	#3,d1
	movem.w	R_xpos,d2-d3
	bsr	check_rope
	bne	.no_forceY
.do_force:
	move.w	T_forceY,d0
	add.w	d0,T_posY

.no_forceY:
	tst.b	T_rope
	beq	.no_rope
	move.w	R_radius1(pc),d0
	mulu	d0,d0
	move.w	d0,R_radius
	tst.b	T_targeting
	bmi.s	.no_rope

	bsr	draw_rope
.no_rope:
	tst.b	T_flash
	bne	.no_check
	bsr	check_player		;Kollision-Check!
	beq	.no_check
	move.b	T_wheel,d1
	or.b	T_shield,d1
	bne.s	.no_normal
	tst.w	d0
	smi	T_hitdir
	bsr	make_plhit
	bra	.no_check
.no_normal:
	move.b	T_wheel,d1
	and.b	Boss_flag,d1
	bne.s	.no_sub
	move.w	#4,Bob_Hit(a0)
	subq.w	#2,Bob_Power(a0)
	bpl.s	.no_sub
	clr.w	Bob_Power(a0)
.no_sub:
	tst.b	T_wheel
	beq	.no_check
	not.w	T_face
	tst.w	T_speedY
	bne.s	.not_equ
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	add.w	#8,d1
	bsr	check_kollision
	bne.s	.no_check
	subq.w	#2,T_posY
.not_equ:
	cmp.w	#-4,T_speedY
	ble.s	.no_check
	subq.w	#2,T_speedY
.no_check:
	clr.b	T_stand
	clr.l	T_forceX
	st	G_keytab+2

	move.w	T_posX,d0
	sub.w	T_oldX,d0
	bpl.s	.ok
	neg.w	d0
.ok:
	move.w	d0,T_Mspeed_X
	move.w	T_posY,d0
	sub.w	T_oldY,d0
	bpl.s	.ok2
	neg.w	d0
.ok2:
	move.w	d0,T_Mspeed_Y
	rts

T_move_x:
	move.w	T_forceX,d6
	btst	#LEFT,JoyFlags
	bne	.move_left
	btst	#RIGHT,JoyFlags
	beq	T_move_no_dir
	addq.w	#2,d6
	move.w	#-1,T_face
	bra.s	T_move_no_dir
.move_left:
	subq.w	#2,d6
	clr.w	T_face
T_move_no_dir:
	tst.b	T_hit
	beq.s	.no_hit

	move.w	#25,T_newanim
	subq.b	#1,T_hit
	beq	.no_move2
	tst.b	T_hitdir
	beq.s	.check_right
	moveq	#-2,d6		;Adjust for checking
	bsr	Test_side	;Check for wall
	beq	.no_move2	;Wall detected...
	bra.s	.move
.check_right:
;	cmpi.w	#320,d6
;	bgt	.no_move2
	moveq	#2,d6
	bsr	Test_side
	beq	.no_move2
.move:
	moveq	#0,d6
	move.b	T_hit(pc),d6
	lsr.w	#2,d6
	tst.b	T_hitdir
	beq.s	.not_to_left
	neg.w	d6
.not_to_left:
	bsr	.no_rope
	moveq	#0,d0
	rts
.no_move2:
	moveq	#0,d0
	rts
.no_hit:
	bsr	Test_side
	beq	.nomove2
	tst.b	T_rope
	beq.s	.no_rope
	movem.w	R_xpos,d2-d3
	move.w	T_posX,d0
	move.w	T_posY,d1
	add.w	#14,d0
	add.w	d6,d0
	add.w	#3,d1
	bsr	check_rope
	bmi	.nomove2
.no_rope:
	add.w	d6,T_posX
	move.w	d6,d0
	beq.s	.ok2
	bpl.s	.ok
	neg.w	d0
.ok:
	move.w	d0,T_Mspeed_X
.ok2:
	cmp.w	T_forceX,d6
	rts
.nomove2:
	moveq	#0,d0
	rts

Test_side:
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1
	add.w	#30,d1
	tst.w	d6
	bmi.s	.left
	add.w	#10,d0
	cmp.w	#290,d0
	bge.s	.is_wall2
	bra.s	.right
.left:
	sub.w	#10,d0
	cmp.w	#-14,d0
	blt.s	.is_wall2
.right:
	add.w	d6,d0
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	bne	.is_wall
	movem.w	(sp)+,d0/d1
	sub.w	#10,d1
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	bne	.is_wall
	movem.w	(sp)+,d0/d1
	sub.w	#10,d1
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	bne	.is_wall
	movem.w	(sp)+,d0/d1
	moveq	#1,d0
	rts	
.is_wall:
	movem.w	(sp)+,d0/d1
.is_wall2:
	moveq	#0,d0
	rts

test_line:
	movem.l	d3-d4/a6,-(sp)
	move.l	Act_Scr_Structure,a6
	add.w	#28,d1
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	bne	.is_wall
	movem.w	(sp)+,d0/d1
	sub.w	#10,d1
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	bne	.is_wall
	movem.w	(sp)+,d0/d1
	sub.w	#10,d1
	movem.w	d0/d1,-(sp)
	bsr	check_kollision
	bne	.is_wall
	movem.w	(sp)+,d0/d1
	movem.l	(sp)+,d3-d4/a6
	moveq	#1,d0
	rts	
.is_wall:
	movem.w	(sp)+,d0/d1
	movem.l	(sp)+,d3-d4/a6
	moveq	#0,d0
	rts

*--------------------------------------------------------
*-------------- SCHWUUIINGNGNG ! ! ----------------------
*--------------------------------------------------------

T_start_swing:
	st	T_swing
	st	T_startswing
	bsr	calc_angle
	move.l	d1,R_angle

	clr.l	T_speedY
	cmp.w	#185,d0
	blo.s	.no_speed
	cmp.w	#200,d0
	bhi.s	.no_speed
	move.l	#$00018000,T_speedY
.no_speed

T_do_swing:
	move.l	#$00050000,T_Mspeed_Y

	tst.b	T_button_longpressed
	beq	.dont_ask
	clr.w	T_target_count
	btst	#JUMP,JoyFlags
	beq	.dont_ask
	sf	T_rope
	sf	T_swing
	sf	T_startswing
	move.w	R_angle(pc),d0
	sub.w	#64,d0
	and.w	#255,d0
	cmp.w	#128,d0
	bge.s	.check_right
	tst.l	T_speedY
	bmi	.start_jump
	bra.s	.dont_ask
.check_right:
	tst.l	T_speedY
	ble	.dont_ask

.start_jump:
	st	T_rejump
	move.b	#1,T_state		;Jumping state.
	move.l	#-$00069000,T_speedY
	move.l	Act_Scr_Structure,a6
	lea	custom,a5
	bra	T_jumping

.dont_ask:
	move.w	#24,T_anim
	clr.w	T_ansize
	moveq	#0,d2

	move.w	R_angle(pc),d0
	cmp.w	#128,d0
	ble.s	.no_dir_check
	btst	#RIGHT,JoyFlags
	beq.s	.not_right1
	move.w	#-1,T_face
	move.w	#$0600,d2
.not_right1:	
	btst	#LEFT,JoyFlags
	beq.s	.no_dir_check
	clr.w	T_face
	move.l	#-$0600,d2
.no_dir_check:
	move.w	R_radius1(pc),a5
	btst	#DOWN,JoyFlags
	beq.s	.no_longer
	cmp.w	#MAX_ROPE,R_radius1
	bge.s	.no_longer
	addq.w	#1,R_radius1
	move.w	R_radius1(pc),d0
	lsr.w	#3,d0
	add.w	d0,d0
	lea	rope_buffer(pc),a0
	move.w	R_angle,-2(a0,d0.w)
.no_longer:
	btst	#JUMP,JoyFlags
	beq.s	.no_shorter
	cmp.w	#10,R_radius1
	ble.s	.no_shorter
	subq.w	#1,R_radius1
.no_shorter:
	move.l	T_speedY,d1
	move.w	R_angle,d0
	sub.w	#64,d0
	cmp.b	#128,d0

	blo.s	.lab1
	sub.l	#$00001000,d1
	add.l	d2,d1
	bra.s	.lab0
.lab1:
	add.l	#$00001000,d1
	add.l	d2,d1
.lab0:
	move.l	d1,d0

	bpl.s	.noneg
	neg.l	d0
.noneg:

	cmp.l	#$00010000,d0

	ble.s	.lab2
	tst.l	d1
	bpl.s	.lab3
	add.l	#$00000100,d1
	bra.s	.lab2
.lab3:
	sub.l	#$00000100,d1
.lab2:
	move.l	#-$00040000,d0
	cmp.l	d0,d1
	bge.s	.lab5
	move.l	d0,d1
	bra.s	.lab6
.lab5:
	neg.l	d0
	cmp.l	d0,d1
	ble.s	.lab6
	move.l	d0,d1
.lab6:
	move.l	d1,T_speedY
	move.l	R_angle,a6
	add.l	d1,R_angle
	and.w	#255,R_angle

	bsr	calc_player

	move.w	T_posX,d0
	move.w	T_posY,d1
	cmp.w	d3,d0
	beq.s	.lab7
	blt.s	.lab8
	sub.w	#16,d0
	bsr	test_line
	beq.s	.stop_swing1
	bra.s	.lab7
.lab8:
	add.w	#16,d0
	bsr	test_line
	bne.s	.lab7
.stop_swing1:
	move.w	T_posX,d3
	move.w	T_posY,d4
	move.l	a6,R_angle
	move.w	a5,R_radius1
	clr.l	T_speedY
	bra.s	.end
.lab7:
	cmp.w	T_posY,d4
	beq.s	.lab9
	bgt.s	.lab10
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1

	cmp.w	#-32,d1
	blt.s	.stop_swing1
	addq.w	#3,d1
	movem.l	d3-d4/a6,-(sp)
	move.l	Act_Scr_Structure,a6
	bsr	check_kollision
	movem.l	(sp)+,d3-d4/a6
	bne	.stop_swing1
.lab10:
	movem.l	d3-d4/a6,-(sp)
	move.l	Act_Scr_Structure,a6
	bsr	Test_feet
	movem.l	(sp)+,d3-d4/a6
	bne.s	stop_swing
.lab9:
	move.w	d3,T_posX
	move.w	d4,T_posY

.end:
	move.l	Act_Scr_Structure,a6
	lea	custom,a5

	move.w	T_oldX,d0
	sub.w	T_posX,d0
	beq	T_handle_end
	bpl.s	.noneg2
	neg.w	d0
.noneg2:
	cmp.w	#2,d0
	bgt.s	.set
	moveq	#2,d0
.set:
	move.w	#$0004,T_Mspeed_X

	bra	T_handle_end
stop_swing:
	sf	T_state
	sf	T_swing
	sf	T_startswing
	move.l	Act_Scr_Structure,a6
	lea	custom,a5
	bsr	T_floor_align
	bra	T_handle_end

T_handle_button_wheel:
	btst	#FIRE,JoyFlags
	beq	.not_pressed
	tst.b	T_button_pressed
	beq	.start_mine
	moveq	#0,d0
	rts
.start_mine:
	st	T_button_pressed
	moveq	#1,d0
	rts

.not_pressed:
	sf	T_button_pressed
	sf	T_button_longpressed
	sf	R_blink
	moveq	#0,d0
	rts

T_handle_button:
	btst	#FIRE,JoyFlags
	beq	.not_pressed
	tst.b	T_button_pressed
	beq	.start_bullet
	tst.b	T_targeting
	bne	.out
	tst.b	T_rope
	bne	.add
	btst	#LEFT,JoyFlags
	bne	.clear
	btst	#RIGHT,JoyFlags
	bne	.clear
.add:
	addq.w	#1,T_target_count
	cmp.w	#TARGET_VERZ,T_target_count
	bge	.change_state
	rts

.clear:
	clr.w	T_target_count
	rts

.change_state:
	tst.b	T_rope
	bne.s	.set
	tst.b	T_state
	bne	.out

	st	T_targeting
	st	T_rope
	clr.w	T_ansize		;Auto-anim stoppen.
	clr.w	T_anpos
	clr.w	R_oldradius1
	move.w	#8,T_anim		;Erste Phase des Zielens.
	move.b	#4,T_target_anvz
	rts
.set:
	move.b	#1,T_button_longpressed
	or.b	#1,R_blink
	rts

.start_bullet:
	tst.b	T_wheel
	bne.s	.no_rocket
	tst.b	T_rocket
	beq.s	.no_rocket
	bsr	start_rocket
.no_rocket:
	clr.w	T_target_count
	st	T_button_pressed

	tst.b	T_noshot
	bne	Return
	tst.b	Mine_X+4
	bpl	Return
	tst.b	Mine_X+12
	bpl	Return
	sf	T_mine
	move.w	T_posX,d0
	move.w	T_posY,d1
	move.b	T_power,d2
	cmp.b	#1,T_weapon
	beq	.start_spread
	bgt	.start_blueshot
	cmp.b	#1,d2
	beq	.l_start2
	bgt	.l_start3

	lea	W_lazer1_info(pc),a0
	bra	W_start_shoot
.l_start2:
	lea	W_lazer2_info(pc),a0
	bra	W_start_shoot
.l_start3:
	lea	W_lazer3_info(pc),a0
	bra	W_start_shoot

.start_spread:
	cmp.b	#1,d2
	beq	.s_start2
	bgt	.s_start3
	lea	W_spread1_info(pc),a0
	bra	W_start_shoot
.s_start2:
	lea	W_spread2_info(pc),a0
	bsr	W_start_shoot
	tst.w	d7
	bmi.s	.out
	addq.w	#7,d1
	move.w	d1,8(a1)
	subq.w	#3,d1
	move.w	d1,6(a1)
	rts
.s_start3:
	lea	W_spread3_info(pc),a0
	bsr	W_start_shoot
	tst.w	d7
	bmi.s	.out
	addq.w	#7,d1
	move.w	d1,8(a1)
	subq.w	#3,d1
	move.w	d1,6(a1)
.out:
	rts

.start_blueshot:
	lea	W_bounce1_info(pc),a0
	bsr	W_start_shoot
	tst.w	d7
	bmi.s	.out
	lea	Bounce_List(pc),a0
	move.w	(a0),d2
	or.w	Bounce_len(a0),d2
	bne.s	.out

	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1

	move.w	#1,(a0)
	move.w	#1,Bounce_len(a0)
	move.b	#1,Bounce_0+1(a0)
	move.b	#0,Bounce_0+1+Bounce_len(a0)
	move.w	d0,Bounce_X(a0)
	move.w	d0,Bounce_X+Bounce_len(a0)

	move.w	d1,d2
	cmp.w	#22,T_anim
	beq.s	.ducking
	sub.w	#9,d2
.ducking:
	move.w	d2,Bounce_Y(a0)
	add.w	#16+8,d2
	move.w	d2,Bounce_Y+Bounce_len(a0)
	sf	Bounce_1(a0)
	sf	Bounce_1+Bounce_len(a0)
	move.b	T_face+1,d2
	not.b	d2
	move.b	d2,Bounce_0(a0)
	move.b	d2,Bounce_0+Bounce_len(a0)
	bne.s	.out
	add.w	#24,Bounce_X(a0)
	add.w	#24,Bounce_X+Bounce_len(a0)
	rts

.not_pressed:
	sf	T_button_pressed
	sf	T_button_longpressed
	sf	R_blink
	rts

T_target_count:	dc.w	0
T_weapon:	dc.b	1
T_weapon_new:	dc.b	0
T_power:	dc.b	2
T_power_new:	dc.b	0
T_targeting:	dc.b	0
T_target_anvz:	dc.b	0
T_rope:		dc.b	0
T_swing:	dc.b	0
T_restand:	dc.b	0
T_stand:	dc.b	0
T_startswing:	dc.b	0
T_ropeobj:	dc.b	0
T_forceX:	dc.w	0
T_forceY:	dc.w	0

T_Mspeed_X:	dc.l	0
T_Mspeed_Y:	dc.l	0

T_oldX:		dc.w	0
T_oldY:		dc.w	0
T_newanim:	dc.w	0
T_shieldpos:	dc.w	33

T_state:	dc.b	0
T_wheel:	dc.b	0
T_rejump:	dc.b	0
T_force_jump:	dc.b	0
T_hit:		dc.b	0
T_hitdir:	dc.b	0
T_flash:	dc.b	0
T_shield:	dc.b	0
T_noshot:	dc.b	0
T_dieing:	dc.b	0
T_dead:		dc.b	0
T_rocket:	dc.b	0
T_rocket_anz:	dc.b	0
T_mine:		dc.b	0

T_button_pressed:	dc.b	0
T_button_longpressed:	dc.b	0

Boss_flag:	dc.b	0
	even

* -----------------------------------------------------
* - - - - - - - - - - ? R O P E ! - - - - - - - - - - -
* -----------------------------------------------------

check_rope:
	sub.w	d0,d2				;DX
	sub.w	d1,d3				;DY
	muls	d2,d2		;KREISCH!
	muls	d3,d3		;  !!!
	add.w	d3,d2				;DX^2+DY^2
	move.w	d2,d4

	move.b	T_swing.w,d0
	tst.b	T_state
	bpl.s	.dont_set
	or.b	#1,d0
.dont_set:
	tst.b	d0
	beq.s	.not_falling
		cmp.w	R_radius,d4		;Bigger than R^2 ?
		bgt.s	.rope_illegal		;Yes, rope is "illegal"
.not_falling:
	cmpi.w	#MAX_ROPE*MAX_ROPE,d4
	bgt.s	.rope_illegal

	cmpi.w	#10*10,d4			;New R^2 smaller than 10^2 ?
	bls.s	.rope_illegal			;Yes, rope is "illegal"

	move.w	d4,R_radius			;Everything ok, save new R^2
	move.w	d4,d0
	bsr	sqrt
	move.w	d0,R_radius1
	moveq	#0,d0				;Flag to ok
	rts
.rope_illegal:
	moveq	#-1,d0				;Flag to error
	rts

check_rope2:
	sub.w	d0,d2				;DX
	sub.w	d1,d3				;DY
	muls	d2,d2		;KREISCH!
	muls	d3,d3		;  !!!
	add.w	d3,d2				;DX^2+DY^2
	move.w	d2,d4

	cmpi.w	#MAX_ROPE*MAX_ROPE,d4
	bgt.s	.rope_illegal

	cmpi.w	#10*10,d4			;New R^2 smaller than 10^2 ?
	bls.s	.rope_legal			;Yes, rope is "illegal"

	move.w	d4,R_radius			;Everything ok, save new R^2
	move.w	d4,d0
	bsr	sqrt
	move.w	d0,R_radius1
.rope_legal:
	moveq	#0,d0				;Flag to ok
	rts
.rope_illegal:
	moveq	#-1,d0				;Flag to error
	rts

Rope_inout:
	move.w	d7,d0
	mulu	d0,d0
	move.w	d7,R_radius1
	move.w	d0,R_radius
	move.w	R_angle,d3
	addi.b	#128,d3
	move.w	d3,d0
	bsr	sin
	move.w	d0,d2
	move.w	d3,d0
	bsr	cos
	muls	d7,d0
	muls	d7,d2
	asr.l	#8,d0
	asr.l	#8,d2
	move.w	T_posX,d3
	move.w	T_posY,d4
	addi.w	#14,d3
	addi.w	#3,d4
	add.w	d0,d3
	sub.w	d2,d4
	movem.w	d3-d4,R_xpos
	rts

draw_rope:
	move.l	R_angle(pc),-(sp)
	move.b	T_swing(pc),d0
	or.b	T_targeting(pc),d0
	bne.s	.notzero
	bsr	calc_angle
	move.l	d1,R_angle
.notzero:
	bsr	move_rope
	move.w	R_radius1(pc),d7
	lsr.w	#3,d7
	subq.w	#1,d7
	bmi	.out
		lea	rope_buffer(pc),a6
		lea	rope_coords(pc),a5
		moveq	#0,d5
.loop:
			move.w	(a6),d0
			bsr	sin
			move.w	d0,d2
			move.w	(a6)+,d0
			bsr	cos
			muls	d5,d0
			muls	d5,d2
			asr.l	#8,d0
			asr.l	#8,d2
			add.w	R_xpos(pc),d0
			move.w	R_ypos(pc),d1
			sub.w	d2,d1
			bmi.s	.no
			move.w	d0,(a5)+
			move.w	d1,(a5)+
.no:
			addq.w	#8,d5
		dbf	d7,.loop
		move.l	#-1,(a5)+
		move.l	#-1,(a5)
.out:
	move.l	(sp)+,R_angle
	lea	custom,a5

	rts

move_rope:
	move.w	R_oldradius1(pc),d0
	lsr.w	#3,d0
	lea	rope_buffer(pc),a0
	subq.w	#2,d0
	bmi.s	.no_len
.copyit:
	move.w	2(a0),(a0)+
	dbf	d0,.copyit
.no_len:
	move.w	R_angle(pc),d1
	move.w	R_oldradius1(pc),d0
	move.w	R_radius1(pc),d2
	lsr.w	#3,d0
	lsr.w	#3,d2
	cmp.w	d0,d2
	bgt.s	.higher1
	move.w	d1,(a0)
	bra.s	.lower1
.higher1:
	move.w	d0,d3
	add.w	d3,d3
	lea	rope_buffer(pc),a0
	adda.w	d3,a0
	sub.w	d0,d2
	subq.w	#1,d2
	bpl.s	.ok1
	moveq	#0,d2
.ok1:
	move.w	d1,(a0)+
	dbf	d2,.ok1
.lower1:
	move.w	R_radius1(pc),R_oldradius1
	rts

calc_player:
	move.w	R_angle(pc),d0			;Get angle
	bsr	sin				;Calc SIN(X)
	move.w	d0,d2
	move.w	R_angle(pc),d0			;Get angle
	bsr	cos				;Calc COS(X)
	muls	R_radius1(pc),d0			;R*COS(X)
	muls	R_radius1(pc),d2			;R*SIN(X)
	asr.l	#8,d0				;Adjust to normal range...
	asr.l	#8,d2
	movem.w	R_xpos(pc),d3-d4		;Get rope fix-coordinates
	add.w	d0,d3				;RX+R*COS(X)
	sub.w	d2,d4				;RY-R*SIN(X)
	sub.w	#14,d3				;Adjust to player...
	subq.w	#3,d4
	rts

calc_radius:					;Calc radius
	movem.w	R_xpos(pc),d2-d3
	sub.w	d2,d0
	sub.w	d3,d1
	muls	d0,d0
	muls	d1,d1
	add.w	d1,d0
	move.w	d0,-(sp)
	bsr	sqrt
	move.w	(sp)+,d1
	rts

calc_angle:
	movem.w	R_xpos(pc),d2-d3		;Get rope-coordinates
	move.w	T_posX(pc),d4
	move.w	T_posY(pc),d5
calc_angle2:
	addi.w	#14,d4
	addi.w	#3,d5
calc_angle1:
	moveq	#0,d1
	move.w	d3,d1
	sub.w	d5,d1				;|DY|
	bpl.s	.noneg
	neg.w	d1
.noneg:
	cmp.w	R_radius1,d1
	blt.s	.ok
	move.w	R_radius1,d1
.ok:
	asl.w	#7,d1
	divu	R_radius1(pc),d1			;SIN(X)   (|DY|/R)
	moveq	#0,d0
	lea	asin_tab(pc),a0
	move.b	(a0,d1.w),d0			;Angle	(ASIN(SIN(X)))
	cmp.w	d2,d4				;Adjust angle to full 256 "degrees"
	blt.s	.not_bigger1
	cmp.w	d3,d5
	blt.s	.not_bigger2
	move.w	#256,d1
	sub.w	d0,d1
	bra.s	set_angle
.not_bigger2:
	move.w	d0,d1
	bra.s	set_angle
.not_bigger1:
	cmp.w	d3,d5
	blt.s	.not_bigger3
	move.w	d0,d1
	addi.w	#128,d1
	bra.s	set_angle
.not_bigger3:
	move.w	#128,d1
	sub.w	d0,d1

set_angle:					;Save angle with float-part
	andi.w	#255,d1
	move.w	d1,d0
	swap	d1
	clr.w	d1
	rts

asin_tab:
	dc.b	0,1,1,1,2,2,2,3,3,3,4,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9	;29
	dc.b	10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,15,15,15,16,16	;20
	dc.b	16,17,17,17,18,18,18,19,19,20,20,20,21,21,21,22,22,22,23,23	;20
	dc.b	24,24,24,25,25,26,26,26,27,27,28,28,28,29,29,30,30,30,31,31	;20
	dc.b	32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,42	;20
	dc.b	42,43,43,44,45,45,46,47,48,49,50,51,52,53,54,55,57,59,61,62	;20
;	dc.b	63,64
	even

R_xpos:		dc.w	0
R_ypos:		dc.w	0
R_radius:	dc.w	0
R_radius1:	dc.w	0
R_oldradius1:	dc.w	0
R_angle:	dc.l	0
R_blink:	dc.b	0
R_blvz:		dc.b	0

rope_buffer:	ds.w	32
rope_coords:	dcb.w	32*2,-1

* -----------------------------------------------------------
* ---------------- ARITHMETICS ------------------------------
* -----------------------------------------------------------
init_rnd:
	moveq	#1,d0
	move.l	d0,last_rnd
	rts

rnd:
	movem.l	d1-d2,-(sp)
	move.w	#16807,d1
	move.w	last_rnd(pc),d0
	move.w	last_rnd+2(pc),d2
	mulu	d1,d0
	mulu	d1,d2
	swap	d2
	clr.w	d2
	add.l	d2,d0
	movem.l	(sp)+,d1-d2
	move.l	d0,last_rnd
	rts

last_rnd:	dc.l	0

sqrt:
	moveq	#0,d1			;XROOT=0
	move.w	#$4000,d2		;M2=$4000
.loop:
	move.w	d1,d3
	add.w	d2,d3			;X2=XROOT+M2
	lsr.w	#1,d1			;XROOT>>=1
	cmp.w	d0,d3			;X2<=X ?

	bgt.s	.lab1
	sub.w	d3,d0			;X-=X2
	add.w	d2,d1			;XROOT+=M2
.lab1:
	lsr.w	#2,d2			;M2>>=2
	bne	.loop

	cmp.w	d0,d1			;XROOT<X ?
	bhs.s	.no_add
	addq.w	#1,d1			;XROOT++
.no_add:
	move.w	d1,d0			;XROOT nach d0
	rts


cos:
	addi.w	#64,d0
sin:
	andi.w	#$00ff,d0
	lea	sincos_tab(pc),a0
	cmpi.w	#192,d0
	blt.s	.nquad1
	move.w	#255,d1
	sub.w	d0,d1
	move.b	(a0,d1.w),d0
	neg.w	d0
	rts
.nquad1:
	cmpi.w	#128,d0
	blt.s	.nquad2
	subi.w	#128,d0
	move.b	0(a0,d0.w),d0
	neg.w	d0
	rts
.nquad2:
	cmpi.w	#64,d0
	blt.s	.nquad3
	moveq	#127,d1
	sub.w	d0,d1
	move.b	0(a0,d1.w),d0
	rts
.nquad3:
	move.b	0(a0,d0.w),d0
	rts

sincos_tab:
	dc.b	0,6,12,18,25,31,37,43,49,56,62,68,74,80,86,92
	dc.b	97,103,109,115,120,126,131,136,142,147,152,157,162,167,171,176
	dc.b	181,185,189,193,197,201,205,209,212,216,219,222,225,228,231,234
	dc.b	236,238,241,243,244,246,248,249,251,252,253,254,254,255,255,255

Dcos:
	addi.w	#64,d0
Dsin:
	andi.w	#$00ff,d0
	lea	Dsincos_tab(pc),a0
	cmpi.w	#192,d0
	blt.s	.nquad1
	move.w	#255,d1
	sub.w	d0,d1
	add.w	d1,d1
	move.w	(a0,d1.w),d0
	neg.w	d0
	rts
.nquad1:
	cmpi.w	#128,d0
	blt.s	.nquad2
	subi.w	#128,d0
	add.w	d0,d0
	move.w	0(a0,d0.w),d0
	neg.w	d0
	rts
.nquad2:
	cmpi.w	#64,d0
	blt.s	.nquad3
	moveq	#127,d1
	sub.w	d0,d1
	add.w	d1,d1
	move.w	0(a0,d1.w),d0
	rts
.nquad3:
	add.w	d0,d0
	move.w	0(a0,d0.w),d0
	rts

Dsincos_tab:
	dc.w	0,6,13,19,25,31,38,44,50,56,62,68,74,80,86,92
	dc.w	98,104,109,115,121,126,132,137,142,147,152,157,162,167,172,177
	dc.w	181,185,190,194,198,202,206,209,213,216,220,223,226,229,231,234
	dc.w	237,239,241,243,245,247,248,250,251,252,253,254,255,255,256,256

	even

alias_feet:
	tst.b	T_state
	bgt.s	.jumping
	sub.w	Scr_Y_Level_Pos(a6),d1
	sub.w	#31,d1
	move.w	d1,T_posY
.jumping:
	rts

check_foot_frame:
	tst.b	T_state
	bgt.s	.no_kolli
	move.w	T_posX,d4
	add.w	Scr_X_Level_Pos(a6),d4
	add.w	#12,d4
	cmp.w	d4,d2
	blt.s	.no_kolli
	add.w	#14,d4
	cmp.w	d4,d0
	bgt.s	.no_kolli
	move.w	T_posY,d4
	add.w	Scr_Y_Level_Pos(a6),d4
	add.w	#31,d4
	cmp.w	d1,d4
	blt.s	.no_kolli
	subq.w	#8,d4
	cmp.w	d1,d4
	bgt.s	.no_kolli
	moveq	#1,d0
	rts
.no_kolli:
	moveq	#0,d0
	rts

check_kollision:
	add.w	Scr_X_Level_Pos(a6),d0
	add.w	Scr_Y_Level_Pos(a6),d1
	add.w	#16,d0
check_obj_kollision:
	cmp.w	#32,d1
	bge.s	.ok
	moveq	#32,d1
.ok:
	move.b	d0,d3		;fr 8*8er Abfrage.
	move.b	d1,d4		;fr 8*8er Abfrage.

	lsr.w	#3,d0
	and.w	#$fffe,d0
	move.l	Scr_Level(a6),a0

	sub.w	#32,d1

	adda.w	d0,a0
	lsr.w	#4,d1

	mulu	Scr_Level_Width(a6),d1
	add.l	d1,a0
	move.w	-2(a0),d0
	btst	#3,d3		; 4
	beq.s	.check_left
	btst	#3,d4
	beq.s	.check_ro
;check_ru
	and.w	#%100000000,d0
	rts
.check_ro:
	and.w	#%10000000000,d0
	rts

.check_left:
	btst	#3,d4
	beq.s	.check_lo
;check_lu
	and.w	#%1000000000,d0
	rts
.check_lo:
	and.w	#%100000000000,d0
	rts

	*----------------------------------------------------------------------------

Calc_Blit_Adrs:
	moveq	#0,d0
	move.w	Scr_X_Level_Pos(a6),d0
	lsr.w	#3,d0
	and.w	#$fffe,d0
	move.l	d0,Scr_Blt_Adr2(a6)

	moveq	#0,d1
	move	Scr_Y_Play_Anf(a6),d1
	mulu	Scr_Plane_Width(a6),d1
	add.l	d0,d1
	move.l	d1,Scr_Blt_Adr1(a6)
	rts

;--------------------------------------------------------------------------
;-------------                Joystick Handler        ---------------------
;--------------------------------------------------------------------------

JoyPort:	dc.w	joy1dat
JoyFlags:	dc.b	0		;format : BARLUD
		dc.b	0

JoyStick:
	moveq	#0,d7
	move.w	JoyPort,d0
	move.w	(a5,d0.w),d1
	btst	#1,d1
	bne.s	.right
	btst	#9,d1
	bne.s	.left
.check_y:
	move.w	(a5,d0.w),d1
	move.w	d1,d0
	lsr.w	#1,d0
	eor.w	d1,d0
	btst	#0,d0
	bne	.down
	btst	#8,d0
	bne	.up
.check_done:
	btst	#7,$bfe001
	bne	.nobutton
	or.b	#16,d7
.nobutton:
	move.b	d7,JoyFlags
	rts

.right:
	or.b	#8,d7
	bra.s	.check_y
.left:
	or.b	#4,d7
	bra.s	.check_y
.up:
	or.b	#2,d7
	bra.s	.check_done
.down:
	or.b	#1,d7
	bra.s	.check_done

;--------------------------------------------------------------------------
;-------------                 SPRITE SYSTEM          ---------------------
;--------------------------------------------------------------------------

	;Berechnet die Offsets der beiden Sprites und setzt die Koordinaten in die
	;Spritedaten.
Anim_Player:
	move.w	T_posX,-(sp)
	tst.b	T_flash
	beq.s	.no_flash
	subq.b	#1,T_flash
	tst.w	half_pixel
	beq.s	.no_flash
	tst.b	T_shield
	beq.s	.be_away
	tst.w	quarter_pixel
	bne.s	.no_flash
.be_away:
	move.w	#-48,T_posX
.no_flash:

	move.w	T_anim,d0		;Anim-num von Turrican.
	tst.b	T_shield
	beq.s	.no_shield
	tst.w	half_pixel
	beq.s	.no_shield
	move.w	T_shieldpos,d0
	lea	Shield_colors(pc),a0
	lea	Col_Buffer,a1
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	st	.shield_flag
	st	Col_Flag
	bra.s	.shield
.no_shield:
	tst.b	.shield_flag
	beq.s	.shield
	sf	.shield_flag
	lea	B_coltab+48,a0
	lea	Col_Buffer,a1
	move.l	(a0)+,(a1)+
	move.l	(a0)+,(a1)+
	st	Col_Flag
.shield:
	lea	T_animtab_len(pc),a0
	lea	T_animtab_offs(pc),a1
	lea	T_animtab_adr(pc),a2
	lea	sprite_pos+16(pc),a3
	move.w	d0,d2
	add.w	d0,d0
	lea	(a0,d0.w),a0
	lea	(a1,d0.w),a1
	moveq	#0,d7
	move.w	(a2,d0.w),d7
	add.l	#SpriteAdr,d7		;Adresse des ersten Sprites.

	tst.w	T_face
	beq	.leftside2
	add.l	#SpriteBuffer-SpriteAdr,d7		;Hier starten die geflippten Sprites.
.leftside2:
	move.l	d7,sprite_adr+16

	move.l	d7,a4

	add.w	d2,d2
	lea	T_animtab_xy(pc),a2
	move.b	(a2,d2.w),d0
	move.b	1(a2,d2.w),d1
	ext.w	d0
	ext.w	d1
	tst.w	T_face
	beq	.not_right
	neg.w	d0			;X-Offset geflippt.
.not_right:
	add.w	T_posX,d0

	cmp.w	#-15,T_posY
	bgt	.useit
	add.w	#-15,d1
	bra.s	.too_high
.useit:
	add.w	T_posY,d1
.too_high:
	move.b	#$80,d7
	add.w	#$91,d0
	btst	#0,d0
	beq.s	.noxhalf
	move.b	#$81,d7
.noxhalf:
	lsr.w	#1,d0
	move.b	d0,1(a3)

	add.w	#$2c,d1
	move.w	d1,d6		;Speichern fr zweite Hlfte.
	moveq	#0,d0
	move.b	(a1),d0
	add.w	d0,d1
	move.b	d1,(a3)
	btst	#8,d1
	beq	.noyhi1
	or.b	#4,d7
.noyhi1:
	moveq	#0,d0
	move.b	(a0),d0
	add.w	d0,d1
	move.b	d1,2(a3)
	btst	#8,d1
	beq	.noyhi2
	or.b	#2,d7
.noyhi2:
	move.b	d7,3(a3)
	moveq	#0,d0
	move.b	(a0),d0
	addq.b	#2,d0
	asl.w	#2,d0
	move.l	(a3),d7
	move.l	#$00080000,d3

	tst.w	T_face
	beq	.left_side3
	add.l	d3,d7
	move.l	d7,(a3)
	move.l	#$00f80000,d3
.left_side3:
	adda.w	d0,a4
	addq.l	#4,a3
	move.l	d7,(a3)
	move.l	a4,sprite_adr+4+16
	adda.w	d0,a4

	move.l	a4,sprite_adr+8+16
	add.l	d3,d7
	and.l	#$00ff0081,d7
	addq.l	#4,a3
	move.l	d7,(a3)
	move.w	d6,d1		;Y-pos
	moveq	#0,d0
	move.b	1(a1),d0
	add.w	d0,d1
	move.b	d1,(a3)
	btst	#8,d1
	beq	.noyhi3
	or.b	#4,3(a3)
.noyhi3:
	moveq	#0,d0
	move.b	1(a0),d0
	add.w	d0,d1
	move.b	d1,2(a3)
	btst	#8,d1
	beq	.noyhi4
	or.b	#2,3(a3)
.noyhi4:
	moveq	#0,d0
	move.b	1(a0),d0
	addq.b	#2,d0
	asl.w	#2,d0
	move.l	(a3),d7
	adda.w	d0,a4
	addq.l	#4,a3
	move.l	d7,(a3)
	move.l	a4,sprite_adr+12+16

	tst.w	T_ansize
	beq	.noanim
	subq.w	#1,T_anvz
	bpl	.nophase
	move.w	T_anspeed,T_anvz
	addq.w	#1,T_anpos
	move.w	T_ansize(pc),d0
	cmp.w	T_anpos(pc),d0
	bgt	.nophase
	clr.w	T_anpos
.nophase:
	move.w	T_anpos(pc),d0
	move.l	T_antab(pc),a0
	move.b	(a0,d0.w),T_anim+1
.noanim:
	subq.b	#1,.shield_vz
	bpl.s	.no_new
	move.b	#1,.shield_vz
	addq.w	#1,T_shieldpos
	cmp.w	#37,T_shieldpos
	bne.s	.no_new
	move.w	#32,T_shieldpos
.no_new:
	move.w	(sp)+,T_posX
	rts

.shield_vz:	dc.b	0
.shield_flag:	dc.b	1

Shield_colors:
	dc.w	$3f1,$1b0,$080,$fe0

Show_SWeapons:
	lea	SW_table(pc),a1
	lea	sprite_adr(pc),a0
	lea	sprite_pos(pc),a3
	move.l	SW_defpoint(pc),a2

	tst.b	T_mine
	bne	Show_Mines

	cmp.b	#2,T_weapon
	beq	.do_bounce

	moveq	#3,d7
	tst.w	SW_width
	beq.s	.loop
	tst.b	Scr_Screen_num(a6)
	beq.s	.loop
	lea	SW_len(a1),a1
.loop:
	move.w	(a1)+,d0		;X-pos
	move.w	(a1)+,d1		;Y-pos
	move.w	(a1)+,d3		;speed
	beq	.hide
	move.w	d1,d2
	add.w	SW_heigth,d2			;Y-stop
	bsr	.show_sprite

	tst.w	SW_width
	beq.s	.one_sprite
	move.w	-6(a1),d0
	move.w	-4(a1),d1
	moveq	#16,d4
	move.w	-2(a1),d3
	bpl.s	.ok
	neg.w	d4
.ok:
	add.w	d4,d0
	move.w	d1,d2
	add.w	SW_heigth,d2			;Y-stop
	bsr	.show_sprite
	subq.w	#1,d7
	lea	SW_len(a1),a1
.one_sprite:
.next:
	lea	SW_len-6(a1),a1
	dbf	d7,.loop
.not_lazer:

	lea	SW_table(pc),a1
	move.w	Scr_Scrolled_X(a6),d3
	move.w	Scr_Scrolled_Y(a6),d4
	moveq	#3,d7
.mloop:
	bsr	.move_lazer
	lea	SW_len(a1),a1
	dbf	d7,.mloop
	rts

.hide:
	move.l	(a2)+,(a0)+
	clr.l	(a3)+
	tst.w	SW_width
	beq.s	.next
	move.l	(a2)+,(a0)+
	clr.l	(a3)+
	subq.w	#1,d7
	lea	SW_len(a1),a1
	bra.s	.next

.move_lazer:
	sub.w	d3,(a1)
	sub.w	d4,2(a1)
	move.w	4(a1),d0
	beq.s	.out
	bmi	.L_to_left
	add.w	d0,(a1)
	cmp.w	#320,(a1)
	bgt	.L_stop
	rts
.L_to_left:
	add.w	d0,(a1)
	cmp.w	#-16,(a1)
	blt	.L_stop
.out:
	rts
.L_stop:
	clr.w	4(a1)
	rts

.show_sprite:
	move.l	(a2)+,(a0)+
	tst.w	d3
	bpl	.to_right
	add.l	#SpriteBuffer-SpriteAdr,-4(a0)
	sub.w	#16,d0
.to_right:
	add.w	#$91,d0
	btst	#0,d0
	beq	.setx0
	move.b	#1,3(a3)
	bra.s	.setx1
.setx0:
	clr.b	3(a3)
.setx1:
	lsr.w	#1,d0
	move.b	d0,1(a3)
	add.w	#$2c,d1
	move.b	d1,(a3)
	btst	#8,d1
	beq.s	.sety0
	or.b	#4,3(a3)
.sety0:
	add.w	#$2c,d2
	move.b	d2,2(a3)
	btst	#8,d2
	beq.s	.sety1
	or.b	#2,3(a3)
.sety1:
	addq.l	#4,a3
	rts

.do_bounce:
	moveq	#3,d7
.bounce_loop:
	move.l	(a2)+,d0
	tst.w	4(a1)
	bpl	.bounce_right
	add.l	#SpriteBuffer-SpriteAdr,d0
.bounce_right:
	move.l	d0,(a0)+
	lea	SW_len(a1),a1
	dbf	d7,.bounce_loop
	rts

Mine_X:	dc.w	100,100,-1,100	;Mine
	dc.w	120,100,-1,0	;Bombe.

Mine_vz:
	dc.b	0,0

Search_Mine:
	lea	Mine_X(pc),a1
	tst.b	4(a1)
	bmi	Return
	addq.l	#8,a1
	tst.b	4(a1)
	rts

Show_Mines:
	lea	Mine_X(pc),a1
	lea	Mine_defTable(pc),a2
	subq.b	#1,Mine_vz
	bpl.s	.no_anim
	move.b	#8,Mine_vz
	move.l	(a2),d0
	move.l	16(a2),(a2)
	move.l	d0,16(a2)
	move.l	4(a2),d0
	move.l	20(a2),4(a2)
	move.l	d0,20(a2)
.no_anim:
	moveq	#1,d7
.loop:
	tst.b	4(a1)
	bmi	.hide
	movem.w	Scr_Scrolled_X(a6),d2-d3
	sub.w	d2,(a1)
	sub.w	d3,2(a1)
	cmp.w	#-16,(a1)
	blt	.clear
	cmp.w	#304,(a1)
	bgt.s	.clear
	cmp.w	#-13,2(a1)
	blt.s	.clear
	cmp.w	#208,2(a1)
	bgt.s	.clear

	move.w	(a1),d0
	move.w	2(a1),d1
	tst.b	5(a1)
	beq.s	.show_mine
	cmp.b	#5*4,5(a1)
	beq.s	.no_speedup
	addq.b	#1,5(a1)
.no_speedup:
	moveq	#0,d3
	move.b	5(a1),d3
	lsr.b	#2,d3
	add.w	d3,2(a1)
	move.w	d1,d2
	add.w	#16,d2
	bsr	.show_it
	move.l	-4(a3),(a3)+
	move.l	8(a2),(a0)+
	move.l	12(a2),(a0)+

	move.w	(a1),d0
	move.w	2(a1),d1
	addq.w	#3,d1
	movem.l	a0-a1,-(sp)
	bsr	check_kollision
	movem.l	(sp)+,a0-a1
	bne.s	.clear
	bra.s	.next
.show_mine:
	move.w	d1,d2
	add.w	#8,d2
	bsr	.show_it
	move.l	-4(a3),(a3)+
	move.l	(a2),(a0)+
	move.l	4(a2),(a0)+

	subq.w	#1,6(a1)
	bpl.s	.next
.clear:
	move.w	#-1,4(a1)
	moveq	#9,d0
	move.w	(a1),d1
	move.w	2(a1),d2
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	sub.w	#28,d2
	movem.l	d7/a0-a3,-(sp)
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	movem.l	(sp)+,d7/a0-a3
	bra.s	.next
.hide:
	clr.l	(a3)+
	clr.l	(a3)+
	move.l	8(a2),(a0)+
	move.l	12(a2),(a0)+
.next:
	lea	16(a2),a2
	lea	8(a1),a1
	dbf	d7,.loop
	rts

.show_it:
	add.w	#$91,d0
	btst	#0,d0
	beq	.setx0
	move.b	#$81,3(a3)
	bra.s	.setx1
.setx0:
	move.b	#$80,3(a3)
.setx1:
	lsr.w	#1,d0
	move.b	d0,1(a3)
	add.w	#$2c,d1
	move.b	d1,(a3)
	btst	#8,d1
	beq.s	.sety0
	or.b	#4,3(a3)
.sety0:
	add.w	#$2c,d2
	move.b	d2,2(a3)
	btst	#8,d2
	beq.s	.sety1
	or.b	#2,3(a3)
.sety1:
	addq.l	#4,a3
	rts

Mine_defTable:
	dc.l	SpriteAdr+m0_adr,SpriteAdr+m0_adr+40
	dc.l	SpriteAdr+m2_adr,SpriteAdr+m2_adr+72

	dc.l	SpriteAdr+m1_adr,SpriteAdr+m1_adr+40
	dc.l	SpriteAdr+m3_adr,SpriteAdr+m3_adr+72

W_start_shoot:
	lea	SW_table(pc),a1
	moveq	#3,d7
.search:
	tst.w	4(a1)
	beq	.addit
	lea	SW_len(a1),a1
	dbf	d7,.search
	rts				;Nomore possible!
.addit:
	move.w	(a0),d2
	tst.w	T_face
	beq	.to_left
	add.w	#32,d0
	bra.s	.to_right
.to_left:
	neg.w	d2
.to_right:
	cmp.w	#22,T_anim
	bne.s	.no_ducking
	add.w	#9,d1
.no_ducking:
	movem.l	d0-d1/a0-a1,-(sp)
	add.w	#12,d1
	tst.w	d2
	bmi.s	.to_left2
	sub.w	#9,d0
	bra.s	.to_right2
.to_left2:
	sub.w	#16,d0
.to_right2:
	bsr	check_kollision
	movem.l	(sp)+,d0-d1/a0-a1
	bne.s	.no_start

	add.w	2(a0),d1		;Y-Offset

	move.w	d0,(a1)
	move.w	d1,2(a1)
	move.w	d2,4(a1)
	move.w	4(a0),SW_heigth
	move.l	6(a0),SW_defpoint
	move.w	10(a0),SW_width
	move.w	12(a0),10(a1)		;Alle drei Partials starten.
	move.w	14(a0),SW_kolly
	moveq	#0,d7
	rts

.no_start:
	moveq	#-1,d7
	rts

Anim_lazer:
	tst.b	T_weapon
	bne.s	.no_new
	cmp.b	#2,T_power
	bne.s	.no_new
	subq.b	#1,lazer_vz
	bpl.s	.no_new
	move.b	#2,lazer_vz
	lea	SW_deftab3(pc),a0
	cmp.l	SW_defpoint(pc),a0
	bne.s	.set
	lea	SW_deftab3B(pc),a0
.set:
	move.l	a0,SW_defpoint
.no_new:
	rts
lazer_vz:	dc.b	0
		dc.b	0

Init_Lazer:
	moveq	#0,d0
	move.b	T_power,d0
	addq.w	#1,d0
	move.w	d0,SW_power
	rts

Init_Spread:
	moveq	#1,d0
	cmp.b	#2,T_power
	blt.s	.no_big
	moveq	#2,d0
.no_big:
	move.w	d0,SW_power

	lea	SW_deftab4(pc),a2
	lea	sprite_adr(pc),a0
	lea	sprite_pos(pc),a1
	moveq	#3,d7
.loop:
	clr.l	(a1)+
	move.l	(a2)+,(a0)+
	dbf	d7,.loop
	rts

Init_bounce:
	moveq	#0,d0
	move.b	T_power,d0
	add.w	d0,d0
	addq.w	#2,d0
	move.w	d0,SW_power

	cmp.b	#1,T_power
	beq	.b_init2
	bgt	.b_init3

	lea	SW_deftab7(pc),a0
	lea	bounce_offs(pc),a1
	bra.s	.init
.b_init2:
	lea	SW_deftab8(pc),a0
	lea	bounce_offs+8(pc),a1
	bra.s	.init
.b_init3:
	lea	SW_deftab9(pc),a0
	lea	bounce_offs+16(pc),a1
.init:
	move.l	a0,bounce_pointer
	move.l	a1,bounce_offs_pointer

	lea	W_bounce1_info(pc),a1
	move.l	a0,6(a1)
	move.l	bounce_pointer,a2
	move.l	a2,SW_defpoint
	lea	sprite_adr(pc),a0
	moveq	#3,d7
.bounce_loop:
	move.l	(a2)+,(a0)+
	dbf	d7,.bounce_loop

	lea	Bounce_List(pc),a5
	bsr	Kill_Bounce

	lea	Bounce_List+Bounce_len(pc),a5
	bsr	Kill_Bounce
	lea	bounce_coords(pc),a0
	moveq	#-16,d0
	moveq	#-13,d1
	moveq	#7,d7
.loop:
	move.w	d0,(a0)+
	move.w	d1,(a0)+
	dbf	d7,.loop

	lea	custom,a5
	rts

bounce_pointer:		dc.l	0
bounce_offs_pointer:	dc.l	0

Show_bounce:
	lea	SW_table(pc),a1
	lea	bounce_coords(pc),a2
	lea	sprite_adr(pc),a0
	lea	sprite_pos(pc),a3
	move.l	bounce_offs_pointer,a4
	moveq	#3,d7
.loop:
	move.w	Scr_Scrolled_X(a6),d0
	sub.w	4(a1),d0
	sub.w	d0,(a1)
	cmp.w	#-16,(a1)
	ble.s	.stop
	cmp.w	#320,(a1)
	bge.s	.stop
	move.w	Scr_Scrolled_Y(a6),d0
	sub.w	d0,2(a1)
	cmp.w	#-16,(a1)
	ble.s	.stop
	cmp.w	#208,2(a1)
	blt.s	.no_stop
.stop:
	clr.w	4(a1)
.no_stop:
	bsr	.do_one

	lea	SW_len(a1),a1
	addq.l	#4,a0
	addq.l	#4,a2
	addq.l	#4,a3
	addq.l	#2,a4
	dbf	d7,.loop
	lea	Bounce_List(pc),a5
	bsr	Do_Bounce
	move.l	Bounce_X(a5),bounce_coords
	move.l	Bounce_Buffer_1+24,bounce_coords+4
	move.l	Bounce_Buffer_1+16,bounce_coords+8
	move.l	Bounce_Buffer_1+8,bounce_coords+12

	lea	Bounce_List+Bounce_len(pc),a5
	bsr	Do_Bounce
	move.l	Bounce_X(a5),bounce_coords+16
	move.l	Bounce_Buffer_2+24,bounce_coords+20
	move.l	Bounce_Buffer_2+16,bounce_coords+24
	move.l	Bounce_Buffer_2+8,bounce_coords+28

	lea	custom,a5

	rts

.do_one:
	move.w	(a1),d0
	move.w	2(a1),d1		;Diese Y-Koordinate MUSS eingehalten werden.
	tst.w	4(a1)
	beq.s	.only_bounce		;Der Schuss ist weg, nur den bounce bearbeiten.
	bpl.s	.to_right
	sub.w	#16,d0
.to_right:
	moveq	#6,d3
	bsr	.coords_to_ctrl
	move.w	(a4),d1
	addq.w	#1,d1
	asl.w	#2,d1
	move.l	(a0),a5
	move.l	d0,(a5,d1.w)		;Coordinate des Schusses!

	move.w	(a2),d0
	move.w	2(a2),d1
	move.w	(a4),d3
	move.w	d1,d2
	add.w	d3,d2
	addq.w	#1,d2
	cmp.w	2(a1),d2
	blt.s	.no_clip1
	move.w	#-13,d1			;Der Bounce gefhrdet den Schuss -> fllt weg!
	move.w	#-20,d0
.no_clip1:
	bsr	.coords_to_ctrl
	move.l	d0,(a3)

	;Unterer Bounce-Anteil

	move.w	16(a2),d0
	move.w	18(a2),d1
	move.w	(a4),d3

;	move.w	d1,d2
;	sub.w	#8,d2
;	cmp.w	2(a1),d2
;	bge.s	.no_clip2
;	moveq	#0,d0
;	moveq	#0,d1
;.no_clip2:
	bsr	.coords_to_ctrl

	move.w	(a4),d1
	addq.w	#8,d1
	asl.w	#2,d1
	move.l	(a0),a5
	move.l	d0,(a5,d1.w)

	rts

.only_bounce:
	move.w	(a2),d0
	move.w	2(a2),d1
	move.w	(a4),d3
	move.w	d1,d2
	add.w	d3,d2
	addq.w	#1,d2
	bsr	.coords_to_ctrl
	move.l	d0,(a3)

	move.w	2(a2),d1
	move.w	(a4),d3
	add.w	d3,d1
	addq.w	#1,d1
	moveq	#-20,d0
	moveq	#6,d3
	bsr	.coords_to_ctrl
	move.w	(a4),d1
	addq.w	#1,d1
	asl.w	#2,d1
	move.l	(a0),a5
	move.l	d0,(a5,d1.w)		;Coordinate des Schusses!

	;Unterer Bounce-Anteil

	move.w	16(a2),d0
	move.w	18(a2),d1
	move.w	(a4),d3

	bsr	.coords_to_ctrl

	move.w	(a4),d1
	addq.w	#8,d1
	asl.w	#2,d1
	move.l	(a0),a5
	move.l	d0,(a5,d1.w)
	rts

.coords_to_ctrl:
	add.w	#$91,d0
	move.w	d0,d2
	lsr.w	#1,d2
	move.b	d2,help+1
	and.b	#1,d0
	move.b	d0,help+3
	add.w	#$2c,d1
	move.b	d1,help
	btst	#8,d1
	beq.s	.no_first
	or.b	#4,help+3
.no_first:
	add.w	d3,d1			;Hhe
	move.b	d1,help+2
	btst	#8,d1
	beq.s	.no_last
	or.b	#2,help+3
.no_last:
	move.l	help,d0
	rts

	rsreset
Bounce_Used	rs.w	1
Bounce_X	rs.w	1
Bounce_Y	rs.w	1
Bounce_0	rs.w	1
Bounce_1	rs.w	1
Bounce_2	rs.w	1
Bounce_3	rs.l	1
Bounce_len	rs.w	0

Bounce_List:	dc.w	0
		dc.w	100
		dc.w	50
		dc.w	0
		dc.w	0
		dc.w	0
		dc.l	Bounce_Buffer_1

		dc.w	0
		dc.w	100
		dc.w	50
		dc.w	0
		dc.w	0
		dc.w	0
		dc.l	Bounce_Buffer_2

Bounce_Buffer_1:	dc.l	0,0,0,0,0,0,0,0
Bounce_Buffer_2:	dc.l	0,0,0,0,0,0,0,0

Do_Bounce:
	tst.w	Bounce_Used(a5)
	beq	Return

	move.w	Scr_Scrolled_X(a6),d0
	sub.w	d0,Bounce_X(a5)

	move.w	Scr_Scrolled_Y(a6),d0
	sub.w	d0,Bounce_Y(a5)

	moveq	#0,d0
	move.b	Bounce_1(a5),d0			;Jump to actual handler
	jmp	.whandle_tab(pc,d0.w)
.whandle_tab:
	bra.s	.find_wall
	bra.s	.swing_wait
	bra.s	.swing_wall
	bra	.run_out

.find_wall:
	tst.b	Bounce_0+1(a5)			;Test for wall-collision
	beq.s	.to_right
	moveq	#-6,d7
	bra.s	.to_left
.to_right:
	moveq	#6,d7
.to_left:
	movem.w	Bounce_X(a5),d0-d1
	add.w	d7,d1
	bsr	check_kollision
	beq.s	.no_kolli
	addq.b	#2,Bounce_1(a5)
	move.w	#4,Bounce_2(a5)
.no_kolli:
	add.w	d7,Bounce_Y(a5)			;Move shot up/down
	bra	.check_out

.swing_wait:
	subq.w	#1,Bounce_2(a5)			;A short delay-time
	bpl.s	.check_out
	addq.b	#2,Bounce_1(a5)			;Next handler
	move.b	#8,Bounce_1+1(a5)			;Set 1st swing-speed-value
	bra.s	.check_out

.swing_wall:
	move.b	Bounce_1+1(a5),d0			;Get swing-speed
	ext.w	d0
	tst.b	Bounce_0+1(a5)			;Upper or lower wall-runner ?
	beq.s	.down
	add.w	d0,Bounce_Y(a5)			;Move down...
	bra.s	.up
.down:
	sub.w	d0,Bounce_Y(a5)			;Move up...
.up:
	tst.b	Bounce_0(a5)			;Left or right faced ?
	beq.s	.right
	moveq	#-7,d0				;Move left...
	bra.s	.left
.right:
	moveq	#7,d0				;Move right...
.left:
	add.w	d0,Bounce_X(a5)
	subq.b	#2,Bounce_1+1(a5)		;Speed down a bit
	cmpi.b	#-8,Bounce_1+1(a5)		;Fully reversed ?
	bne.s	.not_complete
	sf	Bounce_1(a5)			;Yes, back to first handler
	bra.s	.check_out
.not_complete:
	movem.w	Bounce_X(a5),d0-d1		;No, test for wall...
	bsr	check_kollision
	beq.s	.check_out
;	bsr	end_run				;Yes, let shot explode

	bsr	Xplo_Bounce
	bra	Kill_Bounce

.check_out:
	cmp.w	#-16,Bounce_X(a5)
	ble.s	.stop
	cmp.w	#320,Bounce_X(a5)
	bge.s	.stop
	cmp.w	#-16,Bounce_Y(a5)
	ble.s	.stop
	cmp.w	#208,Bounce_Y(a5)
	blt.s	.set_positions
.stop:
	move.w	#-16,Bounce_X(a5)
	move.w	#-13,Bounce_Y(a5)
	move.w	#7,Bounce_2(a5)
	move.b	#6,Bounce_1(a5)
.set_positions:
	move.w	Scr_Scrolled_X(a6),d0
	move.w	Scr_Scrolled_X(a6),d1
	move.l	Bounce_3(a5),a0			;and "scroll" the stored positions
	lea	4(a0),a1
	moveq	#6,d4
.copy:
	move.w	(a1)+,d2
	move.w	(a1)+,d3
	sub.w	d0,d2
	sub.w	d1,d3
	move.w	d2,(a0)+
	move.w	d3,(a0)+
	dbf	d4,.copy
	move.l	Bounce_X(a5),(a0)
	rts

.run_out:
	move.w	#-16,Bounce_X(a5)
	move.w	#-13,Bounce_Y(a5)
	subq.w	#1,Bounce_2(a5)
	bpl.s	.set_positions
	clr.w	Bounce_Used(a5)
	rts

Kill_Bounce:
	moveq	#-16,d0
	moveq	#-13,d1
	move.l	Bounce_3(a5),a0
	moveq	#7,d7
.clear:
	move.w	d0,(a0)+
	move.w	d1,(a0)+
	dbf	d7,.clear

	move.w	d0,Bounce_X(a5)
	move.w	d1,Bounce_Y(a5)

	clr.w	Bounce_Used(a5)
	rts

Xplo_Bounce:
	moveq	#2,d0
	movem.w	Bounce_X(a5),d1-d2
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	rts

	;Koordinaten aller Bounce-teile.
bounce_coords:
	dc.w	10,10,20,20,30,30,40,40
	dc.w	10,110,20,120,30,130,40,140

bounce_offs:
	dc.w	11,6,6,6
	dc.w	13,11,11,6
	dc.w	15,13,11,6

Blit_Spread:
	lea	SW_table(pc),a1
	lea	sprite_adr(pc),a0
	lea	sprite_pos(pc),a3
	clr.l	bltcmod(a5)		;Alle Modulos lschen
	clr.l	bltamod(a5)
	move.l	#-1,bltafwm(a5)
	clr.w	bltcon1(a5)
	cmp.b	#1,T_power
	blt	Return
	bgt	.not_2
	moveq	#3,d7
.loop:
	tst.l	(a3)
	beq	.next

	move.w	Scr_Scrolled_Y(a6),d0
	sub.w	d0,6(a1)
	sub.w	d0,8(a1)

	tst.w	4(a1)
	bpl.s	.right
	lea	left_small_spread(pc),a4
	bra.s	.left
.right:
	lea	right_small_spread(pc),a4
.left:

	move.l	(a0),d0
	addq.l	#4,d0

	move.w	#$09f0,bltcon0(a5)
	btst	#0,10(a1)
	bne.s	.blit_it1
	move.w	#$0100,bltcon0(a5)
.blit_it1:
	move.l	d0,bltdpth(a5)
	move.l	(a4),bltapth(a5)	;Obersten Schuss blitten.
	move.w	#64*7+2,bltsize(a5)
.bwait1:
	btst	#14,dmaconr(a5)
	bne.s	.bwait1
	move.w	#$0100,bltcon0(a5)
	move.w	#64*15+2,bltsize(a5)	;Clearen des Sprites.
.bwait0:
	btst	#14,dmaconr(a5)
	bne.s	.bwait0

	;Checken, ob sichs noch berlappt

	moveq	#0,d1
	move.w	8(a1),d1
	sub.w	2(a1),d1
	cmp.w	#15,d1
	bge.s	.no_cross

	asl.w	#2,d1
	add.l	d0,d1

	move.l	d1,bltdpth(a5)
	move.w	#$09f0,bltcon0(a5)
	btst	#2,10(a1)
	bne.s	.blit_it2
	clr.w	bltcon0(a5)
.blit_it2:
	move.l	4(a4),bltapth(a5)
	move.w	#-8,bltamod(a5)
	move.w	#64*7+2,bltsize(a5)
.bwait2:
	btst	#14,dmaconr(a5)
	bne.s	.bwait2

	clr.w	bltamod(a5)

	btst	#1,10(a1)
	beq	.next

	moveq	#0,d2
	move.w	6(a1),d2
	sub.w	2(a1),d2

	asl.w	#2,d2
	add.l	d0,d2

	move.l	d2,bltdpth(a5)
	move.l	d2,bltcpth(a5)
	move.l	8(a4),bltbpth(a5)
	move.l	12(a4),bltapth(a5)
	move.w	#$0fca,bltcon0(a5)
	move.w	#64*6+2,bltsize(a5)
.bwait3:
	btst	#14,dmaconr(a5)
	bne.s	.bwait3

	bra	.next

.no_cross:
	move.l	d0,a2
	move.l	(a3),d6
	and.b	#$f1,d6
	move.l	d6,-4(a2)
	move.w	2(a1),d2
	moveq	#7,d3
	bsr	.calc_ycoord
	btst	#0,10(a1)
	bne.s	.is_there
	clr.b	-3(a2)
.is_there:
	move.l	-4(a2),(a3)

	add.l	#7*4,a2
	move.l	d6,(a2)+
	move.w	6(a1),d2
	moveq	#6,d3
	bsr	.calc_ycoord
	btst	#1,10(a1)
	bne.s	.is_there2
	clr.b	-3(a2)
.is_there2:

	move.w	#$09f0,bltcon0(a5)
	move.l	8(a4),bltapth(a5)
	move.l	a2,bltdpth(a5)
	move.w	#64*6+2,bltsize(a5)
.bwait4:
	btst	#14,dmaconr(a5)
	bne.s	.bwait4

	add.l	#6*4,a2
	move.l	d6,(a2)+
	move.w	8(a1),d2
	moveq	#7,d3
	bsr	.calc_ycoord
	btst	#2,10(a1)
	bne.s	.is_there3
	clr.b	-3(a2)
.is_there3:

	move.l	a2,bltdpth(a5)
	move.l	4(a4),bltapth(a5)
	move.w	#-8,bltamod(a5)
	move.w	#64*7+2,bltsize(a5)
.bwait5:
	btst	#14,dmaconr(a5)
	bne.s	.bwait5
	clr.w	bltamod(a5)
.next:
	bsr	.move_vertikal
	addq.l	#4,a0
	addq.l	#4,a3
	lea	SW_len(a1),a1
	dbf	d7,.loop
	rts

.not_2:
	moveq	#3,d7
.Bloop:
	tst.l	(a3)
	beq	.Bnext

	move.w	Scr_Scrolled_Y(a6),d0
	sub.w	d0,6(a1)
	sub.w	d0,8(a1)

	tst.w	4(a1)
	bpl.s	.Bright
	lea	left_big_spread(pc),a4
	bra.s	.Bleft
.Bright:
	lea	right_big_spread(pc),a4
.Bleft:

	move.l	(a0),d0
	addq.l	#4,d0

	move.w	#$09f0,bltcon0(a5)
	btst	#0,10(a1)
	bne.s	.Bblit_it1
	move.w	#$0100,bltcon0(a5)
.Bblit_it1:
	move.l	d0,bltdpth(a5)
	move.l	(a4),bltapth(a5)	;Obersten Schuss blitten.
	move.w	#64*14+2,bltsize(a5)
.Bbwait1:
	btst	#14,dmaconr(a5)
	bne.s	.Bbwait1
	move.w	#$0100,bltcon0(a5)
	move.w	#64*29+2,bltsize(a5)	;Clearen des Sprites.
.Bbwait0:
	btst	#14,dmaconr(a5)
	bne.s	.Bbwait0

	;Checken, ob sichs noch berlappt

	moveq	#0,d1
	move.w	8(a1),d1
	sub.w	2(a1),d1
	cmp.w	#29,d1
	bge	.Bno_cross

	move.l	4(a4),d3
	moveq	#14,d2
	sub.w	d1,d2
	ble.s	.no_lapp

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

	sub.w	d2,d3
	sub.w	d2,d3
	sub.w	d2,d3
	sub.w	d2,d3

	neg.w	d2
	add.w	#14,d2
	asl.w	#6,d2
	or.w	#2,d2
	bra.s	.lapp
.no_lapp:
	move.w	#64*14+2,d2
.lapp:
	asl.w	#2,d1
	add.l	d0,d1

	move.l	d1,bltdpth(a5)
	move.w	#$09f0,bltcon0(a5)
	btst	#2,10(a1)
	bne.s	.Bblit_it2
	clr.w	bltcon0(a5)
.Bblit_it2:
	move.l	d3,bltapth(a5)
	move.w	#-8,bltamod(a5)
	move.w	d2,bltsize(a5)
.Bbwait2:
	btst	#14,dmaconr(a5)
	bne.s	.Bbwait2

	clr.w	bltamod(a5)

	btst	#1,10(a1)
	beq	.Bnext

	moveq	#0,d2
	move.w	6(a1),d2
	sub.w	2(a1),d2

	asl.w	#2,d2
	add.l	d0,d2

	move.l	d2,bltdpth(a5)
	move.l	d2,bltcpth(a5)
	move.l	8(a4),bltbpth(a5)
	move.l	12(a4),bltapth(a5)
	move.w	#$0fca,bltcon0(a5)
	move.w	#64*13+2,bltsize(a5)
.Bbwait3:
	btst	#14,dmaconr(a5)
	bne.s	.Bbwait3

	bra	.Bnext

.Bno_cross:
	move.l	d0,a2
	move.l	(a3),d6
	and.b	#$f1,d6
	move.l	d6,-4(a2)
	move.w	2(a1),d2
	moveq	#14,d3
	bsr	.calc_ycoord
	btst	#0,10(a1)
	bne.s	.Bis_there1
	clr.b	-3(a2)
.Bis_there1:

	move.l	-4(a2),(a3)

	add.l	#14*4,a2
	move.l	d6,(a2)+
	move.w	6(a1),d2
	moveq	#13,d3
	bsr	.calc_ycoord
	btst	#1,10(a1)
	bne.s	.Bis_there2
	clr.b	-3(a2)
.Bis_there2:

	move.w	#$09f0,bltcon0(a5)
	move.l	8(a4),bltapth(a5)
	move.l	a2,bltdpth(a5)
	move.w	#64*13+2,bltsize(a5)
.Bbwait4:
	btst	#14,dmaconr(a5)
	bne.s	.Bbwait4

	add.l	#13*4,a2
	move.l	d6,(a2)+
	move.w	8(a1),d2
	moveq	#14,d3
	bsr	.calc_ycoord
	btst	#2,10(a1)
	bne.s	.Bis_there3
	clr.b	-3(a2)
.Bis_there3:

	move.l	a2,bltdpth(a5)
	move.l	4(a4),bltapth(a5)
	move.w	#-8,bltamod(a5)
	move.w	#64*14+2,bltsize(a5)
.Bbwait5:
	btst	#14,dmaconr(a5)
	bne.s	.Bbwait5
	clr.w	bltamod(a5)
.Bnext:
	bsr	.move_vertikal
	addq.l	#4,a0
	addq.l	#4,a3
	lea	SW_len(a1),a1
	dbf	d7,.Bloop
	rts

.move_vertikal:
	move.w	half_pixel(pc),d0
	sub.w	#1,2(a1)
	sub.w	d0,2(a1)
	add.w	#1,8(a1)
	add.w	d0,8(a1)
	rts

.calc_ycoord:
	add.w	#$2c,d2
	move.b	d2,-4(a2)
	btst	#8,d2
	beq.s	.no_y0
	or.b	#4,-1(a2)
.no_y0:
	add.w	d3,d2
	move.b	d2,-2(a2)
	btst	#8,d2
	beq.s	.no_y1
	or.b	#2,-1(a2)
.no_y1:
	rts

half_pixel:	dc.w	1
quarter_pixel:	dc.w	1
eights_pixel:	dc.w	1
help_pixel:	dc.w	0

right_small_spread:
	dc.l	s12_adr+SpriteAdr+4,s12_adr+SpriteAdr+4*7
	dc.l	s0_adr+SpriteAdr+4,sm1_adr+SpriteAdr+4

left_small_spread:
	dc.l	s12_adr+SpriteBuffer+4,s12_adr+SpriteBuffer+4*7
	dc.l	s0_adr+SpriteBuffer+4,sm1_adr+SpriteBuffer+4

right_big_spread:
	dc.l	s13_adr+SpriteAdr+4,s13_adr+SpriteAdr+4*14
	dc.l	s14_adr+SpriteAdr+4,sm1_adr+SpriteAdr+4

left_big_spread:
	dc.l	s13_adr+SpriteBuffer+4,s13_adr+SpriteBuffer+4*14
	dc.l	s14_adr+SpriteBuffer+4,sm1_adr+SpriteBuffer+4

change_weapons:
	move.b	T_weapon_new,d0
	cmp.b	T_weapon,d0
	bne.s	.in
	move.b	T_power_new,d0
	cmp.b	T_power,d0
	beq.s	.ok2

.in:
	tst.b	T_flash
	bne.s	.ok
	move.b	#29,T_flash
.ok:
	st	T_noshot		;Schsse sperren.

	lea	SW_table(pc),a1
	moveq	#3,d7
	moveq	#0,d0
.search:
	or.w	4(a1),d0
	lea	SW_len(a1),a1
	dbf	d7,.search

	tst.w	d0
	bne	.out

	move.b	T_weapon_new,T_weapon
	move.b	T_power_new,T_power
	bsr	select_weapon
.ok2:
	sf	T_noshot
	rts
.out:
	rts

select_weapon:
	moveq	#0,d0
	move.b	T_weapon,d0
	add.w	d0,d0
	add.w	d0,d0
	lea	.startup_tab(pc),a0
	move.l	(a0,d0.w),a0
	lea	$dff1a2,a1

	move.w	(a0)+,d0
	move.w	d0,Col_Buffer+8
	move.w	d0,B_coltab+34
	move.w	d0,B_coltab+34+8
	move.w	d0,8(a1)
	move.w	d0,(a1)+
	move.w	(a0)+,d0
	move.w	d0,Col_Buffer+10
	move.w	d0,B_coltab+36
	move.w	d0,B_coltab+36+8
	move.w	d0,8(a1)
	move.w	d0,(a1)
	move.l	(a0)+,SW_spec_rout
	move.l	(a0)+,a0
	jmp	(a0)

.startup_tab:
	dc.l	lazer_startup
	dc.l	spread_startup
	dc.l	blue_startup

spread_startup:
	dc.w	$ec0,$e82
	dc.l	Blit_Spread
	dc.l	Init_Spread
lazer_startup:
	dc.w	$8c1,$080
	dc.l	Anim_lazer
	dc.l	Init_Lazer

blue_startup:
	dc.w	$5ad,$6bf
	dc.l	Show_bounce
	dc.l	Init_bounce

SW_deftab1:	;Lazer small.
	dc.l	w0_adr+SpriteAdr,w1_adr+SpriteAdr,w2_adr+SpriteAdr,w3_adr+SpriteAdr
SW_deftab2:	;Lazer mid.
	dc.l	w4_adr+SpriteAdr,w5_adr+SpriteAdr,w6_adr+SpriteAdr,w7_adr+SpriteAdr
SW_deftab3:	;Lazer big.
	dc.l	w8_adr+SpriteAdr,w9_adr+SpriteAdr
	dc.l	w10_adr+SpriteAdr,w11_adr+SpriteAdr
SW_deftab3B:	;Lazer big.
	dc.l	w12_adr+SpriteAdr,w13_adr+SpriteAdr
	dc.l	w14_adr+SpriteAdr,w15_adr+SpriteAdr

SW_deftab4:	;Spread small
	dc.l	s0_adr+SpriteAdr,s1_adr+SpriteAdr,s2_adr+SpriteAdr,s3_adr+SpriteAdr
SW_deftab5:	;Spread mid
	dc.l	s4_adr+SpriteAdr,s5_adr+SpriteAdr,s6_adr+SpriteAdr,s7_adr+SpriteAdr
SW_deftab6:	;Spread big
	dc.l	s8_adr+SpriteAdr,s9_adr+SpriteAdr,s10_adr+SpriteAdr,s11_adr+SpriteAdr

SW_deftab7:	;Bounce small
	dc.l	b2_adr+SpriteAdr,b4_adr+SpriteAdr,b5_adr+SpriteAdr,b6_adr+SpriteAdr
SW_deftab8:	;Bounce mid
	dc.l	b1_adr+SpriteAdr,b2_adr+SpriteAdr,b3_adr+SpriteAdr,b4_adr+SpriteAdr
SW_deftab9:	;Bounce big
	dc.l	b0_adr+SpriteAdr,b1_adr+SpriteAdr,b2_adr+SpriteAdr,b4_adr+SpriteAdr

	;In dieser Tabelle stehen alle Schsse, die OnScreen sind.

SW_len	= 12

SW_table:
	dc.w	100,100			;X,Y
	dc.w	0			;Speed
	dc.w	0,0			;Y2/Y3
	dc.w	0			;existing/notexisting Flags

	dc.w	120,100
	dc.w	0			;Speed
	dc.w	0,0			;Y2/Y3
	dc.w	0			;existing/notexisting Flags

	dc.w	140,100
	dc.w	0			;Speed
	dc.w	0,0			;Y2/Y3
	dc.w	0			;existing/notexisting Flags

	dc.w	160,100
	dc.w	0			;Speed
	dc.w	0,0			;Y2/Y3
	dc.w	0			;existing/notexisting Flags

W_lazer1_info:
	dc.w	8			;Speed
	dc.w	7			;Y-Offset
	dc.w	9			;Heigth
	dc.l	SW_deftab1		;def_table
	dc.w	0			;Width
	dc.b	1,8
	dc.w	8

W_lazer2_info:
	dc.w	8			;Speed
	dc.w	4			;Y-Offset
	dc.w	16			;Heigth
	dc.l	SW_deftab2		;def_table
	dc.w	0			;Width
	dc.b	1,3
	dc.w	15

W_lazer3_info:
	dc.w	8			;Speed
	dc.w	-4			;Y-Offset
	dc.w	31			;Heigth
	dc.l	SW_deftab3		;def_table
	dc.w	1			;Width
	dc.b	1,0
	dc.w	30

W_spread1_info:
	dc.w	8
	dc.w	8
	dc.w	6
	dc.l	SW_deftab4
	dc.w	0
	dc.b	1,8
	dc.w	8

W_spread2_info:
	dc.w	8
	dc.w	4
	dc.w	22
	dc.l	SW_deftab5
	dc.w	0
	dc.b	7,8
	dc.w	8

W_spread3_info:
	dc.w	8
	dc.w	1
	dc.w	43
	dc.l	SW_deftab6
	dc.w	0
	dc.b	7,0
	dc.w	8

W_bounce1_info:
	dc.w	8			;Speed
	dc.w	7			;Y-Offset
	dc.w	38			;Heigth
	dc.l	SW_deftab7		;def_table
	dc.w	0			;Width
	dc.b	1,8
	dc.w	8

SW_defpoint:	dc.l	SW_deftab2
SW_heigth:	dc.w	0
SW_width:	dc.w	2
SW_spec_rout:	dc.l	Return
SW_power:	dc.w	1
SW_kolly:	dc.w	0

T_anim:		dc.w	5
T_posX:		dc.l	100*65536
T_posY:		dc.l	90*65536
T_speedX:	dc.l	0
T_speedY:	dc.l	0
T_face:		dc.w	0

T_anvz:		dc.w	0
T_anpos:	dc.w	0
T_ansize:	dc.w	0
T_antab:	dc.l	0
T_anspeed:	dc.w	0

sprite_adr:	dc.l	0,0,0,0,0,0,0,0
sprite_pos:	dc.l	0,0,0,0,0,0,0,0

T_walk_tab:	dc.b	0,1,2,3,4,5,6,7
T_roll_tab:	dc.b	31,30,29,28

	even

T_animtab_len:
	dc.b	28,32,29,36,22,37,34,36,35,33,35,37,22,37,23,36
	dc.b	43,36,42,36,41,36,41,36,37,36,36,36,34,36,33,36
	dc.b	32,36,29,36,29,36,29,36,29,36
	dc.b	23,41,20,27,29,36,35,28,35,34,26,32,24,26
	dc.b	23,19,23,19,23,19,21,20
	dc.b	35,36,33,36,36,36,36,22,36,36

T_animtab_offs:
	dc.b	7,0,7,0,7,0,0,0,0,0,2,0,7,0,7,0
	dc.b	0,7,0,6,0,5,0,5,0,1,0,0,2,0,3,0
	dc.b	4,0,7,0,7,0,7,0,7,0
	dc.b	7,0,7,0,7,0,1,0,0,0,1,0,2,0
	dc.b	0,3,0,2,0,2,0,0
	dc.b	0,0,1,0,0,0,0,8,0,0

T_animtab_adr:
	dc.w	t01_adr,t02_adr,t03_adr,t04_adr,t05_adr,t06_adr,t07_adr,t08_adr,t09_adr,t10_adr
	dc.w	t11_adr,t12_adr,t13_adr,t14_adr,t15_adr,t16_adr,t17_adr,t18_adr,t19_adr,t20_adr
	dc.w	t21_adr,t22_adr,t23_adr,t24_adr,t25_adr,t26_adr,t27_adr,t28_adr,t29_adr,t30_adr
	dc.w	t31_adr,t32_adr,t33_adr,t34_adr,t35_adr,t36_adr,t37_adr

T_animtab_xy:
	dc.b	0,0, 0,-1, 0,-2, 2,-1, 2,0, 1,-2, 0,-2, 0,-2, 1,-8, 1,-7
	dc.b	1,-6,0,-6,-1,-2,-2,-1,-2,-1,-3,-1,-3,-1,-3,-1,-3,-1,-3,-1
	dc.b	-2,-1,-3,-3,-3,8,-3,-1,-3,0,1,0,0,3,0,9
	dc.b	4,13,4,13,4,13,5,14,0,0,0,0,0,0,0,0,0,0

t01_len	= (28+32+4)*8
t02_len	= (29+36+4)*8
t03_len	= (22+37+4)*8
t04_len	= (34+36+4)*8
t05_len	= (35+33+4)*8
t06_len	= (35+37+4)*8
t07_len	= (22+37+4)*8
t08_len	= (23+36+4)*8
t09_len	= (43+36+4)*8
t10_len	= (42+36+4)*8
t11_len	= (41+36+4)*8
t12_len	= (41+36+4)*8
t13_len	= (37+36+4)*8
t14_len	= (36+36+4)*8
t15_len	= (34+36+4)*8
t16_len	= (33+36+4)*8
t17_len	= (32+36+4)*8
t18_len	= (29+36+4)*8
t19_len	= (29+36+4)*8
t20_len	= (29+36+4)*8

t21_len	= (29+36+4)*8

t22_len	= (23+41+4)*8
t23_len	= (20+27+4)*8
t24_len	= (29+36+4)*8
t25_len	= (35+28+4)*8
t26_len	= (35+34+4)*8
t27_len	= (26+32+4)*8
t28_len	= (24+26+4)*8
t29_len	= (23+19+4)*8
t30_len	= (23+19+4)*8
t31_len	= (23+19+4)*8
t32_len	= (21+20+4)*8

t33_len	= (35+36+4)*8
t34_len	= (33+36+4)*8
t35_len	= (36+36+4)*8
t36_len	= (36+22+4)*8
t37_len	= (36+36+4)*8

w0_len	= (9+2)*4
w4_len	= (16+2)*4
w8_len	= (31+2)*4

s0_len	= (6+2)*4
s4_len	= (22+2)*4
s8_len	= (43+2)*4
s12_len	= (7+2)*4
s13_len	= (14+2)*4
s14_len	= (13+2)*4

b0_len	= (38+2)*4
b1_len	= (34+2)*4
b2_len	= (30+2)*4
b3_len	= (20+2)*4

m0_len	= (8+2)*8
m1_len	= (8+2)*8
m2_len	= (16+2)*8

t01_adr	= 0
t02_adr = t01_adr+t01_len
t03_adr = t02_adr+t02_len
t04_adr = t03_adr+t03_len
t05_adr = t04_adr+t04_len
t06_adr = t05_adr+t05_len
t07_adr = t06_adr+t06_len
t08_adr = t07_adr+t07_len
t09_adr = t08_adr+t08_len
t10_adr = t09_adr+t09_len
t11_adr = t10_adr+t10_len
t12_adr = t11_adr+t11_len
t13_adr = t12_adr+t12_len
t14_adr = t13_adr+t13_len
t15_adr = t14_adr+t14_len
t16_adr = t15_adr+t15_len
t17_adr = t16_adr+t16_len
t18_adr = t17_adr+t17_len
t19_adr = t18_adr+t18_len
t20_adr = t19_adr+t19_len
t21_adr = t20_adr+t20_len
t22_adr = t21_adr+t21_len
t23_adr = t22_adr+t22_len
t24_adr = t23_adr+t23_len
t25_adr = t24_adr+t24_len
t26_adr = t25_adr+t25_len
t27_adr = t26_adr+t26_len
t28_adr = t27_adr+t27_len
t29_adr	= t28_adr+t28_len
t30_adr	= t29_adr+t29_len
t31_adr	= t30_adr+t30_len
t32_adr	= t31_adr+t31_len
t33_adr	= t32_adr+t32_len
t34_adr	= t33_adr+t33_len
t35_adr	= t34_adr+t34_len
t36_adr	= t35_adr+t35_len
t37_adr	= t36_adr+t36_len

w0_adr	= t37_adr+t37_len
w1_adr	= w0_adr+w0_len
w2_adr	= w1_adr+w0_len
w3_adr	= w2_adr+w0_len

w4_adr	= w3_adr+w0_len
w5_adr	= w4_adr+w4_len
w6_adr	= w5_adr+w4_len
w7_adr	= w6_adr+w4_len

w8_adr	= w7_adr+w4_len
w9_adr	= w8_adr+w8_len
w10_adr	= w9_adr+w8_len
w11_adr	= w10_adr+w8_len
w12_adr	= w11_adr+w8_len
w13_adr	= w12_adr+w8_len
w14_adr	= w13_adr+w8_len
w15_adr	= w14_adr+w8_len

s0_adr	= w15_adr+w8_len
s1_adr	= s0_adr+s0_len
s2_adr	= s1_adr+s0_len
s3_adr	= s2_adr+s0_len

s4_adr	= s3_adr+s0_len
s5_adr	= s4_adr+s4_len
s6_adr	= s5_adr+s4_len
s7_adr	= s6_adr+s4_len

s8_adr	= s7_adr+s4_len
s9_adr	= s8_adr+s8_len
s10_adr	= s9_adr+s8_len
s11_adr	= s10_adr+s8_len

s12_adr	= s11_adr+s8_len
s13_adr	= s12_adr+s12_len
s14_adr	= s13_adr+s13_len

sm1_adr	= s14_adr+s14_len

b0_adr	= sm1_adr+s14_len
b1_adr	= b0_adr+b0_len
b2_adr	= b1_adr+b1_len
b3_adr	= b2_adr+b2_len
b4_adr	= b3_adr+b2_len
b5_adr	= b4_adr+b3_len
b6_adr	= b5_adr+b3_len

m0_adr	= b6_adr+b3_len
m1_adr	= m0_adr+m0_len
m2_adr	= m1_adr+m1_len
m3_adr	= m2_adr+m2_len

s_len	= m3_adr+m2_len

* Tastatur-system *

Init_keys:
	move.b	#%00000000,$bfee01
	move.b	#%00000000,$bfef01
	move.b	#%01111111,$bfed01
	move.b	$bfed01,d0
	move.b	#%10001000,$bfed01
	move.b	#100,$bfe401
	move.b	#0,$bfe501
	move.b	#%00010001,$bfee01
	lea	keysin(pc),a0
	move.l	a0,$68
	rts

keysin:
	movem.l	d0-d1,-(sp)
	move.b	$bfec01,d0		;Daten auslesen.
	move.b	#%11111111,$bfec01	;Eins bit ausgeben.
	move.b	#%01001001,$bfee01
	eor.b	#$ff,d0
	ror.b	#1,d0
	move.b	d0,G_keycode

	move.b	#%01011001,$bfee01	;Timer A oneshoot

	move.b	d0,d1
	and.b	#127,d0

	cmp.b	#$40,d1
	beq	.space
	cmp.b	#$46,d0
	beq	.key1
	cmp.b	#$5f,d0
	bne	.key0
	moveq	#0,d0
	bra	.setkey
.key1:
	moveq	#1,d0
.setkey:
	move.l	a0,-(sp)
	lea	G_keytab(pc),a0
	move.b	d1,(a0,d0.w)
	move.l	(sp)+,a0

.key0:
	move.b	$bfed01,d0
	btst	#0,d0
	beq	.key0		;Auf den Timeout warten.

	move.b	#%00000000,$bfee01
	move.w	#$0008,intreq+$dff000
	move.b	$bfed01,d0
	movem.l	(sp)+,d0-d1
	rte

.space:
 	move.b	#1,G_keytab+2
	bra	.key0


G_keycode:	dc.b	0
G_keytab:	dc.b	-1,-1,-1

*--------------------------------------------------------------------------
*- - - - - - - COLLISION SYSTEM - - - - - - - -
*--------------------------------------------------------------------------
;	dc.w	100,100			;X,Y
;	dc.w	0			;Speed
;	dc.w	0,0			;Y2/Y3
;	dc.w	0			;existing/notexisting Flags

check_weapons:
	cmp.b	#2,T_weapon
	bne.s	.no_bounce_check

	lea	Bounce_List(pc),a5
	bsr	.check_bounce
	lea	Bounce_len(a5),a5
	bsr	.check_bounce

	lea	custom,a5
.no_bounce_check:
	lea	SW_table(pc),a1
	moveq	#3,d7
.mloop:
	tst.w	4(a1)
	beq	.still_alive
	bmi	.to_left

	moveq	#0,d6
	btst	#0,10(a1)
	beq.s	.no_1
	moveq	#1,d6
	move.w	(a1),d0
	move.w	2(a1),d1
	bsr	check_kollision
	bne.s	.stop1

	move.w	(a1),d0
	move.w	2(a1),d1
	add.w	#16,d0
	bsr	.check_shoot
	beq.s	.no_1
	bsr	.hit_enemy
.stop1:
	bclr	#0,10(a1)
	move.w	2(a1),d2
	bsr	.start_xplo
.no_1:
	btst	#1,10(a1)
	beq.s	.no_2
	moveq	#1,d6
	move.w	(a1),d0
	move.w	6(a1),d1
	bsr	check_kollision
	bne.s	.stop2
	move.w	(a1),d0
	move.w	6(a1),d1
	add.w	#16,d0
	bsr	.check_shoot
	beq.s	.no_2
	bsr	.hit_enemy
.stop2:
	bclr	#1,10(a1)
	move.w	6(a1),d2
	bsr	.start_xplo
.no_2:
	btst	#2,10(a1)
	beq.s	.no_3
	moveq	#1,d6
	move.w	(a1),d0
	move.w	8(a1),d1
	bsr	check_kollision
	bne.s	.stop3
	move.w	(a1),d0
	move.w	8(a1),d1
	add.w	#16,d0
	bsr	.check_shoot
	beq.s	.no_3
	bsr	.hit_enemy
.stop3:
	bclr	#2,10(a1)
	move.w	8(a1),d2
	bsr	.start_xplo
.no_3:
	bra	.next

.to_left:
	moveq	#0,d6
	btst	#0,10(a1)
	beq.s	.lno_1
	moveq	#1,d6
	move.w	(a1),d0
	move.w	2(a1),d1
	sub.w	#24,d0
	bsr	check_kollision
	bne.s	.lstop1
	move.w	(a1),d0
	move.w	2(a1),d1
	bsr	.check_shoot
	beq.s	.lno_1
	bsr	.hit_enemy
.lstop1:
	bclr	#0,10(a1)
	move.w	2(a1),d2
	bsr	.start_xplo2
.lno_1:
	btst	#1,10(a1)
	beq.s	.lno_2
	moveq	#1,d6
	move.w	(a1),d0
	move.w	6(a1),d1
	sub.w	#24,d0
	bsr	check_kollision
	bne.s	.lstop2
	move.w	(a1),d0
	move.w	6(a1),d1
	bsr	.check_shoot
	beq.s	.lno_2
	bsr	.hit_enemy
.lstop2:
	bclr	#1,10(a1)
	move.w	6(a1),d2
	bsr	.start_xplo2
.lno_2:
	btst	#2,10(a1)
	beq.s	.lno_3
	moveq	#1,d6
	move.w	(a1),d0
	move.w	8(a1),d1
	sub.w	#24,d0
	bsr	check_kollision
	bne.s	.lstop3
	move.w	(a1),d0
	move.w	8(a1),d1
	bsr	.check_shoot
	beq.s	.lno_3
	bsr	.hit_enemy
.lstop3:
	bclr	#2,10(a1)
	move.w	8(a1),d2
	bsr	.start_xplo2
.lno_3:
.next:
	tst.w	d6
	bne.s	.still_alive
	clr.w	4(a1)		;Kill Salve!
.still_alive:
	lea	SW_len(a1),a1
	dbf	d7,.mloop
	rts

.start_xplo2:
	moveq	#2,d0
	move.w	(a1),d1
	sub.w	#16,d1
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	moveq	#0,d3
	move.b	11(a1),d3
	sub.w	d3,d2
	movem.l	d6-d7/a1,-(sp)
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	movem.l	(sp)+,d6-d7/a1
	rts

.start_xplo:
	moveq	#2,d0
	move.w	(a1),d1
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	moveq	#0,d3
	move.b	11(a1),d3
	sub.w	d3,d2
	movem.l	d6-d7/a1,-(sp)
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	movem.l	(sp)+,d6-d7/a1
	rts

.check_shoot:
	subq.w	#8,d0
	move.w	d0,d2
	move.w	d1,d3
	subq.w	#8,d0
	subq.w	#4,d1
	addq.w	#8,d2
	add.w	SW_kolly,d3
	movem.l	d6/a1,-(sp)
	bsr	check_rec
	movem.l	(sp)+,d6/a1
	rts

.hit_enemy:
	tst.w	Bob_Hit(a0)
	bne.s	.ok2
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.ok
	move.w	SW_power,d0
	sub.w	d0,Bob_Power(a0)
	bpl.s	.ok
	clr.w	Bob_Power(a0)
.ok:
	move.w	#4,Bob_Hit(a0)
.ok2:
	rts

.check_bounce:
	tst.w	Bounce_Used(a5)
	beq.s	.no_bounce
	move.w	Bounce_X(a5),d0
	move.w	Bounce_Y(a5),d1
	move.w	d0,d2
	move.w	d1,d3
;	subq.w	#4,d1
	add.w	#16,d2
	add.w	#16,d3
	movem.l	d6/a1,-(sp)
	bsr	check_rec
	movem.l	(sp)+,d6/a1
	beq.s	.no_bounce
	move.w	SW_power,d1
	move.w	#2,SW_power
	bsr	.hit_enemy
	move.w	d1,SW_power
	bsr	Xplo_Bounce
	bsr	Kill_Bounce
.no_bounce:
	rts

check_player:
	move.w	T_posX,d0
	move.w	T_posY,d1

	addq.w	#4,d1
	add.w	#10,d0
	move.w	d0,d2
	move.w	d1,d3

	add.w	#24,d3
	add.w	#18,d2

	bsr	check_rec
	beq	Return
	cmp.w	#-1,Bob_Power(a0)
	beq	Return
	cmp.b	#BOB_NOPLCOL,Bob_Used(a0)
	rts

make_plhit:
	tst.b	smart_bomb
	bne	Return
	tst.b	T_dieing
	bne.s	.ok
	tst.b	T_flash
	bne	Return
	tst.b	T_shield
	bne	Return
	move.b	#40+10,T_flash
	move.b	#4*4,T_hit
	sf	T_rope
	sf	T_swing
	sf	T_targeting
	clr.b	T_state
	tst.l	T_speedY
	bpl.s	.ok
	clr.l	T_speedY
.ok:
	IFEQ	SpeedCheck
	moveq	#10,d0
	bra	sub_energy
	ELSEIF
	rts
	ENDC

make_collision:
	lea	Coll_Anker,a0
	moveq	#3,d0
.clear:
	clr.l	(a0)+
	clr.l	(a0)+
	clr.l	(a0)+
	clr.l	(a0)+
	dbf	d0,.clear

	lea	Coll_Anker,a1
	lea	Coll_Buffer,a0
	moveq	#$3c,d6

	move.l	Act_Bob_Structure,a5
.loop:
	tst.b	Bob_Used(a5)
	bmi	.no_kolli				;Kein Bob
	beq	.no_kolli				;BOB_NOCOL

	movem.w	Bob_X_Position(a5),d0-d1	;Calculate rectangle
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1
	move.l	Bob_Act_Anim(a5),a2
	lea	Bob_A_Table_Koll_X(a2),a2
	add.w	(a2)+,d0
	add.w	(a2)+,d1
	move.w	d0,d2
	move.w	d1,d3
	add.w	(a2)+,d2
	add.w	(a2),d3

	move.w	d1,d4			;Calculate table-offset
	lsr.w	#2,d4
	and.w	d6,d4			;Start

	move.w	d3,d5
	lsr.w	#2,d5
	addq.w	#4,d5
	and.w	d6,d5			;End
	cmp.w	d4,d5
	beq.s	.no_kolli
.insert_loop:
	lea	0(a1,d4.w),a3
	move.l	(a3),a2
	move.l	a0,(a3)
	move.l	a2,(a0)+
	movem.w	d0-d3,(a0)
	addq.w	#8,a0
	move.l	a5,(a0)+
	addq.w	#4,d4
	and.w	d6,d4
	cmp.w	d5,d4
	bne.s	.insert_loop

.no_kolli:
	add.w	#BOB_ENTRY_LENGTH,a5
	cmp.l	#Bob_Structure_End,a5
	blo	.loop
	lea	custom,a5
	rts


;---------------------------------------------
; Check rectangle for collision
;
; d0,d1,d2,d3	Rectangle (x1,y1,x2,y2)
;
check_rec:
	move.w	d1,d4
	andi.w	#$f0,d4
	lsr.w	#2,d4
	move.w	d3,d5
	andi.w	#$f0,d5
	lsr.w	#2,d5
	lea	Coll_Anker,a1
	adda.w	d4,a1
	sub.w	d4,d5
	bpl.s	.pos1
	moveq	#0,d5
.pos1:
	move.l	(a1)+,d6
	beq.s	.end_loop1
.loop1:
	move.l	d6,a0
	cmp.w	8(a0),d0
	bgt.s	.no_col
	cmp.w	4(a0),d2
	blt.s	.no_col
	cmp.w	10(a0),d1
	bgt.s	.no_col
	cmp.w	6(a0),d3
	bgt.s	.rec_col
.no_col:
	move.l	(a0),d6
	bne.s	.loop1
.end_loop1:
	subq.w	#4,d5
	bpl.s	.pos1
	moveq	#0,d0
	rts

.rec_col:
	cmp.w	4(a0),d0
	ble.s	.lab1
	move.l	12(a0),a0
	moveq	#1,d0
	rts
.lab1:
	move.l	12(a0),a0
	moveq	#-1,d0
	rts

*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
*--------	BOB-SYSTEM     X-CLIP
*--------------------------------------------------------------------------
*--------------------------------------------------------------------------
BOB_FALSE	=	-1
BOB_TRUE	=	1
BOB_NOCOL	=	0
BOB_NOPLCOL	=	2

NO_BOBROUT	=	0
NO_BOBBLIT	=	1
BOB_URGENT	=	2

			rsreset
Bob_Used		rs.b	1	;Eintrag benutzt/unbenutzt
Bob_BlitStatus		rs.b	1	;Bob im sichtbaren Bereich
Bob_to_Info_Offs	rs.w	1	;Offset von BobStruct auf InfoTab des Bobs
Bob_Race		rs.w	1	;Art des Bobs (Normal/Planes/Object)
Bob_Entry_Adress	rs.l	1	;Pointer auf Entry Area
Bob_X_Position		rs.w	1	;X-Position
Bob_Y_Position		rs.w	1	;Y-Position
Bob_X_Offset		rs.w	1	;X-Offset
Bob_Y_Offset		rs.w	1	;Y-Offset
Bob_X_Out		rs.w	1	;Betrag der Pixels, die das Bob in X-Dir draussen ist
Bob_Y_Out		rs.w	1	;Betrag der Pixels, die das Bob in Y-Dir draussen ist
Bob_Koords_Save1	rs.l	1	;fr Block ClearSpecial Mode Koords Speichern
Bob_Koords_Save2	rs.l	1	;fr Block ClearSpecial Mode Koords Speichern
Bob_Height		rs.w	1	;Hhe in Pixels
Bob_Status		rs.w	1	;Status (laufen, rennen, etc.)
Bob_Power		rs.w	1	;Hitpoints
Bob_Routine		rs.l	1	;Routine, die Bob verwaltet
Bob_Graphics		rs.l	1	;Zeiger auf Graphics
Bob_Mask		rs.l	1	;Z	eiger auf Maske
Bob_Next_Anim		rs.l	1	;Zeiger auf nchste Animation
Bob_Act_Anim		rs.l	1	;Zeiger auf aktuelle Animation (wg. Kollision)
Bob_Anim_Delay		rs.w	1	;Anim Delay
Bob_Anim_Delay_Init	rs.w	1	;Delay Init Wert
Bob_Plane_Order		rs.l	1	;Zeiger auf Tabelle mit Zeigern, die angeben welche Planes im Playfield mit welchen Planes des Bobs oder der Maske beschrieben werden sollen.
Bob_Object_Def		rs.l	1	;Zeiger auf Tabelle mit BobTabAdrs des Objekts
Bob_Hit			rs.w	1	;Treffer
Bob_RopeEnable		rs.b	1	;1= Objekt kann vom Seil getroffen werden.
Bob_Rope		rs.b	1	;0= Kein Seil am Objekt.
Bob_Out_X_Val		rs.w	1	;Wert ab dem das Bob ausgetragen wird
Bob_Out_Y_Val		rs.w	1	;W	ert ab dem das Bob ausgetragen wird
Bob_Special_1		rs.w	1	;Zur freien Verfgung
Bob_Special_2		rs.w	1	;Zur freien Verfgung
Bob_Special_3		rs.w	1	;Zur freien Verfgung
Bob_Special_4		rs.w	1	;Zur freien Verfgung
Bob_Special_5		rs.w	1	;Zur freien Verfgung
Bob_Special_6		rs.w	1	;Zur freien Verfgung
Bob_Special_7		rs.w	1	;Zur freien Verfgung
BOB_ENTRY_LENGTH	rs.w	0
	
Smart_Structure:
		dc.b	BOB_TRUE,0
		dc.w	Smart_Info-Smart_Structure
		dc.w	NORM
		dc.l	Area_Enter_Vector
		dc.w	0,0		;X/Y
		dc.w	0,0
		dc.w	0,0
		dc.l	0,0
		dc.w	15
		dc.w	0,0
		dc.l	0
		dc.l	main_GFX+Mbob25
		dc.l	main_GFX+Mmsk25
		dc.l	0
		dc.l	0
		dc.w	0,0
		dc.l	0,0
		dc.w	0
		dc.b	0,0
		dc.w	0,0

Smart_Info:	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	23		;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	0		;Hitpoints
		dc.l	0,0

		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.


Act_Bob_Structure:	dc.l	Bob_Structure

Bob_Not_Finished	dc.w	0

*--------------------------------------------------------------------------

BOB_LAX_VAL		=	$e8
BOB_OHNE_LAX_VAL	=	$d0
Bob_End_Val		dc.l	BOB_LAX_VAL<<8
*--------------------------------------------------------------------------
Bob_System:	;Initialize Pointer to Structures
		move.l	Act_Scr_Structure,a6
		move.l	Act_Bob_Structure,a4

		;Initialize Pointer to CutomChips
		lea	$dff000,a5

		;Initialize Pointer to BackBufferStructure
		move.l	Rest_Pointer,a3

		tst.w	Bob_Not_Finished
		bmi    	Blit_Backwards

		;Bob Used ???
.Loop:		tst.b	Bob_Used(a4)
		bmi.s	.Unused

		btst.b	#NO_BOBROUT,Bob_BlitStatus(a4)
		bne.s	.NoRout

		move.l	Bob_Routine(a4),a0
		movem.l	a3-a6,-(sp)
		jsr	(a0)
		movem.l	(sp)+,a3-a6
		;Nochmal Testen, da Eintrag von Rout gelscht werden kann
		tst.b	Bob_Used(a4)
		bmi.s	.Unused

.NoRout:
		tst.b	G_bobmode
		bne	.Unused

		btst.b	#NO_BOBBLIT,Bob_BlitStatus(a4)
		bne.s	.Unused
		btst.b	#BOB_URGENT,Bob_BlitStatus(a4)
		bne.s	.Blit_Bob
		;Test if Bob Time is over
		tst.w	Bob_Not_Finished
		bne.s	.Unused
		move.l	$dff004,d0
		and.l	#$1ff00,d0
		cmp.l	#$0e800,d0
		blt.s	.Blit_Bob
		cmp.l	#$11000,d0
		bgt.s	.Blit_Bob

		move.w	#-1,Bob_Not_Finished
		bra.s	.Unused

		;Jump to corresponding BobRoutine
.Blit_Bob:	move.w	Bob_to_Info_Offs(a4),d7
		bsr	BLIT_BOB_SUPERVISOR

.Unused:	;Do next Bob
		add.w	#BOB_ENTRY_LENGTH,a4
		cmp.l	#Bob_Structure_End,a4
		blo	.Loop

		move.l	Smart_Routine(pc),a0
		jsr	(a0)

		move.l	a3,Rest_Pointer
		clr.l	(a3)

		rts

Check_Smart_Start:
	tst.b	smart_bomb
	beq.s	.out
	move.l	#Do_smart_bomb1,Smart_Routine
.out:
	rts

Do_smart_bomb1:
		tst.b	G_bobmode
		beq	.no_smart

		lea	Smart_Structure(pc),a4

		move.w	super_radius,d3		;Get radius of circle
		moveq	#19,d6			;Do 20 balls
.smart_loop:
		move.b	d6,d7
		mulu	#205,d7
		lsr.w	#4,d7

		move.b	d7,d0
		bsr	sin
		move.w	d0,d2
		move.b	d7,d0
		bsr	cos
		muls	d3,d0			;Calc position
		muls	d3,d2
		asr.l	#8,d0
		asr.l	#8,d2
		add.w	T_posX(pc),d0		;X
		add.w	Scr_X_Level_Pos(a6),d0
		add.w	#8,d0
		add.w	T_posY(pc),d2		;Y
		add.w	Scr_Y_Level_Pos(a6),d2
		add.w	#16,d2

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

		move.w	Bob_to_Info_Offs(a4),d7
		movem.l	d3/d6,-(sp)
		bsr	BLIT_BOB_SUPERVISOR
		movem.l	(sp)+,d3/d6

		dbf	d6,.smart_loop

	add.w	#10,super_radius			;Enlarge radius

	cmpi.w	#100,super_radius		;Reached size for next stage ?
	blt	.no_smart
	addq.b	#2,flash_count			;Add one step to fade-offset
	cmp.b	#16,flash_count
	ble	.do_flash
	move.l	#.Do_smart_bomb2,Smart_Routine
	lea	coltab(pc),a0
	moveq	#31,d7
.clear:
	move.w	#$fff,(a0)+
	dbf	d7,.clear
	bsr	set_copcolors
	sf	smart_bomb
	move.b	#15,T_flash
	sf	T_hit
	sf	G_bobmode

	move.l	Act_Bob_Structure(pc),a0
	moveq	#BOB_MAXIMUM-1,d7
.bob_hit:
	tst.b	Bob_Used(a0)
	beq.s	.not_used

	move.w	Bob_X_Position(a0),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	cmp.w	#304,d0
	bge.s	.not_used
	cmp.w	#-32,d0
	ble.s	.not_used
	move.w	Bob_Y_Position(a0),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
	cmp.w	#208,d0
	bge.s	.not_used
	add.w	Bob_Height(a0),d0
	bmi.s	.not_used

	move.w	#4,Bob_Hit(a0)
	tst.w	Bob_Power(a0)
	bmi.s	.not_used
	sub.w	#16,Bob_Power(a0)
	bpl.s	.not_used
	clr.w	Bob_Power(a0)
.not_used:
	lea	BOB_ENTRY_LENGTH(a0),a0
	dbf	d7,.bob_hit

	rts

.do_flash:
	lea	coltab(pc),a0
	moveq	#31,d7
.flash_loop:
	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,.flash_loop

	bsr	set_copcolors
	bra	.no_smart

.Do_smart_bomb2:
	subq.b	#1,flash_count
	beq.s	.end

	lea	coltab(pc),a0
	lea	B_coltab(pc),a1
	moveq	#31,d7
.flash_loop2:
	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,.flash_loop2

	bsr	set_copcolors

	bra.s	.no_smart
.end:
	sf	flash_count
	move.w	#0,super_radius
	move.l	#Check_Smart_Start,Smart_Routine

.no_smart:
		tst.b	smart_bomb
		beq.s	.no_smart2
		not.b	G_bobmode
.no_smart2:
		rts

Smart_Routine:	dc.l	Check_Smart_Start

super_radius:	dc.w	0
G_bobmode:	dc.b	0
smart_bomb:	dc.b	0

flash_count:	dc.b	0
		even

*----------------------------------------------------------------------------
Blit_Backwards:
		;Jump to last Entry
		add.w	#(BOB_MAXIMUM-1)*BOB_ENTRY_LENGTH,a4

		;Bob Used ???
.LoopBack:	tst.b	Bob_Used(a4)
		bmi.s	.Unused

		btst.b	#NO_BOBROUT,Bob_BlitStatus(a4)
		bne.s	.NoRout
		move.l	Bob_Routine(a4),a0
		movem.l	a3-a6,-(sp)
		jsr	(a0)
		movem.l	(sp)+,a3-a6
		;Nochmal Testen, da Eintrag von Rout gelscht werden kann
		tst.b	Bob_Used(a4)
		bmi.s	.Unused

.NoRout:	btst.b	#NO_BOBBLIT,Bob_BlitStatus(a4)
		bne.s	.Unused
		btst.b	#BOB_URGENT,Bob_BlitStatus(a4)
		bne.s	.Blit_Bob
		;Test if Bob Time is over
		tst.w	Bob_Not_Finished
		beq.s	.Unused
		move.l	$dff004,d0
		and.l	#$1ff00,d0
		cmp.l	#$0e800,d0
		blt.s	.Blit_Bob
		cmp.l	#$11000,d0
		bgt.s	.Blit_Bob

		clr.w	Bob_Not_Finished
		bra.s	.Unused

		;Jump to corresponding BobRoutine
.Blit_Bob	move	Bob_to_Info_Offs(a4),d7
		bsr	BLIT_BOB_SUPERVISOR

.Unused		;Do next Bob
		sub.w	#BOB_ENTRY_LENGTH,a4
		cmp.l	#Bob_Structure,a4
		bhs	.LoopBack

		move.l	Smart_Routine(pc),a0
		jsr	(a0)

		move.l	a3,Rest_Pointer
		clr.l	(a3)

		clr.w	Bob_Not_Finished

		rts

*----------------------------------------------------------------------------
*	Calculate Blit Vals
*
*	IN
*	a4 = Pointer to BobStructure
*	a6 = Pointer to ScrollStructure
*	d7 = Offset to Infotab
*
*	OUT
*	Bob
*----------------------------------------------------------------------------
BLIT_BOB_SUPERVISOR:
		bsr	Calculate_Blit_Vals
		tst.w	Bob_X_Out(a4)
		bne.s	.NoBlit
		tst.w	Bob_Y_Out(a4)
		bne.s	.NoBlit
		btst.b	#B_FAST,Bob_Race+1(a4)
		beq.s	.NormBob
		;cmp.w	#4,Bob_Race(a4)
		;bne.s	.NormBob
.FastBob	bsr	Calc_MoreMask_Bob
		rts
.NormBob	bsr	Calc_OneMask_ColBob
.NoBlit		rts

*----------------------------------------------------------------------------
*	Calculate Blit Vals
*
*	IN
*	a4 = Pointer to BobStructure
*	a6 = Pointer to ScrollStructure
*	d7 = Offset to Infotab
*
*	OUT
*	d0=XClip 0=nein -=Left +=Right
*	d1=YClip 0=nein -=Oben +=Unten
*	d2=Height First Part
*	d3=Height Second Part  0=nein
*	d4=First ScreenLine
*----------------------------------------------------------------------------
Calculate_Blit_Vals	;--XClipFlag XOutVal Lschen
		moveq	#0,d0
		clr.w	Bob_X_Out(a4)
		;--X Values berechnen
		move.w	Bob_X_Position(a4),d1
		add.w	Bob_X_Offset(a4),d1
		sub.w	Scr_X_Level_Pos(a6),d1
		bpl.s	.Bob_Rechts
		;--Test if Out-Left or XClip-Left
		move.w	d1,d2
		add.w	Bob_I_Width(a4,d7),d2
		beq.s	.Out_X_Zero
		bmi.s	.Out_X_Left
		;--XClip-Left
		move.w	d1,d0
		bra.s	.CalculateBlitValsY
.Bob_Rechts	;--Test if Out-Right 
		sub.w	Scr_X_Visible(a6),d1
		beq.s	.Out_X_Zero
		bpl.s	.Out_X_Right
		;--Test if Correct or XClip-Right
		add.w	 Bob_I_Width(a4,d7),d1
		bmi.s	.CalculateBlitValsY
		;--XClip_Right
		move	d1,d0
.CalculateBlitValsY	;--YClipFlag AnfScreenLine YOutVal Lschen
		moveq	#0,d1
		moveq	#0,d4
		clr.w	Bob_Y_Out(a4)
		;--BobHeight fr YClipBere in d2 schreiben
		move.w	Bob_Height(a4),d2
		;--Y Values berechnen
		move.w	Bob_Y_Position(a4),d3
		add.w	Bob_Y_Offset(a4),d3
		sub.w	Scr_Y_Level_Pos(a6),d3
		bpl.s	.Bob_Unten
		;--Test if Out-Up or YClip-Up
		move.w	d3,d1
		add.w	d2,d3
		beq.s	.Out_Y_Zero
		bmi.s	.Out_Y_Up
		;--YClip Up (Val in d1)
		add.w	d1,d2
		bra.s	.CalculateOn_ValsY
.Bob_Unten	;--Test if Out-Down
		move.w	d3,d4
		sub.w	Scr_Y_Visible(a6),d3
		beq.s	.Out_Y_Zero
		bpl.s	.Out_Y_Down
		;--Test if Correct or YClip-Down
		add.w	d2,d3
		bmi.s	.CalculateOn_ValsY
		;--YClip_Down
		sub.w	d3,d2
		move.w	d3,d1
.CalculateOn_ValsY	;--Bestimme AnfPlaneZeile
		add.w	Scr_Y_Play_Anf(a6),d4
		cmp.w	Scr_Plane_Height(a6),d4
		blo.s	.NoOverFlowHeight
		sub	Scr_Plane_Height(a6),d4
.NoOverFlowHeight	;--Flag auf NoWrap setzen
		moveq	#-1,d3
		;--Test auf Wrap Zeile
		move.w	Scr_Plane_Height(a6),d6
		sub.w	d4,d6
		sub.w	d2,d6
		bpl.s	.Calculate_End
		move.w	d6,d3
		;--Height of second Part of Bob
		neg.w	d3
		;--Height of first Part of Bob
		sub.w	d3,d2
.Calculate_End	rts
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Out_X_Zero	moveq	#-1,d1
.Out_X_Left	neg.w	d1
.Out_X_Right	move.w	d1,Bob_X_Out(a4)
		bra.s	.Calculate_End
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.Out_Y_Zero	moveq	#-1,d3
.Out_Y_Up		neg	d3
.Out_Y_Down	move.w	d3,Bob_Y_Out(a4)
		bra.s	.Calculate_End
*----------------------------------------------------------------------------

*----------------------------------------------------------------------------
*	Calculate Blit-Values for Colour-Bob/One-Mask
*
*	IN
*	d0=XClip 0=nein -=Left +=Right
*	d1=YClip 0=nein -=Oben +=Unten
*	d2=Height First Part
*	d3=Height Second Part  0=nein
*	d4=First ScreenLine
*	d7 = Offset to Infotab
*	a4 = Pointer to BobStructure
*	a6 = Pointer to ScrollStructure
*
*	OUT
*	a0=Pointer to Graphics
*	a1=Pointer to Mask
*	a2=Offset to Playfield
*----------------------------------------------------------------------------
Calc_OneMask_ColBob	;--Get Graphik and Mask
		move.l	Bob_Graphics(a4),a0
		move.l	Bob_Mask(a4),a1
		;--YClipUp ???
		tst.w	d1
		bpl.s	.NoYClipUp
		;--Correct Pointer to Graphics and Mask
		btst	#B_FLIP,Bob_Race(a4)
		bne.s	.flip
		neg.w	d1
.flip: 
		mulu	Bob_I_Mask_Width(a4,d7),d1
		add.w	d1,a1
		mulu	Bob_I_Depth(a4,d7),d1
		add.w	d1,a0
.NoYClipUp	;--Determine YOffset to DestinationAdress
		mulu	Scr_Plane_Width(a6),d4
		move.l	d4,a2
		;--Prepare Values for XClip
		move.w	Bob_X_Position(a4),d5
		add.w	Bob_X_Offset(a4),d5
		move.w	Bob_I_Bytes(a4,d7),d1
		;--XClip
		tst.w	d0
		beq.s	.NoXClip
		bpl.s	.RightClip
.LeftClip		;--Clip it Left
		neg.w	d0
		and.w	#%1111111111110000,d0
		ext.l	d0
		add.l	d0,d5
		lsr.w	#3,d0
		add.w	d0,a0
		add.w	d0,a1
		sub.w	d0,d1
		bra.s	.NoXClip
.RightClip	;--Clip it Right
		and.w	#%1111111111110000,d0
		lsr.w	#3,d0
		sub.w	d0,d1
.NoXClip		;--Determine Breite: d0=Words d1=Bytes
		move.w	d1,d0
		ble	.End_OneMask_ColBob
		lsr.w	#1,d0
		;--Determine XOffset to DestinationAdress
		move.w	d5,d4
		and.w	#%0000000000001111,d4
		ror.w	#4,d4
		lsr.w	#3,d5
		ext.l	d5
		add.l	d5,a2
		;--Blit first-Bob-Part or One-part-Bob
		jsr	Blit_OneMask_ColBob
		;--Second Part of Bob necessary ???
		tst.w	d3
		bmi.s	.End_OneMask_ColBob
		;--Correct Pointer to Graphics and Mask
		mulu	Bob_I_Mask_Width(a4,d7),d2
		btst	#B_FLIP,Bob_Race(a4)
		beq.s	.noflip
		neg.w	d2
.noflip:
		add.w	d2,a1
		mulu	Bob_I_Depth(a4,d7),d2
		add.w	d2,a0
		;--Copy Height of second Part of Bob
		move.w	d3,d2
		;--Determine DestinationAdress
		sub.l	a2,a2
		add.w	d5,a2
		;--Blit second part of Bob
		jsr	Blit_OneMask_ColBob
.End_OneMask_ColBob	rts
*----------------------------------------------------------------------------
Calc_MoreMask_Bob:	;--Get Graphik and Mask
		move.l	Bob_Graphics(a4),a0
		move.l	Bob_Mask(a4),a1
		;--YClipUp ???
		tst.w	d1
		bpl.s	.NoYClipUp
		;--Correct Pointer to Graphics and Mask
		neg.w	d1
		mulu	Bob_I_Mask_Width(a4,d7),d1
		mulu	Bob_I_Depth(a4,d7),d1
		add.w	d1,a0
		add.w	d1,a1
.NoYClipUp	;--Determine YOffset to DestinationAdress
		mulu	Scr_Plane_Width(a6),d4
		move.l	d4,a2
		;--Prepare Values for XClip
		move.w	Bob_X_Position(a4),d5
		add.w	Bob_X_Offset(a4),d5
		move.w	Bob_I_Bytes(a4,d7),d1
		;--XClip
		tst.w	d0
		beq.s	.NoXClip
		bpl.s	.RightClip
.LeftClip		;--Clip it Left
		neg.w	d0
		and.w	#%1111111111110000,d0
		ext.l	d0
		add.l	d0,d5
		lsr.w	#3,d0
		add.w	d0,a0
		add.w	d0,a1
		sub.w	d0,d1
		bra.s	.NoXClip
.RightClip	;--Clip it Right
		and.w	#%1111111111110000,d0
		lsr.w	#3,d0
		sub.w	d0,d1
.NoXClip		;--Determine Breite: d0=Words d1=Bytes
		move.w	d1,d0
		lsr.w	#1,d0
		;--Determine XOffset to DestinationAdress
		move.w	d5,d4
		and.w	#%0000000000001111,d4
		ror.w	#4,d4
		lsr.w	#3,d5
		ext.l	d5
		add.l	d5,a2
		;--Blit first-Bob-Part or One-part-Bob
		jsr	Blit_MoreMask_Bob
		;--Second Part of Bob necessary ???
		tst.w	d3
		bmi.s	.End_OneMask_ColBob
		;--Correct Pointer to Graphics and Mask
		mulu	Bob_I_Mask_Width(a4,d7),d2
		mulu	Bob_I_Depth(a4,d7),d2
		add.w	d2,a0
		add.w	d2,a1
		;--Copy Height of second Part of Bob
		move.w	d3,d2
		;--Determine DestinationAdress
		sub.l	a2,a2
		add.w	d5,a2
		;--Blit second part of Bob
		jsr	Blit_MoreMask_Bob
.End_OneMask_ColBob	rts
*----------------------------------------------------------------------------
*	Blit Bob One-Mask Colour-Bob
*
*	a0 = Pointer to Graphics
*	a1 = Pointer to Mask
*	a2 = Pointer to PlayField
*	a3 = Pointer auf Buffer Structure
*	a4 = Pointer to BobEntry
*	a6 = Pointer to ScrollStructure
*	d0 = Breite in Words
*	d1 = Breite in Bytes
*	d2 = Height of Bob
*	d4 = Shift-Value in upper Nibble
*	d7 = Offset to Infotab
*----------------------------------------------------------------------------
Blit_OneMask_ColBob	;--TEST if COLOUR Bob
		btst.b	#B_COLOUR,Bob_Race+1(a4)
		bne	Blit_Colour
		;--Save Registers
		movem.l	d0/d2/d4-d5/a0,-(sp)
		;--TEST if BLOCK
		btst.b	#B_BLOCK,Bob_Race+1(a4)
		bne	Blit_Block
		;--Playfield-Blitsize/Height*64+Words
		lsl.w	#6,d2
		;--Storage-Blitsize/Playfield-BS*Planes+Words
		move.w	d2,d6
		mulu	Bob_I_Depth(a4,d7),d6
		add.w	d0,d2
		add.w	d0,d6
		;--TEST if no REFRESH
		btst.b	#B_NOT_REFRESH,Bob_Race(a4)
		bne.s	.NoRefresh
		;--Save Refresh-Blit-Values
		move.w	d6,(a3)+
		move.w	#planeb,(a3)
		sub.w	d1,(a3)+
		move.l	a2,(a3)+
		;--Add BaseField to Playfield-Offset
.NoRefresh	add.l	Scr_Supply_Field(a6),a2
		;--Initialize Blitter
		lea	$dff000,a5
 		move.w	Bob_I_D_Modulo(a4,d7),d6
		sub.w	d1,d6
		move.w	Bob_I_A_Modulo(a4,d7),d5
		sub.w	d1,d5
		move.w	Bob_I_B_Modulo(a4,d7),d0
		sub.w	d1,d0
		waitblt
		move.w	d4,bltcon1(a5)
		or.w	#$0fca,d4
		move.w	d4,bltcon0(a5)
		move.w	d5,bltamod(a5)
		move.w	d0,bltbmod(a5)
		move.w	d6,bltcmod(a5)
		move.w	d6,bltdmod(a5)
		move.l	Bob_I_AFWM(a4,d7),bltafwm(a5)
		;--Initialize Loop Counter
		move.w	Bob_I_Depth(a4,d7),d5
		subq	#1,d5
		bra.s	.EnterToLoop
		;--Blit Bob
.Loop		add.w	Bob_I_Mask_Width(a4,d7),a0
		add.w	Scr_Single_Plane(a6),a2
.EnterToLoop	waitblt
		move.l	a1,bltapth(a5)
		move.l	a0,bltbpth(a5)
		move.l	a2,bltcpth(a5)
		move.l	a2,bltdpth(a5)
		IFNE	BobTest
		move.w	#$f00,$dff180
		ENDC
		move.w	d2,bltsize(a5)
		dbf	d5,.Loop
		IFNE	BobTest
		move.w	#$000,$dff180
		ENDC
		movem.l	(sp)+,d0/d2/d4-d5/a0
		rts
*---------------------------------------------------------------------------
Blit_MoreMask_Bob	;--Save Registers
		movem.l	d0/d2/d4-d5/a0,-(sp)
		;--TEST if BLOCK
		btst.b	#B_BLOCK,Bob_Race+1(a4)
		bne	Blit_Block
		;--Playfield-Blitsize/Height*64+Words
		move.w	d2,d6
		lsl.w	#6,d6
		;--Storage-Blitsize/Playfield-BS*Planes+Words
		mulu	Bob_I_Depth(a4,d7),d6
		add.w	d0,d6
		;--TEST if no REFRESH
		btst.b	#B_NOT_REFRESH,Bob_Race(a4)
		bne.s	.NoRefresh
		;--Save Refresh-Blit-Values
		move.w	d6,(a3)+
		move.w	#planeb,(a3)
		sub.w	d1,(a3)+
		move.l	a2,(a3)+
		;--Add BaseField to Playfield-Offset
.NoRefresh	add.l	Scr_Supply_Field(a6),a2
		;--Initialize Blitter
		lea	$dff000,a5
 		move.w	Bob_I_D_Modulo(a4,d7),d2
		sub.w	d1,d2
		move.w	Bob_I_A_Modulo(a4,d7),d5
		sub.w	d1,d5
		move.w	Bob_I_B_Modulo(a4,d7),d0
		sub.w	d1,d0
		waitblt
		move.w	d4,bltcon1(a5)
		or.w	#%0000111111001010,d4
		move.w	d4,bltcon0(a5)
		move.w	d5,bltamod(a5)
		move.w	d0,bltbmod(a5)
		move.w	d2,bltcmod(a5)
		move.w	d2,bltdmod(a5)
		move.l	Bob_I_AFWM(a4,d7),bltafwm(a5)
		;--Initialize Loop Counter
		;--Blit Bob
		move.l	a1,bltapth(a5)
		move.l	a0,bltbpth(a5)
		move.l	a2,bltcpth(a5)
		move.l	a2,bltdpth(a5)
		move.w	d6,bltsize(a5)
		movem.l	(sp)+,d0/d2/d4-d5/a0
		rts
*---------------------------------------------------------------------------
Blit_Block	;--Playfield-Blitsize/Height*64+Words
		move.w	d2,d6
		lsl.w	#6,d6
		;--Storage-Blitsize/Playfield-BS*Planes+Words
		mulu	Bob_I_Depth(a4,d7),d6
		add.w	d0,d6
		;--TEST if no REFRESH
		btst.b	#B_NOT_REFRESH,Bob_Race(a4)
		bne.s	.NoRefresh
		;--Save Refresh-Blit-Values
		move.w	d6,(a3)+
		move.w	#planeb,(a3)
		sub.w	d1,(a3)+
		move.l	a2,(a3)+
		;--Add BaseField to Playfield-Offset
.NoRefresh	add.l	Scr_Supply_Field(a6),a2
		;--Initialize Blitter
		lea	$dff000,a5
 		move.w	Bob_I_S_Modulo(a4,d7),d2
		sub.w	d1,d2
		move.w	Bob_I_A_Modulo(a4,d7),d5
		sub.w	d1,d5
		waitblt
		move.w	d4,bltcon1(a5)
		or.w	#%0000100111110000,d4
		move.w	d4,bltcon0(a5)
		move.w	d5,bltamod(a5)
		move.w	d2,bltdmod(a5)
		move.l	Bob_I_AFWM(a4,d7),bltafwm(a5)
		;--Blit Bob
		move.l	a0,bltapth(a5)
		move.l	a2,bltdpth(a5)
		move.w	d6,bltsize(a5)
		movem.l	(sp)+,d0/d2/d4-d5/a0
		rts
*---------------------------------------------------------------------------
Blit_Colour	;--Save Registers
		movem.l	d0/d2-d5/a0,-(sp)
		;Calculate Blitsize / d6-Storage d2-Playfield
		lsl.w	#6,d2
		move.w	d2,d6
		mulu	Bob_I_Depth(a4,d7),d6
		add.w	d0,d2
		add.w	d0,d6
		;--TEST if no REFRESH
		btst.b	#B_NOT_REFRESH,Bob_Race(a4)
		bne.s	.NoRefresh
		;--Save Refresh-Blit-Values
		move.w	d6,(a3)+
		move.w	#planeb,(a3)
		sub.w	d1,(a3)+
		move.l	a2,(a3)+
		;--Add BaseField to Playfield-Offset
.NoRefresh	add.l	Scr_Supply_Field(a6),a2
		;--Initialize Blitter
		lea	$dff000,a5
 		move.w	Bob_I_D_Modulo(a4,d7),d6
		sub.w	d1,d6
		move.w	Bob_I_A_Modulo(a4,d7),d5
		sub.w	d1,d5
		move.w	Bob_I_B_Modulo(a4,d7),d0
		sub.w	d1,d0
		waitblt
		move.w	d4,bltcon1(a5)
		move.w	d5,bltamod(a5)
		move.w	d0,bltbmod(a5)
		move.w	d6,bltcmod(a5)
		move.w	d6,bltdmod(a5)
		move.l	Bob_I_AFWM(a4,d7),bltafwm(a5)

.Plane1		cmp.b	#-3,Bob_Plane_Order(a4)
		beq	.EndBlit
		cmp.b	#-2,Bob_Plane_Order(a4)
		beq	.Forget2
		tst.b	Bob_Plane_Order(a4)
		beq.s	.E1
		bmi.s	.M1
.P1		moveq	#0,d6
		move.b	Bob_Plane_Order(a4),d6
		bsr	.BlitItPlane
		bra.s	.Plane2
.M1		bsr	.BlitItMask
		bra.s	.Plane2
.E1		bsr	.BlitItEmpty
		bra.s	.Plane2
.Forget2
		add.w	Scr_Single_Plane(a6),a2
.Plane2		cmp.b	#-3,Bob_Plane_Order+1(a4)
		beq	.EndBlit
		cmp.b	#-2,Bob_Plane_Order+1(a4)
		beq	.Forget3
		tst.b	Bob_Plane_Order+1(a4)
		beq.s	.E2
		bmi.s	.M2
.P2		moveq	#0,d6
		move.b	Bob_Plane_Order+1(a4),d6
		bsr	.BlitItPlane
		bra.s	.Plane3
.M2		bsr	.BlitItMask
		bra.s	.Plane3
.E2		bsr	.BlitItEmpty
		bra.s	.Plane3
.Forget3
		add.w	Scr_Single_Plane(a6),a2
.Plane3		cmp.b	#-3,Bob_Plane_Order+2(a4)
		beq.s	.EndBlit
		cmp.b	#-2,Bob_Plane_Order+2(a4)
		beq	.Forget4
		tst.b	Bob_Plane_Order+2(a4)
		beq.s	.E3
		bmi.s	.M3
.P3		moveq	#0,d6
		move.b	Bob_Plane_Order+2(a4),d6
		bsr	.BlitItPlane
		bra.s	.Plane4
.M3		bsr	.BlitItMask
		bra.s	.Plane4
.E3		bsr	.BlitItEmpty
		bra.s	.Plane4
.Forget4
		add.w	Scr_Single_Plane(a6),a2
.Plane4		cmp.b	#-3,Bob_Plane_Order+3(a4)
		beq.s	.EndBlit
		cmp.b	#-2,Bob_Plane_Order+3(a4)
		beq	.Plane5
		tst.b	Bob_Plane_Order+3(a4)
		beq.s	.E4
		bmi.s	.M4
.P4		moveq	#0,d6
		move.b	Bob_Plane_Order+3(a4),d6
		bsr	.BlitItPlane
		bra.s	.Plane5
.M4		bsr	.BlitItMask
		bra.s	.Plane5
.E4		bsr	.BlitItEmpty
.Plane5
.EndBlit	movem.l	(sp)+,d0/d2-d5/a0
		rts

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.BlitItPlane	waitblt
		move.l	a0,-(sp)
		subq.w	#1,d6
		mulu	Bob_I_Mask_Width(a4,d7),d6
		add.w	d6,a0
		move.w	d4,d6
		or.w	#%0000111111001010,d6
		move.w	d6,bltcon0(a5)
		move.w	d0,bltbmod(a5)
		move.l	a1,bltapth(a5)
		move.l	a0,bltbpth(a5)
		move.l	a2,bltcpth(a5)
		move.l	a2,bltdpth(a5)
		move.w	d2,bltsize(a5)
		add.w	Scr_Single_Plane(a6),a2
		move.l	(sp)+,a0
		rts
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.BlitItMask	waitblt
		move.w	d4,d6
		or.w	#%0000111111001010,d6
		move.w	d6,bltcon0(a5)
		move.w	d5,bltbmod(a5)
		move.l	a1,bltapth(a5)
		move.l	a1,bltbpth(a5)
		move.l	a2,bltcpth(a5)
		move.l	a2,bltdpth(a5)
		move.w	d2,bltsize(a5)
		add.w	Scr_Single_Plane(a6),a2
		rts
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
.BlitItEmpty	waitblt
		move.w	d4,d6
		or.w	#%0000101100001010,d6
		move.w	d6,bltcon0(a5)
		move.l	a1,bltapth(a5)
		move.l	a2,bltcpth(a5)
		move.l	a2,bltdpth(a5)
		move.w	d2,bltsize(a5)
		add.w	Scr_Single_Plane(a6),a2
		rts

*--------------------------------------------------------------------------
*-------		INFO STRUCTURE        ---------------------------------
*--------------------------------------------------------------------------
		rsreset
Bob_I_Race	rs.w	1	;Art des Bobs
Bob_I_Out_X_Val	rs.w	1	;Wert ab dem Bob ausgetragen wird
Bob_I_Out_Y_Val	rs.w	1	;Wert ab dem Bob ausgetragen wird
Bob_I_Width	rs.w	1	;Breite in Bytes
Bob_I_Height	rs.w	1	;Hhe in Pixels
Bob_I_Depth	rs.w	1	;Tiefe in Planes
Bob_I_Mask_Width	rs.w	1	;Breite der Maske
Bob_I_A_Modulo	rs.w	1	;A Modulo
Bob_I_B_Modulo	rs.w	1	;B Modulo
Bob_I_D_Modulo	rs.w	1	;D Modulo
Bob_I_S_Modulo	rs.w	1	;Save Modulo
Bob_I_AFWM	rs.l	1	;Mask for Blit
Bob_I_Words	rs.w	1	;Breite in Wrtern
Bob_I_Bytes	rs.w	1	:Breite in Bytes
Bob_I_Power	rs.w	1	;Hitpoints
Bob_I_Routine	rs.l	1	;Routine, die Bob verwaltet
Bob_I_Next_Anim	rs.l	1	;Zeiger auf nchste Animation
Bob_I_Anim_Delay	rs.w	1	;Anim Delay
Bob_I_Anim_Del_Init	rs.w	1	;Delay Init Wert
Bob_I_Plane_Order	rs.l	1	;Flags fr Maskenplanes
BOB_I_ENTRY_LENGTH	rs.w	0


*---------------------------------------------------------------------------
*-------		Animation Structure

		rsreset
Bob_A_Table_Gfx	rs.l	1	;Pointer auf GFX
Bob_A_Table_Msk	rs.l	1	;Pointer auf Msk
Bob_A_Table_X_Off	rs.w	1	;X Add zustzlich zu X pos
Bob_A_Table_Y_Off	rs.w	1	;Y Add zustzlich zu Y pos
Bob_A_Table_Height	rs.w	1	;Hhe der zu blittenden Anim
Bob_A_Table_Koll_X	rs.w	1	;X-Offset zu X pos fr Kollision
Bob_A_Table_Koll_Y	rs.w	1	;Y-Offset zu Y pos fr Kollision
Bob_A_Table_Koll_W	rs.w	1	;X-Breite zu X pos fr Kollision
Bob_A_Table_Koll_H	rs.w	1	;X-Hhe   zu X pos fr Kollision
BOB_A_ENTRY_SIZE	rs.w	0
		rsreset
Bob_A_Table_End	rs.w	1	;-1 bei Ende
Bob_A_Table_Cont	rs.l	1	;Pointer auf Table, mit dem weitergemacht wird 
BOB_A_END_SIZE	rs.w	0

*---------------------------------------------------------------------------
* SEARCH FREE ENTRY IN BOB TABLE AND ENTER NEW
*
*	d0	Number of BobInfoTab
*	d1	X-Position
*	d2	Y-Position
*	a1	EntryAdr
*---------------------------------------------------------------------------
Search_Bob_Entry:	;and Enter Bob
	movem.l	d0/d1,-(sp)
	move.b	T_time,d0
	move.b	#0,ccr
	moveq	#1,d1
	abcd	d1,d0
	move.b	d0,T_time
	movem.l	(sp)+,d0/d1

		;move	#$fff,$dff180
		;rts
		move.l	Act_Bob_Structure,a4

		;Bob Used ???
		moveq	#BOB_MAXIMUM-1,d7
.Loop		tst.b	Bob_Used(a4)
		bmi.s	ENTER_BOB

		add.w	#BOB_ENTRY_LENGTH,a4
		dbf	d7,.Loop
		rts			;NoFreeEntry

ENTER_BOB:		;Enter Bob
		move.l	a1,Bob_Entry_Adress(a4)

		;Determine Info Tab Adress
		lea	Bob_Info_Tab_Adrs,a0
		add.w	d0,d0
		add.w	d0,d0
		move.l	(a0,d0),a2

		;Write Values
		move.l	a2,d0
		sub.l	a4,d0
		move.w	d0,Bob_to_Info_Offs(a4)
		move.w	Bob_I_Race(a2),Bob_Race(a4)
		move.w	Bob_I_Height(a2),Bob_Height(a4)
		move.w	Bob_I_Power(a2),Bob_Power(a4)
		move.l	Bob_I_Routine(a2),Bob_Routine(a4)
		move.l	Bob_I_Next_Anim(a2),Bob_Next_Anim(a4)
		move.w	Bob_I_Anim_Delay(a2),Bob_Anim_Delay(a4)
		move.w	Bob_I_Anim_Del_Init(a2),Bob_Anim_Delay_Init(a4)
		move.l	Bob_I_Plane_Order(a2),Bob_Plane_Order(a4)
		move.w	Bob_I_Out_X_Val(a2),Bob_Out_X_Val(a4)
		move.w	Bob_I_Out_Y_Val(a2),Bob_Out_Y_Val(a4)

		;Write Values which are not in Info Table
		move.b	#BOB_TRUE,Bob_Used(a4)
		clr.b	Bob_BlitStatus(a4)
		move.w	d1,Bob_X_Position(a4)
		move.w	d2,Bob_Y_Position(a4)
		clr.w	Bob_X_Out(a4)
		clr.w	Bob_Y_Out(a4)
		clr.w	Bob_Special_1(a4)
		clr.w	Bob_Special_2(a4)
		clr.w	Bob_Special_3(a4)
		clr.w	Bob_Special_4(a4)
		clr.w	Bob_Hit(a4)
		clr.l	Bob_Koords_Save1(a4)
		clr.l	Bob_Koords_Save2(a4)
		clr.w	Bob_RopeEnable(a4)

		bsr	Get_Next_Bob_Frame

		rts
*---------------------------------------------------------------------------
*	ENTER ALL DATA RESPONSIBLE FOR NEXT BOB FRAME
*
*	a4	Pointer to Bob Structure
*---------------------------------------------------------------------------

END_OUT_DAMAGE	EQU	-2
END_OUT		EQU	-3
ENTRY_END	EQU	-1

Get_Next_Bob_Frame:	;Test if End of Table is reached
		move.l	Bob_Next_Anim(a4),a1
		cmp.w	#END_OUT_DAMAGE,Bob_A_Table_End(a1)
		beq.s	.OutitDam
		cmp.w	#END_OUT,Bob_A_Table_End(a1)
		beq.s	.Outit
		cmp.w	#ENTRY_END,Bob_A_Table_End(a1)
		bne.s	.ok
		move.l	Bob_A_Table_Cont(a1),Bob_Next_Anim(a4)
		bra.s	Get_Next_Bob_Frame
.ok		;Enter new Values
		move.l	Bob_A_Table_Gfx(a1),Bob_Graphics(a4)
		move.l	Bob_A_Table_Msk(a1),Bob_Mask(a4)
		move.w	Bob_A_Table_X_Off(a1),Bob_X_Offset(a4)
		move.w	Bob_A_Table_Y_Off(a1),Bob_Y_Offset(a4)
		move.w	Bob_A_Table_Height(a1),Bob_Height(a4)
		move.l	a1,Bob_Act_Anim(a4)
		add.l	#BOB_A_ENTRY_SIZE,Bob_Next_Anim(a4)
		rts
.Outit		bsr	Out_Bob
		rts
.OutitDam	bsr	Out_Bob_Damage
		rts

Get_Next_Frame_OOff:	;Test if End of Table is reached
		move.l	Bob_Next_Anim(a4),a1
		cmp.w	#ENTRY_END,Bob_A_Table_End(a1)
		bne.s	.ok
		move.l	Bob_A_Table_Cont(a1),Bob_Next_Anim(a4)
		bra.s	Get_Next_Bob_Frame
.ok		;Enter new Values
		move.l	Bob_A_Table_Gfx(a1),Bob_Graphics(a4)
		move.l	Bob_A_Table_Msk(a1),Bob_Mask(a4)
		move.w	Bob_A_Table_Height(a1),Bob_Height(a4)
		add.l	#BOB_A_ENTRY_SIZE,Bob_Next_Anim(a4)
		rts

*---------------------------------------------------------------------------
*	ENTER ALL DATA RESPONSIBLE FOR NEXT BOB FRAME
*	
*	a4	Pointer to Bob Structure
*---------------------------------------------------------------------------
Test_Bob_Out:	move.w	Bob_X_Out(a4),d0
		lsr.w	#1,d0
		cmp.w	Bob_Out_X_Val(a4),d0
		blo.s	.No_X_Out

		bsr	Out_Bob
		rts

.No_X_Out	move.w	Bob_Y_Out(a4),d0
		lsr.w	#1,d0
		cmp.w	Bob_Out_Y_Val(a4),d0
		blo.s	.No_Y_Out

		bsr	Out_Bob

.No_Y_Out	rts


Out_Bob:	move.b	#BOB_FALSE,Bob_Used(a4)
		move.l	Bob_Entry_Adress(a4),a1
		clr.b	(a1)
	IFNE	CountBobs
	move.b	T_time,d0
	move.b	#0,ccr
	moveq	#1,d1
	sbcd	d1,d0
	move.b	d0,T_time
	ENDC
		rts

Out_Bob_Damage	move.b	#BOB_FALSE,Bob_Used(a4)
	IFNE	CountBobs
	move.b	T_time,d0
	move.b	#0,ccr
	moveq	#1,d1
	sbcd	d1,d0
	move.b	d0,T_time
	ENDC
		rts

Test_Bob_Out2:	move.w	Bob_X_Position(a4),d0
		sub.w	Scr_X_Level_Pos(a6),d0
		bpl.s	.not1x
		neg.w	d0
		bra.s	.outx
.not1x:
		cmp.w	#304,d0
		blt.s	.not2x
		sub.w	#304,d0
		bra.s	.outx
.not2x:
		moveq	#0,d0
.outx:
		cmp.w	#128,d0
		bge	Out_Bob

		move.w	Bob_Y_Position(a4),d0
		sub.w	Scr_Y_Level_Pos(a6),d0
		bpl.s	.not1y
		add.w	Bob_Height(a4),d0
		neg.w	d0
		bra.s	.outy
.not1y:
		cmp.w	#208,d0
		blt.s	.not2y
		sub.w	#208,d0
		bra.s	.outy
.not2y:
		moveq	#0,d0
.outy:
		cmp.w	#64,d0
		bge	Out_Bob
		rts

*---------------------------------------------------------------------------
Standart_BobAnim:
		subq.w	#1,Bob_Anim_Delay(a4)
		bpl.s	.NoNewAnim
		move.w	Bob_Anim_Delay_Init(a4),Bob_Anim_Delay(a4)
		bsr	Get_Next_Bob_Frame
.NoNewAnim
		bra	Test_Bob_Out

*---------------------------------------------------------------------------
*	CHECK IF BOB SHOULD BE ENTERED IN BOB STRUCTURE
*	
*	a6	Pointer to Scr-Structure
*	
*---------------------------------------------------------------------------
Area_Check:	;Test ob Eintragen ntig ist ?
		move.l	Act_Scr_Structure,a6
.TestX	  	;--Test ob X-64er Grenze berschritten wurde
		move	Scr_X_Level_Pos_Old(a6),d0
		move	Scr_X_Level_Pos(a6),d1
		and	#%1111111111000000,d0
		and	#%1111111111000000,d1
		cmp	d0,d1
		beq.s	.TestY
		;--Enter X according to Scroll-Direction
		bsr	.EnterX
.TestY		;--Test ob Y-64er Grenze berschritten wurde
		move	Scr_Y_Level_Pos_Old(a6),d0
		move	Scr_Y_Level_Pos(a6),d1
		and	#%1111111111000000,d0
		and	#%1111111111000000,d1
		cmp	d0,d1
		beq.s	.NoMoreTest
		;--Enter Y according to Scroll-Direction
		bsr	.EnterY
.NoMoreTest	rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
.EnterX:	;--Calculate Base for X-Clr

		move	Scr_X_Level_Pos(a6),d5
		move	d5,d1
		and	#%1111111111000000,d1
		lsr	#6,d5
		;--Testen ob eins nach links mglich ist
		moveq	#0,d0	;NoSubFlag setzen
		tst.w	d5
		beq.s	.NoSubd5
		subq.w	#1,d5
		sub.w	#64,d1
		moveq	#1,d0	;NoSubFlag lschen
.NoSubd5	tst.w	Scr_X_Speed(a6)
		bmi.s	.NoOffsetAddX
		addq.w	#4+1,d5
		add.w	#(4+1)*64,d1
		tst.w	d0		;NoSubFlag testen
		beq.s	.NoOffsetAddX	;Weg,da nicht subtrahiert wurde
		addq.w	#1,d5
		add.w	#64,d1
.NoOffsetAddX	move.w	Scr_Y_Level_Pos(a6),d6
		move.w	d6,d2
		and.w	#%1111111111000000,d2
		lsr.w	#6,d6
;		bmi.s	.End_CheckX
		beq.s	.no_sub
		subq.w	#1,d6
		sub.w	#64,d2
.no_sub:
		move.l	Area_Vector(pc),a0
		add.w	d5,d5
		mulu	Scr_BA_Anz_Area_X(a6),d6
		add.w	d6,d6
		add.w	d5,a0
		add.w	d6,a0
		;--Enter Loop
		moveq	#4+2-1,d7
.LoopX		bsr	Enter_Bobs_of_Area
		add.w	Scr_BA_Anz_Area_X(a6),a0
		add.w	Scr_BA_Anz_Area_X(a6),a0
		add.w	#64,d2
		dbf	d7,.LoopX
.End_CheckX	rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
.EnterY:	;--Calculate Base for X-Clr
		move.w	Scr_X_Level_Pos(a6),d5
		move.w	d5,d1
		and.w	#%1111111111000000,d1
		lsr.w	#6,d5
		moveq	#5+2-1,d7	;LoopCounter
		;--Testen ob eins nach links mglich ist
		tst.w	d5
		beq.s	.NoSubd5Y
		subq.w	#1,d5
		sub.w	#64,d1
		addq.w	#1,d7
.NoSubd5Y	move	Scr_Y_Level_Pos(a6),d6
		move.w	d6,d2
		and.w	#%1111111111000000,d2
		lsr.w	#6,d6
		subq.w	#1,d6
		bmi	.End_CheckY
		sub.w	#64,d2
		tst.w	Scr_Y_Speed(a6)
		bmi.s	.NoOffsetAddY
		addq.w	#3+1,d6
		add.w	#(3+1)*64,d2
.NoOffsetAddY	move.l	Area_Vector(pc),a0
		add.w	d5,d5
		mulu	Scr_BA_Anz_Area_X(a6),d6
		add.w	d6,d6
		add.w	d5,a0
		add.w	d6,a0
		;--Enter Loop
.LoopY		bsr	Enter_Bobs_of_Area
		addq.w	#2,a0
		add.w	#64,d1
		dbf	d7,.LoopY
.End_CheckY	rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
EnterScreen:	;--Calculate Base for X-Clr
		move.w	#5+2-2,help
		move	Scr_X_Level_Pos(a6),d5
		bne.s	.sub
		subq.w	#1,d5
		addq.w	#1,help
.sub:
		move	d5,d1
		and	#%1111111111000000,d1
		lsr	#6,d5
		move	Scr_Y_Level_Pos(a6),d6
		move	d6,d2
		and	#%1111111111000000,d2
		lsr	#6,d6
		move.l	Area_Vector(pc),a0
		add	d5,d5
		mulu	Scr_BA_Anz_Area_X(a6),d6
		add	d6,d6
		add	d5,a0
		add	d6,a0
		;--Enter Loops
		moveq	#4+2-1,d7
.LoopY		movem.l	d1-d2/a0,-(sp)
		move.w	help,d6
.LoopX		bsr	Enter_Bobs_of_Area
		addq	#2,a0
		add	#64,d1
		dbf	d6,.LoopX
		movem.l	(sp)+,d1-d2/a0
		add	Scr_BA_Anz_Area_X(a6),a0
		add	Scr_BA_Anz_Area_X(a6),a0
		add	#64,d2
		dbf	d7,.LoopY
		rts
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -
*------------------ - - - - - - - - - - - - - - - - - - - - - - - - -

*----------------------------------------------------------------------------
*	Enter all Bobs of Area in BobStructure
*	a0	Pointer to OffsetTab
*----------------------------------------------------------------------------
Enter_Bobs_of_Area:
		movem.l	d0-d1/d6-d7/a0/a6,-(sp)
		;--Test if Bobs/Anims are in Area
		tst.w	(a0)
		bmi.s	.End_of_Table
		move.l	Area_Vector(pc),a1
		adda.w	(a0),a1
.Loop		tst.b	(a1)
		bmi.s	.End_of_Table
		bne.s	.Already_entered

		;Bobs will now entered
		movem.l	d1-d2/a1,-(sp)
		move.b	#1,(a1)
		moveq	#0,d0
		move.b	Area_Bob_Info_Num(a1),d0
		add.w	Area_X_Position(a1),d1
		add.w	Area_Y_Position(a1),d2
		cmp.w	#128,d0
		blo.s	.Bob
		bsr	Search_Anim_Entry	;Background Anim
		bra.s	.next
.Bob		move.w	Area_Special(a1),d6
		bsr	Search_Bob_Entry
		move.w	d6,Bob_Special_4(a4)
.next		movem.l	(sp)+,d1-d2/a1
.Already_entered:
		addq.l	#AREA_ENTRY_LENGTH,a1
		bra	.Loop
.End_of_Table	movem.l	(sp)+,d0-d1/d6-d7/a0/a6
		rts

		rsreset
Area_Bob_Entered	rs.b	1
Area_Bob_Info_Num	rs.b	1
Area_X_Position		rs.w	1
Area_Y_Position		rs.w	1
Area_Special		rs.w	1
AREA_ENTRY_LENGTH	rs.w	0


Area_Vector:		dc.l	0

Area_Enter_Vector	dc.w	0


Standart_Hit_Handler:
	tst.w	Bob_Hit(a4)
	beq.s	.no_hit
	move.b	#COLOUR,Bob_Race+1(a4)
	subq.w	#1,Bob_Hit(a4)
	bne.s	.no_hit
	move.b	#NORM,Bob_Race+1(a4)
.no_hit:
	IFEQ	SpeedCheck
	tst.w	Bob_Power(a4)
	rts
	ELSEIF
	moveq	#1,d0
	rts
	ENDC

Standart_Destruction:
	bsr	add_score
	bsr	Out_Bob_Damage
	bra	Start_Explo


*---------------------------------------------------------------------------
*---------	RACE_MODIS/BITS
*---------------------------------------------------------------------------
;2.Byte
NORM		=	2
FAST		=	4
BLOCK		=	8
COLOUR		=	16
;1.Byte
NOT_REFRESH	=	256
FLIP		=	512
OR_REFRESH_FIELD	=	1024
BACK_ANIM		=	2048

;2.Byte
B_NORMAL		=	1	;ok
B_FAST		=	2	;ok
B_BLOCK		=	3	;ok
B_COLOUR		=	4	;ok
;1.Byte
B_NOT_REFRESH	=	0	;ok
B_FLIP		=	1
B_OR_REFRESH_FIELD	=	2
B_BACK_ANIM	=	3


Mbob00 	= $00000
Mmsk00 	= $00120
Mbob01 	= $00168
Mmsk01 	= $00318
Mbob02 	= $00384
Mmsk02 	= $00564
Mbob03 	= $005dc
Mmsk03 	= $007dc
Mbob04 	= $0085c
Mmsk04 	= $00a5c
Mbob05 	= $00adc
Mmsk05 	= $00cdc
Mbob06 	= $00d5c
Mmsk06 	= $00f4c
Mbob07 	= $00fc8
Mmsk07 	= $01178
Mbob08 	= $011e4
Mmsk08 	= $01364
Mbob09 	= $013c4
Mmsk09 	= $014c4
Mbob0a 	= $01504
Mmsk0a 	= $01574
Mbob0b 	= $01590
Mmsk0b 	= $015c8
Mbob0c 	= $015d6
Mmsk0c 	= $01636
Mbob0d 	= $0164e
Mmsk0d 	= $016be
Mbob0e 	= $016da
Mmsk0e 	= $0174a
Mbob0f 	= $01766
Mmsk0f 	= $017d6
Mbob10 	= $017f2
Mmsk10 	= $0185a
Mbob11 	= $01874
Mmsk11 	= $018dc
Mbob12 	= $018f6
Mmsk12 	= $0195e
Mbob13 	= $01978
Mmsk13 	= $019e0
Mbob14 	= $019fa
Mmsk14 	= $01a5a
Mbob15 	= $01a72
Mmsk15 	= $01ada
Mbob16 	= $01af4
Mmsk16 	= $01b54
Mbob17 	= $01b6c
Mmsk17 	= $01ba4
Mbob18 	= $01bb2
Mmsk18 	= $01c1a
Mbob19 	= $01c34
Mmsk19 	= $01ca4
Mbob1a 	= $01cc0
Mmsk1a 	= $01d28
Mbob1b 	= $01d42
Mmsk1b 	= $01dba
Mbob1c 	= $01dd8
Mmsk1c 	= $01e50
Mbob1d 	= $01e6e
Mmsk1d 	= $01eee
Mbob1e 	= $01f0e
Mmsk1e 	= $01f8e
Mbob1f 	= $01fae
Mmsk1f 	= $0202e
Mbob20 	= $0204e
Mmsk20 	= $021ce
Mbob21 	= $0222e
Mmsk21 	= $0235e
Mbob22 	= $023aa
Mmsk22 	= $0248a
Mbob23 	= $024c2
Mmsk23 	= $02542
Mbob24 	= $02562
Mmsk24 	= $025e2
Mbob25 	= $02602
Mmsk25 	= $0267a
Mbob26 	= $02698
Mmsk26 	= $02718
Mbob27 	= $02738
Mmsk27 	= $02808
Mbob28 	= $0283c
Mmsk28 	= $0293c
Mbob29 	= $0297c
Mmsk29 	= $029fc
Mbob2a 	= $02a1c
Mmsk2a 	= $02a9c
Mbob2b 	= $02abc
Mmsk2b 	= $02b3c

main_flipI:	dc.w	Mbob18,13*5,16/8
		dc.w	Mbob19,14*5,16/8
		dc.w	Mbob1a,13*5,16/8
		dc.w	Mbob1b,15*5,16/8
		dc.w	Mbob1c,15*5,16/8
		dc.w	-1

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Start_Explo:
	moveq	#1,d0
	move.w	Bob_X_Position(a4),d1
	move.w	Bob_Y_Position(a4),d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	rts
Start_Explo2:
	moveq	#1,d0
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	rts

*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*---------------------------------------------------------------------------
*---------------------------------------------------------------------------

;--------------------------------------------------------------------------
;-------------                   SCROLLING            ---------------------
;--------------------------------------------------------------------------
		rsreset
Scr_Y_Max		rs.w	1		;maximale Hhe des Levels in Zeilen
Scr_Y_Level_Pos		rs.w	1		;aktuelle Y-Position im Level in Zeilen
Scr_Y_Level_Pos_Old	rs.w	1		;aktuelle Y-Position im Level in Zeilen
Scr_Y_Play_Anf		rs.w	1		;Offset auf Playfield-Zeile, die am oberen Bildschirmrand sichtbar ist
Scr_Y_Up_Supply		rs.w	1		;Offset fr unteren Nachschub
Scr_Y_Down_Supply	rs.w	1		;Offset fr oberen Nachschub
Scr_X_Max		rs.w	1		;maximale Breite des Levels in Pixels
Scr_X_Level_Pos		rs.w	1		;aktuelle X-Position im Level in Pixels
Scr_X_Level_Pos_Old	rs.w	1		;aktuelle X-Position im Level in Pixels
Scr_X_Visible		rs.w	1		;maximale Breite des sichtbaren Bereiches
Scr_Y_Visible		rs.w	1		;maximale Hhe des sichtbaren Bereiches
Scr_Plane_Height	rs.w	1		;Hhe der Plane in Zeilen
Scr_Plane_Width		rs.w	1		;Breite einer Zeile des Playfields
Scr_Single_Plane	rs.w	1		;Breite einer Plane Zeile
Scr_X_Speed		rs.l	1		;Geschwindigkeit des X-Scrollings (- = links)
Scr_Y_Speed		rs.l	1		;Geschwindigkeit des Y-Scrollings
Scr_Show_Field		rs.l	1		;Adresse auf aktuelles Playfield
Scr_Supply_Field	rs.l	1		;Adresse auf Supply-Playfield
Scr_Refresh_Field	rs.l	1		;Adresse auf Refresh-Field
Scr_Level_Pointer	rs.l	1		;Adresse auf LevelMap
Scr_Plates_Pointer	rs.l	1		;Adresse auf Adressen der Blcke
Scr_Bob_Pointer		rs.l	1		;Adresse auf Adressen der BobBlcke
Scr_Level_Width		rs.w	1		;Breite des Level in Bytes

Scr_Blt_Mask		rs.l	1		;Blittermasken
Scr_Blt_Con_0		rs.w	1		;bltcon0
Scr_Bob_Con_0		rs.w	1		;bltcon0
Scr_Bob_A_Modulo	rs.w	1		;Bob bltamod
Scr_Blt_A_Modulo	rs.w	1		;bltamod
Scr_Blt_D_Modulo	rs.w	1		;bltdmod
Scr_Blt_Blit_Size	rs.w	1		;bltsize
Scr_Blt_A_Flip_Mod	rs.w	1		;Flip bltamod
Scr_Blt_D_Flip_Mod	rs.w	1		;Flip bltdmod
Scr_Blt_Flip_Size	rs.w	1		;Flip BlitSize
Scr_Blt_Flip_Add	rs.w	1		;Flip Jump End of Block

Scr_Rout_X		rs.l	1		;Adr der Routine fr linken oder rechten teilweisen Nachschub
Scr_Rout_Y		rs.l	1		;Adr der Routine fr oberen oder unteren teilweisen Nachschub
Scr_AnzSupplyPlates	rs.w	1		;XAnzahl der Blcke, die pro Rasterdurchlauf Nachgeschoben werden
Scr_SupplyFirst_Flg	rs.w	1		;siehe unten
Scr_Register_X		rs.l	6		;Buffer um Register zu speichern
Scr_Register_Y		rs.l	5		;Buffer um Register zu speichern
Scr_X_Supply_Plates	rs.w	1		;Anzahl der SupplyPlaettchen in X Dir
Scr_Y_Supply_Plates	rs.w	1		;Anzahl der SupplyPlaettchen in Y Dir
Scr_X_Supply_Offs	rs.w	1		;Supply am rechten Rand
Scr_X_Supply_Sub	rs.l	1		;Subtrahierwert auf d5 bei X Supply
Scr_X_Supply_Add	rs.l	1		;Addierwert auf d5 bei X Supply

		;BE=Bob BackgroundAnimation
Scr_BA_Area_Vector	rs.l	1		;Pointer auf zweidimensionales Array fr Bobs
Scr_BA_Byte_Vector	rs.l	1		;Pointer auf Array fr Bytes 1 eingetragen 0 nicht eingetragen
Scr_BA_Area_Width	rs.w	1		;Breite eines Array
Scr_BA_Area_Height	rs.w	1		;Hhe eines Array
Scr_BA_Shift_X		rs.w	1		;Durch wieviel wird Level_X_Pos geteilt
Scr_BA_Shift_Y		rs.w	1		;Durch wieviel wird Level_Y_Pos geteilt
Scr_BA_Add_Border_X	rs.w	1		;Wert um auf rechten Rand des Areas bezogen auf den Screen zu kommen
Scr_BA_Add_Border_Y	rs.w	1		;Wert um auf unteren Rand usw.
Scr_BA_Count_Clr_X	rs.w	1		;LoopCounter Wert fr alte Werte Lschen
Scr_BA_Count_Set_X	rs.w	1		;LoopCounter Wert fr neue Werte Setzen
Scr_BA_Count_Clr_Y	rs.w	1		;LoopCounter Wert fr alte Werte Lschen
Scr_BA_Count_Set_Y	rs.w	1		;LoopCounter Wert fr neue Werte Setzen
Scr_BA_Anz_Area_X	rs.w	1		;Anzahl der Areas in X Richtung
Scr_Scrolled_X		rs.w	1		;Tatschlich gescrollt X
Scr_Scrolled_Y		rs.w	1		;Tatschlich gescrollt Y
Scr_Screen_num		rs.w	1		;Screen-nr (0/-1)
Scr_Blt_Adr1		rs.l	1		;Hier ist die l.o. Ecke.
Scr_Blt_Adr2		rs.l	1		;Hier ist die Wrapzeile.
Scr_Up_Fix		rs.w	1
Scr_Down_Fix		rs.w	1
Scr_Left_Fix		rs.w	1
Scr_Right_Fix		rs.w	1
Scr_X_Fix		rs.w	1
Scr_Y_Fix		rs.w	1
Scr_Level		rs.l	1

SCR_ENTRY_LENGTH	rs.w	0

Scr_Structure:
	dc.w	0			;Scr_Y_Max
	dc.w	32			;Scr_Y_Level_Pos
	dc.w	0			;Scr_Y_Level_Pos_Old
	dc.w	32			;Scr_Y_Play_Anf
	dc.w	208+16			;Scr_Y_Up_Supply
	dc.w	208+32			;Scr_Y_Down_Supply
	dc.w	0			;Scr_X_Max
	dc.w	16			;Scr_X_Level_Pos
	dc.w	16			;Scr_X_Level_Pos_Old
	dc.w	336			;Scr_X_Visible
	dc.w	208			;Scr_Y_Visible
	dc.w	208+48			;Scr_Plane_Height
	dc.w	planeb*4		;Scr_Plane_Width
	dc.w	planeb			;Single_Plane
	dc.l	0			;Scr_X_Speed
	dc.l	0			;Scr_Y_Speed

	dc.l	GameBpl1		;Scr_Show_Field
	dc.l	GameBpl0		;Scr_Supply_Field
	dc.l	GameBpl2		;Scr_Refresh_Field

	dc.l	0			;Scr_Level_Pointer
	dc.l	0			;Scr_Plates_Pointer
	dc.l	Bob_Plates_Pointer	;Adresse auf Adressen der BobBlcke
	dc.w	0			;Breite des Level in Bytes

	dc.l	-1			;Blittermasken
	dc.w	%0000100111110000	;bltcon0
	dc.w	%0000111111000010	;bltcon0 fr BobBlttchen
	dc.w	32-2			;Bob bltamod
	dc.w	0			;bltamod (Font mod)
	dc.w	planeb-2		;bltdmod
	dc.w	(4*16*64)+1		;bltsize
	dc.w	-(2+3*40)		;Flip bltamod
	dc.w	planeb*3-1*2		;Flip bltdmod
	dc.w	16*64+1			;Flip BlitSize
	dc.w	40*3*16-40*3		;Flip Jump End of Block

	dc.l	RoutRts			;Adr der Routine fr linken oder rechten teilweisen Nachschub
	dc.l	RoutRts			;Adr der Routine fr oberen oder unteren teilweisen Nachschub
	dc.w	(16+22)/2+1			;X Anzahl der Blcke, die pro Rasterdurchlauf Nachgeschoben werden
	dc.w	0			;Flag, 0-X als letztes eing. 1-Y als letztes eing. 
	ds.l	6			;Buffer um Register zu speichern
	ds.l	5			;Buffer um Register zu speichern
	dc.w	16			;Anzahl der SupplyPlaettchen in X Dir
	dc.w	22			;Anzahl der SupplyPlaettchen in Y Dir
	dc.w	20*2			;Supply am rechten Rand
	dc.l	(208+48)*planeb*4	;Subtrahierwert auf DestAdr. bei Supply am rechten Rand
	dc.l	16*planeb*4		;Addierwert auf DestAdr. bei Supply am rechten Rand

	dc.l	Area_Vector		;Scr_Bob_Area_Vector
	dc.l	Area_Enter_Vector	;Scr_Bob_Area_Enter_Vector
	dc.w	64			;Scr_BA_Area_Width
	dc.w	64			;Scr_BA_Area_Height
	dc.w	6			;Scr_BA_Shift_X
	dc.w	6			;Scr_BA_Shift_Y
	dc.w	320/64			;Scr_BA_Add_Border_X
	dc.w	208/64+1		;Scr_BA_Add_Border_Y
	dc.w	208/64+1+2-1		;Scr_BA_Count_Clr_X
	dc.w	208/64+1		;Scr_BA_Count_Set_X
	dc.w	320/64+2-1		;Scr_BA_Count_Clr_Y
	dc.w	320/64			;Scr_BA_Count_Set_Y
	dc.w	46			;Scr_BA_Anz_Area_X

	dc.w	0			;Tatschliche Scrollweite X
	dc.w	0			;Tatschliche Scrollweite Y

	dc.w	0			;Scr_Screen_num
	dc.l	0			;Scr_Blt_Adr
	dc.l	0			;Scr_Blt_Adr

	dc.w	0			;Scr_Up_Fix
	dc.w	0			;Scr_Down_Fix

	dc.w	0			;Scr_Left_Fix
	dc.w	0			;Scr_Right_Fix

	dc.w	0			;Scr_X_Fix
	dc.w	0			;Scr_Y_Fix

	dc.l	0

Act_Scr_Structure:	dc.l	Scr_Structure
X_KOLLBIT		=	14
Y_KOLLBIT		=	12

	even

Supply_tabX:	dc.w	0,17,17,17,17
Supply_tabY:	dc.w	0,22,22,22,22,22,22,22,22	;0,2,3,5,6,8,9


;--------------------------------------------------------------------------
Scroll:
	move.l	Act_Scr_Structure,a6

	move.w	Scr_X_Speed(a6),d0
	bpl	.norm1
	neg.w	d0
.norm1:
	move.w	Scr_Y_Speed(a6),d1
	bpl	.norm2
	neg.w	d1
.norm2:
	add.w	d0,d0
	add.w	d1,d1
;	lea	Supply_tabX(pc),a0
;	move.w	(a0,d0.w),Scr_AnzSupplyPlatesX(a6)
;	lea	Supply_tabY(pc),a0
;	move.w	(a0,d1.w),Scr_AnzSupplyPlatesY(a6)

	clr.w	Scr_Scrolled_Y(a6)
	clr.w	Scr_Scrolled_X(a6)

	move.w	Scr_Y_Level_Pos(a6),Scr_Y_Level_Pos_Old(a6)
	move.w	Scr_X_Level_Pos(a6),Scr_X_Level_Pos_Old(a6)


	move.w	Scr_Y_Speed(a6),d7
	tst.b	d7					;Runter gedrueckt
	bmi.s	.nru
	beq.s	.nru
	move	Scr_Y_Level_Pos(a6),d1
	jsr	ScrUp
	move	Scr_Y_Level_Pos(a6),d2
	and	#%1111111111110000,d1
	and	#%1111111111110000,d2
	cmp	d1,d2
	beq.s	.nru
	jsr	SupplyUp

.nru:
	tst.b	d7
	bpl.s	.nho
	move	Scr_Y_Level_Pos(a6),d1
	jsr	ScrDown
	move	Scr_Y_Level_Pos(a6),d2
	and	#%1111111111110000,d1
	and	#%1111111111110000,d2
	cmp	d1,d2
	beq.s	.nho
	jsr	SupplyDown

.nho:
	move.w	Scr_X_Speed(a6),d7
	tst.b	d7
	bmi.s	.nre
	beq.s	.nre
	move	Scr_X_Level_Pos(a6),d1
	jsr	ScrLeft
	move	Scr_X_Level_Pos(a6),d2
	and	#%1111111111110000,d1
	and	#%1111111111110000,d2
	cmp	d1,d2
	beq.s	.nre
	jsr	SupplyLeft

.nre:
	tst.w	d7
	bpl.s	.nli
	move	Scr_X_Level_Pos(a6),d1
	jsr	ScrRight
	move	Scr_X_Level_Pos(a6),d2
	and	#%1111111111110000,d1
	and	#%1111111111110000,d2
	cmp	d1,d2
	beq.s	.nli
	jsr	SupplyRight

.nli:
						;Supply in der richtigen Reihenfolge bearbeiten
	tst	Scr_SupplyFirst_Flg(a6)
	beq.s	.X_Last

						;Y zuletzt eingetragen
	move.w	Scr_AnzSupplyPlates(a6),d4
	move.l	Scr_Rout_X(a6),a0
	jsr	(a0)
	tst	d4
	beq.s	.NoPlatesLeft

	move.l	Scr_Rout_Y(a6),a0
	jsr	(a0)
	bra.s	.NoPlatesLeft

						;X zuletzt eingetragen
.X_Last:
	move.w	Scr_AnzSupplyPlates(a6),d4
	move.l	Scr_Rout_Y(a6),a0
	jsr	(a0)
	tst	d4
	beq.s	.NoPlatesLeft
	move.l	Scr_Rout_X(a6),a0
	jsr	(a0)

.NoPlatesLeft:
	clr.l	Scr_Up_Fix(a6)
	clr.l	Scr_Left_Fix(a6)
	rts

;--------------------------------------------------------------------------
ScrDown:
	move.w	Scr_Y_Speed(a6),d0		;Ist negativ.
	neg.w	d0
	moveq	#32,d3
	add.w	d0,d3
	cmp.w	Scr_Y_Level_Pos(a6),d3
	bls.s	.ok
	move.w	Scr_Y_Level_Pos(a6),d0
	sub.w	#32,d0
.ok:
	move.w	Scr_Up_Fix(a6),d3
	beq.s	.no_fix
	add.w	d0,d3
	cmp.w	Scr_Y_Level_Pos(a6),d3
	bls.s	.no_fix
	move.w	Scr_Y_Level_Pos(a6),d0
	sub.w	Scr_Up_Fix(a6),d0
.no_fix:
	sub.w	d0,Scr_Y_Level_Pos(a6)
	move.w	Scr_Y_Play_Anf(a6),d3
	sub.w	d0,d3
	bpl.s	.nop
	add.w	Scr_Plane_Height(a6),d3
.nop:
	move.w	d3,Scr_Y_Play_Anf(a6)
	neg.w	d0
	move.w	d0,Scr_Scrolled_Y(a6)
	rts
;--------------------------------------------------------------------------
ScrUp:
	move.w	Scr_Y_Max(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
	cmp.w	Scr_Y_Speed(a6),d0
	bls.s	.ok
	move.w	Scr_Y_Speed(a6),d0		;Ist positiv.
.ok:
	tst.w	Scr_Down_Fix(a6)
	beq.s	.no_fix
	move.w	Scr_Y_Level_Pos(a6),d3
	add.w	d0,d3
	cmp.w	Scr_Down_Fix(a6),d3
	bls.s	.no_fix
	move.w	Scr_Down_Fix(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
.no_fix:

	add.w	d0,Scr_Y_Level_Pos(a6)
	move.w	Scr_Y_Play_Anf(a6),d3
	add.w	d0,d3
	cmp.w	Scr_Plane_Height(a6),d3
	blo.s	.nop
	sub.w	Scr_Plane_Height(a6),d3
.nop:
	move.w	d3,Scr_Y_Play_Anf(a6)
	move.w	d0,Scr_Scrolled_Y(a6)
	rts
;--------------------------------------------------------------------------
ScrRight:
	move.w	Scr_X_Speed(a6),d0		;Ist negativ.
	neg.w	d0
	moveq	#16,d3
	add.w	d0,d3
	cmp.w	Scr_X_Level_Pos(a6),d3
	bls	.ok
	move.w	Scr_X_Level_Pos(a6),d0
	sub.w	#16,d0
.ok:
	move.w	Scr_Left_Fix(a6),d3
	beq.s	.no_fix
	add.w	d0,d3
	cmp.w	Scr_X_Level_Pos(a6),d3
	bls.s	.no_fix
	move.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Left_Fix(a6),d0
.no_fix:

	sub	d0,Scr_X_Level_Pos(a6)
	neg.w	d0
	move.w	d0,Scr_Scrolled_X(a6)
	rts
;--------------------------------------------------------------------------
ScrLeft:
	move.w	Scr_X_Max(a6),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	cmp.w	Scr_X_Speed(a6),d0
	bls.s	.ok
	move.w	Scr_X_Speed(a6),d0
.ok:
	tst.w	Scr_Right_Fix(a6)
	beq.s	.no_fix
	move.w	Scr_X_Level_Pos(a6),d3
	add.w	d0,d3
	cmp.w	Scr_Right_Fix(a6),d3
	bls.s	.no_fix
	move.w	Scr_Right_Fix(a6),d0
	sub.w	Scr_X_Level_Pos(a6),d0
.no_fix:

	add.w	d0,Scr_X_Level_Pos(a6)
	move.w	d0,Scr_Scrolled_X(a6)
	rts
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
SupplyDown:
	moveq	#0,d0
	move	Scr_Y_Level_Pos(a6),d0
	lsr	#4,d0
	subq	#2,d0
	mulu	Scr_Level_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	add	d1,d0
	subq	#2,d0
	move.l	Scr_Level_Pointer(a6),a1
	add.l	d0,a1

	move	Scr_Y_Play_Anf(a6),d0
	add	Scr_Y_Down_Supply(a6),d0
	cmp	Scr_Plane_Height(a6),d0
	blo.s	.ok
	sub	Scr_Plane_Height(a6),d0
.ok:
	and	#%1111111111110000,d0
	mulu	Scr_Plane_Width(a6),d0
	moveq	#0,d1
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	add.l	d1,d0
	subq.l	#2,d0

	move.l	Scr_Show_Field(a6),a2
	move.l	Scr_Supply_Field(a6),a3
	move.l	Scr_Refresh_Field(a6),d3
	add.l	d0,a2
	add.l	d0,a3
	add.l	d0,d3

	move.l	#SupplyY,Scr_Rout_Y(a6)
	move	Scr_Y_Supply_Plates(a6),d6
	move.l	a6,a4
	add	#Scr_Register_Y+5*4,a4
	movem.l	d3/d6/a1-a3,-(a4)
	move	#1,Scr_SupplyFirst_Flg(a6)

	rts
;--------------------------------------------------------------------------
SupplyUp:
	moveq	#0,d0
	moveq	#0,d1
	move	Scr_Y_Level_Pos(a6),d0
	lsr	#4,d0
	move	Scr_Y_Up_Supply(a6),d1
	lsr	#4,d1
	add	d1,d0
	subq.w	#1,d0
	mulu	Scr_Level_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	subq	#2,d1
	move.l	Scr_Level_Pointer(a6),a1
	add.l	d0,a1
	add.l	d1,a1

	move	Scr_Y_Play_Anf(a6),d0
	add	Scr_Y_Up_Supply(a6),d0
	cmp	Scr_Plane_Height(a6),d0
	blo.s	.ok
	sub	Scr_Plane_Height(a6),d0
.ok:
	and	#%1111111111110000,d0
	mulu	Scr_Plane_Width(a6),d0
	moveq	#0,d1
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	add.l	d1,d0
	subq.l	#2,d0

	move.l	Scr_Show_Field(a6),a2
	move.l	Scr_Supply_Field(a6),a3
	move.l	Scr_Refresh_Field(a6),d3
	add.l	d0,a2
	add.l	d0,a3
	add.l	d0,d3

	move.l	#SupplyY,Scr_Rout_Y(a6)
	move	Scr_Y_Supply_Plates(a6),d6
	move.l	a6,a4
	add	#Scr_Register_Y+5*4,a4
	movem.l	d3/d6/a1-a3,-(a4)
	move	#1,Scr_SupplyFirst_Flg(a6)

	rts

;--------------------------------------------------------------------------
SupplyRight:
	moveq	#0,d0
	moveq	#0,d1
	move	Scr_Y_Level_Pos(a6),d0
	lsr	#4,d0
	subq	#2,d0
	muls	Scr_Level_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	subq	#2,d1
	move.l	Scr_Level_Pointer(a6),a1
	add.l	d0,a1
	add.l	d1,a1

	move	Scr_Y_Play_Anf(a6),d0
	add	Scr_Y_Down_Supply(a6),d0
	cmp	Scr_Plane_Height(a6),d0
	blo.s	.ok
	sub	Scr_Plane_Height(a6),d0
.ok:
	and	#%1111111111110000,d0
	mulu	Scr_Plane_Width(a6),d0
	moveq	#0,d1
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	add.l	d1,d0
	subq.l	#2,d0

	move.l	Scr_Show_Field(a6),a2
	move.l	Scr_Supply_Field(a6),a3
	move.l	Scr_Refresh_Field(a6),d3
	add.l	d0,a2
	add.l	d0,a3
	add.l	d0,d3

	move.l	#SupplyX,Scr_Rout_X(a6)
	move.l	a6,a4
	add	#Scr_Register_X+6*4,a4
	move	Scr_X_Supply_Plates(a6),d6

	move	Scr_Y_Play_Anf(a6),d5
	add	Scr_Y_Down_Supply(a6),d5
	cmp	Scr_Plane_Height(a6),d5
	blo.s	.ok1
	sub	Scr_Plane_Height(a6),d5
.ok1:
	and	#%1111111111110000,d5
	movem.l	d3/d5-d6/a1-a3,-(a4)
	move	#0,Scr_SupplyFirst_Flg(a6)

	rts
;--------------------------------------------------------------------------
SupplyLeft:
	moveq	#0,d0
	moveq	#0,d1
	move	Scr_Y_Level_Pos(a6),d0
	lsr	#4,d0
	subq	#2,d0
	muls	Scr_Level_Width(a6),d0
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	add	Scr_X_Supply_Offs(a6),d1
	move.l	Scr_Level_Pointer(a6),a1
	add.l	d0,a1
	add.l	d1,a1

	move	Scr_Y_Play_Anf(a6),d0
	add	Scr_Y_Down_Supply(a6),d0
	cmp	Scr_Plane_Height(a6),d0
	blo.s	.ok
	sub	Scr_Plane_Height(a6),d0
.ok:
	and	#%1111111111110000,d0
	mulu	Scr_Plane_Width(a6),d0
	move.l	Scr_Show_Field(a6),a2
	move.l	Scr_Supply_Field(a6),a3
	move.l	Scr_Refresh_Field(a6),d3
	moveq	#0,d1
	move	Scr_X_Level_Pos(a6),d1
	lsr	#3,d1
	and	#%1111111111111110,d1
	add.l	d1,d0
	move	Scr_X_Supply_Offs(a6),d1
	add.l	d1,d0
	add.l	d0,a2
	add.l	d0,a3
	add.l	d0,d3

	move.l	#SupplyX,Scr_Rout_X(a6)
	move.l	a6,a4
	add	#Scr_Register_X+6*4,a4
	move	Scr_X_Supply_Plates(a6),d6
	move	Scr_Y_Play_Anf(a6),d5
	add	Scr_Y_Down_Supply(a6),d5
	cmp	Scr_Plane_Height(a6),d5
	blo.s	.ok1
	sub	Scr_Plane_Height(a6),d5
.ok1:
	and	#%1111111111110000,d5
	movem.l	d3/d5-d6/a1-a3,-(a4)
	move	#0,Scr_SupplyFirst_Flg(a6)
	rts

;--------------------------------------------------------------------------
SupplyY:
	lea	$dff000,a5
	waitblt
	move.l	Scr_Blt_Mask(a6),bltafwm(a5)
	move	Scr_Blt_A_Modulo(a6),bltamod(a5)
	move	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	move	Scr_Blt_Con_0(a6),bltcon0(a5)
	move	#0,bltcon1(a5)

	move.l	a6,a4  
	add	#Scr_Register_Y,a4
	movem.l	(a4)+,d3/d6/a1-a3

.loop:
	moveq	#0,d0
	move	(a1),d0
	and	#%0000000011111111,d0
	asl.w	#7,d0					;Modul-adresse berechnen (fr 4Planes)
	lea	character,a0
	lea	(a0,d0.w),a0
							;Test if there is a flip Block
	btst	#15,(a1)
	beq	.NFP
	FlipBlock_3_Planes
	bra.s	.Add_Pointers
.NFP:
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
	move.w	Scr_Blt_Blit_Size(a6),bltsize(a5)	;Screen1
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
	move.w	Scr_Blt_Blit_Size(a6),bltsize(a5)	;Screen2
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
	move.w	Scr_Blt_Blit_Size(a6),bltsize(a5)	;Screen3

.Add_Pointers:
	addq.l	#2,a1
	addq	#2,a2
	addq	#2,a3
	addq.l	#2,d3

	subq	#1,d6
	beq.s	.Finish
	subq	#1,d4
	bne	.loop

	movem.l	d3/d6/a1-a3,-(a4)
	rts

.Finish:
	subq	#1,d4
	move.l	#RoutRts,Scr_Rout_Y(a6)
	rts
;--------------------------------------------------------------------------
SupplyX:
	lea	$dff000,a5
	waitblt
	move.l	Scr_Blt_Mask(a6),bltafwm(a5)
	move	Scr_Blt_A_Modulo(a6),bltamod(a5)
	move	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	move	Scr_Blt_Con_0(a6),bltcon0(a5)
	move	#0,bltcon1(a5)

	move.l	a6,a4
	add	#Scr_Register_X,a4
	movem.l	(a4)+,d3/d5-d6/a1-a3

.loop:
	moveq	#0,d0
	move.w	(a1),d0
	and.w	#%0000000011111111,d0
	asl.w	#7,d0					;Modul-adresse berechnen (fr 4Planes)
	lea	character,a0
	lea	(a0,d0.w),a0

							;Test if there is a flip Block
	btst	#15,(a1)
	beq	.NFP
	FlipBlock_3_Planes
	bra.s	.Add_Pointers

.NFP:
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)
	move	Scr_Blt_Blit_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	a3,bltdpth(a5)
	move	Scr_Blt_Blit_Size(a6),bltsize(a5)
	waitblt
	move.l	a0,bltapth(a5)
	move.l	d3,bltdpth(a5)
	move	Scr_Blt_Blit_Size(a6),bltsize(a5)

.Add_Pointers:
	moveq	#0,d0
	move	Scr_Level_Width(a6),d0
	add.l	d0,a1
	add	#16,d5
	cmp	Scr_Plane_Height(a6),d5
	blo.s	.ok
	sub	Scr_Plane_Height(a6),d5
	sub.l	Scr_X_Supply_Sub(a6),a2
	sub.l	Scr_X_Supply_Sub(a6),a3
	sub.l	Scr_X_Supply_Sub(a6),d3
.ok	add.l	Scr_X_Supply_Add(a6),a2
	add.l	Scr_X_Supply_Add(a6),a3
	add.l	Scr_X_Supply_Add(a6),d3

	subq	#1,d6
	beq.s	.Finish
	subq	#1,d4
	bne	.loop

	movem.l	d3/d5-d6/a1-a3,-(a4)
	rts

.Finish:
	subq	#1,d4
	move.l	#RoutRts,Scr_Rout_X(a6)
	rts

Set_Char:
	and.w	#255,d2

	move.w	Scr_X_Level_Pos(a6),d3
	sub.w	d3,d0
	sub.w	Scr_Y_Level_Pos(a6),d1

	and.w	#15,d3
	add.w	d3,d0

	move.w	Scr_Plane_Height(a6),d3
	sub.w	Scr_Y_Play_Anf(a6),d3
	cmp.w	d3,d1
	bge.s	.under_wrap

	;ber der Wrap-Zeile.

	move.l	Scr_Blt_Adr1(a6),d4
	bra.s	.goon
.under_wrap:
	move.l	Scr_Blt_Adr2(a6),d4
	sub.w	d3,d1
.goon:
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d4

	lsr.w	#3,d0
	and.w	#$fffe,d0
	add.w	d0,d4
	add.l	Scr_Refresh_Field(a6),d4

	asl.w	#7,d2
	add.l	#character,d2

	move.l	d2,bltapth(a5)
	move.l	d4,bltdpth(a5)
	move.w	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	move.w	#$0000,bltamod(a5)
	move.w	#$09f0,bltcon0(a5)
	move.l	#-1,bltafwm(a5)
	move.w	#64*16*4+1,bltsize(a5)
	waitblt
	rts

*----------------------------------------------------------------------------
*	Create Level at present Position at all Pages
*
*	no Requirements
*----------------------------------------------------------------------------
Create_Pages:			;Initialize Pointer to CutomChips

	move.l	Act_Scr_Structure,a6

	lea	custom,a5
				;Wait until Blitter has finished
.waitblt0:
	btst	#14,dmaconr(a5)
	bne.s	.waitblt0

				;Initialize BlitterRegister
	move.l	Scr_Blt_Mask(a6),bltafwm(a5)
	move.w	Scr_Blt_A_Modulo(a6),bltamod(a5)
	move.w	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	move.w	Scr_Blt_Con_0(a6),bltcon0(a5)
	clr.w	bltcon1(a5)

				;Create first Page
	move.l	Scr_Level_Pointer(a6),a3
	move.l	Scr_Show_Field(a6),a4
	bsr.s	Create_single_Page

				;Create second Page
	move.l	Scr_Level_Pointer(a6),a3
	move.l	Scr_Supply_Field(a6),a4
	bsr.s	Create_single_Page

				;Create Third Page
	move.l	Scr_Level_Pointer(a6),a3
	move.l	Scr_Refresh_Field(a6),a4
	bsr.s	Create_single_Page
	rts

*----------------------------------------------------------------------------
*	Create Level at present Position at mentioned Pages
*
*	a3 = Pointer to Level
*	a4 = Pointer to Page
*----------------------------------------------------------------------------
Wait_Line:
	move.l	$dff004,d0
	and.l	#$1ff00,d0
	cmp.l	#$10000,d0
	bne	Wait_Line
	rts

Create_single_Page:

	;Calculate Adresses
	moveq	#0,d0
	move.w	Scr_Y_Level_Pos(a6),d0
	lsr.w	#4,d0
	subq.w	#2,d0
	mulu	Scr_Level_Width(a6),d0
	move.w	Scr_X_Level_Pos(a6),d1
	lsr.w	#3,d1
	and.w	#%1111111111111110,d1
	add.w	d1,d0
	subq.l	#2,d0
	add.l	d0,a3

	moveq	#0,d0
	move.w	Scr_Y_Play_Anf(a6),d0
	sub.w	#16,d0
	bpl.s	.ok
	add.w	Scr_Plane_Height(a6),d0
.ok:
	move.w	d0,d5
	and.w	#%1111111111110000,d0
	mulu	Scr_Plane_Width(a6),d0
	moveq	#0,d1
	move.w	Scr_X_Level_Pos(a6),d1
	lsr.w	#3,d1
	and.w	#%1111111111111110,d1
	add.l	d1,d0
	subq.l	#2,d0
	add.l	d0,a4

	;Initialize LoopCounter for Lines
	move.w	Scr_X_Supply_Plates(a6),d7
	subq.w	#1,d7

;	bsr	Wait_Line

	move.w	Scr_Blt_Con_0(a6),bltcon0(a5)
	move.w	#$09f0,bltcon0(a5)
	lea	$dff000,a5
	waitblt
	move.l	Scr_Blt_Mask(a6),bltafwm(a5)
	move.w	Scr_Blt_A_Modulo(a6),bltamod(a5)
	move.w	Scr_Blt_D_Modulo(a6),bltdmod(a5)
	move.w	#0,bltcon1(a5)
.loop1
	move.l	a3,a1
	move.l	a4,a2

	move.w	Scr_Y_Supply_Plates(a6),d6
	subq.w	#1,d6	;+2-1
.loop2
	moveq	#0,d0
	move.w	(a1)+,d0
	and.w	#%0000000011111111,d0
	asl.w	#7,d0					;Modul-adresse berechnen (fr 4Planes)
	lea	character,a0
	lea	(a0,d0.w),a0

	waitblt
	move.l	a0,bltapth(a5)
	move.l	a2,bltdpth(a5)

	move.w	Scr_Blt_Blit_Size(a6),bltsize(a5)

	addq.l	#2,a2
	dbf	d6,.loop2

;	subq.b	#1,help
;	bpl.s	.no_wait
;	bsr	Wait_Line
;	move.b	#9,help
.no_wait:

	moveq	#0,d0
	move.w	Scr_Level_Width(a6),d0
	add.l	d0,a3
	add.l	Scr_X_Supply_Add(a6),a4
	add.w	#16,d5

	cmp.w	Scr_Plane_Height(a6),d5
	blt.s	.nowrap
	move.w	Scr_Plane_Height(a6),d0
	and.w	#%1111111111110000,d0
	mulu	Scr_Plane_Width(a6),d0
	sub.l	d0,a4
	moveq	#0,d5
.nowrap:
	dbf	d7,.loop1
	rts

help:	dc.l	0


;
;			    Level Daten
;


bob00 	= $00000
msk00 	= $00240
bob01 	= $002d0
msk01 	= $00490
bob02 	= $00500
msk02 	= $006b0
bob03 	= $0071c
msk03 	= $008dc
bob04 	= $0094c
msk04 	= $00afc
bob05 	= $00b68
msk05 	= $00d28
bob06 	= $00d98
msk06 	= $00e88
bob07 	= $00ec4
msk07 	= $00fc4
bob08 	= $01004
msk08 	= $01054
bob09 	= $01068
msk09 	= $014e8
bob0a 	= $01608
msk0a 	= $01a88
bob0b 	= $01ba8
msk0b 	= $01d88
bob0c 	= $01e00
msk0c 	= $01ff0
bob0d 	= $0206c
msk0d 	= $0218c
bob0e 	= $021d4
msk0e 	= $02394
bob0f 	= $02404
msk0f 	= $02534
bob10 	= $02580
msk10 	= $028f8
bob11 	= $029d6
msk11 	= $02d4e
bob12 	= $02e2c
msk12 	= $03144
bob13 	= $0320a
msk13 	= $033fa
bob14 	= $03476
msk14 	= $03676
bob15 	= $036f6
msk15 	= $038f6
bob16 	= $03976
msk16 	= $03b76


Abob00 	= $00000
Abob01 	= $00400
Abob02 	= $005c0
Abob03 	= $00780

		;AdressOffset,Anzahl Zeilen gesamt (Bob+maske),Breite pro Zeile
level_flipI:	dc.w	bob01,28*5,32/8
		dc.w	bob02,27*5,32/8
		dc.w	bob03,28*5,32/8
		dc.w	bob04,27*5,32/8

		dc.w	bob05,28*5,32/8	;Flugwalker
		dc.w	bob06,15*5,32/8	;Walker platt
		dc.w	bob07,16*5,32/8	;  "      "
		dc.w	bob08,10*5,16/8	;Flamme von Flugwalker
		dc.w	bob09,48*5,48/8	;Bigrobo
		dc.w	bob0a,48*5,48/8	;  "

		dc.w	bob0b,30*5,32/8	;Pacman
		dc.w	bob0c,31*5,32/8	;  "

		dc.w	bob10,37*5,48/8	;Amarillo
		dc.w	bob11,37*5,48/8	;  "
		dc.w	bob12,33*5,48/8	;  "
		dc.w	-1

Cue_Table1:	dc.w	1079,554	;100,122
		dc.w	923,122
		dc.w	1954,122
		dc.w	2670,127
		dc.w	308,282
		dc.w	1671,314
		dc.w	1079,554
		dc.w	1929,554
		dc.w	2634,810
		dc.w	358,890
		dc.w	995,890


Cue_Table2:	dc.w	160,850
		dc.w	95*16+150,58*16+90
		dc.w	103*16+150,44*16+90
		dc.w	81*16+150,34*16+90
		dc.w	60*16+150,33*16+90
		dc.w	40*16+150,20*16+90
		dc.w	106*16+150,2*16+90
		dc.w	160*16+150,3*16+90
		dc.w	178*16+150,25*16+90

Cue_Table3:
		dc.w	120,1041

Bob_Structure:	dcb.b	BOB_MAXIMUM*BOB_ENTRY_LENGTH,BOB_FALSE

Bob_Structure_End = Bob_Structure+(BOB_MAXIMUM*BOB_ENTRY_LENGTH)

Bob_Info_Tab_Adrs	dc.l	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	Platform_Info_1	;11 Horizontal-Platform
		dc.l	Platform_Info_2	;12 Vertikal-Platform
		dc.l	Boss_Info_1	;13 Boss
		dc.l	Walker_Info_1	;14 Boden-Walker
		dc.l	Walker_Info_2	;15 FlugWalker
		dc.l	Fire_Info_1	;16 Flamme des Flugwalkers.

		dc.l	Pacman_Info_1	;17 Pacman
		dc.l	Flame_Info_1	;18 Flame-starter
		dc.l	Flame_Info_2	;19 Flame
		dc.l	Flame_Info_3	;20 Smoke
		dc.l	Stamper_Info_1	;21 Stampfer
		dc.l	Mllschacht_Info_1;22 Mllschacht
		dc.l	Mll_Info_1	;23 Mllteil
		dc.l	Amarillo_Info_1	;24 Amarillo
		dc.l	GlasAlien_Info_1;25 GlasAlien
		dc.l	Alien_Info_1	;26 Alien
		dc.l	Robot_Info_1	;27 Robot
		dc.l	Brckel_Info_1	;28 Brckel-Platform
		dc.l	Snake_Info_1	;29 Snake
		dc.l	Snake_Info_2	;30 Snake Krper
		dc.l	Elevator_Info_1	;31 Fahrstuhl
		dc.l	Spider_Info_1	;32 Spider

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_StartL	;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.

Platform_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	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	-1		;Hitpoints
		dc.l	Platform_Start1		;Routine, die Bob verwaltet
		dc.l	Platform_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.

Platform_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	-1		;Hitpoints
		dc.l	Platform_Start2		;Routine, die Bob verwaltet
		dc.l	Platform_AnimTable	;Zeiger auf nchste Anim

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

Platform_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	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	$ffffffff	;Bob_I_AFWM
		dc.w	3		;Blit-Breite in Wrtern
		dc.w	6		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Platform_Start2		;Routine, die Bob verwaltet
		dc.l	Platform_AnimTable	;Zeiger auf nchste Anim

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

Pacman_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	$ffffffff	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	5		;Hitpoints
		dc.l	Pacman_Start	;Routine, die Bob verwaltet
		dc.l	Pacman_AnimTableL;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	50		;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.

Explo_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	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.

Walker_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	4		;Hitpoints
		dc.l	Walker_Sky_Start	;Routine, die Bob verwaltet
		dc.l	Walker_Sky_AnimTableR	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;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.

Fire_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	0		;Hitpoints
		dc.l	Fire		;Routine, die Bob verwaltet
		dc.l	Fire_AnimTableR	;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.

Flame_Info_1:
		dc.w	NORM		;Bob_Mode
		dc.w	128		;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	Flame_Start	;Routine, die Bob verwaltet
		dc.l	Flame_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.

Flame_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	$ffffffff	;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	-2		;Hitpoints
		dc.l	Flame		;Routine, die Bob verwaltet
		dc.l	Flame_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	5		;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.

Flame_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	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	Smoke		;Routine, die Bob verwaltet
		dc.l	Smoke_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	2		;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	Move_Bonus_Jump	;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.

Stamper_Info_1:
		dc.w	FAST+BLOCK+NOT_REFRESH		;Bob_Mode
		dc.w	128		;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	$ffffffff		;Bob_I_AFWM
		dc.w	4		;Blit-Breite in Wrtern
		dc.w	8		;Blit-Breite in Bytes
		dc.w	-1		;Hitpoints
		dc.l	Stamper		;Routine, die Bob verwaltet
		dc.l	Stamper_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.

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.

Mllschacht_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	MllschachtStart;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.

Mll_Info_1:
		dc.w	NORM+FLIP	;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	Mll		;Routine, die Bob verwaltet
		dc.l	Rocket_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.

Amarillo_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	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	25		;Hitpoints
		dc.l	Amarillo_Start	;Routine, die Bob verwaltet
		dc.l	Amarillo_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.

Amarillo_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	Amarillo_Start	;Routine, die Bob verwaltet
		dc.l	Amarillo_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.

GlasAlien_Info_1:
		dc.w	FAST+BLOCK+NOT_REFRESH		;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	10		;Hitpoints
		dc.l	GlasAlien	;Routine, die Bob verwaltet
		dc.l	Glas_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.

Alien_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	$ffffffff		;Bob_I_AFWM
		dc.w	2		;Blit-Breite in Wrtern
		dc.w	4		;Blit-Breite in Bytes
		dc.w	1		;Hitpoints
		dc.l	Alien		;Routine, die Bob verwaltet
		dc.l	Alien_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.


Robot_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	48		;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	20		;Hitpoints
		dc.l	Robot_Start	;Routine, die Bob verwaltet
		dc.l	Robot_AnimTableR;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;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.

Brckel_Info_1:
		dc.w	FAST+BLOCK+NOT_REFRESH;Bob_Mode
		dc.w	128		;Bob_I_Out_X_Val
		dc.w	64		;Bob_I_Out_Y_Val
		dc.w	16		;Breite in Pixels
		dc.w	8		;Hhe in Pixels
		dc.w	4		;Tiefe in Planes
		dc.w	2		;Breite einer Zeile der Maske in Bytes
		dc.w	2		;A Modulo
		dc.w	2		;B Modulo
		dc.w	planeb		;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	20		;Hitpoints
		dc.l	Brckel_Start	;Routine, die Bob verwaltet
		dc.l	Brckel_AnimTable;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;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.

Snake_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	20		;Hitpoints
		dc.l	Snake_Start	;Routine, die Bob verwaltet
		dc.l	Snake_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;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.

Snake_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	20		;Hitpoints
		dc.l	Test_Bob_Out	;Routine, die Bob verwaltet
		dc.l	Snake_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	0		;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.

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_Start	;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.

Elevator_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	3		;Tiefe in Planes
		dc.w	4		;Breite einer Zeile der Maske in Bytes
		dc.w	2*2		;A Modulo
		dc.w	2*2*3		;B Modulo
		dc.w	planeb*3	;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	Elevator_Start	;Routine, die Bob verwaltet
		dc.l	Spider_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.

Spider_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	Init_Spider	;Routine, die Bob verwaltet
		dc.l	Spider_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.

Boss_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	15		;Hitpoints
		dc.l	Init_Boss	;Routine, die Bob verwaltet
		dc.l	Meat_AnimTable	;Zeiger auf nchste Anim

		dc.w	0		;Delay
		dc.w	4		;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     Boss 1
*---------------------------------------------------------------------------
BOSSX	=	80+960
BOSSY	=	96+16+32

Init_Boss:
	move.w	#48,Scr_Y_Fix(a6)
	move.w	#968,Scr_X_Fix(a6)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Boss1,Bob_Routine(a4)
	move.w	#128,meat_radius
	move.w	#9*60,eye_count
	clr.w	meat_count
	lea	Zoom_Controler(pc),a1
	bsr	AddHandler
	move.l	#.rout_table1,Zoom_info_pointer
	rts

.rout_table1:
	dc.l	.zoom_routine_1
	dc.l	.zoom_routine_2
	dc.l	.zoom_routine_3
	dc.l	.flip_routine1
	dc.l	.flip_routine2
	dc.l	Kill_Controler

.zoom_routine_1:
	lea	Zoom_Handler(pc),a1
	bsr	AddHandler

	lea	boss_GFX+Bbob00,a0
	lea	Work_Buffer1+45*2,a1
	lea	Rot_Info1,a2
	lea	boss_GFX+Bmsk00,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

;	lea	Work_Buffer1+45*38,a0
;	move.w	#45*5-1,d0
;.Rclear:
;	clr.b	(a0)+
;	dbf	d0,.Rclear


	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Zoomen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer,Dest_Obj
	move.l	#Zoom_Rot_1,Zoom_Routine
	move.l	#spider_zoom_pos,Zoom_pointer

	rts

.zoom_routine_2:
	lea	Zoom_Handler(pc),a1
	bsr	AddHandler

	lea	boss_GFX+Bbob02,a0
	lea	Work_Buffer1+45*2,a1
	lea	Rot_Info1,a2
	lea	boss_GFX+Bmsk02,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

;	lea	Work_Buffer1+45*38,a0
;	move.w	#45*5-1,d0
;.Rclear:
;	clr.b	(a0)+
;	dbf	d0,.Rclear


	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Zoomen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer+10240,Dest_Obj
	move.l	#Zoom_Rot_1,Zoom_Routine
	move.l	#spider_zoom_pos,Zoom_pointer

	rts

.zoom_routine_3:
	lea	Zoom_Handler(pc),a1
	bsr	AddHandler

	lea	boss_GFX+Bbob04,a0
	lea	Work_Buffer1+45*2,a1
	lea	Rot_Info1,a2
	lea	boss_GFX+Bmsk04,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

;	lea	Work_Buffer1+45*38,a0
;	move.w	#45*5-1,d0
;.Rclear:
;	clr.b	(a0)+
;	dbf	d0,.Rclear


	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Zoomen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer+20480,Dest_Obj
	move.l	#Zoom_Rot_1,Zoom_Routine
	move.l	#spider_zoom_pos,Zoom_pointer

	rts

.flip_routine1:
	move.l	#Rotate_Buffer+32640,Dest_Obj
	move.w	#$0000,boss_flipI
	lea	.flip_routine2(pc),a1
	bsr	AddHandler
	lea	boss_GFX,a0
	lea	Rotate_Buffer+30720,a1
	lea	boss_flipI2(pc),a3
	bra	Flip_Bobs

.flip_routine2:
	cmp.w	#640*16,boss_flipI
	bne.s	.doit
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
	rts
.doit:
	lea	boss_flipI(pc),a3
	lea	Rotate_Buffer+20480,a0
	move.l	Dest_Obj,a1
	bsr	Flip_Bobs
	add.l	#640,Dest_Obj
	add.w	#640,boss_flipI
	rts

boss_flipI:
		dc.w	0,32*5,32/8
		dc.w	-1

boss_flipI2:
		dc.w	Bbob04,32*5,32/8
		dc.w	Bbob05,32*5,32/8
		dc.w	Bbob06,32*5,32/8
		dc.w	-1
Boss1:
	cmpi.w	#85,eye_count			;New meat-ball allowed ?
	blo.s	.no_start

	subq.w	#1,meat_count		;New meat-period ?
	bpl.s	.no_start
		move.w	#12,meat_count		;Reset delay
	move.l	a4,-(sp)
		bsr	rnd
		andi.l	#511,d0
		move.w	meat_radius,d1
		subq.w	#2,meat_radius
		divu	d1,d0
		swap	d0
		lsr.w	#1,d1
		sub.w	d1,d0
		addi.w	#144+960,d0
		move.w	d0,d1
		moveq	#16,d2
		moveq	#13,d0
		lea	Area_Enter_Vector(pc),a1
		bsr	Search_Bob_Entry
		move.l	#handle_fmeat,Bob_Routine(a4)	;Set parameter...
		clr.w	Bob_Special_6(a4)
		move.b	#BOB_NOCOL,Bob_Used(a4)
		cmpi.w	#5*60,eye_count		;High-offset ?
		bhs.s	.dont_set
		move.w	#20,Bob_Special_1(a4)	;Yes...
.dont_set:
	move.l	(sp)+,a4
.no_start:
	subq.w	#1,eye_count				;First animation over ?
	bpl.s	.no_end
	move.l	#handle_boss1d,Bob_Routine(a4)	;Init next phase...
	move.w	#25,meat_radius
	move.w	#700,meat_count
;	move.b	#1,last_dir
;	sf	swap_flag
;	sf	dest_flag
	sf	meat_flag
	sf	eye_flag
	clr.w	eye_count
	sf	zoom_mode
;	clr.w	dest_count.w

		lea	boss_coltab(pc),a0		;Set collision-tab
		move.w	#224,d1
		moveq	#9,d0
.loop0:
		move.w	d1,(a0)+
		dbf	d0,.loop0
		move.w	#168,d1
		moveq	#19,d0
.loop1:
		move.w	d1,(a0)+
		dbf	d0,.loop1
		move.w	#224,d1
		moveq	#9,d0
.loop2:
		move.w	d1,(a0)+
		dbf	d0,.loop2

.no_end:
	rts

handle_collision:
	tst.b	T_hit
	bne.s	.out
	cmpi.w	#74,T_posX
	blt.s	.out
	cmpi.w	#214,T_posX
	bgt.s	.out
	move.w	T_posX,d0
	move.w	T_posY,d1
	addi.w	#16,d0
	move.w	d0,d2
	addi.w	#32,d1
	lsr.w	#3,d0
	add.w	d0,d0
	lea	boss_coltab(pc),a0
	move.w	(a0,d0.w),d0
	cmp.w	d0,d1
	bls.s	.out
	cmpi.w	#160,d2
	slt	T_hitdir
	bsr	make_plhit	;Handle player-collison
.out:
	rts

handle_boss1d:
	bsr	handle_collision
	addq.b	#1,zoom_mode
	cmpi.b	#3,zoom_mode
	bne.s	.no_clear
	sf	zoom_mode
.no_clear:
;	bsr	handle_mosaic
	subq.w	#1,meat_count
	bpl.s	.nonew1
	move.w	#700,meat_count
	cmpi.w	#42,meat_radius
	bhs.s	.nonew1
	addq.w	#5,meat_radius
.nonew1:
	tst.b	meat_flag
	bne.s	.no_meat
		bsr	rnd
		andi.w	#127,d0
		move.w	d0,d2
		bsr	sin
		exg	d0,d2
		bsr	cos
		move.w	meat_radius,d1
		muls	#60,d0
		muls	d1,d2
		asr.l	#8,d0
		asr.l	#8,d2
		addi.w	#70,d0
		moveq	#64,d1
		sub.w	d2,d1
		cmpi.w	#160-32,d0
		bhs.s	.no_meat
		cmpi.w	#96-32,d1
		bhs.s	.no_meat
		addi.w	#BOSSX,d0
		addi.w	#BOSSY,d1
		move.w	d1,d2
		move.w	d0,d1
		move.l	a4,-(sp)
		moveq	#13,d0
		lea	Area_Enter_Vector(pc),a1
		movem.w	d1-d2,-(sp)
		bsr	Search_Bob_Entry
		move.l	(sp)+,Bob_Special_3(a4)
		move.l	#handle_meat,Bob_Routine(a4)
		sf	Bob_Special_5(a4)
		move.b	#18,Bob_Special_5+1(a4)
		clr.w	Bob_Special_6(a4)
		st	meat_flag
		move.b	#BOB_NOCOL,Bob_Used(a4)
		move.l	(sp)+,a4
.no_meat:
	subq.w	#1,eye_count
	bpl	.no_eye
	tst.b	eye_flag
	bne	.no_eye
	bsr	rnd
	move.w	d0,-(sp)
	bsr	rnd
	move.w	(sp)+,d1
	andi.l	#$ffff,d1
	andi.w	#31,d0
	divu	#40,d1
	swap	d1
	addi.w	#BOSSX,d0
	addi.w	#BOSSY+20,d1
	move.w	#160,d2
	sub.w	T_posX,d2
	addi.w	#16,d2
	tst.b	last_dir		;Init yet ?
	bgt.s	.no_check
	tst.w	d2
	bpl.s	.checkl
	tst.b	last_dir
	bne.s	.no_check
	st	last_dir
	move.w	#130,eye_count
	rts
.checkl:
	tst.b	last_dir
	beq.s	.no_check
	sf	last_dir
	move.w	#130,eye_count
	rts
.no_check:
	tst.w	d2
	smi	last_dir
	not.b	swap_flag
	beq.s	.set2
	tst.w	d2
	bpl.s	.set
	addi.w	#64,d0
	bra.s	.set
.set2:
	tst.w	d2
	bmi.s	.set
	addi.w	#64,d0
.set:
	add.w	#16,d1
	move.w	d1,d2
	move.w	d0,d1
	moveq	#13,d0
	lea	Area_Enter_Vector(pc),a1
	move.l	a4,-(sp)
	bsr	Search_Bob_Entry

	clr.l	Bob_Special_5(a4)
	st	eye_flag
	tst.b	swap_flag
	beq.s	.start_eye

	move.l	#handle_mouth,Bob_Routine(a4)
	lea	Meat3_AnimTableR(pc),a0
	move.b	last_dir,Bob_Special_7(a4)
	bne.s	.set_gfx
	lea	Meat3_AnimTableL(pc),a0
.set_gfx:
	move.l	a0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
;	bsr	make_power
;	move.b	d0,Bob_Power(a4)
	move.w	#100,eye_count
	bra.s	.start_end
.start_eye:
	move.l	#handle_eye,Bob_Routine(a4)
	move.l	#Meat2_AnimTable,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
;	move.l	#eye_spr,O_INFO(a4)
;	bsr	make_power
	move.b	d0,d1
	lsr.b	#1,d1
	add.b	d1,d0
;	move.b	d0,Bob_Power(a4)
	move.w	#210,eye_count
.start_end:
	move.l	(sp)+,a4
.no_eye:
	cmpi.w	#90,T_posY
	bgt.s	.no_upstart
	addq.w	#1,plat_count
	rts
.no_upstart:
	clr.w	plat_count
	rts


handle_meat:
;	tst.b	dest_flag
;	bne	Out_Bob_Damage
	tst.b	Bob_Special_5(a4)
	bne	.meat2
	subq.b	#1,Bob_Special_5+1(a4)
	bpl.s	.ok
;	st	Bob_Special_5(a4)
	move.b	#20,Bob_Special_5+1(a4)
.ok:
		cmpi.w	#$001f,Bob_Special_1(a4)
		blt.s	.meat1
		move.l	#Rotate_Buffer+15*640,d5
		move.l	#Rotate_Buffer+15*640+512,d6
		bsr	draw_bob
		sf	meat_flag
		movem.w	Bob_X_Position(a4),d0-d1
		sub.w	Scr_X_Level_Pos(a6),d0
		sub.w	Scr_Y_Level_Pos(a6),d1
		addq.w	#4,d0
		lsr.w	#3,d0
		add.w	d0,d0
		lea	boss_coltab(pc),a1
		adda.w	d0,a1
		moveq	#3,d0
.search_col:
		cmp.w	(a1),d1
		bge.s	.no
		move.w	d1,(a1)
.no:
		addq.l	#2,a1
		dbf	d0,.search_col
	move.l	#.handle_out,Bob_Routine(a4)
	move.b	#2,Bob_Special_1(a4)
	rts
.handle_out:
	subq.b	#1,Bob_Special_1(a4)
	beq	Out_Bob_Damage
	rts

.meat1:
		addi.l	#$00008000,Bob_Special_1(a4)
.meat2:
		subq.b	#1,Bob_Special_5+1(a4)
		bpl.s	.meat0
		sf	Bob_Special_5(a4)
		move.b	#18,Bob_Special_5+1(a4)
.meat0:
	subq.b	#1,Bob_Special_6+1(a4)
	bpl.s	.meat3
	addq.b	#6,Bob_Special_6+1(a4)
	not.b	Bob_Special_6(a4)
.meat3:
	move.w	Bob_Special_1(a4),d0
	lsr.w	#1,d0
	mulu	#640,d0
	add.l	#Rotate_Buffer,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)

	moveq	#0,d2
	rts

handle_mouth:
;	tst.b	dest_flag
;	bne	make_expl
	moveq	#0,d0
	move.b	Bob_Special_5(a4),d0
	jmp	.mouth_tab(pc,d0.w)
.mouth_tab:
	bra.w	.zoom_in1
	bra.w	.move_mouth
	bra.w	.wait_mouth
	bra.w	.move_mouth
	bra.w	.wait_mouth
	bra.w	.move_mouth
	bra.w	.wait_mouth
	bra.w	.move_mouth
	bra.w	.zoom_out1
.zoom_in1:
	addi.l	#$00008000,Bob_Special_1(a4)
	cmpi.l	#$001f0000,Bob_Special_1(a4)
	blt.s	.mouth_zoom
	addq.b	#4,Bob_Special_5(a4)
	sf	Bob_Special_5+1(a4)
	sf	eye_flag
	move.b	#4,Bob_Special_6(a4)
	sf	Bob_Special_6+1(a4)
;	st	O_COLEN(a5)
	rts
.zoom_out1:
	subi.l	#$00008000,Bob_Special_1(a4)
	cmpi.l	#$00010000,Bob_Special_1(a4)
	bgt.s	.mouth_zoom
	sf	eye_flag
	bra	Out_Bob_Damage

.mouth_zoom:
	move.w	Bob_Special_1(a4),d0
	lsr.w	#1,d0
	mulu	#640,d0
	cmp.l	#Meat3_AnimTableR,Bob_Act_Anim(a4)
	blt.s	.to_left
	add.l	#Rotate_Buffer+32640,d0
	bra.s	.set
.to_left:
	add.l	#Rotate_Buffer+20480,d0
.set:
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)
	rts

.move_mouth:
	tst.b	Bob_Special_5+1(a4)
	bne	.quit_mouth
	moveq	#0,d0
	move.b	Bob_Special_6+1(a4),d0
	jmp	.mm_tab(pc,d0.w)
.mm_tab:
	bra.s	.open_mouth
	bra.s	.shot_mouth
	bra.s	.close_mouth
.open_mouth:
	subq.b	#1,Bob_Special_6(a4)
	bpl.s	.out
	addq.b	#5,Bob_Special_6(a4)
	bsr	Get_Next_Bob_Frame
	addq.w	#1,Bob_Anim_Delay(a4)
	cmpi.w	#2,Bob_Anim_Delay(a4)
	bne.s	.out
	move.b	#45,Bob_Special_6(a4)
	addq.b	#2,Bob_Special_6+1(a4)
.out:
	rts
.close_mouth:
	subq.b	#1,Bob_Special_6(a4)
	bpl.s	.out
	addq.b	#5,Bob_Special_6(a4)
	subq.w	#1,Bob_Anim_Delay(a4)
	seq	Bob_Special_5+1(a4)
	bsr	Get_Next_Bob_Frame
	rts
.shot_mouth:
	cmpi.b	#2,Bob_Special_6(a4)
	bne.s	.no_shoot
	moveq	#64,d0
	cmpi.w	#50*8,plat_count
	ble.s	.no_air
	subi.w	#40,d0
	cmpi.w	#50,T_posY
	bge.s	.no_air
	moveq	#0,d0
.no_air:
	move.w	#192,d2
	tst.b	Bob_Special_7(a4)
	bne.s	.not_left
	sub.w	d0,d2
	bra.s	.not_right
.not_left:
	add.w	d0,d2
.not_right:
	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#16,d0
	addi.w	#16,d1
	bsr	start_bullets
.no_shoot:
	subq.b	#1,Bob_Special_6(a4)
	bpl	.out
	sf	Bob_Special_6(a4)
	addq.b	#2,Bob_Special_6+1(a4)
	rts

.wait_mouth:
	addq.b	#4,Bob_Special_5(a4)
	sf	Bob_Special_5+1(a4)
	sf	eye_flag
	move.b	#4,Bob_Special_6(a4)
	sf	Bob_Special_6+1(a4)
;	st	O_COLEN(a4)
	clr.w	Bob_Anim_Delay(a4)
	rts

.quit_mouth:
;	tst.b	eye_flag
;	bne	.out
;	sf	O_COLEN(a5)
	addq.b	#4,Bob_Special_5(a4)
;	clr.w	O_PHA(a4)
;	st	eye_flag
	rts

start_bullets:
	move.w	d0,d4
	move.w	d1,d5
	subi.w	#15,d2
	move.w	d2,d7
	moveq	#5,d6
.loop:
		move.w	d7,d0
		bsr	sin
		move.w	d0,d2
		move.w	d7,d0
		bsr	cos
		move.w	d2,d3
		move.w	d0,d2
		asr.w	#2,d2
		asr.w	#2,d3
		move.w	d2,d0
		move.w	d3,d1
		asr.w	#1,d0
		asr.w	#1,d1
		add.w	d0,d2
		add.w	d1,d3
		movem.l	d4-d7,-(sp)
		move.w	d4,d0
		move.w	d5,d1
		bsr	Start_Shoot
		movem.l	(sp)+,d4-d7
		addq.w	#5,d7
	dbf	d6,.loop
	rts

handle_eye:
;	tst.b	dest_flag
;	bne	make_expl
	bsr	Standart_Hit_Handler
	bne.s	.not_destroyed

	addq.w	#1,dest_count
	cmpi.b	#1,Bob_Special_5(a4)
	beq.s	.ok
	sf	eye_flag
.ok:
	moveq	#$50,d0			;Yes, 26 Points
	bra	Standart_Destruction
.not_destroyed:
	subq.b	#1,Bob_Special_6+1(a4)
	bpl.s	.no_anim
	addq.b	#8,Bob_Special_6+1(a4)
	not.b	Bob_Special_6(a4)
.no_anim:
	moveq	#0,d0
	move.b	Bob_Special_5(a4),d0
	jmp	.eye_tab(pc,d0.w)
.eye_tab:
	bra.w	.zoom_in
	bra.w	.move_eye
	bra.w	.zoom_out

.zoom_in:
	addi.l	#$00008000,Bob_Special_1(a4)
	cmpi.l	#$001f0000,Bob_Special_1(a4)
	blt.s	.eye_zoom
		addq.b	#4,Bob_Special_5(a4)
;		addq.w	#1,O_PHA(a5)
		move.w	#340,Bob_Special_7(a4)
		sf	eye_flag
;		st	O_COLEN(a5)
	bra.s	.eye_zoom
.zoom_out:
	subi.l	#$00008000,Bob_Special_1(a4)
	cmpi.l	#$00010000,Bob_Special_1(a4)
	bgt.s	.eye_zoom
	sf	eye_flag
	bra	Out_Bob_Damage
.eye_zoom:
	move.w	Bob_Special_1(a4),d0
	lsr.w	#1,d0
	mulu	#640,d0
	add.l	#Rotate_Buffer+10240,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)
	rts

.move_eye:
	tst.b	Bob_Special_6(a4)
	tst.w	Bob_Special_7(a4)
	bne.s	.out
	tst.b	eye_flag
	beq.s	.return
	addq.b	#4,Bob_Special_5(a4)
;	clr.w	O_PHA(a5)
	st	eye_flag
;	sf	O_COLEN(a5)
.return:
	bra	Standart_BobAnim
.out:
	subq.w	#1,Bob_Special_7(a4)
	bra	Standart_BobAnim

draw_bob:
	movem.w	Bob_X_Position(a4),d0-d1
	bsr	Calc_Adress

	add.l	Scr_Refresh_Field(a6),d4

	waitblt
	move.l	#$ffff0000,bltafwm(a5)
	move.w	#-2,bltamod(a5)
	move.w	#10,bltbmod(a5)
	move.w	#planeb*4-6,bltcmod(a5)
	move.w	#planeb*4-6,bltdmod(a5)

	move.w	Bob_X_Position(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	#3,d7
.bloop:
	move.l	d5,bltbpth(a5)
	move.l	d6,bltapth(a5)
	move.l	d4,bltcpth(a5)
	move.l	d4,bltdpth(a5)

	move.w	#64*30+3,bltsize(a5)
	add.l	#planeb,d4
	addq.l	#4,d5
	dbf	d7,.bloop
.out:
	rts


	;Fallender Fleischball

handle_fmeat:
	tst.b	Bob_Special_2(a4)			;Waiting for draw ?
	beq	.no_draw
	subq.w	#1,Bob_Anim_Delay(a4)
	bmi	Out_Bob_Damage
	cmp.w	#2,Bob_Anim_Delay(a4)
	bne	.out
.blit_back:
	move.l	#boss_GFX+Bbob00,d5
	move.l	#boss_GFX+Bmsk00,d6
	bra	draw_bob
.out:
	rts
.no_draw:
	tst.b	Bob_Special_2+1(a4)
	bne	.no_check_floor
	cmpi.w	#130,Bob_Y_Position(a4)			;Low enough for test ?
	ble.s	.dont_test
	bsr	rnd				;Get random-offset
	andi.w	#$000f,d0
	move.w	d0,d2
	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#16,d0
	addi.w	#16,d1
	add.w	d2,d1
	add.w	Bob_Special_1(a4),d1		;Get high/low-offset
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision		;Test collision
	movem.w	(sp)+,d0-d1
	bne.s	.floor_found
	subq.w	#8,d1
	bsr	check_obj_kollision
	beq.s	.dont_test
	subq.w	#8,Bob_Y_Position(a4)
.floor_found:
	bsr	Get_Next_Bob_Frame
	st	Bob_Special_2+1(a4)		;Yes...
	move.w	#6,Bob_Special_3(a4)
	move.w	Bob_Y_Position(a4),Bob_Special_5(a4)
	rts
.dont_test:
	move.w	Bob_Special_6(a4),d0
	lsr.w	#3,d0
	add.w	d0,Bob_Y_Position(a4)
	addq.w	#1,Bob_Special_6(a4)			;No, move down...
	bra	.end

.no_check_floor:
	move.w	Bob_Special_5(a4),d0			;"Titsch"-Down
	cmp.w	Bob_Y_Position(a4),d0
	bne.s	.not_equal
	move.w	Bob_Special_3(a4),Bob_Special_4(a4)
	subq.w	#4,Bob_Special_3(a4)
	bgt.s	.not_equal
	bsr	Get_Next_Bob_Frame
	st	Bob_Special_2(a4)
	move.w	#3,Bob_Anim_Delay(a4)
.not_equal:
	move.w	Bob_Special_4(a4),d0
	sub.w	d0,Bob_Y_Position(a4)
	move.w	Bob_Special_5(a4),d0
	cmp.w	Bob_Y_Position(a4),d0
	bhs.s	.ok
	move.w	d0,Bob_Y_Position(a4)
.ok:
	subq.w	#1,Bob_Special_4(a4)
.end:
	bra	Test_Bob_Out

boss_coltab:	ds.w	40

Meat_AnimTable:
		dc.l	boss_GFX+Bbob00,boss_GFX+Bmsk00
		dc.w	0,0,30,2,2,28,24
		dc.l	boss_GFX+Bbob01,boss_GFX+Bmsk01
		dc.w	0,0,31,2,2,28,24

		dc.w	ENTRY_END
		dc.l	Meat_AnimTable

		;Eye
Meat2_AnimTable:
		dc.l	boss_GFX+Bbob02,boss_GFX+Bmsk02
		dc.w	0,0,31,2,2,28,24
		dc.l	boss_GFX+Bbob03,boss_GFX+Bmsk03
		dc.w	0,0,31,2,2,28,24

		dc.w	ENTRY_END
		dc.l	Meat2_AnimTable

Meat3_AnimTableL:
		dc.l	boss_GFX+Bbob04,boss_GFX+Bmsk04
		dc.w	0,0,32,2,2,28,24
		dc.l	boss_GFX+Bbob05,boss_GFX+Bmsk05
		dc.w	0,0,32,2,2,28,24
		dc.l	boss_GFX+Bbob06,boss_GFX+Bmsk06
		dc.w	0,0,32,2,2,28,24
		dc.l	boss_GFX+Bbob05,boss_GFX+Bmsk05
		dc.w	0,0,32,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Meat3_AnimTableL

Meat3_AnimTableR:
		dc.l	Rotate_Buffer+30720,Rotate_Buffer+31232
		dc.w	0,0,32,2,2,28,24
		dc.l	Rotate_Buffer+31360,Rotate_Buffer+31872
		dc.w	0,0,32,2,2,28,24
		dc.l	Rotate_Buffer+32000,Rotate_Buffer+32512
		dc.w	0,0,32,2,2,28,24
		dc.l	Rotate_Buffer+31360,Rotate_Buffer+31872
		dc.w	0,0,32,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Meat3_AnimTableR

Bbob00 	= $00000
Bmsk00 	= $001e0
Bbob01 	= $00258
Bmsk01 	= $00448
Bbob02 	= $004c4
Bmsk02 	= $006b4
Bbob03 	= $00730
Bmsk03 	= $00920
Bbob04 	= $0099c
Bmsk04 	= $00b8c
Bbob05 	= $00c08
Bmsk05 	= $00e08
Bbob06 	= $00e88
Bmsk06 	= $01088


meat_count:	dc.w	0
meat_radius:	dc.w	0
eye_count:	dc.w	0
plat_count:	dc.w	0
dest_count:	dc.w	0
eye_flag:	dc.b	0
meat_flag:	dc.b	0
zoom_mode:	dc.b	0
last_dir:	dc.b	0
swap_flag:	dc.b	0

	even

Zoom_Controler:
	tst.w	Zoom_finished
	bne.s	.out
	st	Zoom_finished
	move.l	Zoom_info_pointer,a1
	move.l	(a1),a1
	addq.l	#4,Zoom_info_pointer
	jmp	(a1)
.out:
	rts

Kill_Controler:
	move.l	#Return,-4(a0)
	rts

Zoom_info_pointer:	dc.l	0

Zoom_Handler:
	move.l	Zoom_Routine(pc),a1
	jmp	(a1)

Zoom_Kill:
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
	rts

Zoom_Rot_1:
	move.l	#Zoom_Rot_2,Zoom_Routine
	move.l	Zoom_pointer,a0
	move.l	(a0),d0
	lea	Work_Buffer1-6,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Do_Zoom
	rts

Zoom_Rot_2:
	move.l	#Zoom_Rot_3,Zoom_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jsr	Convert_to_Bitplane2

	rts

Zoom_Rot_3:
	move.l	#Zoom_Rot_1,Zoom_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4+4*16(a0),a3
	lea	4*16*4(a0),a0

	lea	Work_Buffer2+16*32,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jsr	Convert_to_Bitplane2

	add.l	#640,Dest_Obj
	addq.l	#4,Zoom_pointer
	move.l	Zoom_pointer,a0
	tst.l	(a0)
	bpl.s	.out
	move.l	#Zoom_Kill,Zoom_Routine
.out:
	rts

Zoom_Routine:	dc.l	Zoom_Rot_1
Zoom_pointer:	dc.l	0
Zoom_finished:	dc.w	0

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Elevator
*---------------------------------------------------------------------------
Elev_Zoom_Handler:
	move.l	Elev_Routine(pc),a1
	jmp	(a1)

Elev_Kill:
	move.l	#Return,-4(a0)
	rts

Elev_Rot_1:
	move.l	#Elev_Rot_3,Elev_Routine
	move.l	Elev_Zoom_pointer,a0
	move.l	(a0),d0
	lea	Work_Buffer1,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Do_Zoom
	rts

Elev_Rot_2:
	move.l	#Elev_Rot_3,Elev_Routine
;	lea	Work_Buffer1,a0
;	lea	Work_Buffer2,a1
;	lea	Rot_Info1,a2
;	jsr	Do_Copy
	rts

Elev_Rot_3:
	move.l	#Elev_Rot_4,Elev_Routine
	move.l	Dest_Obj,a0
	lea	3*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jsr	Convert_to_Bitplane3

	rts

Elev_Rot_4:
	move.l	#Elev_Rot_1,Elev_Routine
	move.l	Dest_Obj,a0
	lea	3*32*4+4*16(a0),a3
	lea	3*16*4(a0),a0

	lea	Work_Buffer2+16*32,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jsr	Convert_to_Bitplane3

	add.l	#512,Dest_Obj
	addq.l	#4,Elev_Zoom_pointer
	move.l	Elev_Zoom_pointer,a0
	tst.l	(a0)
	bpl.s	.out
	move.l	#Elev_Kill,Elev_Routine
.out:
	rts

Elev_Routine:	dc.l	Elev_Rot_1
Elev_Zoom_pointer:	dc.l	0

Elevator_Start:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Elevator,Bob_Routine(a4)
Elevator:
	cmp.w	#1584,Scr_X_Level_Pos(a6)
	bne.s	.not_reached
	cmp.w	#768,Scr_Y_Level_Pos(a6)
	beq	.reached
.not_reached:
	tst.w	Scr_X_Fix(a6)
	bne	.out

	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	cmp.w	#50,d0
	blt.s	.out
	cmp.w	#300,d0
	bgt.s	.out
	move.w	#1584,Scr_X_Fix(a6)
	move.w	#768,Scr_Y_Fix(a6)

	lea	Elev_Zoom_Handler(pc),a1
	bsr	AddHandler

	move.l	a4,-(sp)

	lea	para_GFX+Pbob1b,a0
	lea	Work_Buffer1+45*2,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk0e,a3
	moveq	#32,d0
	moveq	#3,d1
	jsr	Convert_to_Rotate

	lea	Work_Buffer1+45*38,a0
	move.w	#45*5-1,d0
.Rclear:
	clr.b	(a0)+
	dbf	d0,.Rclear

	move.l	(sp)+,a4

	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Zoomen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer+2000,Dest_Obj
	move.l	#Elev_Rot_1,Elev_Routine
	move.l	#spider_zoom_pos,Elev_Zoom_pointer
.out:
	bra	Test_Bob_Out2

.reached:
	tst.b	Bob_Special_1(a4)
	bne	.start_aliens

	move.w	#50*30,Bob_Special_6(a4)

	move.w	#3*planeb*160/4-1,d0

	cmp.l	#$40000,Scr_Show_Field(a6)	;Welches Field ist vorne ?
	beq.s	.clear_5

	lea	$40000+32*planeb*3,a0
	bra.s	.clear
.clear_5:
	lea	$50000+32*planeb*3,a0
.clear:
	clr.l	(a0)+
	dbf	d0,.clear

	move.w	#-1,Bob_Not_Finished		;Screen ist gelscht, nichts mehr drauf blitten!

	lea	$67800,a0
	lea	elevator_field,a1
	lea	elevator_chars,a2
	moveq	#20,d5
	moveq	#2,d7
	bsr	Init_Parafield

	move.w	#32,Scr_Y_Play_Anf(a6)

	bsr	Set_ParaClist
	bsr	Wait_Line

	lea	Para_Clist,a0
	move.l	a0,cop1lch(a5)

	st	Bob_Special_1(a4)

	move.w	#3*planeb*160/4-1,d0

	cmp.w	#$0004,Scr_Show_Field(a6)	;Welches Field ist vorne ?
	beq.s	.clear_52

	lea	$40000+32*planeb*3,a0
	bra.s	.clear2
.clear_52:
	lea	$50000+32*planeb*3,a0
.clear2:
	clr.l	(a0)+
	dbf	d0,.clear2

	move.w	#$0100,RestFunction		;Restore=Clear

	move.l	#Set_ParaClist,Clist_Handler

	move.w	#planeb*3,Scr_Plane_Width(a6)

	lea	Convert_Table1(pc),a0
	bsr	Convert_to_3planes

	lea	para_flipI(pc),a3
	lea	para_GFX,a0
	lea	Rotate_Buffer,a1
	jsr	Flip_Bobs

	lea	$60000,a0
	lea	para_field,a1
	lea	para_chars,a2
	moveq	#15,d7
	moveq	#32,d5
	bsr	Init_Parafield

	lea	Elevator_Fade(pc),a1
	bsr	AddHandler

	clr.w	Elevator_fadepos

	move.l	#Snake_Player_Dead,Dead_Vector

	bsr	handle_repos1

	bra	Test_Bob_Out2

.start_aliens:
	subq.w	#1,Bob_Special_6(a4)
	bmi.s	.end_elevator
	bsr	handle_repos1

	subq.w	#1,spider_count			;New spider ?
	bpl.s	.no_spider
	move.w	#30,spider_count		;Yes, reset delay
	bsr	rnd
	and.w	#127,d0
	add.w	#80,d0
	move.w	d0,d1
	moveq	#60,d2
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2

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

	move.l	a4,-(sp)
	bsr	Search_Bob_Entry

	bsr	Init_Spider

	move.l	#Spider_Elev,Bob_Routine(a4)
	st	Bob_Special_7+1(a4)

	bsr	rnd			;Get movement-direction
	cmpi.b	#170,d0			;for spider
	blo.s	.not1
	moveq	#1,d0
	bra.s	.set
.not1:
	cmpi.b	#85,d0
	blo.s	.not2
	moveq	#0,d0
	bra.s	.set
.not2:
	moveq	#-1,d0
.set:
	move.b	d0,Bob_Special_7(a4)		;Save it
	move.l	(sp)+,a4
.no_spider:
	bra	Test_Bob_Out2

.end_elevator:
	move.l	#.reinit,Bob_Routine(a4)
	move.w	#50,Bob_Special_6(a4)
	lea	Elevator_Fade_out(pc),a1
	bra	AddHandler
.reinit:
	subq.w	#1,Bob_Special_6(a4)
	bpl	.out
	move.b	#-1,Cue_Point+1			;Des wars!

	move.w	#$09f0,RestFunction		;Restore=Clear

	move.l	#Level1_Clist,Clist_Handler

	move.w	#planeb*4,Scr_Plane_Width(a6)
	lea	Main_Clist,a0
	move.l	a0,cop1lch(a5)

	lea	Convert_Table2(pc),a0
	bsr	Convert_to_4planes

	bra	Out_Bob_Damage

	;Color-Fadein-Handler
Elevator_Fade:
	cmp.w	#16<<2,Elevator_fadepos
	beq.s	.clear_me

	move.w	Elevator_fadepos(pc),d7
	lsr.w	#2,d7
	lea	B_parallax3,a0		;Source
	lea	parallax3,a1		;Destination
	move.w	#7,d6
	bsr	Do_Fade_colors

	addq.w	#1,Elevator_fadepos

	rts

.clear_me:
	move.l	#Return,-4(a0)
	rts

Elevator_Fade_out:
	cmp.w	#-1<<2,Elevator_fadepos
	beq.s	.clear_me

	move.w	Elevator_fadepos(pc),d7
	lsr.w	#2,d7
	lea	B_parallax3,a0		;Source
	lea	parallax3,a1		;Destination
	move.w	#7,d6
	bsr	Do_Fade_colors

	subq.w	#1,Elevator_fadepos

	rts

.clear_me:
	move.l	#Return,-4(a0)
	rts

Elevator_fadepos:	dc.w	0
spider_count:		dc.w	0

Convert_to_3planes:
	move.l	(a0)+,d0
	beq.s	.out
	move.l	d0,a1
	move.w	#3,Bob_I_Depth(a1)
	move.w	Bob_I_B_Modulo(a1),d0
	asr.w	#2,d0
	sub.w	d0,Bob_I_B_Modulo(a1)
	sub.w	#planeb,Bob_I_D_Modulo(a1)
	move.l	Bob_I_Next_Anim(a1),a1
.set_anims:
	move.l	(a0)+,d0
	beq.s	Convert_to_3planes
	move.l	d0,(a1)
	add.l	#22,a1
	bra.s	.set_anims
.out:
	rts

Convert_to_4planes:
	move.l	(a0)+,d0
	beq.s	.out
	move.l	d0,a1
	move.w	#4,Bob_I_Depth(a1)
	move.w	Bob_I_B_Modulo(a1),d0
	ext.l	d0
	divs	#3,d0
	asl.w	#2,d0
	move.w	d0,Bob_I_B_Modulo(a1)
	add.w	#planeb,Bob_I_D_Modulo(a1)
	move.l	Bob_I_Next_Anim(a1),a1
.set_anims:
	move.l	(a0)+,d0
	beq.s	Convert_to_4planes
	move.l	d0,(a1)
	add.l	#22,a1
	bra.s	.set_anims
.out:
	rts

Convert_Table1:
	dc.l	Rocket_Info_1
	 dc.l	Rotate_Buffer,Rotate_Buffer+13*3*2,Rotate_Buffer+27*3*2,Rotate_Buffer+40*3*2
	 dc.l	para_GFX+Pbob16,para_GFX+Pbob15,para_GFX+Pbob14,para_GFX+Pbob13,para_GFX+Pbob12
	 dc.l	para_GFX+Pbob12+12*3*2,para_GFX+Pbob13+12*3*2,para_GFX+Pbob14+12*3*2,para_GFX+Pbob15+12*3*2,para_GFX+Pbob16+12*3*2
	 dc.l	Rotate_Buffer+40*3*2+14*3*2,Rotate_Buffer+27*3*2+12*3*2,0
	dc.l	Explo_Info_1
	 dc.l	para_GFX+Pbob00,para_GFX+Pbob01,para_GFX+Pbob02,para_GFX+Pbob03,para_GFX+Pbob04
	 dc.l	para_GFX+Pbob05,para_GFX+Pbob06,para_GFX+Pbob07,para_GFX+Pbob08,para_GFX+Pbob09,0
	dc.l	Explo_Info_2
	 dc.l	para_GFX+Pbob0a,para_GFX+Pbob0b,para_GFX+Pbob0c,para_GFX+Pbob0d,para_GFX+Pbob0e
	 dc.l	para_GFX+Pbob0f,para_GFX+Pbob10,para_GFX+Pbob11,0
	dc.l	Mine_Info_1
	 dc.l	para_GFX+Pbob17,para_GFX+Pbob18,para_GFX+Pbob19,para_GFX+Pbob18,para_GFX+Pbob19,para_GFX+Pbob18,para_GFX+Pbob19,0
	dc.l	Rocket_Info_2,0
	dc.l	Spider_Info_1
	 dc.l	para_GFX+Pbob1b,para_GFX+Pbob1c,para_GFX+Pbob1a,0
	dc.l	0


Convert_Table2:
	dc.l	Rocket_Info_1
	 dc.l	main_Buffer+Mbob18-Mbob18,main_Buffer+Mbob19-Mbob18,main_Buffer+Mbob1a-Mbob18,main_Buffer+Mbob1b-Mbob18
	 dc.l	main_GFX+Mbob1c,main_GFX+Mbob1b,main_GFX+Mbob1a,main_GFX+Mbob19,main_GFX+Mbob18
	 dc.l	main_GFX+Mbob18+12*4*2,main_GFX+Mbob19+13*4*2,main_GFX+Mbob1a+12*4*2,main_GFX+Mbob1b+14*4*2,main_GFX+Mbob1c+14*4*2
	 dc.l	main_Buffer+Mbob1b-Mbob18+14*4*2,main_Buffer+Mbob1a-Mbob18+12*4*2,0
	dc.l	Explo_Info_1
	 dc.l	main_GFX+Mbob00,main_GFX+Mbob01,main_GFX+Mbob02,main_GFX+Mbob03,main_GFX+Mbob04
	 dc.l	main_GFX+Mbob05,main_GFX+Mbob06,main_GFX+Mbob07,main_GFX+Mbob08,main_GFX+Mbob09,0
	dc.l	Explo_Info_2
	 dc.l	main_GFX+Mbob0a,main_GFX+Mbob0b,main_GFX+Mbob0c,main_GFX+Mbob0d,main_GFX+Mbob0e
	 dc.l	main_GFX+Mbob0f,main_GFX+Mbob10,main_GFX+Mbob11,0
	dc.l	Mine_Info_1
	 dc.l	main_GFX+Mbob26,main_GFX+Mbob27,main_GFX+Mbob28,main_GFX+Mbob27,main_GFX+Mbob28,main_GFX+Mbob27,main_GFX+Mbob28,0
	dc.l	Rocket_Info_2,0
	dc.l	Spider_Info_1
	 dc.l	level_GFX+bob0e,level_GFX+bob0f,level_GFX+bob0d,0
	dc.l	0

para_flipI:	dc.w	Pbob12,13*3,16/8
		dc.w	Pbob13,14*3,16/8
		dc.w	Pbob14,13*3,16/8
		dc.w	Pbob15,15*3,16/8
		dc.w	Pbob16,15*3,16/8
		dc.w	-1


spider_zoom_pos:
	dc.l	$80000,$70000,$60000,$50000,$48000,$40000,$38000,$30000,$28000
	dc.l	$20000,$1c000,$18000,$15000,$13000,$12000,$10000,-1

Pbob00 	= $00000
Pbob01 	= $000d8
Pbob02 	= $0021c
Pbob03 	= $00384
Pbob04 	= $00504
Pbob05 	= $00684
Pbob06 	= $00804
Pbob07 	= $00978
Pbob08 	= $00abc
Pbob09 	= $00bdc
Pbob0a 	= $00c9c
Pbob0b 	= $00cf0
Pbob0c 	= $00d1a
Pbob0d 	= $00d62
Pbob0e 	= $00db6
Pbob0f 	= $00e0a
Pbob10 	= $00e5e
Pbob11 	= $00eac
Pbob12 	= $00efa
Pbob13 	= $00f48
Pbob14 	= $00f9c
Pbob15 	= $00fea
Pbob16 	= $01044
Pbob17 	= $0109e
Pbob18 	= $010fe
Pbob19 	= $0119a
Pbob1a 	= $0125a
Pbob1b 	= $01332
Pbob1c 	= $01482

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Spider
*---------------------------------------------------------------------------
Init_Spider:
	move.w	#30,Bob_Special_3(a4)
	sf	Bob_Special_4(a4)
	move.l	Bob_X_Position(a4),Bob_Special_5(a4)
	clr.w	Bob_Special_7(a4)
	clr.b	Bob_Special_2(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Spider,Bob_Routine(a4)
	rts

Spider:
	move.l	Bob_Special_5(a4),Bob_X_Position(a4)

	tst.b	Bob_Special_4(a4)			;In middle of screen ?
	bne.s	.no
	movem.w	Bob_X_Position(a4),d0-d1
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	Scr_Y_Level_Pos(a6),d1

		cmpi.w	#50,d1
		blt	.out
		cmpi.w	#190,d0
		bgt	.out
		cmpi.w	#100,d0
		blt	.out
		st	Bob_Special_4(a4)
	sf	Bob_BlitStatus(a4)
.no:
	subq.w	#1,Bob_Special_6(a4)			;Move up a little bit
	bra.s	Spider_jump
.out:
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	bra	Test_Bob_Out2

Spider_Elev:
	move.l	Bob_Special_5(a4),Bob_X_Position(a4)
	subq.w	#1,Bob_Special_6(a4)			;Move up a little bit

Spider_jump:
	move.b	Bob_Special_7(a4),d0
	ext.w	d0
	add.w	d0,Bob_Special_5(a4)

	moveq	#0,d0
	move.b	Bob_Special_2(a4),d0
	lsr.w	#1,d0
	tst.b	Bob_Special_7+1(a4)
	beq.s	.no_3plane
	mulu	#512,d0
	add.l	#Rotate_Buffer+2000,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#384,d0
	move.l	d0,Bob_Mask(a4)
	bra.s	.is_3plane
.no_3plane:
	mulu	#640,d0
	add.l	#Rotate_Buffer+20480,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)
.is_3plane:
	addq.b	#1,Bob_Special_2(a4)		;Zoom object in

	subq.w	#1,Bob_Special_3(a4)			;2nd move-phase ?
	bpl.s	.not_ready

		move.l	#handle_spider1,Bob_Routine(a4)
		clr.b	Bob_Special_2(a4)
		clr.l	Bob_Special_1(a4)
		move.b	#BOB_TRUE,Bob_Used(a4)
		move.w	#180,Bob_Special_3(a4)
		clr.w	Bob_Anim_Delay(a4)
		bra	Test_Bob_Out
.not_ready:
	bra	Test_Bob_Out

handle_spider1:					;2nd movement-phase
	move.l	#$90,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	cmpi.b	#2,Bob_Anim_Delay(a4)
	beq.s	.no_anim
	moveq	#1,d0
	subq.b	#1,Bob_Anim_Delay+1(a4)
	bpl.s	.no_kipp
	addq.b	#3,Bob_Anim_Delay+1(a4)
	bsr	Get_Next_Bob_Frame
	addq.b	#1,Bob_Anim_Delay(a4)
	moveq	#1,d0
	bra.s	.no_kipp
.no_anim:
		subq.b	#1,Bob_Special_1+1(a4)
		bpl.s	.lab1
			addq.b	#7,Bob_Special_1+1(a4)
			addq.w	#1,Bob_Special_2(a4)
.lab1:
	move.w	Bob_Special_2(a4),d0

.no_kipp:
	move.w	d0,d7
	cmp.w	#$0100,RestFunction		;Elevator-Stage ?
	bne.s	.move_down
;	tst.b	spider_off			;Spider-Kill ?
;	bne	Standart_Destruction

	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#16,d0
	addi.w	#24,d1
	bsr	check_obj_kollision
	beq	.move_down

	subq.w	#1,Bob_Special_3(a4)
	bmi	Standart_Destruction
	bra	Test_Bob_Out
.move_down:
	add.w	d7,Bob_Y_Position(a4)
	move.b	Bob_Special_7(a4),d0
	ext.w	d0
	add.w	d0,Bob_X_Position(a4)
	bra	Test_Bob_Out

Spider_AnimTable:
		dc.l	level_GFX+bob0e,level_GFX+msk0e
		dc.w	0,0,32,2,2,28,24
		dc.l	level_GFX+bob0f,level_GFX+msk0f
		dc.w	0,8,18,2,2,28,24
		dc.l	level_GFX+bob0d,level_GFX+msk0d
		dc.w	0,5,19,2,7,28,15

*---------------------------------------------------------------------------
*	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

	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)
	bsr	rnd
	and.w	#511,d0
	move.w	d0,Bob_Special_2(a4)	;Nchster Wait-Wert!
	bra	Test_Bob_Out

Diamond_Count:	dc.w	0

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
	bsr	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

*---------------------------------------------------------------------------
*	Routine and AnimTable of     Snake
*---------------------------------------------------------------------------
Snake_Start:
	tst.b	Snake_Wait
	bne	.wait
	move.l	Act_Bob_Structure,a0
	moveq	#BOB_MAXIMUM-1,d7
.delete:
	tst.b	Bob_Used(a0)
	bmi.s	.not_used
	cmp.l	a4,a0
	beq.s	.not_used
	move.l	a4,-(sp)
	move.l	a0,a4
	bsr	Out_Bob
	move.l	(sp)+,a4
.not_used:
	lea	BOB_ENTRY_LENGTH(a0),a0
	dbf	d7,.delete

	move.w	#2584-32,Snake_X
	move.w	#648-20,Snake_Y
	move.w	#2584-32+340,Bob_X_Position(a4)
	move.w	#648-20+75,Bob_Y_Position(a4)

	move.l	#Snake0,Bob_Routine(a4)		;Set next handler etc.
	clr.w	Bob_Special_1(a4)
	move.l	#snake_tab,Bob_Special_2(a4)
	clr.w	Bob_Special_4(a4)
	move.w	#340<<6,Bob_Special_5(a4)
	move.w	#75<<6,Bob_Special_6(a4)
	lea	snake_pos+28,a5			;Add snake-objects
	lea	snake_pic,a3

	movem.w	Bob_X_Position(a4),d1-d2

	moveq	#5,d7
	moveq	#1,d6
.start_tail:
	moveq	#30,d0
	lea	Area_Enter_Vector(pc),a1

	movem.l	d1-d2/d6-d7/a3-a6,-(sp)
	bsr	Search_Bob_Entry
	move.l	a4,a0
	movem.l	(sp)+,d1-d2/d6-d7/a3-a6

	move.l	#handle_snake1,Bob_Routine(a0)
	move.l	a5,Bob_Special_1(a0)
	move.l	a3,Bob_Special_3(a0)
	move.w	d6,Bob_Special_5(a0)

	add.l	#640,Bob_Graphics(a0)
	add.l	#640,Bob_Mask(a0)

	lea	32(a5),a5
	addq.w	#8,a3
	addq.w	#1,d6

	dbf	d7,.start_tail

	move.l	#handle_snake2,Bob_Routine(a0)	;Letztes Teil=Schwanz!
	add.l	#640,Bob_Graphics(a0)
	add.l	#640,Bob_Mask(a0)

	movem.w	Bob_X_Position(a4),d0-d1
	lea	snake_pos,a0			;Init tables
	moveq	#55,d7
.set_postable:
	move.w	d0,(a0)+
	move.w	d1,(a0)+
	addq.w	#4,d0
	dbf	d7,.set_postable

	lea	snake_pic,a0
	moveq	#13,d7
.set_pixtable:
	clr.l	(a0)+
	dbf	d7,.set_pixtable

	move.w	Bob_Power(a4),Snake_Power

	lea	custom,a5
	bra	Test_Bob_Out

.wait:
	move.w	#2584,Scr_X_Fix(a6)
	move.w	#648,Scr_Y_Fix(a6)
	move.w	#2584-32,Bob_X_Position(a4)
	subq.b	#1,Snake_Wait
	move.l	#Snake_Player_Dead,Dead_Vector
	rts

Snake_Player_Dead:
	jsr	Die_Player
	move.w	reposX,T_posX
	move.w	reposY,T_posY
	move.w	repos_face,T_face
	move.b	#50,T_flash
	rts

handle_snake1:
	move.l	Bob_Special_3(a4),a0
	moveq	#0,d0
	move.b	2(a0),d0
	and.b	#$f0,d0
	mulu	#40,d0
	add.l	#Rotate_Buffer+16*640,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)
	bra	handle_snake

handle_snake2:
	move.l	Bob_Special_3(a4),a0
	moveq	#0,d0
	move.b	2(a0),d0
	and.b	#$f0,d0
	mulu	#40,d0
	add.l	#Rotate_Buffer+32*640,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)

handle_snake:
	move.l	Bob_Special_1(a4),a0
	move.l	(a0),Bob_X_Position(a4)
	move.w	Bob_Special_5(a4),d0
	btst	d0,Snake_Hits
	beq.s	.Normal
	move.b	#COLOUR,Bob_Race+1(a4)
	bra.s	.Col
.Normal:
	move.b	#NORM,Bob_Race+1(a4)
.Col:
	moveq	#0,d0
	tst.w	Snake_Power
	beq	Standart_Destruction
	rts

do_snake:					;Standart-Code I
	bsr	handle_repos1

	subq.b	#1,Bob_Special_4(a4)
	bpl.s	.no_change
	move.l	Bob_Special_2(a4),a0
	move.w	(a0)+,Bob_Special_4(a4)
	bpl.s	.ok
	move.w	#340<<6,Bob_Special_5(a4)
	move.w	#75<<6,Bob_Special_6(a4)
	sf	Bob_Special_1+1(a4)
	lea	snake_tab(pc),a0
	move.w	(a0)+,Bob_Special_4(a4)
.ok:
	move.l	a0,Bob_Special_2(a4)
.no_change:
	move.b	Bob_Special_4+1(a4),d0
	add.b	d0,Bob_Special_1+1(a4)
	rts

nothing:					;Standart-Code II
	move.w	Bob_Power(a4),Snake_Power
	beq	.die

	move.b	Bob_Special_1+1(a4),d0
	bsr	sin
	move.w	d0,d2
	move.b	Bob_Special_1+1(a4),d0
	bsr	cos

	asr.w	#1,d0				;COS/2.25
	move.w	d0,d1
	asr.w	#2,d1
	add.w	d1,d0
	asr.w	#1,d2				;SIN/2.25
	move.w	d2,d1
	asr.w	#2,d1
	add.w	d1,d2

	sub.w	d0,Bob_Special_5(a4)
	add.w	d2,Bob_Special_6(a4)
	movem.w	Bob_Special_5(a4),d0-d1
	asr.w	#6,d0
	asr.w	#6,d1

	add.w	Snake_X,d0
	add.w	Snake_Y,d1

	movem.w	d0-d1,Bob_X_Position(a4)

	lea	snake_pos+54*4,a0
	moveq	#53,d7
.copy:
	move.l	-(a0),4(a0)
	dbf	d7,.copy
	movem.w	d0-d1,(a0)

	move.b	Snake_Hits,d0
	lsl.b	#1,d0
	move.b	d0,Snake_Hits

	tst.w	Bob_Hit(a4)
	beq.s	.no_newhit
	clr.w	Bob_Hit(a4)
	or.b	#1,Snake_Hits
	move.b	#COLOUR,Bob_Race+1(a4)
	rts
.no_newhit:
	move.b	#NORM,Bob_Race+1(a4)
	moveq	#0,d0
	move.b	Bob_Special_1+1(a4),d0

	and.b	#$f0,d0
	mulu	#40,d0
	add.l	#Rotate_Buffer,d0
	move.l	d0,Bob_Graphics(a4)
	add.l	#512,d0
	move.l	d0,Bob_Mask(a4)
	rts
.die:
;	bsr	start_recopy
	clr.w	Scr_X_Fix(a6)
	clr.w	Scr_Y_Fix(a6)
	move.l	#$765,d0
	bsr	Standart_Destruction
	movem.l	d0-d7/a0-a6,-(sp)
	bsr	EnterScreen
	movem.l	(sp)+,d0-d7/a0-a6
	move.w	#8,Cue_Point
	move.l	#Player_Dead,Dead_Vector

	lea	level_GFX+bob13,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk13,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Drehen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer,Dest_Obj
	clr.w	Rotate_Angle
	move.l	#Rotate_1,Rotate_Routine
	move.w	#8,Rotate_Angle_Add
	move.l	#Work_Buffer1,Rotate_Buffer_Pointer

	lea	Rotate_Handler(pc),a1
	bra	AddHandler

	rts

Snake0:
	bsr	do_snake
	lea	snake_pic+10*4,a3
	moveq	#9,d0
.copy:
	move.l	-(a3),4(a3)
	dbf	d0,.copy

	addq.w	#1,(a3)
	cmpi.w	#10,(a3)
	blo.s	.ok
	clr.w	(a3)
.ok:
	moveq	#1,d0
	swap	d0
	move.l	d0,d1
	move.b	Bob_Special_1+1(a4),d2
	move.b	d2,2(a3)

	move.l	#Snake1,Bob_Routine(a4)
	bra	nothing

Snake1:					;Head
	bsr	do_snake
	move.l	#Snake2,Bob_Routine(a4)
	bra	nothing

Snake2:					;Tail
	bsr	do_snake
	move.l	#Snake3,Bob_Routine(a4)
	bra	nothing

Snake3:					;Head
	bsr	do_snake
	move.l	#Snake0,Bob_Routine(a4)
	bra	nothing

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

snake_tab:
	dc.b	35,0,80,4,6,0,8,4,6,0,25,-4,24,0,10,-5,18,3,50,0
	dc.b	32,-2,1,0,31,-2
	dc.b	46,0,10,-3,1,0,10,-3,1,0,10,-3,1,0,10,-3,4,0,9,-3,2,0,10,-3
	dc.b	1,0,10,-3,1,0,10,-3
	dc.b	2,0,10,-4,18,0,10,4,20,0,2,-3,32,0,3,3,80,0
	dc.b	-1
	even

snake_pos:	ds.l	56
snake_pic:	ds.l	14
Snake_X:	dc.w	0
Snake_Y:	dc.w	0
Snake_Hits:	dc.b	0
Snake_Wait:	dc.b	0
Snake_Power:	dc.w	0

Snake_AnimTable:
		dc.l	level_GFX+bob14,level_GFX+msk14
		dc.w	0,0,32,4,2,24,22
		dc.l	level_GFX+bob15,level_GFX+msk15
		dc.w	0,0,32,4,2,24,22
		dc.l	level_GFX+bob16,level_GFX+msk16
		dc.w	0,0,32,4,2,24,22

Wait_Handler:
	subq.w	#1,Wait_Verz
	bpl.s	.out
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
.out:
	rts

Wait_Verz:	dc.w	0

Rotate_Handler:
	move.l	Rotate_Routine(pc),a1
	jmp	(a1)

Rotate_Kill:
	move.l	#Return,-4(a0)
	clr.w	Zoom_finished
	move.w	#$f00,$dff180
	rts

Rotate_1:
	move.l	#Rotate_2,Rotate_Routine
	move.l	Rotate_Buffer_Pointer,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	move.w	Rotate_Angle,d0
	jmp	Do_Rotate

Rotate_2:
	move.l	#Rotate_3,Rotate_Routine
	move.l	Rotate_Buffer_Pointer,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jmp	Do_Copy

Rotate_3:
	move.l	#Rotate_4,Rotate_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4(a0),a3

	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jmp	Convert_to_Bitplane2

Rotate_4:
	move.l	#Rotate_1,Rotate_Routine
	move.l	Dest_Obj,a0
	lea	4*32*4+4*16(a0),a3
	lea	4*16*4(a0),a0

	lea	Work_Buffer2+16*32,a1
	lea	Rot_Info1,a2
	moveq	#16,d7
	jsr	Convert_to_Bitplane2

	add.l	#640,Dest_Obj
	move.w	Rotate_Angle_Add,d0
	add.b	d0,Rotate_Angle+1
	bne.s	.out
	move.l	#Rotate_Kill,Rotate_Routine
.out:
	rts

Rotate_Angle:		dc.w	0
Rotate_Angle_Add:	dc.w	0
Rotate_Routine:		dc.l	Rotate_1
Rotate_Buffer_Pointer:	dc.l	0

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Brckel
*---------------------------------------------------------------------------
Brckel_Start:
	move.l	#Brckel,Bob_Routine(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#30,Bob_Special_1(a4)
	move.w	Bob_Y_Position(a4),Brckel_Pos
	lea	floor_off(pc),a0
	moveq	#17,d7
.clear:
	clr.l	(a0)+
	dbf	d7,.clear
Brckel:
	movem.w	Bob_X_Position(a4),d0-d1
	move.w	d0,d2
	add.w	#144,d2
	bsr	check_foot_frame
	beq	.no_feet
	st	T_stand
	move.w	Bob_Y_Position(a4),d1
	bsr	alias_feet
	subq.b	#1,Bob_Special_1(a4)
	bpl	.no_feet

	bsr	Start_Slaves
	sf	Bob_BlitStatus(a4)
	bclr	#B_NOT_REFRESH,Bob_Race(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	#Brckel_2,Bob_Routine(a4)
	move.b	#30,Bob_Special_1(a4)

	movem.w	Bob_X_Position(a4),d0-d1

	moveq	#0,d2
	moveq	#8,d3
.loop:
	movem.l	d0-d3,-(sp)
	bsr	Set_Char
	movem.l	(sp)+,d0-d3
	add.w	#16,d0
	dbf	d3,.loop

	lea	Zoom_Controler(pc),a1
	jsr	AddHandler
	move.l	#.rout_table1,Zoom_info_pointer

	move.l	a4,-(sp)

	lea	level_GFX+bob14,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk14,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	lea	level_GFX+bob15,a0
	lea	Work_Buffer3,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk15,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	lea	level_GFX+bob16,a0
	lea	Work_Buffer4,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk16,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	move.l	(sp)+,a4

	move.w	#2640,Scr_X_Fix(a6)
	move.b	#150,Snake_Wait

.no_feet:
	bra	Test_Bob_Out

.rout_table1:
	dc.l	.wait_routine_1
	dc.l	.rotate_routine_1
	dc.l	.rotate_routine_2
	dc.l	.rotate_routine_3
	dc.l	Kill_Controler

.wait_routine_1:
	move.w	#90,Wait_Verz
	lea	Wait_Handler(pc),a1
	jmp	AddHandler

.rotate_routine_1:
	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Drehen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer,Dest_Obj
	clr.w	Rotate_Angle
	move.l	#Rotate_1,Rotate_Routine
	move.w	#16,Rotate_Angle_Add
	move.l	#Work_Buffer1,Rotate_Buffer_Pointer

	lea	Rotate_Handler(pc),a1
	jmp	AddHandler

.rotate_routine_2:
	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Drehen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer+640*16,Dest_Obj
	clr.w	Rotate_Angle
	move.l	#Rotate_1,Rotate_Routine
	move.w	#16,Rotate_Angle_Add
	move.l	#Work_Buffer3,Rotate_Buffer_Pointer

	lea	Rotate_Handler(pc),a1
	jmp	AddHandler

.rotate_routine_3:
	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	st	Rot_I_Single_Call(a2)		;Drehen auf zwei Frames verteilen!
	move.l	#Rotate_Buffer+640*32,Dest_Obj
	clr.w	Rotate_Angle
	move.l	#Rotate_1,Rotate_Routine
	move.w	#16,Rotate_Angle_Add
	move.l	#Work_Buffer4,Rotate_Buffer_Pointer

	lea	Rotate_Handler(pc),a1
	jmp	AddHandler

Brckel_2:
	move.w	Bob_X_Position(a4),d0
	move.w	Brckel_Pos,d1
	move.w	d0,d2
	add.w	#144,d2
	bsr	check_foot_frame
	beq.s	.no_feet
	st	T_stand
	move.w	Bob_Y_Position(a4),d1
	bsr	alias_feet
.no_feet:
	subq.b	#1,Bob_Special_2(a4)
	bpl.s	.no_rumpel
	addq.b	#2,Bob_Special_2(a4)
	bchg	#0,Bob_Special_1+1(a4)
	bne.s	.lab1
	lea	.rumpel1(pc),a0
	moveq	#-1,d0
	bra.s	.lab2
.lab1:
	lea	.rumpel2(pc),a0
	moveq	#1,d0
.lab2:
;	move.w	d0,T_forceY
	lea	floor_off,a1
	moveq	#17,d0
.copy:
	move.w	(a0)+,d1
	add.w	d1,(a1)+
	addq.l	#2,a1
	dbf	d0,.copy

.no_rumpel:
	lea	floor_off(pc),a0
	move.w	(a0),d1
	asr.w	#4,d1
	add.w	Brckel_Pos(pc),d1
	move.w	d1,Bob_Y_Position(a4)
	subq.b	#1,Bob_Special_1(a4)
	bpl	Test_Bob_Out
	move.b	#70,Bob_Special_1(a4)
	move.l	#Brckel_3,Bob_Routine(a4)

	bra	Test_Bob_Out

.rumpel1:
	dc.w	1<<4,-1<<4,-2<<4,-1<<4,-1<<4,-1<<4,2<<4,-1<<4,1<<4
	dc.w	2<<4,-3<<4,2<<4,-2<<4,-2<<4,-2<<4,2<<4,-3<<4,2<<4
.rumpel2:
	dc.w	-1<<4,1<<4,2<<4,1<<4,1<<4,1<<4,-2<<4,1<<4,-1<<4
	dc.w	-2<<4,3<<4,-2<<4,2<<4,2<<4,2<<4,-2<<4,3<<4,-2<<4

Brckel_3:
	lea	.floor_accel(pc),a0	;Yes, do acceleration
	lea	floor_off(pc),a1
	moveq	#17,d0
.speedup:
	move.w	2(a1),d1
	add.w	d1,(a1)+
	move.w	(a0)+,d1
	add.w	d1,(a1)+
	dbf	d0,.speedup
	lea	floor_off(pc),a0
	move.w	(a0),d1
	asr.w	#4,d1
	add.w	Brckel_Pos(pc),d1
	move.w	d1,Bob_Y_Position(a4)
	subq.b	#1,Bob_Special_1(a4)
	bne	Test_Bob_Out
	clr.w	Brckel_Pos
	bra	Out_Bob

.floor_accel:
	dc.w	1,2,3,4,5,4,3,2,1
	dc.w	2,3,4,5,6,5,4,3,2

Start_Slaves:
	;Alle Brckel-Slaves eintragen!

	movem.w	Bob_X_Position(a4),d1-d2

	moveq	#7,d7				;Noch 8 Stck in dieser Reihe.
	moveq	#4,d6
.loop1:
	add.w	#16,d1
	lea	Area_Enter_Vector(pc),a1

	moveq	#28,d0

	movem.l	d1-d2/d6/d7/a4,-(sp)
	bsr	Search_Bob_Entry
	move.l	#Brckel_Slave,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	a4,a0
	movem.l	(sp)+,d1-d2/d6/d7/a4
	move.w	d6,Bob_Special_1(a0)
	btst	#0,d7
	beq.s	.no1
	sub.l	#128,Bob_Graphics(a0)
.no1:
	addq.w	#4,d6
	dbf	d7,.loop1

	movem.w	Bob_X_Position(a4),d1-d2

	addq.w	#8,d2
	moveq	#8,d7				;Noch 9 Stck in dieser Reihe.
.loop2:
	lea	Area_Enter_Vector(pc),a1

	moveq	#28,d0

	movem.l	d1-d2/d6/d7/a4,-(sp)
	bsr	Search_Bob_Entry
	move.l	#Brckel_Slave2,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	add.l	#64,Bob_Graphics(a4)
	move.l	a4,a0
	movem.l	(sp)+,d1-d2/d6/d7/a4
	move.w	d6,Bob_Special_1(a0)
	btst	#0,d7
	beq.s	.no2
	sub.l	#128,Bob_Graphics(a0)
.no2:
	add.w	#16,d1
	addq.w	#4,d6
	dbf	d7,.loop2
	rts

Brckel_Slave:
	tst.w	Brckel_Pos
	beq	Out_Bob_Damage

	move.b	#BOB_NOCOL,Bob_Used(a4)
	bclr	#B_NOT_REFRESH,Bob_Race(a4)
	move.w	Bob_Special_1(a4),d0
	lea	floor_off(pc),a0
	move.w	(a0,d0.w),d1
	asr.w	#4,d1
	add.w	Brckel_Pos(pc),d1
	move.w	d1,Bob_Y_Position(a4)
	bra	Test_Bob_Out

Brckel_Slave2:
	tst.w	Brckel_Pos
	beq	Out_Bob_Damage

	bclr	#B_NOT_REFRESH,Bob_Race(a4)
	move.w	Bob_Special_1(a4),d0
	lea	floor_off(pc),a0
	move.w	(a0,d0.w),d1
	asr.w	#4,d1
	add.w	Brckel_Pos(pc),d1
	addq.w	#8,d1
	move.w	d1,Bob_Y_Position(a4)
	bra	Test_Bob_Out

Brckel_Pos:	dc.w	0

floor_off:
	ds.w	18*2

Brckel_AnimTable:
		dc.l	character+(55*128),0
		dc.w	0,0,8,0,4,144,12

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Robot
*---------------------------------------------------------------------------
Robot_Start:
	move.l	#Robot,Bob_Routine(a4)
	move.w	Bob_Special_4(a4),d0
	smi	Bob_Special_3(a4)
	bpl.s	.ok
	neg.w	d0
	move.l	#Robot_AnimTableL,Bob_Next_Anim(a4)
	move.l	d0,-(sp)
	bsr	Get_Next_Bob_Frame
	move.l	(sp)+,d0
.ok:
	move.w	d0,Bob_Special_2(a4)

	move.b	#63,Bob_Special_1+1(a4)		;Wait 64 frames
	move.b	#50,Bob_Special_3+1(a4)

Robot:
	move.l	#$100,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	moveq	#0,d0				;Handle current mode-routine
	move.b	Bob_Special_1(a4),d0
	jmp	.job_tab(pc,d0.w)
.job_tab:
	bra.w	.rstand
	bra.w	.rstart
	bra.w	.rfly
	bra.w	.rdown

.end_robot:
	move.w	T_posX(pc),d0			;Face the player...
	sub.w	Bob_X_Position(a4),d0
	add.w	Scr_X_Level_Pos(a6),d0
	tst.b	Bob_Special_3(a4)
	bne.s	.lab0
	tst.w	d0
	bmi.s	.turn
	bra.s	.dont_turn
.lab0:
	tst.w	d0
	bmi.s	.dont_turn
.turn:
	not.b	Bob_Special_3(a4)
	lea	Robot_AnimTableL(pc),a0
	bne.s	.left
	lea	Robot_AnimTableR(pc),a0
.left:
	move.l	a0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
.dont_turn:
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0

	cmpi.w	#-32,d0					;On screen -> shoot !
	blt.s	.no_shot
	cmpi.w	#320-16,d0
	bgt.s	.no_shot
	subq.b	#1,Bob_Special_3+1(a4)			;Time for next shot ?
	bpl.s	.no_shot
	addi.b	#75,Bob_Special_3+1(a4)
	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#17,d1
	tst.b	Bob_Special_3(a4)
	beq.s	.right1
	moveq	#-2,d2
	subq.w	#8,d0
	bra.s	.start
.right1:
	moveq	#2,d2
	addi.w	#48,d0
.start:
	asl.w	#6,d2			;Allocate bullet
	moveq	#0,d3			;Y-Speed
	bsr	Start_Shoot
.no_shot:
	tst.b	Bob_Special_1(a4)
	bne	Standart_BobAnim
	cmp.l	#Robot_AnimTableL,Bob_Act_Anim(a4)
	beq	Test_Bob_Out
	cmp.l	#Robot_AnimTableR,Bob_Act_Anim(a4)
	beq	Test_Bob_Out
	blt.s	.set_left
	move.l	#Robot_AnimTableR,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	bra	Test_Bob_Out
.set_left:
	move.l	#Robot_AnimTableL,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	bra	Test_Bob_Out

.rstand:
	subq.b	#1,Bob_Special_1+1(a4)
	bne	.end_robot
	move.b	#15,Bob_Special_1+1(a4)
	addq.b	#4,Bob_Special_1(a4)
;	move.l	Bob_Special_5(a4),a0		;Flamme ausschalten.
;	st	O_USR0(a0)
	bra	.end_robot

.rstart:
	subq.w	#1,Bob_Y_Position(a4)			;Move robot up
	subq.b	#1,Bob_Special_1+1(a4)			;Time up ?
	bne	.end_robot
	addq.b	#4,Bob_Special_1(a4)		;Change to fly mode
	move.w	Bob_Special_2(a4),Bob_Special_4(a4)
	clr.w	Bob_Special_7(a4)
	bra	.end_robot

.swing_tab:
	dc.b	-1,-1,1,1,1,1,-1,-1

.rfly:
	movem.w	Bob_X_Position(a4),d0-d1	;Check if wall detected...
	tst.b	Bob_Special_5(a4)
	bne.s	.to_left
	add.w	#40,d0
.to_left:
	add.w	#12,d1
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no_xmove
	addq.w	#8,d1
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no_xmove
	addq.w	#8,d1
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no_xmove
	tst.b	Bob_Special_5(a4)
	beq.s	.to_right
	subq.w	#1,Bob_X_Position(a4)
	bra.s	.no_xmove
.to_right:
	addq.w	#1,Bob_X_Position(a4)
.no_xmove:

	movem.w	Bob_X_Position(a4),d0/d2	;Follow player
	move.w	d2,d1
	sub.w	T_posY(pc),d2
	sub.w	Scr_Y_Level_Pos(a6),d2
	beq.s	.no
	bmi.s	.down
	cmpi.w	#8,d2				;More than 8 pixel diff. ?
	blo.s	.no
	subq.w	#1,d1
	move.w	d1,d2
	addi.w	#46,d1
	bra.s	.check
.down:
	cmpi.w	#-8,d2				;More than 8 pixel diff. ?
	blt.s	.no
	addq.w	#1,d1
	move.w	d1,d2
.check:
	move.w	d2,d7				;Wall ?
	addq.w	#8,d0
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no
	addi.w	#12,d0
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no
	addi.w	#12,d0
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no
	move.w	d7,Bob_Y_Position(a4)
.no:

	subq.b	#1,Bob_Special_7(a4)		;Swing-delay over
	bpl.s	.no_swing
	addq.b	#3,Bob_Special_7(a4)		;Let robot swing a little
	move.b	Bob_Special_7+1(a4),d0
	and.w	#7,d0
	lea	.swing_tab(pc),a0
	move.b	0(a0,d0.w),d0
	ext.w	d0
	add.w	d0,Bob_Y_Position(a4)
	addq.b	#1,Bob_Special_7+1(a4)
.no_swing:
	subq.w	#1,Bob_Special_4(a4)		;Over ?
	bpl	.end_robot
	not.b	Bob_Special_5(a4)		;Next phase etc.
	addq.b	#4,Bob_Special_1(a4)
	bra	.end_robot

.rdown:						;Lower robot down
	addq.w	#1,Bob_Y_Position(a4)

	movem.w	Bob_X_Position(a4),d0-d1	;Ground reached
	addi.w	#46,d1
	addi.w	#24,d0
	bsr	check_obj_kollision
	beq	.end_robot
	sf	Bob_Special_1(a4)		;Next mode...
	st	Bob_Special_1+1(a4)
	bra	.end_robot

Robot_AnimTableL:
		dc.l	level_GFX+bob09,level_GFX+msk09
		dc.w	0,0,48,2,2,28,44
		dc.l	level_GFX+bob0a,level_GFX+msk0a
		dc.w	0,0,48,2,2,28,44
		dc.w	ENTRY_END
		dc.l	Robot_AnimTableL

Robot_AnimTableR:
		dc.l	level_Buffer+bob09-bob01,level_Buffer+msk09-bob01
		dc.w	0,0,48,2,2,28,44
		dc.l	level_Buffer+bob0a-bob01,level_Buffer+msk0a-bob01
		dc.w	0,0,48,2,2,28,44
		dc.w	ENTRY_END
		dc.l	Robot_AnimTableR

*---------------------------------------------------------------------------
*	Routine and AnimTable of      GlasAlien
*---------------------------------------------------------------------------
GlasAlien:
	bsr	Set_Refresh
	move.b	#BOB_NOPLCOL,Bob_Used(a4)
	tst.w	Bob_Hit(a4)
	beq.s	.no_hit
	move.l	#Glas_AnimTableHit,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.w	#2,Bob_Anim_Delay(a4)
	clr.w	Bob_Hit(a4)
.no_hit:
	tst.w	Bob_Power(a4)
	bne	Standart_BobAnim

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	sub.w	#40,d1				;Zeigt auf das erste Modul des Kanisters.
	lsr.w	#3,d0
	and.w	#$fffe,d0
	move.l	Scr_Level(a6),a0

	adda.w	d0,a0
	lsr.w	#4,d1

	mulu	Scr_Level_Width(a6),d1
	add.l	d1,a0

	move.w	Scr_Level_Width(a6),d0
	move.w	#20,-2(a0)
	move.w	#21,(a0)
	move.w	#28,-2(a0,d0.w)
	move.w	#29,(a0,d0.w)
	add.w	d0,d0
	move.w	#36,-2(a0,d0.w)
	move.w	#37,(a0,d0.w)

	;Kopieren der Grafik in den Restore-Screen

	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	subq.w	#8,d1

	movem.l	d0-d1,-(sp)
	moveq	#20,d2
	bsr	Set_Char
	movem.l	(sp)+,d0-d1

	add.w	#16,d1

	movem.l	d0-d1,-(sp)
	moveq	#28,d2
	bsr	Set_Char
	movem.l	(sp)+,d0-d1

	add.w	#16,d1

	movem.l	d0-d1,-(sp)
	moveq	#36,d2
	bsr	Set_Char
	movem.l	(sp)+,d0-d1

	sub.w	#32,d1
	add.w	#16,d0

	movem.l	d0-d1,-(sp)
	moveq	#21,d2
	bsr	Set_Char
	movem.l	(sp)+,d0-d1

	add.w	#16,d1

	movem.l	d0-d1,-(sp)
	moveq	#29,d2
	bsr	Set_Char
	movem.l	(sp)+,d0-d1

	add.w	#16,d1

	movem.l	d0-d1,-(sp)
	moveq	#37,d2
	bsr	Set_Char
	movem.l	(sp)+,d0-d1

	move.l	a4,-(sp)
	bsr	Start_Explo
	move.l	(sp)+,a4
	sub.w	#16,Bob_Y_Position(a4)

	move.l	a4,-(sp)
	bsr	Start_Explo
	move.l	(sp)+,a4

	move.w	Bob_X_Position(a4),d1
	move.w	Bob_Y_Position(a4),d2
	add.w	#16,d2
	moveq	#26,d0
	lea	Area_Enter_Vector(pc),a1
	move.l	a4,-(sp)
	bsr	Search_Bob_Entry		;Starten des Aliens.
	move.l	(sp)+,a4

	add.w	#32,Bob_Y_Position(a4)

	moveq	#0,d0
	bra	Standart_Destruction

Alien:
	movem.w	Bob_X_Position(a4),d0-d1
	add.w	#20,d1
	add.w	#16,d0
	bsr	check_obj_kollision
	bne.s	.no_move
	addq.w	#2,Bob_Y_Position(a4)
.no_move:
	moveq	#$20,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction

	bra	Standart_BobAnim

Alien_AnimTable:
		dc.l	level_GFX+bob0e,level_GFX+msk0e
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob0f,level_GFX+msk0f
		dc.w	0,5,19,2,7,28,15
.label:
		dc.l	level_GFX+bob0d,level_GFX+msk0d
		dc.w	0,8,18,2,10,28,14
		dc.w	ENTRY_END
		dc.l	.label

Glas_AnimTable:
		dc.l	AD_Bob+Abob01,0
		dc.w	0,0,28,2,2,28,33
		dc.l	AD_Bob+Abob02,0
		dc.w	0,0,28,2,2,28,33
		dc.w	ENTRY_END
		dc.l	Glas_AnimTable
Glas_AnimTableHit:
		dc.l	AD_Bob+Abob03,0
		dc.w	0,0,28,2,2,28,33
		dc.w	ENTRY_END
		dc.l	Glas_AnimTable


Set_Refresh:
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	bmi.s	.set_on
	move.w	Bob_to_Info_Offs(a4),d7
	add.w	Bob_I_Width(a4,d7.w),d0
	cmp.w	#304,d0
	bge.s	.set_on
	move.w	Bob_Y_Position(a4),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
	bmi.s	.set_on
	add.w	Bob_Height(a4),d0
	cmp.w	#208,d0
	blt.s	.set_off
.set_on:
	bclr	#B_NOT_REFRESH,Bob_Race(a4)
	rts
.set_off:
	bset	#B_NOT_REFRESH,Bob_Race(a4)
	rts

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Amarillo
*---------------------------------------------------------------------------

Amarillo_Start:
	move.b	#-1,Bob_Special_1(a4)
	move.l	#Amarillo,Bob_Routine(a4)
	move.w	#50,Bob_Special_4(a4)
	move.w	#-1,Bob_Special_2(a4)
Amarillo:
	bsr	Standart_Hit_Handler
	beq	.destruct
	tst.w	Bob_Special_4(a4)
	bpl.s	.lab1
	move.w	T_posX,d0
	sub.w	Bob_X_Position(a4),d0
	add.w	Scr_X_Level_Pos(a6),d0
	bpl.s	.noneg
	neg.w	d0
.noneg:
	cmp.w	#100,d0
	bhs	.lab0
	tst.w	Zoom_finished
	bne.s	.lab0
	move.l	#Amarillo_Roll,Bob_Routine(a4)

	clr.w	Bob_Hit(a4)
	move.b	#NORM,Bob_Race+1(a4)

	lea	Amarillo_RollTableL(pc),a0
	moveq	#-4,d0
	tst.w	Bob_Special_2(a4)
	bmi.s	.set
	lea	Amarillo_RollTableR(pc),a0
	moveq	#4,d0
.set:
	move.l	a0,Bob_Next_Anim(a4)
	move.b	d0,Bob_Special_6(a4)
	bsr	Get_Next_Bob_Frame

	clr.w	Bob_Special_3(a4)
	move.w	#6,Bob_Special_4(a4)
	move.w	Bob_Special_2(a4),Bob_Special_5(a4)
	move.b	Bob_Power+1(a4),Bob_Special_6+1(a4)
	sf	Bob_Special_1+1(a4)
	bra	Test_Bob_Out
.lab1:
	subq.w	#1,Bob_Special_4(a4)
.lab0:
	move.w	Bob_Special_2(a4),d0
	add.w	d0,Bob_X_Position(a4)

	movem.w	Bob_X_Position(a4),d0-d1
	add.w	#24,d1
	addq.w	#8,d0
	tst.w	Bob_Special_2(a4)
	bmi.s	.to_left
	add.w	#32,d0
.to_left:
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.change_dir
	addi.w	#24,d1
	bsr	check_obj_kollision
	beq.s	.change_dir

	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	tst.w	Bob_Special_2(a4)
	bpl.s	.to_right
	cmp.w	#-16,d0
	ble.s	.change_dir
	bra.s	.no_change
.to_right:
	cmpi.w	#304-48,d0
	blt.s	.no_change
.change_dir:
	lea	Amarillo_AnimTableL(pc),a0
	neg.w	Bob_Special_2(a4)
	bmi.s	.set_anim
	lea	Amarillo_AnimTableR(pc),a0
.set_anim:
	move.l	a0,Bob_Next_Anim(a4)
	clr.b	Bob_Special_1+1(a4)
.no_change:

	subq.b	#1,Bob_Special_1+1(a4)
	bpl.s	.out
	addq.b	#6,Bob_Special_1+1(a4)
	bsr	Get_Next_Bob_Frame
.out:
	bra	Test_Bob_Out

.destruct:
	move.l	#$160,d0
	addq.w	#8,Bob_X_Position(a4)
	addq.w	#8,Bob_Y_Position(a4)
	bra	Standart_Destruction

Amarillo_Roll:		;Beim Starten ist die Zusammenzieh-Phase gesetzt!
	tst.b	Bob_Special_1+1(a4)
	bne	roll_out

	move.l	Bob_Act_Anim(a4),a0
	cmp.w	#7+8,14(a0)
	beq	do_roll

	subq.w	#1,Bob_Special_4(a4)
	bpl	Test_Bob_Out
	bsr	Get_Next_Bob_Frame
	move.w	#300,Bob_Special_4(a4)

	lea	Amarillo_Info_2(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)

do_roll:
	move.w	Bob_Special_2(a4),d0
	add.w	d0,d0
	add.w	d0,Bob_X_Position(a4)

	movem.w	Bob_X_Position(a4),d0-d1
	addi.w	#24,d1
	add.w	#12,d0
	tst.w	Bob_Special_2(a4)
	bmi.s	.to_left
	add.w	#12,d0
.to_left:
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.change_dir
	addi.w	#24,d1
	bsr	check_obj_kollision
	beq.s	.change_dir
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	tst.w	Bob_Special_2(a4)
	bpl.s	.to_right
	cmp.w	#-16,d0
	ble.s	.change_dir
	bra.s	.no_change
.to_right:
	cmp.w	#304,d0
	blt.s	.no_change
.change_dir:
	neg.w	Bob_Special_2(a4)
	neg.b	Bob_Special_6(a4)
.no_change:
	moveq	#1,d0
	swap	d0
	move.l	d0,d1

	move.w	Bob_Special_3(a4),d2		;Winkel!
	lsr.w	#3,d2
	and.w	#31,d2
	mulu	#640,d2
	add.l	#Rotate_Buffer,d2
	move.l	d2,Bob_Graphics(a4)
	add.l	#512,d2
	move.l	d2,Bob_Mask(a4)

	move.b	Bob_Special_6(a4),d0
	sub.b	d0,Bob_Special_3+1(a4)

	tst.w	Bob_Special_4(a4)
	bmi.s	roll_end
	subq.w	#1,Bob_Special_4(a4)
	bpl	Test_Bob_Out
roll_end:
	move.b	Bob_Special_3+1(a4),d0
	bpl.s	.noneg
	neg.b	d0
.noneg:
	cmpi.b	#4,d0
	bhi	Test_Bob_Out
	st	Bob_Special_1+1(a4)
	move.w	#6,Bob_Special_4(a4)
	bra	Test_Bob_Out

roll_out:
	subq.w	#1,Bob_Special_4(a4)
	bpl	Test_Bob_Out
	move.l	#Amarillo,Bob_Routine(a4)
	lea	Amarillo_AnimTableL(pc),a0
	move.w	Bob_Special_5(a4),Bob_Special_2(a4)
	bmi.s	.set
	lea	Amarillo_AnimTableR(pc),a0
.set:
	move.l	a0,Bob_Next_Anim(a4)
	sf	Bob_Special_1+1(a4)
	move.b	Bob_Special_6+1(a4),Bob_Power+1(a4)
	clr.b	Bob_Power(a4)
	clr.w	Bob_Hit(a4)
	move.w	#180,Bob_Special_4(a4)

	lea	Amarillo_Info_1(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)

	bsr	Get_Next_Bob_Frame
	bra	Test_Bob_Out

Amarillo_AnimTableL:
		dc.l	level_GFX+bob10,level_GFX+msk10
		dc.w	0,0,37,2,2,28,33
		dc.l	level_GFX+bob11,level_GFX+msk11
		dc.w	1,0,37,2,2,28,33
		dc.w	ENTRY_END
		dc.l	Amarillo_AnimTableL

Amarillo_AnimTableR:
		dc.l	level_Buffer+bob0d-bob01,level_Buffer+bob0d-bob01+37*6*4
		dc.w	0,0,37,2,2,28,33
		dc.l	level_Buffer+bob0d-bob01+bob11-bob10,level_Buffer+bob0d-bob01+msk11-msk10+37*6*4
		dc.w	-1,0,37,2,2,28,33
		dc.w	ENTRY_END
		dc.l	Amarillo_AnimTableR

Amarillo_RollTableL:
		dc.l	level_GFX+bob12,level_GFX+msk12
		dc.w	0,4,33,2,2,28,33
		dc.l	Rotate_Buffer,Rotate_Buffer+32*4*4
		dc.w	0,4,32,8+7,6+7+2,20,20

Amarillo_RollTableR:
		dc.l	level_Buffer+bob0d-bob01+bob12-bob10,level_Buffer+bob0d-bob01+msk12-msk10+37*6*4
		dc.w	0,4,33,2,2,28,33
		dc.l	Rotate_Buffer,Rotate_Buffer+32*4*4
		dc.w	0,4,32,8+7,6+7,20,20

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Mllschacht
*---------------------------------------------------------------------------
MllschachtStart:
	move.l	#Mllschacht,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
Mllschacht:
	move.w	Bob_Y_Position(a4),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
	cmp.w	T_posY(pc),d0
	bgt	.out
	tst.b	Bob_Special_2(a4)
	beq.s	.not_active

	subq.b	#1,Bob_Special_2+1(a4)
	bpl.s	.not_active

	addq.b	#4,Bob_Special_2+1(a4)

	bsr	rnd
	moveq	#0,d1
	move.w	d0,d1
	and.w	#63,d1
	sub.w	#32,d1
	add.w	Bob_X_Position(a4),d1		;X-Pos
	move.w	Bob_Y_Position(a4),d2
	sub.w	#48,d2
	moveq	#23,d0				;Mll
	lea	Area_Enter_Vector(pc),a1

	move.w	d1,d3
	sub.w	Scr_X_Level_Pos(a6),d3
	cmp.w	#304,d3
	bgt.s	.not_active
	cmp.w	#-32,d3
	ble.s	.not_active

	move.w	d2,d3
	sub.w	Scr_Y_Level_Pos(a6),d3
	cmp.w	#208,d3
	bgt.s	.not_active

	move.l	a4,-(sp)
	bsr	Search_Bob_Entry
	bsr	rnd
	andi.w	#1,d0
	addq.w	#6,d0
	move.w	d0,Bob_Special_1(a4)
	bsr	rnd
	and.w	#3,d0
	mulu	#22,d0
	add.l	#Mll_AnimTable,d0
	move.l	d0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.l	(sp)+,a4

.not_active:
	subq.w	#1,Bob_Special_1(a4)
	bpl.s	.out
	not.b	Bob_Special_2(a4)
	bne.s	.lab2
	move.w	#300,Bob_Special_1(a4)
	sf	Bob_Special_2+1(a4)
	bra.s	.out
.lab2:
	move.w	#150,Bob_Special_1(a4)
.out:
	bra	Test_Bob_Out2

Mll:
	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_Y_Position(a4)
	tst.w	Bob_Hit(a4)
	beq	Test_Bob_Out
	moveq	#0,d0
	bra	Standart_Destruction

Mll_AnimTable:
		dc.l	level_GFX+bob02+26*4*4,level_GFX+msk02+26*4
		dc.w	0,0,27,2,2,28,23
		dc.l	level_GFX+bob0d+17*4*4,level_GFX+msk0d+17*4
		dc.w	0,0,18,2,2,28,14
		dc.l	level_Buffer+bob02-bob01+26*4*4,level_Buffer+msk02-bob01+26*4
		dc.w	0,1,27,2,2,28,24
		dc.l	level_GFX+bob0d+17*4*4,level_GFX+msk0d+17*4
		dc.w	0,0,18,2,2,28,14

*---------------------------------------------------------------------------
*	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	#16,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(pc),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(pc),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
*---------------------------------------------------------------------------

RSPEED	= 8

start_rocket:
	cmp.b	#2,T_rocket_anz
	beq.s	.out				;Schon genug Raketen!

	moveq	#6,d0
	bsr	.get_origin		;Get start-position

	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	tst.b	T_face			;Which direction ?
	beq.s	.to_left
	moveq	#RSPEED<<1,d0	;Right
	move.b	#128,d1
	bra.s	.set
.to_left:
	moveq	#-RSPEED<<1,d0	;Left
	moveq	#0,d1
.set:
	clr.w	Bob_Anim_Delay(a4)
	move.w	d0,Bob_Special_1(a4)
	clr.w	Bob_Special_2(a4)
	move.b	d1,Bob_Special_3(a4)
	movem.w	Bob_X_Position(a4),d0-d1
	asl.w	#3,d0
	asl.w	#3,d1
	movem.w	d0-d1,Bob_Special_4(a4)	;Store in fix-format
	sf	Bob_Special_3+1(a4)		;Clear counter
	move.b	#BOB_NOCOL,Bob_Used(a4)
	addq.b	#1,T_rocket_anz
.out:
	rts

.get_origin:
	move.w	T_posX,d1
	move.w	T_posY,d2
	add.w	Scr_X_Level_Pos(a6),d1
	add.w	Scr_Y_Level_Pos(a6),d2
	tst.w	T_face
	beq.s	.ok
	add.w	#16,d1
.ok:
	cmp.w	#22,T_anim
	bne.s	.no_knee
	add.w	#16,d2
.no_knee:
	rts

Rocket:
	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	#16,d3
	bsr	check_rec
	beq.s	.no_hit
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.powerok
	move.w	SW_power,d0
	sub.w	d0,Bob_Power(a0)
	bpl.s	.powerok
	clr.w	Bob_Power(a0)
.powerok:
	move.w	#4,Bob_Hit(a0)

.end_rocket:					;make explosion (free rocket)
	subq.b	#1,T_rocket_anz
	sub.w	#16,Bob_X_Position(a4)
	sub.w	#16,Bob_Y_Position(a4)
	bsr	Out_Bob_Damage
	bsr	Start_Explo
	move.w	#0,Bob_Anim_Delay_Init(a4)
	rts
.no_hit:

	movem.w	Bob_Special_1(a4),d0-d1		;Get direction
	add.w	d0,Bob_Special_4(a4)		;Add to position
	add.w	d1,Bob_Special_5(a4)

	movem.w	Bob_Special_4(a4),d0-d1		;Convert position to normal format
	asr.w	#3,d0
	asr.w	#3,d1
	movem.w	d0-d1,Bob_X_Position(a4)	;Store into object's position

	moveq	#0,d0
	move.b	Bob_Special_3(a4),d0			;Get angle
	addq.w	#8,d0				;Round result to 16-border
	lsr.w	#4,d0
	subq.w	#8,d0
	andi.w	#15,d0				;Mask lower 4 bits
	move.w	d0,Bob_Anim_Delay(a4)		;Take as phase
	add.w	d0,d0
	move.w	d0,d6
	add.w	d0,d0
	add.w	d0,d6
	asl.w	#2,d0
	add.w	d0,d6
	lea	Rocket_AnimTable(pc),a0
	lea	(a0,d6.w),a0
	move.l	a0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame

	cmp.w	#8,Bob_Anim_Delay(a4)
	ble.s	.set_noflip
	lea	Rocket_Info_2(pc),a0
	sub.l	a4,a0
	bra.s	.setit
.set_noflip:
	lea	Rocket_Info_1(pc),a0
	sub.l	a4,a0
.setit:
	move.w	a0,Bob_to_Info_Offs(a4)

	subq.b	#1,Bob_Special_3+1(a4)		;Time out ?
	bpl.s	.no_timeout
	move.b	#55,Bob_Special_3+1(a4)
	bsr	rnd
	move.w	d0,d6
	bsr	rnd
	andi.w	#$03ff,d0
	andi.w	#$00ff,d6
	subi.w	#96,d0
	subi.w	#16,d6
	movem.w	d0/d6,Bob_Special_6(a4)		;Set next random-position
.no_timeout:
	movem.w	Bob_Special_6(a4),d6-d7

	moveq	#-1,d4				;Set first dummy delta...
	move.l	Act_Bob_Structure,a0
.loop:
	tst.b	Bob_Used(a0)
	bmi.s	.next
;		move.b	O_COLEN(a0),d0		;Collision on player ?
;		and.b	O_PHITEN(a0),d0
	cmp.w	#-1,Bob_Power(a0)
	beq.s	.next
	move.w	Bob_X_Position(a0),d0		;Calc |DX|+|DY| as target 'distance'
	sub.w	d2,d0
	bpl.s	.noneg
	neg.w	d0
.noneg:
	move.w	Bob_Y_Position(a0),d1
	sub.w	d3,d1
	bpl.s	.noneg2
	neg.w	d1
.noneg2:
	add.w	d1,d0
	cmp.w	d4,d0				;Lower than last choice ?
	bhs.s	.next
	move.w	Bob_X_Position(a0),d6		;Yes, remember position
	move.w	Bob_Y_Position(a0),d7
	move.w	d0,d4				;Remember 'distance'
.next:
	lea	BOB_ENTRY_LENGTH(a0),a0
	cmp.l	#Bob_Structure_End,a0
	bne	.loop

.no_object:
	bsr	.calc_angle			;Calc new angle

	moveq	#0,d0				;Get angle
	move.b	Bob_Special_3(a4),d0
	cmp.b	d0,d1				;Turning neccessary ?
	beq	.no_change

	move.b	d0,d2				;Which side is the shorter
	sub.b	d1,d2				;way ?
	sub.b	d0,d1
	cmp.b	d1,d2
	bls.s	.lower
	cmpi.b	#RSPEED,d1			;Difference big enough ?
	bls.s	.lab1
	addi.b	#RSPEED,Bob_Special_3(a4)	;Yes...
	bra.s	.ok
.lab1:
	add.b	d1,Bob_Special_3(a4)		;No, only add right diff.
	bra.s	.ok
.lower:
	cmpi.b	#RSPEED,d2			;Difference big enough ?
	bls.s	.lab2
	subi.b	#RSPEED,Bob_Special_3(a4)	;Yes...
	bra.s	.ok
.lab2:
	sub.b	d2,Bob_Special_3(a4)		;No...
.ok:

	move.b	Bob_Special_3(a4),d0		;Calc x,y - deltas
	bsr	sin
	move.w	d0,d2
	move.b	Bob_Special_3(a4),d0
	bsr	cos
	neg.w	d0
	asr.w	#4,d0
	asr.w	#4,d2
	movem.w	d0/d2,Bob_Special_1(a4)		;Store deltas

.no_change:
	movem.w	Bob_Special_1(a4),d0-d1		;Get deltas
	add.w	d0,Bob_Special_4(a4)		;Add to position
	add.w	d1,Bob_Special_5(a4)

	movem.w	Bob_X_Position(a4),d0-d1	;Check wall-collision
	bsr	check_obj_kollision
	bne	.end_rocket			;Rocket hit ground
	bsr	Test_Bob_Out
	tst.b	Bob_Used(a4)
	bpl.s	.out
	subq.b	#1,T_rocket_anz
.out:
	rts

.calc_angle:
	move.l	a6,-(sp)
	movem.w	Bob_X_Position(a4),d4-d5	;Rocket coordinates
	moveq	#0,d1				;Calc |DY|
	move.w	d7,d1
	sub.w	d5,d1
	bpl.s	.cok
	neg.w	d1
.cok:
	move.w	d1,a6				;Remember |DY| in a6
	move.w	d6,d0				;Calc DX
	sub.w	d4,d0
	muls	d0,d0				;DX*DX
	mulu	d1,d1				;|DY|*|DY|
	add.w	d1,d0				;DX^2+DY^2
	bsr	sqrt				;Pythagoras...
	move.l	a6,d1				;Get and adjust |DY|
	asl.w	#7,d1
	tst.w	d0
	beq.s	.nodiv
	divu	d0,d1				;SIN(X)   (|DY|/R)
.nodiv:
	moveq	#0,d0				;Calculate ASIN
	lea	asin_tab(pc),a0
	move.b	0(a0,d1.w),d0			;Angle	(ASIN(SIN(X)))
	cmp.w	d6,d4				;Adjust angle to full 256 "degrees"
	ble.s	.not_bigger
	cmp.w	d7,d5
	ble.s	.no1
	move.w	#256,d1
	sub.w	d0,d1
	bra.s	.set_angle
.no1:
	move.w	d0,d1
	bra	.set_angle
.not_bigger:
	cmp.w	d7,d5
	ble.s	.no2
	move.w	d0,d1
	addi.w	#128,d1
	bra.s	.set_angle
.no2:
	move.w	#128,d1
	sub.w	d0,d1
.set_angle:					;Save angle with float-part
	move.l	(sp)+,a6
	andi.w	#255,d1				;Mask only lower 8 bits
	rts

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      Stamper
*---------------------------------------------------------------------------
Stamper:
	bsr	Set_Refresh
	move.w	Bob_Y_Position(a4),d0
	sub.w	Scr_Y_Level_Pos(a6),d0
	bmi.s	.no_set
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	cmp.w	#50,d0
	blt.s	.no_set
	cmp.w	#280,d0
	bgt.s	.no_set
	move.w	Bob_Special_4(a4),Scr_Down_Fix(a6)
.no_set:
	subq.b	#1,Bob_Special_2(a4)
	bpl.s	.no_ymove
	move.w	Bob_Special_1(a4),d0
	add.w	d0,d0
	lea	.swing_tab(pc),a0
	move.w	(a0,d0.w),Bob_Special_2(a4)
	addq.w	#1,Bob_Special_1(a4)
	cmpi.w	#32,Bob_Special_1(a4)
	bne.s	.no_ymove
	clr.w	Bob_Special_1(a4)
.no_ymove:
	move.b	Bob_Special_2+1(a4),d6
	ext.w	d6
	movem.w	Bob_X_Position(a4),d0-d1
	add.w	d6,Bob_Y_Position(a4)

	move.w	d0,d2
	add.w	#64,d2
	bsr	check_foot_frame
	beq.s	.no_feet
	st	T_stand
;	tst.b	Bob_Special_7(a4)
;	bne.s	.force
	move.w	Bob_Y_Position(a4),d1
	bsr	alias_feet
	st	Bob_Special_7(a4)
.force:
;	move.w	d6,T_forceY
	bra	.restore
.no_feet:
	sf	Bob_Special_7(a4)
.restore:
	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0

	move.w	Scr_X_Level_Pos(a6),d2
	and.w	#15,d2
	add.w	d2,d0

	move.w	d0,d4
	ext.l	d0
	asr.w	#3,d0
	bclr	#0,d0

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

	tst.w	d6
	bgt.s	.down
	add.w	#31,d1
	bra.s	.up
.down:
	subq.w	#1,d1
.up:
	bmi	Test_Bob_Out
	cmp.w	#208,d1
	bgt	Test_Bob_Out

	move.w	Scr_Plane_Height(a6),d3
	sub.w	Scr_Y_Play_Anf(a6),d3
	cmp.w	d3,d1
	bge.s	.under_wrap

	;Komplett drber.

	add.l	Scr_Blt_Adr1(a6),d0
	bra.s	.goon
.under_wrap:

	;Komplett drunter.

	add.l	Scr_Blt_Adr2(a6),d0
	sub.w	d3,d1
.goon:
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d0

	move.l	d0,a0
	move.l	a0,-(sp)
	add.l	Scr_Refresh_Field(a6),a0
	bsr	.one_screen
	move.l	(sp),a0
	add.l	Scr_Supply_Field(a6),a0
	bsr	.one_screen
	move.l	(sp)+,a0

	add.l	Scr_Supply_Field(a6),a0

	moveq	#3,d5
.add:
	tst.w	d4
	bpl.s	.ok
	add.w	#16,d4
	addq.l	#2,a0
	dbf	d5,.add
	bra	Test_Bob_Out
.ok:
	tst.w	Scr_Screen_num(a6)
	bne	.use_list1
	lea	Rest_List2,a1
	bra.s	.use_list2
.use_list1:
	lea	Rest_List1,a1
.use_list2:
	tst.w	(a1)
	beq.s	.insert
	lea	8(a1),a1
	bra.s	.use_list2
.insert:
	addq.w	#1,d5
	move.w	d5,d0
	or.w	#64*4*2,d0
	move.w	d0,(a1)+

	move.w	Scr_Single_Plane(a6),d0
	sub.w	d5,d0
	sub.w	d5,d0
	move.w	d0,(a1)+
	move.l	a0,(a1)+

	clr.l	(a1)

	bra	Test_Bob_Out

.one_screen:
	move.w	Scr_Single_Plane(a6),d0

	lea	(a0,d0.w),a1
	lea	(a1,d0.w),a2
	lea	(a2,d0.w),a3

	move.w	d4,d7

	tst.w	d6
	bra.s	.down2
	moveq	#3,d5
.loop2:
	tst.w	d7
	bmi.s	.not2
	cmp.w	#304,d7
	bgt.s	.not2
	clr.w	(a0)
	clr.w	(a1)
	clr.w	(a2)
	clr.w	(a3)
.not2:
	addq.l	#2,a0
	addq.l	#2,a1
	addq.l	#2,a2
	addq.l	#2,a3
	add.w	#16,d7
	dbf	d5,.loop2
	rts

.down2:
	moveq	#3,d5
.loop:
	tst.w	d7
	bmi.s	.not1
	cmp.w	#304,d7
	bgt.s	.not1
	clr.w	(a0)
	clr.w	(a1)
	move.w	#-1,(a2)
	clr.w	(a3)
.not1:
	addq.l	#2,a0
	addq.l	#2,a1
	addq.l	#2,a2
	addq.l	#2,a3
	add.w	#16,d7
	dbf	d5,.loop
	rts

.swing_tab:
	dc.b	24,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0
	dc.b	0,0,0,-1,0,0,0,-1,0,0,0,-1,24,-1,35,-1
	dc.b	0,0,0,-1,0,0,0,-1,0,0,0,-1,0,0,0,0
	dc.b	0,0,0,1,0,0,0,1,0,0,0,1,35,1

Stamper_AnimTable:
		dc.l	AD_Bob,0
		dc.w	0,0,32,0,0,64,24

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Shoot
*---------------------------------------------------------------------------
Start_Shoot:
	move.l	a4,-(sp)
	movem.l	d2-d3,-(sp)
	move.w	d1,d2
	move.w	d0,d1
	lea	Area_Enter_Vector(pc),a1
	moveq	#7,d0
	bsr	Search_Bob_Entry
	movem.l	(sp)+,d2-d3
	tst.w	d7
	bmi.s	.no
	move.w	d2,Bob_Special_1(a4)
	move.w	d3,Bob_Special_2(a4)
.no:
	move.l	(sp)+,a4
	rts

Shoot_Start:
	move.l	#Shoot,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)
Shoot:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1
	addq.w	#3,d0
	addq.w	#3,d1

	move.w	T_posX,d2
	add.w	Scr_X_Level_Pos(a6),d2
	add.w	#10,d2
	cmp.w	d0,d2
	bgt.s	.no_hit
	add.w	#18,d2
	cmp.w	d0,d2
	blt.s	.no_hit

	move.w	T_posY,d3
	add.w	Scr_Y_Level_Pos(a6),d3
	addq.w	#4,d3
	cmp.w	d1,d3
	bgt.s	.no_hit
	add.w	#24,d3
	cmp.w	d1,d3
	blt.s	.no_hit

	sub.w	#9,d2
	sub.w	d0,d2
	bmi.s	.ok
	moveq	#0,d2
.ok:
	move.b	d2,T_hitdir

	bsr	make_plhit
	bra	Out_Bob_Damage

.no_hit:
	movem.w	d0-d1,-(sp)
	bsr	check_obj_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.destruct	

	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_Special_3(a4)
	move.w	Bob_Special_3(a4),d0
	asr.w	#6,d0
	add.w	d0,Bob_X_Position(a4)
	move.w	Bob_Special_3(a4),d0
	and.w	#$ffc0,d0
	sub.w	d0,Bob_Special_3(a4)

	move.w	Bob_Special_2(a4),d0
	add.w	d0,Bob_Special_4(a4)
	move.w	Bob_Special_4(a4),d0
	asr.w	#6,d0
	add.w	d0,Bob_Y_Position(a4)

	move.w	Bob_Special_4(a4),d0
	and.w	#$ffc0,d0
	sub.w	d0,Bob_Special_4(a4)

	bra	Standart_BobAnim

.destruct:
	move.l	a4,-(sp)

	move.w	d1,d2
	move.w	d0,d1
	subq.w	#8,d1
	subq.w	#8,d2
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)

	move.l	(sp)+,a4
	bra	Out_Bob_Damage	

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
*---------------------------------------------------------------------------
Move_Bonus_Jump:
	movem.w	Bob_X_Position(a4),d6-d7
	move.w	d6,d0
	move.w	d7,d1

	tst.w	Bob_Special_1(a4)
	bpl.s	.add
	subq.w	#8,d0
	bra.s	.sub
.add:
	addq.w	#8,d0
.sub:
	bsr	check_obj_kollision		;Way blocked ?
	bne.s	.no_xmove
	add.w	Bob_Special_1(a4),d6		;X - Movement
	cmpi.w	#304,d6
	bhi.s	.no_xmove
	sub.w	Bob_Special_1(a4),d6
.no_xmove:
	move.w	Bob_Special_2(a4),d2		;Get jump-index
	cmpi.w	#24*2,d2			;Maximum reached ?
	blt.s	.not_ready
.ready:
	move.l	#Move_Bonus,Bob_Routine(a4)	;Just let extra flow up
	bra.s	.exit_jmp
.not_ready:

	lea	.ExtBounce(pc),a0		;Jump-table
	move.w	d6,d0
	move.w	d7,d1
	move.w	0(a0,d2.w),d5
	bpl.s	.add2
	sub.w	#8,d1
	bra.s	.sub2
.add2:
	addq.w	#8,d1
.sub2:
	bsr	check_obj_kollision		;Way blocked ?
	bne.s	.ready
	add.w	d5,d7				;Y - Movement
.no_ymove:
	addq.w	#2,Bob_Special_2(a4)		;Increase index
.exit_jmp:
	movem.w	d6-d7,Bob_X_Position(a4)
	bra	Bonus_Check_Collect

.ExtBounce:
	dc.w	-6,-6,-5,-5,-4,-4,-3,-3,-2,-2,-1,-1,0,0
	dc.w	1,1,1,1,2,2,3,3,4,4,5


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

	addq.w	#8,d0

	bsr	check_obj_kollision
	bne.s	.no_move

	move.w	eights_pixel(pc),d0
	sub.w	d0,Bob_Y_Position(a4)
.no_move:

	subq.w	#1,Bob_Special_4(a4)
	bpl	.wait

	btst	#1,Bob_Special_4+1(a4)
	beq.s	.clear
	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
	bra.s	.set
.clear:
	bclr	#NO_BOBBLIT,Bob_BlitStatus(a4)
.set:
	cmp.w	#-50,Bob_Special_4(a4)
	bgt.s	.wait

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

	move.w	Bob_to_Info_Offs(a4),d3
	cmp.w	#2,Bob_I_Mask_Width(a4,d3.w)
	beq.s	.start
	addq.w	#4,d1
	addq.w	#2,d2

.start:
	move.l	a4,-(sp)
	moveq	#2,d0
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.l	(sp)+,a4
	bra	Out_Bob_Damage
.wait:
Bonus_Check_Collect:
	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

	move.w	14(a0),d0
	cmp.w	#BONUS_POWER,d0
	beq.s	.power
	cmp.w	#BONUS_WEAPON1,d0
	beq.s	.weapon1
	cmp.w	#BONUS_WEAPON2,d0
	beq.s	.weapon2
	cmp.w	#BONUS_WEAPON3,d0
	beq.s	.weapon3
	cmp.w	#BONUS_SHIELD,d0
	beq.s	.shield
	cmp.w	#BONUS_ROCKET,d0
	beq.s	.rocket
	bra	Out_Bob_Damage
.rocket:
	st	T_rocket
	bra	Out_Bob_Damage
.shield:
	st	T_shield
	bra	Out_Bob_Damage
.weapon1:
	moveq	#0,d0
.do_weapon:
	cmp.b	T_weapon_new,d0
	beq.s	.powup
	move.b	d0,T_weapon_new
	bra	Out_Bob_Damage
.powup:
	cmp.b	#2,T_power_new
	beq	Out_Bob_Damage
	addq.b	#1,T_power_new
	bra	Out_Bob_Damage
.weapon2:
	moveq	#1,d0
	bra.s	.do_weapon
.weapon3:
	moveq	#2,d0
	bra.s	.do_weapon

.power:
	move.b	#64,T_energy
	bra	Out_Bob_Damage

.no_collect:
	bra	Test_Bob_Out

BONUS_POWER	= 1
BONUS_WEAPON1	= 2
BONUS_WEAPON2	= 3
BONUS_WEAPON3	= 4
BONUS_SHIELD	= 5
BONUS_ROCKET	= 6
BONUS_ONEUP	= 7

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
*---------------------------------------------------------------------------
Extrabox:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1

	move.w	d0,d2
	add.w	#32,d2
	bsr	check_foot_frame
	beq.s	.no_feet
	st	T_stand
	move.w	Bob_Y_Position(a4),d1
	bsr	alias_feet
.no_feet:
	tst.w	Bob_Hit(a4)
	beq	Test_Bob_Out
	bsr	Get_Next_Bob_Frame
	move.l	#Area_Enter_Vector,Bob_Entry_Adress(a4)
	move.l	#Test_Bob_Out,Bob_Routine(a4)
	move.b	#BOB_NOCOL,Bob_Used(a4)

	move.l	a4,-(sp)
	moveq	#4,d0
	move.w	Bob_X_Position(a4),d1
	move.w	Bob_Y_Position(a4),d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	#-$00060000,Bob_Special_1(a4)
	move.l	a4,a0
	move.l	(sp)+,a4

	move.w	#2,Bob_Special_3(a0)

	move.w	Bob_X_Position(a4),d0
	sub.w	Scr_X_Level_Pos(a6),d0
	sub.w	T_posX,d0
	bpl.s	.ok
	move.w	#-2,Bob_Special_3(a0)
.ok:

	;Inhalt der Box starten.

	move.w	Bob_X_Position(a4),d5
	move.w	Bob_Y_Position(a4),d6
	addi.w	#12,d5
	subi.w	#24,d6
	lea	extra_xtab(pc),a2
	jsr	rnd
	and.w	#$0060,d0
	lea	(a2,d0.w),a2
	moveq	#6,d4
.loop:
	btst	d4,Bob_Special_4+1(a4)
	beq.s	.no_start
	move.w	d4,d0
	move.w	d5,d1
	move.w	d6,d2
	bsr	.init_extra
.no_start:
	dbf	d4,.loop

	bra	Test_Bob_Out

.init_extra:
	move.l	a4,-(sp)

	lea	Area_Enter_Vector(pc),a1
	movem.l	a2/d0,-(sp)
	moveq	#5,d0
	bsr	Search_Bob_Entry
	movem.l	(sp)+,a2/d0
	mulu	#22,d0
	add.l	#Bonus1_AnimTable,d0
	move.l	d0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.w	#450,Bob_Special_4(a4)

	move.w	(a2)+,Bob_Special_1(a4)		;X - Dir

	move.w	(a2)+,Bob_Special_2(a4)

	move.l	(sp)+,a4
	rts

extra_xtab:	dc.w	0,0,2,8,-1,2,1,10,-2,0,0,8,2,2
		dc.l	0

		dc.w	-1,2,-2,0,0,8,2,8,0,0,2,2,1,10
		dc.l	0

		dc.w	2,8,1,10,2,2,0,8,-1,2,0,0,-2,0
		dc.l	0

		dc.w	0,8,-1,2,2,2,1,10,2,8,-2,0,0,0
		dc.l	0

Box_Deckel:
	move.w	Bob_Special_3(a4),d0
	add.w	d0,Bob_X_Position(a4)
	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_Y_Position(a4)
	add.l	#$00008000,Bob_Special_1(a4)

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

	bsr	check_obj_kollision
	beq	Test_Bob_Out
	moveq	#0,d0
	bra	Standart_Destruction

Box_AnimTable:
		dc.l	main_GFX+Mbob20,main_GFX+Mmsk20
		dc.w	0,0,24,2,2,28,20
;		dc.l	$78000,$79000
;		dc.w	0,0,32,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      Flame
*---------------------------------------------------------------------------
Flame_Start:
	move.b	#BOB_NOCOL,Bob_Used(a4)
	move.b	#1<<NO_BOBBLIT,Bob_BlitStatus(a4)
	move.b	#50,Bob_Special_2(a4)
	move.w	#15*4,Bob_Special_3(a4)
	move.l	#Flame_Starter,Bob_Routine(a4)

Flame_Starter:
	subq.w	#1,Bob_Special_1(a4)
	bpl.s	.no_start
	move.l	a4,-(sp)
	moveq	#19,d0
	move.w	Bob_X_Position(a4),d1
	move.w	Bob_Y_Position(a4),d2
	tst.b	Bob_Special_2+1(a4)
	ble.s	.ok
	moveq	#20,d0
	addq.w	#8,d1
	add.w	#10,d2
.ok:
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	(sp)+,a0

	move.w	Bob_Special_3(a0),d0
	lsr.w	#2,d0
	move.w	d0,Bob_Special_1(a4)

	tst.b	Bob_Special_4+1(a0)
	beq.s	.no_flicker
	eor.b	#1,Bob_Special_4(a0)
	move.b	Bob_Special_4(a0),Bob_Special_4(a4)
	st	Bob_Special_4+1(a4)

.no_flicker:
	move.l	a0,a4

	moveq	#4,d0
	tst.b	Bob_Special_2+1(a4)
	ble.s	.ok2
	moveq	#6,d0
.ok2:
	move.w	d0,Bob_Special_1(a4)
.no_start:
	tst.b	Bob_Special_2+1(a4)
	bpl.s	.no_shrink
	subq.w	#1,Bob_Special_3(a4)
	bne	.no_shrink
	move.w	#15*4,Bob_Special_3(a4)
	move.b	#1,Bob_Special_2+1(a4)
.no_shrink:
	subq.b	#1,Bob_Special_2(a4)
	bne.s	.out
	move.b	#200,Bob_Special_2(a4)
	subq.b	#1,Bob_Special_2+1(a4)
.out:
	bra	Test_Bob_Out2

Flame:
	tst.b	Bob_Special_4+1(a4)
	beq.s	.no_flicker
	eor.b	#1,Bob_Special_4(a4)
	beq.s	.noset
	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
	bra.s	.no_flicker
.noset:
	bclr	#NO_BOBBLIT,Bob_BlitStatus(a4)
.no_flicker:
	subq.w	#7,Bob_Y_Position(a4)
	subq.w	#1,Bob_Special_1(a4)
	bpl	Standart_BobAnim
	bra	Out_Bob_Damage

Smoke:
	move.b	#BOB_NOCOL,Bob_Used(a4)
	subq.w	#2,Bob_Y_Position(a4)
	subq.w	#1,Bob_Special_1(a4)
	bpl	Standart_BobAnim
	bra	Out_Bob_Damage

Flame_AnimTable:
		dc.l	main_GFX+Mbob04,main_GFX+Mmsk04
		dc.w	0,0,32,2,2,28,28
		dc.l	main_GFX+Mbob05,main_GFX+Mmsk05
		dc.w	0,0,32,2,2,28,28
		dc.l	main_GFX+Mbob06,main_GFX+Mmsk06
		dc.w	0,0,31,2,2,28,29
		dc.l	main_GFX+Mbob07,main_GFX+Mmsk07
		dc.w	0,0,27,2,2,28,25
		dc.w	ENTRY_END
		dc.l	Flame_AnimTable

Smoke_AnimTable:
		dc.l	main_GFX+Mbob12,main_GFX+Mmsk12
		dc.w	0,1,13,0,0,0,0
		dc.l	main_GFX+Mbob13,main_GFX+Mmsk13
		dc.w	0,1,13,0,0,0,0
		dc.l	main_GFX+Mbob14,main_GFX+Mmsk14
		dc.w	0,1,12,0,0,0,0
		dc.l	main_GFX+Mbob15,main_GFX+Mmsk15
		dc.w	0,0,13,0,0,0,0
		dc.w	ENTRY_END
		dc.l	Smoke_AnimTable

*---------------------------------------------------------------------------
*	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      Pacman
*---------------------------------------------------------------------------

Pacman_Start:
	move.l	#Pacman_Prg,Bob_Routine(a4)
	move.w	#0,Bob_Special_1(a4)
	tst.w	Bob_Special_4(a4)
	bpl.s	.left
	move.l	#Pacman_AnimTableR,Bob_Next_Anim(a4)
	bra.s	Pacman_Prg
.left:
	move.l	#Pacman_AnimTableL,Bob_Next_Anim(a4)

Pacman_Prg:
	moveq	#$60,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction
	subq.w	#1,Bob_Anim_Delay(a4)
	bpl	Test_Bob_Out

	tst.w	Bob_Special_1(a4)
	beq.s	.open
	bpl.s	.start_bullet

	jsr	rnd
	and.w	#255,d0
	add.w	#100,d0
	move.w	d0,Bob_Anim_Delay(a4)
	bsr	Get_Next_Bob_Frame
	clr.w	Bob_Special_1(a4)
	bra	Test_Bob_Out
.open:
	addq.w	#1,Bob_Special_1(a4)
	move.w	#25,Bob_Anim_Delay(a4)
	bsr	Get_Next_Bob_Frame
	bra	Test_Bob_Out


;Pacman_Prg:
;	moveq	#$60,d0
;	bsr	Standart_Hit_Handler
;	beq	.destruct
;
;	tst.w	Bob_Special_2(a4)
;	beq.s	.no_change
;
;	subq.w	#1,Bob_Special_2(a4)
;	beq.s	.no_blit
;	cmp.w	#1,Bob_Special_2(a4)
;	bne.s	.no_change
;
;	;Adresse berechnen
;
;	movem.w	Bob_X_Position(a4),d0-d1
;	bsr	Calc_Adress
;
;	move.l	d4,d0
;	add.l	Scr_Show_Field(a6),d0
;	add.l	Scr_Refresh_Field(a6),d4
;
;	waitblt
;
;	move.w	#$09f0,bltcon0(a5)
;
;	move.l	d0,bltapth(a5)
;	move.l	d4,bltdpth(a5)
;	move.l	#-1,bltafwm(a5)
;	move.w	#planeb-4,bltamod(a5)
;	move.w	#planeb-4,bltdmod(a5)
;
;	move.w	#64*4*32+2,bltsize(a5)
;
;	bra.s	.no_change
;
;.no_blit:
;	bset	#NO_BOBBLIT,Bob_BlitStatus(a4)
;.no_change:
;	subq.w	#1,Bob_Anim_Delay(a4)
;	bpl	Test_Bob_Out2
;
;	tst.w	Bob_Special_1(a4)
;	beq.s	.open
;	bpl	.start_bullet
;
;	bsr	.restore_Background
;
;	bsr	rnd
;	and.w	#255,d0
;	add.w	#100,d0
;	move.w	d0,Bob_Anim_Delay(a4)
;	bsr	Get_Next_Bob_Frame
;	clr.w	Bob_Special_1(a4)
;	bra	Test_Bob_Out2
;.open:
;	bsr	.restore_Background
;	addq.w	#1,Bob_Special_1(a4)
;	move.w	#25,Bob_Anim_Delay(a4)
;	bsr	Get_Next_Bob_Frame
;	bra	Test_Bob_Out2
;
;.destruct:
;	bsr	.restore_Background
;	bra	Standart_Destruction
;
;.restore_Background:
;	movem.w	Bob_X_Position(a4),d0-d1
;
;	lsr.w	#3,d0
;	and.w	#$fffe,d0
;	lea	Level-4*levelb-2,a0
;
;	adda.w	d0,a0
;	lsr.w	#4,d1
;
;	mulu	Scr_Level_Width(a6),d1
;	add.l	d1,a0
;
;	movem.w	Bob_X_Position(a4),d0-d1
;	moveq	#0,d2
;	move.w	(a0),d2
;
;	movem.l	a0/d0-d1,-(sp)
;	bsr	Set_Char
;	movem.l	(sp)+,a0/d0-d1
;	add.l	#16,d0
;
;	moveq	#0,d2
;	move.w	2(a0),d2
;
;	movem.l	a0/d0-d1,-(sp)
;	bsr	Set_Char
;	movem.l	(sp)+,a0/d0-d1
;	sub.l	#16,d0
;
;	add.l	#16,d1
;
;	lea	levelb*2(a0),a0
;
;	moveq	#0,d2
;	move.w	(a0),d2
;
;	movem.l	a0/d0-d1,-(sp)
;	bsr	Set_Char
;	movem.l	(sp)+,a0/d0-d1
;	add.l	#16,d0
;
;	moveq	#0,d2
;	move.w	2(a0),d2
;
;	movem.l	a0/d0-d1,-(sp)
;	bsr	Set_Char
;	movem.l	(sp)+,a0/d0-d1
;
;	bclr	#NO_BOBBLIT,Bob_BlitStatus(a4)
;	move.w	#4,Bob_Special_2(a4)		;2 Frames lang hinblitten
;	rts

.start_bullet:
	movem.w	Bob_X_Position(a4),d0-d1	;Calc bullet-origin
	addi.w	#20,d1
	addq.w	#8,d0
	tst.w	Bob_Special_4(a4)
	bmi.s	.left
	add.w	#16,d0
.left:
	move.w	T_posX,d2
	add.w	Scr_X_Level_Pos(a6),d2
	add.w	#16,d2
	sub.w	d0,d2
	bmi.s	.check_left
	tst.w	Bob_Special_4(a4)
	bmi.s	.no_shot
	bra.s	.ok
.check_left:
	tst.w	Bob_Special_4(a4)
	bpl.s	.no_shot
.ok:
	move.w	T_posX(pc),d4
	move.w	T_posY(pc),d5
	add.w	Scr_X_Level_Pos(a6),d4
	add.w	Scr_Y_Level_Pos(a6),d5

	cmp.w	d4,d0
	ble.s	.ncheck1
	moveq	#2,d2
	bra.s	.check2
.ncheck1:
	moveq	#0,d2
.check2:
	cmp.w	d1,d5
	blt.s	.ncheck2
	addq.w	#4,d2
.ncheck2:
	sub.w	d0,d4
	bpl.s	.ncheck3
	neg.w	d4
.ncheck3:
	sub.w	d1,d5
	bpl.s	.ncheck4
	neg.w	d5
.ncheck4:
	cmp.w	d4,d5
	ble.s	.ncheck5
	addq.w	#1,d2
.ncheck5:
	add.w	d2,d2
	add.w	d2,d2
	movem.w	.dir_tab(pc,d2.w),d2-d3
	asl.w	#5,d2
	asl.w	#5,d3
	bsr	Start_Shoot
.no_shot:
	move.w	#-1,Bob_Special_1(a4)
	move.w	#25,Bob_Anim_Delay(a4)
	bra	Test_Bob_Out

.dir_tab:	dc.w	2,-1,1,-2
		dc.w	-2,-1,-1,-2
		dc.w	2,1,1,2
		dc.w	-2,1,-1,2

Calc_Adress:
	move.w	Scr_X_Level_Pos(a6),d3
	sub.w	d3,d0
	sub.w	Scr_Y_Level_Pos(a6),d1

	and.w	#15,d3
	add.w	d3,d0

	move.w	Scr_Plane_Height(a6),d3
	sub.w	Scr_Y_Play_Anf(a6),d3
	cmp.w	d3,d1
	bge.s	.under_wrap

	;ber der Wrap-Zeile.

	move.l	Scr_Blt_Adr1(a6),d4
	bra.s	.goon
.under_wrap:
	move.l	Scr_Blt_Adr2(a6),d4
	sub.w	d3,d1
.goon:
	mulu	Scr_Plane_Width(a6),d1
	add.l	d1,d4

	lsr.w	#3,d0
	and.w	#$fffe,d0
	add.w	d0,d4
	rts

Pacman_AnimTableL:
		dc.l	level_Buffer+bob0c-bob01,level_Buffer+msk0c-bob01
		dc.w	0,0,31,2,2,28,27
		dc.l	level_Buffer+bob0b-bob01,level_Buffer+msk0b-bob01
		dc.w	0,0,30,2,2,28,26
		dc.w	ENTRY_END
		dc.l	Pacman_AnimTableL

Pacman_AnimTableR:
		dc.l	level_GFX+bob0c,level_GFX+msk0c
 		dc.w	0,0,31,2,2,28,27
		dc.l	level_GFX+bob0b,level_GFX+msk0b
		dc.w	0,0,30,2,2,28,26
		dc.w	ENTRY_END
		dc.l	Pacman_AnimTableR

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Platform
*---------------------------------------------------------------------------
Platform_Start1:
	moveq	#2,d1
	move.w	Bob_Special_4(a4),d0
	bpl.s	.ok
	moveq	#-2,d1
	neg.w	d0
.ok:
	move.w	d1,Bob_Special_1(a4)		;Start nach rechts
	move.w	d0,Bob_Special_4(a4)		;x Pixel weit bewegen.
	move.l	#Platform_PrgX,Bob_Routine(a4)
	move.b	#1,Bob_RopeEnable(a4)
	bra.s	Platform_PrgX

Platform_Start2:
	moveq	#2,d1
	move.w	Bob_Special_4(a4),d0
	bpl.s	.ok
	moveq	#-2,d1
	neg.w	d0
.ok:
	move.w	d1,Bob_Special_1(a4)		;Start nach rechts
	move.w	d0,Bob_Special_4(a4)		;y Pixel weit bewegen.
	move.l	#Platform_PrgY,Bob_Routine(a4)
	move.b	#1,Bob_RopeEnable(a4)
	move.w	Bob_X_Position(a4),d0
	and.w	#15,d0
	cmp.w	#9,d0
	bge	Platform_PrgY
	lea	Platform_Info_3(pc),a0
	sub.l	a4,a0
	move.w	a0,Bob_to_Info_Offs(a4)
	bra	Platform_PrgY

Platform_PrgX:
	tst.b	T_rope
	bne.s	.dont_clear
	sf	Bob_Rope(a4)
.dont_clear:
	moveq	#1,d6


	tst.b	Bob_Special_3+1(a4)
	beq.s	.no_move
	tst.w	Bob_Special_2(a4)
	beq.s	.no_move
	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_X_Position(a4)
	subq.w	#1,Bob_Special_2(a4)
	bne	.no_move
	neg.w	Bob_Special_1(a4)			;Bewegungsrichtung umkehren.
	clr.b	Bob_Special_3+1(a4)
.no_move:
	tst.b	Bob_Rope(a4)
	beq.s	.no_rope
	tst.b	T_startswing
	beq.s	.no_rope_start
	clr.b	T_startswing
	tst.b	Bob_Special_3+1(a4)
	bne.s	.no_rope_start
	move.w	Bob_Special_4(a4),Bob_Special_2(a4)	;Lnge des Movements.
	st	Bob_Special_3+1(a4)
	bra.s	.no_rope
.no_rope_start:
	tst.b	Bob_Special_3+1(a4)
	beq.s	.no_rope
	move.w	Bob_Special_1(a4),d0
	add.w	d0,R_xpos
	tst.b	T_swing
	bne.s	.no_rope
	tst.b	T_stand
	bne.s	.no_rope
	tst.b	T_state
	bne	.no_rope
	move.w	T_posX,d0
	move.w	T_posY,d1
	add.w	#14,d0
	addq.w	#3,d1
	movem.w	R_xpos,d2-d3
	move.w	R_radius1,d6
	move.w	R_radius,d7
	movem.w	d6/d7,-(sp)
	jsr	check_rope2
	movem.w	(sp)+,d6/d7
	beq.s	.no_kill
	sf	T_rope
	sf	T_swing
.no_kill:
	move.w	d6,R_radius1
	move.w	d7,R_radius
.no_rope:

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

	move.w	d0,d2
	add.w	#40,d2
	jsr	check_foot_frame
	beq.s	.no_feet
	st	T_stand
	move.w	Bob_Y_Position(a4),d1
	jsr	alias_feet

	;Turrican steht auf dieser Platform!

	tst.b	Bob_Special_3+1(a4)
	beq.s	.isnt_moving
	move.w	Bob_Special_1(a4),T_forceX
.isnt_moving:

	tst.b	Bob_Special_3(a4)
	bgt	.do_wip

	tst.b	Bob_Special_3(a4)
	bne.s	.not_starting
	move.b	#1,Bob_Special_3(a4)			;Flag fr Start.
	bra.s	.not_starting
.start:
	tst.b	Bob_Special_3+1(a4)
	bne.s	.not_starting
	move.w	Bob_Special_4(a4),Bob_Special_2(a4)	;Lnge des Movements.
	st	Bob_Special_3+1(a4)
.not_starting:
	bra	Standart_BobAnim
.no_feet:
	moveq	#0,d6
	tst.b	Bob_Special_3(a4)
	bgt	.do_wip
	clr.b	Bob_Special_3(a4)
	bra	Standart_BobAnim

.do_wip:
	lea	wip_table(pc),a0
	moveq	#0,d0
	move.b	Bob_Special_3(a4),d0
	add.w	d0,d0
	move.w	(a0,d0.w),d0
	add.w	d0,Bob_Y_Position(a4)
	tst.w	d6
	beq.s	.no_force
	move.w	d0,T_forceY
.no_force:
	addq.b	#1,Bob_Special_3(a4)
	cmp.b	#6,Bob_Special_3(a4)
	bne.s	.not_starting
	st	Bob_Special_3(a4)
	bra.s	.start
	bra.s	.not_starting

wip_table:	dc.w	0,2,1,0,-1,-2

Platform_PrgY:
	tst.b	T_rope
	bne.s	.dont_clear
	sf	Bob_Rope(a4)
.dont_clear:
	moveq	#1,d6

	tst.b	Bob_Special_3+1(a4)
	beq.s	.no_move
	tst.w	Bob_Special_2(a4)
	beq.s	.no_move
	move.w	Bob_Special_1(a4),d0
	add.w	d0,Bob_Y_Position(a4)
	subq.w	#1,Bob_Special_2(a4)
	bne	.no_move
	neg.w	Bob_Special_1(a4)			;Bewegungsrichtung umkehren.
	clr.b	Bob_Special_3+1(a4)
.no_move:
	tst.b	Bob_Rope(a4)
	beq	.no_rope
	tst.b	T_startswing
	beq.s	.no_rope_start
	clr.b	T_startswing
	tst.b	Bob_Special_3+1(a4)
	bne.s	.no_rope_start
	move.w	Bob_Special_4(a4),Bob_Special_2(a4)	;Lnge des Movements.
	st	Bob_Special_3+1(a4)
	bra.s	.no_rope
.no_rope_start:
	tst.b	Bob_Special_3+1(a4)
	beq.s	.no_rope
	move.w	Bob_Special_1(a4),d0
	add.w	d0,R_ypos

	move.w	T_posX,d0
	move.w	T_posY,d1
	tst.b	T_swing
	beq.s	.no_add
	tst.w	Bob_Special_1(a4)
	bpl.s	.down
	movem.w	d0-d1,-(sp)
	move.w	T_posX(pc),d0
	move.w	T_posY(pc),d1

	addq.w	#3,d1
	move.l	Act_Scr_Structure,a6
	jsr	check_kollision
	movem.w	(sp)+,d0-d1
	bne.s	.no_add
	bra.s	.add
.down:
	movem.w	d0-d1,-(sp)
	jsr	Test_feet
	movem.w	(sp)+,d0-d1
	bne.s	.no_add
.add:
	add.w	Bob_Special_1(a4),d1
.no_add:
	add.w	#14,d0
	addq.w	#3,d1
	movem.w	R_xpos,d2-d3
	jsr	check_rope2
	beq.s	.no_kill
	sf	T_rope
	sf	T_swing
.no_kill:
.no_rope:
	move.w	Bob_X_Position(a4),d0
	move.w	Bob_Y_Position(a4),d1

	move.w	d0,d2
	add.w	#40,d2
	jsr	check_foot_frame
	beq.s	.no_feet
	st	T_stand
	move.w	Bob_Y_Position(a4),d1
	jsr	alias_feet

	;Turrican steht auf dieser Platform!

	tst.b	Bob_Special_3+1(a4)
	beq.s	.isnt_moving
	move.w	Bob_Special_1(a4),T_forceY
.isnt_moving:

	tst.b	Bob_Special_3(a4)
	bgt	.do_wip

	tst.b	Bob_Special_3(a4)
	bne.s	.not_starting
	tst.w	Bob_Special_1(a4)
	bpl.s	.start
	move.b	#1,Bob_Special_3(a4)			;Flag fr Start.
	bra.s	.not_starting
.start:
	st	Bob_Special_3(a4)
	tst.b	Bob_Special_3+1(a4)
	bne.s	.not_starting
	move.w	Bob_Special_4(a4),Bob_Special_2(a4)	;Lnge des Movements.
	st	Bob_Special_3+1(a4)
.not_starting:
	bra	Standart_BobAnim
.no_feet:
	moveq	#0,d6
	tst.b	Bob_Special_3(a4)
	bgt	.do_wip
	clr.b	Bob_Special_3(a4)
	bra	Standart_BobAnim

.do_wip:
	lea	wip_table(pc),a0
	moveq	#0,d0
	move.b	Bob_Special_3(a4),d0
	add.w	d0,d0
	move.w	(a0,d0.w),d0
	add.w	d0,Bob_Y_Position(a4)
	tst.w	d6
	beq.s	.no_force
	add.w	d0,T_forceY
.no_force:
	addq.b	#1,Bob_Special_3(a4)
	cmp.b	#6,Bob_Special_3(a4)
	bne.s	.not_starting
	bra.s	.start

Platform_AnimTable:
		dc.l	level_GFX+bob00,level_GFX+msk00
		dc.w	0,0,24,0,0,40,24
		dc.w	ENTRY_END
		dc.l	Platform_AnimTable

*---------------------------------------------------------------------------
*	Routine and AnimTable of      Walker_Sky
*---------------------------------------------------------------------------
Walker_Sky_Start:
	move.l	#Walker_Sky,Bob_Routine(a4)
	tst.w	Bob_Special_4(a4)
	bpl.s	.ok2
	move.l	#Walker_Sky_AnimTableL,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
.ok2:
	move.l	a4,-(sp)
	moveq	#16,d0
	moveq	#100,d1
	moveq	#100,d2
	lea	Area_Enter_Vector(pc),a1
	bsr	Search_Bob_Entry
	move.l	(sp)+,a0
	move.b	#BOB_NOCOL,Bob_Used(a4)		;Kein Kollision-Check.
	move.w	a0,Bob_Special_3(a4)
	move.w	a4,Bob_Special_3(a0)
	tst.w	Bob_Special_4(a0)
	bpl.s	.ok
	move.l	#Fire_AnimTableL,Bob_Next_Anim(a4)
.ok:
	move.l	a0,a4
	bra	Walker_Sky

Walker_Sky:
	lea	0.w,a1
	move.w	Bob_Special_3(a4),a1
	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:
	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

	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	#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	#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:
	bsr	Test_Bob_Out
	tst.b	Bob_Used(a4)
	bpl	.out
	lea	0.w,a0
	move.w	Bob_Special_3(a4),a0
	st	Bob_Used(a0)

	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_Sky_AnimTableR:
	dc.l	level_GFX+bob05,level_GFX+msk05
	dc.w	0,0,28,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Walker_Sky_AnimTableR

Walker_Sky_AnimTableL:
	dc.l	level_Buffer+bob05-bob01,level_Buffer+msk05-bob01
	dc.w	0,0,28,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Walker_Sky_AnimTableL

Fire:
	lea	0.w,a0
	move.w	Bob_Special_3(a4),a0
	movem.w	Bob_X_Position(a0),d0-d1
	tst.w	Bob_Special_4(a0)
	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(a4)
	eor.b	#2,Bob_BlitStatus(a4)
	bra	Standart_BobAnim

Fire_AnimTableR:
	dc.l	level_GFX+bob08,level_GFX+msk08
	dc.w	0,0,10,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Fire_AnimTableR

Fire_AnimTableL:
	dc.l	level_Buffer+bob08-bob01,level_Buffer+msk08-bob01
	dc.w	0,0,10,2,2,28,24
	dc.w	ENTRY_END
	dc.l	Fire_AnimTableL


*---------------------------------------------------------------------------
*	Routine and AnimTable of      Walker_Ground
*---------------------------------------------------------------------------

Walker_StartL:
	tst.w	Bob_Special_4(a4)
	bmi.s	.ok
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
.ok:
	move.l	#Walker_Ground,Bob_Routine(a4)

Walker_Ground:
	moveq	#$50,d0
	bsr	Standart_Hit_Handler
	beq	Standart_Destruction
	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

	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_4(a4),d0
	add.w	d0,d0
	add.w	d0,d0
	move.w	d0,Bob_Special_4(a4)
	bpl.s	.set
	lea	Walker_MAnimTableL(pc),a0
.set:
	move.l	a0,Bob_Next_Anim(a4)
	bsr	Get_Next_Bob_Frame
	bra	Test_Bob_Out

.no_one_stands_on_me:
	move.w	Bob_Special_4(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
.change_r:
	neg.w	Bob_Special_4(a4)
	move.l	#Walker_AnimTableL,Bob_Next_Anim(a4)
	bra	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

.change_l:
	neg.w	Bob_Special_4(a4)
	move.l	#Walker_AnimTableR,Bob_Next_Anim(a4)
	bra	Get_Next_Bob_Frame

Walker_maniac:
	move.w	Bob_Special_4(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	Standart_BobAnim

	addq.w	#4,Bob_Y_Position(a4)

	bra	Standart_BobAnim


Walker_AnimTableR:
		dc.l	level_GFX+bob01,level_GFX+msk01
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob02,level_GFX+msk02
		dc.w	0,1,27,2,2,28,24
		dc.l	level_GFX+bob03,level_GFX+msk03
		dc.w	0,0,28,2,2,28,24
		dc.l	level_GFX+bob04,level_GFX+msk04
		dc.w	0,1,27,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_AnimTableR

Walker_MAnimTableR:
		dc.l	level_GFX+bob06,level_GFX+msk06
		dc.w	0,13,15,2,2,28,24
		dc.l	level_GFX+bob07,level_GFX+msk07
		dc.w	0,12,16,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_MAnimTableR

Walker_AnimTableL:
		dc.l	level_Buffer+bob01-bob01,level_Buffer+msk01-bob01
		dc.w	0,0,28,2,2,28,24
		dc.l	level_Buffer+bob02-bob01,level_Buffer+msk02-bob01
		dc.w	0,1,27,2,2,28,24
		dc.l	level_Buffer+bob03-bob01,level_Buffer+msk03-bob01
		dc.w	0,0,28,2,2,28,24
		dc.l	level_Buffer+bob04-bob01,level_Buffer+msk04-bob01
		dc.w	0,1,27,2,2,28,24
		dc.w	ENTRY_END
		dc.l	Walker_AnimTableL
Walker_MAnimTableL:
		dc.l	level_Buffer+bob06-bob01,level_Buffer+msk06-bob01
		dc.w	0,13,15,2,2,28,24
		dc.l	level_Buffer+bob07-bob01,level_Buffer+msk07-bob01
		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
	bra	Init_Level_3

act_level:	dc.w	Level

Init_Level_1:
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.w	#levelb1*2,Scr_Level_Width(a6)
	move.l	#Level1-2-levelb1*2,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.l	#Area1+8,Area_Vector
	move.w	#46,Scr_BA_Anz_Area_X(a6)
	move.l	#Cue_Table1,Act_Cue_Table
	move.l	#Return,SFX_Handler
	rts

Init_Level_2:
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.w	#levelb2*2,Scr_Level_Width(a6)
	move.l	#Level2-2-levelb2*2,Scr_Level_Pointer(a6)
	move.l	#Level2,Scr_Level(a6)
	move.w	#levelb2*16-320+16,Scr_X_Max(a6)
	move.w	#levelh2*16-208,Scr_Y_Max(a6)
	move.l	#Area2+8,Area_Vector
	move.w	#50,Scr_BA_Anz_Area_X(a6)
	move.l	#Cue_Table2,Act_Cue_Table
	move.l	#SFX_Lev2,SFX_Handler

	lea	level_GFX+bob0e,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	level_GFX+msk0e,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

	lea	Work_Buffer1+45*38,a0
	move.w	#45*5-1,d0
.Rclear:
	clr.b	(a0)+
	dbf	d0,.Rclear

	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	sf	Rot_I_Single_Call(a2)		;Zoomen auf zwei Frames verteilen!
	move.l	#spider_zoom_pos,Elev_Zoom_pointer
	move.l	#Rotate_Buffer+20480,Dest_Obj

.rotate_it:
	move.l	Elev_Zoom_pointer,a0
	move.l	(a0),d0
	lea	Work_Buffer1,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Do_Zoom

	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.l	#4,Elev_Zoom_pointer
	move.l	Elev_Zoom_pointer,a0
	tst.l	(a0)
	bpl.s	.rotate_it
	rts

Init_Level_3:
	move.l	Act_Scr_Structure,a6
	move.l	#Level1_Clist,Clist_Handler
	move.w	#levelb3*2,Scr_Level_Width(a6)
	move.l	#Level3-2-levelb3*2,Scr_Level_Pointer(a6)
	move.l	#Level3,Scr_Level(a6)
	move.w	#levelb3*16-320+16,Scr_X_Max(a6)
	move.w	#levelh3*16-208,Scr_Y_Max(a6)
	move.l	#Area3+8,Area_Vector
	move.w	#20,Scr_BA_Anz_Area_X(a6)
	move.l	#Cue_Table3,Act_Cue_Table
	move.l	#Return,SFX_Handler

	lea	boss_GFX+Bbob02,a0
	lea	Work_Buffer1,a1
	lea	Rot_Info1,a2
	lea	boss_GFX+Bmsk02,a3
	moveq	#32,d0
	moveq	#4,d1
	jsr	Convert_to_Rotate

;	lea	Work_Buffer1+45*38,a0
;	move.w	#45*5-1,d0
;.Rclear:
;	clr.b	(a0)+
;	dbf	d0,.Rclear

	lea	Rot_Info1,a2
	move.w	#32,Rot_I_BUF_Width(a2)
	sf	Rot_I_Single_Call(a2)		;Zoomen auf zwei Frames verteilen!
	move.l	#spider_zoom_pos,Elev_Zoom_pointer
	move.l	#Rotate_Buffer+20480,Dest_Obj

.rotate_it:
	move.l	Elev_Zoom_pointer,a0
	move.l	(a0),d0
	lea	Work_Buffer1,a0
	lea	Work_Buffer2,a1
	lea	Rot_Info1,a2
	jsr	Do_Zoom

	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.l	#4,Elev_Zoom_pointer
	move.l	Elev_Zoom_pointer,a0
	tst.l	(a0)
	bpl.s	.rotate_it
	rts

SFX_Lev2:
	move.w	Scr_X_Level_Pos(a6),d0
	add.w	T_posX,d0
	move.w	Scr_Y_Level_Pos(a6),d1
	add.w	T_posY,d1
	cmp.w	#320,d1
	bgt.s	.no_fix
	cmp.w	#920,d0
	blt.s	.no_fix
	cmp.w	#2630,d0
	bgt.s	.no_fix
	move.w	#80,Scr_Down_Fix(a6)
.no_fix:
	rts


Show_Word:
	divu	#1000,d0
	asl.b	#4,d0
	move.b	d0,T_score+1
	clr.w	d0
	swap	d0
	divu	#100,d0
	or.b	d0,T_score+1
	clr.w	d0
	swap	d0
	divu	#10,d0
	asl.b	#4,d0
	move.b	d0,T_score+2
	clr.w	d0
	swap	d0
	or.b	d0,T_score+2
	rts

Init_Parafield:
	move.l	#$ffffffff,bltafwm(a5)
	move.w	#40-2,bltdmod(a5)
	move.w	#0,bltamod(a5)
	sub.w	#20,d5
.yloop:
	moveq	#20-1,d6
.xloop:
	moveq	#0,d0
	move.b	(a1)+,d0
	bmi.s	.space
	asl.w	#5,d0
	move.w	d0,d1
	add.w	d0,d0
	add.w	d1,d0
	add.l	a2,d0
	move.l	d0,bltapth(a5)
	move.l	a0,bltdpth(a5)
	move.w	#$09f0,bltcon0(a5)
.back:
	move.w	#64*16*3+1,bltsize(a5)
	waitblt
	addq.l	#2,a0
	dbf	d6,.xloop
	add.l	d5,a1
	add.l	#40*3*16-40,a0
	dbf	d7,.yloop

	rts
.space:
	move.l	a0,bltdpth(a5)
	move.w	#$0100,bltcon0(a5)
	bra.s	.back

Set_ParaClist:
	lea	Para_Clist,a0
	move.l	a0,cop1lch(a5)

	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)

	lea	PCoplab4(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	PCoplab1(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)

	lea	PSprlab(pc),a0
	bsr	Set_Sprites

	lea	PCoplab2(pc),a0
	moveq	#0,d1


	move.w	Para_Ypos,d0
	mulu	#40*3,d0
	add.l	#$60000,d0

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

	;Alten Copper-gosub entfernen.

	move.l	Para_Gosub,d0
	beq.s	.no_old_gosub
	move.l	d0,a0
	move.w	#$0180,4(a0)
	clr.l	Para_Gosub
.no_old_gosub:
	move.w	#256,d0
	sub.w	Para_Ypos,d0
	add.w	#$30,d0
	cmp.w	#$ff,d0
	bge.s	.no_new_gosub

	;Wo muss der Gosub eingefgt werden ?

	cmp.w	#$d0,d0
	ble.s	.use1
	cmp.w	#$e0,d0
	ble.s	.use2
	lea	Pjump3(pc),a0
	bra.s	.use
.use1:
	lea	Pjump1(pc),a0
	bra.s	.use
.use2:
	lea	Pjump2(pc),a0
.use:
	subq.b	#1,d0
	move.b	d0,(a0)
	move.w	#$008a,4(a0)
	move.l	a0,Para_Gosub
	add.l	#8,a0
	move.l	a0,d0
	move.w	d0,PReset+6

.no_new_gosub:
	addq.w	#1,Para_Ypos
	and.w	#255,Para_Ypos

	lea	parallax3,a0
	lea	PCol_lab2+7*4,a1
	moveq	#6,d7
.setcols:
	move.w	(a0)+,2(a1)
	addq.l	#4,a1
	dbf	d7,.setcols

	rts

Para_Ypos:	dc.w	0
Para_Gosub:	dc.l	0

Level1_Clist:
	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	#COPCOL,4(a0,d1.w)	;Farbding wieder reinschreiben.

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

	bsr	blit_parallax

	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_Buffer:	dc.l	0,0,0
Col_Buffer2:	dc.l	0,0,0
Col_Flag:	dc.b	0
Col_Init_Flag:	dc.b	0


Clist_oldcolpos:	dc.w	0

	;d0 nicht benutzen
init_parallax:

	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
;	moveq	#0,d2
;	move.w	para_ypos,d2
;	and.w	#255,d2
;	add.l	d2,d3
;	add.l	d2,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

blit_parallax:

	move.w	para_ypos,d0
	cmp.w	para_old,d0
;	beq	.no_blit2

	move.w	#$09f0,bltcon0(a5)
	move.w	#6,bltdmod(a5)
	move.w	#0,bltamod(a5)
	move.l	#-1,bltafwm(a5)

	bsr	.rest_blit

	move.l	#parallax2,d3
	move.l	#Coplab2+6,d4
	move.w	#109,d5			;Blithhe
	moveq	#0,d2
	move.w	para_ypos,d2
	sub.w	#100,d2
	and.l	#255,d2
	neg.w	d2			;Zwischen 0 und 255.
	add.w	#255,d2

	cmp.w	#98,d2
	ble.s	.blitcalc

	moveq	#0,d6
	move.w	d2,d6
	lsl.l	#3,d6			;8 Bytes pro Zeile fr einen Farbbalken.
	add.l	d6,d4

	move.w	#208,d0
	sub.w	d2,d0
	ble	.no_blit1
	move.w	d0,d5
	bra.s	.blit

.blitcalc:
	move.l	d2,d6
	asl.l	#3,d6			;8 Bytes pro Zeile fr einen Farbbalken.
	add.l	d6,d4
.blit:
	move.l	d3,bltapth(a5)
	move.l	d4,bltdpth(a5)
	asl.w	#6,d5
	addq.w	#1,d5
	move.w	d5,bltsize(a5)

	waitblt

	move.l	d4,rest1_adr
	move.w	d5,rest1_size

.no_blit1:
	cmp.w	#146,d2
	ble.s	.no_blit2

	move.l	#Coplab2+6,d4
	move.l	#parallax2,d3
	move.w	d2,d5
	sub.w	#147,d5
	ble.s	.no_blit2
	neg.w	d2
	add.w	#256,d2
	add.l	d2,d2
	add.l	d2,d3
	move.l	d3,bltapth(a5)
	move.l	d4,bltdpth(a5)
	asl.w	#6,d5
	addq.w	#1,d5
	move.w	d5,bltsize(a5)

	waitblt

	move.l	d4,rest2_adr
	move.w	d5,rest2_size

.no_blit2:
	rts


.rest_blit:
	move.l	rest1_adr,d4
	beq.s	.no_rest1

	move.l	d4,bltdpth(a5)
	sub.l	#Coplab2+6,d4
	lsr.w	#2,d4
	add.l	#parallax,d4
	move.l	d4,bltapth(a5)
	move.w	rest1_size(pc),bltsize(a5)

	waitblt

.no_rest1:
	clr.l	rest1_adr

	move.l	rest2_adr,d4
	beq.s	.no_rest2

	move.l	d4,bltdpth(a5)
	sub.l	#Coplab2+6,d4
	lsr.w	#2,d4
	add.l	#parallax,d4
	move.l	d4,bltapth(a5)
	move.w	rest2_size(pc),bltsize(a5)

	waitblt

.no_rest2:
	clr.l	rest2_adr

	rts

rest1_adr:	dc.l	0
rest1_size:	dc.w	0
rest2_adr:	dc.l	0
rest2_size:	dc.w	0

para_ypos:	dc.l	0
para_old:	dc.w	0


Fade_Colors:
	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	SetClist
	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	SetClist
	bsr	set_weapon_colors
	jsr	set_copcolors
	sf	Col_Init_Flag
	rts


.fade_out:
	bsr	.wait_tof

	st	Col_Flag
	jsr	SetClist
	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_parallax2,a0		;Source
	lea	parallax2,a1		;Destination
	move.w	#108,d6
	bsr	Do_Fade_colors
	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
	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

Fade_Position:	dc.w	0

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
levelb1	=	184
levelh1	=	63
levelb2	=	200
levelh2	=	71
levelb3	=	80
levelh3	=	71

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

planeb	=	40+4
planeh	=	208+4*16+20

	Even
coltab:
	dcb.w	32,0

B_coltab:
	dc.w	$0000,$0AAA,$0333,$0666,$0000,$0630,$06BF,$0386
	dc.w	$0061,$0B75,$0EA7,$0FE0,$0C00,$0C09,$0705,$0FFF

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



	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

	dc.w	$0084,Coplab3/$10000
	dc.w	$0086,Coplab3&$ffff

Coplab2:
line	SET	$30

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

line	SET	line+1

	ENDR

Copjumpin:
	dc.w	$fedf,$fffe
	dc.w	$0100,$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	COPCOL,$0000

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

Para_Clist:
PCol_lab2:
	dc.w	$0182,$0bbb
	dc.w	$0184,$0fff
	dc.w	$0186,$0222
	dc.w	$0188,$0666
	dc.w	$018a,$03d8
	dc.w	$018c,$0fe0
	dc.w	$018e,$0e96

	dc.w	$0192,$0000	;$0a75
	dc.w	$0194,$0000	;$0532
	dc.w	$0196,$0000	;$0044
	dc.w	$0198,$0000	;$0411
	dc.w	$019a,$0000	;$0200
	dc.w	$019c,$0000	;$0010
	dc.w	$019e,$0000	;$0743

PSprlab:
	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*3-40
	dc.w	$010a,40*3-40
	dc.w	$0100,$6400
	dc.w	$0104,4+4*8
PCoplab4:
	dc.w	$0102,$0000

PCoplab1:
	dc.w	$00e0,$0004
	dc.w	$00e2,0
	dc.w	$00e8,$0004
	dc.w	$00ea,0+planeb
	dc.w	$00f0,$0004
	dc.w	$00f2,0+planeb*2
PCoplab2:
	dc.w	$00e4,$0006
	dc.w	$00e6,0+40*0
	dc.w	$00ec,$0006
	dc.w	$00ee,0+40*1
	dc.w	$00f4,$0006
	dc.w	$00f6,0+40*2

	dc.w	$0084,PReset/$10000
	dc.w	$0086,PReset&$ffff

Pjump1:
	dc.w	$00d7,$fffe
	dc.w	$0180,$0000

	dc.w	$d001,$fffe

	dc.w	$00e0,$0006
	dc.w	$00e2,$7800
	dc.w	$00e8,$0006
	dc.w	$00ea,$7800+40
	dc.w	$00f0,$0006
	dc.w	$00f2,$7800+40*2

	dc.w	$0182,$aaa
	dc.w	$0186,$000
	dc.w	$0188,$ea7
	dc.w	$018a,$b75
	dc.w	$018e,$666
	dc.w	$0108,40*3-40

Pjump2:
	dc.w	$00d7,$fffe
	dc.w	$0180,$0000

	dc.w	$e001,$fffe

	dc.w	$0184,$333
	dc.w	$0188,$705
	dc.w	$018c,$c09

Pjump3:
	dc.w	$00d7,$fffe
	dc.w	$0180,$0000

	dc.w	$0084,Copjumpin/$10000
	dc.w	$0086,Copjumpin&$ffff
	dc.w	$008a,$0001

PReset:
	dc.w	$0084,Copjumpin/$10000
	dc.w	$0086,Copjumpin&$ffff
	dc.w	$00e6,0+40*0
	dc.w	$00ee,0+40*1
	dc.w	$00f6,0+40*2

	dc.w	$008a,$0001


B_parallax:	incbin	work:sources/t3/bitplanes/copper1.col
B_parallax2:	incbin	work:sources/t3/bitplanes/copper2.col
B_parallax3:	dc.w	$0a75,$0532,$0044,$0411,$0200,$0010,$0743

para_field:	incbin	work:modmaps/t3_para1.mod

elevator_field:
		dc.b	-1,-1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,-1,-1
		dc.b	-1,-1,-1,5,4,4,4,4,5,4,4,5,4,4,4,4,5,-1,-1,-1
		dc.b	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

Area1:		include	level1_area
Area2:		include	level2_area
Area3:		include	level3_area
