NEW PREFIX /A2OSX.BUILD AUTO 4,1 */-------------------------------------- * # StrLen.YA * Returns Length of C-String * ## In: * Y,A = Ptr to CSTR * ## Out: * Y,A = String length *\-------------------------------------- K.StrLen.YA >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 * Append SRC to DST * ## In: * PUSHW = Ptr to SRC (CSTR) * PUSHW = Ptr to DST (CSTR) * ## Out: * DST = DST+SRC *\-------------------------------------- K.StrCat jsr PullP1P2 .1 lda (ZPPtr1) beq K.StrCpy.I inc ZPPtr1 bne .1 inc ZPPtr1+1 bra .1 */-------------------------------------- * # StrCpy * Copy string * ## In: * PUSHW = Ptr to SRC (CSTR) * PUSHW = Ptr to DST (CSTR) * ## Out: * DST = SRC *\-------------------------------------- K.StrCpy jsr PullP1P2 K.StrCpy.I ldy #0 .1 lda (ZPPtr2),y sta (ZPPtr1),y beq .8 iny bne .1 inc ZPPtr2+1 inc ZPPtr1+1 bra .1 .8 rts */-------------------------------------- * # StrMatch * Compare a String against pattern * ## In: * PUSHW = PTR to Pattern (e.g. '*test?.txt') * PUSHW = PTR to Src String * ## Out: * CC : match * CS : no match *\-------------------------------------- K.StrMatch jsr PullP1P2 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.YA/StrLwr.YA * Convert string to UPPERCASE/lowercase * ## In: * Y,A = PTR to String (CSTR) * ## Out: * Uppercased/lowercased String in Buffer *\-------------------------------------- K.StrUpr.YA ldx #0 .HS 2C bit abs K.StrLwr.YA 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 * ## In: * PUSHW = Ptr to String1 (CSTR) * PUSHW = Ptr to String2 (CSTR) * ## Out: * DST = SRC *\-------------------------------------- K.StrCmp sec .HS 90 BCC */-------------------------------------- * # StrICmp * Compare 2 strings * ## In: * PUSHW = Ptr to String1 (CSTR) * PUSHW = Ptr to String2 (CSTR) * ## Out: * CC, Y,A=0 * CS, Y,A > 0 or < 0 *\-------------------------------------- K.StrICmp clc jsr PullP1P2 ldy #0 .1 lda (ZPPtr1),y beq .7 jsr K.StrICmp.toUpper sta .2+1 lda (ZPPtr2),y beq .9 jsr K.StrICmp.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.StrICmp.toUpper bcs .9 php cmp #'a' bcc .1 cmp #'z'+1 bcs .1 eor #$20 .1 plp .9 rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STRING LOAD /A2OSX.SRC/SYS/KERNEL.S ASM