*	@(#)putboot.s	1.5	
*********************************************************
*
*	Program to Write Boot Tracks for CP/M-68K (tm)
*
*	Copyright Digital Research 1982
*
*		modified for vme/10
*
*********************************************************
*
* AS68 -L PUTBOOT.S
* LO68 -R -O PUTBOOT.68K PUTBOOT.O
*
prntstr	=	9	BDOS Functions
dseldsk	=	14
open		=	15
readseq	=	20
dsetdma	=	26
*
seldsk	=	9	BIOS Functions
settrk	=	10
setsec	=	11
isetdma	=	12
write		=	14
sectran	=	16
flush		=	21
*
bufcnt	=	$80
bufsize	=	$80*bufcnt
*
	.text
*
start:
	link		a6,#0
	move.l	8(a6),a0	base page address
	lea		$5c(a0),a1
	move.l	a1,fcb
	clr.b		hflag
	add		#$81,a0	first character of command tail
scan:	cmpi.b	#$20,(a0)+	skip over blanks
	beq		scan
	sub.l		#1,a0
scan1:
	tst.b		(a0)
	beq		erxit
	cmpi.b	#$2d,(a0)+	check for -H flag
	bne		nohyph
	cmpi.b	#$48,(a0)+
	bne		erxit
	tst.b		hflag
	bne		erxit
	move.b	#$ff,hflag
	sub.l		#$24,fcb	change to 2nd default fcb
	bra		scan
nohyph:
	cmpi.b	#$20,(a0)
	bne		scan1
scan2:
	cmpi.b	#$20,(a0)+
	beq		scan2
	cmpi.b	#$61,-(a0)	get disk letter
	blt		upper		upshift
	sub		#$20,(a0)
upper:
	cmpi.b	#$41,(a0)	compare with range A - P
	blt		erxit
	cmpi.b	#$50,(a0)
	bgt		erxit
	move.b	(a0),d0
	ext.w		d0		put disk letter into range 0 - 15
	sub.w		#$41,d0
	move.w	d0,dsk
*
*	open file to copy
*
	move.w	#open,d0
	move.l	fcb,d1
	trap		#2
	cmpi.w	#$00ff,d0
	bne		openok
	move.l	#opnfl,d1
	jmp		erx
openok:
	move.l	fcb,a0
	clr.b		32(a0)
*
*	read
*
	move.l	#buf,d2
	clr.w		count
rloop:
	move.w	#dsetdma,d0
	move.l	d2,d1
	trap		#2
	move.w	#readseq,d0
	move.l	fcb,d1
	trap		#2
	tst.w		d0
	bne		wrtout
	add.l		#128,d2
	add.w		#1,count
	cmpi.w	#bufcnt,count
	bgt		bufoflx
	bra		rloop
*
*	write
*
wrtout:
	move.w	#seldsk,d0	select the disk
	move.w	dsk,d1
	clr.b		d2
	trap		#3
	tst.l		d0		check for select error
	beq		selerx
	move.l	d0,a0
	move.l	(a0),xlt
	move.l	14(a0),a0	get DPB address
	move.w	(a0),spt	get sectors per track
	move.w	14(a0),off	get offset
	clr.w		trk		start at trk 0
	move.w	#1,sect		start at sector 1
	lea		buf,a0
	tst.b		hflag
	bne		wrt1
	cmpi.w	#$601a,(a0)
	bne		wrt1
	add.l		#28,a0
wrt1:	move.l	a0,bufp
	move.w	#512,$11e(a0)	assume fd sector size in config tab
	cmp.w		#64,spt		check for floppy disk
	slt		fdflag
	blt		wloop
	move.w	#256,$11e(a0)	set hd sector size in config tab
*
wloop:
	tst.w		count
	beq		exit
	move.w	sect,d1		check for end-of-track
*
	tst.b		fdflag		special check for trk 0 of fd
	beq		wl1
wl3:	tst.w		trk
	bne		wl1
	cmp.w		#16,d1
	ble		sok
	bra		wl2
*
wl1:	cmp.w		spt,d1
	ble		sok
wl2:	move.w	#1,sect		advance to new track
	move.w	trk,d0
	add.w		#1,d0
	tst.b		fdflag		special check for fd
	beq		wl4
	neg.w		d0
	add.w		#160,d0
	cmp.w		#80,d0
	bge		wl4
	addq.w	#1,d0
wl4:	move.w	d0,trk
	cmp.w		#80,d0		assume 2nd side fd writes are ok
	bge		sok
	cmp.w		off,d0
	bge		oflex

sok:	move.w	#settrk,d0		set the track
	move.w	trk,d1
	trap		#3

	move.w	sect,d1
	cmp.w		#64,spt		check for floppy disk
	blt		FD1

	subq.w	#1,d1			Make Zero Based.. 
FD1:
	move.w	#setsec,d0
	trap		#3

	move.w	#isetdma,d0		set up dma address for write
	move.l	bufp,d1
	trap		#3

	move.w	#write,d0		and write
	clr.w		d1			normal write = 0
	trap		#3

	tst.w		d0			check for write error
	bne		wrterx
	add		#1,sect		increment sector number
	sub		#1,count
	add.l		#128,bufp
	bra		wloop
*
exit:	move.w	#flush,d0		exit location - flush bios buffers
	trap		#3
	unlk		a6
	rts					and exit to CCP
*
erxit:
	move.l	#erstr,d1		miscellaneous errors
erx:	move.w	#prntstr,d0		print error message and exit
	trap		#2
	bra		exit
*
selerx:
	move.l	#selstr,d1		disk select error
	bra		erx
wrterx:
	move.l	#wrtstr,d1		disk write error
	bra		erx
bufoflx:
	move.l	#bufofl,d1		buffer overflow
	bra		erx
oflex:
	move.l	#trkofl,d1
	bra		erx
*
*
	.bss
*
	.even
*
buf:	.ds.b	bufsize+128
*
fcb:		.ds.l	1		fcb address
spt:		.ds.w	1		sectors per track
sect:		.ds.w	1		current sector
trk:		.ds.w	1		current track
dsk:		.ds.w	1		selected disk
off:		.ds.w	1		1st track of non-boot area
xlt:		.ds.l	1		XLT translate table
count:	.ds.w	1
bufp:		.ds.l	1
hflag:	.ds.b	1
fdflag:	.ds.b	1
*
	.data
*
erstr:	.dc.b	'Invalid Command Line',13,10,'$'
selstr:	.dc.b	'Select Error',13,10,'$'
wrtstr:	.dc.b	'Write Error',13,10,'$'
opnfl:	.dc.b	'Cannot Open Source File',13,10,'$'
bufofl:	.dc.b	'Buffer Overflow',13,10,'$'
trkofl:	.dc.b	'Too Much Data for System Tracks',13,10,'$'
*
*
	.end
