memset.s



;
; void* memset (void* ptr, int c, size_t n);
;
; Ullrich von Bassewitz, 29.05.1998
;

 	.export		_memset
	.import		popax
	.importzp	ptr1, ptr2, tmp1, tmp2, tmp3

_memset:
 	sta	tmp1		; Save n
 	stx	tmp2
 	jsr	popax  	 	; Get c
 	sta	tmp3		; Save c
 	jsr	popax  	 	; Get ptr
 	sta	ptr1
 	stx	ptr1+1 		; Save work copy
	sta	ptr2
	stx	ptr2+1		; Save a copy for the function result
       	lda	tmp3

	ldy	#0
	ldx	tmp2		; Get high byte of n
       	beq    	L2		; Jump if zero

; Set 256 byte blocks

L1:	sta	(ptr1),y	; Set one byte
  	iny
	sta	(ptr1),y	; Unroll this a bit to make it faster
	iny
  	bne	L1
	inc	ptr1+1
       	dex			; Next 256 byte block
	bne	L1		; Repeat if any

; Set the remaining bytes if any
					       
L2:    	ldx	tmp1		; Get the low byte of n
  	beq	L9		; Low byte is zero

L3:    	sta    	(ptr1),y       	; Set one byte
  	iny
       	dex			; Done?
  	bne	L3

L9:	lda	ptr2		; Load function result
	ldx	ptr2+1
   	rts




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