Subversion Repositories Kolibri OS

Rev

Rev 3950 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3950 Rev 7673
1
;http://sources.ru/pascal/gamestxt/go-moku.zip
1
;http://sources.ru/pascal/gamestxt/go-moku.zip
2
 
2
 
3
N equ 19		; Size of the board
3
N = 19	; Size of the board
4
 
4
 
5
use32
5
use32
6
	org	0x0
6
	org	0x0
7
	db	'MENUET01'
7
	db	'MENUET01'
8
	dd	0x1
8
	dd	0x1
9
	dd	START
9
	dd	START
10
	dd	I_END
10
	dd	I_END
11
	dd	(I_END+200+13*N*N) and not 3
11
	dd	E_END
12
	dd	(I_END+200+13*N*N) and not 3
12
	dd	E_END
13
	dd	0x0,0x0
13
	dd	0x0,0x0
14
 
14
 
15
include '../../../macros.inc'
15
include '../../../macros.inc'
16
include 'lang.inc'
16
include 'lang.inc'
17
 
17
 
18
AttackFactor dw 1	; Importance of attack (1..16)
18
AttackFactor dw 1	; Importance of attack (1..16)
19
 
19
 
20
START:
20
START:
21
 
21
 
22
	mcall	40,0x80000027
22
	mcall	40,0x80000027
23
	mcall	3
23
	mcall	3
24
	mov	[rsx1],ax
24
	mov	[rsx1],ax
25
	shr	eax,16
25
	shr	eax,16
26
	mov	[rsx2],ax
26
	mov	[rsx2],ax
27
 
27
 
28
redraw_all:
28
redraw_all:
29
	mcall	9,proc_info,-1
29
	mcall	9,proc_info,-1
30
	test	[proc_info.wnd_state], 0x04		; is rolled_up?
30
	test	[proc_info.wnd_state], 0x04		; is rolled_up?
31
	jz	@f
31
	jz	@f
32
	mcall	0,100*65536+(16*N+12),,0x34FFFFFF,,title
32
	mcall	0,100*65536+(16*N+12),,0x34FFFFFF,,title
33
	jmp	still
33
	jmp	still
34
  @@:
34
  @@:
35
	mcall	12,1
35
	mcall	12,1
36
	mcall	48,4
36
	mcall	48,4
37
	xchg	eax,ecx
37
	xchg	eax,ecx
38
	add	ecx,100*65536+(16*N+26)
38
	add	ecx,100*65536+(16*N+26)
39
	mcall	0,100*65536+(16*N+12),,0x34FFFFFF,,title
39
	mcall	0,<100,16*N+12>,,0x34FFFFFF,,title
40
	mcall	38,2*65536+(16*N),20*65536+20,0x00a0a0a0;000000
40
	mcall	38,<2,16*N>,<20,20>,0x00a0a0a0;000000
41
	mov	edi,N
41
	mov	edi,N
42
  @@:	add	ecx,16*65536+16
42
  @@:	add	ecx,16*65536+16
43
	mcall
43
	mcall
44
	dec	edi
44
	dec	edi
45
	jnz	@b
45
	jnz	@b
46
	push	cx
46
	push	cx
47
	mov	ecx,20*65536
47
	mov	ecx,20*65536
48
	pop	cx
48
	pop	cx
49
	mcall	,1*65536+1
49
	mcall	,1*65536+1
50
	mov	edi,N
50
	mov	edi,N
51
  @@:	add	ebx,16*65536+16
51
  @@:	add	ebx,16*65536+16
52
	mcall
52
	mcall
53
	dec	edi
53
	dec	edi
54
	jnz	@b
54
	jnz	@b
55
 
55
 
56
	mcall	8,3*65536+40,3*65536+12,2,0xFFFFFF
56
	mcall	8,3*65536+40,3*65536+12,2,0xFFFFFF
57
	mcall	,50*65536+40,,3,
57
	mcall	,50*65536+40,,3,
58
	mcall	4,7*65536+5,0x80000000,txt_buttons
58
	mcall	4,7*65536+5,0x80000000,txt_buttons
59
	mcall	12,2
59
	mcall	12,2
60
 
60
 
61
 
61
 
62
draw_pole:
62
draw_pole:
63
;	mcall	48,4
63
;	mcall	48,4
64
;	xchg	eax,ecx
64
;	xchg	eax,ecx
65
;	add	ecx,100*65536+(16*N+26)
65
;	add	ecx,100*65536+(16*N+26)
66
;	mcall	0,100*65536+(16*N+12),,0x74FFFFFF,,title
66
;	mcall	0,100*65536+(16*N+12),,0x74FFFFFF,,title
67
 
67
 
68
	mov	esi,Board
68
	mov	esi,Board
69
	mov	edi,N*N-N
69
	mov	edi,N*N-N
70
	mov	ebp,N
70
	mov	ebp,N
71
	mov	ebx,(1+5)*65536+(21+5-1)
71
	mov	ebx,(1+5)*65536+(21+5-1)
72
	call	print_board
72
	call	print_board
73
	bt	[flags],0
73
	bt	[flags],0
74
	jnc	@f
74
	jnc	@f
75
	mcall	4,100*65536+6,0x800000ff,txt_go
75
	mcall	4,100*65536+6,0x800000ff,txt_go
76
@@:	bt	[flags],3
76
@@:	bt	[flags],3
77
	jnc	@f
77
	jnc	@f
78
	mcall	4,100*65536+6,0x800000ff,txt_tie
78
	mcall	4,100*65536+6,0x800000ff,txt_tie
79
	jmp	still
79
	jmp	still
80
@@:
80
@@:
81
	bt	[flags],2
81
	bt	[flags],2
82
	jnc	still
82
	jnc	still
83
	ret
83
	ret
84
still:
84
still:
85
	mcall	10
85
	mcall	10
86
 
86
 
87
	dec	al
87
	dec	al
88
	jz	redraw_all
88
	jz	redraw_all
89
	dec	al
89
	dec	al
90
	jz	key
90
	jz	key
91
	dec	al
91
	dec	al
92
	jz	button
92
	jz	button
93
	sub	al,3
93
	sub	al,3
94
	jz	mouse
94
	jz	mouse
95
	jmp	still
95
	jmp	still
96
 
96
 
97
key:
97
key:
98
	mcall	2
98
	mcall	2
99
	btr	[flags],2
99
	btr	[flags],2
100
	cmp	ah,97
100
	cmp	ah,97
101
	jne	@f
101
	jne	@f
102
.auto:	bts	[flags],2
102
.auto:	bts	[flags],2
103
	jmp	mouse.auto
103
	jmp	mouse.auto
104
@@:	cmp	ah,110
104
@@:	cmp	ah,110
105
	je	button.new_game
105
	je	button.new_game
106
	jmp	still
106
	jmp	still
107
 
107
 
108
button:
108
button:
109
	mcall	17
109
	mcall	17
110
	cmp	ah,1
110
	cmp	ah,1
111
	jne	@f
111
	jne	@f
112
	mcall	-1
112
	mcall	-1
113
@@:	cmp	ah,2
113
@@:	cmp	ah,2
114
	jne	key.auto
114
	jne	key.auto
115
.new_game:
115
.new_game:
116
	mov	[TotalLines],2 * 2 * (N * (N - 4) + (N - 4) * (N - 4))
116
	mov	[TotalLines],2 * 2 * (N * (N - 4) + (N - 4) * (N - 4))
117
	mov	[WinningLine],0x0
117
	mov	[WinningLine],0x0
118
	mov	[X],(N + 1)/2
118
	mov	[X],(N + 1)/2
119
	mov	[Y],(N + 1)/2
119
	mov	[Y],(N + 1)/2
120
	mov	[flags],0
120
	mov	[flags],0
121
	mov	edi,Board
121
	mov	edi,Board
122
	mov	ecx,(13*N*N/4)+1
122
	mov	ecx,(13*N*N/4)+1
123
	xor	eax,eax
123
	xor	eax,eax
124
	cld
124
	cld
125
@@:	stosd
125
@@:	stosd
126
	loop	@b
126
	loop	@b
127
	jmp	redraw_all
127
	jmp	redraw_all
128
 
128
 
129
print_board:
129
print_board:
130
	cmp	byte [esi],0	;ïóñòî
130
	cmp	byte [esi],0	;ïóñòî
131
	je	.null
131
	je	.null
132
	cmp	byte [esi],1	;X
132
	cmp	byte [esi],1	;X
133
	je	.one
133
	je	.one
134
	cmp	byte [esi],2	;O
134
	cmp	byte [esi],2	;O
135
	je	.two
135
	je	.two
136
	bts	[flags],4
136
	bts	[flags],4
137
	cmp	byte [esi],3	;Õ âûèãðàë
137
	cmp	byte [esi],3	;Õ âûèãðàë
138
	je	.one
138
	je	.one
139
	jmp	.two		;0 âûèãðàë
139
	jmp	.two		;0 âûèãðàë
140
 
140
 
141
.end:
141
.end:
142
	inc	esi
142
	inc	esi
143
	dec	ebp
143
	dec	ebp
144
	jnz	print_board
144
	jnz	print_board
145
	test	edi,edi
145
	test	edi,edi
146
	jz	@f
146
	jz	@f
147
	sub	edi,N
147
	sub	edi,N
148
	mov	ebp,N
148
	mov	ebp,N
149
	add	ebx,-N*16*65536+16
149
	add	ebx,-N*16*65536+16
150
	jmp	print_board
150
	jmp	print_board
151
@@:	ret
151
@@:	ret
152
 
152
 
153
.one:
153
.one:
154
	mov	ecx,0xd04ba010
154
	mov	[pic_plt+4],0x4ba010
155
	bt	[flags],4
-
 
156
	jnc	@f
-
 
157
	mov	ecx,0xd0ff0000
-
 
158
	btr	[flags],4
155
	btr	[flags],4
-
 
156
	jnc	@f
-
 
157
	mov	[pic_plt+4],0xff0000
159
@@:	push	edi
158
@@:	pushad
-
 
159
	mov	edx, ebx
160
	mcall	4,,,txt_x,,0xffffff
160
	mcall	65,pic_x,<7,7>,,1,pic_plt, 0
161
	pop	edi
161
	popad
162
.null:
162
.null:
163
	add	ebx,16*65536;+16
163
	add	ebx,16*65536;+16
164
	jmp	.end
164
	jmp	.end
165
.two:
165
.two:
166
	mov	ecx,0xd000459a
166
	mov	[pic_plt+4],0x00459a
167
	bt	[flags],4
-
 
168
	jnc	@f
-
 
169
	mov	ecx,0xd0ff0000
-
 
170
	btr	[flags],4
167
	btr	[flags],4
-
 
168
	jnc	@f
-
 
169
	mov	[pic_plt+4],0xff0000
171
@@:	push	edi
170
@@:	pushad
-
 
171
	mov	edx, ebx
172
	mcall	4,,,txt_o,,0xffffff
172
	mcall	65,pic_o,<7,7>,,1,pic_plt, 0
173
	pop	edi
173
	popad
174
	jmp	.null
174
	jmp	.null
175
 
175
 
176
 
176
 
177
draw_one_symbol:
177
draw_one_symbol:
178
	movzx	eax,[X]
178
	movzx	eax,[X]
179
	mov	ebx,16
179
	mov	ebx,16
180
	mul	ebx
180
	mul	ebx
181
	shl	eax,16
181
	shl	eax,16
182
	add	eax,(1+5)*65536;
182
	add	eax,(1+5)*65536;
183
	mov	ax,[Y]
183
	mov	ax,[Y]
184
	mov	ecx,16
184
	mov	ecx,16
185
	mul	cx
185
	mul	cx
186
	add	ax,(21+5-1)
186
	add	ax,(21+5-1)
187
	xchg	eax,ebx
187
	xchg	eax,ebx
188
 
188
 
189
	movzx	eax,[Y]
189
	movzx	eax,[Y]
190
	push	ebx
190
	push	ebx
191
	mov	ebx,N
191
	mov	ebx,N
192
	mul	bx
192
	mul	bx
193
	mov	bx,[X]
193
	mov	bx,[X]
194
	add	ax,bx
194
	add	ax,bx
195
	pop	ebx
195
	pop	ebx
196
	mov	esi,Board
196
	mov	esi,Board
197
	add	esi,eax
197
	add	esi,eax
198
	mov	edi,0
198
	mov	edi,0
199
	mov	ebp,1
199
	mov	ebp,1
200
	call	print_board
200
	call	print_board
201
ret
201
ret
202
 
202
 
203
 
203
 
204
mouse:
204
mouse:
205
	bt	[flags],5
205
	bt	[flags],5
206
	jc	still
206
	jc	still
207
	mcall	37,2
207
	mcall	37,2
208
	test	eax,eax
208
	test	eax,eax
209
	jz	still
209
	jz	still
210
	mcall	37,1
210
	mcall	37,1
211
	mov	dx,ax
211
	mov	dx,ax
212
	shr	eax,16
212
	shr	eax,16
213
	cmp	dx,20
213
	cmp	dx,20
214
	jbe	still
214
	jbe	still
215
	cmp	dx,(16*N+20)
215
	cmp	dx,(16*N+20)
216
	jge	still
216
	jge	still
217
	cmp	ax,1
217
	cmp	ax,1
218
	jbe	still
218
	jbe	still
219
	cmp	ax,(16*N)
219
	cmp	ax,(16*N)
220
	jge	still
220
	jge	still
221
 
221
 
222
	bt	[flags],0
222
	bt	[flags],0
223
	jc	still
223
	jc	still
224
	bt	[flags],3
224
	bt	[flags],3
225
	jc	still
225
	jc	still
226
	sub	ax,1
226
	sub	ax,1
227
	push	dx
227
	push	dx
228
	xor	edx,edx
228
	xor	edx,edx
229
	mov	cx,16
229
	mov	cx,16
230
	div	cx
230
	div	cx
231
	pop	dx
231
	pop	dx
232
	mov	[X],ax
232
	mov	[X],ax
233
	push	ax
233
	push	ax
234
	sub	dx,20
234
	sub	dx,20
235
	mov	ax,dx
235
	mov	ax,dx
236
	xor	dx,dx
236
	xor	dx,dx
237
	div	cx
237
	div	cx
238
	mov	[Y],ax
238
	mov	[Y],ax
239
	xor	dx,dx
239
	xor	dx,dx
240
	mov	cx,N
240
	mov	cx,N
241
	mul	cx
241
	mul	cx
242
	pop	dx
242
	pop	dx
243
	add	ax,dx
243
	add	ax,dx
244
	cmp	ax,N*N
244
	cmp	ax,N*N
245
	jge	still
245
	jge	still
246
	mov	esi,Board
246
	mov	esi,Board
247
 
247
 
248
	cmp	byte [esi+eax],0
248
	cmp	byte [esi+eax],0
249
	jne	still
249
	jne	still
250
 
250
 
251
.auto:	bt	[flags],0
251
.auto:	bt	[flags],0
252
	jc	.end
252
	jc	.end
253
	bt	[flags],3
253
	bt	[flags],3
254
	jc	.end
254
	jc	.end
255
 
255
 
256
	btr	[flags],1	;0 - 室 ¤¥« ¥â ¨£à®ª
256
	btr	[flags],1	;0 - 室 ¤¥« ¥â ¨£à®ª
257
	bt	[flags],2
257
	bt	[flags],2
258
	jnc	@f
258
	jnc	@f
259
	call	FindMove
259
	call	FindMove
260
@@:	call	MakeMove
260
@@:	call	MakeMove
261
	call	draw_one_symbol
261
	call	draw_one_symbol
262
	bt	[flags],0
262
	bt	[flags],0
263
	jc	.end
263
	jc	.end
264
 
264
 
265
	bts	[flags],1	;1 - 室 ¤¥« ¥â cpu
265
	bts	[flags],1	;1 - 室 ¤¥« ¥â cpu
266
	call	FindMove
266
	call	FindMove
267
	call	MakeMove
267
	call	MakeMove
268
	call	draw_one_symbol
268
	call	draw_one_symbol
269
.end:	bt	[flags],0
269
.end:	bt	[flags],0
270
	jnc	@f
270
	jnc	@f
271
	call	BlinkRow
271
	call	BlinkRow
272
	btr	[flags],2
272
	btr	[flags],2
273
@@:;	mcall	12,1
273
@@:;	mcall	12,1
274
	bt	[flags],3
274
	bt	[flags],3
275
	jc	@f
275
	jc	@f
276
	bt	[flags],2
276
	bt	[flags],2
277
	jnc	@f
277
	jnc	@f
278
	call	draw_pole
278
	call	draw_pole
279
	jmp	.auto
279
	jmp	.auto
280
@@:	jmp	draw_pole
280
@@:	jmp	draw_pole
281
 
281
 
282
 
282
 
283
 
283
 
284
 
284
 
285
winline: dw 1,0, 1,1, 1,-1, 0,1  ;X,Y
285
winline: dw 1,0, 1,1, 1,-1, 0,1  ;X,Y
286
BlinkRow:
286
BlinkRow:
287
	movzx	ecx,[WinningLine]
287
	movzx	ecx,[WinningLine]
288
	mov	eax,[winline+(ecx-1)*4]
288
	mov	eax,[winline+(ecx-1)*4]
289
	push	ax	;Dx
289
	push	ax	;Dx
290
	shr	eax,16
290
	shr	eax,16
291
	push	ax	;Dy
291
	push	ax	;Dy
292
	movzx	eax,[Y]
292
	movzx	eax,[Y]
293
	mov	si,N
293
	mov	si,N
294
	mul	si
294
	mul	si
295
	add	ax,[X]
295
	add	ax,[X]
296
	mov	cl,[Board+eax]
296
	mov	cl,[Board+eax]
297
@@:	movzx	eax,[Y]
297
@@:	movzx	eax,[Y]
298
	add	ax,[esp]
298
	add	ax,[esp]
299
	mov	[Y],ax
299
	mov	[Y],ax
300
	test	eax,eax
300
	test	eax,eax
301
	jz	.ret
301
	jz	.ret
302
	cmp	eax,N-1
302
	cmp	eax,N-1
303
	jg	.ret
303
	jg	.ret
304
	movzx	ebx,[X]
304
	movzx	ebx,[X]
305
	add	bx,[esp+2]
305
	add	bx,[esp+2]
306
	mov	[X],bx
306
	mov	[X],bx
307
	test	ebx,ebx
307
	test	ebx,ebx
308
	jz	.ret
308
	jz	.ret
309
	cmp	ebx,N-1
309
	cmp	ebx,N-1
310
	jg	.ret
310
	jg	.ret
311
	mov	si,N
311
	mov	si,N
312
	mul	si
312
	mul	si
313
	add	ax,bx
313
	add	ax,bx
314
	cmp	byte [Board+eax],cl
314
	cmp	byte [Board+eax],cl
315
	je	@b
315
	je	@b
316
 
316
 
317
.ret:	mov	edi,5
317
.ret:	mov	edi,5
318
	mov	esi,N
318
	mov	esi,N
319
@@:	movzx	eax,[Y]
319
@@:	movzx	eax,[Y]
320
	sub	ax,[esp]
320
	sub	ax,[esp]
321
	mov	[Y],ax
321
	mov	[Y],ax
322
	mul	si
322
	mul	si
323
	movzx	ebx,[X]
323
	movzx	ebx,[X]
324
	sub	bx,[esp+2]
324
	sub	bx,[esp+2]
325
	mov	[X],bx
325
	mov	[X],bx
326
	add	ax,bx
326
	add	ax,bx
327
	cmp	byte [Board+eax],cl
327
	cmp	byte [Board+eax],cl
328
	jne	.1
328
	jne	.1
329
	add	byte [Board+eax],2
329
	add	byte [Board+eax],2
330
.1:	dec	edi
330
.1:	dec	edi
331
	jnz	@b
331
	jnz	@b
332
	add	esp,4
332
	add	esp,4
333
ret
333
ret
334
 
334
 
335
 
335
 
336
 
336
 
337
Max dw ?
337
Max dw ?
338
 
338
 
339
FindMove:
339
FindMove:
340
	mov	[Max],0
340
	mov	[Max],0
341
	mov	[X],((N+1) / 2)
341
	mov	[X],((N+1) / 2)
342
	mov	[Y],((N+1) / 2)
342
	mov	[Y],((N+1) / 2)
343
	movzx	eax,[Y]
343
	movzx	eax,[Y]
344
	mov	ah,N
344
	mov	ah,N
345
	mul	ah
345
	mul	ah
346
	add	ax,[X]
346
	add	ax,[X]
347
	cmp	byte [Board+eax],0
347
	cmp	byte [Board+eax],0
348
	jne	@f
348
	jne	@f
349
	mov	[Max],4
349
	mov	[Max],4
350
@@:	xor	ecx,ecx
350
@@:	xor	ecx,ecx
351
.loop:
351
.loop:
352
	cmp	byte [Board+ecx],0
352
	cmp	byte [Board+ecx],0
353
	jne	.check_loop
353
	jne	.check_loop
354
		movzx	eax, word [Value+ecx*2]
354
		movzx	eax, word [Value+ecx*2]
355
		bt	[flags],1
355
		bt	[flags],1
356
		jc	@f
356
		jc	@f
357
		movzx	eax, word [Value+(N*N+ecx)*2]
357
		movzx	eax, word [Value+(N*N+ecx)*2]
358
		@@:
358
		@@:
359
		mov	ebx,16
359
		mov	ebx,16
360
		add	bx,[AttackFactor]
360
		add	bx,[AttackFactor]
361
		mul	bx
361
		mul	bx
362
		shr	eax,4 ;div 16
362
		shr	eax,4 ;div 16
363
		mov	bx,[Value+2*(N*N+ecx)]
363
		mov	bx,[Value+2*(N*N+ecx)]
364
		bt	[flags],1
364
		bt	[flags],1
365
		jc	@f
365
		jc	@f
366
		mov	bx,[Value+2*(ecx)]
366
		mov	bx,[Value+2*(ecx)]
367
		@@:
367
		@@:
368
		add	bx,ax
368
		add	bx,ax
369
		mov	eax,4
369
		mov	eax,4
370
		call	random
370
		call	random
371
		add	bx,ax
371
		add	bx,ax
372
		cmp	bx,[Max]
372
		cmp	bx,[Max]
373
		jbe	.check_loop
373
		jbe	.check_loop
374
			mov	[Max],bx
374
			mov	[Max],bx
375
			xor	edx,edx
375
			xor	edx,edx
376
			mov	eax,ecx
376
			mov	eax,ecx
377
			mov	ebx,N
377
			mov	ebx,N
378
			div	ebx
378
			div	ebx
379
			mov	[X],dx
379
			mov	[X],dx
380
			mov	[Y],ax
380
			mov	[Y],ax
381
.check_loop:
381
.check_loop:
382
	inc	ecx
382
	inc	ecx
383
	cmp	ecx,N*N
383
	cmp	ecx,N*N
384
	jb	.loop
384
	jb	.loop
385
ret
385
ret
386
 
386
 
387
 
387
 
388
MakeMove:
388
MakeMove:
389
	xor	eax,eax
389
	xor	eax,eax
390
	mov	esi,N
390
	mov	esi,N
391
 
391
 
392
.1:	movzx	ecx,[X] ;ecx=X1, eax=K, edx=Y1
392
.1:	movzx	ecx,[X] ;ecx=X1, eax=K, edx=Y1
393
	inc	cl
393
	inc	cl
394
	movzx	edx,[Y]
394
	movzx	edx,[Y]
395
	inc	dl
395
	inc	dl
396
	sub	cl,al
396
	sub	cl,al
397
	xor	edi,edi
397
	xor	edi,edi
398
	test	ecx,ecx
398
	test	ecx,ecx
399
	jz	.1_
399
	jz	.1_
400
	cmp	ecx,N-4
400
	cmp	ecx,N-4
401
	jg	.1_
401
	jg	.1_
402
		dec	cl
402
		dec	cl
403
		dec	dl
403
		dec	dl
404
		push	eax edx
404
		push	eax edx
405
		mov	eax,edx
405
		mov	eax,edx
406
		mul	esi
406
		mul	esi
407
		add	eax,ecx
407
		add	eax,ecx
408
		call	.Add
408
		call	.Add
409
		bt	[flags],0
409
		bt	[flags],0
410
		jnc	.11
410
		jnc	.11
411
		cmp	[WinningLine],0x0
411
		cmp	[WinningLine],0x0
412
		jne	.11
412
		jne	.11
413
		mov	[WinningLine],1
413
		mov	[WinningLine],1
414
	.11:	mov	eax,[esp];edx
414
	.11:	mov	eax,[esp];edx
415
		mul	esi
415
		mul	esi
416
		add	eax,ecx
416
		add	eax,ecx
417
		push	eax
417
		push	eax
418
		mov	eax,[esp+4];edx
418
		mov	eax,[esp+4];edx
419
		mul	esi
419
		mul	esi
420
		add	eax,edi
420
		add	eax,edi
421
		add	eax,ecx
421
		add	eax,ecx
422
		mov	ebx,eax
422
		mov	ebx,eax
423
		pop	eax
423
		pop	eax
424
		call	.Update
424
		call	.Update
425
		inc	edi
425
		inc	edi
426
		cmp	edi,4
426
		cmp	edi,4
427
		jbe	.11
427
		jbe	.11
428
		pop	edx eax
428
		pop	edx eax
429
.1_:	inc	eax
429
.1_:	inc	eax
430
	cmp	eax,4
430
	cmp	eax,4
431
	jbe	.1
431
	jbe	.1
432
 
432
 
433
	xor	eax,eax
433
	xor	eax,eax
434
 
434
 
435
.2:	movzx	ecx,[X]
435
.2:	movzx	ecx,[X]
436
	inc	cl
436
	inc	cl
437
	movzx	edx,[Y]
437
	movzx	edx,[Y]
438
	inc	dl
438
	inc	dl
439
	xor	edi,edi
439
	xor	edi,edi
440
	sub	cl,al
440
	sub	cl,al
441
	sub	dl,al
441
	sub	dl,al
442
	test	ecx,ecx
442
	test	ecx,ecx
443
	jz	.2_
443
	jz	.2_
444
	cmp	ecx,N-4
444
	cmp	ecx,N-4
445
	jg	.2_
445
	jg	.2_
446
	test	edx,edx
446
	test	edx,edx
447
	jz	.2_
447
	jz	.2_
448
	cmp	edx,N-4
448
	cmp	edx,N-4
449
	jg	.2_
449
	jg	.2_
450
		dec	cl
450
		dec	cl
451
		dec	dl
451
		dec	dl
452
		push	eax edx
452
		push	eax edx
453
		mov	eax,edx
453
		mov	eax,edx
454
		mul	esi
454
		mul	esi
455
		add	eax,ecx
455
		add	eax,ecx
456
		add	eax,1*N*N
456
		add	eax,1*N*N
457
		call	.Add
457
		call	.Add
458
		bt	[flags],0
458
		bt	[flags],0
459
		jnc	.21
459
		jnc	.21
460
		cmp	[WinningLine],0x0
460
		cmp	[WinningLine],0x0
461
		jne	.21
461
		jne	.21
462
		mov	[WinningLine],2
462
		mov	[WinningLine],2
463
	.21:	mov	eax,[esp];edx
463
	.21:	mov	eax,[esp];edx
464
		mul	esi
464
		mul	esi
465
		add	eax,ecx
465
		add	eax,ecx
466
		add	eax,1*N*N
466
		add	eax,1*N*N
467
		push	eax
467
		push	eax
468
		mov	eax,[esp+4];edx
468
		mov	eax,[esp+4];edx
469
		add	eax,edi
469
		add	eax,edi
470
		mul	esi
470
		mul	esi
471
		add	eax,edi
471
		add	eax,edi
472
		add	eax,ecx
472
		add	eax,ecx
473
		mov	ebx,eax
473
		mov	ebx,eax
474
		pop	eax
474
		pop	eax
475
		call	.Update
475
		call	.Update
476
		inc	edi
476
		inc	edi
477
		cmp	edi,4
477
		cmp	edi,4
478
		jbe	.21
478
		jbe	.21
479
		pop	edx eax
479
		pop	edx eax
480
.2_:	inc	eax
480
.2_:	inc	eax
481
	cmp	eax,4
481
	cmp	eax,4
482
	jbe	.2
482
	jbe	.2
483
 
483
 
484
	xor	eax,eax
484
	xor	eax,eax
485
 
485
 
486
.3:	movzx	ecx,[X]
486
.3:	movzx	ecx,[X]
487
	inc	cl
487
	inc	cl
488
	movzx	edx,[Y]
488
	movzx	edx,[Y]
489
	inc	dl
489
	inc	dl
490
	xor	edi,edi
490
	xor	edi,edi
491
	add	cl,al
491
	add	cl,al
492
	sub	dl,al
492
	sub	dl,al
493
	cmp	ecx,5
493
	cmp	ecx,5
494
	jb	.3_
494
	jb	.3_
495
	cmp	ecx,N
495
	cmp	ecx,N
496
	jg	.3_
496
	jg	.3_
497
	test	edx,edx
497
	test	edx,edx
498
	jz	.3_
498
	jz	.3_
499
	cmp	edx,N-4
499
	cmp	edx,N-4
500
	jg	.3_
500
	jg	.3_
501
		dec	cl
501
		dec	cl
502
		dec	dl
502
		dec	dl
503
		push	eax edx
503
		push	eax edx
504
		mov	eax,edx
504
		mov	eax,edx
505
		mul	esi
505
		mul	esi
506
		add	eax,ecx
506
		add	eax,ecx
507
		add	eax,3*N*N
507
		add	eax,3*N*N
508
		call	.Add
508
		call	.Add
509
		bt	[flags],0
509
		bt	[flags],0
510
		jnc	.31
510
		jnc	.31
511
		cmp	[WinningLine],0
511
		cmp	[WinningLine],0
512
		jne	.31
512
		jne	.31
513
		mov	[WinningLine],3
513
		mov	[WinningLine],3
514
	.31:	mov	eax,[esp];edx
514
	.31:	mov	eax,[esp];edx
515
		mul	esi
515
		mul	esi
516
		add	eax,ecx
516
		add	eax,ecx
517
		add	eax,3*N*N
517
		add	eax,3*N*N
518
		push	eax
518
		push	eax
519
		mov	eax,[esp+4];edx
519
		mov	eax,[esp+4];edx
520
		add	eax,edi
520
		add	eax,edi
521
		mul	esi
521
		mul	esi
522
		add	eax,ecx
522
		add	eax,ecx
523
		sub	eax,edi
523
		sub	eax,edi
524
		mov	ebx,eax
524
		mov	ebx,eax
525
		pop	eax
525
		pop	eax
526
		call	.Update
526
		call	.Update
527
		inc	edi
527
		inc	edi
528
		cmp	edi,4
528
		cmp	edi,4
529
		jbe	.31
529
		jbe	.31
530
		pop	edx eax
530
		pop	edx eax
531
.3_:	inc	eax
531
.3_:	inc	eax
532
	cmp	eax,4
532
	cmp	eax,4
533
	jbe	.3
533
	jbe	.3
534
 
534
 
535
	xor	eax,eax
535
	xor	eax,eax
536
 
536
 
537
.4:	movzx	ecx,[X]
537
.4:	movzx	ecx,[X]
538
	inc	cl
538
	inc	cl
539
	movzx	edx,[Y]
539
	movzx	edx,[Y]
540
	inc	dl
540
	inc	dl
541
	xor	edi,edi
541
	xor	edi,edi
542
	sub	dl,al
542
	sub	dl,al
543
	test	edx,edx
543
	test	edx,edx
544
	jz	.4_
544
	jz	.4_
545
	cmp	edx,N-4
545
	cmp	edx,N-4
546
	jg	.4_
546
	jg	.4_
547
		dec	cl
547
		dec	cl
548
		dec	dl
548
		dec	dl
549
		push	eax edx
549
		push	eax edx
550
		mov	eax,edx
550
		mov	eax,edx
551
		mul	esi
551
		mul	esi
552
		add	eax,ecx
552
		add	eax,ecx
553
		add	eax,2*N*N
553
		add	eax,2*N*N
554
		call	.Add
554
		call	.Add
555
		bt	[flags],0
555
		bt	[flags],0
556
		jnc	.41
556
		jnc	.41
557
		cmp	[WinningLine],0
557
		cmp	[WinningLine],0
558
		jne	.41
558
		jne	.41
559
		mov	[WinningLine],4
559
		mov	[WinningLine],4
560
	.41:	mov	eax,[esp];edx
560
	.41:	mov	eax,[esp];edx
561
		mul	esi
561
		mul	esi
562
		add	eax,ecx
562
		add	eax,ecx
563
		add	eax,2*N*N
563
		add	eax,2*N*N
564
		push	eax
564
		push	eax
565
		mov	eax,[esp+4];edx
565
		mov	eax,[esp+4];edx
566
		add	eax,edi
566
		add	eax,edi
567
		mul	esi
567
		mul	esi
568
		add	eax,ecx
568
		add	eax,ecx
569
		mov	ebx,eax
569
		mov	ebx,eax
570
		pop	eax
570
		pop	eax
571
		call	.Update
571
		call	.Update
572
		inc	edi
572
		inc	edi
573
		cmp	edi,4
573
		cmp	edi,4
574
		jbe	.41
574
		jbe	.41
575
		pop	edx eax
575
		pop	edx eax
576
.4_:	inc	eax
576
.4_:	inc	eax
577
	cmp	eax,4
577
	cmp	eax,4
578
	jbe	.4
578
	jbe	.4
579
 
579
 
580
	movzx	eax,[Y]
580
	movzx	eax,[Y]
581
	mul	esi
581
	mul	esi
582
	add	ax,[X]
582
	add	ax,[X]
583
	bt	[flags],1
583
	bt	[flags],1
584
	jc	@f
584
	jc	@f
585
	mov	byte [Board+eax],1
585
	mov	byte [Board+eax],1
586
	jmp	.end
586
	jmp	.end
587
@@:
587
@@:
588
	mov	byte [Board+eax],2
588
	mov	byte [Board+eax],2
589
.end:	cmp	[TotalLines],0
589
.end:	cmp	[TotalLines],0
590
	jne	@f
590
	jne	@f
591
	bts	[flags],3
591
	bts	[flags],3
592
@@:
592
@@:
593
ret
593
ret
594
 
594
 
595
.Add:
595
.Add:
596
	bt	[flags],1
596
	bt	[flags],1
597
	jnc	.Add_player
597
	jnc	.Add_player
598
	inc	byte [Line+eax]
598
	inc	byte [Line+eax]
599
	cmp	byte [Line+eax],1
599
	cmp	byte [Line+eax],1
600
	jne	@f
600
	jne	@f
601
		dec	[TotalLines]
601
		dec	[TotalLines]
602
@@:	cmp	byte [Line+eax],5
602
@@:	cmp	byte [Line+eax],5
603
	jb	@f
603
	jb	@f
604
	bts	[flags],0	;¨£à  ®ª®­ç¥­ 
604
	bts	[flags],0	;¨£à  ®ª®­ç¥­ 
605
@@:
605
@@:
606
ret
606
ret
607
.Add_player:
607
.Add_player:
608
	inc	byte [Line+eax+4*N*N]
608
	inc	byte [Line+eax+4*N*N]
609
	cmp	byte [Line+eax+4*N*N],1
609
	cmp	byte [Line+eax+4*N*N],1
610
	jne	@f
610
	jne	@f
611
		dec	[TotalLines]
611
		dec	[TotalLines]
612
@@:	cmp	byte [Line+eax+4*N*N],5
612
@@:	cmp	byte [Line+eax+4*N*N],5
613
	jb	@f
613
	jb	@f
614
	bts	[flags],0	;¨£à  ®ª®­ç¥­ 
614
	bts	[flags],0	;¨£à  ®ª®­ç¥­ 
615
@@:
615
@@:
616
ret
616
ret
617
 
617
 
618
.Update:
618
.Update:
619
;eax ¯¥à¢ë© ¯ à ¬¥âà, ebx ¢â®à®©
619
;eax ¯¥à¢ë© ¯ à ¬¥âà, ebx ¢â®à®©
620
	push	edi
620
	push	edi
621
	bt	[flags],1
621
	bt	[flags],1
622
	jnc	.Update_player
622
	jnc	.Update_player
623
	cmp	byte [Line+eax+4*N*N],0
623
	cmp	byte [Line+eax+4*N*N],0
624
	jne	.else_cpu
624
	jne	.else_cpu
625
		push	eax
625
		push	eax
626
		movzx	edi, byte [Line+eax]
626
		movzx	edi, byte [Line+eax]
627
		mov	ax, word [edi*2+2+Weight]
627
		mov	ax, word [edi*2+2+Weight]
628
		sub	ax, word [edi*2+Weight]
628
		sub	ax, word [edi*2+Weight]
629
		add	[Value+ebx*2],ax
629
		add	[Value+ebx*2],ax
630
		pop	eax
630
		pop	eax
631
	jmp	.Update_end
631
	jmp	.Update_end
632
	.else_cpu:
632
	.else_cpu:
633
	cmp	byte [Line+eax],1
633
	cmp	byte [Line+eax],1
634
	jne	.Update_end
634
	jne	.Update_end
635
		push	eax
635
		push	eax
636
		movzx	edi, byte [Line+eax+4*N*N]
636
		movzx	edi, byte [Line+eax+4*N*N]
637
		mov	ax, word [edi*2+2+Weight]
637
		mov	ax, word [edi*2+2+Weight]
638
		sub	[Value+ebx*2+N*N*2],ax
638
		sub	[Value+ebx*2+N*N*2],ax
639
		pop	eax
639
		pop	eax
640
	jmp	.Update_end
640
	jmp	.Update_end
641
.Update_player:
641
.Update_player:
642
	cmp	byte [Line+eax],0
642
	cmp	byte [Line+eax],0
643
	jne	.else_player
643
	jne	.else_player
644
		push	eax
644
		push	eax
645
		movzx	edi, byte [Line+eax+4*N*N]
645
		movzx	edi, byte [Line+eax+4*N*N]
646
		mov	ax, word [edi*2+2+Weight]
646
		mov	ax, word [edi*2+2+Weight]
647
		mov	di, word [edi*2+Weight]
647
		mov	di, word [edi*2+Weight]
648
		sub	ax,di
648
		sub	ax,di
649
		add	[Value+ebx*2+2*N*N],ax
649
		add	[Value+ebx*2+2*N*N],ax
650
		pop	eax
650
		pop	eax
651
	jmp	.Update_end
651
	jmp	.Update_end
652
	.else_player:
652
	.else_player:
653
	cmp	byte [Line+eax+4*N*N],1
653
	cmp	byte [Line+eax+4*N*N],1
654
	jne	.Update_end
654
	jne	.Update_end
655
		push	eax
655
		push	eax
656
		movzx	edi, byte [Line+eax]
656
		movzx	edi, byte [Line+eax]
657
		mov	ax, word [edi*2+2+Weight]
657
		mov	ax, word [edi*2+2+Weight]
658
		sub	[Value+ebx*2],ax
658
		sub	[Value+ebx*2],ax
659
		pop	eax
659
		pop	eax
660
.Update_end:
660
.Update_end:
661
	pop	edi
661
	pop	edi
662
ret
662
ret
663
 
663
 
664
 
664
 
665
align 4
665
align 4
666
rsx1 dw ?;0x4321
666
rsx1 dw ?;0x4321
667
rsx2 dw ?;0x1234
667
rsx2 dw ?;0x1234
668
random: 	; ¨§ ASCL
668
random: 	; ¨§ ASCL
669
	push ecx ebx edi edx
669
	push ecx ebx edi edx
670
	mov cx,ax
670
	mov cx,ax
671
	mov ax,[rsx1]
671
	mov ax,[rsx1]
672
	mov bx,[rsx2]
672
	mov bx,[rsx2]
673
	mov si,ax
673
	mov si,ax
674
	mov di,bx
674
	mov di,bx
675
	mov dl,ah
675
	mov dl,ah
676
	mov ah,al
676
	mov ah,al
677
	mov al,bh
677
	mov al,bh
678
	mov bh,bl
678
	mov bh,bl
679
	xor bl,bl
679
	xor bl,bl
680
	rcr dl,1
680
	rcr dl,1
681
	rcr ax,1
681
	rcr ax,1
682
	rcr bx,1
682
	rcr bx,1
683
	add bx,di
683
	add bx,di
684
	adc ax,si
684
	adc ax,si
685
	add bx,0x62e9
685
	add bx,0x62e9
686
	adc ax,0x3619
686
	adc ax,0x3619
687
	mov [rsx1],bx
687
	mov [rsx1],bx
688
	mov [rsx2],ax
688
	mov [rsx2],ax
689
	xor dx,dx
689
	xor dx,dx
690
	cmp ax,0
690
	cmp ax,0
691
	je nodiv
691
	je nodiv
692
	cmp cx,0
692
	cmp cx,0
693
	je nodiv
693
	je nodiv
694
	div cx
694
	div cx
695
nodiv:
695
nodiv:
696
	mov ax,dx
696
	mov ax,dx
697
	pop edx edi ebx ecx
697
	pop edx edi ebx ecx
698
	and eax,0000ffffh
698
	and eax,0000ffffh
699
ret
699
ret
700
 
700
 
701
 
701
 
702
 
702
 
-
 
703
pic_x db 10000010b, \
-
 
704
	 01000100b, \
-
 
705
	 00101000b, \
-
 
706
	 00010000b, \
-
 
707
	 00101000b, \
-
 
708
	 01000100b, \
-
 
709
	 10000010b
703
txt_x db 'X',0
710
 
-
 
711
pic_o db 01111100b, \
-
 
712
	 10000010b, \
-
 
713
	 10000010b, \
-
 
714
	 10000010b, \
-
 
715
	 10000010b, \
-
 
716
	 10000010b, \
-
 
717
	 01111100b
-
 
718
 
704
txt_o db 'O',0
719
pic_plt dd 0xffffff, 0x000000
705
if lang eq ru
720
if lang eq ru
706
title db 'ƒ®¬®ªã',0
721
title db 'ƒ®¬®ªã',0
707
txt_buttons db '®¢ ï   €¢â®',0
722
txt_buttons db '®¢ ï   €¢â®',0
708
txt_go db 'ˆ£à  ®ª®­ç¥­ ',0
723
txt_go db 'ˆ£à  ®ª®­ç¥­ ',0
709
txt_tie db '¥â 室®¢',0
724
txt_tie db '¥â 室®¢',0
710
else
725
else
711
title db 'Gomoku',0
726
title db 'Gomoku',0
712
txt_go db 'Game over',0
727
txt_go db 'Game over',0
713
txt_tie db 'Tie game',0
728
txt_tie db 'Tie game',0
714
txt_buttons db 'New     Auto',0
729
txt_buttons db 'New     Auto',0
715
endf
730
endf
716
 
731
 
717
 
732
 
718
Weight dw 0,0,4,20,100,500,0
733
Weight dw 0,0,4,20,100,500,0
719
 
734
 
720
 
735
 
721
WinningLine db 0
736
WinningLine db 0
722
TotalLines dw 0
737
TotalLines dw 0
723
 
738
 
724
X dw 0
739
X dw 0
725
Y dw 0
740
Y dw 0
726
 
741
 
727
flags rw 1
742
flags rw 1
728
;¡¨â 0: ¨£à  ®ª®­ç¥­ 
743
;¡¨â 0: ¨£à  ®ª®­ç¥­ 
729
;1: 0-室 ¨£à®ª , 1-æ¯ã
744
;1: 0-室 ¨£à®ª , 1-æ¯ã
730
;2: autoplay
745
;2: autoplay
731
;3: å®¤ë ¨áç¥à¯ ­ë
746
;3: å®¤ë ¨áç¥à¯ ­ë
732
;4: ¢ print_board - ¢ë¤¥«¥­¨¥ ªà á­ë¬ 梥⮬ 5-⨠¢ àï¤ ª«¥â®ª
747
;4: ¢ print_board - ¢ë¤¥«¥­¨¥ ªà á­ë¬ 梥⮬ 5-⨠¢ àï¤ ª«¥â®ª
733
 
-
 
734
proc_info process_information	; it should be after I_END, but i'm afraid of lines 11-12. dunkaist
748
 
735
I_END:
749
I_END:
736
align 16
750
align 16
737
Board	rb N*N
751
Board	rb N*N
738
Value	rw N*N*2	;¯¥à¢ ï ¯®«®¢¨­  - ¤«ï ª®¬¯ , ¢â®à ï - ¤«ï ¨£à®ª 
752
Value	rw N*N*2	;¯¥à¢ ï ¯®«®¢¨­  - ¤«ï ª®¬¯ , ¢â®à ï - ¤«ï ¨£à®ª 
739
Line	rb 4*N*N*2
753
Line	rb 4*N*N*2
740
-
 
-
 
754
proc_info process_information
-
 
755
	rb 0x100	; stack
741
756
E_END: