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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
|
.bss
;
; Organisation de la table en mémoire:
;
; (0,0)
; +----> x
; |
; |
; V
; y
;
Table DR 9 * 9 ; Table du jeu
.data
;
; Les quelques textes qui seront affichés
;
MsgTour1 DS "C'est au tour du joueur "
MsgTour2 DS " de jouer\n"
MsgGagne1 DS "Le joueur "
MsgGagne2 DS " a gagné\n"
MsgEgalite DS "Égalité\n"
MsgCoup DS "Votre coup: "
MsgColonne DS "Colonne "
MsgPlein DS " pleine\n"
MsgInvalide DS " invalide\n"
MsgDraw DS "| "
MsgDrawJ1 DS "|\e[31mO\e[0m"
MsgDrawJ2 DS "|\e[34mO\e[0m"
MsgDrawWall DS "|\n"
MsgsDraw DD MsgDraw, MsgDrawJ1, MsgDrawJ2, MsgDrawWall
MsgDrawBegin DS "\e[2J\e[0;0H 1 2 3 4 5 6 7\n"
MsgDrawEnd DS "+-+-+-+-+-+-+-+\n"
MsgEndl DS "\n"
.text
;
;
; Registre globaux: R0 = 0, R1 = @Table, R2 = Joueur en cours, R3 = nombre de coups à jouer
; R15 = registre temporaire.
;
;
;InitP4:
; Initialisations
;
InitP4: PUSH R4
PUSH R5
PUSH R6
MOV R1, Table
MOV R2, 1
MOV R3, 7 * 7;
; On met tout à zéro.
MOV R4, Table + (9 * 9);
MOV R5, R1
BoucleInit1: MOV, [R5], R0
ADD R5, 1
JNE R5, R4, BoucleInit1
; On met à 3 les 'murs' gauche et droite.
MOV R5, R1
MOV R6, 3
BoucleInit2: MOV, [R5], R6
MOV, [R5 + 8], R6
ADD R5, 9
JNE R5, R4, BoucleInit2
; On met à 3 les 'murs' haut et bas.
MOV R4, Table + 9;
MOV R5, R1
BoucleInit3: MOV, [R5], R6
MOV, [R5 + 8 * 9], R6
ADD R5, 1
JNE R5, R4, BoucleInit3
POP R6
POP R5
POP R4
RET
;LitMot:
; Sert à lire un mot de la table du P4, coordonnées (R7, R8), et renvoie le résultat dans R9
;
LitMot: MOV R15, 9
MUL R15, R8
ADD R15, Rd, R1
ADD R15, R7
MOV R9, [R15]
RET
;EcritMot:
; Sert à écrire le mot R2 de la table du P4, coordonnées (R7, R8)
;
EcritMot: MOV R15, 9
MUL R15, R8
ADD R15, Rd, R1
ADD R15, R7
MOV, [R15], R2
RET
;AfficheP4:
; Sert à afficher la table
;
AfficheP4: PUSH R4
PUSH R5
PUSH R6
PUSH R7
PUSH R8
PUSH R9
MOV, [0xffffff04], MsgDrawBegin
MOV R8, 8
MOV R9, 9
ADD R4, R1, 10
MOV R5, 1
BoucleAffiche2: MOV R6, 1
BoucleAffiche1: MOV R7, [R4]
MOV R7, MsgsDraw[R7]
MOV, [0xffffff04], R7
ADD R4, 1
ADD R6, 1
JNE R6, R9, BoucleAffiche1
ADD R5, 1
ADD R4, 1
JNE R5, R8, BoucleAffiche2
MOV, [0xffffff04], MsgDrawEnd
MOV, [0xffffff04], MsgTour1
MOV, [0xffffff06], R2
MOV, [0xffffff04], MsgTour2
POP R9
POP R8
POP R7
POP R6
POP R5
POP R4
RET
;
; Sert pour le debuggage lors du developpement de l'application.
;
AfficheDebug: PUSH R4
PUSH R5
PUSH R6
PUSH R7
PUSH R9
MOV, [0xffffff04], MsgEndl
MOV R9, 9
MOV R4, R1
MOV R5, R0
BoucleDebug2: MOV R6, R0
BoucleDebug1: MOV R7, [R4]
MOV, [0xffffff06], R7
ADD R4, 1
ADD R6, 1
JNE R6, R9, BoucleDebug1
MOV, [0xffffff04], MsgEndl
ADD R5, 1
JNE R5, R9, BoucleDebug2
POP R9
POP R7
POP R6
POP R5
POP R4
RET
;Has4V:
; Calcule autour du point de coordonnées (R7, R8), si le vecteur (R10, R11) donne 4 points alignés,
; et renvoie un booleen dans R12.
;
Has4V: PUSH R9
PUSH R13
PUSH R14
PUSH R7
PUSH R8
CALL LitMot
MOV R13, R9
MOV R14, R0
BouclePlus: ADD R7, R10
ADD R8, R11
CALL LitMot
ADD R14, 1
JE R9, R13, BouclePlus
POP R8
POP R7
PUSH R7
PUSH R8
BoucleMoins: SUB R7, R10
SUB R8, R11
CALL LitMot
ADD R14, 1
JE R9, R13, BoucleMoins
MOV R12, R0
MOV R15, 4
JLE R14, R15, SortieHas4V
MOV R12, 1
SortieHas4V: POP R8
POP R7
POP R14
POP R13
POP R9
RET
;Has4:
; Cette procédure nous dit si autour de (R7, R8) il y a 4 points identiques et renvoie un booléen dans R9
;
Has4: PUSH R10
PUSH R11
PUSH R12
MOV R9, 1
MOV R10, R0
MOV R11, 1
CALL Has4V
JNE R12, R0, SortieHas4
MOV R10, R11
CALL Has4V
JNE R12, R0, SortieHas4
MOV R11, R0
CALL Has4V
JNE R12, R0, SortieHas4
SUB R11, 1
CALL Has4V
JNE R12, R0, SortieHas4
MOV R9, R0
SortieHas4: POP R12
POP R11
POP R10
RET
;GetLig:
; Nous sort dans R8 la ligne la plus basse de la colonne R7. R8 vaudra 0 si la colonne est pleine.
;
GetLig: PUSH R9
MOV R8, R0
BoucleGetLig: ADD R8, 1
CALL LitMot
JE R9, R0, BoucleGetLig
SUB R8, 1
POP R9
RET
;LireClavier
; Lit un coup pour un joueur.
;
LitClavier: MOV, [0xffffff04], MsgCoup
MOV R7, [0xffffff05]
MOV R15, 8
JLE R7, R0, LitErreurI
JGE R7, R15, LitErreurI
CALL GetLig
JE R8, R0, LitErreurP
CALL EcritMot
RET
LitErreurI: MOV, [0xffffff04], MsgColonne
MOV, [0xffffff06], R7
MOV, [0xffffff04], MsgInvalide
JMP LitClavier
LitErreurP: MOV, [0xffffff04], MsgColonne
MOV, [0xffffff06], R7
MOV, [0xffffff04], MsgPlein
JMP LitClavier
;BoucleJeu:
; Boucle principale du jeu.
;
BoucleJeu: CALL AfficheP4
CALL LitClavier
CALL Has4
JNE R9, R0, Gagne
SUB R2, 1
JNE R2, R0, SautBoucleJeu
MOV R2, 2
SautBoucleJeu: SUB R3, 1
JNE R3, R0, BoucleJeu
CALL AfficheP4
MOV, [0xffffff04], MsgEgalite
RET
Gagne: CALL AfficheP4
MOV, [0xffffff04], MsgGagne1
MOV, [0xffffff06], R2
MOV, [0xffffff04], MsgGagne2
RET
.start
CALL InitP4
CALL BoucleJeu
HALT
|