; int strncmp (const char* s1, const char* s2, unsigned n);
;
- .export _strncmp
- .import popax
- .importzp ptr1, ptr2, ptr3
+ .export _strncmp
+ .import popax
+ .importzp ptr1, ptr2, ptr3
_strncmp:
; executing a more complex test in each iteration of the loop. We do also
; correct the value by one, so we can do the test on top of the loop.
- eor #$FF
- sta ptr3
- txa
- eor #$FF
- sta ptr3+1
+ eor #$FF
+ sta ptr3
+ txa
+ eor #$FF
+ sta ptr3+1
; Get the remaining arguments
- jsr popax ; get s2
- sta ptr2
- stx ptr2+1
- jsr popax ; get s1
- sta ptr1
- stx ptr1+1
+ jsr popax ; get s2
+ sta ptr2
+ stx ptr2+1
+ jsr popax ; get s1
+ sta ptr1
+ stx ptr1+1
; Loop setup
- ldy #0
+ ldy #0
; Start of compare loop. Check the counter.
-Loop: inc ptr3
- beq IncHi ; Increment high byte
+Loop: inc ptr3
+ beq IncHi ; Increment high byte
; Compare a byte from the strings
-Comp: lda (ptr1),y
- cmp (ptr2),y
- bne NotEqual ; Jump if strings different
- tax ; End of strings?
- beq Equal1 ; Jump if EOS reached, a/x == 0
+Comp: lda (ptr1),y
+ cmp (ptr2),y
+ bne NotEqual ; Jump if strings different
+ tax ; End of strings?
+ beq Equal1 ; Jump if EOS reached, a/x == 0
; Increment the pointers
- iny
- bne Loop
- inc ptr1+1
- inc ptr2+1
- bne Loop ; Branch always
+ iny
+ bne Loop
+ inc ptr1+1
+ inc ptr2+1
+ bne Loop ; Branch always
; Increment hi byte
-IncHi: inc ptr3+1
- bne Comp ; Jump if counter not zero
+IncHi: inc ptr3+1
+ bne Comp ; Jump if counter not zero
; Exit code if strings are equal. a/x not set
-Equal: lda #$00
- tax
-Equal1: rts
+Equal: lda #$00
+ tax
+Equal1: rts
; Exit code if strings not equal
NotEqual:
- bcs L1
- ldx #$FF ; Make result negative
- rts
+ bcs L1
+ ldx #$FF ; Make result negative
+ rts
-L1: ldx #$01 ; Make result positive
- rts
+L1: ldx #$01 ; Make result positive
+ rts