A2osX/SYS/KERNEL.S.STR.txt

540 lines
12 KiB
Plaintext
Raw Normal View History

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
*/--------------------------------------
* #NewPStrYA
* Create a new copy of PSTR
2016-10-22 09:06:51 +00:00
* ##In:
* Y,A = PTR to buffer
2016-10-22 09:06:51 +00:00
* ##Out:
* CC : success
* Y,A = PTR to String
* X = hMem (PSTRING)
2016-10-22 09:06:51 +00:00
* CS : error
* A = SYS error code
*\--------------------------------------
K.NewPStrYA >STYA ZPQuickPtr2
lda (ZPQuickPtr2)
2015-03-14 21:48:35 +00:00
inc
tay
lda #0 Y,A = len of new string
>PUSHYA
2016-08-17 06:25:58 +00:00
>PUSHBI 0 0 = no option
2016-09-21 15:20:37 +00:00
jsr K.GetMem
2015-03-14 21:48:35 +00:00
bcs .9
2016-08-17 06:25:58 +00:00
>STYA ZPQuickPtr1
2016-08-17 06:25:58 +00:00
jsr K.PStrCpyPtr2Ptr1
2016-08-17 06:25:58 +00:00
>LDYA ZPQuickPtr1
2016-08-17 06:25:58 +00:00
clc
.9 rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
* #PStrCpy
* Copy string
2016-10-22 09:06:51 +00:00
* ##In:
* PUSHW = PSTR to SRC (PSTRING)
* PUSHW = PSTR to DST (PSTRING)
* ##Out:
2016-08-17 06:25:58 +00:00
* DST = SRC (PSTRING)
*--------------------------------------
K.PStrCpy jsr PullPtr1Ptr2
K.PStrCpyPtr2Ptr1
lda (ZPQuickPtr2)
sta (ZPQuickPtr1)
2015-03-14 21:48:35 +00:00
tay
beq .2
2016-08-17 06:25:58 +00:00
.1 lda (ZPQuickPtr2),y
sta (ZPQuickPtr1),y
2015-03-14 21:48:35 +00:00
dey
bne .1
2016-08-17 06:25:58 +00:00
.2 clc
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
* #PStrCat
* Append SRC to DST
2016-10-22 09:06:51 +00:00
* ##In:
* PUSHW = PSTR to SRC (PSTRING)
* PUSHW = PSTR to DST (PSTRING)
* ##Out:
2016-08-17 06:25:58 +00:00
* DST = DST+SRC (PSTRING)
2015-03-14 21:48:35 +00:00
*--------------------------------------
K.PStrCat jsr PullPtr1Ptr2
2016-08-17 06:25:58 +00:00
lda (ZPQuickPtr2)
2015-03-14 21:48:35 +00:00
tax
2016-08-17 06:25:58 +00:00
lda (ZPQuickPtr1)
2016-08-17 06:25:58 +00:00
tay
.1 cpy #255
beq .8
iny
inc ZPQuickPtr2
2016-08-17 06:25:58 +00:00
bne .2
inc ZPQuickPtr1+1
.2 lda (ZPQuickPtr2)
sta (ZPQuickPtr1),y
2015-03-14 21:48:35 +00:00
dex
2016-08-17 06:25:58 +00:00
bne .1
.8 tya
sta (ZPQuickPtr1)
2015-03-14 21:48:35 +00:00
clc
rts
2016-10-22 09:06:51 +00:00
*/--------------------------------------
* #PStrMatch
* Compare a String against pattern
2016-10-22 09:06:51 +00:00
* ##In:
* PUSHW = PTR to Pattern (e.g. '*test?.txt')
* PUSHW = PTR to Src String
* ##Out:
* CC : match
* CS : no match
2016-10-22 09:06:51 +00:00
*\--------------------------------------
K.PStrMatch jsr PullPtr1Ptr2
lda (ZPQuickPTR2) Keep Pattern Length in X
2015-03-14 21:48:35 +00:00
tax
beq .8 Match always if empty
ldy #0
.1 inc ZPQuickPTR2 Make PTR1 advance to next char
2015-03-14 21:48:35 +00:00
bne .2
inc ZPQuickPTR2+1
2015-03-14 21:48:35 +00:00
.2 lda (ZPQuickPTR2) get pattern char
2015-03-14 21:48:35 +00:00
cmp #'*'
beq .5
.3 tya we must match ? or regular char
cmp (ZPQuickPTR1) check if at end of string
2015-03-14 21:48:35 +00:00
beq .9 yes, no char left, exit with error
iny advance to next char to compare
lda (ZPQuickPTR2) get back pattern char
2015-03-14 21:48:35 +00:00
cmp #'?'
beq .4 no need to compare, any char will match
cmp (ZPQuickPTR1),y Regular Char, compare with string at Y
2015-03-14 21:48:35 +00:00
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 (ZPQuickPTR1) end of string ?
2015-03-14 21:48:35 +00:00
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 ZPQuickPTR2 Make PTR1 advance to next char
2015-03-14 21:48:35 +00:00
bne .6
inc ZPQuickPTR2+1
2015-03-14 21:48:35 +00:00
.6 lda (ZPQuickPTR2) get next char of pattern
2015-03-14 21:48:35 +00:00
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 (ZPQuickPTR1) check if at end of string
2015-03-14 21:48:35 +00:00
beq .9 no chance to match ? or regular char
iny
lda (ZPQuickPTR2) get again char in pattern
cmp (ZPQuickPTR1),y compare with char in string
2015-03-14 21:48:35 +00:00
bne .7 not equal to next non wildcard in pattern
bra .4 go check remaining char in pattern...
.8 clc
rts
.9 sec
rts
2016-10-22 09:06:51 +00:00
*/--------------------------------------
* #PStrUprYA/PStrLwrYA
* Convert string to UPPERCASE/lowercase
2016-10-22 09:06:51 +00:00
* ##In:
* Y,A = PTR to String (PSTRING)
2016-10-22 09:06:51 +00:00
* ##Out:
* Uppercased/lowercased String in Buffer
2016-10-22 09:06:51 +00:00
*\--------------------------------------
2016-09-21 15:20:37 +00:00
K.PStrUprYA ldx #0
.HS 2C bit abs
2016-09-21 15:20:37 +00:00
K.PStrLwrYA ldx #2
>STYA ZPQuickPtr1
pha save Y,A to restore them at exit
phy
lda (ZPQuickPtr1)
tay
.1 lda (ZPQuickPtr1),y
2016-09-21 15:20:37 +00:00
cmp K.PStrUprLwr,x
bcc .2
2016-09-21 15:20:37 +00:00
cmp K.PStrUprLwr+1,x
bcs .2
eor #$20
sta (ZPQuickPtr1),y
.2 dey
bne .1
ply
pla
clc
rts
*--------------------------------------
2016-09-21 15:20:37 +00:00
K.PStrUprLwr .AS "azAZ"
2016-10-22 09:06:51 +00:00
*/--------------------------------------
* #PStrFTime
2016-10-22 09:06:51 +00:00
* Convert S.TIME struct to PSTR
* ##In:
2016-10-22 09:06:51 +00:00
* PUSHW = Dst PTR To PSTR Buf
* PUSHW = Src PTR To Format String
* %a : Abbreviated weekday name : Thu
* %A : Full weekday name : Thursday
* %b : Abbreviated month name : Aug
* %B : Full month name : August
* %d : Day of the month, zero-padded (01-31)
* %H : Hour in 24h format (00-23) 14
* %I : Hour in 12h format (01-12) 02
* %m : Month as a decimal number (01-12) 08
* %M : Minute (00-59) 55
* %p : AM or PM designation PM
* %S : Second (00-61) 02
* %w : Weekday as a decimal number with Sunday as 0 (0-6)
* %y : Year, last two digits (00-99)
* %Y : Year four digits 2001
2016-10-22 09:06:51 +00:00
* PUSHW = Src PTR To S.Time
* ##Out:
2016-10-22 09:06:51 +00:00
* none. always succeed.
*\--------------------------------------
K.PStrFTime jsr PullPtr1Ptr2Ptr3
lda #0
sta (ZPQuickPtr3) Reset target PSTR length
tay
.1 iny
lda (ZPQuickPtr2),y
cmp #'%'
beq .2
phy
jsr K.PStrFTime.addChar
ply
.10 tya
cmp (ZPQuickPtr2)
bne .1
rts
.2 tya
cmp (ZPQuickPtr2)
beq .8
iny
ldx #K.PStrFTime.JMPL-K.PStrFTime.Tbl-1
.3 lda (ZPQuickPtr2),y
cmp K.PStrFTime.Tbl,x
beq .4
dex
bpl .3
beq .10
.4 lda K.PStrFTime.JMPL,x
sta .5+1
lda K.PStrFTime.JMPH,x
sta .5+2
phy
.5 jsr $ffff
ply
bra .10
.8 rts
*--------------------------------------
K.PStrFTime.TBL .AS "aAbBdHImMpSwyY"
K.PStrFTime.JMPL .DA #K.PStrFTime.A
.DA #K.PStrFTime.AA
.DA #K.PStrFTime.B
.DA #K.PStrFTime.BB
.DA #K.PStrFTime.D
.DA #K.PStrFTime.HH
.DA #K.PStrFTime.II
.DA #K.PStrFTime.M
.DA #K.PStrFTime.MM
.DA #K.PStrFTime.P
.DA #K.PStrFTime.SS
.DA #K.PStrFTime.W
.DA #K.PStrFTime.Y
.DA #K.PStrFTime.YY
*--------------------------------------
K.PStrFTime.JMPH .DA /K.PStrFTime.A
.DA /K.PStrFTime.AA
.DA /K.PStrFTime.B
.DA /K.PStrFTime.BB
.DA /K.PStrFTime.D
.DA /K.PStrFTime.HH
.DA /K.PStrFTime.II
.DA /K.PStrFTime.M
.DA /K.PStrFTime.MM
.DA /K.PStrFTime.P
.DA /K.PStrFTime.SS
.DA /K.PStrFTime.W
.DA /K.PStrFTime.Y
.DA /K.PStrFTime.YY
*--------------------------------------
K.PStrFTime.A ldx #3 Short day of week, 3 chars...
.HS 2C Bit abs
K.PStrFTime.AA ldx #15 full DoW
>LDYAI K.PStrFTime.DAY
>STYA ZPQuickPtr4
ldy #S.Time.WDAY
bra K.PStrFTime.STR
K.PStrFTime.B ldx #3 Short Month, 3 chars....
.HS 2C Bit abs
K.PStrFTime.BB ldx #15 full Month....
>LDYAI K.PStrFTime.MON
>STYA ZPQuickPtr4
ldy #S.Time.MONTH
K.PStrFTime.STR lda (ZPQuickPtr1),y get required S.Time field value
tay
beq .9 Illegal value
.1 dey range 0..x
beq .2
lda (ZPQuickPtr4)
sec
adc ZPQuickPtr4
sta ZPQuickPtr4
bcc .1
inc ZPQuickPtr4+1
bra .1
.2 ldy #0
.3 iny
lda (ZPQuickPtr4),y
phy
jsr K.PStrFTime.addChar
pla
cmp (ZPQuickPtr4)
beq .8
tay
dex
bne .3
.8 rts
.9 ldx #3
lda #'?'
.99 jsr K.PStrFTime.addChar
dex
bne .99
rts
K.PStrFTime.D ldy #S.Time.DAY
bra K.PStrFTime.addDecPtr1Y
K.PStrFTime.HH ldy #S.Time.HOUR
bra K.PStrFTime.addDecPtr1Y
K.PStrFTime.II ldy #S.Time.HOUR
lda (ZPQuickPtr1),y
cmp #12
bcc .1
sbc #12
.1 bra K.PStrFTime.addDecA
K.PStrFTime.M ldy #S.Time.MONTH
bra K.PStrFTime.addDecPtr1Y
K.PStrFTime.MM ldy #S.Time.MINUTE
bra K.PStrFTime.addDecPtr1Y
K.PStrFTime.P ldy #S.Time.HOUR
lda (ZPQuickPtr1),y
cmp #12
bcc .1
lda #'p'
.HS 2C bit abs
.1 lda #'a'
jsr K.PStrFTime.addChar
lda #'m'
bra K.PStrFTime.addChar
K.PStrFTime.SS ldy #S.Time.SECOND
bra K.PStrFTime.addDecPtr1Y
K.PStrFTime.W ldy #S.Time.WDAY
bra K.PStrFTime.addDecPtr1Y
K.PStrFTime.YY ldy #S.Time.CENTURY
jsr K.PStrFTime.addDecPtr1Y
K.PStrFTime.Y ldy #S.Time.YEAR
*--------------------------------------
K.PStrFTime.addDecPtr1Y
lda (ZPQuickPtr1),y
K.PStrFTime.addDecA
sta K.PStrFTime.BIN
stz K.PStrFTime.DEC
sed
ldx #8
.1 asl K.PStrFTime.BIN
lda K.PStrFTime.DEC
adc K.PStrFTime.DEC
sta K.PStrFTime.DEC
dex
bne .1
cld
* lda K.PStrFTime.DEC already in A
pha
lsr
lsr
lsr
lsr
ora #$30
jsr K.PStrFTime.addChar
pla
and #$0f
ora #$30
*--------------------------------------
K.PStrFTime.addChar
pha
lda (ZPQuickPtr3)
inc
sta (ZPQuickPtr3)
tay
pla
sta (ZPQuickPtr3),y
rts
*--------------------------------------
K.PStrFTime.DAY >PSTR "Monday"
>PSTR "Tuesday"
>PSTR "Wednesday"
>PSTR "Thursday"
>PSTR "Friday"
>PSTR "Saturday"
>PSTR "Sunday"
*--------------------------------------
K.PStrFTime.MON >PSTR "January"
>PSTR "February"
>PSTR "March"
>PSTR "April"
>PSTR "May"
>PSTR "June"
>PSTR "July"
>PSTR "August"
>PSTR "September"
>PSTR "October"
>PSTR "November"
>PSTR "December"
*--------------------------------------
K.PStrFTime.BIN .BS 1
K.PStrFTime.DEC .BS 1 always < 100
2016-10-22 09:06:51 +00:00
*/--------------------------------------
* #PStr2StrArrayYA
* Convert a PSTR (e.g. : command Line) to a Array of PSTRs (Args[])
* ##In:
2016-10-22 09:06:51 +00:00
* Y,A = PTR to String
* ##Out:
2016-10-22 09:06:51 +00:00
* CC : success
* Y,A = PTR to StrArray
* X = hMem
2016-10-22 09:06:51 +00:00
* CS : error
* A = SYS error code
2016-10-22 09:06:51 +00:00
*\--------------------------------------
2016-09-21 15:20:37 +00:00
K.PStr2StrArrayYA
2015-03-14 21:48:35 +00:00
>STYA ZPQuickPtr1
2016-08-17 06:25:58 +00:00
lda (ZPQuickPtr1) Get mem size STRLEN+1
ldx #0
inc
bne .1
inx
2016-06-07 06:10:18 +00:00
2016-08-17 06:25:58 +00:00
.1 >PUSHAX
>PUSHBI 0
2016-09-21 15:20:37 +00:00
jsr K.GetMem
2016-08-17 06:25:58 +00:00
bcs .9
phx save hMem
phy save PTR.LO
pha save PTR.HI
2016-06-07 06:10:18 +00:00
>STYA ZPQuickPtr2
2016-08-17 06:25:58 +00:00
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
2015-03-14 21:48:35 +00:00
sec
2016-08-17 06:25:58 +00:00
adc ZPQuickPtr2 advance to next token
sta ZPQuickPtr2
bcc .5
2016-06-07 06:10:18 +00:00
inc ZPQuickPtr2+1
2016-08-17 06:25:58 +00:00
.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
2015-03-14 21:48:35 +00:00
sec
2016-08-17 06:25:58 +00:00
adc ZPQuickPtr2 advance to next token
sta ZPQuickPtr2
bcc .8
2016-06-07 06:10:18 +00:00
inc ZPQuickPtr2+1
2016-08-17 06:25:58 +00:00
.8 lda #0
sta (ZPQuickPtr2) set Array Ending 0
2016-06-07 06:10:18 +00:00
2016-08-17 06:25:58 +00:00
pla get back PTR.HI
ply get back PTR.LO
plx get back hMem
2016-05-01 21:13:54 +00:00
clc
2016-08-17 06:25:58 +00:00
.9 rts
2016-05-01 21:13:54 +00:00
*--------------------------------------
2015-03-14 21:48:35 +00:00
MAN
SAVE SYS/KERNEL.S.STR
LOAD SYS/KERNEL.S
ASM