mirror of
https://github.com/RevCurtisP/C02.git
synced 2025-02-19 19:31:04 +00:00
Updated and cleaned up module string
This commit is contained in:
parent
92f1611315
commit
b1eded3399
@ -1,4 +1,4 @@
|
|||||||
Common String Manipulation Functions for C02
|
Common String Handling Functions for C02
|
||||||
|
|
||||||
Strings are zero-terminated arrays of type char with a maximum length
|
Strings are zero-terminated arrays of type char with a maximum length
|
||||||
of 128 characters.
|
of 128 characters.
|
||||||
@ -14,7 +14,8 @@ Due to the limitations of parameter passing in C02, the argument lists of
|
|||||||
most of these functions do not match those in standard C and C++.
|
most of these functions do not match those in standard C and C++.
|
||||||
|
|
||||||
For functions that operate on two string, one of the strings is specified
|
For functions that operate on two string, one of the strings is specified
|
||||||
using the setdst() function from the stddef module.
|
using the setdst() function from module stddef. Unless otherwise noted,
|
||||||
|
none of the functions change dstptr.
|
||||||
|
|
||||||
Usage: at the beginning of the program use the directives
|
Usage: at the beginning of the program use the directives
|
||||||
|
|
||||||
@ -25,29 +26,26 @@ The following functions are defined:
|
|||||||
|
|
||||||
n = strlen(s); Returns length of string.
|
n = strlen(s); Returns length of string.
|
||||||
|
|
||||||
Note: Leaves address of s in srcptr.
|
Note: Sets srcptr to &s.
|
||||||
|
|
||||||
p = strchr(c, s); Searches string s for character c.
|
n = strchr(c, s); Searches string s for character c.
|
||||||
|
|
||||||
Returns position of first occurance of character
|
Returns position of first occurance of character
|
||||||
in string, or 255 if character was not found.
|
in string, or 255 if character was not found.
|
||||||
|
|
||||||
Note: Leaves address of s in srcptr.
|
Note: Sets srcptr to &s.
|
||||||
|
|
||||||
p = strrch(c, s); Searches end of string s for character c.
|
n = strrch(c, s); Returns position of last occurance of character
|
||||||
|
|
||||||
Returns position of last occurance of character
|
|
||||||
in string, or 255 if character was not found.
|
in string, or 255 if character was not found.
|
||||||
|
|
||||||
Note: Leaves address of s in srcptr.
|
Note: Sets srcptr to &s.
|
||||||
|
|
||||||
n = strcat(s); Concatenates source string s onto the end of
|
n = strcat(s); Concatenates source string s onto the end of
|
||||||
destination string set by prior setdst() call.
|
destination string set by prior setdst() call.
|
||||||
|
|
||||||
Returns total length of concatenated string.
|
Returns total length of concatenated string.
|
||||||
|
|
||||||
Note: leaves the address of destination string
|
Note: Sets srcptr to &s.
|
||||||
in dstptr.
|
|
||||||
|
|
||||||
c = strcmp(s); Compares source string s against destination
|
c = strcmp(s); Compares source string s against destination
|
||||||
string set by prior setdst() call.
|
string set by prior setdst() call.
|
||||||
@ -58,63 +56,36 @@ The following functions are defined:
|
|||||||
These results can be evaluated using the C02
|
These results can be evaluated using the C02
|
||||||
unary comparator ! or the test-operators :+ or :-.
|
unary comparator ! or the test-operators :+ or :-.
|
||||||
|
|
||||||
Note: leaves the address of s in srcptr and
|
Note: Sets srcptr to &s.
|
||||||
the address of the destination string in dstptr.
|
|
||||||
|
|
||||||
n = strcpy(s); Copies wource string s into destination string set
|
n = strcpy(s); Copies wource string s into destination string set
|
||||||
by prior setdst() call, replacing previous contents.
|
by prior setdst() call, replacing previous contents.
|
||||||
|
|
||||||
Returns number of characters copied.
|
Returns number of characters copied.
|
||||||
|
|
||||||
Note: leaves the address of s in srcptr and
|
|
||||||
the address of the destination string in dstptr.
|
|
||||||
|
|
||||||
To copy the first n characters from string s to
|
To copy the first n characters from string s to
|
||||||
string d, the following code can be used:
|
string d, the following code can be used:
|
||||||
|
|
||||||
setdst(&d); strcpy(s); s[n]=0;
|
setdst(&d); strcpy(s); s[n]=0;
|
||||||
|
|
||||||
p = strstr(s); Searches for destination string s in source string
|
Note: Sets srcptr to &s.
|
||||||
set by prior setdst() call.
|
|
||||||
|
n = strstr(s); Searches for string s in destination string set.
|
||||||
|
|
||||||
Returns position of source string in destination
|
Returns position of source string in destination
|
||||||
string, or 255 if character was not found.
|
string, or 255 if character was not found.
|
||||||
|
|
||||||
Note: calls strcmp(), leaving the address of s
|
Note: calls strcmp(), leaving srcptr pointing to
|
||||||
in srcptr and the position of the source string in
|
the matched string in the destination string
|
||||||
the destination string (or the end of the destination
|
(or the end if not found).
|
||||||
string if the source string was not found) in dstptr.
|
|
||||||
|
|
||||||
These functions are not part of the standard C and C++ string libraries.
|
These functions are not part of the standard C and C++ string libraries.
|
||||||
They are included because they are more efficient than equivalent C02 code.
|
They are included because they are more efficient than equivalent C02 code.
|
||||||
|
|
||||||
p = strapd(c, s); Append character c to string s.
|
|
||||||
|
|
||||||
Returns length of appended string.
|
|
||||||
|
|
||||||
If the string length exceeds 127 prior to the
|
|
||||||
append, no action is taken and the existing
|
|
||||||
length is returned.
|
|
||||||
|
|
||||||
Note: calls strlen(), leaving the address of
|
|
||||||
s in srcptr.
|
|
||||||
|
|
||||||
strppd(c, s); Prepend character c to string s.
|
|
||||||
|
|
||||||
Returns length of prepended string.
|
|
||||||
|
|
||||||
If the string length exceeds 127 prior to the
|
|
||||||
prepend, no action is taken and the existing
|
|
||||||
length is returned.
|
|
||||||
|
|
||||||
Note: calls strlen(), leaving the address of
|
|
||||||
s in srcptr.
|
|
||||||
|
|
||||||
strcpb(s) Copies string s to the system buffer (sysbfr).
|
strcpb(s) Copies string s to the system buffer (sysbfr).
|
||||||
|
|
||||||
Note: calls strcpy(), leaving the address of s
|
Note: sets srcptr to &s and dstptr to &sysbfr,
|
||||||
in srcptr and the address of the system buffer
|
then calls strcpy().
|
||||||
in dstptr.
|
|
||||||
|
|
||||||
n = strcut(n, s); Copies from source string s, starting at position n,
|
n = strcut(n, s); Copies from source string s, starting at position n,
|
||||||
into destination string set by prior setdst() call,
|
into destination string set by prior setdst() call,
|
||||||
@ -128,9 +99,8 @@ They are included because they are more efficient than equivalent C02 code.
|
|||||||
|
|
||||||
setdst(&d); strcut(s, n); s[i] = 0;
|
setdst(&d); strcut(s, n); s[i] = 0;
|
||||||
|
|
||||||
Note: calls routine strcat(), leaving the address
|
Note: Sets srcptr to the address of position n
|
||||||
of the destination string in dstptr and address of
|
in s and calls strcpy().
|
||||||
position n in the source string in srcptr.
|
|
||||||
|
|
||||||
Note: This library expects the following functions to be defined
|
Note: This library expects the following functions to be defined
|
||||||
|
|
||||||
|
@ -1,75 +1,58 @@
|
|||||||
; C02 library string.h02 assembly language subroutines
|
; C02 library string.h02 assembly language subroutines
|
||||||
; Requires external routines SETSRC and SETDST
|
; Requires external routines SETSRC, SETDSB, and SETDST
|
||||||
; Requires the following RAM locations be defined
|
; Requires the following RAM locations be defined
|
||||||
; external zero page byte pairs SRCPTR and DSTPTR
|
; external zero page words SRCPTR and DSTPTR, bytes
|
||||||
; and external bytes TEMP0 and TEMP1
|
; TEMP0 and TEMP3, and block SYSBFR.
|
||||||
|
|
||||||
SUBROUTINE STRING
|
SUBROUTINE STRING
|
||||||
|
|
||||||
;strapd(c, s) - Append charecter c to string s
|
|
||||||
;Args: A = Character to be appended
|
|
||||||
; X,Y = Pointer to string
|
|
||||||
;Affects N,Z
|
|
||||||
;Returns A,Y = New String Length
|
|
||||||
STRAPD: STA TEMP0 ;Save Character to Append
|
|
||||||
JSR STRLEN ;Get Length of String
|
|
||||||
BMI .RETFLS ;Return 255 if > 127
|
|
||||||
LDA TEMP0 ;Restore Character to Append
|
|
||||||
.APDLOP STA (SRCPTR),Y ;Store at End of String
|
|
||||||
BEQ .LENEND ;Exit if NUL
|
|
||||||
INY ;Increment Past New Character
|
|
||||||
LDA #0 ;Set Character to NUL
|
|
||||||
BEQ .APDLOP ;and Append to String
|
|
||||||
|
|
||||||
;strppd(c, s) - Prepend Charecter to String
|
|
||||||
;Args: A = Character to be appended
|
|
||||||
; X,Y = Pointer to string
|
|
||||||
;Sets: N,Z
|
|
||||||
;Returns A = Insterted Character
|
|
||||||
STRPPD: STA TEMP0 ;Save Character to Append
|
|
||||||
JSR STRLEN ;Get Length of String
|
|
||||||
BMI .RETFLS ;Return 255 if > 127
|
|
||||||
INY ;Bump up string length
|
|
||||||
TYA ;Push string length onto stack
|
|
||||||
PHA
|
|
||||||
.PPDLOP DEY ;Copy Preceding Chacter
|
|
||||||
LDA (SRCPTR),Y
|
|
||||||
INY ;into Currebt Position
|
|
||||||
STA (SRCPTR),Y
|
|
||||||
DEY ;Move to Preceding Position
|
|
||||||
BNE .PPDLOP ;and Loop
|
|
||||||
LDA TEMP0 ;Retrieve Character
|
|
||||||
STA (SRCPTR),Y ;and Store in Position 0
|
|
||||||
PLA ;Retrieve new string length
|
|
||||||
BEQ .RETORA ;Set Flags and Return`
|
|
||||||
|
|
||||||
;strcmp(&s) - Compare String (to Destination String)
|
;strcmp(&s) - Compare String (to Destination String)
|
||||||
;Requires: DSTPTR - Pointer to destination string
|
;Requires: DSTPTR - Pointer to destination string
|
||||||
;Args: X,Y = Pointer to source string
|
;Args: X,Y = Pointer to source string
|
||||||
;Sets: SRCPTR = Pointer to string
|
;Sets: SRCPTR = Pointer to string
|
||||||
;Affects N,Z
|
; N based on return value of A
|
||||||
;Returns A=$01 and C=1 if Destination > Source
|
;Returns A=$01 and C=1 if Destination > Source
|
||||||
; A=$00 and Z=1, C=1 if Destination = Source
|
; A=$00 and Z=1, C=1 if Destination = Source
|
||||||
; A=$FF and C=0 if Destination < Source
|
; A=$FF and C=0 if Destination < Source
|
||||||
; Y=Position of first character that differs
|
; Y=Position of first character that differs
|
||||||
STRCMP: JSR SETSRC ;Initialize Source String
|
STRCMP: JSR SETSRC ;Initialize Source String
|
||||||
.CMPLOP LDA (DSTPTR),Y ;Load Destination Character
|
STRCML LDA (DSTPTR),Y ;Load Destination Character
|
||||||
CMP (SRCPTR),Y ;Compare Against Source Character
|
CMP (SRCPTR),Y ;Compare Against Source Character
|
||||||
BNE .CMPEND ;If Equal
|
BNE .CMPEND ;If Equal
|
||||||
ORA (SRCPTR),Y ; OR with Source Character
|
ORA (SRCPTR),Y ; OR with Source Character
|
||||||
BEQ .RETURN ; If Both are 0, Return 0
|
BEQ .RETURN ; If Both are 0, Return 0
|
||||||
INY ; Increment Offset
|
INY ; Increment Offset
|
||||||
BPL .CMPLOP ; and Loop if < 128
|
BPL STRCML ; and Loop if < 128
|
||||||
.CMPEND BCC .RETFLS ;If Source < Destination, Return $FF & Carry Clear
|
.CMPEND BCC .RETFLS ;If Source < Destination, Return $FF & Carry Clear
|
||||||
LDA #$01 ;Else Return 1 and Carry Set
|
LDA #$01 ;Else Return 1 and Carry Set
|
||||||
.RETURN RTS
|
.RETURN RTS
|
||||||
|
|
||||||
|
;strcnt(a,&s) - Count Occurrences of c in s
|
||||||
|
;Args: A - Character to count
|
||||||
|
; X,Y - Pointer to string
|
||||||
|
;Sets: SRCPTR = Pointer to source string
|
||||||
|
; N,Z based on return value of A
|
||||||
|
;Returns: A,X = Number of occurrences
|
||||||
|
; Y = Length of string
|
||||||
|
STRCNT: STA TEMP0 ;Save Character
|
||||||
|
JSR SETSRC ;Setup Source Pointer
|
||||||
|
LDX #0 ;Initialize Character Count
|
||||||
|
.CNTLOP LDA (SRCPTR),Y ;Get Next Character
|
||||||
|
BEQ .CDONE ;If <> NUL
|
||||||
|
CMP TEMP0 ;
|
||||||
|
BNE .CNTSKP ; If Character Match
|
||||||
|
INX ; Inrement Count
|
||||||
|
.CNTSKP INY ; Increment Index
|
||||||
|
BPL .CNTLOP ; and Loop if < 128
|
||||||
|
.CDONE TXA ;ReturnCount
|
||||||
|
RTS ;and Return
|
||||||
|
|
||||||
;strchr(c, &s) - Find First Occurance of Character in String
|
;strchr(c, &s) - Find First Occurance of Character in String
|
||||||
;Args: A = Character to look for
|
;Args: A = Character to look for
|
||||||
; X,Y = Pointer to string to search in
|
; X,Y = Pointer to string to search in
|
||||||
;Sets: SRCPTR = Pointer to string
|
;Sets: SRCPTR = Pointer to string
|
||||||
; TEMP3 = Character being searched for
|
; TEMP3 = Character being searched for
|
||||||
;Affects: N,Z
|
; N,Z based on return value of A
|
||||||
;Returns: A = Position in string, C=1 if found
|
;Returns: A = Position in string, C=1 if found
|
||||||
; A = $FF, C=0 if not found
|
; A = $FF, C=0 if not found
|
||||||
; Y = Position of last character scanned
|
; Y = Position of last character scanned
|
||||||
@ -78,32 +61,32 @@ STRCHA: STA TEMP3 ;Save Search Character (alternate entry point)
|
|||||||
.CHRLOP LDA (SRCPTR),Y ;Get Next Character
|
.CHRLOP LDA (SRCPTR),Y ;Get Next Character
|
||||||
BEQ .CLCFLS ;If NUL, Return $FF and Carry Clear
|
BEQ .CLCFLS ;If NUL, Return $FF and Carry Clear
|
||||||
CMP TEMP3 ;Compare Character
|
CMP TEMP3 ;Compare Character
|
||||||
BEQ .LENEND ;If Found, Return Index
|
BEQ .LENFIN ;If Found, Return Index
|
||||||
INY ;Increment Counter and Loop if < 128
|
INY ;Increment Counter and Loop if < 128
|
||||||
BPL .CHRLOP ;Else Return $FF and Carry Clear
|
BPL .CHRLOP ;Else Return $FF and Carry Clear
|
||||||
.CLCFLS CLC ;Clear Carry
|
.CLCFLS CLC ;Clear Carry
|
||||||
.RETFLS LDA #$FF ;Load -1 into Accumulater
|
.RETFLS LDA #$FF ;Load -1 into Accumulater
|
||||||
RTS ;and Return
|
BNE .RETURN ;and Return
|
||||||
|
|
||||||
;strapd(c, &s) - Append Character to String
|
|
||||||
;Args: A = Character to Append
|
|
||||||
; X,Y = Pointer to String
|
|
||||||
;Sets: SRCPTR, SRCPTR+1 - Pointer to String
|
|
||||||
;strlen(&s) - Return Length of String
|
;strlen(&s) - Return Length of String
|
||||||
;Args: X,Y - Pointer to string
|
;Args: X,Y - Pointer to string
|
||||||
;Sets: SRCPTR = Pointer to source string
|
;Sets: SRCPTR = Pointer to source string
|
||||||
|
; N,Z based on return value of A
|
||||||
;Returns: A,Y = Length of string
|
;Returns: A,Y = Length of string
|
||||||
; N,Z based on A
|
|
||||||
STRLEN: JSR SETSRC ;Initialize Source String
|
STRLEN: JSR SETSRC ;Initialize Source String
|
||||||
.LENLOP LDA (SRCPTR),Y ;Get Next Character
|
STRLEA: LDA (SRCPTR),Y ;Get Next Character
|
||||||
BEQ .LENEND ;If <> NUL
|
BEQ .LENFIN ;If <> NUL
|
||||||
INY ; Increment Index
|
INY ; Increment Index
|
||||||
BPL .LENLOP ; and Loop if < 128
|
BPL STRLEA ; and Loop if < 128
|
||||||
.LENEND TYA ;Transfer Index to Accumulator
|
.LENFIN TYA ;Transfer Index to Accumulator
|
||||||
.RETORA ORA #0 ;Set N and Z flags
|
|
||||||
RTS ;and Return
|
RTS ;and Return
|
||||||
|
|
||||||
;strcpb(&s) - Copy String to System Buffer
|
;strcpb(&s) - Copy String to System Buffer
|
||||||
|
;Args: X,Y = Pointer to source string
|
||||||
|
;Sets: SRCPTR = Pointer to source string
|
||||||
|
; DSTPTR = Address of System Buffer
|
||||||
|
; N,Z based on return value of A
|
||||||
|
;Returns: A,Y = Length of copied string
|
||||||
STRCPB: JSR SETSRC ;Set Source Pointer to String Address
|
STRCPB: JSR SETSRC ;Set Source Pointer to String Address
|
||||||
JSR SETDSB ;Set Destination Pointer to System Buffer
|
JSR SETDSB ;Set Destination Pointer to System Buffer
|
||||||
BVC STRCPA ;Execute String Copy
|
BVC STRCPA ;Execute String Copy
|
||||||
@ -113,14 +96,15 @@ STRCPB: JSR SETSRC ;Set Source Pointer to String Address
|
|||||||
;Args: X,Y = Pointer to source string
|
;Args: X,Y = Pointer to source string
|
||||||
;Sets: SRCPTR = Pointer to source string
|
;Sets: SRCPTR = Pointer to source string
|
||||||
; TEMP3 = Length of source prior to concatenation
|
; TEMP3 = Length of source prior to concatenation
|
||||||
;Affects: C,N,Z
|
; N,Z based on return value of A
|
||||||
|
;Affects: C
|
||||||
;Returns: A,Y = Total length of concatenated string
|
;Returns: A,Y = Total length of concatenated string
|
||||||
STRCAT: JSR SETSRC ;Initialize Source String
|
STRCAT: JSR SETSRC ;Initialize Source String
|
||||||
.CATLOP LDA (DSTPTR),Y ;Find end of Destination String
|
.CATLOP LDA (DSTPTR),Y ;Find end of Destination String
|
||||||
BEQ .CATEND ;
|
BEQ .CATFIN ;
|
||||||
INY ;
|
INY ;
|
||||||
BPL .CATLOP ;
|
BPL .CATLOP ;
|
||||||
.CATEND STY TEMP3 ;Subtract Destination String Length
|
.CATFIN STY TEMP3 ;Subtract Destination String Length
|
||||||
LDA SRCPTR ; from Source String Pointer
|
LDA SRCPTR ; from Source String Pointer
|
||||||
SEC
|
SEC
|
||||||
SBC TEMP3
|
SBC TEMP3
|
||||||
@ -134,25 +118,25 @@ STRCAT: JSR SETSRC ;Initialize Source String
|
|||||||
;Requires: DSTPTR - Pointer to destination string
|
;Requires: DSTPTR - Pointer to destination string
|
||||||
;Args: X,Y = Pointer to source string
|
;Args: X,Y = Pointer to source string
|
||||||
;Sets: SRCPTR = Pointer to source string
|
;Sets: SRCPTR = Pointer to source string
|
||||||
;Affects: N,Z
|
; N,Z based on return value of A
|
||||||
;Returns: A,Y = Number of characters copied
|
;Returns: A,Y = Number of characters copied
|
||||||
STRCPA: LDY #0 ;Alternate entry point
|
STRCPA: LDY #0 ;Alternate entry point
|
||||||
BEQ .CPYLOP ;for when Source already set
|
BEQ .CPYLOP ;for when Source already set
|
||||||
STRCPY: JSR SETSRC ;Initialize Source String
|
STRCPY: JSR SETSRC ;Initialize Source String
|
||||||
.CPYLOP LDA (SRCPTR),Y ;Get Character from Source String
|
.CPYLOP LDA (SRCPTR),Y ;Get Character from Source String
|
||||||
STA (DSTPTR),Y ;Copy to Destination String
|
STA (DSTPTR),Y ;Copy to Destination String
|
||||||
BEQ .CPYEND ;If <> NUL
|
BEQ .CPYFIN ;If <> NUL
|
||||||
INY ; Increment Index
|
INY ; Increment Index
|
||||||
BPL .CPYLOP ; and Loop if < 128
|
BPL .CPYLOP ; and Loop if < 128
|
||||||
.CPYEND TYA ;Transfer Index to Accumulator
|
.CPYFIN TYA ;Transfer Index to Accumulator
|
||||||
RTS ;and Return
|
RTS ;and Return
|
||||||
|
|
||||||
;strcut(n, &s) - Copy from Position n to End of Source (into Destination)
|
;strcut(n, &s) - Copy from Position n to End of Source
|
||||||
;Requires: DSTPTR - Pointer to destination string
|
;Requires: DSTPTR - Pointer to destination string
|
||||||
;Args: A = Starting position in start string
|
;Args: A = Starting position in start string
|
||||||
; X,Y = Pointer to source string
|
; X,Y = Pointer to source string
|
||||||
;Sets: SRCPTR = Pointer to specified position in source string
|
;Sets: SRCPTR = Pointer to specified position in source string
|
||||||
;Affects: N,Z
|
; N,Z based on return value of A
|
||||||
;Returns: A,Y = Length of copied string
|
;Returns: A,Y = Length of copied string
|
||||||
STRCUT: JSR SETSRC ;Initialize Source String
|
STRCUT: JSR SETSRC ;Initialize Source String
|
||||||
CLC
|
CLC
|
||||||
@ -161,15 +145,15 @@ STRCUT: JSR SETSRC ;Initialize Source String
|
|||||||
BCC .CPYLOP
|
BCC .CPYLOP
|
||||||
INC SRCPTR+1
|
INC SRCPTR+1
|
||||||
JMP .CPYLOP ;and Jump Into String Copy Loop
|
JMP .CPYLOP ;and Jump Into String Copy Loop
|
||||||
|
|
||||||
;strstr(&s) - Search for String (in Destination String)
|
;strstr(&s) - Search for String (in Destination String)
|
||||||
;Requires: DSTPTR - Pointer to destination string
|
;Requires: DSTPTR - Pointer to destination string
|
||||||
;Args: X,Y = Pointer to search string
|
;Args: X,Y = Pointer to search string
|
||||||
;Sets: DSTPTR = Pointer to position in source string
|
;Sets: DSTPTR = Pointer to position in source string
|
||||||
; End of string if not found
|
; End of string if not found
|
||||||
; SRCPTR = Pointer to source string
|
; SRCPTR = Pointer to source string
|
||||||
; TEMP3 = Last position checked in destination string
|
; TEMP3 = Last position checked in destination string
|
||||||
;Affects: N,Z
|
; N,Z based on return value of A
|
||||||
;Returns: A = Position, C=1 if found
|
;Returns: A = Position, C=1 if found
|
||||||
; A = $FF, C=0 if not found
|
; A = $FF, C=0 if not found
|
||||||
; Y = Last position checked in source string
|
; Y = Last position checked in source string
|
||||||
@ -178,11 +162,11 @@ STRSTR: JSR SETSRC ;Initialize Source String
|
|||||||
.STRLOP LDY #$00; ;Initialize Compare Offset
|
.STRLOP LDY #$00; ;Initialize Compare Offset
|
||||||
LDA (DSTPTR),Y ;Get Start Character in Destination
|
LDA (DSTPTR),Y ;Get Start Character in Destination
|
||||||
BEQ .CLCFLS ;If NUL return $FF and Carry Clear
|
BEQ .CLCFLS ;If NUL return $FF and Carry Clear
|
||||||
JSR .CMPLOP ;Jump into Compare Loop
|
JSR STRCML ;Jump into Compare Loop
|
||||||
BEQ .STREND ;If Not Equal
|
BEQ .STRFIN ;If Not Equal
|
||||||
BMI .STRNXT ; If Source is Greater
|
BMI .STRNXT ; If Source is Greater
|
||||||
LDA (SRCPTR),Y ; If at End of Source String
|
LDA (SRCPTR),Y ; If at End of Source String
|
||||||
BEQ .STREND ; Return Current Position
|
BEQ .STRFIN ; Return Current Position
|
||||||
.STRNXT INC TEMP3 ; Else Increment Position
|
.STRNXT INC TEMP3 ; Else Increment Position
|
||||||
BMI .CLCFLS ; If > 127 return $FF and Carry Clear
|
BMI .CLCFLS ; If > 127 return $FF and Carry Clear
|
||||||
INC DSTPTR ; Increment Source Pointer
|
INC DSTPTR ; Increment Source Pointer
|
||||||
@ -190,31 +174,32 @@ STRSTR: JSR SETSRC ;Initialize Source String
|
|||||||
INC DSTPTR+1 ; If not End of Memory
|
INC DSTPTR+1 ; If not End of Memory
|
||||||
BNE .STRLOP ; Loop
|
BNE .STRLOP ; Loop
|
||||||
BEQ .CLCFLS ; Else return $FF and Carry Clear
|
BEQ .CLCFLS ; Else return $FF and Carry Clear
|
||||||
.STREND SEC ;Else Set Carry
|
.STRFIN SEC ;Else Set Carry
|
||||||
LDA TEMP3 ; Load Position
|
LDA TEMP3 ; Load Position
|
||||||
RTS ; and Return
|
RTS ; and Return
|
||||||
|
|
||||||
;strrch(c, &s) - Find Last Occurance Character in String
|
;strrch(c, &s) - Find Last Occurrence of Character in String
|
||||||
;Args: A = Character to look for
|
;Args: A = Character to look for
|
||||||
; X,Y = Pointer to string to search in
|
; X,Y = Pointer to string to search in
|
||||||
;Sets: SRCPTR = Pointer to string
|
;Sets: SRCPTR = Pointer to string
|
||||||
; TEMP3 = Character being searched for
|
; TEMP3 = Character being searched for
|
||||||
;Affects: Y,C,N,Z
|
; N,Z based on return value of A
|
||||||
;Returns: A,X = Position of last occurance in string
|
;Affects: Y,C
|
||||||
|
;Returns: A,X = Position of last occurrence in string
|
||||||
; $FF if not found
|
; $FF if not found
|
||||||
; Y = Length of String
|
; Y = Length of String
|
||||||
STRRCH: JSR SETSRC ;Initialize Source String
|
STRRCH: JSR SETSRC ;Initialize Source String
|
||||||
STA TEMP3; ;Save Search Character (alternate entry point)
|
STA TEMP3 ;Save Search Character (alternate entry point)
|
||||||
LDX #$FF ;Initialize Position
|
LDX #$FF ;Initialize Position
|
||||||
.RCHLOP LDA (SRCPTR),Y ;Get Next Character
|
.RCHLOP LDA (SRCPTR),Y ;Get Next Character
|
||||||
BEQ .RCHEND ;If NUL, Exit with Position
|
BEQ .RCHFIN ;If NUL, Exit with Position
|
||||||
CMP TEMP3 ;Compare Character
|
CMP TEMP3 ;Compare Character
|
||||||
BNE .RCHNXT ;If Found
|
BNE .RCHNXT ;If Found
|
||||||
TYA ; Store Counter
|
TYA ; Store Counter
|
||||||
TAX
|
TAX
|
||||||
.RCHNXT INY ;Increment Counter
|
.RCHNXT INY ;Increment Counter
|
||||||
BPL .RCHLOP ; and Loop if < 128
|
BPL .RCHLOP ; and Loop if < 128
|
||||||
.RCHEND TXA ;Copy Position to Accumulater
|
.RCHFIN TXA ;Copy Position to Accumulater
|
||||||
RTS ; and Return
|
RTS ; and Return
|
||||||
|
|
||||||
ENDSUBROUTINE
|
ENDSUBROUTINE
|
||||||
|
@ -2,55 +2,69 @@
|
|||||||
* string - String Handling Routines for C02 *
|
* string - String Handling Routines for C02 *
|
||||||
*********************************************/
|
*********************************************/
|
||||||
|
|
||||||
/* Find Character in String *
|
|
||||||
* Args: c - Character to find *
|
|
||||||
* &s - String to search *
|
|
||||||
* Returns: c in s *
|
|
||||||
* $FF if not found */
|
|
||||||
char strchr();
|
|
||||||
|
|
||||||
/* Get Length of String *
|
|
||||||
* Args: s - string *
|
|
||||||
* Returns: Length of string */
|
|
||||||
char strlen();
|
|
||||||
|
|
||||||
/* Sets Destination String for *
|
|
||||||
* functions that use two strings *
|
|
||||||
* Args: &s - Destination string */
|
|
||||||
void strdst();
|
|
||||||
|
|
||||||
/* Concatenate Destination String to Source String *
|
/* Concatenate Destination String to Source String *
|
||||||
* Args: &s - Source string *
|
* Args: &s - Source string *
|
||||||
* Sets: Destination string specified by strdst() *
|
* Sets: Destination string specified by setdst() *
|
||||||
* Returns: Total Length of concatenated string */
|
* Returns: Total Length of concatenated string */
|
||||||
char strcat();
|
char strcat();
|
||||||
|
|
||||||
|
/* Find Character in String *
|
||||||
|
* Args: c - Character to find *
|
||||||
|
* s - String to search *
|
||||||
|
* Returns: Position in s *
|
||||||
|
* $FF if not found */
|
||||||
|
char strchr();
|
||||||
|
|
||||||
/* Compare Destination String against Source String *
|
/* Compare Destination String against Source String *
|
||||||
* Args: &s - Source string *
|
* Args: &s - Source string *
|
||||||
* Uses: Destination string specified by strdst() *
|
* Uses: Destination string specified by setdst() *
|
||||||
* Returns: Result of comparison *
|
* Returns: -1 = Destination < Source *
|
||||||
* -1 = Destination < Source *
|
|
||||||
* 0 = Destination = Source *
|
* 0 = Destination = Source *
|
||||||
* 1 = Destination > Source */
|
* 1 = Destination > Source */
|
||||||
char strcmp();
|
char strcmp();
|
||||||
|
|
||||||
|
/* Count Character in String *
|
||||||
|
* Args: c - Character to count *
|
||||||
|
* s - String to search *
|
||||||
|
* Returns: Occurences */
|
||||||
|
char strcnt();
|
||||||
|
|
||||||
/* Copy Source String to Destination String *
|
/* Copy Source String to Destination String *
|
||||||
* Args: &s - Source string *
|
* Args: &s - Source string *
|
||||||
* Sets: Destination string specified by strdst() *
|
* Sets: Destination string specified by setdst() *
|
||||||
* Returns: Number of characters copied */
|
* Returns: Number of characters copied */
|
||||||
char strcpy();
|
char strcpy();
|
||||||
|
|
||||||
/* Copy Part of Source String to Destination String *
|
/* Copy Part of Source String to Destination String *
|
||||||
* Args: n - Starting point in source string *
|
* Args: n - Starting point in source string *
|
||||||
* &s - Source string *
|
* &s - Source string *
|
||||||
* Sets: Destination string specified by strdst() *
|
* Uses: Destination string specified by setdst() *
|
||||||
* Returns: Number of characters copied */
|
* Returns: Number of characters copied */
|
||||||
char strcut();
|
char strcut();
|
||||||
|
|
||||||
|
/* Read Next Entry from String List *
|
||||||
|
* Args: &d - Destination string *
|
||||||
|
* Returns: char n - Number of characters in entry *
|
||||||
|
* int p - New value or srcptr */
|
||||||
|
char strget();
|
||||||
|
|
||||||
|
/* Get Length of String *
|
||||||
|
* Args: s - string *
|
||||||
|
* Returns: Length of string */
|
||||||
|
char strlen();
|
||||||
|
|
||||||
|
/* Find Last of Character in String *
|
||||||
|
* Args: c - Character to find *
|
||||||
|
* s - String to search *
|
||||||
|
* Returns: c in s *
|
||||||
|
* $FF if not found */
|
||||||
|
char strrch();
|
||||||
|
|
||||||
|
char strstr();
|
||||||
/* Find String in String *
|
/* Find String in String *
|
||||||
* Args: &s - String to Find *
|
* Args: &s - String to Find *
|
||||||
* Uses: String to search specified by strdst() *
|
* Uses: String to search specified by setdst() *
|
||||||
* Sets: strdst() pointer to position of string *
|
* Sets: setdst() pointer to position of string *
|
||||||
* End of string if not found *
|
* End of string if not found *
|
||||||
* Returns: Position of s in Destination string *
|
* Returns: Position of s in Destination string *
|
||||||
* $FF if not found */
|
* $FF if not found */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user