	;Hellfire - Cracktro
	;
	;By Jobbo 03/07/95

	Section	MainCode,Code

	Incdir	Sources:Includes/
	Include	Hardware.i
	Include	StartUpOCS.i
	Include	ProRunner.i
	Incdir	Sources:Cracktro/


Main	Move.l	#textBitmap,d0					;Set up text bpls
	MoveQ	#2-1,d1
	Move.w	#28,d2
	Lea	bplPtrs+3*8,a0
	Bsr	SetUpBplPtrs

	Bsr	ScreenDB					;Set up background bpls
	Bsr	SetUpBGColour					;Set up copper background

	Move.l	#module,pr_module				;Set up music replay
	Move.w	#0,pr_startposition
	Bsr	pr_init		

	Lea	CUSTOM,a6
	Move.l	VBRReg(PC),a0
	Lea	$6c(a0),a0
	Move.l	#Level3,(a0)					;New Level3 handler
	Move.w	#SETIT+DMAEN+BPLEN+COPEN+BLTPRI+BLTEN,DMACON(a6);DMA - ON
	Move.w	#SETIT+INTEN+VERTB,INTENA(a6)			;VBI interrupt - ON
	Move.l	#copList,COP1LCH(a6)				;Point copper at list
	Move.l	#copCust,COP2LCH(a6)
	Move.w	#0,COPJMP1(a6)					;Strobe to start

	Move.w	#2,fadeSpeed
	MoveQ	#16*2-1,d0
.forFadeIn
	Move.w	d0,-(SP)
	Bsr	VWait
	Bsr	InsertPalette
	Bsr	BlitTwirl
	Bsr	ScreenDB
	Bsr	FadeToPalette
	;Move.w	#$080,COLOR00(a6)
	Move.w	(SP)+,d0
	Dbf	d0,.forFadeIn

.mouseWait
	Bsr	VWait
	Bsr	BlitTwirl
	Bsr	ScreenDB
	;Move.w	#$080,COLOR00(a6)
	Btst	#6,CIAAPRA
	Bne.s	.mouseWait

	Move.w	#-1,pr_musicfadedirection
	Move.w	#-1,twirlCounter
	Move.w	#-1,clearCounter
	Move.w	#2,fadeSpeed
	MoveQ	#16*2+16-1,d0
.forFadeOut
	Move.w	d0,-(SP)
	Bsr	VWait
	Bsr	InsertPalette
	Bsr	BlitTwirl
	Bsr	ScreenDB
	Bsr	FadeToBlack
	;Move.w	#$080,COLOR00(a6)
	Move.w	(SP)+,d0
	Dbf	d0,.forFadeOut

	Bsr	pr_end
	Move.w	#INTEN,INTENA(a6)				;Stop Interrupts
	Rts


;======================================================================================================


	;VBI Interrupt server, plays music. And if CustIntPtr is
	;non-zero then the subroutine it points to will be called.
	;
	;Restores all
	;---------------------------------------------------------

vTimer		Dc.l	0
custIntPtr	Dc.l	TextWriter

Level3	MoveM.l	d0-a6,-(SP)

	Bsr	pr_music
	
	AddQ.b	#1,vBlank
	AddQ.l	#1,vTimer

	Tst.l	custIntPtr
	Beq.s	.nil
	MoveM.l	d0-a6,-(SP)
	Move.l	custIntPtr,a0
	Jsr	(a0)
	MoveM.l	(SP)+,d0-a6
.nil	
	Lea	CUSTOM,a6
	Move.w	#VERTB,INTREQ(a6)				;Clear interrupt request bit
	MoveM.l	(SP)+,d0-a6
	Rte


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


	;Waits one vertical blank
	;
	;Corrupts: None
	;------------------------

vBlank	Dc.b	0
	Even

VWait	Clr.b	vBlank
.wait	Tst.b	vBlank
	Beq.s	.wait
	Rts

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


	;Set-up bitplane pointers in copper list.
	;
	;Corrupts: d0-d1
	;----------------------------------------
	;PRE: d0.l -> Start of bpl data
	;     d1.w =  Counter for no of bpls - 1
	;     d2.l =  Bytes between planes
	;     a0.l -> BplPtrs in copper list
	
SetUpBplPtrs
	Move.w	d0,2(a0)					;High word of bpl pointer
	Swap	d0
	Move.w	d0,6(a0)					;Low word of bpl pointer
	Swap	d0
	Add.l	d2,d0						;Next bpl start
	AddQ	#8,a0						;Next ptr in copper list
	Dbf	d1,SetUpBplPtrs
	Rts


;======================================================================================================


SetUpBGColour
	Lea	copCust,a0

	Move.l	#$2c57fffe,d4
	Move.l	#$01800000,d5
	Move.l	#$2cc7fffe,d6
	Move.l	#$01800000,d7

	Move.l	d4,(a0)+
	Move.l	d5,(a0)+
	Move.l	d6,(a0)+
	Move.l	d7,(a0)+
	Add.l	#$01000000,d4
	Add.l	#$01000000,d6

	Sub.l	#$00020000,d4
	Move.w	#198-1,d3
.forLns	Move.l	d4,(a0)+
	Move.l	d5,(a0)+
	Move.l	d6,(a0)+
	Move.l	d7,(a0)+
	Add.l	#$01000000,d4
	Add.l	#$01000000,d6
	Dbf	d3,.forLns

	Add.l	#$00020000,d4
	Move.l	d4,(a0)+
	Move.l	d5,(a0)+
	Move.l	d6,(a0)+
	Move.l	d7,(a0)+

	Move.l	#$fffffffe,(a0)	
	Rts


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


InsertPalette
	Lea	currentPalette,a0
	Lea	colours+6,a1
	Lea	copCust+6,a2
	Move.w	(a0)+,d7
	
	MoveQ	#30-1,d0
.forPal	Move.w	(a0)+,(a1)
	AddQ	#4,a1
	Dbf	d0,.forPal
	Move.w	(a0)+,d6
	Move.w	d6,(a1)
	AddQ	#4,a1

	Move.w	d6,(a2)
	Lea	16(a2),a2
	Move.w	#198/9-1,d1
.forLns	MoveQ	#9-1,d0
.forMvs	Move.w	d7,(a2)
	Lea	16(a2),a2
	Dbf	d0,.forMvs
	Dbf	d1,.forLns
	Move.w	d6,(a2)

	Rts


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


fadeSpeed	Dc.w	0
fadeCounter	Dc.w	0

FadeToPalette
	AddQ.w	#1,fadeCounter
	Move.w	fadeCounter(PC),d0
	Cmp.w	fadeSpeed,d0
	Blt.s	.exit
	Move.w	#0,fadeCounter	
	Lea	palette(PC),a0
	Lea	currentPalette,a1
	
	MoveQ	#0,d3
	MoveQ	#0,d4
	MoveQ	#32-1,d0
.forCuls
	Move.w	(a0)+,d1
	Move.w	(a1)+,d2
	Cmp.w	d2,d1
	Beq.s	.skip
	
	Move.w	d2,d7
	Move.b	d1,d3
	Move.b	d2,d4
	Move.b	d1,d5
	Move.b	d2,d6
	Lsr.w	#8,d1
	Lsr.w	#8,d2
	And.b	#$f0,d3
	And.b	#$f0,d4
	And.b	#$0f,d5
	And.b	#$0f,d6

	Cmp.b	d2,d1
	Beq.s	.redOk
	Bgt.s	.redBig
	Sub.w	#$100,d7
	Bra.s	.redOk
.redBig	Add.w	#$100,d7
.redOk	Cmp.w	d4,d3
	Beq.s	.grnOk
	Bgt.s	.grnBig
	Sub.b	#$010,d7
	Bra.s	.grnOk
.grnBig	Add.b	#$010,d7
.grnOk	Cmp.b	d6,d5
	Beq.s	.bluOk
	Bgt.s	.bluBig
	SubQ	#$001,d7
	Bra.s	.bluOk
.bluBig	AddQ	#$001,d7
.bluOk
	Move.w	d7,-2(a1)
.skip	Dbf	d0,.forCuls	

.exit	Rts

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

FadeToBlack
	AddQ.w	#1,fadeCounter
	Move.w	fadeCounter(PC),d0
	Cmp.w	fadeSpeed,d0
	Blt.s	.exit
	Move.w	#0,fadeCounter
	Lea	currentPalette,a1
	
	MoveQ	#32-1,d0
.forCuls
	Move.w	(a1)+,d1
	Tst.w	d1
	Beq.s	.skip
	
	Move.w	d1,d7
	Move.b	d1,d2
	Move.b	d1,d3
	Lsr.w	#8,d1
	And.b	#$f0,d2
	And.b	#$0f,d3

	Tst.b	d1
	Beq.s	.redOk
	Sub.w	#$100,d7
.redOk	Tst.b	d2
	Beq.s	.grnOk
	Sub.w	#$010,d7
.grnOk	Tst.b	d3
	Beq.s	.blueOk
	SubQ	#$001,d7
.blueOk
	Move.w	d7,-2(a1)
.skip	Dbf	d0,.forCuls	

.exit	Rts


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


TEXTSTARTOFFSET	Equ	28*7*2
PAUSETIME	Equ	21*3+50*7

xOffset		Dc.w	0
lineOffset	Dc.l	textBitmap+TEXTSTARTOFFSET
charPtr		Dc.l	message
clearCounter	Dc.w	32
clearLineOffset	Dc.l	textBitmap+TEXTSTARTOFFSET


TextWriter
	Tst.w	clearCounter
	Blt.s	.endClear
	Beq.s	.nextChar
	SubQ.w	#1,clearCounter
	Cmp.w	#21*3,clearCounter
	Bge.s	.paused
.endClear
	Move.l	clearLineOffset(PC),a0
	Cmp.l	#textBitmap+TEXTSTARTOFFSET+28*3*2*21*3,a0		;Ugh!
	Bge.s	.paused
	Add.l	#28*3*2,clearLineOffset
	MoveQ	#3*2-1,d0
.forLgs
	REPT	7
	Clr.l	(a0)+
	ENDR
	Dbf	d0,.forLgs
.paused	Rts

.nextChar
	Move.l	#textBitmap+TEXTSTARTOFFSET,clearLineOffset
	Move.l	charPtr(PC),a0
	AddQ.l	#1,charPtr
	MoveQ	#0,d0
	Move.b	(a0),d0
	Bne.s	.notEOT
	Clr.w	xOffset							;End of Text
	Move.l	#textBitmap+TEXTSTARTOFFSET,lineOffset
	Move.l	#message,charPtr
	Move.w	#PAUSETIME,clearCounter
	Move.l	#textBitmap+TEXTSTARTOFFSET,clearLineOffset
	Rts
.notEOT	Cmp.b	#1,d0
	Bne.s	.notEOL
	Clr.w	xOffset							;End of Line
	Add.l	#28*9*2,lineOffset
	Bra.s	.nextChar
.notEOL	Cmp.b	#2,d0
	Bne.s	.notEOP
	Clr.w	xOffset							;End of Page
	Move.l	#textBitmap+TEXTSTARTOFFSET,lineOffset
	Move.w	#PAUSETIME,clearCounter
	Move.l	#textBitmap+TEXTSTARTOFFSET,clearLineOffset
	Rts
.notEOP	Cmp.b	#" ",d0							;Space char
	Bne.s	.notSpace
	AddQ.w	#1,xOffset
	Bra	.nextChar
.notSpace

	;Draw Char

	Lea	font(PC),a0
	Move.l	lineOffset(PC),a1
	Add.w	xOffset(PC),a1
	AddQ.w	#1,xOffset
	Sub.w	#" ",d0
	Mulu	#12*2*2,d0
	Add.w	d0,a0
	MoveQ	#12-1,d0
.forLns	Move.l	(a0)+,d1
	Move.l	d1,d2
	Swap	d2
	Or.w	d1,d2
	Not.w	d2
	Ror.w	#8,d2
	Ror.w	#8,d1
	And.b	d2,(a1)
	Or.b	d1,(a1)
	Rol.w	#8,d2
	Rol.w	#8,d1
	And.b	d2,1(a1)
	Or.b	d1,1(a1)
	Swap	d1
	Ror.w	#8,d2
	Ror.w	#8,d1
	And.b	d2,28(a1)
	Or.b	d1,28(a1)
	Rol.w	#8,d2
	Rol.w	#8,d1
	And.b	d2,28+1(a1)
	Or.b	d1,28+1(a1)
	Lea	28*2(a1),a1
	Dbf	d0,.forLns
	Rts

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

message	Include	Text.Asm


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


bitmapSrcPtr	Dc.l	bitmap2
bitmapDestPtr	Dc.l	bitmap1

ScreenDB
	Move.l	bitmapDestPtr(PC),d0
	Move.l	bitmapSrcPtr(PC),bitmapDestPtr
	Move.l	d0,bitmapSrcPtr

	Move.l	bitmapSrcPtr(PC),d0
	Add.l	#40*61*3+6,d0
	MoveQ	#3-1,d1
	MoveQ	#40,d2
	Lea	bplPtrs,a0
	Bsr	SetUpBplPtrs
	Rts


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


twirlCounter	Dc.w	0


BlitTwirl
	Lea	blitVals+880*4,a0
	Tst.w	twirlCounter
	Blt	.twirl

	AddQ.w	#1,twirlCounter
	Move.w	twirlCounter(PC),d0
	Cmp.w	#$40,d0
	Blt.s	.still
	Lea	blitVals+880*0,a0
	Cmp.w	#$100*1+$40*1,d0
	Blt	.twirl
	Lea	blitVals+880*1,a0
	Cmp.w	#$100*2+$40*1,d0
	Blt	.twirl
	Cmp.w	#$100*2+$40*2,d0
	Blt.s	.still
	Lea	blitVals+880*2,a0
	Cmp.w	#$80*1+$100*2+$40*2,d0
	Blt	.twirl
	Lea	blitVals+880*3,a0
	Cmp.w	#$80*2+$100*2+$40*2-1,d0
	Blt	.twirl
	Clr.w	twirlCounter
	Bra.s	.twirl

.still	Move.l	bitmapSrcPtr(PC),BLTAPTH(a6)
	Move.l	bitmapDestPtr(PC),BLTDPTH(a6)
	Move.l	#0,BLTAMOD(a6)
	Move.l	#$ffffffff,BLTAFWM(a6)
	Move.l	#$09f00000,BLTCON0(a6)
	Move.w	#320*3<<6+20,BLTSIZE(a6)
.bWait	Btst	#14,DMACONR(a6)
	Bne.s	.bWait
	Rts


.twirl
	MoveQ	#20-1,d0
.forBlits1
	Move.l	bitmapSrcPtr(PC),a1
	Move.l	bitmapDestPtr(PC),a2
	Add.l	(a0)+,a1
	Add.l	(a0)+,a2
	MoveM.l	a1/a2,BLTAPTH(a6)
	Move.l	(a0)+,BLTAMOD(a6)
	Move.l	(a0)+,BLTAFWM(a6)
	Move.l	(a0)+,BLTCON0(a6)
	Move.w	(a0)+,BLTSIZE(a6)
.bWait1	Btst	#14,DMACONR(a6)
	Bne.s	.bWait1
	Dbf	d0,.forBlits1

	MoveQ	#20-1,d0
.forBlits2
	Move.l	bitmapDestPtr(PC),a1
	Move.l	a1,a2
	Add.l	(a0)+,a1
	Add.l	(a0)+,a2
	MoveM.l	a1/a2,BLTAPTH(a6)
	Move.l	(a0)+,BLTAMOD(a6)
	Move.l	(a0)+,BLTAFWM(a6)
	Move.l	(a0)+,BLTCON0(a6)
	Move.w	(a0)+,BLTSIZE(a6)
.bWait2	Btst	#14,DMACONR(a6)
	Bne.s	.bWait2
	Dbf	d0,.forBlits2
	Rts

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

blitVals	
	Include	BlitVals.Asm


;======================================================================================================


	CNOP	0,4
font	Incbin	Font12x12x2.Raw

	CNOP	0,2
palette	Incbin	Palette.Raw

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

	Section	ChipStuff,Data_C

copList	Dc.w	$2001,$fffe
	Dc.w	DIWSTRT,$2db0
	Dc.w	DIWSTOP,$f391
	Dc.w	DDFSTRT,$0050
	Dc.w	DDFSTOP,$00b8
   
	Dc.w	BPLCON0,$5204
	Dc.w	BPLCON1,$0060
	Dc.w	BPLCON2,$007f
	Dc.w	BPLCON3,$0c00
	Dc.w	BPL1MOD,40*(3-1)+12
	Dc.w	BPL2MOD,28*(2-1)
	
bplPtrs	Dc.w	BPL1PTL,0,BPL1PTH,0,BPL3PTL,0,BPL3PTH,0,BPL5PTL,0,BPL5PTH,0
	Dc.w	BPL2PTL,0,BPL2PTH,0,BPL4PTL,0,BPL4PTH,0

colours	Dc.w	COLOR00,0,COLOR01,0,COLOR04,0,COLOR05,0			;Backgound colours (0..7)
	Dc.w	COLOR16,0,COLOR17,0,COLOR20,0,COLOR21,0
	Dc.w	COLOR10,0,COLOR11,0,COLOR14,0,COLOR15,0			;Text shadow colour (0..7)
	Dc.w	COLOR26,0,COLOR27,0,COLOR30,0,COLOR31,0
	Dc.w	COLOR02,0,COLOR03,0,COLOR06,0,COLOR07,0			;Text colour 1 (0..7)
	Dc.w	COLOR18,0,COLOR19,0,COLOR22,0,COLOR23,0
	Dc.w	COLOR08,0,COLOR09,0,COLOR12,0,COLOR13,0			;Text colour 2 (0..7)
	Dc.w	COLOR24,0,COLOR25,0,COLOR28,0,COLOR29,0

	;These sprites use COLOR29
	Dc.w	SPR6POS,$0057,SPR6CTL,$0001,SPR6DATB,$0000,SPR6DATA,$8000
	Dc.w	SPR7POS,$00c0,SPR7CTL,$0000,SPR7DATB,$0000,SPR7DATA,$0001

	Dc.w	COPJMP2,0						;Jump to COP2LC

	;----------------------------------------------------------------------------------------------
	
module	Incbin	MOD.GreenBeret

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

	CNOP	0,2
	Ds.b	40*10*3
bitmap1	Incbin	Pict320x320x3.Raw
	Ds.b	40*10*3

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

	Section	BSSChipStuff,BSS_C

	CNOP	0,2
	Ds.b	40*10*3
bitmap2	Ds.b	40*320*3
	Ds.b	40*10*3

	CNOP	0,2
textBitmap
	Ds.b	28*198*2
	
	CNOP	0,4
copCust	Ds.l	4*200+1

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

	Section	BSSStuff,BSS

	CNOP	0,2
currentPalette
	Ds.w	32