################################################################################
##
## LSU EE 4720 Spring 2004 Homework 2 Solution
##
##
# Assignment: http://www.ece.lsu.edu/ee4720/2004/hw2.html
################################################################################
## Problem 1 Solution
# Solution Note
#
# The message, "It's a cookbook!" is from an old Twilight Zone
# episode. Aliens have given us a book with the English title "To
# Serve Man" but its text is in the alien language. Many people
# accept trips to the alien planet until their language is deciphered
# and the true topic of the book is discovered.
#
# My apologies if I spoiled the ending for anyone.
## Register Usage
#
# $a0: Procedure call argument: Address of text.
# $a1: Procedure call argument: Address at which to write decoded msg.
# There are no return values.
# Text at "->" shows how points were implemented in the solution.
# [x] The secret message is a short English sentence.
# Make sure your message is not just a part of the original text.
# [x] Avoid multiplication instructions and especially division and mod.
# -> Used shift-and-adds.
# [x] Try to use an efficient way to write the secret message.
# -> Used one sw instead of four sb's.
# [x] Fill as many branch delay slots as possible.
# -> Just one unfilled.
# [x] Do not put an insn in a loop if it could be placed before the loop.
# [x] Streamline the code. This is important.
# [x] Make sure the message is null terminated.
extract:
addi $t7, $0, 10 # \n
addi $t6, $0, 32 # Blank
addi $t5, $0, 13 # Handy constant, number of digits - 1.
add $t3, $0, $0 # Radix 5 digit count.
addi $v0, $0, 0 # Integer value of radix-5 number.
# Loop until \n (end of line) found.
#
# Program will spend most if its time in this loop so keep it
# tight, in particular don't look for blanks here. Loop would
# be even tighter if we could be sure string ends with a \n.
LOOP:
lb $t0, 0($a0)
beq $t0, $0, EXIT
addi $a0, $a0, 1
bne $t0, $t7, LOOP
nop
# At this point $a0 is address of character after \n:
#
# "reformatted its \n" (\n is one character)
# ^
# $a0
# Loop backwards, looking for a non-blank.
#
addi $t8, $a0, 1
BLOOP:
lb $t0, -3($t8)
beq $t0, $t6, BLOOP
addi $t8, $t8, -1
# At this point $t8 is address of second blank at end:
#
# "reformatted its \n" (\n is one character)
# ^ ^
# $t8 $a0
sub $t1, $a0, $t8 # Compute number of blanks at end of line.
# Compute v0 = v0 * 5 + t1
#
sll $t2, $v0, 2
add $v0, $v0, $t2
add $v0, $v0, $t1
# Get another digit (LOOP) unless we already have 14 digits.
#
bne $t3, $t5, LOOP
addi $t3, $t3, 1
# At this point $v0 has four characters of the decoded message.
# Store the four characters, reset counters, and get first digit.
#
sw $v0, 0($a1)
addi $a1, $a1, 4
addi $v0, $0, 0
j LOOP
addi $t3, $0, 0
EXIT:
jr $ra
sb $0, 0($a1) # Null-terminate message string.