PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * S.NewPStrYA * IN: * Y,A = PTR to buffer * OUT: * Y,A = PTR to String * X = hMem (PSTRING) *-------------------------------------- S.NewPStrYA >STYA ZPQuickPtr1 lda (ZPQuickPtr1) inc tay lda #0 Y,A = len of new string >PUSHYA >PUSHBI 0 0 = no option jsr S.GetMem bcs .9 >STYA ZPQuickPtr2 jsr S.PStrCpyPtr1Ptr2 >LDYA ZPQuickPtr2 clc rts .9 sec rts *-------------------------------------- * S.PStrCpy * IN: * PULLW = PSTR to DST (PSTRING) * PULLW = PSTR to SRC (PSTRING) * OUT: * DST = SRC (PSTRING) *-------------------------------------- S.PStrCpy >PULLW ZPQuickPtr2 save DST >PULLW ZPQuickPtr1 save SRC S.PStrCpyPtr1Ptr2 lda (ZPQuickPtr1) sta (ZPQuickPtr2) tay beq .2 .1 lda (ZPQuickPtr1),y sta (ZPQuickPtr2),y dey bne .1 .2 clc rts *-------------------------------------- * S.PStrCat * IN: * PULLW = PSTR to DST (PSTRING) * PULLW = PSTR to SRC (PSTRING) * OUT: * DST = DST+SRC (PSTRING) *-------------------------------------- S.PStrCat >PULLW ZPQuickPtr2 save DST >PULLW ZPQuickPtr1 save SRC lda (ZPQuickPtr1) tax lda (ZPQuickPtr2) tay .1 cpy #255 beq .8 iny inc ZPQuickPtr1 bne .2 inc ZPQuickPtr1+1 .2 lda (ZPQuickPtr1) sta (ZPQuickPtr2),y dex bne .1 .8 tya sta (ZPQuickPtr2) clc rts *-------------------------------------- * S.PStrUpr * IN: * Y,A = PTR to String (PSTRING) * OUT: * Uppercased String in Buffer *-------------------------------------- S.PStrUprYA >STYA ZPQuickPtr1 lda (ZPQuickPtr1) tay .1 lda (ZPQuickPtr1),y convert to UPPERCASE cmp #'a' bcc .2 cmp #'z'+1 bcs .2 eor #$20 sta (ZPQuickPtr1),y .2 dey bne .1 clc rts *-------------------------------------- * S.PStrMatch * IN: * PULLB = PTR to String (PSTRING) * PULLB = PTR to Pattern (PSTRING) * OUT: * cc = match * cs = no match *-------------------------------------- S.PStrMatch >PULLW ZPQuickPtr2 pull String >PULLW ZPQuickPtr1 pull Pattern lda (ZPQuickPTR1) Keep Pattern Length in X tax beq .8 Match always if empty ldy #0 .1 inc ZPQuickPTR1 Make PTR1 advance to next char bne .2 inc ZPQuickPTR1+1 .2 lda (ZPQuickPTR1) get pattern char cmp #'*' beq .5 .3 tya we must match ? or regular char cmp (ZPQuickPTR2) check if at end of string beq .9 yes, no char left, exit with error iny advance to next char to compare lda (ZPQuickPTR1) get back pattern char cmp #'?' beq .4 no need to compare, any char will match cmp (ZPQuickPTR2),y Regular Char, compare with string at Y bne .9 no match, exit .4 dex char matched, check if end of pattern bne .1 continue if remaining char in pattern tya end of pattern, but end of string ? cmp (ZPQuickPTR2) end of string ? beq .8 yes, string matched entirely bra .9 no, remaining char in string, no match .5 dex we have '*', last char of pattern ? beq .8 yes, match everything, including empty string inc ZPQuickPTR1 Make PTR1 advance to next char bne .6 inc ZPQuickPTR1+1 .6 lda (ZPQuickPTR1) get next char of pattern cmp #'*' another '*' ? beq .5 yes, '**' = '*', go next char cmp #'?' '*?' ??? we must match a least one char beq .3 .7 tya we need at least one remaining char in string, cmp (ZPQuickPTR2) check if at end of string beq .9 no chance to match ? or regular char iny lda (ZPQuickPTR1) get again char in pattern cmp (ZPQuickPTR2),y compare with char in string bne .7 not equal to next non wildcard in pattern bra .4 go check remaining char in pattern... .8 clc rts .9 sec rts *-------------------------------------- * S.PStr2StrArrayYA * In : * Y,A = PTR to String * Out : * Y,A = PTR to StrArray * X = hMem *-------------------------------------- S.PStr2StrArrayYA >STYA ZPQuickPtr1 lda (ZPQuickPtr1) Get mem size STRLEN+1 ldx #0 inc bne .1 inx .1 >PUSHAX >PUSHBI 0 jsr S.GetMem bcs .9 phx save hMem phy save PTR.LO pha save PTR.HI >STYA ZPQuickPtr2 lda (ZPQuickPtr1) tax count in src string beq .8 ldy #0 reset index in dst token .3 inc ZPQuickPtr1 get... bne .4 inc ZPQuickPtr1+1 .4 lda (ZPQuickPtr1) ...next char cmp #' ' found a space ? bne .6 tya in a token ? beq .7 no, skip & go to next char sta (ZPQuickPtr2) yes, set this token len sec adc ZPQuickPtr2 advance to next token sta ZPQuickPtr2 bcc .5 inc ZPQuickPtr2+1 .5 ldy #0 reset index in dst token bra .7 .6 iny add char to token sta (ZPQuickPtr2),y .7 dex end of src string? bne .3 no...next char... tya yes, are we in a token ? beq .8 sta (ZPQuickPtr2) yes, set last token len sec adc ZPQuickPtr2 advance to next token sta ZPQuickPtr2 bcc .8 inc ZPQuickPtr2+1 .8 lda #0 sta (ZPQuickPtr2) set Array Ending 0 pla get back PTR.HI ply get back PTR.LO plx get back hMem clc .9 rts *-------------------------------------- MAN SAVE SYS/KERNEL.S.STR LOAD SYS/KERNEL.S ASM