;
; SYSLIB Module Name:  SCANN
; Author:  Richard Conn
; SYSLIB Version Number:  2.0
; Module Version Number:  1.0
; Module Entry Points:
;	SCANNER
; Module External References:
;	None
;

;
;  SSCANNER --
;	SCANNER scans the vector of bytes pointed to by HL for
; the vector of bytes pointed to by DE.  The HL-byte vector is B bytes
; long, and the DE-byte vector is C bytes long.
;	On return, if found, HL points to the beginning location within
; the original HL vector of the located vector and Zero Flag is set.
; If not found, Zero Flag is not set and HL is unaffected.  DE and BC
; are not affected by this routine.
;

SCANNER::
	PUSH	B	; SAVE REGISTERS
	PUSH	H

; MAIN LOOP
SCAN:

; CHECK FOR DONE
	MOV	A,B	; DONE IF B<C
	CMP	C	; DONE?
	JC	NOT$FOUND

; SCAN HL FOR DE FOR C BYTES
	PUSH	B	; SAVE BC
	PUSH	H	; SAVE PTRS
	PUSH	D
SCANL:
	LDAX	D	; GET DE BYTE
	CMP	M	; MATCH?
	JNZ	NEXT
	INX	D	; PT TO NEXT
	INX	H
	DCR	C	; COUNT DOWN
	JNZ	SCANL

;  MATCH!
	POP	D	; RESTORE PTRS
	POP	H
	POP	B	; OLD BC
	POP	B	; ORIGINAL HL -- DISCARD
	POP	B	; ORIGINAL BC
	RET		; ZERO FLAG IS SET

;  NOT FOUND YET
NEXT:
	POP	D	; RESTORE PTRS
	POP	H
	POP	B	; GET COUNT
	INX	H	; PT TO NEXT IN SCANNED VECTOR
	DCR	B	; COUNT DOWN
	JNZ	SCAN	; CONTINUE SCANNING

;  NO MATCH!
NOT$FOUND:
	POP	H	; ORIGINAL HL
	POP	B	; ORIGINAL BC
	MVI	A,0FFH	; NOT FOUND
	ORA	A	; SET NOT ZERO
	RET

	END
