## LSU EE 4720 Computer Architecture Spring 2010
#
# Classroom example, 25, 27 January 2010
# Code is now complete and should run.

        .data
doi:
        .ascii "Do you know what it means to miss New Orleans"
        .ascii "And miss it each night and day"
        .ascii "I know I'm not wrong... this feeling's gettin' stronger"
        .ascii "The longer, I stay away"
        .ascii "Miss them moss covered vines...the tall sugar pines"
        .ascii "Where mockin' birds used to sing"
        .ascii "And I'd like to see that lazy Mississippi...hurryin' into spring"
        .ascii ""
        .ascii "The moonlight on the bayou.......a creole tune.... that fills the air"
        .ascii "I dream... about magnolias in bloom......and I'm wishin I was there"
        .ascii ""
        .ascii "Do you know what it means to miss new orleans"
        .ascii "When that's where you left your heart"
        .ascii "And there's one thing more...i miss the one I care for"
        .ascii "More than I miss New Orleans"
        .ascii ""
        .asciiz "-- Louis Armstrong"

msg:
        .asciiz "Letter %/t3/c  count: %/t1/3d (%/f4/6.2f) %/t5/s\n"

        .align 4
histogram_data:
        .space 104
stars:
        .space 40

        .text
        .globl __start
__start:
        la $a0, doi
        la $a1, histogram_data
        addi $t1, $a1, 0
        addi $t2, $t1, 100
L3:
        sw $0, 0($t1)        # Initialize table element with zero.
        bne $t1, $t2, L3
        addi $t1, $t1, 4     # Move index to next element of histo table.

        la $t1, stars
        addi $t2, $t1, 40
        addi $t3, $0, 42  # '*'
L4:
        sb $t3, 0($t1)
        bne $t1, $t2, L4
        addi $t1, $t1, 1
        sb $0, 0($t1)

        jal strlen
        nop
        mtc1 $v0, $f2
        cvt.d.w $f2, $f2
        addi $v0, $0, 100
        mtc1 $v0, $f4
        cvt.d.w $f4, $f4
        div.d $f2, $f4, $f2

        jal histo
        nop
        add $t0, $0, $0
        addi $t3, $0, 64
        addi $t4, $t3, 26
        la $s1, histogram_data
        addi $v0, $0, 11
        la $a0, msg
        la $s2, stars
        addi $s2, $s2, 41
L2:
        lw $t1, 0($s1)
        addi $s1, $s1, 4
        beq $t1, $0, TEST
        addi $t3, $t3, 1
        srl $t6, $t1, 1
        sub $t5, $s2, $t6
        mtc1 $t1, $f0
        cvt.d.w $f0, $f0
        mul.d $f4, $f0, $f2
        

        addi $v0, $0, 11
        la $a0, msg
        syscall

TEST:
        bne $t3, $t4, L2
        nop

        addi $v0, $0, 10
        syscall


###############################################################################
## histo: Compute Character Usage Histogram

histo:
        ## Register Usage
        #
        # CALL VALUE: $a0  String to analyze.
        # CALL VALUE: $a1  Address of table.  Each element is an 4-char int.
        #             Table is to be filled in, there is no return value.

        # Useful Constants
        #
        # 'a' = 97,  'z' = 122,  'A' = 65,  'Z' = 90

        addi $s0, $ra, 0
        jal upper
        addi $s1, $a0, 0
        addi $a0, $s1, 0

LOOP:
        lb $t0, 0($a0)
        beq $t0, $0, DONE
        addi $a0, $a0, 1;

        addi $t0, $t0, -65

        sltiu $t2, $t0, 26
        beq $t2, $0,  LOOP

        sll $t0, $t0, 2
        add $t0, $t0, $a1

        lw $t1, 0($t0)
        addi $t1, $t1, 1
        sw $t1, 0($t0)

        j LOOP
        nop

DONE:

        jr $s0
        nop




###############################################################################
## upper: Convert to Upper Case

upper:
        ## Register Usage
        #
        # $a0: CALL VALUE: Address of string to convert.
        #
        # $a0: Address of character being examined.
        # $t1: Character being examined.
        # $t2: Comparison result.
ULOOP:
        lbu $t1, 0($a0)
        addi $a0, $a0, 1
        beq $t1, $0, UDONE
        slti $t2, $t1, 97 # < 'a'
        bne $t2, $0 ULOOP
        slti $t2, $t1, 123 # 'z' + 1
        beq $t2, $0, ULOOP
        addi $t1, $t1, -32
        j ULOOP
        sb $t1,-1($a0)

UDONE:
        jr $ra
        nop


################################################################################
## strlen: String Length

strlen:
        ## Register Usage
        #
        # CALL VALUE  : $a0: Address of first character of string.
        # RETURN VALUE: $v0: The length of the string.
        #
        # $t0: Character being examined.
        # $t1: Address of current character being examined.
        #
        addi $t1, $a0, 0
SLOOP:
        lbu $t0, 0($t1)
        bne $t0, $0, SLOOP
        addi $t1, $t1, 1

        addi $t1, $t1, -1
        jr $ra
        sub $v0, $t1, $a0