; uppercase:  converts lower- to uppercase
            .ORIG  x3000
            LEA    R6, STACK
MAIN        ADD    R1, R6, #3
READCHAR    IN                  ; read in input string: scanf
            OUT
            STR    R0, R1, #0
            ADD    R1, R1, #1
            ADD    R2, R0, x-A
            BRnp   READCHAR
            ADD    R1, R1, #-1  
            STR    R2, R1, #0   ; put in NULL char to mark the "end"
            ADD    R1, R6, #3   ; get the starting address of the string
            STR    R1, R6, #14  ; pass the parameter
            STR    R6, R6, #13
            ADD    R6, R6, #11
            JSR    UPPERCASE
            HALT
UPPERCASE   STR    R7, R6, #1
            AND    R1, R1, #0
            STR    R1, R6, #4
            LDR    R2, R6, #3
CONVERT     ADD    R3, R1, R2   ; add index to starting addr of string
            LDR    R4, R3, #0
            BRz    DONE         ; Done if NULL char reached
            LD     R5, a
            ADD    R5, R5, R4   ; 'a' <= input string
            BRn    NEXT
            LD     R5, z
            ADD    R5, R4, R5   ; input string <= 'z'
            BRp    NEXT
            LD     R5, asubA    ; convert to uppercase
            ADD    R4, R4, R5
            STR    R4, R3, #0
NEXT        ADD    R1, R1, #1   ; increment the array index, i
            STR    R1, R6, #4
            BR     CONVERT
DONE        LDR    R7, R6, #1
            LDR    R6, R6, #2
            RET     
a           .FILL  #-97
z           .FILL  #-122
asubA       .FILL  #-32
STACK       .BLKW  100     $0        
            .END