-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxo.asm
286 lines (271 loc) · 3.66 KB
/
xo.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
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
cseg segment
assume cs:cseg
Begin:
mov ah, 2
mov cl, 25
Clear:
mov dl, 10
int 21h
dec cl
jnz Clear
mov bh, 0
mov dh, 0
mov dl, 0
int 10h
mov bl, 3 ;This Chooses the board size
mov cl, bl
mov ch, bl
CreateBoard:
mov dl, '#'
mov cl, bl
WriteLine:
int 21h
dec cl
jnz WriteLine
jz NewRow
NewRow:
mov dl, 10
int 21h
mov dl, 13
int 21h
dec ch
jnz CreateBoard
jz MoveInit
MoveInit:
mov ah, 2
mov bh, 0
mov dh, 0
dec bl
mov si, 0
mov dl, 0
int 10h
mov ah, 7
WaitForKey:
int 21h
cmp al, 61h
jz GoLeft
cmp al, 77h
jz GoUp
cmp al, 73h
jz GoDown
cmp al, 64h
jz GoRight
cmp al, 20h
jz Switch
cmp al, 1bh
jz GoToFinish
jmp WaitForKey
GoToFinish:
jmp Finish
GoDown:
cmp dh, bl
jz WaitForKey
inc dh
mov ah, 2
int 10h
mov ah, 7
jmp WaitForKey
GoLeft:
cmp dl, 0
jz WaitForkey
dec dl
mov ah, 2
int 10h
mov ah, 7
jmp WaitForKey
GoRight:
cmp dl, bl
jz WaitForKey
inc dl
mov ah, 2
int 10h
mov ah, 7
jmp WaitForKey
GoUp:
cmp dh, 0
jz WaitForKey
dec dh
mov ah, 2
int 10h
mov ah, 7
jmp WaitForKey
BorderExcep:
dec bl
jmp WaitForKey
Switch:
inc bl
cmp dl, bl
jz BorderExcep
dec bl
mov ch, dl
mov ah, 8
int 10h
cmp al, '#'
jz MakeChar
jmp WaitForKey
MakeChar:
cmp si, 1
jz MakeO
jmp MakeX
MakeX:
mov dl, 'X'
mov ah, 2
int 21h
mov dl, ch
inc dl
mov ah, 7
inc si
mov cl, 'X'
jmp VictoryCheck
MakeO:
mov dl, 'O'
mov ah, 2
int 21h
mov dl, ch
inc dl
mov ah, 7
dec si
mov cl, 'O'
jmp VictoryCheck
VictoryCheck:
mov bh, 0
inc bl
jmp RowCheck
RowCheck:
mov ch, dl
mov dl, 0
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz CheckNextCol
mov dl, ch
jmp ColCheck
CheckNextCol:
inc dl
cmp bl, dl
jz GoFinish
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz CheckNextCol
mov dl, ch
jmp ColCheck
GoFinish:
jmp Finish
ColCheck:
dec dl
mov ch, dh
mov dh, 0
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz CheckNextRow
mov dh, ch
jmp DiagonalCheck
CheckNextRow:
inc dh
cmp bl, dh
jz GoFinish
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz CheckNextRow
mov dh, ch
jmp DiagonalCheck
DiagonalCheck:
sub dh, dl
jz MainDiagonal
add dh, dl
add dh, dl
dec bl
sub dh, bl
jz SecondDiagonal
sub dh, dl
add dh, bl
mov ah, 2
int 10h
mov ah, 7
jmp WaitForKey
MainDiagonal:
mov ch, dl
mov dl, 0
mov dh, 0
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz MainDiagonalCheck
mov dl, ch
mov dh, ch
mov ah, 2
int 10h
mov ah, 7
dec bl
jmp WaitForKey
MainDiagonalCheck:
inc dl
inc dh
cmp bl, dl
jz Finish
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz MainDiagonalCheck
mov dl, ch
mov dh, ch
mov ah, 2
int 10h
mov ah, 7
dec bl
jmp WaitForKey
SecondDiagonal:
mov ch, dl
mov dl, bl
inc bl
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz SecondDiagonalCheck
mov dl, ch
mov dh, bl
sub dh, dl
mov ah, 2
int 10h
mov ah, 7
dec bl
jmp WaitForKey
SecondDiagonalCheck:
inc dh
dec dl
jz Finish
mov ah, 2
int 10h
mov ah, 8
int 10h
cmp al, cl
jz SecondDiagonalCheck
mov dl, ch
mov dh, bl
sub dh, dl
mov ah, 2
int 10h
mov ah, 7
dec bl
jmp WaitForKey
Finish:
int 3
cseg ends
end begin