Hello
I am writing a program for class to simulate a tv remote in a MIPS/SPIM enviroment.  The functions of the program itself are unimportant as they worked fine before the interrupt so I left them all out.  The gaol is basically to get a input from the keyboard by means of interupt, store it in $s7 and process it. The interrupt is causing my program to repeatedly spam the errors:
Exception occurred at PC=0x00400068
  Bad address in data/stack read: 0x00000004
Exception occurred at PC=0x00400358
  Bad address in data/stack read: 0x00000000
program starts here
.data
msg_tvworking: 
 .asciiz "tv is working\n"
msg_sec:
 .asciiz "sec -- "
msg_on:
 .asciiz "Power On"
msg_off: 
 .asciiz "Power Off"
msg_channel:
 .asciiz " Channel "
msg_volume: 
 .asciiz " Volume "
msg_sleep:
 .asciiz " Sleep Timer: "
msg_dash:
 .asciiz "-\n"
msg_newline:
 .asciiz "\n"
msg_comma:
 .asciiz ", "
array1: .space 400 # 400 bytes of storage for 100 channels
array2: .space 400 # copy of above for sorting 
var1: .word 0 # 1 if 0-9 is pressed, 0 if not
var2: .word 0 # stores number of channel (ex. 2-)
var3: .word 0 # channel timer
var4: .word 0 # 1 if s pressed once, 2 if twice, 0 if not
var5: .word 0 # sleep wait timer
var6: .word 0 # program timer
var9: .float 0.01 # for channel timings
.kdata
var7: .word 10
var8: .word 11
.text
 .globl main
main:
li $s0, 300
li $s1, 0   # channel
li $s2, 50  # volume
li $s3, 1   # power - 1:on 0:off
li $s4, 0   # sleep timer - 0:off
li $s5, 0   # temporary
li $s6, 0   # length of sleep period
li $s7, 10000 # current key press
li $t2, 0   # temp value not needed across calls
li $t4, 0
interrupt data here
mfc0 $a0, $12
 ori $a0, 0xff11
 mtc0 $a0, $12
lui $t0, 0xFFFF
 ori $a0, $0, 2
 sw $a0, 0($t0)
mainloop:
# 1. get external input, and process it
# input from interupt is taken from $a2 and placed in $s7  #for processing
beq $a2, $0, next
 lw $s7, 4($a2)
 li $a2, 0
# call the process_input function here
# jal process_input
next:
# 2. check sleep timer
mainloopnext1:
# 3. delay for 10ms
 jal delay_10ms
jal check_timers 
 jal channel_time
# 4. print status
lw $s5, var6
 addi $s5, $s5, 1
 sw $s5, var6
addi $s0, $s0, -1
 bne $s0, $0, mainloopnext4
 li $s0, 300
 jal status_print
mainloopnext4:
 j mainloop 
li $v0,10 # exit
 syscall
--------------------------------------------------
status_print:
seconds_stat:
power_stat:
on_stat:
off_stat:
channel_stat:
volume_stat:
sleep_stat:
j $ra
--------------------------------------------------
delay_10ms:
 li $t0, 6000
delay_10ms_loop:
 addi $t0, $t0, -1
 bne $t0, $0, delay_10ms_loop
 jr $ra
--------------------------------------------------
check_timers:
channel_press:
sleep_press:
go_back_press:
channel_check:
channel_ignore:
sleep_check:
sleep_ignore:
j $ra
------------------------------------------------
process_input:
 beq $s7, 112, power
 beq $s7, 117, channel_up
 beq $s7, 100, channel_down
 beq $s7, 108, volume_up
 beq $s7, 107, volume_down
 beq $s7, 115, sleep_init
 beq $s7, 118, history
 bgt $s7, 47, end_range
 jr $ra
end_range:
power:
on:
off:
channel_up:
over:
channel_down:
under:
channel_message:
channel_time:
volume_up:
volume_down:
volume_message:
sleep_init:
sleep_incr:
sleep:
sleep_reset:
history:
digit_pad_init:
digit_pad:
jr $ra
--------------------------------------------
interupt data here, followed closely from class
.ktext 0x80000180
.set noat
 move $k1, $at
 .set at
sw $v0, var7
 sw $a0, var8
mfc0 $k0, $13
 srl $a0, $k0, 2
 andi $a0, $a0, 0x1f
bne $a0, $zero, no_io
lui $v0, 0xFFFF
 lw $a2, 4($v0) # keyboard data placed in $a2
no_io:
 mtc0 $0, $13
 mfc0 $k0, $12
 andi $k0, 0xfffd 
 ori  $k0, 0x11
 mtc0 $k0, $12
lw $v0, var7
 lw $a0, var8
.set noat
 move $at, $k1
 .set at
eret
Thanks in advance.