
	OPT	P=68000,AMIGA,CASE,NOWARN,O+,NODEBUG

	bra	main

Title: dc.b "$VER: MakeCDDA v1.0 (01-May-1997) © by Claudio Buraglio",10,10,0


BufferSize:	equ	30720

main:	lea	Filename,a1
	bsr	ReadArg		; Read arguments
	lea	Arg2,a1
	bsr	ReadArg
	lea	Arg3,a1
	bsr	ReadArg
	lea	Arg4,a1
	bsr	ReadArg

	move.b	#00,UltimoBlocco
	move.b	#-1,SkipZero
	move.b	#00,Intel
	move.b	#00,CutEnd
	bsr	CheckArgs

	moveq.l	#0,d0		; Version
	lea	DosName,a1
	move.l	4.w,a6		; ExecBase
	jsr	-552(a6)	; OpenLibrary
	tst.l	d0	
	beq	rts
	move.l	d0,DosBase

	move.l	#Title+6,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr

	lea	Filename,a1
	tst.b	(a1)
	beq	NoFilename


;------ Apre i files Left

	lea	Filename,a0
	lea	FilenameW,a1
.CopyL1:
	move.b	(a0)+,(a1)+
	tst.b	(a0)
	bne	.CopyL1
	lea	SuffLeft,a0
.CopyL2:
	move.b	(a0)+,(a1)+
	tst.b	(a0)
	bne	.CopyL2
	move.b	#0,(a1)

	move.l	#FilenameW,d1	; Name of File to open
	move.l	#1005,d2	; OldFile
	move.l	DosBase,a6
	jsr	-30(a6)		; Open
	tst.l	d0
	beq	NoOpenFile1
	move.l	d0,FilePointerL

;------ Apre il file Right

	lea	Filename,a0
	lea	FilenameW,a1
.CopyR1:
	move.b	(a0)+,(a1)+
	tst.b	(a0)
	bne	.CopyR1
	lea	SuffRight,a0
.CopyR2:
	move.b	(a0)+,(a1)+
	tst.b	(a0)
	bne	.CopyR2
	move.b	#0,(a1)

;------ Apre il file Left

	move.l	#FilenameW,d1	; Name of File to open
	move.l	#1005,d2	; OldFile
	move.l	DosBase,a6
	jsr	-30(a6)		; Open
	tst.l	d0
	beq	NoOpenFile2
	move.l	d0,FilePointerR

;------ Apre i files Destinazione

	lea	Filename,a0
	lea	FilenameW,a1
.CopyD1:
	move.b	(a0)+,(a1)+
	tst.b	(a0)
	bne	.CopyD1
	lea	SuffDest,a0
.CopyD2:
	move.b	(a0)+,(a1)+
	tst.b	(a0)
	bne	.CopyD2
	move.b	#0,(a1)

	move.l	#FilenameW,d1	; Name of File to open
	move.l	#1006,d2	; NewFile
	move.l	DosBase,a6
	jsr	-30(a6)		; Open
	tst.l	d0
	beq	NoOpenDestFile
	move.l	d0,FilePointerW

	tst.b	SkipZero
	bne	Loop
	
	move.l	#Tx_Skip,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr


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

Loop:
	move.l	FilePointerL,d1
	move.l	#BufferL,d2	; Buffer
	move.l	#BufferSize,d3
	move.l	DosBase,a6
	jsr	-42(a6)		; Read
	move.l	d0,LenReadLeft

	move.l	FilePointerR,d1
	move.l	#BufferR,d2	; Buffer
	move.l	#BufferSize,d3
	move.l	DosBase,a6
	jsr	-42(a6)		; Read

	cmp.l	LenReadLeft,d0
	bne	ReadError
	cmp.l	#BufferSize,d0
	beq	Algoritmo
	move.b	#1,UltimoBlocco

Algoritmo:
	lea	BufferL,a0
	lea	BufferR,a1
	lea	BufferW,a2

	move.l	d0,d1
	ror.l	#1,d1
	sub.l	#1,d1

	move.l	#0,d3
	tst.b	SkipZero
	bne	Copy

Skip:	moveq.l	#0,d3
	tst.w	(a0)+
	bne	Skip1
	tst.w	(a1)+
	bne	Skip2
	add.l	#1,Skipped
	dbra	d1,Skip
	bra	EndBlock

Skip1:	add.l	#2,a1
Skip2:	move.b	#-1,SkipZero
	tst.l	Skipped
	bne	NoSkip
	move.l	#Tx_NoSkip,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	Copy
NoSkip:
	move.l	#Tx_Skipped,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr

Copy:	tst.b	Intel
	bne	CopyI

CopyM:	move.w	(a0)+,(a2)+	; Copy in Motorola format
	move.w	(a1)+,(a2)+
	add.l	#4,d3
	dbra	d1,CopyM
	bra	EndBlock

CopyI:	move.w	(a0)+,d5	; Copy and convert to Intel format
	move.w	(a1)+,d6
	ror.w	#8,d5
	ror.w	#8,d6
	move.w	d5,(a2)+
	move.w	d6,(a2)+
	add.l	#4,d3
	dbra	d1,CopyI

EndBlock:
	cmp.l	#BufferSize,d0
	beq	WriteBuffer
	move.l	#0,-4(a2)

WriteBuffer:
	move.l	FilePointerW,d1	; Write header
	move.l	#BufferW,d2	; Buffer
	move.l	d3,LenWriteStereo
	add.l	d3,TotalLenght
	move.l	DosBase,a6
	jsr	-48(a6)		; Write

	cmp.l	LenWriteStereo,d0
	bne	WriteError

	tst.b	UltimoBlocco
	beq	Loop

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

	lea	BufferW,a0
	move.l	#BufferSize-1,d0
Zero:	move.b	#0,(a0)+
	dbra	d0,Zero

	move.l	TotalLenght,d0	; in byte

	moveq.l	#0,d3
Count:	add.l	#2352,d3
	cmp.l	d3,d0
	bgt	Count
	sub.l	d0,d3		; Scarto da riempire

	move.l	FilePointerW,d1	; Padding ZERO Bytes at End Of File
	move.l	#BufferW,d2	; Buffer
	move.l	DosBase,a6
	jsr	-48(a6)		; Write


CloseFileDest:

	move.l	FilePointerW,d1
	move.l	DosBase,a6
	jsr	-36(a6)		;Close

CloseFileSrc2:
	move.l	FilePointerR,d1
	move.l	DosBase,a6
	jsr	-36(a6)		;Close

CloseFileSrc1:
	move.l	FilePointerL,d1
	move.l	DosBase,a6
	jsr	-36(a6)		;Close

CloseDosBase:
	move.l	DosBase,a1
	move.l	4.w,a6		; ExecBase
	jsr	-414(a6)	; CloseLibrary
	move.l	#0,d0
rts:	rts

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

ReadErrorL:
	move.l	#Tx_ReadErrorL,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	CloseFileDest
ReadError:
	move.l	#Tx_ReadErrorR,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	CloseFileDest

WriteError:
	move.l	#Tx_WriteError,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	CloseFileDest

NoFilename:
	move.l	#Tx_NoFilename,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	CloseDosBase

NoOpenDestFile:
	move.l	#Tx_NoOpenDFile,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	movem.l	(sp)+,d0-d3/a0-a3
	bra	CloseFileSrc2
NoOpenFile2:
	move.l	#Tx_NoOpenFile,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	CloseFileSrc1

NoOpenFile1:
	move.l	#Tx_NoOpenFile,d1
	move.l	DosBase,a6
	jsr	-$3b4(a6)	; PutStr
	bra	CloseDosBase


;-------------------------------------------------
ReadArg:cmp.b	#$0a,(a0)	; se Line Feed...
	beq	.Exit		; esce.
	cmp.b	#$00,(a0)	; se Nullo...
	beq	.Exit		; esce.
	cmp.b	#'"',(a0)	; Se incontra le virgolette "
	beq	.Virg		; usa l'apposita routine
	cmp.b	#"'",(a0)	; Se incontra le virgolette '
	beq	.Virg		; usa l'apposita routine
	cmp.b	#" ",(a0)	; Cerca inizio testo
	bne	.loop		; se si loop
	addq	#1,a0
	bra	ReadArg		; se no, cicla.
.loop:	cmp.b	#$0a,(a0)	; se Line Feed
	beq	.Exit
	cmp.b	#$20,(a0)	; o un'altro spazio
	beq	.Exit		; esce
	move.b	(a0)+,(a1)+	; copia lettera
	bra	.loop		; e cicla
.Virg:	addq.l	#1,a0
.V:	cmp.b	#$0a,(a0)	; se Line Feed
	beq	.Exit
	cmp.b	#'"',(a0)	; o un'altra virgoletta
	beq	.ExV		; esce
	cmp.b	#"'",(a0)
	beq	.ExV
	move.b	(a0)+,(a1)+	; copia lettera
	bra	.V		; e cicla
.ExV:	addq	#1,a0
.Exit:	rts

CheckArgs:
	lea	Arg2,a0
	bsr	check
	lea	Arg3,a0
	bsr	check
	lea	Arg4,a0
	bsr	check
	rts

check:	cmp.b	#"-",(a0)
	bne	.rts
	tst.b	2(a0)
	bne	.rts
	bclr	#$05,1(a0)
	cmp.b	#"S",1(a0)
	beq	.Skip
	cmp.b	#"I",1(a0)
	beq	.Intel
	cmp.b	#"C",1(a0)
	beq	.Cut

.rts:	rts

.Skip:	move.b	#0,SkipZero
	rts
.Intel:	move.b	#1,Intel
	rts
.Cut:	move.b	#1,CutEnd
	rts


* * *  Campo dati

LineFeed:	dc.b	10,0
DosName:	dc.b	"dos.library",0
Tx_NoFilename:	dc.b	"The base name of the Samplitude project must be specified!",10,10,0
Tx_NoOpenFile:	dc.b	"Unable to open the file to convert!",10,10,0
Tx_NoOpenDFile:	dc.b	"Unable to open the destination .CDDA file!",10,10,0
Tx_ReadErrorL:	dc.b	"Read Error in source Left file!",10,10,0
Tx_ReadErrorR:	dc.b	"Read Error in source Right file!",10,10,0
Tx_WriteError:	dc.b	"Write Error in destination file!",10,10,0
Tx_Skip:	dc.b	"Skipping zero volume from beginning...",10,0
Tx_NoSkip:	dc.b	"Nothing to skip.",10,10,0
Tx_Skipped:	dc.b	"bytes skipped!",10,10,0
SuffLeft:	dc.b	".S00°",0
SuffRight:	dc.b	".S01°",0
SuffDest:	dc.b	".cdda",0

	section AreaDati,BSS

DosBase:	ds.l	1
LenReadLeft:	ds.l	1
LenWriteStereo:	ds.l	1
TotalLenght:	ds.l	1
Skipped:	ds.l	1

FilePointerL:	ds.l	1
FilePointerR:	ds.l	1
FilePointerW:	ds.l	1

Filename:	ds.b	256
FilenameW:	ds.b	256
Arg2:		ds.b	80
Arg3:		ds.b	80
Arg4:		ds.b	80

BufferL:	ds.b	BufferSize
BufferR:	ds.b	BufferSize
BufferW:	ds.b	BufferSize*2

UltimoBlocco:	ds.b	1
SkipZero:	ds.b	1
Intel:		ds.b	1
CutEnd:		ds.b	1

