-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInterruptProject.asm
212 lines (173 loc) · 3.79 KB
/
InterruptProject.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
.data
bufferExp: .space 30
bufferExpLen: .word 0
asciiZero: .byte '0'
.text #MAIN PROGRAM START
#Turn on the transmitter control ready bit
lui $t0, 0xFFFF
lw $t1, 8($t0)
ori $t1, $t1, 0x0001
sw $t1, 8($t0)
#Turn on the receiver control interrupt-enable bit
lui $t0, 0xFFFF
lw $t1, 0($t0)
ori $t1, $t1, 0x0002
sw $t1, 0($t0)
main: #MAIN - Begin
mainLoop:
lw $t5, bufferExpLen
addi $s0, $s0, 1
addi $s0, $s0, -1
beq $t5, 4, Terminate
j mainLoop
#MAIN -End
#MAIN PROGRAM END
Terminate:
li $v0, 10
syscall
################################################################# HANDLER Main - Begin
myHandler:
#save to stack
sw $ra, 0($sp)
addi $sp, $sp, -4
sw $t0, 0($sp)
addi $sp, $sp, -4
sw $t1, 0($sp)
addi $sp, $sp, -4
#store char in buffer
jal StoreChar
#add 1 to the buffer length
lw $t0, bufferExpLen
addi $t0, $t0, 1
sw $t0, bufferExpLen
#send every character in the buffer to the display by polling the buffer
jal SendToDisplay #If bufferExpLen == 4, we will skip printing because evaluate will print the integer value
bne $t0, 4, Branch1
jal Evaluate
Branch1:
#recover stack
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
lw $t0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
jr $ra
################################################################# Handler Main - End
################################################################# Handler functions - Begin
StoreChar:
#save to stack
sw $ra, 0($sp)
addi $sp, $sp, -4
sw $t5, 0($sp)
addi $sp, $sp, -4
sw $t3, 0($sp)
addi $sp, $sp, -4
lw $t3, 0xFFFF0004 #word to be loaded in $t3
la $t5, bufferExp
sw $t3, 0($t5)
addi $t5, $t5, 4
#recover stack
addi $sp, $sp, 4
lw $t3, 0($sp)
addi $sp, $sp, 4
lw $t5, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
jr $ra
Evaluate:
#save to stack
sw $ra, 0($sp)
addi $sp, $sp, -4
sw $t0, 0($sp)
addi $sp, $sp, -4
sw $t1, 0($sp)
addi $sp, $sp, -4
sw $t2, 0($sp)
addi $sp, $sp, -4
sw $t3, 0($sp)
addi $sp, $sp, -4
la $t1, bufferExp
lw $t0, 4($t1) # loads first acii value
lw $t2, 8($t1)
addi $t0, $t0, -48 #contains integer value of first number
addi $t2, $t2, -48 #contains integer value of second number
add $t3, $t0, $t2
add $t3, $t3, 48
sw $t3, 0xFFFF000c
#recover stack
addi $sp, $sp, 4
lw $t3, 0($sp)
addi $sp, $sp, 4
lw $t2, 0($sp)
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
lw $t0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
jr $ra
SendToDisplay:
#save to stack
sw $ra, 0($sp)
addi $sp, $sp, -4
sw $t0, 0($sp)
addi $sp, $sp, -4
sw $t1, 0($sp)
addi $sp, $sp, -4
la $t0, bufferExp
addi $t0, $t0, -4
lw $t1, bufferExp
#send this to transmitter
sw $t1, 0xFFFF000c
addi $t0, $t0, 4
#recover stack
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
lw $t0, 0($sp)
addi $sp, $sp, 4
lw $ra, 0($sp)
jr $ra
################################################################# HANDLER FUNCTIONS - End
################################################################# KERNEL CODE - Begin
.kdata
_k_save_s0: .word 0
_k_save_ra: .word 0
_k_save_t0: .word 0
_k_save_t1: .word 0
_k_save_t5: .word 0
.ktext 0x80000180 #INTERRUPT MAIN START
#save all program data registers into k registers
#t1 t0 t5
sw $t0, _k_save_t0
sw $t1, _k_save_t1
sw $t5, _k_save_t5
sw $s0, _k_save_s0
sw $ra, _k_save_ra
#Check the cause, ensure keyboard input caused exception
#mfc0 $t0, $13
#andi $t1, $t0, 0x007c
#bnez $t1, APPLE
#andi $t1, $t0, 0x0100
#beqz $t1, APPLE
#If cause is keyboard, Jump to Interrupt Handler
la $k0, myHandler
jalr $k0
APPLE:
#Returned back from handler, or interrupt cause was not keyboard
#Clear cause register and reset ready bit on status register
mtc0 $zero, $13
mfc0 $t0, $12
andi $t0, 0x111D
ori $t0, 0x0001
mtc0 $t0, $12
#recover all program data registers
lw $t0, _k_save_t0
lw $t1, _k_save_t1
lw $t5, _k_save_t5
lw $s0, _k_save_s0
lw $ra, _k_save_ra
eret
#INTERRUPT HANDLER END
################################################################## KERNEL CODE - End