;-----------------------------------------------------------------------------
;
;                 PROMIZER PLAYER HANDLER V1.0 FOR AMOS 1.3
;
;    THIS IS NOT THE OPTIMAL RESOLUTION -> BETTER WAY ABOUT AMOS-EXTENSIONS
;
;                        coded by mc68000 of TECH
;
;-----------------------------------------------------------------------------

start	movem.l	d4-a6,-(a7)
	move.b	int_flag(pc),d7
	bne.b	int_running
	move.l	4.w,a6
	lea	int_struct(pc),a1
	movem.l	a3,-(a7)
	moveq	#5,d0
	lea	new_int(pc),a0
	move.l	a0,18(a1)
	move.b	#10,9(a1)
	move.b	#1,int_flag-int_struct(a1)
	jsr	-168(a6)	
	movem.l	(a7)+,a3
int_running
	move.l	(a3)+,a0
	move.l	2(a0),d0
	lea	token_list(pc),a0
	move.l	a0,a1
	move.w	(a0)+,d7
.tloop	cmp.l	(a0),d0
	beq.b	token_found
	addq.w	#8,a0
	dbf	d7,.tloop	
no_rout
	movem.l	(a7)+,d4-a6
	rts	

token_found
	add.l	4(a0),a1
	jsr	(a1)
	movem.l	(a7)+,d4-a6
	rts

token_list
	dc.w	7-1
	dc.l	"getv",equilizer-token_list
	dc.l	"maxv",setmax_vol-token_list
	dc.l	"slee",stop_tune-token_list
	dc.l	"awak",enpause_tune-token_list
	dc.l	"rest",restart_tune-token_list
	dc.l	"load",load_tune-token_list
	dc.l	"kill",kill_tune-token_list

;------------------------------------------------------------------------------
; LOAD TUNE
;------------------------------------------------------------------------------

load_tune
	move.l	player_adress(pc),d0
	bne.w	.stillplay

; OPEN DOSLIB

	move.l	4.w,a6
	lea	dos_name(pc),a1
	jsr	-408(a6)
	move.l	d0,a6
	lea	dos_base(pc),a0
	move.l	d0,(a0)

; MAKE FILE-NAME

	move.l	(a3)+,a0
	move.w	(a0)+,d0
	clr.b	1(a0,d0.w)
	lea	filename(pc),a1
	move.l	a0,(a1)

; GET FILE LENGTH

	move.l	a0,d1
	lea	fileinfoblock(pc),a0
	clr.l	124(a0)
	clr.l	player_adress-fileinfoblock(a0)
	clr.l	120(a0)
	moveq	#-2,d2
	jsr	-84(a6)				;lock file (access_read)
	tst.l	d0
	beq.w	.nofile
	move.l	d0,-(a7)
	move.l	d0,d1
	lea	fileinfoblock(pc),a0
	move.l	a0,d2
	jsr	-102(a6)			;get fileinfoblock
	move.l	(a7)+,d1
	jsr	-90(a6)				;unlock file
	
; RESERVE MEMORY

	move.l	fileinfoblock+124(pc),d0	;filelänge
	moveq	#2,d1
	move.l	4.w,a6
	jsr	-198(a6)	
	tst.l	d0
	beq.b	.nomem
	lea	fileinfoblock+120(pc),a0
	move.l	d0,(a0)

; LOAD TUNE

	move.l	dos_base(pc),a6
	move.l	filename(pc),d1
	move.l	#1005,d2
	jsr	-30(a6)
	move.l	d0,-(a7)
	move.l	d0,d1
	movem.l	fileinfoblock+120(pc),d2-d3
	jsr	-42(a6)
	move.l	(a7)+,d1
	jsr	-36(a6)

; INIT TUNE

	move.l	fileinfoblock+120(pc),a1
	cmp.l	#$700320c9,$16(a1)
	beq.b	.is_promizer
	bsr.b	kill_me
	moveq	#-3,d0
	rts
.is_promizer
	moveq	#1,d0
	jsr	(a1)
	jsr	2(a1)
	lea	equi_base(pc),a0
	jsr	14(a1)				;fill equi struct

	lea	player_adress(pc),a0
	move.l	fileinfoblock+120(pc),(a0)

	clr.b	int_flag-player_adress(a0)	;start interupt !!!!
	clr.b	pause_flag-player_adress(a0)
	moveq	#0,d0
	rts

.nofile	moveq	#-1,d0
	rts
.nomem	moveq	#-2,d0
	rts
.stillplay
	moveq	#-4,d0
	rts

;------------------------------------------------------------------------------
; RESTART TUNE
;------------------------------------------------------------------------------

enpause_tune
	lea	pause_flag(pc),a1
	clr.b	(a1)
	rts

;------------------------------------------------------------------------------
; ONLY STOP (=PAUSE)
;------------------------------------------------------------------------------

stop_tune
	move.l	player_adress(pc),d0
	beq.b	.nostop
	move.w	#$4000,$dff09a
	move.l	d0,a1
	jsr	10(a1)
	lea	pause_flag(pc),a0
	move.b	#1,(a0)
	move.w	#$c000,$dff09a
.nostop
	rts
	
;------------------------------------------------------------------------------
; KILL TUNE & REPLAYER
;------------------------------------------------------------------------------

kill_tune
	bsr.b	stop_tune
	lea	player_adress(pc),a0
	clr.l	(a0)
kill_me
	move.l	4.w,a6
	move.b	int_flag(pc),d0
	beq.b	.nointstop
	cmp.b	#2,d0
	beq.b	.nointstop			;ist schon gestoppt !!!
	lea	int_struct(pc),a1
	move.b	#2,int_flag-int_struct(a1)	;no interupt running !!!
	moveq	#5,d0
	jsr	-174(a6)
.nointstop
	move.l	fileinfoblock+124(pc),d0
	beq.b	.nokill
	move.l	fileinfoblock+120(pc),a1
	jsr	-210(a6)
	lea	fileinfoblock+120(pc),a0
	clr.l	(a0)+
	clr.l	(a0)
.nokill
	rts

;------------------------------------------------------------------------------
; RESTART TUNE
;------------------------------------------------------------------------------

restart_tune
	lea	player_adress(pc),a0
	tst.l	(a0)
	beq.b	.norestart
	move.l	(a0),a0
	moveq	#1,d0
	jsr	2(a0)
.norestart
	rts

;------------------------------------------------------------------------------
; EQUILIZER
;------------------------------------------------------------------------------

equilizer
	lea	equi_base(pc),a0
	tst.l	(a0)
	beq.b	.noequi

	move.l	20(a0),a1
	tst.b	(a1)
	beq.b	.newnote
	moveq	#-1,d0
	moveq	#-1,d1
	moveq	#-1,d2
	moveq	#-1,d3
	rts
.newnote
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	move.l	(a0)+,a1
	tst.w	(a1)
	beq.b	.nonew1	
	move.b	19(a1),d0
.nonew1
	move.l	(a0)+,a1
	tst.w	(a1)
	beq.b	.nonew2
	move.b	19(a1),d1
.nonew2
	move.l	(a0)+,a1
	tst.w	(a1)
	beq.b	.nonew3
	move.b	19(a1),d2
.nonew3
	move.l	(a0)+,a1
	tst.w	(a1)
	beq.b	.nonew4
	move.b	19(a1),d3
.nonew4
	rts

.noequi
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	moveq	#0,d3
	rts

;------------------------------------------------------------------------------
; SET MAXIMUM VOLUME
;------------------------------------------------------------------------------

setmax_vol
	lea	max_vol(pc),a0
	move.w	2(a3),(a0)
	rts
	
;------------------------------------------------------------------------------
; INTERUPT ROUTINE 
;------------------------------------------------------------------------------

new_int	movem.l	d0-a6,-(a7)
	move.l	player_adress(pc),d0
	beq.b	.noplayer
	move.b	pause_flag(pc),d1
	bne.b	.noplayer
	move.l	d0,a0
	move.w	max_vol(pc),d0
	jsr	6(a0)
	move.w	max_vol(pc),d0
	cmp.w	#64,d0
	beq.b	.noplayer
	move.w	d0,$dff0a8
	move.w	d0,$dff0b8
	move.w	d0,$dff0c8
	move.w	d0,$dff0e8
.noplayer
	movem.l	(a7)+,d0-a6
	rts


filename		dc.l	0
			cnop	0,4
fileinfoblock		dcb.b	260
dos_name		dc.b	'dos.library',0
dos_base		dc.l	0
player_adress		dc.l	0
equi_base		dcb.b	28
max_vol			dc.w	64
int_flag		dc.b	2
pause_flag		dc.b	0
int_struct		dcb.b	28
