mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-28 10:51:14 +00:00
115 lines
3.9 KiB
Plaintext
115 lines
3.9 KiB
Plaintext
; C02 module stringm.h02 assembly language subroutines
|
|
; Requires external routines SETSRC, TOLOWR, and TOUPPR
|
|
; Requires the following RAM locations be defined
|
|
; external zero page word SRCPTR
|
|
; and external bytes TEMP0 and TEMP1
|
|
|
|
SUBROUTINE STRINGM
|
|
|
|
;straps(c, s) - Append space to string s
|
|
;Args: A = Character to be appended
|
|
; X,Y = Pointer to string
|
|
;Affects N,Z
|
|
;Returns A,Y = New String Length
|
|
STRAPS: LDA ' ' ;Set Append Character to Space
|
|
|
|
;strapd(c, s) - Append character 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 .ERROR ;Return 255 if > 127
|
|
LDA TEMP0 ;Restore Character to Append
|
|
.APDLOP STA (SRCPTR),Y ;Store at End of String
|
|
BEQ .RETLEN ;Exit if NUL
|
|
INY ;Increment Past New Character
|
|
LDA #0 ;Terminate String
|
|
STA (SRCPTR),Y
|
|
BEQ .RETLEN ;and Append to String
|
|
|
|
;strpps(c, s) - Prepend space to string s
|
|
;Args: A = Character to be appended
|
|
; X,Y = Pointer to string
|
|
;Affects N,Z
|
|
;Returns A,Y = New String Length
|
|
STRPPS: LDA ' ' ;Set Append Character to Space
|
|
|
|
;strppd(c, s) - Prepend Character to String
|
|
;Args: A = Character to be appended
|
|
; X,Y = Pointer to string
|
|
;Sets: N,Z
|
|
;Returns A = New String Length
|
|
STRPPD: STA TEMP0 ;Save Character to Append
|
|
JSR STRLEN ;Get Length of String
|
|
BMI .ERROR ;Return 255 if > 127
|
|
INY ;Bump up string length
|
|
TYA ;Push string length onto stack
|
|
PHA
|
|
.PPDLOP DEY ;Copy Preceding Character
|
|
LDA (SRCPTR),Y
|
|
INY ;into Current 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
|
|
RTS
|
|
.ERROR LDA #$FF ;Return Error Code FALSE
|
|
RTS
|
|
|
|
;STRPAD(n, &s) - Pad or Truncate String
|
|
;Args: A - New Length of String
|
|
; X,Y - Pointer to string
|
|
;Sets: SRCPTR = Pointer to source string
|
|
;Returns: A,Y = Length of string
|
|
; N,Z based on A
|
|
STRPAD: STA TEMP0 ;Save New Length
|
|
JSR STRLEN ;Get Current Length of String
|
|
CMP TEMP0
|
|
BCS .PDONE ;If Shorter than New Length
|
|
LDA #' '
|
|
.PLOOP STA (SRCPTR),Y ; Fill with Spaces
|
|
INY
|
|
BMI .PDONE ; Until 128 or
|
|
CPY TEMP0 ; New Length is Reached
|
|
BNE .PLOOP
|
|
.PDONE LDA #0 ;Terminate String
|
|
STA (SRCPTR),Y
|
|
TYA ;and Return Length
|
|
RTS
|
|
|
|
;STRLWR(&s) - Convert String to Lower Case
|
|
;Args: X,Y - Pointer to string
|
|
;Sets: SRCPTR = Pointer to source string
|
|
;Returns: A,Y = Length of string
|
|
; N,Z based on A
|
|
STRLWR: JSR SETSRC ;Initialize Source String
|
|
.LLOOP LDA (SRCPTR),Y ;Get Next Character
|
|
BEQ .RETLEN ;If <> NUL
|
|
JSR TOLOWR ; Convert to Lower Case
|
|
STA (SRCPTR),Y ; and Replace in String
|
|
INY ; Increment Index
|
|
BPL .LLOOP ; and Loop if < 128
|
|
TYA ;Transfer Index to Accumulator
|
|
RTS ;and Return
|
|
|
|
;STRUPR(&s) - Convert String to Lower Case
|
|
;Args: X,Y - Pointer to string
|
|
;Sets: SRCPTR = Pointer to source string
|
|
;Returns: A,Y = Length of string
|
|
; N,Z based on A
|
|
STRUPR: JSR SETSRC ;Initialize Source String
|
|
.ULOOP LDA (SRCPTR),Y ;Get Next Character
|
|
BEQ .RETLEN ;If <> NUL
|
|
JSR TOUPPR ; Convert to Lower Case
|
|
STA (SRCPTR),Y ; and Replace in String
|
|
INY ; Increment Index
|
|
BPL .ULOOP ; and Loop if < 128
|
|
.RETLEN TYA ;Transfer Index to Accumulator
|
|
RTS ;and Return
|
|
|
|
ENDSUBROUTINE
|