You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
735 B
ArmAsm
48 lines
735 B
ArmAsm
12 years ago
|
;
|
||
|
; Ullrich von Bassewitz, 31.05.1998
|
||
|
;
|
||
|
; char* strrchr (const char* s, int c);
|
||
|
;
|
||
|
|
||
|
.export _strrchr
|
||
|
.import popax
|
||
|
.importzp ptr1, ptr2, tmp1
|
||
|
|
||
|
_strrchr:
|
||
|
sta tmp1 ; Save c
|
||
|
jsr popax ; get s
|
||
|
sta ptr1
|
||
|
stx ptr1+1
|
||
|
lda #0 ; function result = NULL
|
||
|
sta ptr2
|
||
|
sta ptr2+1
|
||
|
tay
|
||
|
|
||
|
L1: lda (ptr1),y ; get next char
|
||
|
beq L3 ; jump if end of string
|
||
|
cmp tmp1 ; found?
|
||
|
bne L2 ; jump if no
|
||
|
|
||
|
; Remember a pointer to the character
|
||
|
|
||
|
tya
|
||
|
clc
|
||
|
adc ptr1
|
||
|
sta ptr2
|
||
|
lda ptr1+1
|
||
|
adc #$00
|
||
|
sta ptr2+1
|
||
|
|
||
|
; Next char
|
||
|
|
||
|
L2: iny
|
||
|
bne L1
|
||
|
inc ptr1+1
|
||
|
bne L1 ; jump always
|
||
|
|
||
|
; Return the pointer to the last occurrence
|
||
|
|
||
|
L3: lda ptr2
|
||
|
ldx ptr2+1
|
||
|
rts
|