NEW
  AUTO 3,1
*/--------------------------------------
* # StrLen
* Returns Length of C-String
* ## C
* `int strlen ( char * str);`
* ## ASM
* `>LDYAI str`
* `>SYSCALL strlen`
* ## RETURN VALUE 
* Y,A = String length
*\--------------------------------------
K.StrLen		>STYA .1+1

				ldy #0
				tya

.1				ldx $ffff,y				SELF MODIFIED
				beq .8

				iny
				bne .1

				inc
				inc .1+2
				bra .1

.8				clc
				rts
*/--------------------------------------
* # StrCat
* Concatenate strings
* ## C
* `char * strcat ( char * destination, const char * source );`
* ## ASM
* **In:** 
* `>PUSHWI destination`
* `>PUSHWI source`
* `>SYSCALL strcat`
* ## RETURN VALUE 
* Y,A = destination
*\--------------------------------------
K.StrCat		sec
				.HS 90					BCC
*/--------------------------------------
* # StrCpy
* Copy string
* ## C
* `char * strcpy ( char * destination, const char * source );`
* ## ASM
* **In:** 
* `>PUSHWI destination`
* `>PUSHWI source`
* `>SYSCALL strcpy`
* ## RETURN VALUE 
* Y,A = destination
*\--------------------------------------
K.StrCpy		clc
				phy
				pha
				jsr SHARED.PullP2P1
		
				bcc .2
		
.1				jsr SHARED.GetCP1
				bne .1

.2				ldy #0

.3				lda (ZPPtr2),y
				sta (ZPPtr1),y
				beq K.StrDup.8

				iny
				bne .3

				inc ZPPtr2+1
				inc ZPPtr1+1
				bra .3
*/--------------------------------------
* # StrDup
* Create a new copy of this C-String
* ## C
* `char * strdup ( char * str);`
* ## ASM
* Y,A = Ptr to source C-String
* CC : success 
*  Y,A = PTR to String
*  X = hMem (C-String)
* CS : error
*  A = SYS error code
*\--------------------------------------
K.StrDup		>STYA .1+1
				>STYA .4+1

				lda #0
				tay

.1				ldx $ffff,y
				beq .2

				iny
				bne .1

				inc
				inc .1+2
				bne .1

.2				iny						Add one for ending 0
				bne .3

				inc 

.3				jsr K.GetMem
				bcs K.StrDup.RTS

				>STYA .5+1
				phy
				pha

				ldy #0

.4				lda $ffff,y
.5				sta $ffff,y
				beq K.StrDup.8

				iny
				bne .4

				inc .4+2
				inc .5+2
				bne .4

K.StrDup.8		pla
				ply
				clc
K.StrDup.RTS	rts
*/--------------------------------------
* # StrUpr/StrLwr
* Convert string to UPPERCASE/lowercase
* ## C
* `int strupr ( char * str);`
* `int strlwr ( char * str);`
* ## ASM
* **In:** 
* `>LDYAI str`
* `>SYSCALL strupr`
* `>SYSCALL strlwr`
* ## RETURN VALUE 
* Uppercased/lowercased String in Buffer
* Y,A = str
*\--------------------------------------
K.StrUpr		ldx #0
				.HS 2C					bit abs
K.StrLwr		ldx #2
				>STYA ZPPtr1
				phy
				pha						save Y,A to restore them at exit

				ldy #0

.1				lda (ZPPtr1),y
				beq K.StrDup.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
*--------------------------------------
.9				.AS "azAZ"
*/--------------------------------------
* # StrCmp
* Compare 2 strings
* ## C
* `int strcmp(const char *s1, const char *s2);`
* ## ASM
* **In:** 
* `>PUSHWI s1`
* `>PUSHWI s2`
* `>SYSCALL strcmp`
* ## RETURN VALUE 
* CC : match
* CS : no match
*  CC, Y,A=0
*  CS, Y,A > 0 or < 0
*\--------------------------------------
K.StrCmp		sec
				.HS 90					BCC
*/--------------------------------------
* # StrCaseCmp
* Compare 2 strings, ignoring case
* ## C
* `int strcasecmp(const char *s1, const char *s2);`
* ## ASM
* **In:** 
* `>PUSHWI s1`
* `>PUSHWI s2`
* `>SYSCALL strcasecmp`
* ## RETURN VALUE 
* CC : match
* CS : no match
*  CC, Y,A=0
*  CS, Y,A > 0 or < 0
*\--------------------------------------
K.StrCaseCmp	clc
				jsr SHARED.PullP2P1

				ldy #0

.1				lda (ZPPtr1),y
				beq .7

				jsr .80
				sta .2+1
				lda (ZPPtr2),y
				beq .9

				jsr .80

.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
*--------------------------------------
.80				bcs .99

				cmp #'a'
				bcc .99
				
				cmp #'z'+1
				bcs .81

				eor #$20

.81				clc

.99				rts
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.string
LOAD usr/src/sys/kernel.s
ASM
