;---------------T----------T-----------------------T
; AGAiff
;
; Last Change > 6.2.1994
; Include > extwrite.s
* 13-May-96: PC-Support

ExtWrite	; gleiche Parameter wie dos/Write, nur wird entsprechend
		; der dc.w oder File-Einstellung im SaveFormat-Gadget
		; abgespeichert !
		movem.l	d4-d7/a2-a6,-(sp)
		move.l	dosbase(pc),a6
		move.l	save.filehandle(pc),d1
		move.w	actsaveformat2(pc),d0
		bne.s	.dc
		LIBCALL	Write
		movem.l	(sp)+,d4-d7/a2-a6
		rts

.dc		subq.w	#1,d0
		bne	PCwrite
		lea	extwritebuf,a3	;WorkBuffer
		move.l	d1,d7	;filehandle
		move.w	DCbwl(pc),d4
		move.l	d2,a2	;Daten
		move.l	d3,d5	;Länge der Daten

.loop		moveq	#16,d6
		cmp.l	#16,d5	;weniger als 16 Bytes über ?
		bcc.s	.ok1
		move.w	d5,d6
		tst.w	d4	;paßt Rest in dc.b ?
		beq.s	.ok1
		cmp.w	#2,d4
		beq.s	.testdcl
		move.w	d5,d0	;paßt Rest in dc.w ?
		and.w	#$fffe,d0
		cmp.w	d0,d5
		beq.s	.ok1
		clr.w	d4
		bra.s	.ok1
.testdcl	move.w	d5,d0	;paßt Rest in dc.l ?
		and.w	#$fffc,d0
		cmp.w	d0,d5
		beq.s	.ok1
		clr.w	d4

.ok1		move.w	d4,d0
		beq.s	.ok2
		lsr.w	#1,d6
		subq.w	#1,d0
		beq.s	.ok2
		lsr.w	#1,d6
.ok2		subq.w	#1,d6
		cmp.w	#1,d4	;in D6: Anzahl der Loops-1 !
		bcs.s	.dcb
		beq.w	.dcw
.dcl		move.b	#"l",DClineintro+6-j(a5)
		bsr.w	.lineintro
		move.l	a3,a4
.dcl0		move.l	(a2)+,d0
		subq.l	#4,d5
		move.b	#"$",(a4)+
		moveq	#7,d1
.dcl1		rol.l	#4,d0
		move.b	d0,d2
		and.b	#$f,d2
		add.b	#48,d2
		cmp.b	#58,d2
		bcs.s	.dcl2
		add.b	#7+32,d2
.dcl2		move.b	d2,(a4)+
		dbra	d1,.dcl1
		tst.w	d6
		beq.s	.dcl3
		move.b	#",",(a4)+
.dcl3		dbra	d6,.dcl0
		bsr.w	.writeline

.cont1		tst.l	d5
		bne.w	.loop
		movem.l	(sp)+,d4-d7/a2-a6
		rts

.dcb		move.b	#"b",DClineintro+6-j(a5)
		bsr.s	.lineintro
		move.l	a3,a4
.dcb0		move.b	(a2)+,d0
		subq.l	#1,d5
		move.b	#"$",(a4)+
		moveq	#1,d1
.dcb1		rol.b	#4,d0
		move.b	d0,d2
		and.b	#$f,d2
		add.b	#48,d2
		cmp.b	#58,d2
		bcs.s	.dcb2
		add.b	#7+32,d2
.dcb2		move.b	d2,(a4)+
		dbra	d1,.dcb1
		tst.w	d6
		beq.s	.dcb3
		move.b	#",",(a4)+
.dcb3		dbra	d6,.dcb0
		bsr.s	.writeline
		bra.s	.cont1

.dcw		move.b	#"w",DClineintro+6-j(a5)
		bsr.s	.lineintro
		move.l	a3,a4
.dcw0		move.w	(a2)+,d0
		subq.l	#2,d5
		move.b	#"$",(a4)+
		moveq	#3,d1
.dcw1		rol.w	#4,d0
		move.b	d0,d2
		and.b	#$f,d2
		add.b	#48,d2
		cmp.b	#58,d2
		bcs.s	.dcw2
		add.b	#7+32,d2
.dcw2		move.b	d2,(a4)+
		dbra	d1,.dcw1
		tst.w	d6
		beq.s	.dcw3
		move.b	#",",(a4)+
.dcw3		dbra	d6,.dcw0
		bsr.s	.writeline
		bra.w	.cont1

.lineintro	move.l	d7,d1
		move.l	#DClineintro,d2
		moveq	#8,d3
		LIBJMP	Write
.writeline	move.l	d7,d1
		move.l	a3,d2
		move.l	a4,d3
		sub.l	a3,d3
		LIBJMP	Write

DClineintro	dc.b	10,9,9,"dc.b",9
		even
DCbwl		dc.w	2	;0b, 1w, 2l


PCwrite		lea	extwritebuf,a3	;WorkBuffer
		move.l	d1,d7	;filehandle
		move.l	d2,a2	;Daten
		move.l	d3,d5	;Länge der Daten

.loop		moveq	#10,d6
		cmp.l	#10,d5	;weniger als 16 Bytes über ?
		bcc.s	.ok1
		move.w	d5,d6
.ok1		subq.w	#1,d6

		bsr	.lineintro
		move.l	a3,a4
.dcb0		move.b	(a2)+,d0
		subq.l	#1,d5
		move.b	#"0",(a4)+
		moveq	#1,d1
.dcb1		rol.b	#4,d0
		move.b	d0,d2
		and.b	#$f,d2
		add.b	#48,d2
		cmp.b	#58,d2
		bcs.s	.dcb2
		add.b	#7+32,d2
.dcb2		move.b	d2,(a4)+
		dbra	d1,.dcb1
		tst.w	d6
		beq.s	.dcb3
		move.b	#"h",(a4)+
		move.b	#",",(a4)+
.dcb3		dbra	d6,.dcb0
		bsr.s	.writeline

		tst.l	d5
		bne.w	.loop
		movem.l	(sp)+,d4-d7/a2-a6
		rts

.lineintro	move.l	d7,d1
		move.l	#PClineintro,d2
		moveq	#7,d3
		LIBJMP	Write
.writeline	move.l	d7,d1
		move.l	a3,d2
		move.l	a4,d3
		sub.l	a3,d3
		LIBJMP	Write

PClineintro	dc.b	"h",10,9,9,"db",9
		even
