	.title	k11hex	create k11prt.sav and/or k11rt4.sav from hex file
	.ident	/2.23/


;	25-Oct-84  11:14:41  Brian Nelson
;
;	Usage:	run k11hex
;		*k11prt=k11prt
; or		*k11rt4=k11rt4




	.mcall	.close	,.csigen,.exit	,.readw	,.writw	,.print

	.psect

	.macro	sob	reg	,dst
	dec	reg
	bne	dst
	.endm	sob

	.macro	mapch	ch
	movb	map(ch)	,ch
	.endm	mapch

map:	.rept	48.
	.byte	377
	.endr
	.byte	0,1,2,3,4,5,6,7,8.,9.
	.byte	377,377,377,377,377,377,377
	.byte	10.,11.,12.,13.,14.,15.
	.rept	256.-70.
	.byte	377
	.endr

	.even
rtwork:	.blkw	10
inblk:	.word	0
outblk:	.word	0
inpnt:	.word	0
outpnt:	.word	0
inbuff:	.blkw	400
outbuf:	.blkw	400

	.enabl	lc
wrerr:	.asciz	/Write error on device/
rderr:	.asciz	/Read  error from file/
badch:	.asciz	/Non HEX character read from input/
badchk:	.asciz	/Checksum error/
alldone:.asciz	/All done/
csibad:	.asciz	/Could not open the files on the command line/
	.even
defext:	.rad50	/HEX/
	.rad50	/SAVSAVSAV/




convert:.csigen	#handld,#defext,#0	; get a command
	bcc	5$			; ok
	.print	#csibad			; no good
	.exit

5$:	mov	#77777	,inpnt		; ensure fist getc call gets a block
10$:	mov	#40	,r5		; loop for the data record please
	clr	r4			; clear checksum if we use it
20$:	call	getc			; get a character
	bcs	60$			; most likely all done
	mov	r0	,r3		; save it
	mapch	r3
	bpl	30$			; char was ok
	.print	#badch			; not ok
30$:	asl	r3			; avoid mul for systems w/o EIS
	asl	r3			; avoid mul for systems w/o EIS
	asl	r3			; avoid mul for systems w/o EIS
	asl	r3			; avoid mul for systems w/o EIS
	call	getc			; get the next one please
	bcs	80$			; exit on i/o error please
	mapch	r0			; convert it
	bpl	40$			; it was ok
	.print	#badch			; error
40$:	add	r3	,r0		; add it in and copy the byte
	add	r0	,r4		; add into simpleminded checksum
	call	putc			; write it out
	bcs	70$			; i/o error on write
	sob	r5	,20$		; finished with the read
	call	getchk			; read the checksum
	cmp	r0	,r4		; do they match ?
	beq	50$			; yes
	.print	#badchk			; no, print error and exit
50$:	br	10$			; read the next record now

60$:	call	close			; close up and exit
	br	100$			; bye

70$:	.print	#wrerr			; write error
	br	100$			; exit
80$:	.print	#rderr			; a read error
	br	100$			;

100$:	.print	#alldone
	.exit


getchk:	clr	r3
	call	getc
	bcs	100$
	call	getc
	call	getc
	mov	#4	,r2
10$:	call	getc
	asl	r3			; avoid mul for systems w/o EIS
	asl	r3			; avoid mul for systems w/o EIS
	asl	r3			; avoid mul for systems w/o EIS
	asl	r3			; avoid mul for systems w/o EIS
	mapch	r0
	add	r0	,r3
	sob	r2	,10$
100$:	mov	r3	,r0
	return



getc:	call	.getc			; get the next character
	bcs	100$			; oops
	cmpb	r0	,#15		; carriage return or less?
	blos	getc			; yes, get the next character then
	clc				; no, return it
100$:	return				; exit with c bit error code

.getc:	cmp	inpnt	,#1000
	blo	10$
	clr	inpnt			; clear the buffer offset also
	.readw	#rtwork,#3,#inbuff,#400,inblk
	bcs	100$			; end of file
	inc	inblk			; next time the next block please
10$:	mov	inpnt	,r0		; get the current buffer offset
	inc	inpnt			; + 1
	movb	inbuff(r0),r0		; and return the character
	clc				; success
100$:	return				; exit with success in 'c' bit


putc:	cmp	outpnt	,#1000		; room for more output data
	blo	10$
	clr	outpnt			; clear the buffer offset also
	mov	r0	,-(sp)		; save the character being put
	.writw	#rtwork,#0,#outbuff,#400,outblk
	mov	(sp)+	,r0		; restore that character please
	bcs	100$			; end of file
	inc	outblk			; next time the next block please
10$:	mov	outpnt	,r1		; get the current buffer offset
	inc	outpnt			; + 1
	movb	r0	,outbuff(r1)	; and return the character
	clc				; success
100$:	return				; exit with success in 'c' bit


close:	tst	outpnt			; anything to dump out
	beq	20$			; no, should not be
	mov	outblk	,r2		; save current output block #
10$:	cmp	r2	,outblk		; did it dump it's buffer?
	bne	20$			; yes
	clr	r0			; yes, dump a bunch of nulls out
	call	putc			; until putc clears the pointer
	br	10$
20$:	.close	#0			; close the two file now
	.close	#3			; output also please
	return

handld:	.blkw	500

	.end	convert
