; Assembled with Innovatronic's CAPE assembler with the SMALLOBJ directive.
; (i.e. PC relative code). For other assemblers, uncomment the section
; directive before the data section.
; Link as follows:
; Blink SmallStart.o ToSAMP.o small.lib NODEBUG to ToSAMP
; where SmallStart.o is the startup code included with this program and
; small.lib is Bryce Nesbitt's amiga.lib.
; For Manx,
; as -cd -o ToSAMP ManxStartUp.o ToSAMP.o -lcl32
;
; This example uses R.J. Mical's FileIO requester in a special library form
; prepared by dissidents as well as the instype.library

	SMALLOBJ
	OBJFILE  "rad:ToSamp.o"
	OPTIMON
	ADDSYM

	INCLUDE	"rad:FileIO.i" ;requires RJ Mical's FileIO in library form

	SECTION	ToSampCode,CODE

_LVOGetInsType	equ -30

	XREF	_DOSBase,_SysBase ;from StartUp code

	XREF	_LVOOpenLibrary,_LVOCloseLibrary,_LVOOpenWindow,_LVOCloseWindow
	XREF	_LVOAllocMem,_LVOFreeMem
	XREF	_LVOGetMsg,_LVOReplyMsg,_LVOWait,_LVOWaitPort
	XREF	_LVOPrintIText,_LVODrawImage
	XREF	_LVOMove,_LVOText,_LVOSetAPen
	XREF	_LVOOpen,_LVORead,_LVOWrite,_LVOClose,_LVODelay
	XREF	_LVOLock,_LVOUnLock,_LVOExamine,_LVODeleteFile

MODE_OLDFILE equ 1005
MODE_NEWFILE equ 1006
LIB_VERSION  equ 33

blank:
		moveq		#17-1,d2
		moveq		#10,d3
		moveq		#10,d4
mG		lea		SPACES,a4
		moveq		#26,d0
		add.w		d3,d4
		move.w	d4,d1
		bsr.s		print_msg
		Dbra		d2,mG
		rts

  XDEF print_msg  ;string passed in a4, x in d0, y in d1
print_msg:
		movea.l	RastPort,a2
		movea.l	a2,a1
		movea.l	_GfxBase,a6
		jsr		_LVOMove(a6)
		movea.l	a4,a0
len	move.b	(a4)+,d0
		bne.s		len
		move.l	a4,d0
		subq.l	#1,d0
		sub.l		a0,d0			;length of string
		movea.l	a2,a1			;RastPort
		jmp		_LVOText(a6)

	XDEF	print_directions
print_directions:
		lea		Directions,a4
		lea		Positions,a5
		moveq		#10-1,d2
		moveq		#10,d3
		moveq		#10,d4
mg		move.w	(a5)+,d0
		add.w		d3,d4
		move.w	d4,d1
		bsr.s		print_msg  ;returns end of msg (beginning of next string)
		Dbra		d2,mg
		rts

Positions dc.w 38,28,38,26,30,39,29,24,30,84

   XDEF _main
_main:
;---Open Gfx Library
		movea.l	_SysBase,a6
		moveq		#LIB_VERSION,d0
		lea		GfxName,a1
		jsr		_LVOOpenLibrary(a6)
		move.l	d0,_GfxBase
		bne.s		xx
		rts
;---Open Intuition
xx		moveq		#LIB_VERSION,d0
		lea		IntuitionName,a1
		jsr		_LVOOpenLibrary(a6)
		move.l	d0,_IntuitionBase
		beq		clG
;---Open the main window
		lea		newWindow,a0
		move.l	a6,-(sp)
		movea.l	d0,a6
		jsr		_LVOOpenWindow(a6)
		movea.l	(sp)+,a6
		move.l	d0,WindowPtr
		beq		clI
		move.l	d0,a0
		move.l	50(a0),RastPort
;---Open the FileIO (requester) library
		moveq		#1,d0            ;version #1
		lea		RequesterName,a1
		jsr		_LVOOpenLibrary(a6)
		move.l	d0,_RequesterBase
		bne.s		gotit
		;---error
		lea		FileReqErr,a4
		moveq		#5,d0
		moveq		#75,d1
		bsr		print_msg
		moveq		#100,d1
		movea.l	_DOSBase,a6
		jsr		_LVODelay(a6)
		bra		clW
;===================Get the FileIO Structure========================
gotit	movea.l	d0,a6
		jsr		_LVOGetFileIO(a6)
		move.l	d0,FileIO
		bne.s		gotIO
		lea		IOerR,a4
		moveq		#5,d0
		moveq		#75,d1
		bsr		print_msg
		moveq		#100,d1
		movea.l	_DOSBase,a6
		jsr		_LVODelay(a6)
		bra		clF
  ;---Set up info file suppression
gotIO	movea.l	d0,a0
		Bset.b	#INFO_SUPPRESS,1(a0)  ;INFO_SUPPRESS ON
  ;--Set up the XY co-ordinates of where the requester will open
  ; If we used DoFileIOWindow(), we wouldn't need to set co-ordinates.
		moveq		#6,d0
		move.w	d0,FILEIO_X(a0)  ;x position
		moveq		#11,d0
		move.w	d0,FILEIO_Y(a0)  ;y position
	;---Setup buffer for path name
		lea		_BUFFER2,a1
		move.l	a1,FILEIO_BUFFER(a0)
	;---Setup Pens and DrawMode
		moveq		#1,d0
		move.b	d0,FILEIO_DRAWMODE(a0)
		move.b	d0,FILEIO_PENA(a0)
;====Create a mask of the Window's UserPort's mp_Sigbit=====
		movea.l	WindowPtr,a3
		movea.l	86(a3),a0
		move.b	15(a0),d0
		moveq		#0,d7
		Bset.l	d0,d7
;----Print out Directions
START	bsr		print_directions
;********************** MAIN LOOP ******************************
;=====Get the message that arrived at our UserPort====
E4		movea.l	86(a3),a0
		movea.l	_SysBase,a6
		jsr		_LVOGetMsg(a6)
		move.l	d0,d1
		bne.s		E7
;===Check if we are ready to exit the program=====
		Btst.b	#0,Quit
		beq		delFile
;===Wait for a message sent to our Window (from Intuition)===
		move.l	d7,d0
		jsr		_LVOWait(a6)
		bra.s		E4
;====Copy all the info we want from the IntuiMessage====
E7		movea.l	d0,a1
		lea		20(a1),a0  ;get the address of the first field to copy.
		move.l	(a0)+,d6   ;Copy the Class field to d6
		move.w	(a0)+,d5   ;Copy the Code field to d5
		move.w	(a0)+,d4   ;Copy the qualifier field to d4
		movea.l	(a0)+,a2   ;Copy the IAddress field to a2
		move.w	(a0)+,d3   ;Copy MouseX position to d3
		move.w	(a0)+,d2   ;Copy MouseY position to d2
;====Now reply to the message so Intuition can dispose of it
E8		;Address of the message is in a1.
		jsr		_LVOReplyMsg(a6)
;========switch (class)=========
		Bclr.l	#3,d6  ;MOUSEBUTTONS
		bne.s		GADG
		Bclr.l	#9,d6  ;CLOSEWINDOW
		beq.s		E4
;=========case CLOSEWINDOW:============
CW		Bclr.b	#0,Quit
		bra.s		E4
;=========case MOUSEBUTTONS:===========
;---Make sure that it's an UP select if MOUSEBUTTONS
GADG	subi.b	#$68,d5
		beq		E4     ;ignore down
	;---get the user's filename and load the 8SVX file
E2		bsr		load_8SVX
		subq.b	#1,d0
		bne.s		Cerr
	;---Convert the file to SAMP and save
		bsr		convert_8SVX
		subq.b	#1,d0
		bne.s		Cerr
		;---Indicate a successful conversion
		lea		Success,a4
	;---delete the 8SVX conversion buffer if it exists
Cerr	bsr		free_data
		move.l	a4,-(sp)
		bsr		blank
	;---Print the returned error message
		movea.l	_RequesterBase,a6
		movea.l	a3,a0
		move.l	(sp)+,d0
		jsr		_LVOAutoMessage(a6)
		bra		START
;******************** Exit the Program *********************
     ;If the pointer to FileIO was NULL, then
     ;ReleaseFileIO just returns, so it's safe to
     ;always release any return value of GetFileIO.
delFile:
		movea.l	FileIO,a1
		movea.l	_RequesterBase,a6
		jsr		_LVOReleaseFileIO(a6)
	;---Close the graphics lib
clF	movea.l	_RequesterBase,a1
		movea.l	_SysBase,a6
		jsr		_LVOCloseLibrary(a6)
	;---Close the window
clW	movea.l	WindowPtr,a0
		movea.l	_IntuitionBase,a6
		jsr		_LVOCloseWindow(a6)
	;---Close the Intuition Lib
clI	movea.l	_SysBase,a6
		movea.l	_IntuitionBase,a1
		jsr		_LVOCloseLibrary(a6)
	;---Close the graphics lib
clG	movea.l	_GfxBase,a1
		jmp		_LVOCloseLibrary(a6)

	XDEF	load_8SVX
load_8SVX:
		movem.l	d2/d3/d4/d5,-(sp)
	;---Get the user's filename via the FileIO requester
		movea.l	WindowPtr,a1
		movea.l	FileIO,a0
		movea.l	_RequesterBase,a6
		jsr		_LVODoFileIO(a6)
		move.l	d0,d1
		bne.s		L92    ;If 0, must have been an error
		lea		LibErr,a4
outL	movem.l	(sp)+,d2/d3/d4/d5
		rts
L92	addq.l	#1,d0
		bne.s		L90
	;---If -1, user must have selected CANCEL
		lea		Cancel,a4
		bra.s		outL
	;---Get the File's Size
L90	movea.l	FileIO,a0
		move.l	FILEIO_FILESIZE(a0),d0
		move.l	d0,FileSize
		bne.s		L89
		;---If size = 0, then this file must not exist (in this directory)
L95	lea		CantFind,a4
		bra.s		outL
	;---get a conversion buffer to copy in the entire 8SVX file
L89	movea.l	_SysBase,a6
		moveq		#1,d1
		jsr		_LVOAllocMem(a6)
		move.l	d0,_8SVXData   ;the address of conversion buffer
		bne.s		L93
		move.l	d0,FileSize    ;size of conversion buffer
		lea		NoMem,a4
		bra.s		outL
	;---Open the file
L93	moveq		#0,d2
		move.w	#MODE_OLDFILE,d2
		lea		_BUFFER2,a0
		move.l	a0,d1
		movea.l	_DOSBase,a6
		jsr		_LVOOpen(a6)
		move.l	d0,d4
		beq.s		L95
	;---Make sure that this is an 8SVX file
		moveq		#20,d3     ;read the first 20 bytes
		move.l	_8SVXData,d2
		move.l	d4,d1
		jsr		_LVORead(a6)
		sub.l		d0,d3
		bne.s		CloseR
		movea.l	_8SVXData,a0
		addq.l	#8,a0
		move.l	_8SVX,d0
		sub.l		(a0),d0
		beq.s		readin
		;---Not 8SVX
NotIFF:
		move.l	d4,d1
		jsr		_LVOClose(a6)
		moveq		#0,d0
		lea		Not8SVX,a4
		bra		outL
	;---Read in the rest of the file (starting with VHDR's oneShotHiSamples)
readin:
		move.l	FileSize,d3
		moveq		#20,d0
		sub.l		d0,d3
		move.l	_8SVXData,d2 
		move.l	d4,d1
		jsr		_LVORead(a6)
		sub.l		d0,d3
CloseR:
		move.l	d4,d1
		jsr		_LVOClose(a6)
		moveq		#1,d0
		move.l	d3,d1
		beq		outL
		lea		ReadErr,a4
		moveq		#0,d0
		bra		outL

; This frees the conversion buffer when we are done with it, and also
; re-initializes the data section for converting another file.

	XDEF	free_data
free_data:
		lea		_8SVXData,a0
		move.l	(a0),d0
		beq.s		no8D
		clr.l		(a0)+
		movea.l	d0,a1
		move.l	(a0),d0  ;FileSize
		movea.l	_SysBase,a6
		jsr		_LVOFreeMem(a6)
no8D	move.l	#518+8+8+4,sizeOfChunks
		clr.l		ATAKptr
		clr.l		RLSEptr
		clr.l		sizeOfBODY
		clr.l		nameSize
		moveq		#-1,d0
		move.w	d0,midiSampNum
		lea		playMap,a1
		moveq		#128-1,d0
cpm	clr.l		(a1)+
		dbra		d0,cpm
		rts

	XDEF	divide
	;This routine divides 2 LONGS passed in d0 and d1.
	;d0 = d0/d1 with d2 = the remainder.
divide:
	moveq		#0,d2
	moveq		#31,d3
_1	asl.l		#1,d0
	roxl.l	#1,d2
	cmp.l		d1,d2
	bcs.s		_2
	sub.l		d1,d2
	addq.l	#1,d0
_2	Dbra		d3,_1
	rts

	XDEF	convert_8SVX
convert_8SVX:
		movem.l	d2/d3/d4/d5/a3/a4,-(sp)
	;---Make the SAMP playMap. Assign each interpolation an octave in the map
	;   The numOfChans in the playMap will be 4.
		movea.l	_8SVXData,a4
		lea		playMap,a1
		moveq		#0,d0
		move.b	14(a4),d0	;the number of octaves in the 8SVX file
		beq		CCC
	;---limit to 10 octaves of the 8SVX file (numbered 1 to 10)
		moveq		#10,d1
		cmp.b		d1,d0
		bls.s		okOT
		move.b	d1,d0
okOT	move.b	d0,numOfWaves
nto	moveq		#12-1,d1		;1 octave of notes
octt	move.b	d0,(a1)+
		move.b	d0,(a1)+
		move.b	d0,(a1)+
		move.b	d0,(a1)+
		Dbra		d1,octt
		subq.b	#1,d0
		bne.s		nto
	;---Store the sampleRate
		move.w	12(a4),d1	;samplesPerSec
		beq.s		def
		move.l	d1,sampleRate
		;---calculate samplePeriod
		move.l	#1000000000,d0 ;in nanoseconds
		bsr.s		divide
		move.l	d0,samplePeriod
def	lea		20(a4),a0      ;the chunk after VHDR
;================PROCESS AN 8SVX CHUNK================
nChk	bsr		DoWeWantIt
		beq		BodyHandler ;the last chunk in 8SVX
		subq.b	#1,d0
		beq.s		DoName
		subq.b	#1,d0
		beq		DoATAK
		subq.b	#1,d0
		beq		DoRLSE
	;---Throw away this chunk (i.e. ANNO, AUTH)
thrw	move.l	4(a0),d0	;chunk size
		Btst.l	#0,d0
		beq.s		even
		addq.l	#1,d0
even	addq.l	#8,a0
		adda.l	d0,a0		;skip to the end of the chunk
		bra.s		nChk
;--'NAME': Copy the "Master" name to name buffer and count # of chars
;  including NULL (+1 to append the wave number). Calculate the final
;  resulting chunk size. Make sure that the name is an even # of bytes.
DoName:
		lea		name,a1
		moveq		#19-1,d0	;copy 19 chars (including NULL) Max
		movea.l	a0,a3
		addq.l	#8,a3
		move.l	a1,d1
cnm	move.b	(a3)+,(a1)+
		Dbeq		d0,cnm
		move.l	a1,d0
		clr.b		-(a1)
		sub.l		d1,d0		;length of 1 wave name counting NULL
		addq.l	#1,d0		;allow for appending the wave (octave) number
		Btst.l	#0,d0
		beq.s		EVEN
		addq.l	#1,d0
		move.b	#' ',(a1)+
EVEN	move.l	a1,nameNULL
		moveq		#0,d1
		move.b	numOfWaves,d1
		mulu.w	d1,d0     
		move.l	d0,nameSize
		bra.s		thrw
;---Note the address and size (bytes) of the ATAK chunk. We'll copy it to
;   disc verbatim...once for each wave.
DoATAK:
		movea.l	a0,a3
		addq.l	#4,a3
		move.l	(a3)+,d0
		move.l	d0,sizeOfATAK ;This should always be even.
		move.l	a3,ATAKptr    ;addr of EGpoints[]
	;---add the (size of chunk) x numOfWaves to sizeOfBODY
sze	moveq		#0,d1
		move.b	numOfWaves,d1
		mulu.w	d1,d0        ;should actually be a LONG multiply just in case!
		add.l		d0,sizeOfBODY
		bra.s		thrw
DoRLSE:
		movea.l	a0,a3
		addq.l	#4,a3
		move.l	(a3)+,d0
		move.l	d0,sizeOfRLSE
		move.l	a3,RLSEptr  ;addr of EGPoints[]
		bra.s		sze
;================== BODY ==========================
BodyHandler:
;Calculate size of BODY and total size of all chunks
		addq.l	#8,a0			;get beginning of sample data
		lea		SampleInfo0,a3
		move.b	numOfWaves,d0
		subq.b	#1,d0
		move.l	(a4),d4		;oneShotHiSamples
		move.l	4(a4),d5		;repeatHiSamples
		move.l	a0,(a3)+
		move.l	d4,(a3)+
		move.l	d4,d1
		add.l		d5,d1			;total size of this wave
		move.l	d1,d2			;store sum of all wave sizes in d2
		moveq		#80,d3		;80 byte waveHeader in BODY for each wave
		bra.s		_1o
	;---Store one wave's waveHeader
agns	move.l	a0,(a3)+		;start address of sample data
		lsl.l		#1,d4			;2x oneShot size
		move.l	d4,(a3)+		;size of oneShot (also loopStart offset)
		lsl.l		#1,d5			;size of loop portion
		move.l	d5,d1
		add.l		d4,d1
		add.l		d1,d2
_1o	add.l		d3,d2			;add size of waveHeader
		move.l	d1,(a3)+		;loopEnd offset (also this wave's waveSize)
		adda.l	d1,a0			;next wave
		Dbra		d0,agns
		add.l		d2,sizeOfBODY
	;---calculate the total size of ALL chunks in the SAMP file
		move.l	nameSize,d0
		beq.s		noNh
		addq.l	#8,d0			;add 8 bytes for NAME header
noNh	add.l		sizeOfBODY,d0
		add.l		d0,sizeOfChunks
;============== ASK THE USER TO DETERMINE THE INSTRUMENT TYPE =============
		lea		InsTypeName,a1
		movea.l	_SysBase,a6
		moveq		#0,d0
		jsr		_LVOOpenLibrary(a6)
		move.l	d0,d2
		beq.s		sunk
		movea.l	d0,a6
		movea.l	ScreenPtr,a1
		jsr		_LVOGetInsType(a6)
		move.w	d0,d2
		bpl.s		gtyp
		moveq		#0,d2
gtyp	movea.l	a6,a1
		movea.l	_SysBase,a6
		jsr		_LVOCloseLibrary(a6)
sunk	move.b	d2,Itype
;======================= GET NEW FILENAME =====================
	;---Does user want to save the same Filename with .SAMP extention?
unkn	lea		_BUFFER2,a0
		lea		SAMPext,a1
		movem.l	a2/a3,-(sp)
		bsr		appendstr
		movea.l	_RequesterBase,a6
		movea.l	WindowPtr,a0
		lea		_BUFFER2,a2
		lea		Same,a1
		suba.l	a3,a3
		jsr		_LVOAutoPrompt3(a6)
		movem.l	(sp)+,a2/a3
		move.b	d0,d1
		bne.s		sav
	;---Get a new name via the FileIO lib
	;---DoFileIO(FileIO, window)
		movea.l	WindowPtr,a1
		movea.l	FileIO,a0
		jsr		_LVODoFileIO(a6)
		addq.l	#1,d0
		bne.s		sav
		;If -1, user must have selected CANCEL. Abort the Conversion.
		lea		Cancel,a4
outS	movem.l	(sp)+,d2/d3/d4/d5/a3/a4
		rts
;======================== WRITE THE SAMP FILE ===================
	;---Create this file
sav	lea		_BUFFER2,a0
		movea.l	_DOSBase,a6
		move.l	a0,d1
		moveq		#0,d2
		move.w	#MODE_NEWFILE,d2
		jsr		_LVOOpen(a6)
		move.l	d0,d4
		bne.s		fh
	;---error
CCC	lea		CantCreate,a4
		bra.s		outS
	;---Write SAMP and MHDR chunks, and the 8 byte NAME header (if it exists)
fh		moveq		#0,d3
		move.w	#518+8+8+4,d3
		move.l	nameSize,d2
		beq.s		nNH
		addq.l	#8,d3
nNH	lea		SAMPFORM,a0
		move.l	a0,d2
		move.l	d4,d1
		jsr		_LVOWrite(a6)
		sub.l		d0,d3
		beq.s		wwOK
	;---WRITE error
WE		move.l	d4,d1
		jsr		_LVOClose(a6)
		lea		_BUFFER2,a0
		move.l	a0,d1
		jsr		_LVODeleteFile(a6)
		lea		WriteErr,a4
		moveq		#0,d0
		bra.s		outS
	;---Write the NAME chunk (if nameSize is not 0)
wwOK	move.l	nameSize,d0
		beq.s		WrOK
		moveq		#0,d5
		move.b	numOfWaves,d5
		subq.b	#1,d5
	;---append the wave number each time that we write out the name
nnnn	movea.l	nameNULL,a0
		move.b	d5,d1
		addi.b	#'0',d1
		move.b	d1,(a0)+
		clr.b		(a0)+
		lea		name,a1
		move.l	a1,d2
		suba.l	a1,a0
		move.l	a0,d3
		move.l	d4,d1
		jsr		_LVOWrite(a6)
		sub.l		d0,d3
		bne.s		WE
		Dbra		d5,nnnn
	;---Save the 8 byte BODY header
WrOK	lea		BODY,a0
		moveq		#8,d3
		move.l	a0,d2
		move.l	d4,d1
		jsr		_LVOWrite(a6)
		sub.l		d0,d3
		bne.s		WE
;********** SAVE WAVES (80 byte waveHeader and data for each wave) *********
		lea      SampleInfo0,a3
		moveq    #0,d5
		move.b   numOfWaves,d5
		moveq    #12,d0
		mulu.w   d5,d0
		addq.b   #6,d0
		move.b   d0,rootNote  ;set the rootNote for the highest octave
		subq.b   #1,d5
;================ SAVE 1 WAVE =====================
savesam:
	;---Store BODY parameters for this wave
		lea      waveSize,a0
		move.l   8(a3),(a0)+ ;store loopEnd in waveSize
		addq.w   #1,(a0)     ;inc midiSampNum
		addq.l   #8,a0
		addq.l   #4,a0
		move.l   4(a3),(a0)+ ;store loopStart
		move.l   8(a3),(a0)+ ;store loopEnd
		subi.b   #12,(a0)    ;dec to middle of previous octave
	;---Write the 80 byte waveHeader
		moveq    #80,d3
		lea      waveHeader,a0
		move.l   a0,d2
		move.l   d4,d1
		jsr      _LVOWrite(a6)
		sub.l    d0,d3
		bne      WE
	;---see if there are ATAK EgPoints to write
		move.l   ATAKptr,d2
		beq.s    noAT
		move.l   sizeOfATAK,d3
		move.l   d4,d1
		jsr      _LVOWrite(a6)
		sub.l    d0,d3
		bne      WE
	;---Write any RLSE EgPoints
noAT	move.l   RLSEptr,d2
		beq.s    noRT
		move.l   sizeOfRLSE,d3
		move.l   d4,d1
		jsr      _LVOWrite(a6)
		sub.l    d0,d3
		bne      WE
	;---write the wave's data
noRT	move.l   (a3)+,d2
		move.l   d4,d1
		addq.l   #4,a3
		move.l   (a3)+,d3
		jsr      _LVOWrite(a6)
		sub.l    d0,d3
		bne      WE
	;---do the next wave
		Dbra     d5,savesam
	;---close the file and return success
		move.l   d4,d1
		jsr      _LVOClose(a6)
		moveq    #1,d0
		bra      outS

	XDEF	appendstr
appendstr:
		move.b	(a0)+,d1
		bne.s		appendstr
		subq.l	#1,a0
appp	move.b	(a1)+,(a0)+
		bne.s		appp
		rts

   XDEF DoWeWantIt
DoWeWantIt:
		move.l	(a0),d0
		cmp.l		NAME,d0
		beq.s		itsNAME
		cmp.l		ATAK,d0
		beq.s		itsATAK
		cmp.l		RLSE,d0
		beq.s		itsRLSE
		sub.l		BODY,d0
		bne.s		unKn
		rts
itsNAME:
		moveq		#1,d0
		rts
itsATAK:
		moveq		#2,d0
		rts
itsRLSE:
		moveq		#3,d0
		rts
unKn	moveq		#-1,d0
		rts

    ; SECTION ToSAMPData,Data   ;UnComment if not using CAPE

   XDEF   newWindow
newWindow:
			dc.w   0,0
			dc.w   640,200
			dc.b   0,1
 ;IDCMP = MOUSEBUTTONS|CLOSEWINDOW|RAWKEY
			dc.l   $608
;WindowFlags = WINDOWCLOSE|WINDOWDEPTH|SMART_REFRESH|ACTIVATE (no FOLLOWMOUSE
;allowed as that messes up the requester when using DoFileIO(). If you need
;FOLLOWMOUSE, then use DoFileIOWindow() to open the req in its own window.)
			dc.l   $100C
			dc.l   0
			dc.l   0
			dc.l   WINTITLE
ScreenPtr dc.l   0
			dc.l   0
			dc.w   96,30
			dc.w   320,200
			dc.w   1         ;WBENCHSCREEN

TextAttr:		;Topaz 8 is a ROM font so doesn't need to be opened
	dc.l	FONTNAME
	dc.w	8		;TOPAZ_EIGHTY
	dc.b	0,0

	XDEF	_GfxBase,_IntuitionBase,_RequesterBase,WindowPtr,RastPort
	XDEF	_8SVXData,FileSize,FileIO,RequesterName,nameNULL,name,nameSize,NAME

_GfxBase			dc.l  0
_IntuitionBase	dc.l  0
_RequesterBase	dc.l  0
WindowPtr		dc.l  0
RastPort			dc.l  0
_8SVXData		dc.l  0
FileSize			dc.l  0
FileIO			dc.l  0

ATAK			dc.b	'ATAK'
RLSE			dc.b	'RLSE'
_8SVX			dc.b	'8SVXVHDR'
nameNULL		dc.l	name
name			ds.b	20		;buffer for the NAME chunk

	XDEF SAMP,sizeOfChunks,MHDR,sizeOfMHDR,playMap,numOfWaves,BODY,sizeOfBODY
	XDEF name,waveSize,midiSampNum,loopType,sampleRate,samplePeriod
	XDEF loopStartPoint,loopEndPoint,rootNote,sizeOfATAK,ATAKptr,RLSEptr
	XDEF sizeOfRLSE,SampleInfo0,sizeOfFATK

;===================== SAMP PORTION ==========================
SAMPFORM			dc.b	'FORM'
sizeOfChunks	dc.l	518+8+8+4	;MHDR size + MHDR Header + BODY Header (add
											;sizeOfBODY, nameSize, other chunks size)
SAMP				dc.b	'SAMP'
;------------------------------
MHDR				dc.b	'MHDR'
sizeOfMHDR		dc.l	518
numOfWaves		dc.b	0
sampleFormat	dc.b	8
Flags				dc.b	0
playMode			dc.b	1		;MULTI default
numOfChans		dc.b	4		;each midi note has 4 bytes in the playMap
mhdrPad			dc.b	0
playMap			ds.l	128	;4 bytes for each of 128 midi notes
NAME				dc.b	'NAME'
nameSize			dc.l	0

;------------------------------
BODY				dc.b 'BODY'
sizeOfBODY		dc.l 0		;add size of ATAK, RLSE, waveSize, and 80 bytes
									;(for each wave's header)
;for each wave, store these 80 bytes
waveHeader:
waveSize			dc.l 0
midiSampNum		dc.w -1		;inc for each wave
loopType			dc.b 0		;forward
Itype				dc.b 0		;unKnown
samplePeriod	dc.l 55556	;assume some default
sampleRate		dc.l 18000	;ditto
loopStartPoint	dc.l 0
loopEndPoint	dc.l 0
rootNote			dc.b 0		;set to the note # in middle of each octave (i.e.
									;note number = 6 for the lowest octave)
velocityStart	dc.b 0
velStartTable	ds.w 16
sizeOfATAK		dc.l 0
sizeOfRLSE		dc.l 0
sizeOfFATK		dc.l 0
sizeOfFRLS		dc.l 0
sizeOfUserData	dc.l 0
typeOfData		dc.w 0


ATAKptr			dc.l 0
RLSEptr			dc.l 0

; For 10 waves
SampleInfo0	dc.l 0 ;oneShot Start
				dc.l 0 ;byte offset to loopStart
				dc.l 0 ;byte offset to loopEnd (from wave beginning)
SampleInfo1	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo2	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo3	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo4	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo5	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo6	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo7	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo8	dc.l 0
				dc.l 0
				dc.l 0
SampleInfo9	dc.l 0
				dc.l 0
				dc.l 0

	XDEF	SAMPext,Same,NoMem,ReadErr,WriteErr,Not8SVX,Cancel,CantFind
	XDEF	CantCreate,Quit,LibErr,Success,_BUFFER2,Directions

SAMPext			dc.b  '.SAMP',0
Same				dc.b  'Would you like to save this SAMP file as',0
NoMem				dc.b  'No memory for copy buffer.',0
ReadErr			dc.b  'A read error occurred.',0
WriteErr			dc.b  'A write error occurred.',0
Not8SVX			dc.b  'Not an IFF 8SVX file',0
Cancel			dc.b  'Conversion canceled',0
CantFind			dc.b  'Can',$27,'t find the source file.',0
CantCreate		dc.b  'Can',$27,'t create the destination file.',0
WINTITLE			dc.b  '8SVX to SAMP Conversion  © 1989  dissidents',0
Quit				dc.b  1
LibErr			dc.b  'FileIO library failure',0
Success			dc.b  '8SVX file successfully converted.',0
InsTypeName		dc.b	'instype.library',0

 ; Use the following string area for Pathname buffer
_BUFFER2:
GfxName			dc.b  'graphics.library',0
IntuitionName	dc.b  'intuition.library',0
RequesterName	dc.b  'requester.library',0
FileReqErr		dc.b  'Cannot find the "requester.library"',0
IOerR				dc.b  'Cannot get a FileIO structure.',0
FONTNAME			dc.b  'topaz.font',0
					ds.b  130

Click				dc.b  'Click mouse for file selection or CLOSEWINDOW.',0

Directions:
 dc.b 'This program will convert an IFF 8SVX sampled sound file to the SAMP',0 
 dc.b 'format. It requires the FileIO library in the libs drawer of your boot',0
 dc.b 'disk. Click the mouse select button to begin filename selection, or',0
 dc.b 'click on the CLOSE gadget to exit. Select the name of the 8SVX file to',0
 dc.b 'be converted via the FileIO requester, then select OK. If the file is',0
 dc.b 'successfully loaded and converted, you will be prompted to save the',0
 dc.b 'new SAMP file in the same directory with a .SAMP extention added. You',0
 dc.b 'may otherwise choose to enter a new name via the FileIO string gadgets.',0
 dc.b 'If the SAMP file is successfully saved, a requester will indicate so.',0
 dc.b 'This program was written by Jeff Glatt of dissidents.',0

SPACES:
 dc.b '                                                                        ',0

