2015-03-14 21:48:35 +00:00
|
|
|
|
PR#3
|
2015-06-03 18:30:57 +00:00
|
|
|
|
PREFIX /A2OSX.SRC
|
2015-03-14 21:48:35 +00:00
|
|
|
|
NEW
|
|
|
|
|
INC 1
|
|
|
|
|
AUTO 6
|
|
|
|
|
.LIST OFF
|
|
|
|
|
.OP 65C02
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.PStrCpyA
|
|
|
|
|
* In:
|
|
|
|
|
* A = hMem of Src String
|
|
|
|
|
* Out:
|
|
|
|
|
* A = hMem of Dest String
|
|
|
|
|
*--------------------------------------
|
2015-06-03 18:30:57 +00:00
|
|
|
|
* S.NewPStrYA
|
|
|
|
|
* IN:
|
|
|
|
|
* PULLW = PTR to buffer
|
|
|
|
|
* OUT:
|
|
|
|
|
* A = hMem to S (PSTRING)
|
|
|
|
|
*--------------------------------------
|
2015-03-14 21:48:35 +00:00
|
|
|
|
S.PStrCpyA jsr S.GetMemPtrA
|
2015-06-03 18:30:57 +00:00
|
|
|
|
S.NewPStrYA >STYA ZPQuickPtr1
|
|
|
|
|
lda (ZPQuickPtr1)
|
2015-03-14 21:48:35 +00:00
|
|
|
|
inc
|
|
|
|
|
tay
|
|
|
|
|
lda #0 Y,A = len of new string
|
|
|
|
|
>PUSHYA
|
|
|
|
|
>PUSHA 0 = no option
|
|
|
|
|
jsr S.GetMem
|
|
|
|
|
bcs .9
|
|
|
|
|
phx
|
|
|
|
|
>STYA ZPQuickPtr2
|
|
|
|
|
lda (ZPQuickPtr1)
|
|
|
|
|
sta (ZPQuickPtr2)
|
|
|
|
|
tay
|
|
|
|
|
beq .2
|
|
|
|
|
.1 lda (ZPQuickPtr1),y
|
|
|
|
|
sta (ZPQuickPtr2),y
|
|
|
|
|
dey
|
|
|
|
|
bne .1
|
|
|
|
|
.2 pla
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.9 sec
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.PStrCat
|
|
|
|
|
* IN:
|
|
|
|
|
* PULLB = hMem to S1 (PSTRING)
|
|
|
|
|
* PULLB = hMem to S2 (PSTRING)
|
|
|
|
|
* OUT:
|
|
|
|
|
* A = hMem to S1+S2 (PSTRING)
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.PStrCat >PULLA
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr1 save S1
|
|
|
|
|
>PULLA
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr2 save S2
|
|
|
|
|
lda (ZPQuickPtr1) Compute length of new path = S1 + S2 + 1
|
|
|
|
|
sec
|
|
|
|
|
adc (ZPQuickPtr2)
|
|
|
|
|
tay
|
|
|
|
|
lda #0 Y,A = len of new string
|
|
|
|
|
>PUSHYA
|
|
|
|
|
>PUSHA 0 = no option
|
|
|
|
|
jsr S.GetMem
|
|
|
|
|
bcs .9 OOM error
|
|
|
|
|
>STYA ZPQuickPtr3
|
|
|
|
|
phx save New hMem
|
|
|
|
|
lda (ZPQuickPtr1)
|
|
|
|
|
tax
|
|
|
|
|
ldy #0
|
|
|
|
|
.2 iny
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
sta (ZPQuickPtr3),y
|
|
|
|
|
dex
|
|
|
|
|
bne .2
|
|
|
|
|
lda (ZPQuickPtr2)
|
|
|
|
|
tax
|
|
|
|
|
.3 inc ZPQuickPtr2
|
|
|
|
|
bne .4
|
|
|
|
|
inc ZPQuickPtr2+1
|
|
|
|
|
.4 iny
|
|
|
|
|
lda (ZPQuickPtr2)
|
|
|
|
|
sta (ZPQuickPtr3),y
|
|
|
|
|
dex
|
|
|
|
|
bne .3
|
|
|
|
|
tya
|
|
|
|
|
sta (ZPQuickPtr3)
|
|
|
|
|
pla returns A = new hMem
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.9 sec
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.PStrCmp
|
|
|
|
|
* IN:
|
|
|
|
|
* PULLB = hMem to S1 (PSTRING)
|
|
|
|
|
* PULLB = hMem to S2 (PSTRING)
|
|
|
|
|
* OUT:
|
|
|
|
|
* cc or cs
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.PStrCmp >PULLA
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr1 save S1
|
|
|
|
|
>PULLA
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr2 save S2
|
|
|
|
|
lda (ZPQuickPtr1)
|
|
|
|
|
tay
|
|
|
|
|
cmp (ZPQuickPtr2)
|
|
|
|
|
bne .9
|
|
|
|
|
.1 lda (ZPQuickPtr1),y
|
|
|
|
|
cmp (ZPQuickPtr2),y
|
|
|
|
|
bne .9
|
|
|
|
|
dey
|
|
|
|
|
bne .1
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.9 sec
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* S.PStrMatch
|
|
|
|
|
* IN:
|
|
|
|
|
* PULLB = hMem to String (PSTRING)
|
|
|
|
|
* PULLB = hMem to Pattern (PSTRING)
|
|
|
|
|
* OUT:
|
|
|
|
|
* cc = match
|
|
|
|
|
* cs = no match
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.PStrMatch >PULLA
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr2 save String
|
|
|
|
|
>PULLA
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr1 save Pattern
|
|
|
|
|
bra S.PStrMatch1
|
|
|
|
|
|
|
|
|
|
S.PStrMatchP >PULLW ZPQuickPtr2 pull String
|
|
|
|
|
>PULLW ZPQuickPtr1 pull Pattern
|
|
|
|
|
|
|
|
|
|
S.PStrMatch1 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.PStrGetTkn
|
|
|
|
|
* IN:
|
|
|
|
|
* PULLB = Token IDX
|
|
|
|
|
* 0: "Split mode": first token + remaining
|
|
|
|
|
* !0: "Std Mode": Return token #
|
|
|
|
|
* PULLB = SEP char
|
|
|
|
|
* PULLB = hMem to PSTRING
|
|
|
|
|
* OUT:
|
|
|
|
|
* A = hMem to Token (PSTRING)
|
|
|
|
|
* X = hMem to Remaining String After Token "Split Mode"
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
S.PStrGetTkn >PULLA Get IDX
|
|
|
|
|
sta ZPQuickPtr2+1
|
|
|
|
|
>PULLA Get SEP
|
|
|
|
|
sta ZPQuickPtr2
|
|
|
|
|
>PULLA Get PStr
|
|
|
|
|
jsr S.GetMemPtrA
|
|
|
|
|
>STYA ZPQuickPtr1
|
|
|
|
|
ldx #0 init token count to 0
|
|
|
|
|
ldy #0
|
|
|
|
|
stz ZPQuickPtr3 init INTOKEN start to 0
|
|
|
|
|
.1 iny
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
and #$7F
|
|
|
|
|
cmp ZPQuickPtr2 char=SEP ?
|
|
|
|
|
bne .3 no, start a new token if not alredy in
|
|
|
|
|
lda ZPQuickPtr3 SEP:in INTOKEN ?
|
|
|
|
|
beq .4 no, skip this SEP
|
|
|
|
|
inx yes, increase token count
|
|
|
|
|
lda ZPQuickPtr2+1 requested token=0 ?
|
|
|
|
|
beq .71 yes, we are in "split mode"
|
|
|
|
|
cpx ZPQuickPtr2+1 no,is current X=requested IDX?
|
|
|
|
|
beq .71
|
|
|
|
|
stz ZPQuickPtr3 reset in INTOKEN start
|
|
|
|
|
bra .4
|
|
|
|
|
.3 lda ZPQuickPtr3 char:already INTOKEN ?
|
|
|
|
|
bne .4 yes, keep existing start index
|
|
|
|
|
sty ZPQuickPtr3 mark begining of token
|
|
|
|
|
.4 tya
|
|
|
|
|
cmp (ZPQuickPtr1) end of string ?
|
|
|
|
|
bne .1 no, get next one
|
|
|
|
|
lda ZPQuickPtr3 INTOKEN?
|
|
|
|
|
beq .6
|
|
|
|
|
inx yes, last one is ending with string
|
|
|
|
|
.6 lda ZPQuickPtr2+1 split mode ?
|
|
|
|
|
beq .7
|
|
|
|
|
cpx ZPQuickPtr2+1 is token = requested?
|
|
|
|
|
beq .7
|
|
|
|
|
sec End of String reached, no matching token
|
|
|
|
|
.61 rts
|
|
|
|
|
.71 dey move back yo end of token before this SEP
|
|
|
|
|
.7 sty ZPQuickPtr3+1 we have matching token (or 1st one in split mode) at [ZPQuickPtr3,ZPQuickPtr3+1]
|
|
|
|
|
tya compute token len=Y-ZPQuickPtr3+1
|
|
|
|
|
sec
|
|
|
|
|
sbc ZPQuickPtr3
|
|
|
|
|
inc +1
|
|
|
|
|
inc +1 for string len
|
|
|
|
|
tay
|
|
|
|
|
lda #0
|
|
|
|
|
>PUSHYA Get a hMem for this token
|
|
|
|
|
>PUSHA 0 = no option
|
|
|
|
|
jsr S.GetMem
|
|
|
|
|
bcs .61
|
|
|
|
|
phx save hMem
|
|
|
|
|
>STYA ZPQuickPtr4
|
|
|
|
|
lda ZPQuickPtr3+1
|
|
|
|
|
sec
|
|
|
|
|
sbc ZPQuickPtr3
|
|
|
|
|
inc
|
|
|
|
|
sta (ZPQuickPtr4) set this string length
|
|
|
|
|
ldy ZPQuickPtr3
|
|
|
|
|
dey
|
|
|
|
|
.8 iny
|
|
|
|
|
inc ZPQuickPtr4
|
|
|
|
|
bne .9
|
|
|
|
|
inc ZPQuickPtr4+1
|
|
|
|
|
.9 lda (ZPQuickPtr1),y
|
|
|
|
|
sta (ZPQuickPtr4)
|
|
|
|
|
cpy ZPQuickPtr3+1
|
|
|
|
|
bne .8
|
|
|
|
|
lda ZPQuickPtr2+1 requested token=0 ?
|
|
|
|
|
bne .87
|
|
|
|
|
tya yes, we are in "split mode"
|
|
|
|
|
cmp (ZPQuickPtr1) Remaining chars ?
|
|
|
|
|
beq .87
|
|
|
|
|
.10 iny move to next char
|
|
|
|
|
lda (ZPQuickPtr1),y
|
|
|
|
|
cmp ZPQuickPtr2 char=SEP?
|
|
|
|
|
bne .11
|
|
|
|
|
tya
|
|
|
|
|
cmp (ZPQuickPtr1) last one ?
|
|
|
|
|
bne .10
|
|
|
|
|
bra .87 yes, nothing to return
|
|
|
|
|
.11 sty ZPQuickPtr3+1 ZPQuickPtr3+1=1st non SEP char
|
|
|
|
|
lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr3+1
|
|
|
|
|
sec
|
|
|
|
|
sbc ZPQuickPtr3+1
|
|
|
|
|
inc
|
|
|
|
|
inc +1 for string len
|
|
|
|
|
tay
|
|
|
|
|
lda #0
|
|
|
|
|
>PUSHYA Get a hMem for remaining string
|
|
|
|
|
>PUSHA 0 = no option
|
|
|
|
|
jsr S.GetMem
|
|
|
|
|
bcs .98
|
|
|
|
|
phx save hMem
|
|
|
|
|
>STYA ZPQuickPtr4
|
|
|
|
|
lda (ZPQuickPtr1)
|
|
|
|
|
sec
|
|
|
|
|
sbc ZPQuickPtr3+1
|
|
|
|
|
inc
|
|
|
|
|
sta (ZPQuickPtr4)
|
|
|
|
|
ldy ZPQuickPtr3+1
|
|
|
|
|
dey
|
|
|
|
|
.12 iny
|
|
|
|
|
inc ZPQuickPtr4
|
|
|
|
|
bne .13
|
|
|
|
|
inc ZPQuickPtr4+1
|
|
|
|
|
.13 lda (ZPQuickPtr1),y
|
|
|
|
|
sta (ZPQuickPtr4)
|
|
|
|
|
tya
|
|
|
|
|
cmp (ZPQuickPtr1)
|
|
|
|
|
bne .12
|
|
|
|
|
plx get back remaining string hMem
|
|
|
|
|
pla get back token hMem
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.87 ldx #0 Splitmode but no remaining string to return
|
|
|
|
|
pla get back token hMem
|
|
|
|
|
clc
|
|
|
|
|
rts
|
|
|
|
|
.98 pla get back Token hMem
|
|
|
|
|
jsr S.FreeMemA discard Token
|
|
|
|
|
.99 sec
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
MAN
|
|
|
|
|
SAVE SYS/KERNEL.S.STR
|
|
|
|
|
LOAD SYS/KERNEL.S
|
|
|
|
|
ASM
|