User Tools

Site Tools


base:string_manipulation_routines

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:string_manipulation_routines [2015-04-17 04:34] (current)
Line 1: Line 1:
 +====== String manipulation routines ======
 +
 +Here is a set of routines to handle null-terminated character strings. Included is a small demonstration as to how they should be used. You will find routines to count the length of a string, copy a whole string, copy a string up to a predetermined offset, concatenate two strings and print a string. Take care to notice which pointer each routine utilizes.
 +
 +The zero page locations used fall within the floating point accumulators of the BASIC interpreter and should be safe to use, while not performing floating point math. The majority of the strcat routine is adjusting the source pointer to match the length of the existing destination string. This is due to the fact that the second index register cannot be used for indirect indexing.
 +
 +The routines have been thoroughly tested.
 +
 +<​code>​
 +; various string manipulation routines by FMan/Tropyx
 +
 +; all strings handled by these routines must be null-terminated,​ and their
 +; maximum length determined by the range of the index registers is 255 chars
 +
 + !to "​str.prg",​cbm ;​ compile using ACME
 +
 + src = $62
 + dst = $64
 + tmp = $66
 + len = $68
 +
 + *=$2000
 +
 +; sample code for using these routines
 +
 + lda #<​str1 ;​ set address of dst string
 + sta dst
 + lda #>str1
 + sta dst+1
 + lda #<​str2 ;​ set src string
 + sta src
 + lda #>str2
 + sta src+1
 + jsr strcat
 + jsr print ; uses the same dst pointer
 + rts
 +
 +str1 !pet "​hello,​ ",0
 + !fill 8 ; insert work space
 +str2 !pet "​world",​13,​0
 +
 +; strlen - returns the length of a string in Y, preserves X
 +; (upon return, index register Y points to the terminator)
 +
 +strlen ldy #0
 +slena lda (dst),y
 + beq slenb
 + iny
 + bne slena
 +slenb rts
 +
 +; strcpy - copies a string from src to dst, preserves X
 +
 +strcpy ldy #0
 +scpya lda (src),y
 + sta (dst),y ; the store instruction does not change the
 + beq scpyb ; Z flag and this copies the terminator too
 + iny
 + bne scpya ; maximum length of the string is 255 chars
 +scpyb rts
 +
 +; strncpy - copies a string up to the specified point set in '​len'​
 +
 +strncpy ldy #0
 +sncpya lda (src),y
 + sta (dst),y
 + beq sncpyb
 + iny
 + cpy len
 + bcc sncpya
 + lda #0 ; terminate the destination when cutting
 + sta (dst),y
 +sncpyb rts
 +
 +; strcat - concatenates src and dst, ie. adds dst to src - preserves nothing
 +
 +strcat jsr strlen ; get index to the end of the dst string
 + lda src+1
 + sta tmp+1
 + sec
 + lda src
 + sty tmp ; subtract the length of the existing
 + sbc tmp ; string from the source address, so that
 + sta tmp ; the index will match
 + bcs scata
 + dec tmp+1
 +scata lda (tmp),y ; copy source to the end of existing dst
 + sta (dst),y
 + beq scatb
 + iny
 + bne scata
 +scatb rts
 +
 +; print - outputs a string to screen (or to a channel specified using CHKOUT)
 +
 +print ldy #0
 +pra lda (dst),y
 + beq prb
 + jsr $ffd2 ; call CHROUT
 + iny
 + bne pra
 +prb rts
 +</​code>​
  
base/string_manipulation_routines.txt ยท Last modified: 2015-04-17 04:34 (external edit)