;нннннннннннннннннннннннннннннннннннннннннннннннннн
;
;	Classic Intro V1.0
;	-------------------------------------------
;	by Trisa, the bavarian, and Broesel... holladrio	
;
;нннннннннннннннннннннннннннннннннннннннннннннннннн

; This is the high art of bullshit code...
; the routines used are quite lame ... the latest Version
; of them are much faster, but anyway, these ones work, too...
; main changes have been made on: 
; . the LineRoutine (V1.8 is twice as fast as the one used here (V1.0)
;   V1.8 uses 1/2 Rasterline per Line including Fillcorrections)
; . and the Correction for the correct BLTFilling which have 
;   been directly incorporated into the LineRoutine (V1.8)
; . divstable in the 3D/2D Projection Routine which wnables ypu to use
;   muls instead of much slower divs (x/z is the same as x*1/z!!)

; Code by TRIAD & BROS
; Logo by STALKER 
; Font by BROS

;EXTERNALS:  	LOGO1.BITM         > Logo
;		TURRICAN2          > Sound
;		zoom_font          > font

; assemble with 'a' (and make sur to have the externals
;		    in the same Directory)
; 'j' to test it and
; 'woc' to save as executable file
;
; ----- Definitions ----------------------------------------------- 

LOCATION	=	$55000
RELOC		=	LOCATION+$34
INIT		=	LOCATION+$2c
PLAY		=	LOCATION+$24

; ----- program start ---------------------------------------------- 

d:
start:	moveq	#7,d0			;
	swap	d0			;
	bsr.L	Precalculate		;
	
;------------------------------------------------------

	moveq	#0,d1			; HighSpeed ClearMem
	moveq	#0,d2			; by Trisa
	moveq	#0,d3			; (25% faster than BLT!!)
	moveq	#0,d4			;
	moveq	#0,d5			;
	moveq	#0,d6			;
	move.l	bild1(pc),a0		;
	lea	$5000(a0),a0		;
	move.w  #$5000/4/6,d0		;
ClearPlanes:				;
	movem.l	d1-d6,-(a0)		;
	dbra    d0,ClearPlanes		;

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

	lea	d(pc),a5		; a5 = data pointer
	lea	$dff000,a6		; a6 = hardware reg pointer

	move.w	$2(a6),d0		; save dma bits
	or.w	d0,dmaen-d(a5)		;
	move.w	$1c(a6),d0		; save intena bits
	or.w	d0,intena-d(a5)		;
	move.w	#$7fff,d0		;
	move.w	d0,$96(a6)		; clear dmaen bits
	move.w	d0,$9a(a6)		; clear intena bits
	move.w	d0,$9c(a6)		; clear intreq bits
					;
	clr.w	$180(a6)		;
					;
	move.l	$6c.w,oldint-d(a5)	; set own vertb int handler
	lea	newirq(pc),a1		;
	move.l	a1,$6c.w		;

;------	Init's ---------------------------------------

	bsr.l	initsintab		;
	bsr.L	InitSound		;
	bsr.L	InitBPL			;

;------	Kick on all that stuff ------------------------
					;
	lea	newcopper(pc),a0	;
	move.l	a0,$80(a6)		;
	move.w	#$87c0,$96(a6)		; kick on dma's
	move.w	#$c020,$9a(a6)		; and vertb int

; ----- Wait for the end -------------------------------------------

	lea	zustand(pc),a0
zero:	tst.w	(a0)
	beq.s	zero

mouse:	btst	#6,$bfe001
	bne.s	mouse

	lea	irq_to_take(pc),a1
	addq.w	#1,(a1)

wne:	cmp.w	#10,(a0)
	bne.s	wne

wne2:	cmp.w	#11,(a0)
	bne.s	wne2

exit:	move.w	#$7fff,d0		;
	move.w	d0,$96(a6)		;
	move.w	d0,$9a(a6)		;

	move.l	4.w,a5			;
	move.l	156(a5),a0		; old copper list
	move.l	38(a0),$80(a6)		;
	move.l	oldint(pc),$6c.w	;

	move.w	dmaen(pc),$96(a6)	;
	move.w	intena(pc),$9a(a6)	;

	moveq	#0,d0			;
exit_end:
	rts				;

; ------------------------------------------------------------------ 
; 	init code
; ------------------------------------------------------------------ 

; ----- init sine tab ---------------------------------------------- 

initsintab:
	lea	sintab(pc),a0		; source
	move.l	sin(pc),a1		; destination 1
	move.l	a1,a2			; destination 2
	add.l	#360,a2			;
	moveq	#89,d0			;
initsintab_1:
	move.w	(a0)+,d1		; current value
	move.w	d1,(a1)+		;
	move.w	d1,718(a1)		;
	move.w	d1,-(a2)		;
	neg.w	d1			;
	move.w	d1,358(a1)		;
	move.w	d1,360(a2)		;
	dbra	d0,initsintab_1		;

	rts				;

; ----- init BitplanePtr's ---------------------------------- 

InitBPL:move.l	#$2c812cc1,$8e(a6)	; BildschirmKoordinaten
	move.l	#$003800d0,$92(a6)	; Data Fetch Start/Stop
	clr.l	$104(a6)		; Modulos
	clr.l	$108(a6)		; Verschiebewerte

	move.w	#$0002,$182(a6)		;

	move.w	#$03b8,d0		;
	move.w	d0,$18c(a6)		;
	move.w	d0,$18e(a6)		;
	move.w	#$06ca,d0		;
	move.w	d0,$190(a6)		;
	move.w	d0,$192(a6)		;
	move.w	#$07db,d0		;
	move.w	d0,$194(a6)		;
	move.w	d0,$196(a6)		;
	move.w	#$09dc,d0		;
	move.w	d0,$198(a6)		;
	move.w	d0,$19a(a6)		;
	move.w	#$0bed,d0		;
	move.w	d0,$19c(a6)		;
	move.w	d0,$19e(a6)		;

;-------------------------------------------------------
;	Set GFXPtr's in Copperlist
;-------------------------------------------------------

;------	LogoBPL's --------------------------------------

SetPointers:
	lea	LogoBPL(pc),a1		;  LogoPlanes
	lea	Logo(pc),a0		;
	moveq	#3-1,d0			;
CopperLoop1:	
	move.l	a0,d1			;
	move.w	d1,6(A1)		;
	swap	d1			;
	move.w	d1,2(A1)		;
	lea	40*77(a0),a0		;
	addq.w	#8,a1			;
	dbf	d0,CopperLoop1		;
	rts

;------	Copy Sound to Location ------------------------ 

InitSound:				;
	lea	Sound(pc),a0		;
	move.l	#Location,a1		;
	move.l	#SoundEnd-Sound,d0	;
CopyLoop:				;	
	move.b	(a0)+,(a1)+		;
	dbra	d0,CopyLoop		;
					;
	move.l	#$b1b2+LOCATION,d0	; Patterns
	move.l	#$1480+LOCATION,d1	; Digis
	jsr	RELOC			; Relocate Song	
					;
	moveq	#0,d0			; Songs = $0,$1,$1f
	jsr	INIT			;
					;	
	rts				;

;ннннннннннннннннннннннннннннннннннннннннннннннннннннн
;	Vertical Blank IRQ
;ннннннннннннннннннннннннннннннннннннннннннннннннннннн

VertBlIRQ:
	lea	actionplane1(pc),a0		;
	move.l	(a0),$e0(a6)			;

;------	Clear Memory ----------------------------

	move.l	#$01000000,$40(a6)		;
	move.l	4(a0),$54(a6)			;
	clr.w	$66(a6)				;
	move.w	#211*64+20,$58(a6)		;

;------------------------------------------------
;	3D Vector Grafix 
;------------------------------------------------

	move.l	SinPtr(pc),a1			;
	move.l	sin(pc),a2			;
	lea	$2cc(a2),a2			;
	cmp.l	a1,a2				;
	bhi.s	GetValue			;
	move.l	sin(pc),a2			;
	move.l	a2,SinPtr-d(a5)			;
GetValue:					;
	move.w	(a1),d0				;
	addq.l	#2,SinPtr-d(a5)			;
	lea	XAngle(pc),a0			;
	cmp.w	#716,(a0)			;
	blt.s	weiter				;
	clr.w	(a0)				;
	clr.w	2(a0)				;
	clr.w	4(a0)				;
weiter:						;
	add.w	#256,d0				; 
	and.b	#$fe,d0				; make it even
	move.w	d0,4(a0)			;
	addq.w	#4,2(a0)			;
	addq.w	#4,0(a0)			;
	add.w	#200,d0				;
	add.w	d0,d0
	add.w	d0,d0
	move.w	d0,distance-d(a5)		;
						;
	movem.w (a0)+,d0-d2			;

;------	Calc Turn Matrix ------------------------

;нннннннннннннннннннннннннннннннннннннннннннннннн
;
; 	Calc Turn Matrix (3 axes)
; 	-----------------------------------------
;	d0 = Alpha.w	
;	d1 = Beta.w	
;	d2 = Gamma.w	
;
; 	turn matrix for three axis:
;	-----------------------------------------
;	A = cos(b) * cos(c)
; 	B = cos(b) * sin(c)
; 	C = -sin(b)
; 	D = sin(a) * sin(b) * cos(c) - cos(a) * sin(c)
; 	E = sin(a) * sin(b) * sin(c) + cos(a) * cos(c)
; 	F = sin(a) * cos(b)
; 	G = cos(a) * sin(b) * cos(c) + sin(a) * sin(c)
; 	H = cos(a) * sin(b) * sin(c) - sin(a) * cos(c)
; 	I = cos(a) * cos(b)
; 	x' = x*A + y*B + z*C
; 	y' = x*D + y*E + z*F
; 	z' = x*G + y*H + z*I
; 	sin(a) * sin(b) and cos(a) * sin(c) and cos(a) * cos(c)
; 	may be precalculated!
;
;нннннннннннннннннннннннннннннннннннннннннннннннн

makematrix:				;
	lea	matrix(pc),a0		;
	move.l	cos(pc),a1		;
	move.w	(a1,d0.w),d3		; cos(a)
	move.w	(a1,d1.w),d4		; cos(b)
	move.w	(a1,d2.w),d5		; cos(c)
	move.l	sin(pc),a1		;
	move.w	(a1,d0.w),d0		; sin(a)
	move.w	(a1,d1.w),d1		; sin(b)
	move.w	(a1,d2.w),d2		; sin(c)
	move.w	d0,d6			;
	muls	d1,d6			; sin(a) * sin(b)
	asr.l	#8,d6			;
	move.w	d6,a1			; store it
	move.w	d3,d7			;
	muls	d2,d7			; cos(a) * sin(c)
	asr.l	#8,d7			;
	move.w	d7,a2			; store it
	muls	d5,d6			; sin(a) * sin(b) * cos(c)
	asr.l	#8,d6			;
	sub.w	d7,d6			; - cos(a) * sin(c)
	move.w	d6,6(a0)		; --> D
	move.w	d3,d7			;
	muls	d5,d7			; cos(a) * cos(c)
	asr.l	#8,d7			;
	move.w	a1,d6			;
	muls	d2,d6			; sin(a) * sin(b) * sin(c)
	asr.l	#8,d6			;
	add.w	d7,d6			; + cos(a) * cos(c)
	move.w	d6,8(a0)		; --> E
	muls	d1,d7			; cos(a) * sin(b) * cos(c)
	asr.l	#8,d7			;
	move.w	d0,d6			;
	muls	d2,d6			; sin(a) * sin(c)
	asr.l	#8,d6			;
	add.w	d6,d7			;
	move.w	d7,12(a0)		; --> G
	move.w	a2,d6			;
	muls	d1,d6			; cos(a) * sin(b) * sin(c)
	asr.l	#8,d6			;
	move.w	d0,d7			;
	muls	d5,d7			; sin(a) * cos(c)
	asr.l	#8,d7			;
	sub.w	d7,d6			;
	move.w	d6,14(a0)		; --> F
	muls	d4,d5			; cos(b) * cos(c)
	asr.l	#8,d5			;
	move.w	d5,(a0)			; --> A
	muls	d4,d2			; cos(b) * sin(c)
	asr.l	#8,d2			;
	move.w	d2,2(a0)		; --> B
	muls	d4,d0			; sin(a) * cos(b)
	asr.l	#8,d0			;
	move.w	d0,10(a0)		; --> F
	muls	d4,d3			; cos(a) * cos(b)
	asr.l	#8,d3			;
	move.w	d3,16(a0)		; --> I
	neg.w	d1			; -sin(b)
	move.w	d1,4(a0)		; --> C

;------	Rotate and Project 3D/2D ----------------

;нннннннннннннннннннннннннннннннннннннннннннннннн
;
; 	Rotate X,Y,Z-Angle & Convert 3D/2D
;	-----------------------------------------
;	d0 = number of pts	a0 = Objectdata
;	d7 = View distance	a1 = matrix 
;				a2 = Turnlist
;
;нннннннннннннннннннннннннннннннннннннннннннннннн

converter:				;
	lea	Object2a(pc),a0
	lea	matrix(pc),a1		;
	lea	tulist(pc),a2		;
	move.w	(a0)+,d0		; number of points
	move.w	distance(pc),d7		;
converter_1:				;
	move.w	(a0),d1			; X
	move.w	2(a0),d2		; Y
	move.w	4(a0),d3		; Z
	move.w	d1,d4			;
	muls	(a1),d4			; x*A
	move.w	d2,d5			; 
	muls	2(a1),d5		; y*B
	add.l	d5,d4			; x*A+y*B
	move.w	d3,d5			; 
	muls	4(a1),d5		; z*C
	add.l	d5,d4			; --> D4 = x*A+y*B+z*C
	asr.l	#8,d4			;        = x'
	move.w	d1,d5			;
	muls	6(a1),d5		; x*D
	move.w	d2,d6			; 
	muls	8(a1),d6		; y*E
	add.l	d6,d5			; x*D+y*E
	move.w	d3,d6			; 
	muls	10(a1),d6		; z*F
	add.l	d6,d5			; --> D5 = x*D+y*E+z*F
	asr.l	#8,d5			;     D5 = y'
	muls	12(a1),d1		; x*G  
	muls	14(a1),d2		; y*H
	muls	16(a1),d3		; z*I
	add.l	d1,d3			; x*G+z*I
	add.l	d2,d3			; --> D3 = x*G+z*I+y*H
	asr.l	#8,d3			;     D3 = z'
	add.w	d7,d3			; add Distance
	lsl.l	#8,d4			;
	lsl.l	#8,d5			;
	divs	d3,d4			;
	divs	d3,d5			;
	move.w	d4,(a2)+		; store projected coords
	move.w	d5,(a2)+		;
	addq.w	#8,a0			;
	dbra	d0,converter_1		;

BLTLoop:btst	#6,$2(a6)
	bne.s	BLTLoop

;----------------------------------------------
;	Draw Object
;----------------------------------------------

drawobject:				;
	moveq	#40,d0			;
	move.w	d0,$60(a6)		; Presets for line draw
	move.w	d0,$66(a6)		; image width
	move.l	#$ffff8000,d0		;
	move.l	d0,$72(a6)		;
	move.w	d0,$44(a6)		;
	move.l	actionplane2(pc),a0	;
	lea	tulist(pc),a2		;
	lea	Object2b(pc),a4
	move.w	#160,d4			; Center Object X (+160)
	moveq	#127,d5			;               Y (+127)
	move.w	(a2),d0			;
	add.w	d4,d0			;
	move.w	2(a2),d1		;
	add.w	d5,d1			;
	moveq	#4,d6			;
drawobject_1:				;
	move.b	(a4)+,d2		;
	bpl.s	drawobject_2		;
	cmp.b	#-2,d2			;
	beq.s	drawobject_end		;
	move.w	(a2,d6.w),d0		;
	add.w	d4,d0			;
	move.w	2(a2,d6.w),d1		;
	addq.w	#4,d6			;
	add.w	d5,d1			;
	bra.s	drawobject_1		;
drawobject_2:				;
	ext.w	d2			;
	lsl.w	#2,d2			;
	move.w	2(a2,d2.w),d3		;
	add.w	d5,d3			;
	move.w	(a2,d2.w),d2		;
	add.w	d4,d2			;

;------	Set correct Filling ------------------------

	cmp.w	d3,d1			;
	beq.s	NoDraw			; don't Draw horziontal Lines
	move.w	d1,a1			; save y1 
	cmp.w	d1,d3			;
	bhi.s	NoExg			;
	subq.w	#1,d1			; (higher y)-1
	addq.w	#1,d3			; eliminate next instruction
NoExg:	subq.w	#1,d3			; (higher y)-1
	bsr.L	BLine			;	
	move.w	a1,d1			; restituate orig y1
NoDraw:	bra.s	drawobject_1		;

drawobject_end:				;

;------	Fill it! ----------------------------------

	lea	211*40-2(a0),a0		; Adr of Last Word

WtBLT:	btst	#6,$2(a6)		;
	bne.s	WtBLT			;
					;	
	move.l	#$09f00012,$40(a6)	; USE A,D, LFx: D=A;excl, desc
	move.l	#$ffffffff,$44(a6)	;
	move.l	a0,$50(a6)		; BLTAPTH
	move.l	a0,$54(a6)		; BLTDPTH
	clr.l	$64(a6)			; BLTAMOD

Fill:	move.w	#211*64+20,$58(a6)	; start Blitter

;------	DoubleBuffering  --------------------------
						
	lea	actionplane1(pc),a0		; DoubleBuffering!!
	move.l	(a0),d0				;
	move.l	4(a0),(a0)			;
	move.l	d0,4(a0)			;
						
;------	Exit IRQ ----------------------------------

;move.w	#$04,$180(a6)

	rts

matrix: blk.w 9,0			; 3D turn matrix
tulist:	blk.w 2*100,0			; list for projected points

;------	Draw BlitterLine -------------------------------

;нннннннннннннннннннннннннннннннннннннннннн
;
;	BLine V1.0
;	-----------------------------------	
; 	D0 = x1.w 
;	D1 = y1.w 
;	D2 = x2.w 
;	D3 = y2.w
; 	a0 = Adr of Plane.l
;
;нннннннннннннннннннннннннннннннннннннннннн

BLine:	movem.w	d3-d7,-(a7)	;
				;
	moveq	#0,d5		; clear WorkReg
B_Line:	move.l	a0,d4		; save PlaneAdr
	move.w	d0,d5		;
	ror.l	#4,d5		; 
	add.w	d5,d5		; d5= startbit.w, Adr of startword.w
	add.w	d5,d4		; 
	move.w	d1,d6		;
	lsl.w	#3,d6		; .
	move.w	d6,d7		; .
	add.w	d6,d6		; .
	add.w	d6,d6		; .
	add.w	d7,d6		; . mulu #40,d6 (32+16)
	add.w	d6,d4		;         >	    d4 = AdrStartWord
	moveq	#4,d7		; for octant code
	sub.w	d0,d2		; x1-x2   >	    d2 = DX
	bpl.s	B_Line1		; rightward
	addq.b	#1,d7		; = bset #0 (octant code)
	neg.w	d2		;
B_Line1:sub.w	d1,d3		; y1-y2	  >	    d3 = DY
	bpl.s	B_Line2		; upward
	addq.b	#2,d7		; = bset #1
	neg.w	d3		;
B_Line2:move.w	d3,d6		;
	sub.w	d2,d6		;
	bmi.s	B_Line3		; steepness < 1
	exg	d2,d3		;         >	d2 = GD,d3 =  KDelta
	subq.b	#4,d7		; = bclr #2,d7
	neg.w	d6		;
B_Line3:add.w	d3,d6		;	  >	d6 = 2KD-GD
	bpl.s	B_Line4		;
	addq.b	#8,d7		; sign of 2KD-GD (in Oct Code)
B_Line4:add.w	d3,d3		; 	  >	d3 = 2KD
	swap	d3		; 	  >	d3 = 2KD,2KD-2GD 
	move.w	d6,d3		;
	sub.w	d2,d3		;	  >	d1 = 2KD-2GD
	move.b	octs(pc,d7.l),d7;
	swap	d5		; 
	or.w	#$b4a,d5	; BLTCON0 (b4a=xor)
	addq.w	#1,d2		; lenght+1
	lsl.w	#6,d2		; *64
	addq.b	#2,d2		; width=2
BWait:	btst	#6,$2(a6)	; Blitter busy ??
	bne.s	BWait		;
	move.w	d5,$40(a6)	; BLTCON0
	move.w	d7,$42(a6)	; BLTCON1
	move.l	d4,$48(a6)	; startaddress Line
	move.l	d4,$54(a6)	; 
	move.w	d6,$52(a6)	; 2KD-GD
	move.l	d3,$62(a6)	; 2KD, 2KD-2GD -> 4 cycles won!!!
	move.w	d2,$58(a6)	; start Blitter
				;
	movem.w	(a7)+,d3-d7	;
	rts			;

;------	Octants -------------------------------------

octs:	dc.b 0*4+3 ,2*4+3 ,1*4+3 ,3*4+3
	dc.b 4*4+3 ,5*4+3 ,6*4+3 ,7*4+3
	dc.b 0*4+67,2*4+67,1*4+67,3*4+67
	dc.b 4*4+67,5*4+67,6*4+67,7*4+67


; ---------------------------------------------------
; 	KeyboardRoutines
; ---------------------------------------------------

;------	Init KeyBoard -------------------------------

;init_keyboard:	move.b	#$c0,$bfd200
;		move.b	#$ff,$bfd300
;		move.b	#$03,$bfe201
;		move.b	#$7f,$bfec01
;		move.b	#$00,$bfee01	;cra= port input
;		move.b	#$88,$bfed01	;icr= sp is allowed
;		rts

;------	Keyboard IRQ ----------------------------------------

;KeyboardIRQ:	movem.l	d0-d7/a0-a4,-(sp)
;		move.b	$bfed01,d0
;		and.b	#%10001000,d0
;		beq.s	no_key
;		moveq	#15,d1
;key_time:	move.b	#$40,$bfee01
;		dbra	d1,key_time
;		clr.b	$bfee01			;cra input
;get_raw:	move.b	$bfec01,d0
;		beq.s	no_key
;		not.b	d0
;		lsr.b	#1,d0
;		move.b	d0,key
;		bra.s	end_key
;no_key:		clr.b	key-d(a5)
;end_key:	move.w	#$8,$9c(a6)		;clear intreq
;		movem.l	(sp)+,d0-d7/a0-a4
;		rte

even
;-------------------------------------------------------------------
; 	objects
;-------------------------------------------------------------------

;------	Point Coords -----------------------------------------------

object2a:			;
				;
dc.w	15			; Number of Points
dc.w	-250,0250,0150,	0	; 3 Coords + 1 Fillbyte (Shift!!)
dc.w	-250,-250,0150,	0	;
dc.w	0250,0250,0150,	0	;
dc.w	0250,-250,0150,	0	;
				;
dc.w	-200,0200,0000,	0	; 3 Coords + 1 Fillbyte (Shift!!)
dc.w	-200,-200,0000,	0	;
dc.w	0200,0200,0000,	0	;
dc.w	0200,-200,0000,	0	;
				;
dc.w	-150,0150,0150,	0	; 3 Coords + 1 Fillbyte (Shift!!)
dc.w	-150,-150,0150,	0	;
dc.w	0150,0150,0150,	0	;
dc.w	0150,-150,0150,	0	;
				;
dc.w	-100,0100,0075,	0	; 3 Coords + 1 Fillbyte (Shift!!)
dc.w	-100,-100,0075,	0	;
dc.w	0100,0100,0075,	0	;
dc.w	0100,-100,0075,	0	;

;------	Line Table  -----------------------------------------------

object2b:				;
					;
dc.b	1,2,$ff,3,$ff,3,$ff,$ff		;
dc.b	5,6,$ff,7,$ff,7,$ff,$ff		;
dc.b	9,10,$ff,11,$ff,11,$ff,$ff	;
dc.b	13,14,$ff,15,$ff,15		;
					;
dc.b	-2				; End of Table!!

; ------------------------------------------------------------------ 
; ------ data section ----------------------------------------------
; ------------------------------------------------------------------ 
even

;------	Copperlist --------------------------------------------

newcopper:	

	dc.w $0102,$0000
	dc.w $2b09,$fffe,$0180,$0002	;

;------	LogoPlanes ----------------------------

	dc.w $0184,$0fff,$0186,$0fff	; LogoColors
	dc.w $0188,$0296,$018a,$0296	;
	dc.w $018c,$03b8,$018e,$03b8	;

LogoBPL:dc.w $00e4,$0000,$00e6,$0000	;
	dc.w $00e8,$0000,$00ea,$0000	;
	dc.w $00ec,$0000,$00ee,$0000	;
	dc.w $0100,$4200		; 4 Planes (Vector+Logo)

	dc.w $7909,$fffe,$0100,$1200	;

	dc.w $0102,$0001
	dc.w $0184,$0888,$0186,$0888	; FontColors
	dc.w $0188,$0444,$018a,$0444	;
	dc.w $018c,$0666,$018e,$0666	;

;------	TextPlanes --------------------------

	dc.w $00e4,$0007,$00e6
bitplane:
	dc.w $0000
	dc.w $00e8,$0007,$00ea,$0000
	dc.w $7a09,$fffe,$0100,$3200

	dc.w $ff09,$fffe		;
	dc.w $0100,$0200		; Planes off
	dc.w $0180,$0000		;

	dc.w $ffff,$fffe

;------	Sinus Table -------------------------------------------

sintab:	dc.w $0000,$0004,$0009,$000d,$0012,$0016,$001b,$001f	;
	dc.w $0024,$0028,$002c,$0031,$0035,$003a,$003e,$0042	;
	dc.w $0047,$004b,$004f,$0053,$0058,$005c,$0060,$0064	;
	dc.w $0068,$006c,$0070,$0074,$0078,$007c,$0080,$0084	;
	dc.w $0088,$008b,$008f,$0093,$0096,$009a,$009e,$00a1	;
	dc.w $00a5,$00a8,$00ab,$00af,$00b2,$00b5,$00b8,$00bb	;
	dc.w $00be,$00c1,$00c4,$00c7,$00ca,$00cc,$00cf,$00d2	;
	dc.w $00d4,$00d7,$00d9,$00db,$00de,$00e0,$00e2,$00e4	;
	dc.w $00e6,$00e8,$00ea,$00ec,$00ed,$00ef,$00f1,$00f2	;
	dc.w $00f3,$00f5,$00f6,$00f7,$00f8,$00f9,$00fa,$00fb	;
	dc.w $00fc,$00fd,$00fe,$00fe,$00ff,$00ff,$00ff,$0100	;
	dc.w $0100,$0100					;

;------	DMA, IRQ Crap --------------------------------------------

dmaen:		dc.w $8000		; store dma bits here
intena:		dc.w $8000		; store int enable bits here
oldint:		dc.l 0			; store oldint vector

;------	Memory Ptr's ---------------------------------------------

actionplane1:	dc.l $65000		;
actionplane2:	dc.l $67260		;

sin:		dc.l $6a000		; sintab here
cos:		dc.l $6a0b4		;

key:		dc.b	0		; here's the current Key
even
sinptr:		dc.l $6a000		;

;------	3D Definitions -------------------------------------------

distance:	dc.w 700		; view distance
xangle:		dc.w 0			;
yangle:		dc.w 0			;
zangle:		dc.w 0			;

;------	External Data -----------------------------------------

Logo:	INCBIN "df1:LOGO1.BITM"		; Logo

precalculate:
	lea	bild1(pc),a0		;

	swap	d0
	lea	bitplane(pc),a1
	move.w	d0,-4(a1)
	move.w	d0,4(a1)
	swap	d0

	move.w	#$2800,d1
	move.l	d0,(a0)+
	add.w	d1,d0
	move.l	d0,(a0)+
	add.w	d1,d0
	move.l	d0,(a0)+
	add.w	#$4000,d0
	move.l	d0,(a0)+

	lea	textpos(pc),a0
	lea	text(pc),a1
	move.l	a1,(a0)

	move.l	datas(pc),a0

	moveq	#31,d5
	move.l	#1000,d4
PreLoop_3:
	moveq	#15,d1
	move.w	#-128,d3
PreLoop_2:
	moveq	#15,d0
	move.w	#-128,d2
PreLoop_1:
	movem.w	d1-d3,-(sp)

	muls	#1000,d2
	muls	#1000,d3

	divs	d4,d2
	divs	d4,d3

	add.w	#128,d2
	add.w	#128,d3
	move.b	d2,(a0)+
	move.b	d3,(a0)+

	movem.w	(sp)+,d1-d3		

	add.w	#16,d2
	dbra	d0,PreLoop_1

;	move.w	d1,$dff180

	add.w	#16,d3
	dbra	d1,PreLoop_2

	add.w	#80,d4
	dbra	d5,PreLoop_3


	lea	bobs(pc),a0
	lea	ascII(pc),a1

	moveq	#127,d1
qloop:
	moveq	#0,d0
	move.b	(a0),d0
	move.b	0(a1,d0.w),(a0)+
	dbra	d1,qloop

precalculate2:

	move.l	bob(pc),a0
	move.l	datas(pc),a1
	lea	font(pc),a2

	moveq	#39,d6
four:
	move.l	a0,-(sp)

	move.w	#255,d0
pre_1:	clr.w	(a0)+
	dbra	d0,pre_1

	move.l	(sp)+,a0


;disassemble char

	lea	little_screen(pc),a3

	moveq	#15,d0
OUTSide_loop:
	moveq	#15,d1
	move.w	(a2)+,d2
Inner_loop:
	clr.b	(a3)
	roxl.w	#1,d2
	bcc.s	o_k
	move.b	#-1,(a3)
o_k:	addq.l	#1,a3

	dbra	d1,Inner_loop

	dbra	d0,OutSide_loop

	moveq	#15,d0
	move.l	a1,a4
three:
	lea	little_screen(pc),a3
	moveq	#15,d1
two:
	moveq	#15,d2
one:
	tst.b	(a3)+
	beq.s	nothing_to_set

	moveq	#0,d3
	moveq	#0,d4
	move.b	(a4),d3
	move.b	1(a4),d4

;	addq.b	#8,d3
;	addq.b	#8,d4
	lsr.b	#4,d3
	lsr.b	#3,d4
	and.b	#$1e,d4

	move.w	#$8000,d5
	lsr.w	d3,d5
	or.w	d5,(a0,d4.w)

nothing_to_set:
	addq.w	#2,a4
	dbra	d2,one

;	move.w	d1,$dff180
	dbra	d1,two

	lea	512(a4),a4
	lea	32(a0),a0

	dbra	d0,three

	dbra	d6,four

	move.l	a0,bobend

	rts

little_screen:	blk.b 16*16,0

bild1:		dc.l $70000
bild2:		dc.l $72800
datas:		dc.l $75000
bob:		dc.l $79000
bobend:		dc.l 0
irqs:		dc.l newirq1-start
		dc.l newirq2-start
		dc.l newirq35-start
		dc.l newirq3-start
		dc.l newirq4-start

irq_to_take:	dc.w 0
zustand:	dc.w 0

newirq:	movem.l	a0-a6/d0-d7,-(sp)

	moveq	#0,d0
	lea	irqs(pc),a0
	move.w	irq_to_take(pc),d0
	add.w	d0,d0
	add.w	d0,d0
	move.l	(a0,d0.w),a0
	lea	start(pc),a1
	jsr	(a0,a1)

	jsr	PLAY

	movem.l	(sp)+,a0-a6/d0-d7
	move.w	#$20,$dff09c
	rte

newirq1:moveq	#1,d6
	moveq	#-1,d7
	bra	newirq5

newirq2:
	lea	$dff182,a4
	lea	color(pc),a0
	move.w	(a0),(a4)
	cmp.w	#$00b,(a0)
	beq.s	okcol
	add.w	#$001,(a0)
okcol:
	lea	zustand(pc),a0
	move.w	#1,(a0)
okcol3:	bsr	scroller

	lea	$dff000,a6
	lea	d(pc),a5

tw:	btst	#6,$2(a6)
	bne.s	tw

	movem.l	a0-a6/d0-d7,-(sp)

	bsr	vertblirq

	movem.l	(sp)+,a0-a6/d0-d7

	rts

newirq35:
	lea	$dff182,a4
	lea	color(pc),a0
	move.w	(a0),(a4)
	cmp.w	#$002,(a0)
	beq.s	okcol2
	sub.w	#$001,(a0)

	bra.s	okcol3	
okcol2:
	lea	zustand(pc),a0
	move.w	#10,(a0)	
	lea	irq_to_take(pc),a0
	addq.w	#1,(a0)

	bra.s	clrlowscrl

color:	dc.w 2

newirq3:moveq	#-1,d6
	moveq	#56,d7
	bra	newirq5

newirq4:lea	zustand(pc),a0
	move.w	#11,(a0)

	rts

clrlowscrl:
	lea	$dff000,a6

	move.l	bild2(pc),a0
	lea	123*40(a0),a0
	move.l	a0,$54(a6)
	clr.w	$66(a6)
	move.l	#$01000000,$40(a6)
	move.w	#36*64+20,$58(a6)

	rts
scroller:
	bsr	clrlowscrl

	move.l	datas(pc),a0
	move.l	a0,a4

	lea	scrollcords(pc),a1
	lea	scrollflags(pc),a2
	lea	deepscroll(pc),a3
	add.w	-2(a3),a3

	moveq	#0,d0
	move.b	(a2),d0
	add.w	d0,d0

	moveq	#15,d1
zomp:
	moveq	#0,d2
	move.b	(a3)+,d2
	add.w	d2,d2
	lsl.w	#8,d2

	move.b	(a0,d2.w),d3
	add.w	d0,d2
	move.b	(a4,d2.w),d4
	lsr.b	#4,d4
	add.b	d4,d3

	move.b	d3,(a1)+

	sub.w	d0,d2
	add.w	#14*20-11,d2		; y des Scrollers
	move.b	(a4,d2.w),(a1)+

	addq.w	#2,a0

	dbra	d1,zomp
wait_blit:
	btst	#6,2(a6)
	bne.s	wait_blit

	moveq	#36,d0
	move.w	d0,$66(a6)
	move.w	d0,$62(a6)
	move.w	#-2,$64(a6)
	clr.w	$42(a6)

	lea	scroll(pc),a0
	lea	deepscroll(pc),a1
	add.w	-2(a1),a1
	move.l	bob(pc),a2
	lea	scrollcords(pc),a3
	lea	bild1(pc),a5

	moveq	#15,d6
S1et_Loop1:
	move.l	bob(pc),a2

	move.b	(a0)+,d0		;(im Normalbetrieb)
	lsl.w	#4,d0

	move.b	(a1)+,d5		;gleich wie oben
	lsr.b	#1,d5
	add.b	d5,d0
	lsl.w	#5,d0
	add.w	d0,a2

	moveq	#0,d0
	moveq	#0,d1

	move.b	(a3)+,d0
	move.b	(a3)+,d1

	move.l	4(a5),a4

;now its time to set the bob ! d0=x ; d1=y ; a2=bob ; a0=plane

	addq.l	#2,a4

	subq.w	#6,d1

moveq	#-1,d5
clr.w	d5
;	move.l	#$ffff0000,d5

	move.l	d0,d2
	move.l	d1,d3

	lsl.w	#5,d1			; mulu #40,d1
	lsl.w	#3,d3
	add.w	d1,d3
	add.w	d3,a4


	and.l	#$f,d2
	swap	d2
	lsr.l	#4,d2
	or.w	#$dfc,d2

	lsr.w	#3,d0
	and.w	#$fe,d0
	add.w	d0,a4

;	move.w	#$f0,$180(a6)

b1lit:	btst	#6,$2(a6)
	bne.s	b1lit

	move.l	d5,$44(a6)
	move.w	d2,$40(a6)
	move.l	a4,$4c(a6)
	move.l	a2,$50(a6)
	move.l	a4,$54(a6)

	move.w	#16*64+2,$58(a6)

	dbra	d6,S1et_Loop1

	lea	scrollflags(pc),a0
	subq.b	#2,(a0)
	bpl.s	fuckoff
	add.b	#16,(a0)
	lea	scroll(pc),a0
	move.l	a0,a1
	addq.w	#1,a1
	moveq	#14,d0
fof:	move.b	(a1)+,(a0)+
	dbra	d0,fof
	lea	textpos(pc),a1
	move.l	(a1),a2
takeag:	moveq	#0,d1
	move.b	(a2)+,d1
;	cmp.b	#-1,d1
;	bne.s	notfini
bpl.s	notfini
	lea	text(pc),a2
	bra.s	takeag
notfini:lea	ascII(pc),a3
	move.b	(a3,d1.w),d1
	move.b	d1,(a0)
	move.l	a2,(a1)
fuckoff:
	lea	deepscrolloffset(pc),a0
	addq.w	#1,(a0)
	cmp.w	#lenght,(a0)
	bne.s	fuckoff2
	clr.w	(a0)
fuckoff2:
	rts

textpos:dc.l 0
scrollcords:
	blk.b 32,0
scrollflags:
	dc.b 15,0
deepscrolloffset:
	dc.w 0
deepscroll:

	dc.b	$00,$01,$03,$04,$06,$07,$09,$0A,$0C,$0D,$0F,$10,$11,$13,$14,$15
	dc.b	$16,$17,$18,$19,$1A,$1A,$1B,$1C,$1C,$1D,$1D,$1D,$1D,$1D,$1D,$1D
	dc.b	$1D,$1D,$1D,$1C,$1C,$1B,$1A,$1A,$19,$18,$17,$16,$15,$14,$13,$11
	dc.b	$10,$0F,$0D,$0C,$0A,$09,$07,$06,$04,$03,$01,$00

lenght = * - deepscroll
deepscrollend:

	dc.b	$00,$01,$03,$04,$06,$07,$09,$0A,$0C,$0D,$0F,$10,$11,$13,$14,$15
	dc.b	$16,$17,$18,$19,$1A,$1A,$1B,$1C,$1C,$1D,$1D,$1D,$1D,$1D,$1D,$1D
	dc.b	$1D,$1D,$1D,$1C,$1C,$1B,$1A,$1A,$19,$18,$17,$16,$15,$14,$13,$11
	dc.b	$10,$0F,$0D,$0C,$0A,$09,$07,$06,$04,$03,$01,$00

even
scroll:	blk.b 16,39

newirq5:movem.l a0-a6/d0-d7,-(sp)		;REGs retten

	move.l	actionplane1(pc),$dff0e0

	lea	$dff000,a6
	lea	bild1(pc),a5
	movem.l	(a5)+,d0-d1
	exg	d0,d1
	movem.l	d0-d1,-(a5)

	lea	bitplane(pc),a0
	move.w	6(a5),(a0)
	move.w	6(a5),8(a0)
	add.w	#40,(a0)

	move.l	(a5),a1
	add.w	#16*40+4,a1
	move.l	a1,$54(a6)
	move.w	#8,$66(a6)
	move.l	#-1,$44(a6)
	clr.w	$42(a6)
	move.w	#$100,$40(a6)

	move.w	#112*64+16,$58(a6)


	lea	deep(pc),a0
	moveq	#16*7+1,d0			; 16*8-1
next_e:	sub.b	d6,(a0)
	cmp.b	(a0),d7
	bne.s	next_d
	add.b	d6,(a0)
next_d:
	addq.l	#1,a0
	dbra	d0,next_e


wblit:	btst	#6,$2(a6)
	bne.s	wBlit

;	move.w	#$300,$dff180

	bsr	setbobs

	lea	deep(pc),a0
	tst.b	112(a0)
	bne.s	o_k2

	lea	irq_to_take(pc),a0
	addq.w	#1,(a0)
	bra	o_k3
o_k2:
	cmp.b	#55,112(a0)
	bne.s	o_k3

	lea	irq_to_take(pc),a0
	addq.w	#1,(a0)

o_k3:

	movem.l (sp)+,a0-a6/d0-d7		;REGs zur№ck

	rts

setbobs:moveq	#36,d0
	move.w	d0,$66(a6)
	move.w	d0,$62(a6)
	move.w	#-2,$64(a6)
	clr.w	$42(a6)

	lea	bobs(pc),a0
	lea	deep(pc),a1
	move.l	bob(pc),a2
	move.l	datas(pc),a3
	add.l	#16*2*2,a3

	moveq	#6,d7
Set_Loop2:
	moveq	#15,d6
Set_Loop1:

	movem.l	a2-a4/d6-d7,-(sp)

	lsl.w	#4,d7
	add.w	d7,d6

	cmp.b	#32,(a1,d6.w)
	bpl.L	nobob

	move.b	(a0,d6.w),d0		;(im Normalbetrieb)
;	move.b	(a0),d0			;(fuer Test)

	lsl.w	#4,d0

	move.b	(a1,d6.w),d5		;gleich wie oben
;	move.b	(a1),d5
	move.b	d5,d4
	lsr.b	#1,d5
	add.b	d5,d0

	lsl.w	#5,d0
	add.w	d0,a2

	moveq	#0,d0
	move.b	(a1,d6.w),d0		;gleich wie oben
;	move.b	(a1),d0
	lsl.w	#8,d0
	add.w	d6,d0
	add.w	d0,d0

	add.w	d0,a3

	moveq	#0,d0
	moveq	#0,d1

	move.b	(a3)+,d0
	move.b	(a3)+,d1

	move.l	(a5),a4

;now its time to set the bob ! d0=x ; d1=y ; a2=bob ; a0=plane

	sub.b	d4,d0
	sub.b	d4,d0
	sub.b	d4,d1
	sub.b	d4,d1

	addq.l	#4,a4

	sub.w	#16,d1

;	move.w	#$f00,$180(a6)

	move.l	#$ffff0000,d5

	move.l	d0,d2
	move.l	d1,d3

	lsl.w	#5,d1			; mulu #40,d1
	lsl.w	#3,d3
	add.w	d1,d3
	add.w	d3,a4


	and.l	#$f,d2
	swap	d2
	lsr.l	#4,d2
	or.w	#$dfc,d2

	lsr.w	#3,d0
	and.w	#$fe,d0
	add.w	d0,a4

;	move.w	#$f0,$180(a6)

blit:	btst	#6,$2(a6)
	bne.s	blit

	move.l	d5,$44(a6)
	move.w	d2,$40(a6)
	move.l	a4,$4c(a6)
	move.l	a2,$50(a6)
	move.l	a4,$54(a6)

	move.w	#16*64+2,$58(a6)

nobob:
	movem.l	(sp)+,a2-a4/d6-d7

	dbra	d6,Set_loop1
	dbra	d7,Set_loop2

	rts

test:	dc.l 0,0,0

ASCII:
	dc.b 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36
	dc.b 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36
	dc.b 39,38,36,36,36,36,36,36,36,36,36,36,37,36,36,36
	dc.b 35,26,27,28,29,30,31,32,33,34,39,36,36,36,36,36
	dc.b 36,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14
	dc.b 15,16,17,18,19,20,21,22,23,24,25,36,36,36,36,36
	dc.b 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36
	dc.b 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36

text:	dc.b "                  "
	dc.b "THE UNTOUCHABLE CLASSIC PRESENTS "
  	dc.b " SPEEDBALL II.....     CALL OUR BOARDS AT"
	dc.b "   PURGATORY WHQ  203.225.5482     "
	dc.b "  MADHOUSE  313.689.1728       MARTYRIUM  713.946.5141"
	dc.b "       PIRATES SHIP  515.277.1906       "
	dc.b "DOWNTOWN  31/575029313       LINE TO HEAVEN  41/62260277"
	dc.b "       THE LIGHT BOARD  44/815716025"
	dc.b "       INNER CIRCLE  46/31304142"
	dc.b "       RED AND BLACK  39/59651693"
	dc.b "      OR WRITE TO...   CLASSIC EUROPE  /  ARSNAS 12621"
	dc.b "  /  44297 KODE  /  SWEDEN    OR    CLASSIC USA"
	dc.b "  /  PO.BOX 814  /  UNION LAKE,MI 48387  /  USA    "
	dc.b "       SEE YOU GUYS LATER....                   "
	dc.b -1

bobs:
	dc.b "    PRESENTS    "
	dc.b "                "		;3
	dc.b "  SPEEDBALL II  "		;4
	dc.b "                "		;5
	dc.b "   CRACKED BY   "		;6
	dc.b "   RINGO STAR   "		;7
	dc.b "                "		;8

deep:	
	dc.b 31,32,33,34,35,36,38,39,40,41,42,43,44,45,46,47
	dc.b 32,33,34,35,36,38,39,40,41,42,43,44,45,46,47,48
	dc.b 33,34,35,36,38,39,40,41,42,43,44,45,46,47,48,49
	dc.b 34,35,36,38,39,40,41,42,43,44,45,46,47,48,49,50
	dc.b 35,36,38,39,40,41,42,43,44,45,46,47,48,49,50,51
	dc.b 36,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52
	dc.b 38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53
	dc.b 54,54
even
						;Neuer COPPER
font:	INCBIN "df1:zoom_font"

Sound:	INCBIN "df1:TURRICAN2"			; Turrican Soundtrack
SoundEnd:
