;CHECKSUM ANY CP/M FILE
	ORG	100H
	JMP	START
ID	DB	'CKSUM AS OF 7/20/77',0DH,0AH,'$'
;INIT LOCAL STACK
START	LXI	H,0
	DAD	SP
	SHLD	STACK
	LXI	SP,STACK
;PRINT ID MESSAGE
	LXI	D,ID
	MVI	C,PRINT
	CALL	BDOS
;OPEN THE FILE
	LXI	D,FCB
	MVI	C,OPEN
	CALL	BDOS
	INR	A
	JNZ	LINE
	CALL	ERXIT
	DB	'++FILE NOT FOUND$'
ERXIT	POP	D	;GET MSG
	MVI	C,PRINT
	CALL	BDOS
EXIT	LHLD	STACK
	SPHL		;RESTORE STACK
	RET
;OPENED OK
LINE	MVI	A,0DH
	CALL	TYPE
	MVI	A,0AH
	CALL	TYPE
	MVI	B,16	;# OF HEX PER LINE
LOOP	PUSH	B	;SAVE DIGIT COUNT
	CALL	FREAD
	ORA	A
	JNZ	CKERR
	LXI	H,80H
	XRA	A
CKSLP	ADD	M
	INR	L
	JNZ	CKSLP
	CALL	XOB
	POP	B
	DCR	B
	JNZ	LOOP
	JMP	LINE
;NON-ZERO DISK RETURN CODE
CKERR	DCR	A
	JZ	EOF
	CALL	ERXIT
	DB	'*++DISK READ ERROR$'
EOF	CALL	ERXIT
	DB	0DH,0AH,'++EOF$'
XOB	PUSH	PSW
	RAR
	RAR
	RAR
	RAR
	CALL	NIBBL
	POP	PSW
	CALL	NIBBL
	MVI	A,' '
	CALL	TYPE
	RET
NIBBL	ANI	0FH
	CPI	10
	JC	ISNUM
	ADI	7
ISNUM	ADI	'0'
TYPE	PUSH	B
	PUSH	D
	PUSH	H
	MOV	E,A
	MVI	C,WRCON
	CALL	BDOS
	POP	H
	POP	D
	POP	B
	RET
;FILE READ
FREAD	LXI	D,FCB
	MVI	C,READ
	CALL	BDOS
	RET		;PROG SHOULD CHECK STAT
	DS	30
STACK	DS	2
;
; BDOS EQUATES (VERSION 3)
;
RDCON	EQU	1
WRCON	EQU	2
PRINT	EQU	9
OPEN	EQU	15	;0FFH=NOT FOUND
CLOSE	EQU	16	;   "	"
SRCHF	EQU	17	;   "	"
SRCHN	EQU	18	;   "	"
DELT	EQU	19	;NO RET CODE
READ	EQU	20	;0=OK, 1=EOF
WRITE	EQU	21	;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
MAKE	EQU	22	;0FFH=BAD
REN	EQU	23	;0FFH=BAD
STDMA	EQU	26
BDOS	EQU	5
FCB	EQU	5CH
