99 lines
3.0 KiB
Plaintext
99 lines
3.0 KiB
Plaintext
.lf case6502.lst
|
|
.cr 6502
|
|
.tf case6502.obj,ap1
|
|
;------------------------------------------------------
|
|
; String Case for the 6502 by barrym95838 2013.04.07
|
|
; Thanks to sbprojects.com for a very nice assembler!
|
|
; The target for this assembly is an Apple II with
|
|
; mixed-case output capabilities. Apple IIs like to
|
|
; work in '+128' ascii, so this version leaves bit 7
|
|
; alone, and can be used with either flavor.
|
|
; 6502s work best with data structures < 256 bytes;
|
|
; several instructions would have to be added to
|
|
; properly deal with longer strings.
|
|
; Tested and verified on AppleWin 1.20.0.0
|
|
;------------------------------------------------------
|
|
; Constant Section
|
|
;
|
|
StrPtr = $6 ;0-page temp pointer (2 bytes)
|
|
Low = $8 ;0-page temp low bound
|
|
High = $9 ;0-page temp high bound
|
|
CharOut = $fded ;Specific to the Apple II
|
|
BigA = "A" ;'A' for normal ascii
|
|
BigZ = "Z" ;'Z' " " "
|
|
LittleA = "a" ;'a' " " "
|
|
LittleZ = "z" ;'z' " " "
|
|
;======================================================
|
|
.or $0f00
|
|
;------------------------------------------------------
|
|
; The main program
|
|
;
|
|
main ldx #sTest ;Point to the test string
|
|
lda /sTest
|
|
jsr puts ;print it to stdout
|
|
jsr toUpper ;convert to UPPER-case
|
|
jsr puts ;print it
|
|
jsr toLower ;convert to lower-case
|
|
jmp puts ;print it and return to caller
|
|
;------------------------------------------------------
|
|
toUpper ldy #LittleA
|
|
sty Low ;set up the flip range
|
|
ldy #LittleZ
|
|
bne toLow2 ;return via toLower's tail
|
|
;------------------------------------------------------
|
|
toLower ldy #BigA
|
|
sty Low ;set up the flip range
|
|
ldy #BigZ
|
|
toLow2 sty High
|
|
; ;return via fall-thru to flip
|
|
;------------------------------------------------------
|
|
; Given a NUL-terminated string at A:X, flip the case
|
|
; of any chars in the range [Low..High], inclusive;
|
|
; only works on the first 256 bytes of a long string
|
|
; Uses: StrPtr, Low, High
|
|
; Preserves: A, X
|
|
; Trashes: Y
|
|
;
|
|
flip stx StrPtr ;init string pointer
|
|
sta StrPtr+1
|
|
ldy #0
|
|
pha ;save A
|
|
flip2 lda (StrPtr),y ;get string char
|
|
beq flip5 ;done if NUL
|
|
cmp Low
|
|
bcc flip4 ;if Low <= char <= High
|
|
cmp High
|
|
beq flip3
|
|
bcs flip4
|
|
flip3 eor #$20 ; then flip the case
|
|
sta (StrPtr),y
|
|
flip4 iny ;point to next char
|
|
bne flip2 ;loop up to 255 times
|
|
flip5 pla ;restore A
|
|
rts ;return
|
|
;------------------------------------------------------
|
|
; Output NUL-terminated string @ A:X; strings longer
|
|
; than 256 bytes are truncated there
|
|
; Uses: StrPtr
|
|
; Preserves: A, X
|
|
; Trashes: Y
|
|
;
|
|
puts stx StrPtr ;init string pointer
|
|
sta StrPtr+1
|
|
ldy #0
|
|
pha ;save A
|
|
puts2 lda (StrPtr),y ;get string char
|
|
beq puts3 ;done if NUL
|
|
jsr CharOut ;output the char
|
|
iny ;point to next char
|
|
bne puts2 ;loop up to 255 times
|
|
puts3 pla ;restore A
|
|
rts ;return
|
|
;------------------------------------------------------
|
|
; Test String (in '+128' ascii, Apple II style)
|
|
;
|
|
sTest .as -"Alpha, BETA, gamma, {[(<123@_>)]}."
|
|
.az -#13
|
|
;------------------------------------------------------
|
|
.en
|