ùúùú  ÿû„¯ÿû„¯ÿû„¯ÿû„¯ÿû„¯ÿû„¯ÿû„¯ÿû„¯push	MACRO
	IFC	'\1',''
	  movem.l	d0-a6,-(sp)
	ELSE
	  IF	'\1'>'d7'
	    movem.l	\1,-(sp)
	  ELSE
	    move.l	\1,-(sp)
	  ENDC
	ENDC
	ENDM

pop	MACRO
	IFC	'\1',''
	  movem.l	(sp)+,d0-a6
	ELSE
	  IF	'\1'>'d7'
	    movem.l	(sp)+,\1
	  ELSE
	    move.l	(sp)+,\1
	  ENDC
	ENDC
	ENDM

LMBON	MACRO
	BTST	#6,$BFE001.L
	BEQ	\1
	ENDM

LMBONs	MACRO
	BTST	#6,$BFE001.L
	BEQ.S	\1
	ENDM

LMBOFF	MACRO
	BTST	#6,$BFE001.L
	BNE	\1
	ENDM

LMBOFFs	MACRO
	BTST	#6,$BFE001.L
	BNE.S	\1
	ENDM

RMBON	MACRO
	BTST	#10,$016(A6)
	BEQ	\1
	ENDM

RMBONs	MACRO
	BTST	#10,$016(A6)
	BEQ.S	\1
	ENDM

RMBOFF	MACRO
	BTST	#10,$016(A6)
	BNE	\1
	ENDM

RMBOFFs	MACRO
	BTST	#10,$016(A6)
	BNE.S	\1
	ENDM


InitIntro
	IFEQ	RELOCABLE
	lea	Variables,a5
	ELSE
	lea	Variables(PC),a5
	ENDIF
	lea	.VariablesAdr(PC),A0
	move.l	A5,(A0)
	move.l	4.w,a6
	cmp.w	#36,$14(a6)		;check library version
	bcs.s	.notkick20
	moveq	#-1,d1
	moveq	#0,d0
	jsr	-$288(a6)		;cashes off
	move.l	d0,initintroBSS|.OLDCASHE(a5)
	bsr	.cashekilled
	move.l	d0,-(sp)
	move.l	.VariablesAdr(PC),A5
	moveq	#-1,d1
	move.l	initintroBSS|.OLDCASHE(a5),d0
	move.l	4.w,A6
	jsr	-$288(a6)		;cashes on
	move.l	(sp)+,d0
	rts
.VariablesAdr:	DC.L	0

.notkick20:
.cashekilled:
;	move.l	4.w,a6
	suba.l	a4,a4
	btst	#0,297(a6)
	beq.s	.no68010
	lea	.VBRfunc(pc),a5
	jsr	-$1e(a6)
	move.l	.VariablesAdr(PC),A5
.no68010
	move.l	a4,initintroBSS|.VBR(a5)

	move.w	#[[IntroVariablesLen]-1],d1
	move.l	a5,a0
.clearBSS
	clr.b	(a0)+
	dbf	d1,.clearBSS

****	zapamiëtanie systemowego coppera

	move.l	378(a6),a0		;pointer to library list in execbase
	lea	.gfxname(pc),a1
	jsr	-$114(a6)		;FindName
	tst.l	d0
	bne.s	.gfxopened
	moveq	#103,d0
	rts
.gfxname
	dc.b	'graphics.library',0
	even

.gfxopened
	move.l	d0,a0
	move.l	$26(a0),initintroBSS|.Copper1(a5)

****	allocate memory for an intro

	lea	MemoriesLens(pc),a2
	lea	MemoriesAPTR(a5),a3
.alloc1	moveq	#0,d1
	move.l	(a2)+,d0
	beq.s	.allocOK
	bpl.s	.alloc2
	moveq	#2,d1
	neg.l	d0
.alloc2	bset	#16,d1			;OR MEMF_CLEAR
	jsr	-198(a6)		;AllocMem
	move.l	d0,(a3)+
	tst.l	d0
	bne.s	.alloc1
	bsr	InitIntroFreeMem
	moveq	#103,d0
	rts

.VBRfunc
	dc.l	$4e7a0801	;movec	vbr,d0
	move.l	d0,a4
	rte

	dc.w	1,2,8,7,3,4,0
.hufftable
.allocOK
InitIntroUnpackSinusHuff
	lea	InitIntroPackedSinusData(pc),a0
	move.l	MemoriesAPTR|.sinus0(a5),a1
	move.w	#2047,d7
	moveq	#1,d6
.1	moveq	#0,d0
.2	subq.w	#1,d6
	bne.s	.3
	move.w	(a0)+,d1
	moveq	#16,d6
.3	subq.w	#2,d0
	add.w	d1,d1
	bcc.s	.2
	move.w	InitIntro|.hufftable(pc,d0.w),(a1)+
	dbf	d7,.1

InitIntroUnpackSinusDelta
	moveq	#1,d7
	move.w	#2*$64,d1
.1	move.l	MemoriesAPTR|.sinus0(a5),a0
	move.w	#2047,d6
	sub.w	d7,d6
	add.l	d7,a0
	add.l	d7,a0
.2	move.w	(a0),d0
	lsr.w	#1,d0
	bcc.s	.3
	not.w	d0
.3	add.w	d0,d1
	move.w	d1,(a0)+
	dbf	d6,.2
	moveq	#0,d1
	dbf	d7,.1

****	remember custom chips status

	lea	$dff000.l,a6
	bsr	WaitBlit
	move.l	#$80008000,	d0
	move.w	2(a6),		initintroBSS|.DMACON(a5)
	or.w	d0,		initintroBSS|.DMACON(a5)
	move.l	$1c(a6),	initintroBSS|.INTENA(a5)
	or.l	d0,		initintroBSS|.INTENA(a5)
	not.l	d0
	move.l	d0,		$9a(a6)		;interrupts off
	bsr	.WaitVBlank
	move.w	#$07ff,		$96(a6)		;all DMA off
	move.w	#$83c0,$96(a6)			;turn on some DMA
						;blitter,copper,bitplanes
	IFEQ	RELOCABLE
	lea	BlindCopper,a0
	ELSE
	lea	BlindCopper(PC),a0
	ENDIF
	move.l	a0,initintroBSS|.BLINDcop(a5)
	move.l	a0,$80(a6)
	clr.w	$88(a6)

	move.l	initintroBSS|.VBR(a5),a0
	addq.w	#8,a0
	lea	initintroBSS|.INTVECTORS(a5),a1
	moveq	#[47-2],d0
.rememberInterruptVectors
	move.l	(a0)+,(a1)+
	dbf	d0,.rememberInterruptVectors
	bsr	KillSprites

****	wykonaj gîównâ czëôê programu

	lea	.killAGA_data(pc),a0
	moveq	#7-1,d1
.killAGA:
	move.w	(a0)+,d0
	move.w	(a0)+,0(a6,d0.w)
	dbf	d1,.killAGA

	bsr	StartTheRealProgram

****	opuôê program

	move.l	InitIntro|.VariablesAdr(PC),A5
	lea	$dff000.l,a6

	bsr	WaitBlit
	move.l	#$7fff7fff,$9a(a6)
	bsr	.WaitVBlank
	move.w	#$07ff,$96(a6)
	move.l	initintroBSS|.VBR(a5),a0
	addq.w	#8,a0
	lea	initintroBSS|.INTVECTORS(a5),a1
	moveq	#[47-2],d0
.InterruptVectorsBack
	move.l	(a1)+,(a0)+
	dbf	d0,.InterruptVectorsBack

	move.l	initintroBSS|.Copper1(a5),$80(a6)	;syscopper	back
	move.w	initintroBSS|.DMACON(a5), $96(a6)	;dma		back
	move.l	initintroBSS|.INTENA(a5), $9a(a6)	;interrupts	back
	clr.w	$88(a6)					;start copper0

	bsr	InitIntroFreeMem
	moveq	#0,d0
	rts

.killAGA_data
	dc.w	$1dc,32	;PAL
	dc.w	$106,$0c00
	dc.w	$10c,$0011
	dc.w	$1e4,$0000
	dc.w	$1fc,$0000
	dc.w	$1c6,$0000
	dc.w	$1c4,$0000	;7 regs

.WaitVBlank
	btst	#5,$1e+1(a6)
	beq.s	.WaitVBlank
	move.w	#$0020,$9c(a6)
	rts

KillSprites
	move.w	#$0020,$96(a6)
	moveq	#7,d0
	moveq	#0,d1
	lea	$144(a6),a0
.1	move.l	d1,(a0)
	addq.l	#8,a0
	dbf	d0,.1
	rts

InitIntroFreeMem
	move.l	4.w,a6
	lea	MemoriesLens(pc),a2
	lea	MemoriesAPTR(a5),a3
.free1	move.l	(a2)+,d0
	beq.s	WaitBlit|.freeRTS
	bpl.s	.free2
	not.l	d0
.free2	move.l	(a3)+,d1
	beq.s	.free1
	move.l	d1,a1
	jsr	-210(a6)			;FreeMem
	bra.s	.free1

WaitBlit
	btst	#6,2(a6)
.1	btst	#6,2(a6)
	bne.s	.1
.freeRTS
	rts

InitIntroPackedSinusData
 DC.L	$D294A529,$4D29A74F,$FFCB2CA6,$9E99794A,$69FCA529,$FCB34F2C,$A7F29A72
 DC.L	$94FCA7F3,$4CB3F9A4,$B29CA7E5,$394F94E5,$3E6929F2,$994F9F3E,$52529294
 DC.L	$94F2994E,$7CA4A79E,$5253CF3E,$6539494F,$39F329CF,$3CF39F33,$4539E799
 DC.L	$4CA4A653,$3CE79E67,$CCF28A73,$9E739E73,$949E799E,$7929CE73,$CE739E73
 DC.L	$9CA29CE7,$281020EE,$EF6952DE,$D2A54B4A,$FA97696F,$6952DEE9,$09777BBA
 DC.L	$425EDE90,$977B4B7D,$4BA425ED,$2D2A5DEE,$FB4B4B7D,$D2A5DF77,$DD2A5EF4
 DC.L	$A97BD2A5,$E952952F,$7DF7DF7A,$5EFDE97A,$5D2FA5D2,$FA5E97D2,$FA5F4BF6
 DC.L	$5E94BD29,$7E965D34,$BFA6E5D3,$4A5CB4E9,$4B2FFA69,$4B2E5FF4,$F4D34D29
 DC.L	$4A5294E9,$4A5294A5,$34D34FA7,$97CB294A,$74F97294,$A7F9669F,$CB34F2CA
 DC.L	$7F29A659,$4FCA7E53,$F29F29F2,$9F29E53E,$5394F94E,$53CA729E,$5394E539
 DC.L	$4E5394E6,$8B394E53,$29CF9F39,$F3CA2CCA,$72929CA4,$A72929CF,$3CE533CF
 DC.L	$3CCA739E,$514E514F,$3292994C,$F39E6533,$CE514E79,$9E799494,$94CA4A4A
 DC.L	$679CE514,$E7394539,$CE514E73,$810412EE,$EF6952DD,$2BEA5A42,$5D212D2A
 DC.L	$54B4A952,$DEEF777B,$BBDD212E,$F774A96F,$484BBDED,$2DF69696,$F484DB21
 DC.L	$2F77DDE9,$52E952F7,$BD2137BD,$F7BEFBA5,$EFBD2E97,$4BA5E974,$BD2E97D9
 DC.L	$537D969B,$ECBA52E9,$4BD2974D,$CA9A5F4D,$FE94BF4A,$5FF4A5FF,$4D965FA7
 DC.L	$4A52CBCB,$E9F4E94D,$294D2CA5


CopInsA1
	move.l	d0,-(sp)
	move.l	a1,d0
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	addq.l	#8,a0
	move.l	(sp)+,d0
	rts

StartTheRealProgram

****	Here starts the real program (main routine)

****************************************************
****	InitIntro was made by DURA of FUNZINe	****
****************************************************

halt	macro
	IFC	'\1',''
	  bsr	InitializeInterrupts|.halt
	ELSE
	  IF	\1>127
	    move.w	#\1-1,d0
	    bsr	InitializeInterrupts|.halt2
	  ELSE
	    moveq	#\1-1,d0
	    bsr	InitializeInterrupts|.halt2
	  ENDC
	ENDC
	endm

;timeryes	-	if it is time

Wait		macro
		  cmp.l	#\1,InterrBSS|.timer(a5)
		  bcs	*-8
		endm


InitializeInterrupts
	lea	.IntroInterrupt(pc),a0
	move.l	initintroBSS|.VBR(a5),a1
	move.l	a0,$6C(a1)
	move.w	#$c020,$9a(a6)		;VBLANK on
	bra	.InterruptsInitialized

.halt	moveq	#0,d0
.halt2	clr.w	InterrBSS|.VBLKtaken(a5)
.halt3	tst.w	InterrBSS|.VBLKtaken(a5)
	beq.s	.halt3
	dbf	d0,.halt2
	rts


.IntroInterrupt
	movem.l	d0-a6,-(sp)

	move.l	InitIntro|.VariablesAdr(PC),A5
	lea	$dff000,a6
	move.w	$01e(a6),d0
	and.w	$01c(a6),d0
	and.w	#$0040,d0
	beq.s	.VBLANKint
	move.w	#$0040,$09c(a6)
	move.l	InterrBSS|.B(a5),d0
	beq.s	.NoB
	move.l	d0,a0
	jsr	(a0)
.NoB	movem.l	(sp)+,d0-a6
	rte

.VBLANKint
	move.w	#$0020,$09c(a6)
	addq.l	#1,InterrBSS|.Timer(a5)
	st	InterrBSS|.VBLKtaken(a5)
	move.l	InterrBSS|.1(a5),a0
	move.l	a0,d0
	beq.s	.NoI1
	jsr	(a0)

.NoI1	move.l	InterrBSS|.2(a5),a0
	move.l	a0,d0
	beq.s	.NoI2
	jsr	(a0)

.NoI2	move.l	InterrBSS|.3(a5),a0
	move.l	a0,d0
	beq.s	.NoI3
	jsr	(a0)

.NoI3	movem.l	(sp)+,d0-a6
	rte

.InterruptsInitialized
