Some indentation cleanups on the Mastermind game
[TD_IML.git] / project / mips1.asm
1 .data
2
3 welcome: .asciiz "Bienvenue dans le jeu de Mastermind.\nUne sequence de quatre chiffres de 1 à 8 a ete générée.\nA vous de la deviner !"
4 play: .asciiz "Commencer à jouer:"
5 lost_msg: .asciiz "Vous avez perdu !"
6 win_msg: .asciiz "Vous avez gagné !"
7 temp_msg: .asciiz " bien placé"
8 exclamation_point: .asciiz "! "
9 interrogation_point: .asciiz "? "
10 newline: .asciiz "\n"
11
12 O: .ascii "O"
13 X: .ascii "X"
14 tiret: .ascii "-"
15
16 compare_buffer: .space 5
17 input_value: .byte 0:5
18 guess_value: .byte 0:5
19
20 .text
21
22 main:
23
24 # show intro and rules
25 display_welcome:
26 la $a0, newline
27 li $v0, 4
28 syscall
29 la $a0, welcome
30 li $v0, 4
31 syscall
32 la $a0, newline
33 li $v0, 4
34 syscall
35 la $a0, play
36 li $v0, 4
37 syscall
38 la $a0, newline
39 li $v0, 4
40 syscall
41
42 generate_sequence:
43 la $t0, guess_value
44
45 li $a1, 8
46 li $v0, 42
47 syscall
48 addi $a0, $a0, 1 # Put the integer into the [1-8] range
49
50 sb $a0, 0($t0)
51
52 li $a1, 8
53 li $v0, 42
54 syscall
55 addi $a0, $a0, 1 # Put the integer into the [1-8] range
56
57 sb $a0, 1($t0)
58
59 li $a1, 8
60 li $v0, 42
61 syscall
62 addi $a0, $a0, 1 # Put the integer into the [1-8] range
63
64 sb $a0, 2($t0)
65
66 li $a1, 8
67 li $v0, 42
68 syscall
69 addi $a0, $a0, 1 # Put the integer into the [1-8] range
70
71 sb $a0, 3($t0)
72
73 generate_sequence_loop_end:
74
75 la $s0, ($zero) # Initialize loop counter to zero
76 la $s1, compare_buffer
77 loop:
78 beq $s0, 10, lost
79 # ask user for the next input
80 input:
81 la $a0, newline
82 li $v0, 4
83 syscall
84
85 la $a0, ($s0)
86 li $v0, 1
87 syscall
88 la $a0, interrogation_point
89 li $v0, 4
90 syscall
91
92 la $a0, input_value # Store the answer
93 li $a1, 5
94 li $v0, 8 # Load syscall read_string
95 syscall # Make the syscall
96
97 # check that each input values are in the right range
98 check_input:
99 la $t7, input_value
100
101 lb $t5, 0($t7)
102 andi $t5, $t5, 0x0F # ASCII code to integer
103 beq $t5, $zero, input
104 addi $t5, $t5, -9
105 bgez $t5, input
106
107 lb $t5, 1($t7)
108 andi $t5, $t5, 0x0F # ASCII code to integer
109 beq $t5, $zero, input
110 addi $t5, $t5, -9
111 bgez $t5, input
112
113 lb $t5, 2($t7)
114 andi $t5, $t5, 0x0F # ASCII code to integer
115 beq $t5, $zero, input
116 addi $t5, $t5, -9
117 bgez $t5, input
118
119 lb $t5, 3($t7)
120 andi $t5, $t5, 0x0F # ASCII code to integer
121 beq $t5, $zero, input
122 addi $t5, $t5, -9
123 bgez $t5, input
124
125 la $s2, ($zero) # Same counter
126 la $s3 ($zero)
127 compare_input:
128 la $t7, input_value
129 la $t6, guess_value
130 la $t5, O
131 la $t4, X
132 la $t3, tiret
133
134 lb $t0, 0($t7)
135 andi $t0, $t0, 0x0F # ASCII code to integer
136 lb $t1, 0($t6)
137 beq $t0, $t1, same1
138 j different1
139 same1:
140 sb $0, 0($t7)
141 sb $t5, 0($s1)
142 addi $s2, $s2, 1
143 different1:
144 lb $t0, 1($t7)
145 andi $t0, $t0, 0x0F # ASCII code to integer
146 lb $t1, 1($t6)
147 beq $t0, $t1, same2
148 j different2
149 same2:
150 sb $zero, 1($t7)
151 sb $t5, 1($s1)
152 addi $s2, $s2, 1
153 different2:
154 lb $t0, 2($t7)
155 andi $t0, $t0, 0x0F # ASCII code to integer
156 lb $t1, 2($t6)
157 beq $t0, $t1, same3
158 j different3
159 same3:
160 sb $zero, 2($t7)
161 sb $t5, 2($s1)
162 addi $s2, $s2, 1
163 different3:
164 lb $t0, 3($t7)
165 andi $t0, $t0, 0x0F # ASCII code to integer
166 lb $t1, 3($t6)
167 beq $t0, $t1, same4
168 j different4
169 same4:
170 sb $zero, 3($t7)
171 sb $t5, 3($s1)
172 addi $s2, $s2, 1
173 different4:
174 beq $s2, 4, won
175
176
177 print_comp_result:
178 la $a0, newline
179 li $v0, 4
180 syscall
181 la $a0, ($s0)
182 li $v0, 1
183 syscall
184 la $a0, exclamation_point
185 li $v0, 4
186 syscall
187 la $a0, ($s2)
188 li $v0, 1
189 syscall
190 la $a0, temp_msg
191 li $v0, 4
192 syscall
193
194 addi $s0, $s0, 1
195 j loop
196
197 won:
198 la $a0, newline
199 li $v0, 4
200 syscall
201 la $a0, win_msg
202 li $v0, 4
203 syscall
204
205 j exit
206
207 lost:
208 la $a0, newline
209 li $v0, 4
210 syscall
211 la $a0, lost_msg
212 li $v0, 4
213 syscall
214
215 j exit
216
217 exit:
218 li $v0, 10
219 syscall