A2osX/SYS/KERNEL.S.STRING.txt

299 lines
6.3 KiB
Plaintext
Raw Normal View History

2017-12-22 21:24:30 +00:00
NEW
PREFIX /A2OSX.BUILD
2017-12-22 21:24:30 +00:00
AUTO 4,1
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # StrLen
* Returns Length of C-String
2018-06-18 06:22:50 +00:00
* ## C
2018-06-19 15:08:22 +00:00
* `int strlen ( char * str);`
2018-06-18 06:22:50 +00:00
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-06-19 15:08:22 +00:00
* `>LDYAI str`
* `>SYSCALL strlen`
2018-06-14 15:31:36 +00:00
* **Out:**
2018-06-18 06:22:50 +00:00
* Y,A = String length
*\--------------------------------------
2018-06-18 06:22:50 +00:00
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
2018-06-18 08:44:02 +00:00
* Concatenate strings
* ## C
* `char * strcat ( char * destination, const char * source );`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-06-18 08:44:02 +00:00
* `>PUSHWI source`
* `>LDYAI destination`
* `>SYSCALL strcat`
2018-06-14 15:31:36 +00:00
* **Out:**
2018-06-18 08:44:02 +00:00
* Y,A = destination
*\--------------------------------------
2018-06-18 08:44:02 +00:00
K.StrCat sec
.HS 90 BCC
*/--------------------------------------
* # StrCpy
* Copy string
2018-06-18 06:22:50 +00:00
* ## C
* `char * strcpy ( char * destination, const char * source );`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-06-18 08:44:02 +00:00
* `>PUSHWI source`
* `>LDYAI destination`
* `>SYSCALL strcpy`
2018-06-14 15:31:36 +00:00
* **Out:**
2018-06-18 08:44:02 +00:00
* Y,A = destination
*\--------------------------------------
2018-06-18 08:44:02 +00:00
K.StrCpy clc
>STYA ZPPtr1
>PULLW ZPPtr2
bcc .2
.1 lda (ZPPtr1)
beq .2
2018-06-18 08:44:02 +00:00
inc ZPPtr1
bne .1
inc ZPPtr1+1
bra .1
.2 ldy #0
2018-06-18 08:44:02 +00:00
.3 lda (ZPPtr2),y
sta (ZPPtr1),y
beq .8
iny
2018-06-18 08:44:02 +00:00
bne .3
inc ZPPtr2+1
inc ZPPtr1+1
2018-06-18 08:44:02 +00:00
bra .3
.8 rts
*/--------------------------------------
* # StrMatch
2018-09-05 11:31:49 +00:00
* Compare a String against pattern (e.g. '*test?.txt')
* ## C
* `int * strmatch ( char * s, const char * pattern );`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-05 11:31:49 +00:00
* `>PUSHWI pattern`
* `>LDYAI s`
* `>SYSCALL strmatch`
2018-06-14 15:31:36 +00:00
* **Out:**
2018-09-05 11:31:49 +00:00
* CC : match
* CS : no match
*\--------------------------------------
2018-09-05 11:31:49 +00:00
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
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # StrUpr/StrLwr
* Convert string to UPPERCASE/lowercase
2018-09-06 12:27:37 +00:00
* ## C
* `int strupr ( char * str);`
* `int strlwr ( char * str);`
* ## ASM
* **In:**
* `>LDYAI str`
* `>SYSCALL strupr`
* `>SYSCALL strlwr`
* **Out:**
2018-06-18 06:22:50 +00:00
* Uppercased/lowercased String in Buffer
2018-09-06 12:27:37 +00:00
* Y,A = str
*\--------------------------------------
2018-06-22 14:59:24 +00:00
K.StrUpr ldx #0
.HS 2C bit abs
2018-06-22 14:59:24 +00:00
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"
2018-01-15 16:51:44 +00:00
*/--------------------------------------
* # StrCmp
* Compare 2 strings
2018-09-06 12:27:37 +00:00
* ## C
* `int strcmp(const char *s1, const char *s2);`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-06 12:27:37 +00:00
* `>PUSHWI s2`
* `>LDYAI s1`
* `>SYSCALL strcmp`
2018-06-14 15:31:36 +00:00
* **Out:**
2018-09-06 12:27:37 +00:00
* CC : match
* CS : no match
* CC, Y,A=0
* CS, Y,A > 0 or < 0
2018-01-15 16:51:44 +00:00
*\--------------------------------------
K.StrCmp sec
.HS 90 BCC
*/--------------------------------------
2018-09-06 12:27:37 +00:00
* # StrCaseCmp
* Compare 2 strings, ignoring case
* ## C
* `int strcasecmp(const char *s1, const char *s2);`
* ## ASM
2018-06-14 15:31:36 +00:00
* **In:**
2018-09-06 12:27:37 +00:00
* `>PUSHWI s2`
* `>LDYAI s1`
* `>SYSCALL strcasecmp`
2018-06-14 15:31:36 +00:00
* **Out:**
2018-09-06 12:27:37 +00:00
* CC : match
* CS : no match
2018-01-15 16:51:44 +00:00
* CC, Y,A=0
* CS, Y,A > 0 or < 0
*\--------------------------------------
2018-09-06 12:27:37 +00:00
K.StrCaseCmp clc
>STYA ZPPtr1 s1
>PULLW ZPPtr2 s2
2018-01-15 16:51:44 +00:00
ldy #0
.1 lda (ZPPtr1),y
beq .7
2018-09-06 12:27:37 +00:00
jsr K.StrCaseCmp.toUpper
sta .2+1
2018-01-15 16:51:44 +00:00
lda (ZPPtr2),y
beq .9
2018-09-06 12:27:37 +00:00
jsr K.StrCaseCmp.toUpper
2018-01-15 16:51:44 +00:00
.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
*--------------------------------------
2018-09-06 12:27:37 +00:00
K.StrCaseCmp.toUpper
2018-01-15 16:51:44 +00:00
bcs .9
cmp #'a'
2018-09-06 12:27:37 +00:00
bcc .9
2018-01-15 16:51:44 +00:00
cmp #'z'+1
bcs .1
eor #$20
2018-09-06 12:27:37 +00:00
.1 clc
2018-01-15 16:51:44 +00:00
.9 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.STRING
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM