*************************************************************************
* TurboTape Loader
* (C) 1995,1997 Per Håkan Sundell
* requires CCS adapter
*************************************************************************

*		incdir 	Devpac:include

*=======================================================================*
*									*
*	CODE SECTION							*
*									*
*=======================================================================*
		section	CODE,code

	
Main
	LEA	file_name,A1
	BSR	ParseArgs
	BSR	OpenLibraries
	BSR	PressPlay
	TST.L	D0
	BNE	_mbreak
	BSR	ReadHeader
	BSR	FoundFile
	TST.L	D0
	BNE	_mbreak
	BSR	PressPlay
	TST.L	D0
	BNE	_mbreak
	LEA	TXT_LOADING,A0
	BSR	Print
	BSR	ReadFileData
	TST.L	D0
	BNE	_merror
	BSR	SaveFile
	TST.L	D0
	BNE	_mserror
	RTS

_merror	LEA	TXT_LOADERROR,A0
	BSR	Print
	RTS

_mbreak	LEA	TXT_BREAK,A0
	BSR	Print
	RTS

_mserror	LEA	TXT_SAVEERROR,A0
	BSR	Print
	RTS

IrqOff
	MOVE.W	#$4000,$DFF09A
	RTS

IrqOn
	MOVE.W	#$C000,$DFF09A
	RTS

ParseArgs
	MOVEM.L	D1/D2/A1,-(SP)
	MOVEQ	#$20,D2
_pa1	SUBQ.L	#1,D0
	BMI	_pa3
	MOVE.B	(A0)+,D1
	CMP.B	#$20,D1
	BEQ	_pa1
	CMP.B	#10,D1
	BEQ	_pa3
	CMP.B	#$22,D1
	BNE	_pa2
	MOVE.B	D1,D2
	SUBQ.L	#1,D0
	BMI	_pa3
	MOVE.B	(A0)+,D1
_pa2	MOVE.B	D1,(A1)+
	SUBQ.L	#1,D0
	BMI	_pa3
	MOVE.B	(A0)+,D1
	CMP.B	#10,D1
	BEQ	_pa3
	CMP.B	D2,D1
	BNE	_pa2
_pa3	CLR.B	(A1)
	MOVEM.L	(SP)+,D1/D2/A1
	RTS

SaveFile
	LEA	file_header+5,A0
	MOVE.L	A0,D1
	MOVE.L	#$3EE,D2
	MOVE.L	dos_lib,A6
	JSR	-$1E(A6)
	MOVE.L	D0,D1
	BEQ	_sferror
	CMP.L	#$FFFFFFFF,D0
	BEQ	_sferror
	MOVE.L	D1,-(SP)
	LEA	file_header,A0
	MOVE.L	A0,D2
	MOVEQ	#2,D3
	MOVE.L	dos_lib,A6
	JSR	-$30(A6)
	MOVE.L	(SP),D1
	LEA	file_data,A0
	MOVE.L	A0,D2
	MOVE.L	file_length,D3
	MOVE.L	dos_lib,A6
	JSR	-$30(A6)
	MOVE.L	(SP)+,D1
	MOVE.L	dos_lib,A6
	JSR	-$24(A6)
	MOVEQ	#0,D0
	RTS

_sferror	MOVEQ	#1,D0
	RTS

ReadFileData
	BSR	MotorOn
	LEA	file_data,A0
	MOVE.L	A0,A1
	MOVEQ	#0,D0
	MOVEQ	#0,D1
	MOVE.B	file_header+1,D0
	MOVE.B	file_header+3,D1
	LSL.W	#8,D0
	LSL.W	#8,D1
	MOVE.B	file_header,D0
	MOVE.B  file_header+2,D1
	SUB.W	D0,D1
	ADD.L	D1,A1
	MOVE.L	D1,file_length
	BSR	ReadSync
	MOVEQ	#0,D3
_rfd1	BSR	ReadByte
	MOVE.B	D0,(A0)+
	EOR.B	D0,D3
	CMP.L	A0,A1
	BNE	_rfd1
	BSR	ReadByte
	EOR.B	D3,D0
	MOVE.L	D0,-(SP)
	BSR	MotorOff
	MOVE.L	(SP)+,D0
	AND.L	#$FF,D0
	RTS

ReadHeader
	BSR	MotorOn
	BSR	ReadSync
	CMP.B	#0,D0
	BEQ	ReadHeader
	LEA	file_header,A0
	MOVEQ	#0,D3
_rh1	BSR	ReadByte
	MOVE.B	D0,0(A0,D3.W)
	ADDQ.W	#1,D3
	CMP.B	#$C0,D3
	BNE	_rh1
	BSR	MotorOff
	RTS

ReadSync
	MOVE.W	#$7F80,D7
	MOVE.W	#$40,$DFF0A8
	MOVE.W	#$80,$DFF09C
	MOVE.W	#$80,$DFF0A6
_rs1	BTST	#6,$BFE001
	BEQ	_rs4
	BSR	ReadBit
	ROXL.B	#1,D2
	CMP.B	#2,D2
	BNE	_rs1
	MOVEQ	#9,D3
_rs2	BSR	ReadByte
	CMP.B	#2,D0
	BEQ	_rs2
_rs3	CMP.B	D3,D0
	BNE	_rs1
	BSR	ReadByte
	SUBQ.B	#1,D3
	BNE	_rs3
_rs4	RTS

ReadByte
	MOVEQ	#7,D1
_rby1	BSR	ReadBit
	ROXL.B	#1,D2
	DBRA	D1,_rby1

	MOVE.B	D2,D0
	RTS

ReadBit
	MOVEQ	#0,D0
_rb1	OR.B	$BFDD00,D0
	BTST	#4,D0
	BEQ	_rb1
	MOVE.W	#$80,$DFF09C
	MOVE.W	D7,$DFF0AA
	MOVE.W	$DFF006,$DFF180
	MOVE.B	#$19,$BFDF00
	NOT.B	D0
	AND.B	#2,D0
	SUBQ.B	#2,D0
	RTS

PressPlay
	BCLR	#5,$BFD100
	MOVE.B	$BFE001,D0
	BSET	#5,$BFD100
	BTST	#5,D0
	BEQ	_pp2
	LEA	TXT_PLAY,A0
	BSR	Print
_pp1	BTST	#6,$BFE001
	BEQ	_pp3
	BCLR	#5,$BFD100
	MOVE.B	$BFE001,D0
	BSET	#5,$BFD100
	BTST	#5,D0
	BNE	_pp1
_pp2	MOVEQ	#0,D0
	RTS

_pp3	MOVEQ	#1,D0
	RTS

MotorOn
	BSR	IrqOff
	BCLR	#7,$BFD100
	BCLR	#5,$BFD100
	MOVE.B	#0,$BFD700
	MOVE.B	#$BE,$BFD600
	MOVEQ	#0,D0
_mo1	DBRA	D0,_mo1

	RTS

MotorOff
	BSET	#7,$BFD100
	BSET	#5,$BFD100
	BCLR	#5,$BFD100
	BSET	#5,$BFD100
	BSR	IrqOn
	RTS

OpenLibraries
	LEA	doslibrary.MSG,A1
	MOVEQ	#0,D0
	MOVE.L	4,A6
	JSR	-$198(A6)
	MOVE.L	D0,dos_lib
	MOVE.L	dos_lib,A6
	JSR	-$3C(A6)
	MOVE.L	D0,std_out
	RTS

FoundFile
	LEA	TXT_FOUND,A0
	BSR	Print
	LEA	file_header+5,A0
	LEA	$10(A0),A1
_ff1	MOVE.B	-(A1),D0
	CMP.B	#$20,D0
	BNE	_ff2
	CMP.L	A0,A1
	BNE	_ff1
_ff2	CLR.B	1(A1)
	BSR	Print
	LEA	TXT_LINEFEED,A0
	BSR	Print
	MOVE.L	#$200000,D0
_ff3	BTST	#6,$BFE001
	BEQ	_ff4
	SUBQ.L	#1,D0
	BNE	_ff3
	MOVEQ	#0,D0
	RTS

_ff4	MOVEQ	#1,D0
	RTS

Print
	MOVEM.L	D2/D3/A6,-(SP)
	MOVE.L	A0,D2
	MOVEQ	#0,D3
_p1	TST.B	(A0)+
	BEQ	_p2
	ADDQ.L	#1,D3
	BRA	_p1

_p2	TST.L	D3
	BEQ	_p3
	MOVE.L	std_out,D1
	MOVE.L	dos_lib,A6
	JSR	-$30(A6)
_p3	MOVEM.L	(SP)+,D2/D3/A6
	RTS

*=======================================================================*
*									*
*	DATA SECTION							*
*									*
*=======================================================================*
	Section	DATA,data


TXT_PLAY	dc.b	10,'PRESS PLAY ON TAPE',$A,0
TXT_FOUND	dc.b	'FOUND ',0
TXT_LOADING	dc.b	'LOADING',$A,0
TXT_BREAK	dc.b	'BREAK ERROR',$A,0
TXT_LOADERROR	dc.b	'LOAD ERROR',$A,0
TXT_SAVEERROR	dc.b	'UNABLE TO CREATE AMIGA FILE ERROR',$A,0
TXT_LINEFEED	dc.b	10,0
doslibrary.MSG	dc.b	'dos.library',0,0

	Section	Bss,BSS

dos_lib		ds.l	1
std_out		ds.l	1
file_name       ds.b    80
file_header     ds.b    $100
file_length	ds.l	1
file_data	ds.b	$10000

	END
