]> git.sur5r.net Git - cc65/blob - libsrc/common/searchenv.s
Saved 2 bytes and fixed error in case of negative result.
[cc65] / libsrc / common / searchenv.s
1 ;
2 ; Ullrich von Bassewitz, 2005-04-21
3 ;
4 ; Search the environment for a string.
5 ;
6
7         .export searchenv, copyenvptr
8         .import __environ, __envcount
9         .import ptr1:zp, ptr2:zp, ptr3:zp
10
11 .code
12
13 ;----------------------------------------------------------------------------
14 ; searchenv:
15 ;
16 ; ptr1 must contain the string to search for. On exit, the N flag will tell
17 ; if the entry was found, and X will contain the index of the environment
18 ; string in the environment (a negative value if the entry was not found).
19 ; On success, ptr3 will contain the entry and Y the offset of the '=' within
20 ; the string.
21
22 .proc   searchenv
23
24 ; Copy the pointer to the environment to the zero page
25
26         jsr     copyenvptr
27
28 ; Loop over all environment entries trying to find the requested one.
29
30         ldx     __envcount
31 @L0:    dex
32         bmi     @L9                     ; Out of entries
33
34 ; Since the maximum number of entries is 64, the index can only be 63, so
35 ; the following shift cannot overflow and the carry is clear.
36
37         txa
38         asl     a                       ; Mul by two for word access
39         tay
40         lda     (ptr2),y
41         sta     ptr3
42         iny
43         lda     (ptr2),y
44         sta     ptr3+1
45
46 ; ptr1 points to name, ptr3 points to the next environment entry. Compare the
47 ; two. The following loop limits the length of name to 255 bytes.
48
49         ldy     #$00
50 @L1:    lda     (ptr1),y
51         beq     @L2                     ; Jump on end of name
52         cmp     (ptr3),y
53         bne     @L0                     ; Next environment entry
54         iny
55         bne     @L1
56
57 ; End of name reached, check if the environment entry contains a '=' char
58
59 @L2:    lda     (ptr3),y
60         cmp     #'='
61         bne     @L0                     ; Next environment entry
62
63 ; Done. The function result is in X and the N flag is set correctly.
64
65 @L9:    rts
66
67 .endproc
68
69
70 ;----------------------------------------------------------------------------
71 ; copyenvptr: Copy _environ to ptr2
72 ;
73
74 .proc   copyenvptr
75
76         lda     __environ
77         sta     ptr2
78         lda     __environ+1
79         sta     ptr2+1
80         rts
81
82 .endproc
83
84