memchr.s



;
; Ullrich von Bassewitz, 09.06.1998
;
; void* memchr (const void* p, int c, size_t n);
;

	.export		_memchr
	.import		popax, return0
	.importzp	ptr1, ptr2, tmp1


_memchr:
       	sta	ptr2		; Save n
	stx	ptr2+1
	jsr	popax		; get c
	sta	tmp1
       	jsr	popax 	     	; get p
       	sta	ptr1
       	stx	ptr1+1

       	ldy	#0
	lda	tmp1		; get c
	ldx	ptr2		; use X as low counter byte
	beq	L3		; check high byte

; Search for the char

L1:	cmp	(ptr1),y
       	beq    	L5  		; jump if found
   	iny
   	bne	L2
   	inc     ptr1+1
L2:	cpx	#0
   	beq	L3
   	dex
   	jmp	L1
L3:	ldx	ptr2+1		; Check high byte
   	beq	L4  		; Jump if counter off
   	dec	ptr2+1
   	ldx	#$FF
   	bne	L1		; branch always

; Character not found, return zero

L4:	jmp	return0

; Character found, calculate pointer

L5:  	ldx 	ptr1+1		; get high byte of pointer
       	tya 			; low byte offset
       	clc
       	adc 	ptr1
       	bcc 	L6
       	inx
L6:  	rts




Valid HTML 4.0! memchr.s.html; generated on Sat Oct 13 22:41:33 2001 by ca65html
uz@cc65.org