96 lines
1.5 KiB
Plaintext
96 lines
1.5 KiB
Plaintext
ToUpper:
|
|
;input: $a0 = pointer to beginning of string
|
|
;clobbers: $t0,$t1,$t2
|
|
|
|
li $t1,'a'
|
|
li $t2,'z'
|
|
ToUpper_again:
|
|
|
|
lbu $t0,($a0)
|
|
nop
|
|
|
|
beqz $t0,ToUpper_done ;if char is null terminator, exit
|
|
nop
|
|
|
|
bltu $t0,$t1,ToUpper_overhead ;if char stored in $t0 < 'a', skip
|
|
nop
|
|
|
|
bgtu $t0,$t2,ToUpper_overhead ;if char stored in $t0 > 'z', skip
|
|
nop
|
|
|
|
|
|
andi $t0,$t0,0xDF ;otherwise, do the work.
|
|
sb $t0,($a0)
|
|
|
|
ToUpper_overhead:
|
|
addiu $a0,1
|
|
b ToUpper_again
|
|
nop
|
|
|
|
ToUpper_done:
|
|
jr ra
|
|
nop
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
ToLower:
|
|
;input: $a0 = pointer to beginning of string
|
|
;clobbers: $t0,$t1,$t2
|
|
|
|
li $t1,'A'
|
|
li $t2,'Z'
|
|
ToLower_again:
|
|
|
|
lbu $t0,($a0)
|
|
nop
|
|
|
|
beqz $t0,ToUpper_done ;not a typo, I did this to save space.
|
|
nop
|
|
|
|
bltu $t0,$t1,ToLower_overhead ;if char stored in $t0 < 'a', skip
|
|
nop
|
|
|
|
bgtu $t0,$t2,ToLower_overhead ;if char stored in $t0 > 'z', skip
|
|
nop
|
|
|
|
|
|
ori $t0,$t0,0x20
|
|
sb $t0,($a0)
|
|
|
|
ToLower_overhead:
|
|
addiu $a0,1
|
|
b ToLower_again
|
|
nop
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
ToggleCase:
|
|
li $t1,'A'
|
|
li $t2,'Z'
|
|
|
|
lbu $t0,($a0)
|
|
nop
|
|
|
|
beqz $t0,ToggleCase_done
|
|
nop
|
|
|
|
bltu $t0,$t1,ToggleCase_next
|
|
nop
|
|
bleu $t0,$t2,ToggleCase_Xor
|
|
nop
|
|
ToggleCase_next:
|
|
addiu $t1,0x20 ;li $t1,'a'
|
|
addiu $t2,0x20 ;li $t2,'z'
|
|
|
|
bltu $t0,$t1,ToggleCase_overhead
|
|
nop
|
|
bgtu $t0,$t2,ToggleCase_overhead
|
|
nop
|
|
ToggleCase_Xor:
|
|
xori $t0,$t0,0x20
|
|
sb $t0,($a0)
|
|
ToggleCase_overhead:
|
|
addiu $a0,1
|
|
b ToggleCase
|
|
nop
|
|
ToggleCase_done:
|
|
jr ra
|
|
nop
|