aboutsummaryrefslogtreecommitdiff
path: root/src/streq.s
blob: 21162033f4ddf64d1ed1eb3966ca94be1ef8c9cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

 .importzp sreg, ptr1, ptr2
 .import popptr1, popax
 .export _streq, _streq_i, _strneq_i, _lcase

 ; extern __fastcall__ char lcase(char c);
 ; extern __fastcall__ char streq(char *s1, char *s2);
 ; extern __fastcall__ char streq_i(char *s1, char *s2);
 ; extern __fastcall__ char strneq_i(char *s1, char *s2, char len);

 ; these are fast and small replacements for standard C library functions.
 ; lcase() is a drop-in replacement for tolower().
 ; streq() is basically strcmp() except it returns true for equality,
 ; false for inequality (so you can't e.g. use it for sorting).
 ; also, it only supports strings up to 256 bytes long.
 ; streq_i() is the case-insensitive verson of streq().
 ; strneq_i() is case-insensitive and stops after 'len' characters.

 limit = sreg+3 ; number of characters to compare (0 = 256)
 insens = sreg  ; bit 7 set = case insensitive, otherwise not
 temp = sreg+1  ; nothing to see here, move along :)

_lcase:
 cmp #'Z'+1
 bcs lcret
 cmp #'A'
 bcc lcret
 ora #$20
lcret:
 rts

_strneq_i:
 sta limit
 jsr popax
 ldy #$80
 sty insens
 jmp doit

_streq_i:
 ldy #$80
 .byte $2c ; BIT abs, skip next
_streq:
 ldy #0
 sty insens
 ldy #0
 sty limit

doit:
 sta ptr2
 stx ptr2+1
 jsr popptr1 ; returns with Y=0

cmploop:
 lda (ptr2),y
 bit insens
 bpl no_case_1
 jsr _lcase

no_case_1:
 sta temp
 lda (ptr1),y
 tax
 bit insens
 bpl no_case_2
 jsr _lcase

no_case_2:
 sec
 sbc temp
 bne ret0
 txa
 beq ret1

 iny
 cpy limit
 bne cmploop

ret1:
 lda #1
 .byte $2c
ret0:
 lda #0
 tax
 rts