Subversion Repositories Kolibri OS

Rev

Rev 1825 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1805 yogev_ezra 1
; 4.11.2009 staper@inbox.ru
2
 
3
; 2.06.2010 fixed a little bug in check
4
 
5
;based on http://sources.codenet.ru/download/1599/Sudoku.html
6
 
7
; В правом нижнем углу располагается серая кнопка,
8
;при нажатию на которую окно увеличивается в размере.
9
 
10
; Программа проверяет строку параметров; просто передайте
11
;путь к файлу с задачей.
12
 
13
; Сочетания клавиш:
14
;	n - сгенерировать таблицу
15
;	c - проверить решение
16
;	пробел - показать решение
17
;	+-  - изменить уровень сложности
18
;	t - приостановить/запустить секундомер
19
;	i - ввести свой пример
20
;	r - решить
21
;	l - загрузить задачу из файла
22
;	s - сохранить задачу в файл
23
;	a - сохранить решение в файл
24
 
25
use32
26
org	0x0
27
 db	'MENUET01'
28
 dd	0x1, START, I_END, (D_END+10000) and not 3,  (D_END+10000) and not 3, buf_cmd_lin, cur_dir_path
29
 
30
Difficult db 0	;сложность [0..9]
31
Difficult_array db 80,75,68,59,50,45,40,36,32,25
32
 
33
;Цвета:
34
Bckgrd_clr	equ 0xffffff	;фон
35
Brdr_line_clr	equ 0x780000	;линии по границам
36
Inter_line_clr	equ 0xb0b0b0	;внутренние линии
37
Square_clr	equ 0xdddddd	;цвет курсора
38
Fix_nmb_clr	equ 0x335533;0	;статичное значение
39
Chg_nmb_clr	equ 0;x008d8d	;переменное значение
40
Text_clr	equ 0x000000	;текст
41
Message_clr	equ 0x0000ff	;сообщения
42
 
43
DEBUG equ 0
44
 
45
macro dbg_dec num
46
{pushad
47
newline
48
debug_print_dec num
49
popad
50
}
51
 
1824 yogev_ezra 52
include '../../../macros.inc'
1805 yogev_ezra 53
;include 'debug.inc'
54
include 'editbox_ex.mac'
55
include 'lang.inc'
56
include 'SudokuSolve.pas'
57
 
58
 
59
START:
60
	mcall	40,7
61
	mcall	3
62
	mov	[rsx1],ax
63
	ror	eax,16
64
	mov	[rsx2],ax
65
	rol	eax,7
66
	mov	[rsx3],ax
67
	rol	eax,7
68
	mov	[rsx4],ax
69
 
70
;	call	LOAD_LIB	;loading Box_Lib library
71
 
72
; This is the part of the macros for load any library/libraries by 
73
LOAD_LIB:
74
	mcall	68,19,system_path   ; load of sys directory
75
	test	eax,eax
76
	jnz	.end_steep
77
 
78
	bts	[flags],7
79
;	ret
80
	jmp	.end
81
 
82
.end_steep:
83
 
84
; initialize import
85
	mov	edx, eax
86
	mov	esi,myimport
87
.import_loop:
88
	lodsd
89
	test	eax, eax
90
	jz	.import_done
91
	push	edx
92
.import_find:
93
	mov	ebx, [ds:edx]
94
	test	ebx, ebx
95
	jz	.exit   ;import_not_found
96
	push	eax
97
.lp:
98
	mov	cl, [ds:eax]
99
	cmp	cl, [ds:ebx]
100
	jnz	.import_find_next
101
	test	cl, cl
102
	jz	.import_found
103
	inc	eax
104
	inc	ebx
105
	jmp	.lp
106
.import_find_next:
107
	pop	eax
108
	add	edx, 8
109
	jmp	.import_find
110
.import_found:
111
	pop	eax
112
	mov	eax, [ds:edx+4]
113
	mov	[esi-4], eax
114
	pop	edx
115
	jmp	.import_loop
116
.exit:
117
	add	esp,4
118
 
119
	bts	[flags],7
120
;ret
121
	jmp	.end
122
 
123
.import_done:
124
	btr	[flags],7
125
 
126
;определяем длину строки с параметрами
127
	mov	esi,buf_cmd_lin
128
	xor	eax,eax
129
@@:	cmp	byte [esi+eax],0
130
	je	@f
131
	inc	eax
132
	jmp	@b
133
@@:	mov	dword [edit1.size],eax
134
	mov	dword [edit1.pos],eax
135
;ret
136
.end:
137
 
138
	bt	[flags],7
139
	jc	@f
140
	mcall	68,11
141
	cmp	dword [edit1.pos],0
142
	je	@f
143
	call	load_sudoku
144
	jnc	redraw_all
145
@@:	jmp	key.new_game
146
 
147
 
148
redraw_all:
149
	mcall	12,1
150
	mcall	48,4
151
	add	eax,100*65536+(24*9+67)
152
	mov	ecx,eax
153
	mcall	0,100*65536+(24*9+12),,(0x34000000+Bckgrd_clr),,title
154
	mcall	38,1*65536+(24*9+1),21*65536+21,Brdr_line_clr
155
	mov	edx,Inter_line_clr
156
	mov	edi,3
157
	mov	esi,3
158
  @@:	add	ecx,24*65536+24
159
	mcall
160
	dec	esi
161
	jnz	@b
162
	mov	esi,3
163
	push	edx
164
	mcall	,,,Brdr_line_clr
165
	pop	edx
166
	dec	edi
167
	jnz	@b
168
	mcall	,1*65536+1,22*65536+236,Inter_line_clr;0xe7e6a0
169
	mov	edx,Inter_line_clr
170
	mov	edi,3
171
	mov	esi,3
172
	push	edx
173
	mcall	,,,Brdr_line_clr
174
	pop	edx
175
 
176
  @@:	add	ebx,24*65536+24
177
	mcall
178
	dec	esi
179
	jnz	@b
180
	mov	esi,3
181
	push	edx
182
	mcall	,,,Brdr_line_clr
183
	pop	edx
184
	dec	edi
185
	jnz	@b
186
 
187
	mcall	8,<208,8>,<257,8>,2,0xbbbbbb
188
	mcall	4,<5,5>,(0x80000000+Text_clr),txt.new
189
	mcall	,<105,5>,,txt.dif
190
	mcall	,<5,258>,,txt.space
191
	mcall	,<5,246>,,txt.check
192
	mcall	,<129,246>,,txt.time
193
	mcall	,<5,285>,,txt.own_map
194
	mcall	,<5,296>,,txt.solve
195
	mcall	,<90,296>,,txt.load
196
	mcall	,<5,306>,,txt.save
197
	mcall	,<90,306>,,txt.save_solve
198
 
199
	bts	[flags],5
200
	call	Timer.0
201
	call	show_level
202
 
203
	push	dword Map;esi;  mov     esi,Map
204
	mcall	12,2
205
draw_pole:
206
	if DEBUG
207
	call	SysMsgBoardNum	;show esp
208
	endf
209
 
210
	movzx	eax,[Y]
211
	dec	al
212
	mov	ebx,9
213
	mul	bl
214
	mov	bl,[X]
215
	add	al,bl
216
	pop	esi	;       mov     esi,Map
217
	push	eax	;курсорчик
218
	mov	edi,81-9
219
	mov	ebp,9
220
	mov	ebx,1*65536+21
221
	mov	ecx,21*65536+41
222
	call	out_numbers
223
	pop	eax
224
	bt	[flags],2
225
	jc	key.0
226
 
227
still:
228
	mcall	23,10
229
	test	eax,eax
230
	jz	Timer
231
 
232
	dec	al
233
	jz	redraw_all
234
	dec	al
235
	jz	key
236
	dec	al
237
	jnz	still
238
;button:
239
	mcall	17
240
	cmp	ah,1
241
	jne	@f
242
	mcall	-1
243
@@:	cmp	ah,2
244
	jne	still
245
	btc	[flags],9
246
	mcall	48,4
247
	add	eax,(24*9+67)
248
	mov	esi,eax
249
	bt	[flags],9
250
	jnc	@f
251
	add	esi,40
7373 leency 252
@@:	mcall	67,-1,-1,(24*9+12),
1805 yogev_ezra 253
	jmp	still
254
key:
255
	mcall	2
256
	cmp ah,32		;пробел
257
jne	@f
258
	btc	[flags],3
259
	jc	.todraw
260
	push	dword SolveMap
261
	jmp	draw_pole
262
	.todraw:
263
	push	dword Map
264
	jmp	draw_pole
265
@@:
266
	bt	[flags],3
267
	jnc	@f
268
	bts	[flags],2
269
	push	eax
270
	push	dword Map
271
	jmp	draw_pole
272
.0:	pop	eax
273
	btr	[flags],2
274
	btr	[flags],3
275
@@:	cmp	ah,108		;l
276
	jne	@f
277
	bt	[flags],7
278
	jc	still
279
	bt	[flags],6
280
	jc	still
281
	bts	[flags],8
282
	call	window_load_save
283
	jmp	still
284
@@:	cmp	ah,115		;s
285
	jne	@f
286
	btr	[flags],10
287
.sresh: bt	[flags],7
288
	jc	still
289
	bt	[flags],6
290
	jc	still
291
	btr	[flags],8
292
	call	window_load_save
293
	jmp	still
294
@@:	cmp	ah,97		;a
295
	jne	@f
296
	bts	[flags],10
297
	jmp	.sresh
298
@@:	cmp	ah,116		;t
299
	jne	@f
300
	btc	[flags],1
301
	jnc	still
302
	mcall	26,9
303
	sub	eax,[Ticks_new]
304
	push	eax
305
	mov	eax,[Ticks]
306
	mov	ebx,100
307
	mul	ebx
308
	pop	ecx
309
	sub	ecx,eax
310
	add	[Ticks_new],ecx
311
	jmp	still
312
 
313
@@:	cmp	ah,105		;i
314
	jne	@f
315
		xor	ecx,ecx
316
		.105_0:
317
		mov	byte [SolveMap+ecx],0
318
		mov	byte [Map+ecx],0
319
		inc	ecx
320
		cmp	ecx,9*9
321
		jb	.105_0
322
		jmp	.todraw
323
 
324
@@:	cmp	ah,114		;r
325
	jne	.43
326
	xor	ecx,ecx
327
	.114_0:
328
		mov	al,[Map+ecx]
329
		cmp	al,9
330
		jbe	@f
331
		sub	al,10
332
		@@:
333
		mov	[SolveMap+ecx],al
334
		inc	ecx
335
		cmp	ecx,9*9
336
		jb	.114_0
337
	mov	esi,SolveMap
338
	call	Solve
339
	cmp	[_iRet],1
340
	jne	@f
341
		mov	edx,txt.check_yes
342
		call	Show_message
343
		jmp	still
344
	@@: ;нет решений
345
		xor	ecx,ecx
346
		@@:
347
		mov	byte [SolveMap+ecx],0
348
		inc	ecx
349
		cmp	ecx,9*9
350
		jb	@b
351
		mov	edx,txt.nosolve
352
		call	Show_message
353
		jmp	still
354
 
355
.43:	cmp	ah,43		;+
356
	jne	.45
357
	cmp	[Difficult],9
358
	je	still
359
	inc	[Difficult]
360
	call	show_level
361
	jmp	still
362
.45:				;-
363
	cmp	ah,45
364
	jne	.99
365
	cmp	[Difficult],0
366
	je	still
367
	dec	[Difficult]
368
	call	show_level
369
	jmp	still
370
 
371
.99:				;Check
372
	cmp	ah,99
373
	jne	.39
374
	bts	[flags],15
375
	xor	ecx,ecx
376
	mov	edx,txt.check_no
377
; @@:	mov	al,byte [Map+ecx]
378
;	cmp	byte [SolveMap+ecx],al
379
;	jne	@f
380
;	inc	ecx
381
;	cmp	ecx,9*9
382
;	jb	@b
383
 @@:	mov	al,byte [Map+ecx]	;переносим значения во временный массив
384
	cmp	al,9
385
	jbe	.991
386
		sub	al,10
387
	.991:
388
	mov	[TempMap+ecx],al
389
	inc	ecx
390
	cmp	ecx,9*9
391
	jb	@b
392
	mov	esi,TempMap
393
	call	CheckSudoku
394
	jc	@f
395
	mov	edx,txt.check_yes
396
 @@:	btr	[flags],15
397
	call	Show_message
398
	jmp	.todraw
399
 
400
.39:	cmp	ah,0x39
401
	ja	.110
402
	cmp	ah,0x30
403
	jb	still
404
	sub	ah,0x30
405
	mov	cl,ah
406
 
407
	movzx	eax,[Y]
408
	dec	al
409
	mov	ebx,9
410
	mul	bl
411
	mov	bl,[X]
412
	dec	bl
413
	add	al,bl
414
	mov	esi,Map
415
	cmp	byte [esi+eax],9
416
	jg	still
417
	mov	[esi+eax],cl
418
	jmp	.onedraw
419
 
420
.110:	cmp	ah,110		;n
421
	jne	.176
422
.new_game:
423
	call	GeneratePlayBoard
424
	mov	[Ticks],0
425
	mcall	26,9
426
	mov	[Ticks_new],eax
427
	jmp	redraw_all
428
 
429
.176:	cmp	ah,176 ;курсоры
430
	jne	.177
431
	call	draw_one_symbol
432
	dec	[X]
433
	cmp	[X],1
434
	jge	@f
435
	mov	[X],9
436
@@:	jmp	.onedraw
437
.177:	cmp	ah,177
438
	jne	.178
439
	call	draw_one_symbol
440
	inc	[Y]
441
	cmp	[Y],9
442
	jbe	@f
443
	mov	[Y],1
444
@@:	jmp	.onedraw
445
.178:	cmp	ah,178
446
	jne	.179
447
	call	draw_one_symbol
448
	dec	[Y]
449
	cmp	[Y],1
450
	jge	@f
451
	mov	[Y],9
452
@@:	jmp	.onedraw
453
.179:	cmp	ah,179
454
	jne	still
455
	call	draw_one_symbol
456
	inc	[X]
457
	cmp	[X],9
458
	jbe	@f
459
	mov	[X],1
460
@@:
461
.onedraw:
462
	bts	[flags],4
463
	call	draw_one_symbol
464
	jmp	still ;.todraw
465
 
466
show_level:
467
	movzx	ecx,[Difficult]
468
	mcall	47,0x10000,,<205,5>,(0x50000000+Text_clr),Bckgrd_clr
469
ret
470
 
471
Show_message:
472
	mcall	4,<5,269>,(0xd0000000+Message_clr),,,Bckgrd_clr
473
ret
474
 
475
Timer:
476
	bt	[flags],1
477
	jc	still
478
	mcall	26,9
479
	sub	eax,[Ticks_new]
480
	mov	ebx,100
481
	xor	edx,edx
482
	div	ebx
483
	cmp	eax,[Ticks]
484
	je	still
485
	mov	[Ticks],eax
486
.1:	mov	ebx,60
487
	xor	edx,edx
488
	div	ebx
489
	push	eax
490
	mov	ecx,edx
491
	mcall	47,0x00020000,,<206,246>,(0x40000000+Text_clr),Bckgrd_clr
492
	pop	ecx
493
	mov	edx,189*65536+246
494
	mcall
495
	bt	[flags],5
496
	jnc	@f
497
	btr	[flags],5
498
	ret
499
@@:	jmp	still
500
.0:	mov	eax,[Ticks]
501
	jmp	.1
502
 
503
draw_one_symbol:
504
	movzx	eax,[X]
505
	mov	ebx,24*65536+24
506
	mul	ebx
507
	xchg	eax,ebx
508
	add	ebx,(1*65536+21-24*65536+24)
509
	movzx	eax,[Y]
510
	mov	ecx,24*65536+24
511
	mul	ecx
512
	xchg	eax,ecx
513
	add	ecx,(21*65536+41-24*65536+24)
514
	movzx	eax,[Y]
515
	dec	al
516
	push	ebx
517
	mov	ebx,9
518
	mul	bl
519
	mov	bl,[X]
520
	add	al,bl
521
	dec	al
522
	pop	ebx
523
	mov	esi,Map
524
	add	esi,eax
525
	push	dword 0 ;не курсор
526
	bt	[flags],4
527
	jnc	@f
528
	mov	dword [esp],1 ;курсор
529
	btr	[flags],4
530
@@:	mov	edi,0
531
	mov	ebp,1
532
	call	out_numbers
533
	pop	eax
534
ret
535
 
536
 
537
out_numbers:
538
	push	ebx ecx esi
539
	shr	ebx,16
540
	inc	bx
541
	shl	ebx,16
542
	add	ebx,23
543
	shr	ecx,16
544
	inc	cx
545
	shl	ecx,16
546
	add	ecx,23
547
	mov	edx,Bckgrd_clr
548
	push	ebp
549
	dec	dword [esp+4*5]
550
	jnz	@f
551
	mov	edx,Square_clr
552
@@:	mcall	13
553
	pop	ebp
554
	pop	esi
555
 
556
	cmp	byte [esi],0
557
	je	.null
558
	cmp	byte [esi],9
559
	jbe	.changeable_number
560
	cmp	byte [esi],19
561
	jbe	.fixed_number
562
	jmp	.null
563
.end:
564
	inc	esi
565
	dec	ebp
566
	jnz	out_numbers
567
	test	edi,edi
568
	jz	@f
569
	sub	edi,9
570
	mov	ebp,9
571
	add	ebx,-9*24*65536-9*24
572
	add	ecx,24*65536+24
573
	jmp	out_numbers
574
  @@:
575
ret
576
 
577
.fixed_number:
578
	push	esi
579
	shr	ebx,16
580
	shr	ecx,16
581
	mov	dx,bx
582
	shl	edx,16
583
	mov	dx,cx
584
	add	edx,8*65536+4
585
	movzx	ebx,byte [esi]
586
	sub	ebx,10
587
	dec	ebx
588
	shl	ebx,4
589
	add	ebx,FONT
590
	mov	ecx,8*65536+16
591
	push	esi ebp edi
592
	mov	edi,Pltr.fx
593
	cmp	dword [esp+4*7],0
594
	jne	@f
595
	mov	edi,Pltr.fxk
596
@@:	mov	esi,1
597
	mov	ebp,0
598
	mcall	65
599
	pop	edi ebp esi
600
.1:	pop	esi ecx ebx
601
	add	ebx,24*65536+24
602
	jmp	.end
603
 
604
.null:
605
	pop	ecx ebx
606
	add	ebx,24*65536+24
607
	jmp	.end
608
.changeable_number:
609
	push	esi
610
	shr	ebx,16
611
	shr	ecx,16
612
	mov	dx,bx
613
	shl	edx,16
614
	mov	dx,cx
615
	add	edx,8*65536+4
616
	movzx	ebx,byte [esi]
617
	dec	ebx
618
	shl	ebx,4
619
	add	ebx,FONT
620
	mov	ecx,8*65536+16
621
	push	esi ebp edi
622
	mov	edi,Pltr.ch
623
	cmp	dword [esp+4*7],0
624
	jne	@f
625
	mov	edi,Pltr.chk
626
@@:	mov	esi,1
627
	mov	ebp,0
628
	mcall	65
629
	pop	edi ebp esi
630
	jmp	.1
631
 
632
 
633
 
634
GeneratePlayBoard:
635
;i db 0
636
;j db 0
637
;RandI db 0
638
;RandJ db 0
639
;iRet db 0
640
;//генерируем решенную матрицу
641
;m:
642
;for i:=0 to 8 do
643
;  for j:=0 to 8 do
644
;    begin
645
;    Map[i,j]:=0;
646
;    SolveMap[i,j]:=0;
647
;    RealMap[i,j]:=0;
648
;    end;
649
	mov	edi,Map
650
	mov	esi,SolveMap
651
	mov	edx,RealMap
652
	xor	ecx,ecx
653
	@@:
654
	mov	byte [edi+ecx],0
655
	mov	byte [esi+ecx],0
656
	mov	byte [edx+ecx],0
657
	inc	ecx
658
	cmp	ecx,9*9
659
	jb	@b
660
 
661
;//ставим рандомно несколько чисел на поле
662
;for i:=1 to 21 do
663
;  begin
664
;  RandI:=random(9);
665
;  RandJ:=random(9);
666
;  if SolveMap[RandI,RandJ]=0 then
667
;     begin
668
;     SolveMap[RandI,RandJ]:=random(9)+1;
669
;     if not CheckSudoku(SolveMap) then
670
;       begin
671
;       SolveMap[RandI,RandJ]:=0;
672
;       Continue;
673
;       end;
674
;     end else Continue;
675
;  end;
676
 
677
	mov	ecx,21
678
.1:	mov	eax,9
679
	call	random
680
	mov	ebx,eax
681
	mov	eax,9
682
	call	random
683
	mov	ah,9
684
	mul	ah
685
	add	eax,ebx ;RandI,RandJ
686
	cmp	byte [esi+eax],0
687
	jne	.loop
688
		mov	ebx,eax
689
		mov	eax,9
690
		call	random
691
		mov	byte [esi+ebx],al
692
		call	CheckSudoku
693
		jnc	.loop
694
		mov	byte [esi+ebx],0
695
	.loop:
696
	loop	.1
697
 
698
 
699
;//решаем Судоку
700
;iRet:=Solve(SolveMap);
701
;if iRet<>1 then goto m;
702
;i:=1;
703
 
704
	mov	esi,SolveMap
705
	call	Solve
706
	cmp	[_iRet],1
707
	jne	GeneratePlayBoard
708
 
709
	movzx	ecx,[Difficult]
710
	movzx	ecx,byte [Difficult_array+ecx]
711
 
712
;case Difficult of
713
;1:
714
;   while i<=42 do
715
;   begin
716
;        RandI:=random(9);
717
;        RandJ:=random(9);
718
;        if RealMap[RandI,RandJ]<>0 then Continue else
719
;        RealMap[RandI,RandJ]:=SolveMap[RandI,RandJ];
720
;        inc(i);
721
;   end;
722
;2:
723
;   while i<=32 do
724
;   begin
725
;        RandI:=random(9);
726
;        RandJ:=random(9);
727
;        if RealMap[RandI,RandJ]<>0 then Continue else
728
;        RealMap[RandI,RandJ]:=SolveMap[RandI,RandJ];
729
;        inc(i);
730
;   end;
731
;3:
732
;   while i<=25 do
733
;   begin
734
;        RandI:=random(9);
735
;        RandJ:=random(9);
736
;        if RealMap[RandI,RandJ]<>0 then Continue else
737
;        RealMap[RandI,RandJ]:=SolveMap[RandI,RandJ];
738
;        inc(i);
739
;   end;
740
;end;
741
 
742
.2:
743
	mov	eax,9
744
	call	random
745
	mov	ebx,eax
746
	mov	eax,9
747
	call	random
748
	mov	ah,9
749
	mul	ah
750
	cmp	al,81
751
	jb	@f
752
	dec	al
753
	@@:
754
	add	eax,ebx ;RandI,RandJ
755
	cmp	byte [RealMap+eax],0
756
	jne	.loop2
757
		add	byte [SolveMap+eax],10
758
		mov	bl,[SolveMap+eax]
759
		mov	byte [RealMap+eax],bl
760
	.loop2:
761
	loop	.2
762
 
763
;for i:=0 to 8 do
764
;   for j:=0 to 8 do
765
;      Map[i,j]:=RealMap[i,j];
766
;end;
767
 
768
	xor	ecx,ecx
769
@@:	mov	al,[RealMap+ecx]
770
	mov	[Map+ecx],al
771
	inc	ecx
772
	cmp	ecx,9*9
773
	jb	@b
774
ret
775
 
776
 
777
 
778
 
779
align 4
780
rsx1 dw ?;0x4321
781
rsx2 dw ?;0x1234
782
rsx3 dw ?;0x62e9
783
rsx4 dw ?;0x3619
784
random: 	; из ASCL
785
	push ecx ebx esi edx
786
	mov cx,ax
787
	mov ax,[rsx1]
788
	mov bx,[rsx2]
789
	mov si,ax
790
	mov di,bx
791
	mov dl,ah
792
	mov ah,al
793
	mov al,bh
794
	mov bh,bl
795
	xor bl,bl
796
	rcr dl,1
797
	rcr ax,1
798
	rcr bx,1
799
	add bx,di
800
	adc ax,si
801
	add bx,[rsx3]
802
	adc ax,[rsx4]
803
	sub [rsx3],di
804
	adc [rsx4],si
805
	mov [rsx1],bx
806
	mov [rsx2],ax
807
	xor dx,dx
808
	cmp ax,0
809
	je nodiv
810
	cmp cx,0
811
	je nodiv
812
	div cx
813
nodiv:
814
	mov ax,dx
815
	pop edx esi ebx ecx
816
	and eax,0000ffffh
817
ret
818
 
819
 
820
 
821
if DEBUG
822
SysMsgBoardNum: ;warning: destroys eax,ebx,ecx,esi
823
	mov	ebx,esp
824
	mov	ecx,8
825
	mov	esi,(number_to_out+1)
826
.1:
827
	mov	eax,ebx
828
	and	eax,0xF
829
	add	al,'0'
830
	cmp	al,(10+'0')
831
	jb	@f
832
	add	al,('A'-'0'-10)
833
@@:
834
	mov	[esi+ecx],al
835
	shr	ebx,4
836
	loop	.1
837
	dec	esi
838
	mcall	71,1,number_to_out
839
ret
840
 
841
number_to_out	db '0x00000000',13,10,0
842
endf
843
 
844
 
845
 
846
window_load_save:
847
	popad
848
	mcall	51,1,.thread,(threat_stack+32*4)
849
	pushad
850
	ret
851
.thread:
852
	bts	[flags],6
853
.red:
854
	mcall	12,1
855
	mov	edi,txt.load
856
	bt	[flags],8
857
	jc	@f
858
	mov	edi,txt.save
859
	bt	[flags],10
860
	jnc	@f
861
	mov	edi,txt.save_solve
862
@@:	mcall	0,50*65536+300,0x70*65536+60,(0x34000000+Bckgrd_clr),,
863
	mcall	8,<245,43>,<2,14>,100,0xaaaaaa
864
	mcall	4,<252,5>,(0x80000000+Text_clr),txt.enter
865
	push	dword edit1
866
	call	[edit_box_draw]
867
	mcall	12,2
868
.still:
869
	mcall	10
870
	dec	al
871
	jz	.red
872
	dec	al
873
	jz	.key
874
	dec	al
875
	jz	.button
876
	jmp	.still
877
.button:
878
	mcall	17,1
879
	cmp	ah,1
880
	jne	@f
881
  .end: btr	[flags],6
882
	mcall	-1
883
  @@:	cmp	ah,100
884
	jne	.still
885
	bt	[flags],8
886
	jc	.ld
887
  .sv:	call	save_sudoku
888
	jnc	.end
889
	jmp	.err
890
  .ld:	call	load_sudoku
891
	jnc	.end
892
  .err: mcall	4,<5,19>,(0x80000000+Text_clr),txt.error
893
	jmp	.still
894
 
895
 
896
.key:
897
	mcall	2
898
	cmp	ah,13
899
	jne	@f
900
	bt	[flags],8
901
	jc	.ld
902
	jmp	.sv
903
   @@:	cmp	ah,27
904
	je	.end
905
	push	dword edit1
906
	call	[edit_box_key]
907
	jmp	.still
908
 
909
 
910
save_sudoku:
911
	mov	[_size],9*(9+2)
912
	mcall	68,12,[_size]
913
	test	eax,eax
914
	jnz	@f
915
	stc
916
	ret
917
 
918
@@:	mov	[_buffer],eax
919
	mov	edx,Map
920
	bt	[flags],10
921
	jnc	@f
922
	mov	edx,SolveMap
923
@@:	mov	esi,eax;[_buffer]
924
	mov	ecx,[_size]
925
	xor	edi,edi
926
	dec	edi
927
	mov	ebx,9
928
.1:	test	ecx,ecx
929
	jz	.end
930
	test	ebx,ebx
931
	jz	.2
932
	inc	edi
933
	dec	ebx
934
	mov	al,[edx+edi]
935
	test	al,al
936
	jnz	@f
937
	mov	byte [esi+edi],0x23
938
	loop	.1
939
	jmp	.end
940
@@:	cmp	al,9
941
	jbe	@f
942
	sub	al,10
943
@@:	add	al,48
944
	mov	byte [esi+edi],al
945
	loop	.1
946
	jmp	.end
947
.2:	mov	ebx,9
948
	mov	byte [esi+edi+1],13
949
	mov	byte [esi+edi+2],10
950
	add	esi,2
951
	sub	ecx,2
952
	jmp	.1
953
 
954
 
955
.end:	mov	[func_70.func_n],2
956
	push	[_size]
957
	pop	[func_70.param3]
958
	push	[_buffer]
959
	pop	[func_70.param4]
960
	mov	[func_70.name],buf_cmd_lin
961
	mcall	70,func_70
962
	cmp	al,0			;сохранён удачно?
963
	je	@f
964
	mcall	68,13,[_buffer]
965
	stc
966
	ret
967
@@:	mcall	68,13,[_buffer]
968
	clc
969
ret
970
 
971
load_sudoku:
972
	mov	[func_70.func_n],5
973
	mov	[func_70.param3],0
974
	mov	[func_70.param4],bufferfinfo
975
	mov	[func_70.name],buf_cmd_lin
976
	mcall	70,func_70
977
	test	al,al		;файл найден?
978
	jz	@f
979
	stc
980
	ret
981
  @@:	mov	eax, dword [bufferfinfo+32]	;копируем размер файла
982
	cmp	eax,81
983
	jge	@f
984
	stc
985
	ret
986
@@:	cmp	eax,100
987
	jb	@f
988
	stc
989
	ret
990
 
991
_size dd 0
992
_buffer dd 0
993
 
994
@@:	mov	[_size],eax
995
	mcall	68,12,[_size]
996
	test	eax,eax
997
	jnz	@f
998
	stc
999
	ret	;ошибка на выделение блока
1000
  @@:
1001
	mov	[_buffer],eax
1002
	mov	[func_70.func_n],0
1003
	mov	[func_70.name],buf_cmd_lin
1004
	push	dword [_size]
1005
	pop	dword [func_70.param3]
1006
	push	dword [_buffer]
1007
	pop	dword [func_70.param4]
1008
	mcall	70,func_70
1009
	test	eax,eax
1010
	jz	@f
1011
	stc
1012
	ret	;ошибка чтения
1013
@@:
1014
 
1015
	mov	edx,Map
1016
	mov	esi,[_buffer]
1017
	mov	ecx,[_size]
1018
	xor	edi,edi
1019
	dec	edi
1020
.1:	test	ecx,ecx
1021
	jz	.end
1022
	inc	edi
1023
	mov	al,[esi+edi]
1024
	cmp	al,0x23
1025
	jne	@f
1026
	mov	byte [edx+edi],0
1027
	loop	.1
1028
	jmp	.end
1029
@@:	cmp	al,13
1030
	jne	@f
1031
	add	esi,2
1032
	dec	edi
1033
	sub	ecx,2
1034
	jmp	.1
1035
@@:	sub	al,48
1036
	mov	byte [edx+edi],al
1037
	loop	.1
1038
.end:	mcall	68,13,[_buffer]
1039
 
1040
	xor	ecx,ecx
1041
@@:	mov	byte [SolveMap+ecx],0
1042
	inc	ecx
1043
	cmp	ecx,9*9
1044
	jb	@b
1045
 
1046
	mov	[Ticks],0
1047
	mcall	26,9
1048
	mov	[Ticks_new],eax
1049
 
1050
	clc
1051
ret
1052
 
1053
 
1054
 
1055
 
1056
align 4
1057
myimport:
1058
edit_box_draw	dd	aEdit_box_draw
1059
edit_box_key	dd	aEdit_box_key
1060
edit_box_mouse	dd	aEdit_box_mouse
1061
version_ed	dd	aVersion_ed
1062
		dd	0
1063
		dd	0
1064
aEdit_box_draw	db 'edit_box',0
1065
aEdit_box_key	db 'edit_box_key',0
1066
aEdit_box_mouse db 'edit_box_mouse',0
1067
aVersion_ed	db 'version_ed',0
1068
 
1069
edit1 edit_box 240,2,2,Bckgrd_clr,0x6a9480,0,0xAABBCC,0,4096,buf_cmd_lin,ed_focus,2,0,0
1070
 
1071
func_70:
1072
 .func_n dd ?
1073
 .param1 dd 0
1074
 .param2 dd 0
1075
 .param3 dd ?
1076
 .param4 dd ?
1077
 .rezerv db 0
1078
 .name dd ?
1079
 
1080
if lang eq ru
1081
title db 'Судоку',0
1082
txt:
1083
.dif db "Сложность (+/-):",0
1084
.new db 'Новая (N)',0
1085
.space db 'Решение (Пробел)',0
1086
.check db 'Проверить (C)',0
1087
.check_yes db		'Решение найдено',0
1088
.check_no = .nosolve
1089
.time db "Время (T)   :",0
1090
.own_map db 'Ввести свою Судоку для решения (I)',0
1091
.nosolve db		'Не решено         ',0
1092
.solve db 'Решить (R)',0
1093
.save db 'Сохранить (S)',0
1094
.save_solve db 'Сохранить решение (A)',0
1095
.error db 'Ошибка',0
1096
.load db 'Загрузить (L)',0
1097
.enter db 'Enter',0
1098
else
1099
title db 'Sudoku',0
1100
txt:
1101
.dif db "Difficult (+/-)",0
1102
.new db 'New (N)',0
1103
.space db 'Solution (Space)',0
1104
.check db 'Check (C)',0
1105
.check_yes db		'Right            ',0
1106
.check_no db		'Not right        ',0
1107
.time db " Time (T)   :",0
1108
.own_map db 'Input your own Sudoku (I)',0
1109
.nosolve db		'It is not solved',0
1110
.solve db 'Solve (R)',0
1111
.save db 'Save (S)',0
1112
.save_solve db 'Save solution (A)',0
1113
.error db 'Error';,0
1114
.load db 'Load (L)',0
1115
.enter db 'Enter',0
1116
endf
1117
 
1118
system_path db '/sys/lib/'
1119
boxlib_name db 'box_lib.obj',0
1120
 
1121
X db 1
1122
Y db 1
1123
 
1124
Pltr:
1125
.ch dd Bckgrd_clr,Chg_nmb_clr
1126
.chk dd Square_clr,Chg_nmb_clr
1127
.fx dd Bckgrd_clr,Fix_nmb_clr
1128
.fxk dd Square_clr,Fix_nmb_clr
1129
 
1130
align 4
1825 yogev_ezra 1131
FONT file "sudoku.fnt"
1805 yogev_ezra 1132
;Палитры:
1133
 
1134
 
1135
I_END:
1136
align 16
1137
Map	rb 9*9
1138
SolveMap rb 9*9
1139
RealMap rb 9*9
1140
TempMap rb 9*9
1141
 
1142
cur_dir_path	rb 4096
1143
buf_cmd_lin	rb 4096
1144
bufferfinfo	rb 40
1145
Ticks_new rd 1	;dd 0
1146
Ticks rd 1	;dd 0
1147
flags rw 1
1148
threat_stack rd 32	;: times 32 dd 0
1149
 
1150
D_END:
1151
;бит 0: см. перед draw_pole
1152
;1: 1-таймер включён
1153
;2: в draw_pole и key
1154
;3: 1-показать решённую карту
1155
;4: in draw_one_symbol
1156
;5: in Timer
1157
;6: 1 на экране окно Сохранения/Загрузки
1158
;7: box_lib is not loaded
1159
;8: 0 - сохранить 1 - загрузить
1160
;9: 1 - увеличить высоту окна
1161
;10: 1 - сохранить решение
1162
;15 1 - проверка при нажатии клавиши С (для CheckSudoku)