NEW PREFIX /A2OSX.BUILD AUTO 4,1 */-------------------------------------- * # StrLen * Returns Length of C-String * ## C * `int strlen ( char * str);` * ## ASM * **In:** * `>LDYAI str` * `>SYSCALL strlen` * **Out:** * Y,A = String length *\-------------------------------------- K.StrLen >STYA ZPPtr1 ldy #0 ldx #0 .1 lda (ZPPtr1),y beq .8 iny bne .1 inx inc ZPPtr1+1 bra .1 .8 txa rts */-------------------------------------- * # StrCat * Concatenate strings * ## C * `char * strcat ( char * destination, const char * source );` * ## ASM * **In:** * `>PUSHWI source` * `>LDYAI destination` * `>SYSCALL strcat` * **Out:** * Y,A = destination *\-------------------------------------- K.StrCat sec .HS 90 BCC */-------------------------------------- * # StrCpy * Copy string * ## C * `char * strcpy ( char * destination, const char * source );` * ## ASM * **In:** * `>PUSHWI source` * `>LDYAI destination` * `>SYSCALL strcpy` * **Out:** * Y,A = destination *\-------------------------------------- K.StrCpy clc >STYA ZPPtr1 >PULLW ZPPtr2 bcc .2 .1 lda (ZPPtr1) beq .2 inc ZPPtr1 bne .1 inc ZPPtr1+1 bra .1 .2 ldy #0 .3 lda (ZPPtr2),y sta (ZPPtr1),y beq .8 iny bne .3 inc ZPPtr2+1 inc ZPPtr1+1 bra .3 .8 rts */-------------------------------------- * # StrMatch * Compare a String against pattern (e.g. '*test?.txt') * ## C * `int * strmatch ( char * s, const char * pattern );` * ## ASM * **In:** * `>PUSHWI pattern` * `>LDYAI s` * `>SYSCALL strmatch` * **Out:** * CC : match * CS : no match *\-------------------------------------- K.StrMatch >STYA ZPPtr1 s >PULLW ZPPtr2 pattern lda (ZPPtr2) Get pattern 1st byte beq .8 Match always if empty ldy #0 bra .21 .1 inc ZPPtr2 Make PTR2 (pattern) advance to next char bne .2 inc ZPPtr2+1 .2 lda (ZPPtr2) get pattern char beq .41 end of pattern... .21 cmp #'*' beq .5 .3 lda (ZPPtr1) we must match ? or regular char, check if at end of string beq .9 no char left, exit with error lda (ZPPtr2) get back pattern char cmp #'?' beq .4 no need to compare, any char will match cmp (ZPPtr1),y Regular Char, compare with string at Y bne .9 no match, exit .4 iny advance to next char to compare bra .1 continue if remaining char in pattern .41 lda (ZPPtr1),y end of pattern, but end of string ? beq .8 yes, string matched entirely * no, remaining char in string, no match .9 sec rts .5 inc ZPPtr2 Make PTR2 advance to next char bne .6 inc ZPPtr2+1 .6 lda (ZPPtr2) we have '*', last char of pattern ? beq .8 yes, match everything, including empty string lda (ZPPtr2) get next char of pattern cmp #'*' another '*' ? beq .5 yes, '**' = '*', go next char cmp #'?' '*?' ? we must match a least one char beq .3 .7 lda (ZPPtr1),y we need at least one remaining char in string, check if at end of string beq .9 no chance to match ? or regular char iny lda (ZPPtr2) get again char in pattern cmp (ZPPtr1),y compare with char in string bne .7 not equal to next non wildcard in pattern iny bra .1 go check remaining char in pattern... .8 clc rts */-------------------------------------- * # StrUpr/StrLwr * Convert string to UPPERCASE/lowercase * ## C * `int strupr ( char * str);` * `int strlwr ( char * str);` * ## ASM * **In:** * `>LDYAI str` * `>SYSCALL strupr` * `>SYSCALL strlwr` * **Out:** * Uppercased/lowercased String in Buffer * Y,A = str *\-------------------------------------- K.StrUpr ldx #0 .HS 2C bit abs K.StrLwr ldx #2 >STYA ZPPtr1 pha save Y,A to restore them at exit phy ldy #0 .1 lda (ZPPtr1),y beq .8 cmp .9,x bcc .2 cmp .9+1,x bcs .2 eor #$20 sta (ZPPtr1),y .2 iny bne .1 inc ZPPtr1+1 bra .1 .8 ply pla rts *-------------------------------------- .9 .AS "azAZ" */-------------------------------------- * # StrCmp * Compare 2 strings * ## C * `int strcmp(const char *s1, const char *s2);` * ## ASM * **In:** * `>PUSHWI s2` * `>LDYAI s1` * `>SYSCALL strcmp` * **Out:** * CC : match * CS : no match * CC, Y,A=0 * CS, Y,A > 0 or < 0 *\-------------------------------------- K.StrCmp sec .HS 90 BCC */-------------------------------------- * # StrCaseCmp * Compare 2 strings, ignoring case * ## C * `int strcasecmp(const char *s1, const char *s2);` * ## ASM * **In:** * `>PUSHWI s2` * `>LDYAI s1` * `>SYSCALL strcasecmp` * **Out:** * CC : match * CS : no match * CC, Y,A=0 * CS, Y,A > 0 or < 0 *\-------------------------------------- K.StrCaseCmp clc >STYA ZPPtr1 s1 >PULLW ZPPtr2 s2 ldy #0 .1 lda (ZPPtr1),y beq .7 jsr K.StrCaseCmp.toUpper sta .2+1 lda (ZPPtr2),y beq .9 jsr K.StrCaseCmp.toUpper .2 eor #$ff SELF MODIFIED bne .9 iny bne .1 inc ZPPtr1+1 inc ZPPtr2+1 bra .1 .7 lda (ZPPtr2),y bne .9 tay .8 clc rts .9 sec lda (ZPPtr1),y sbc (ZPPtr2),y ldy #0 sec rts *-------------------------------------- K.StrCaseCmp.toUpper bcs .9 cmp #'a' bcc .9 cmp #'z'+1 bcs .1 eor #$20 .1 clc .9 rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STRING LOAD /A2OSX.SRC/SYS/KERNEL.S ASM