
	move.l	sp,a5
	move.l	4(a5),a5	;get basepage
	move.l	$c(a5),d0	;text segment
	add.l	$14(a5),d0	;data segment
	add.l	$1c(a5),d0	;unitialized
	add.l	#$100,d0	;basepage size
	move.l	d0,-(sp)
	move.l	a5,-(sp)
	move.w	d0,-(sp)
	move.w	#$4a,-(sp)
	trap	#1
	add.l	#12,sp

	bsr	set_super
	dc.w	$a00a		;hide mouse
	bsr	get_screen_base
	bsr	get_old_palette
	bsr	set_new_palette
	bsr	get_original_rez
	bsr	set_low_rez

	move.l	screen_base,a1
	add.w	#160*50,a1

	move.l	a1,spec_pos
	lea	pic+34,a0
	move.l	screen_base,a1
	move.w	#32000/4-1,d0
pic_sho	move.l	(a0)+,(a1)+
	dbf	d0,pic_sho

	move.l	#1,d0
	jsr	tune

	move.l	#tune+6,$4da
wait:
	bsr	v_sync
	move.w	#$123,$ff8240
	bsr	clear_spec
	bsr	spec
	move.w	pic+2,$ff8240
	bsr	tst_key
	tst.l	d0
	beq.s	wait
	bsr	get_key

	jsr	endmus
	bsr	set_old_palette
	bsr	set_med_rez
	dc.w	$a009
	bsr	set_user

	clr.w	-(sp)
	MOVE.W	#$4c,-(SP)	; RETURN TO GEM DESKTOP.
	TRAP	#1
ERR:	bra.s	ERR


*******************
* CUSTOM ROUTINES *
*******************
clear_spec
	lea	spec_values,a0
	move.w	#80-1,d0
.cnt_down
	move.b	(a0)+,d1
	tst.b	d1
	beq.s	.next
	sub.b	#1,-1(a0)
	
.next	dbf	d0,.cnt_down

	move.l	spec_pos,a0
	sub.w	#50*160,a0
	moveq	#0,d1

	REPT	26
	move.w	d1,(a0)
	move.w	d1,8(a0)
	move.w	d1,16(a0)
	move.w	d1,24(a0)
	move.w	d1,32(a0)
	move.w	d1,40(a0)
	move.w	d1,48(a0)
	move.w	d1,56(a0)
	move.w	d1,64(a0)
	move.w	d1,72(a0)
	move.w	d1,80(a0)
	move.w	d1,88(a0)
	move.w	d1,96(a0)
	move.w	d1,104(a0)
	move.w	d1,112(a0)
	move.w	d1,120(a0)
	move.w	d1,128(a0)
	move.w	d1,136(a0)
	move.w	d1,144(a0)
	move.w	d1,152(a0)
	lea	160(a0),a0
	ENDR
	rts
	
************************************************

AFINE	equ	0
ACOURSE	equ	1	
BFINE	equ	2
BCOURSE	equ	3	
CFINE	equ	4
CCOURSE	equ	5	

COURCE_SHIFT	equ	3
FINE_SHIFT	equ	5

spec	lea	$ffff8800.w,a1

	move.b	#ACOURSE,(a1)		;A course tune
	move.b	(a1),d0
	and.w	#$ff,d0
	asl.w	#COURCE_SHIFT,d0
	lea	spec_values,a2
	move.w	d0,d1

	move.b	#AFINE,(a1)	;A fine tune
	move.b	(a1),d0
	and.w	#$ff,d0
	lsr.w	#FINE_SHIFT,d0
	add.w	d0,d1
	add.w	d1,a2
	move.b	#24,(a2)


******************
	move.b	#BCOURSE,(a1)		;B course tune
	move.b	(a1),d0
	and.w	#$ff,d0
	asl.w	#COURCE_SHIFT,d0
	lea	spec_values,a2
	move.w	d0,d1

	move.b	#BFINE,(a1)		;B fine tune
	move.b	(a1),d0
	and.w	#$ff,d0
	lsr.w	#FINE_SHIFT,d0
	add.w	d0,d1
	add.w	d1,a2
	move.b	#24,(a2)

******************
	move.b	#CCOURSE,(a1)		;C course tune
	move.b	(a1),d0
	and.w	#$ff,d0
	asl.w	#COURCE_SHIFT,d0
	lea	spec_values,a2
	move.w	d0,d1

	move.b	#CFINE,(a1)		;C fine tune
	move.b	(a1),d0
	and.w	#$ff,d0
	lsr.w	#FINE_SHIFT,d0
	add.w	d0,d1
bp	add.w	d1,a2
	move.b	#24,(a2)


******************** print speccy *******************
ps	move.l	spec_pos,a0
	sub.w	#160*25,a0
	add.w	#152,a0
	lea	spec_values,a2
	move.b	#20-1,d1
.loop	move.l	a0,a1

	move.b	(a2)+,d0
	beq.s	.nib2
	and.w	#$ff,d0
.loop1	move.b	#%00000111,1(a1)
	lea	-160(a1),a1
	dbf	d0,.loop1

.nib2	move.b	(a2)+,d0
	beq.s	.nib3
	and.w	#$ff,d0
	move.l	a0,a1
.loop2	or.b	#%01110000,1(a1)
	lea	-160(a1),a1
	dbf	d0,.loop2

.nib3	move.b	(a2)+,d0
	beq.s	.nib4
	and.w	#$ff,d0
	move.l	a0,a1
.loop3	or.b	#%00000111,(a1)
	lea	-160(a1),a1
	dbf	d0,.loop3

.nib4	move.b	(a2)+,d0
	beq.s	.nonib
	and.w	#$ff,d0
	move.l	a0,a1
.loop4	or.b	#%01110000,(a1)
	lea	-160(a1),a1
	dbf	d0,.loop4
.nonib
	sub.w	#8,a0
	dbf	d1,.loop
	rts





endmus	clr.l	$4da
	lea	$ffff8800,a0
	move.l	#$8080000,(a0)
	move.l	#$9090000,(a0)
	move.l	#$a0a0000,(a0)
	rts

***********************
* SUBROUTINES SECTION *
***********************
v_sync:	movem.l	d0-d3/a0-a3,-(sp)
	move.w	#$25,-(sp)
	trap	#14
	addq.l	#2,sp
	movem.l	(sp)+,d0-d3/a0-a3
	rts

tst_key:
	move.w	#11,-(sp)
	trap	#1
	addq.l	#2,sp
	rts

get_key:
	move.w	#7,-(sp)
	trap	#1
	addq.l	#2,sp
	rts

set_super:
	clr.l	-(sp)		;Set super stack equal
	move.w	#$20,-(sp)	; to user stack before call
	trap	#1
	addq.l	#6,sp		;correct stack
	move.l	d0,stack_save	;save old supervisor stack value
	rts
set_user:
	move.l	stack_save,-(sp)
	move.w	#$20,-(sp)
	trap	#1		;back to user
	addq.l	#6,sp		;correct stack
	rts

get_old_palette:
	move.w	#8-1,d0
	lea	$ff8240,a0
	lea	old_palette,a1
get_old:
	move.l	(a0)+,(a1)+
	dbf	D0,get_old
	rts

set_new_palette:
	lea	pic+2,a0
	bra	set_pal
set_old_palette:
	lea	old_palette,a0
set_pal:
	lea	$ff8240,a1
	move.w	#8-1,d0
set_p:	move.l	(a0)+,(a1)+
	dbf	d0,set_p
	rts

get_screen_base:
	move.w	#3,-(sp)
	trap	#14
	addq.l	#2,sp
	move.l	d0,screen_base
	rts

get_original_rez:
	move.w	#4,-(sp)
	trap	#14
	addq.l	#2,sp
	move.w	d0,original_rez
	rts

set_low_rez:
	clr.w	-(sp)
	bra	set_rez
set_med_rez:
	move.w	#1,-(sp)
set_rez:
	move.l	#-1,-(sp)
	move.l	#-1,-(sp)
	move.w	#5,-(sp)
	trap	#14
	add.l	#12,sp
	rts

****************
* DATA SECTION *
****************
stack_save:	dc.l	0
screen_base	dc.l	0
original_rez:	dc.w	0
old_palette:	ds.w	16
spec_pos:	dc.l	0
pic:	incbin	info40.pi1
tune	incbin	loader.img
spec_values	dcb.b	68,0