;
;
;
;Strips ANNO stuff from IFF-8SVX samples
;
;
;
;v 0.1 - works, I mean done :)
;v 0.2 - now handles really big samples because
;        processes only #blocksize and then copies with #blocksize*2
;v 0.3 - added DELSRC (to delete IN file after operation)...
;v 0.4 - added ASL mode...
;v 0.5 - added NOASL/S parameter


blocksize=100000



	incbin	start-4000.bin

Stripper:
	lea.l	__(pc),a4
	move.l	4.w,a6
	move.l	a6,ExecBase-__(a4)

	moveq	#37,d0
	lea.l	DosName(pc),a1
	jsr	-552(a6)			;OpenLibrary
	move.l	d0,DosBase-__(a4)
	beq.w	.noDos

	pea.l	Template-__(a4)
	move.l	(sp)+,d1
	pea.l	Array-__(a4)
	move.l	(sp)+,d2
	moveq	#0,d3
	move.l	DosBase-__(a4),a6
	jsr	-798(a6)			;ReadArgs
	move.l	d0,Args-__(a4)
	bne.w	.B

	tst.l	12+Array-__(a4)			;NOASL
	bne.b	.failed

;ASL mode here....
	bsr.b	.OpenAsl
	beq.b	.failed
	bsr.w	AllocAslReq
	beq.b	.failed

	pea.l	INPath-__(a4)
	move.l	(sp)+,d4
	move.l	d4,0+Array-__(a4)
	lea.l	ChoosingInFile(pc),a2
	moveq	#0,d1
	bsr.w	AslFileFreq
	tst.l	d0
	beq.b	.failed

	pea.l	OUTPath-__(a4)
	move.l	(sp)+,d4
	move.l	d4,4+Array-__(a4)
	lea.l	ChoosingOutFile(pc),a2
	moveq	#-1,d1
	bsr.w	AslFileFreq
	tst.l	d0
	beq.b	.failed
	bsr.b	.CloseAsl
	bra.b	.B
.failed:
	bsr.b	.CloseAsl
	bra.w	.noArgs

.OpenAsl:
	moveq	#37,d0
	lea.l	AslName(pc),a1
	move.l	ExecBase-__(a4),a6
	jsr	-552(a6)			;OpenLibrary
	move.l	d0,AslBase-__(a4)
	rts

.CloseAsl:
	bsr.w	FreeAslReq
	tst.l	AslBase-__(a4)
	beq.b	.noCloseAsl
	move.l	AslBase-__(a4),a1
	move.l	ExecBase-__(a4),a6
	jsr	-414(a6)			;CloseLibrary
.noCloseAsl:
	rts


.B:
;------------------------------------------------------------------


	lea.l	DoubleBuffer(pc),a5

	move.l	DosBase-__(a4),a6
	move.l	0+Array-__(a4),d1
	move.l	#1005,d2			;_OLDFILE
	jsr	-30(a6)				;Open
	move.l	d0,Handle1-__(a4)
	bne.b	.opened
	bsr.w	PrintFault

	move.l	0+Array-__(a4),d1
	jsr	-948(a6)			;PutStr
	pea.l	Enter(pc)
	move.l	(sp)+,d1
	jsr	-948(a6)			;PutStr
	bra.b	.CloseFiles			;! CANT OPEN FILE TO READ!

.opened:
	move.l	#blocksize,d3
	move.l	a5,d2
	move.l	Handle1-__(a4),d1
	jsr	-42(a6)				;Read
	move.l	d0,d6

	move.l	4+Array-__(a4),d1
	move.l	#1006,d2			;_NEWFILE
	jsr	-30(a6)				;Open
	move.l	d0,Handle2-__(a4)
	bne.b	.opened2
	bsr.w	PrintFault

	move.l	4+Array-__(a4),d1
	jsr	-948(a6)			;PutStr
	pea.l	Enter(pc)
	move.l	(sp)+,d1
	jsr	-948(a6)			;PutStr
	bra.b	.CloseFiles			;! CANT OPEN FILE TO WRITE!
.opened2:


		move.l	a5,a0			;BufferBegin
		lea.l	(a0,d6.L),a1		;BufferEnd

		bsr.w	Shorten

		sub.l	d0,a1
		sub.l	a0,a1
		move.l	a1,d3			;d3 = new length

	move.l	Handle2-__(a4),d1
	move.l	a5,d2
	;d3 was set before
	jsr	-48(a6)				;Write



.copyFile:
	move.l	#blocksize*2,d3
	move.l	a5,d2
	move.l	Handle1-__(a4),d1
	jsr	-42(a6)				;Read
	move.l	d0,d6
	beq.b	.closefiles

	move.l	d6,d3
	move.l	a5,d2
	move.l	Handle2-__(a4),d1
	jsr	-48(a6)				;Write
	bra.b	.copyFile



.closefiles:
	move.l	Handle1-__(a4),d1
	beq.b	.cf1
	jsr	-36(a6)				;Close
.cf1:	move.l	Handle2-__(a4),d1
	beq.b	.cf2
	jsr	-36(a6)				;Close
.cf2:



	tst.l	8+Array-__(a4)
	beq.b	.noDelSRC

	move.l	0+Array-__(a4),d1
	moveq	#0,d2				;"----RWED"
	jsr	-186(a6)			;SetProtection
	move.l	0+Array-__(a4),d1		;fib_name
	jsr	-72(a6)				;DeleteFile

.noDelSRC:




	move.l	Args-__(a4),d1
	beq.b	.noArgs
	move.l	DosBase-__(a4),a6
	jsr	-858(a6)			;FreeArgs
.noArgs:
	move.l	DosBase-__(a4),a1
	move.l	ExecBase-__(a4),a6
	jsr	-414(a6)
.noDos:
	moveq	#0,d0
	rts

PrintFault:
	move.l	DosBase-__(a4),a6
	jsr	-132(a6)			;IoErr
	move.l	d0,d1
PrintFaultB:
	moveq	#0,d2
	jmp	-474(a6)			;PrintFault




;*************************************************************
;
; note that You can replace this routine with anything
; and don't need to care about memory, file accesses etc.
;

Shorten:
	movem.l	d1-a6,-(sp)
	bsr.b	.stripANNO
	movem.l	(sp)+,d1-a6
	rts

.stripANNO:

;a0 - buf
;a1 - end of buf

	cmp.l	#"FORM",(a0)
	bne.b	.notIFF

	cmp.l	#"8SVX",8(a0)
	bne.b	.notIFF

	lea.l	4(a0),a3			;iff-len

.nextLong:
	addq.l	#4,a0

	cmp.l	a0,a1
	ble.b	.NotIff
	move.l	(a0),d0

	cmp.l	#"ANNO",d0
	bne.b	.nextLong	

.shorten:
	move.l	a0,a2
	
	moveq	#8,d0
	add.l	4(a0),d0			;ANNO len

	sub.l	d0,(a3)				;new iff-len

	add.l	d0,a0

	cmp.l	a0,a1
	ble.b	.NotIff

.cpy:
	move.l	(a0)+,(a2)+
	cmp.l	a0,a1
	ble.b	.done
	bra.b	.cpy

.done:

;d0 = gain

	rts

.NotIFF:
	moveq	#0,d0
	rts








AllocAslReq:
	move.l	AslBase-__(a4),a6
	moveq	#0,d0				;filereq
	sub.l	a0,a0
	jsr	-48(a6)				;AllocAslRequest
	move.l	d0,AslRequest-__(a4)
	rts

FreeAslReq:
	tst.l	AslRequest-__(a4)
	beq.b	.A	
	move.l	AslBase-__(a4),a6
	move.l	AslRequest-__(a4),a0
	jsr	-54(a6)				;FreeAslRequest
.A:	rts
		cnop	0,4
;-----------------------------------------------------------------------
;
;used to choose files/dirs to watch...
;
;d1:	-1 for save mode, 0 for normal
;d4:	path buffer
;a2:	req title
;
;d0 = 0 -> failed

AslFileFreq:
	movem.l	d1-a6,-(sp)
	bsr.b	.A
	movem.l	(sp)+,d1-a6
	rts
.A
	move.l	AslBase-__(a4),a6
	move.l	AslRequest-__(a4),a0
	move.l	a0,d7
	lea.l	$80080000,a1
	clr.l	-(sp)
	clr.l	-(sp)
	move.l	a2,-(sp)
	pea.l	1(a1)				;ASLFR_TitleText
	move.l	#380,-(sp)
	pea.l	5(a1)				;ASLFR_InitialWidth
	move.l	d1,-(sp)
	pea.l	44(a1)				;ASLFR_DoSaveMode
	move.l	a7,a1
	jsr	-60(a6)				;AslRequest
	lea.l	4*8(a7),a7

	tst.l	d0
	beq.b	.D
.skip:
	move.l	d7,a0
	tst.l	8(a0)
	bne.b	.copy
	
.D	moveq	#0,d0
	rts

.copy:	move.l	8(a0),a1
	move.l	d4,a2
.loop:	move.b	(a1)+,(a2)+
	bne.b	.loop

	clr.b	(a2)+

	move.l	d4,d1				;dir name
	move.l	4(a0),d2			;filename
	move.l	#512,d3
	move.l	DosBase-__(a4),a6
	jsr	-882(a6)			;AddPart

	moveq	#1,d0
	rts


Enter:			dc.b	10,0
DosName:		dc.b	"dos.library",0
AslName:		dc.b	"asl.library",0
ChoosingInFile:		dc.b	"Choose IN file...",0
ChoosingOUTFile:	dc.b	"Choose OUT file name...",0

TEMPLATE:	dc.b	"IN/A,OUT/A,DELSRC/S,NOASL/S",0
		dc.b	"$VER: StripANNO 0.5 (10.09.02) by Zbigniew Trzcionkowski",10,0

	cnop	0,4

__:

ExecBase:	ds.l	1
DosBase:	ds.l	1
AslBase:	ds.l	1
AslRequest:	ds.l	1
Args:		ds.l	1
Handle1:	ds.l	1
Handle2:	ds.l	1
Array:		ds.l	1*4


INPath:		ds.b	512
OUTPath:	ds.b	512
DoubleBuffer:	ds.b	blocksize*2

