
	INCDIR	TRANSASM:
	INCLUDE	TRANSFERASM.I

	TRANSFERHEAD	TRANSROUT,ENDOFTRANS,supermagicdrive,"superMagicDriveTransfer 1.0 By Deftronic of Crionics"


;FUNC: GETLABEL
;---------------------------------
;INPUT: A1
;---------------------------------
;A1.l=A LABELTEXT (look in source)
;---------------------------------
;OUTPUT: D1 D2 D3
;---------------------------------
;D1.W=	$00 NOLABEL
;	$62 A LABEL
;D2.LowByte
;	SECTION NUMBER
;D2.HighByte
;	LB_CONSTANT	= $00
;	LB_MACRO	= $80
;	LB_SET		= $81
;	LB_XREF		= $82
;	LB_EQUR		= $83
;	LB_REG		= $84
;D3.L=	ADDRESS
;---------------------------------


;SegaBITNR=4

send		macro
		move.l	#$20000,		SendErrorCou
.\@		subq.l	#1,			SendErrorCou
		beq	SegaError
		btst	#0,			$bfd000		check busy
		bne.s	.\@
		move.b	\1,			$bfe101
		eor.b	#4,			$bfd000
		endm

sync		macro
		send	#$d5
		send	#$aa
		send	#$96
		send	\1
		send	\2
		send	\3
		send	\4
		send	\5
		move.b	#$81,			d1
		eor.b	\1,			d1
		eor.b	\2,			d1
		eor.b	\3,			d1
		eor.b	\4,			d1
		eor.b	\5,			d1
		send	d1
		endm

GENANWAIT	MACRO
		MOVEM.L		D0/D7,		-(A7)
		MOVE.W		\1,		D7
.\@		MOVE.L		$DFF004,	D0
		LSR.L		#8,		D0
		AND.W		#$1FF,		D0
		CMP.W		#$080,		D0
		BNE.S		.\@
.1\@		MOVE.L		$DFF004,	D0
		LSR.L		#8,		D0
		AND.W		#$1FF,		D0
		CMP.W		#$081,		D0
		BNE.S		.1\@
		DBF		D7,		.\@
		MOVEM.L		(A7)+,		D0/D7
		ENDM

TRANSROUT	MOVEM.L	D0-A6,			-(SP)
		MOVE.L	SP,			OLDSP

		LEA	RESETTEXT(PC),		A0
		BSR	PRINTTEXT

		IFD	SEGABITNR
		MOVE.W	#$4000,			$DFF09A
		BCLR	#SEGABITNR,		$BFD100
		MOVE.W	#1,			D1
		BSR	OFFONPAUSE
		BSET	#SEGABITNR,		$BFD100
		MOVE.W	#2*35,			D1
		BSR	OFFONPAUSE
		MOVE.W	#$C000,			$DFF09A
		ENDC

		LEA	TRANSTEXT(PC),		A0
		BSR	PRINTTEXT
		MOVEA.L	RELO_START,		A0
		CMPI.L	#$12345678,		-(A0)
		BNE.L	ERRORNOOBJECT

		CLR.L	(A0)
		BSR	CONVERT
		MOVEQ	#0,D0

		MOVE.W	NUMBER_OF_SECTIONS,	D0
		BEQ.L	ERRORNOOBJECT

		MOVE.L	SECTION_ABS_LOCATION,	A0
		TST.L	8(A0)
		BNE.W	.ERROR

		MOVE.L	SECTION_ORG_ADDRESS,	A0
		MOVE.L	(A0),			D4

		LEA	LENGTHLABEL,		A1
		JSR	GETLABEL
		TST.W	D1
		BEQ.S	.NOLABEL
		TST.W	D2
		BMI.S	.NOLABEL
		CMP.L	D3,			D4
		BLO.s	.NOLABEL
		MOVE.L	D3,			D4
.NOLABEL	ADDQ.L	#3,			D4
		AND.L	#-4,			D4
		BSR	CALCCHECKSUM

		MOVE.L	CODE_START,		A0
		ADD.L	#$3FFE,			D4
		AND.L	#-$4000,		D4
		MOVE.L	D4,			D7
		LSR.L	#8,			D7
		LSR.L	#6,			D7
		MOVE.B	#1,			NRBLOCKS
		MOVE.B	D7,			NRBLOCKS+1
		MOVEQ	#0,			D7
		BSR	DATAHEADER
		ADDQ.B	#1,			NRBLOCKS+1

		LEA	SEGABUFFER,		A1
.1		MOVE.W	(A0)+,			(A1)+
		ADDQ.L	#2,			D7
		CMP.L	#SEGABUFFER+$4000,	A1
		BNE.S	.2
		BSR	TRANSBUFFER
		LEA	SEGABUFFER,		A1
.2		MOVE.B	NRBLOCKS+1(PC),		D0
		CMP.B	NRBLOCKS(PC),		D0
		BNE.S	.1

.EXIT		SYNC	#$00,#$01,#$20,#$01,#$00
		SEND	#$03
		LEA	DONETEXT,		A0
		BRA.S	SEGAERR1
.ERROR		LEA	ERRORTEXT(PC),		A0
		BRA.S	SEGAERR1
.ERROR1		LEA	ERRORTEXT2(PC),		A0
		BRA.S	SEGAERR1
ERRORNOOBJECT	LEA	ERRORTEXT3(PC),		A0
		BRA.S	SEGAERR1
SEGAERROR	LEA	ERRORTEXT1(PC),		A0
SEGAERR1	BSR	PRINTTEXT
		BSR	RESTORE
		MOVE.L	RELO_START,		A0
		MOVE.L	#$12345678,		-(A0)
		MOVE.L	OLDSP,			SP
		MOVEM.L	(SP)+,			D0-A6
		RTS

OFFONPAUSE	GENANWAIT	D1
		RTS

ResetText	dc.b	'Reseting Sega!',$d,$a,0
ErrorText	dc.b	'** Only 2 Sections Allowed',$d,$a,0
ErrorText1	dc.b	'** SEGA lost connection',$d,$a,0
ErrorText2	dc.b	'** Code In Data Section',$d,$a,0
ErrorText3	dc.b	'** Error no object',$d,$a,0
Transtext	dc.b	'Transferring to SEGA..',$d,$a,0
Donetext	dc.b	'Transfer Done..',$d,$a,0
BlockText	dc.b	'Block '
.0		dc.b	'000 > '
.1		dc.b	'000 ',$d,0
		even

SendErrorCou	dc.l	0

CALCBLOCKTXT	LEA	BLOCKTEXT\.0,		A0
		MOVEQ	#0,			D0
		MOVE.B	NRBLOCKS(PC),		D0
		DIVU	#10,			D0
		SWAP	D0
		ADD.W	#$30,			D0
		MOVE.B	D0,			2(A0)
		CLR.W	D0
		SWAP	D0
		DIVU	#10,			D0
		ADD.L	#$00300030,		D0
		MOVE.B	D0,			(A0)
		SWAP	D0
		MOVE.B	D0,			1(A0)

		LEA	BLOCKTEXT\.1(PC),	A0
		MOVEQ	#0,			D0
		MOVE.B	NRBLOCKS+1(PC),		D0
		SUB.B	NRBLOCKS(PC),		D0
		DIVU	#10,			D0
		SWAP	D0
		ADD.W	#$30,			D0
		MOVE.B	D0,			2(A0)
		CLR.W	D0
		SWAP	D0
		DIVU	#10,			D0
		ADD.L	#$00300030,		D0
		MOVE.B	D0,			(A0)
		SWAP	D0
		MOVE.B	D0,			1(A0)
		RTS

TRANSBUFFER	MOVEM.L	D0-A6,			-(SP)

		BSR	CALCBLOCKTXT
		LEA	BLOCKTEXT(PC),		A0
		BSR	PRINTTEXT


		SYNC	#$00,#$00,#$80,#$00,#$40
		MOVE.B	#$81,			D0
		MOVE.W	#$2000-1,		D7
		LEA	SEGABUFFER,		A0
		LEA	1(A0),			A1
.1		MOVE.B	(A1),			D1
		ADDQ.W	#2,			A1
		EOR.B	D1,			D0
		SEND	D1
		DBF	D7,			.1
		MOVE.W	#$2000-1,		D7
		LEA	(A0),			A1
.2		MOVE.B	(A1),			D1
		ADDQ.W	#2,			A1
		EOR.B	D1,			D0
		SEND	D1
		DBF	D7,			.2
		SEND	D0
		MOVE.B	NRBLOCKS(PC),		D6
		CMP.B	NRBLOCKS+1(PC),		D6
		BEQ.W	.3
		SYNC	#$05,D6,#$00,#$00,#$00
.3		ADDQ.B	#1,			NRBLOCKS
		MOVEM.L	(SP)+,			D0-A6
		RTS

DATAHEADER	MOVEM.L	D0-A6,			-(SP)
		ST	$BFE301
		AND.B	#$FE,			$BFD200
		OR.B	#$04,			$BFD200
		SYNC	#$00,#$00,#$DC,#$00,#$02
		LEA	HEADERBLOCK(PC),	A1
		MOVE.B	NRBLOCKS+1,		(A1)
		MOVEQ	#16-1,			D7
		MOVE.B	#$81,			D0
.1		MOVE.B	(A1)+,			D1
		EOR.B	D1,			D0
		SEND	D1
		DBF	D7,			.1
		MOVE.W	#512-16-1,		D7
.2		SEND	D1
		DBF	D7,			.2
		SEND	D0
		SYNC	#$05,#$00,#$00,#$00,#$00
		MOVEM.L	(SP)+,			D0-A6
		RTS

NRBLOCKS	DC.W	0
HEADERBLOCK	DC.W	$2003,$0000,$0000,$0000,$AABB,$0600,$0000,$0000

CONVERT	MOVE.L	RELO_START,A0			;Convert Amiga Object
	MOVE.L	RELO_END,A1			;Code to SuperMagicDrive
	MOVE.L	SECTION_ABS_LOCATION,A2		;Where Code is from 0>$400000
	SUBQ.L	#4,A2
.LG7F8	CMPA.L	A0,A1				;and ram is from $ff0000 to
	BEQ.S	.LG81C				;$ffffff
	MOVEQ	#0,D0				;all Section 0 reloc's is
	MOVE.B	(A0)+,D0			;converted to offset $0
	LSL.W	#2,D0				;all Section 1 reloc's is
	MOVE.L	0(A2,D0.W),A3			;converted to offset $ff0000
	MOVEQ	#0,D0
	MOVE.B	(A0)+,D0
	BEQ.S	.LG818
	LSL.W	#2,D0
	MOVE.L	0(A2,D0.W),D1
	CMP.B	#2*4,D0
	BNE.S	.1
	SUB.L	#$FF0000,D1
.1	ADD.L	(A0)+,A3
	SUB.L	D1,(A3)
	BRA.S	.LG7F8
.LG818	ADDQ.W	#8,A0
	BRA.S	.LG7F8
.LG81C	RTS

RESTORE	MOVE.L	RELO_START,A0			;Restores Sections for
	MOVE.L	RELO_END,A1			;Amiga use
	MOVE.L	SECTION_ABS_LOCATION,A2
	SUBQ.L	#4,A2
.LG82A	CMPA.L	A0,A1
	BEQ.S	.LG84E
	MOVEQ	#0,D0
	MOVE.B	(A0)+,D0
	LSL.W	#2,D0
	MOVEA.L	0(A2,D0.W),A3
	MOVEQ	#0,D0
	MOVE.B	(A0)+,D0
	BEQ.S	.LG84A
	LSL.W	#2,D0
	MOVE.L	0(A2,D0.W),D1
	CMP.B	#2*4,D0
	BNE.S	.1
	SUB.L	#$FF0000,D1
.1	ADD.L	(A0)+,A3
	ADD.L	D1,(A3)
	BRA.S	.LG82A
.LG84A	ADDQ.W	#8,A0
	BRA.S	.LG82A
.LG84E	RTS

CALCCHECKSUM
	MOVEM.L	D0-A6,-(SP)
	LEA	(A0,D4.L),A1
	CLR.W	$18E(A0)
	MOVE.L	A0,-(SP)
	MOVEQ	#0,D0
	MOVEQ	#0,D1
	ADD.W	#$200,A0
.LOOP	ADD.W	(A0)+,D0
	ADDQ.W	#1,D1
	CMP.L	A0,A1
	BHI.S	.LOOP
	MOVE.L	(SP)+,A0
	MOVE.W	D0,$18E(A0)
	MOVEM.L	(SP)+,D0-A6
	RTS

LENGTHLABEL
	dc.w	'EN','DO','FM','OD','UL','E'<<8!$8000,0	;ENDOFMODULE LABEL
ENDOFTRANS

	section	Buffers,BSS_P

SEGABUFFER	DS.B	$4000
OLDSP		DS.L	1
