Compucolor.org – Virtual Media

Listing of file='BUFPRO.MAC;07' on disk='vmedia/asm_utility_4-sideA-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	BUFFER PROCESSING ROUTINES
;
;	IN ALL CASES, THE FOLLOWING APPLY:
;
;	VALUES ON ENTRY:
;	   A  =  ARGUMENT IF NEEDED
;	   DE => DESTINATION (WHERE REQD)
;	   HL => CURRENT POSITION IN BUFFER
;
;	RETURNS:
;	   HL => MOVED AS REQUIRED
;
;	DESTROYS:
;	   A REG.
;
;
;*** NOTE: THE BUFFER MUST BE TERMINATED BY A ZERO (NULL).
;
;
;	SEE ALSO: INDEX, JMPTAB, UTIL
;

;	EQUATES

TAB	EQU	9
SPACE	EQU	32

;
;	COPY A BUFFER (OR PART OF ONE)
;	CAN ALSO COMPRESS A BUFFER BY MOVING PART OF
;	IT OVER ITSELF I.E. MOVE DOWN IN MEMORY.
;	(OPPOSITE OF EXPAND)
;
;	ON ENTRY, HL -> SOURCE AND DE -> DESTINATION
;
	ENTRY	COPY,COMPRS

COPY:
COMPRS:	MOV	A,M	;GET CHR
	ORA	A	;END OF STRING?
	JZ	COPY10	;YES
	STAX	D	;NO, MOVE CHR
	INX	H
	INX	D
	JMP	COPY
COPY10:	STAX	D	;MARK EOS
	RET

;
;	EXPANDS A BUFFER
;	ALSO USED TO INSERT CHARACTERS IN A BUFFER.
;	PADS WITH SPACES.
;	(OPPOSITE OF COMPRS)
;
;	ON ENTRY, B = NO. OF CHRS TO EXPAND (MUST BE >0)
;	DESTROYS  B
;
	EXTRN	MOVEUP

	ENTRY	EXPAND,INSERT

EXPAND:
INSERT:	PUSH	D	;SAVE DE
	PUSH	B
	PUSH	H
	MOV	D,H
	MOV	E,L
	CALL	LENGTH	;FIND LENGTH OF STRING
	INR	A	;ADD ONE FOR EOS
	MOV	H,D
	MOV	L,E
	MOV	C,B	;ADD EXPANSION LENGTH
	MVI	B,0
	DAD	B	;NEW POSITION
	XCHG
	MOV	B,C	;BYTE COUNT
	CALL	MOVEUP	;MOVE THE BLOCK
	POP	H	;INSERT POINT
	POP	B	;CHR COUNT
	MVI	A,SPACE
	CALL	FILL	;FILL IN WITH SPACES
	POP	D	;RESTORE DE
	RET

;
;	FILL MEMORY WITH A CHARACTER
;
;	ON ENTRY, B = BYTE COUNT AND A = CHR
;	DESTROYS  B
;
	ENTRY	FILL

FILL:	MOV	M,A	;STORE CHR
	INX	H
	DCR	B	;CHECK BYTE COUNT
	JNZ	FILL
	RET

;
;	GET A WORD
;
;	ON ENTRY, HL -> BUFFER AND DE -> DESTINATION
;	RETURNS THE NEXT WORD IN DESTINATION BUFFER,
;	A = LENGTH OF WORD AND <Z> SET ACCORDINGLY.
;	NOTE: THE WORD MAY BE NULL.
;
	EXTRN	WHTSPC

	ENTRY	GETWRD

GETWRD:	PUSH	B	;SAVE BC
	MVI	B,0	;SETUP CHR COUNT
	MOV	A,M	;NEXT CHR
	ORA	A	;END OF BUFFER?
	JZ	GETW10	;YES
	CALL	WHTSPC	;WHITE SPACE?
	JC	GETW10	;YES
	STAX	D	;MOVE CHR
	INX	H	;BUMP POINTERS
	INX	D
	INR	B	;   AND CHR COUNT
	JMP	GETWRD	;REPEAT
GETW10:	XRA	A	;MARK END OF STRING
	STAX	D
	MOV	A,B	;GET CHR COUNT
	ORA	A
	POP	B	;RESTORE BC
	RET

;
;	COUNT THE NUMBER OF CHARACTERS LEFT IN THE BUFFER
;
;	RETURNS A = LENGTH AND HL -> END OF BUFFER (NULL)
;
	EXTRN	INDEX

	ENTRY	LENGTH

LENGTH:	XRA	A	;CHECKING FOR A NULL (ZERO)
	CALL	INDEX	;GET LENGTH IN ACCUM
	RET

;
;	SKIP OVER WHITE SPACE (SPACES AND TABS)
;
	EXTRN	WHTSPC

	ENTRY	SKPSPC

SKPSPC:	CALL	WHTSPC	;WHITE SPACE?
	INX	H
	JC	SKPSPC	;NO
	DCX	H	;YES, BUT GONE TOO FAR
	RET

;
;	TRIM THE HEAD OF A STRING OF WHITE SPACE
;
	EXTRN	CMPHD

	ENTRY	TMHEAD

TMHEAD:	PUSH	D	;SAVE DE
	MOV	D,H	;MOVE HL TO DE
	MOV	E,L
	CALL	SKPSPC	;SKIP SPACES
	CALL	CMPHD	;DID WE SKIP ANY?
	JZ	TMH10
	CALL	COMPRS
TMH10:	POP	D	;RESTORE DE
	RET


;
;	TRIM THE TAIL OF A STRING OF WHITE SPACE
;

	ENTRY	TMTAIL

TMTAIL:	PUSH	B	;SAVE BC
	CALL	LENGTH	;GET END OF STRING AND LENGTH
	DCX	H	;POINT TO LAST CHR
	MOV	B,A
TMT10:	CALL	WHTSPC	;WHITE SPACE?
	DCX	H
	JNC	TMT20	;NO
	DCR	B	;YES, MORE STRING LEFT?
	JNZ	TMT10	;YES
	DCX	H	;NO, FIX HL
TMT20:	INX	H	;PUT NULL WHERE IT BELONGS
	INX	H
	XRA	A
	MOV	M,A
	POP	B	;RESTORE BC

;
;	DETERMINE CHARACTER TYPE OF A STRING
;
;	RETURNS TYPE IN A REG AS THE LOGICAL OR OF:
;	   1 = ALPHA
;	   2 = NUMERIC
;	   4 = OTHER
;
	EXTRN	TYPE

	ENTRY	WRDTYP

WRDTYP:	PUSH	B
	MVI	B,0
WTYP10:	CALL	TYPE
	INX	H
	JZ	WTYP20
	ORA	B
	MOV	B,A
	JMP	WTYP10
WTYP20:	MOV	A,B
	POP	B
	RET

	END