mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-28 10:51:14 +00:00
130 lines
5.2 KiB
Plaintext
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
|