# -----------------------------------------------------------
# 621.701 PR Rechnerorganisation
# -----------------------------------------------------------
# Aufgabenblatt 2, Beispiel 3
#
# Autor: Christian Timmerer <christian.timmerer@itec.uni-klu.ac.at
# Datum: 2003/10/12
# -----------------------------------------------------------

.data
greeting: .ascii "Welcome to the Matrix by Christian Timmerer\n\n"
input1:    .asciiz "Please enter dimX: "
input2:    .asciiz "Please enter dimY: "
input3:    .asciiz "Please enter posX: "
input4:    .asciiz "Please enter posY: "
error:     .asciiz ">>> input error <<<"

sizeof:    .word 4

out_rmo:   .asciiz "Row Major Order:"
out_cmo:   .asciiz "Column Major Order:"
nl:        .asciiz "\n"

.text
.globl main
main:
  j read_input

start:
  addi $s0, $zero, 0	# $s0 = 0
  slt $s0, $t0, $t2	# if (dimX < posX) $s0 = 1
  bne $s0, $zero, print_err
  slt $s0, $t1, $t3	# if (dimY < posY) $s0 = 1
  bne $s0, $zero, print_err

calc_rmo:
  lw $s0, sizeof
  mul $s1, $t2, $s0	# $s1 = posX * sizeof
  mul $s2, $t3, $t1	# $s2 = posY * dimX
  mul $s2, $s2, $s0	# $s2 = $s2 * sizeof
  add $s1, $s1, $s2	# $s1 = posX * sizeof + posY * dimX * sizeof
  la $t8, out_rmo
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  jal print_erg

calc_cmo:
  mul $s1, $t3, $s0	# $s1 = posY * sizeof
  mul $s2, $t2, $t1	# $s2 = posX * dimY
  mul $s2, $s2, $s0	# $s2 = $s2 * sizeof
  add $s1, $s1, $s2	# $s1 = posY * sizeof + posX * dimY * sizeof
  la $t8, out_cmo
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  jal print_erg

end:
  li $v0, 10
  syscall		# exit




print_erg:
  addi $a0, $s1, 0
  addi $v0, $zero, 1
  syscall
  la $t8, nl
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  jr $ra


print_err:
  la $t8, error
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  j end


read_input:
  la $t8, greeting
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall

  addi $v0, $zero, 5	# dimX einlesen
  syscall
  addi $t0, $v0, 0	# $t0 = dimX
  la $t8, input2
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  addi $v0, $zero, 5	# dimY einlesen
  syscall
  addi $t1, $v0, 0	# $t1 = dimY
  la $t8, input3
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  addi $v0, $zero, 5	# posX einlesen
  syscall
  addi $t2, $v0, 0	# $t2 = posX
  la $t8, input4
  addi $a0, $t8, 0
  addi $v0, $zero, 4
  syscall
  addi $v0, $zero, 5	# posY einlesen
  syscall
  addi $t3, $v0, 0	# $t3 = posY
  j start
	