C02/include/stringx.a02

130 lines
5.2 KiB
Plaintext

; C02 library stringx.h02 assembly language subroutines
; Requires subroutines and definitions from string.asm
SUBROUTINE STRINGX
;Common Code - Initialize Variables
.INIVAR JSR SETSRC ;Initialize Source String
STY TEMP1 ;Save Destination Pointer
LDX #0 ;Set End of String Flag
RTS ; and Return
;Common Code - Check Next Character in Destination String
.CHKNXT LDY TEMP1
LDA (DSTPTR),Y ;Get Next Character in Destination String
BEQ .POPRET ;If NUL, Return from Calling Routine
LDY #0 ;Initialize Source Pointer
JMP STRCHA ;Search for Character in Source and Return
;Common Code - Exit with Result
.POPRET PLA ;Pop Return Address Off Stack
PLA ; to force exit from Calling Routine
.RETNOF TXA ;Load End of String Flag into Accumulator
BNE .RETURN ;If 0 Then
.RETPOS LDA TEMP1 ; Load Character Position into Accumulator
.RETURN RTS ;Return
;strpbk(&s) - Return position of first character in Destination
; also contained in Source
;Requires: DSTPTR - Pointer to destination string
;Args: X,Y = Pointer to source string
;Sets: SRCPTR = Pointer to source string
; TEMP1 = Position of last character checked
;Uses: TEMP0
;Affects: C,X,Y
;Returns: A = Position of first character that matches
; $FF if no characters matched
STRPBK: JSR .INIVAR ;Initialize Variables
DEX ;Change End of String Flag to $FF
BNE .STRBRK ;Jump into strbrk subroutine
;strbrk(&s) - Return length of Destination with characters
; not contained in Source
;Requires: DSTPTR - Pointer to destination string
;Args: X,Y = Pointer to source string
;Sets: SRCPTR = Pointer to source string
; TEMP1 = Return value
;Uses: TEMP0
;Affects: C,X,Y
;Returns: A = Length of matching string segment
; Z = 1 if no characters matched
; N = 1 if > 127 characters matched
STRCSP: ;Alias to strbrk
STRBRK: JSR .INIVAR ;Initialize Variables
.STRBRK JSR .CHKNXT ;and Search for Character in Source String
BCS .RETPOS ;If Not Found
INC TEMP1 ; Increment Destination Pointer
BPL .STRBRK ; and Loop if < 128
BMI .RETNOF ;and Return Not Found
;strspn(&s) - Return length of Destination with characters
; contained in Source
;Requires: DSTPTR - Pointer to destination string
;Args: X,Y = Pointer to source string
;Sets: SRCPTR = Pointer to source string
; TEMP1 = Return value
;Uses: TEMP0
;Affects: C,X,Y
;Returns: A = Length of matching string segment
; Z = 1 if no characters matched
; N = 1 if > 127 characters matched
STRSPN: JSR .INIVAR ;Initialize Variables
.SPLOOP JSR .CHKNXT ;and Search for Character in Source String
BCC .RETPOS ;If Found
INC TEMP1 ; Increment Destination Pointer
BPL .SPLOOP ; and Loop if < 128
BMI .RETPOS ;Else Return Position
;strtok(c, &s) - Split String by Specified Character
;Args: A = Delimiter, 0 = Set String to Tokenize
; X,Y = Address of Argument String
;Sets: DSTPTR = Address of Argument String
; or Address of System Buffer (A=0)
; SRCPTR = Address of System Buffer Location
; or Address of Argument String (A=0)
; TEMP0 = Delimiter Character
;Populates: SYSBFR - String to Tokenize
;Returns: A = Length of Token
; Y = New Buffer Position, $FF = End of String
; X = End of String Flag, $00 or $FF
STRTOK: ORA #0
BNE .STRTOK ;If Delimiter is NUL
STA SYSBFP ; Initialize System Buffer Position
JMP STRCPB ; Copy String to System Buffer and Return
.STRTOK STA TEMP0 ;Save Delimiter Character
JSR SETDST ;Set Destination to String Address
JSR SETSBP ;Set Source to Current Buffer Position
BPL .STCOPY ;If at End of Buffer
LDA #0
TAY ;Set Destination String to ""
STA (DSTPTR),Y ;and Return String Length 0
RTS
.STCOPY LDY #0 ;Initialize Index
LDX #0 ;Clear End of String Flag
.STLOOP LDA (SRCPTR),Y ;Get Character from Source String
BNE .STSKIP ;If End of String
DEX ; Set End of Buffer Flag
BMI .STDONE ; and Finish Up
.STSKIP CMP TEMP0 ;
BEQ .STDONE ;If Not Delimiter Character
STA (DSTPTR),Y ; Copy to Destination String
INY ; Increment Index
CPY #SYSBFL ; If Less Than Buffer Size
BCC .STLOOP ; Loop
DEX ;Else Set End of Buffer Flag
.STDONE LDA #0 ;Terminate String
STA (DSTPTR),Y ;
.STRTN STY TEMP0 ;Save String Length
INY ;Increment Past Delimiter
TYA ; and Add to Buffer Position
CLC
ADC SYSBFP
STA SYSBFP ;Save New Buffer Position
CPX #0 ;If End of Buffer Flag is Set
BPL .STRTRN
STX SYSBFP ; Set Buffer Position to 255
.STRTRN LDA TEMP0 ;Return String Length
RTS
ENDSUBROUTINE