
;	-----------------------------------------------------------
;	DUMP.COM is a utility provided by Digital Research in their
;	CP/M package. However, it is convenient to supplement the
;	original program with some additional features, as well as
;	cleaning up the code which is based on their PL/M compiler.
;	Accordingly, the display line formed from a serial address
;	and sixteen hexadecimal bytes is supplemented by the ASCII
;	interpretation of these same bytes, as is done by DDT. If
;	desired, the whole display may be recorded on disk, and
;	later edited or printed. Error checking is very lenient.
;
;		    DUMMP.ASN   Copyright (C) 1983
;		    Universidad Autonoma de Puebla
;		           November 15, 1983
;
;	[Harold V. McIntosh, 15 November 1983]
;	-----------------------------------------------------------

BDOS	equ	224		;CP/M interrupt to BDOS

TFCB	equ	5CH		;file control block address
DSIZ	equ	200H		;size of .DDD buffer
TSIZ	equ	80H		;size of input buffer
TBUF	equ	80H		;input buffer address

;	Non-graphic characters

CR	equ	0DH		;carriage return
LF	equ	0AH		;line feed


;	-------------
	org	0100H
;	-------------

BEGN:	cmpb	TFCB+1,#' '
	jnz	NNUL
	ld	bx,#LOGO
	call	MSSG
	jmp	EXIT

NNUL:	ld	bx,#(TFCB+9)
	cmpb	[bx],#' '
	jnz	YEXT
	stob	#'C',[bx]
	inc	bx
	stob	#'M',[bx]
	inc	bx
	stob	#'D',[bx]

YEXT:	stob	#0,DOUT		;z=no .DDD file
	ld	bx,#(TFCB+17)
	cmpb	[bx],#' '
	jz	OPFI

;	If a listing file is specified, set it up.

	ld	ah,#12
	ld	dx,#DFCB	;.DDD FCB
	ld	bx,#(TFCB+16)
DMOV:	ld	al,[bx]
	xchg	bx,dx
	sto	al,[bx]
	xchg	bx,dx
	inc	bx
	inc	dx
	dec	ah
	jnz	DMOV

;	Beware that the same file will not be source and listing.

	ld	ah,#11
	ld	bx,#(TFCB+1)
	ld	dx,#(DFCB+1)
DCHK:	ld	al,[bx]
	xchg	bx,dx
	cmp	al,[bx]
	xchg	bx,dx
	jnz	DINI
	inc	bx
	inc	dx
	dec	ah
	jnz	DCHK
	ld	bx,#SAME
	call	MSSG
	jmp	EXIT

DINI:	ld	cl,#19		;(13) delete file
	ld	dx,#DFCB	;.DDD FCB
	int	BDOS

	ld	cl,#22		;(16) create file
	ld	dx,#DFCB	;.DDD FCB
	int	BDOS

	ld	cl,#15		;(0F) open file
	ld	dx,#DFCB	;.DDD FCB
	int	BDOS

	sto	#DBUF,DPTR
	stob	#0,DFCB+32
	stob	#1,DOUT		;z=no .DDD file

OPFI:	ld	dx,#TFCB
	ld	cl,#15		;(0F) open file
	int	BDOS
	inc	al
	jnz	YOPE
	ld	bx,#NFIL
	call	MSSG
	jmp	EXIT

YOPE:	stob	#0,TFCB+32	;set record number to zero
	ld	cx,#0000	;byte counter, kept in BC

LOOP:	call	RDSK
	or	al,al
	jnz	CLOS
	call	WBUF
	call	BREAK		;check FOR manual interruption
	ror	al
	jnc	LOOP
	ld	bx,#DINT
	call	MSSG

;	Clear out and close .DDD file

CLOS:	cmpb	DOUT,#0
	jz	EXIT
CLOA:	cmp	DPTR,#DEND
	jnc	NCLR
	ld	bx,DPTR
	sto	#1AH,[bx]	;^Z
	inc	DPTR
	ld	bx,#DFCB	;.DDD FCB
	ld	dx,#DBUF
CLOB:	push	dx
	push	bx
	ld	cl,#26		;(1A) set DMA address
	int	BDOS
	pop	dx
	push	dx
	ld	cl,#21		;(15) write one record
	int	BDOS
	pop	bx
	pop	dx
	or	al,al
	add	dx,#TSIZ
	cmp	dx,DPTR
	jc	CLOB

NCLR:	ld	cl,#16		;(10) close file
	ld	dx,#DFCB	;.DDD FCB
	int	BDOS

EXIT:	ld	dl,#00
	ld	cl,#00
	int	BDOS

WBUF:	ld	bx,#TBUF
	call	WFOR
WFOR:	call	WTWO
WTWO:	call	WONE
WONE:	call	WORD
	call	DUBL
	add	cx,#16
	push	bx
	call	HLIN
	call	SNGL
	pop	bx
	call	ALIN
	jmp	CRLF

;	Type out sixteen bytes in hexadecimal representation.

HLIN:	call	HEIG
HEIG:	call	HFOR
HFOR:	call	HTWO
HTWO:	call	HONE
HONE:	ld	al,[bx]
	call	BYTE
	ld	al,#' '
	call	CONA
	inc	bx
	ret

;	Type out sixteen bytes as ASCII characters if possible.

ALIN:	call	AEIG
AEIG:	call	AFOR
AFOR:	call	ATWO
ATWO	call	AONE
AONE:	ld	al,[bx]
	call	PRPR
	inc	bx
	ret

;	Check whether a termination request is pending.

BREAK:	push	bx
	push	dx
	push	cx
	ld	cl,#11		;(0B) console status
	int	BDOS
	push	ax
	ror	al
	jnc	BRK
	ld	cl,#1		;(01) read console
	int	BDOS
BRK:	pop	ax
	pop	cx
	pop	dx
	pop	bx
	ret

DUBL:	call	SNGL
SNGL:	ld	al,#' '
	jmp	CONA

;	Subroutines for various output formats.

CRLF:	ld	al,#CR
	call	CONA
	ld	al,#LF
	jmp	CONA

WORD:	mov	al,ch
	call	BYTE
	mov	al,cl
BYTE:	push	ax
	ror	al
	ror	al
	ror	al
	ror	al
	call	NIBL
	pop	ax
NIBL:	and	al,#0FH
	add	al,#90H
	daa
	adc	al,#40H
	daa
CONA:	push	bx
	push	dx
	push	cx
	push	ax
	ld	cl,#2		;(02) char to console
	mov	dl,al
	int	BDOS
	pop	ax
	cmpb	DOUT,#0
	jz	CONB
	call	DDDA
CONB:	pop	cx
	pop	dx
	pop	bx
	ret

;	Print printables, put dot for the rest.

PRPR:	cmp	al,#07FH	;rubout
	jnc	PRDO
	cmp	al,#' '
	jnc	CONA
PRDO:	ld	al,#'.'
	jmp	CONA

;	Deposit byte in .DDD buffer and flush when full.

DDDA:	cmp	DPTR,#DEND
	jc	DDDB
	ld	bx,#DFCB	;.DDD FCB
	ld	dx,#DBUF
	push	ax
DDDC:	push	dx
	push	bx
	ld	cl,#26		;(1A) set DMA address
	int	BDOS
	pop	dx
	push	dx
	ld	cl,#21		;(15) write one record
	int	BDOS
	pop	bx
	pop	dx
	or	al,al
	add	dx,#TSIZ
	cmp	dx,#DEND
	jc	DDDC
	sto	#DBUF,DPTR
	pop	ax
DDDB:	ld	bx,DPTR
	sto	al,[bx]
	inc	DPTR
	ret

;	Memory to the console, replacing CP/M function 9, which
;	terminates messages with $. MSSG uses 00's.

MSSG:	ld	dl,[bx]
	inc	bx
	push	bx
	ld	cl,#2
	int	BDOS
	pop	bx
	cmpb	[bx],#00
	jnz	mssg
	ret

;	Read a record from disk to be analyzed.

RDSK:	push	bx
	push	dx
	push	cx

	ld	cl,#26		;(1A) set DMA address
	ld	dx,#TBUF
	int	BDOS

	ld	cl,#20		;(14) read one record
	ld	dx,#TFCB
	int	BDOS

	pop	cx
	pop	dx
	pop	bx
	ret

;	-----------------------------------------------------------

NFIL:	db	CR,LF,'Requested file not present.',00
SAME:	db	CR,LF,'Same file specified for source and listing.',00
DINT:	db	'Dump interrupted.',00
LOGO:	db	CR,LF,'File Dump/ICUAP/November 15, 1983.',CR,LF,CR,LF
	db	'	DUMMP [D:]FILE[.EXT] [[D:]LIST.DDD]',CR,LF,CR,LF
	db	'will allow viewing of FILE on the console; the display',CR,LF
	db	'may be saved in the file LIST if one is specified. If',CR,LF
	db	'.EXT is not given, .CMD is assumed.',CR,LF
	db	00
DOUT:	ds	1	;z=no .DDD file
DFCB:	db	'DFilenameDDD',00,00,00,00
	ds	17
DPTR:	ds	2
DBUF:	ds	DSIZ
DEND:	equ	DBUF+DSIZ

	end

