	title	'string assebmle function for BDS C'
	page	60
;

	maclib	bds
	maclib	cmac
;
;
	direct
	define	STRLEN
	define	STRCPY
	define	STRCAT
	define	STRPOS
	enddir
;
	page
;
;	strlen
;
;	return lenght of string
;
	prelude	strlen
;

strlen:
	call	arghak		;get arg list
	lhld	arg1		;get point to string
	xchg			;put address in de
	lxi	h,0		;put a zero in hl (length)
strlen1:
	ldax	d		;get value of this character
	ora	a		;check to see if zero
	rz			;if zero end of string return
	inx	h		;add 1 to string lenght
	inx	d		;add 1 to pointer to string
	reloc	jmp,strlen1	;check next character
;
	postlude strlen
;
;
;
	prelude	strcpy
;
strcpy:
	call	arghak		;get arg list
	lhld	arg1		;get address of where to save string
	xchg			;put address in de
	lhld	arg2		;get address of string to copy
strcpy1:
	mov	a,m		;get value from source string
	stax	d		;save character a object string
	ora	a		;check to see if done
	rz			;if zero done return to caller
	inx	h		;add 1 to source pointer
	inx	d		;add 1 to object pointer
	reloc	jmp,strcpy1	;down till end of string
;
	postlude strcpy
;
;
;
	prelude	strcat
strcat:
	call	arghak	;get parm list
	lhld	arg1	;get address of frist parm
	xchg		;put it in hl
	lhld	arg2	;get second parm
strcat1:
	ldax	d		;get byte to see if zero
	ora	a		;set status flags
	reloc	jz,strcat2	;end of string 1 
	inx	d		;add 1 to pointer
	reloc	jmp,strcat1	;loop till end of string 1
strcat2:
	mov	a,m		;get char for source string
	stax	d		;save at end of second string
	ora	a		;check to see if zero
	rz			;return if end of string 2
	inx	h		;add 1 to source pointer
	inx	d		;add 1 to object pointer
	reloc	jmp,strcat2	;loop till end of source string
	postlude strcat
;
;
;
	prelude	strpos
;
strpos:
	call	arghak		;get parm list
	push	b		;save c stack on machine stack
	lhld	arg1		;get string that we are searching in
	xchg			;put address in de
	lxi	b,0		;zero postion 
strpos1:
	lhld	arg2		;get address of search for string
strpos2:
	ldax	d		;get character to check 
	ora	a		;check to see if end of string 1
	reloc	jz,strpos4	;end of string arg2 is not inside of arg1
	inx	b		;add 1 to postion
	inx	d		;add 1 top pointer of arg1
	cmp	m		;check to see if a match on first char
	reloc	jnz,strpos2	;loop till fisrt character match
	push	d		;save current postion on stack
	dcx	d		;move pointer back one
strpos3:
	inx	h		;add 1 to arg1
	inx	d		;add 1 to arg2
	mov	a,m		;check to see if end of arg2
	ora	a		;see if zero 
	reloc	jz,strpos5	;end of arg2 match found 
	ldax	d		;get arg1
	cmp	m		;check to see if match
	reloc	jz,strpos3	;loop to end of string or nomatch
	pop	d		;remove search address from stack
	reloc	jmp,strpos1	;loop till end of arg1
strpos4:
	pop	b		;restore c stack pointer
	lxi	h,0		;arg2 not found in arg1
	ret
strpos5:
	mov	h,b		;arg2 found in arg1
	mov	l,c
	pop	d		;remove junk from stack
	pop	b		;restore b stack pointer
	ret
;
;
	postlude strpos
	end
lude strpos
	end

end

	ret
;
;
	postlude strpos
	end
