2024-06-14 10:35:46 +02:00
; 4.11.2009 staper@inbox.ru
; 2.06.2010 fixed a little bug in check
;based on http://sources.codenet.ru/download/1599/Sudoku.html
; <20> <20> ࠢ<EFBFBD> <E0A0A2> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 㣫<> <20> <> ᯮ<EFBFBD> <E1AFAE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ,
;<3B> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> 㢥<> <E3A2A5> 稢<EFBFBD> <E7A8A2> <EFBFBD> <EFBFBD> <EFBFBD> <20> ࠧ<> <E0A0A7> <EFBFBD> <EFBFBD> .
; <20> ணࠬ<E0AEA3> <E0A0AC> <20> <EFBFBD> <E0AEA2> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ப<EFBFBD> <20> <> ࠬ<EFBFBD> <E0A0AC> ; <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ।<EFBFBD> <E0A5A4> <EFBFBD> <EFBFBD>
;<3B> <> <EFBFBD> <EFBFBD> <20> 䠩<> <E4A0A9> <20> <20> <> <EFBFBD> <EFBFBD> 祩.
; <20> <> <EFBFBD> <EFBFBD> ⠭<EFBFBD> <E2A0AD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> :
; n - ᣥ<> <E1A3A5> <EFBFBD> <EFBFBD> <EFBFBD> <E0AEA2> <EFBFBD> ⠡<> <E2A0A1> <EFBFBD> <EFBFBD>
; c - <20> <EFBFBD> <E0AEA2> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD>
; <09> <EFBFBD> <E0AEA1> - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD>
; +- - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <EFBFBD> <E0AEA2> <EFBFBD> <> <E1ABAE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
; t - <20> ਮ<EFBFBD> ⠭<EFBFBD> <E2A0AD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ᥪ㭤<E1A5AA> <E3ADA4> <EFBFBD> <EFBFBD>
; i - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <> <20> ਬ<EFBFBD> <E0A8AC>
; r - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
; l - <20> <> <EFBFBD> <EFBFBD> 㧨<EFBFBD> <E3A7A8> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> 䠩<> <E4A0A9>
; s - <20> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> 䠩<>
; a - <20> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD> <20> 䠩<>
use32
org 0x0
db 'MENUET01'
dd 0x1 , START , I_END , ( D_END + 10000 ) and not 3 , ( D_END + 10000 ) and not 3 , buf_cmd_lin , cur_dir_path
Difficult db 0 ;<> <E1ABAE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> [0..9]
Difficult_array db 80 , 75 , 68 , 59 , 50 , 45 , 40 , 36 , 32 , 25
;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> :
Bckgrd_clr equ 0xffffff ;䮭
Brdr_line_clr equ 0x780000 ;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> ࠭<EFBFBD> 栬
Inter_line_clr equ 0xb0b0b0 ;<3B> <> <EFBFBD> <EFBFBD> ७<EFBFBD> <E0A5AD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
Square_clr equ 0xdddddd ;梥<> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
Fix_nmb_clr equ 0x335533 ;0 ;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> 筮<EFBFBD> <20> <> <EFBFBD> 祭<EFBFBD> <E7A5AD>
Chg_nmb_clr equ 0 ;x008d8d ;<3B> <> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> 祭<EFBFBD> <E7A5AD>
Text_clr equ 0x000000 ;⥪<> <E2A5AA>
Message_clr equ 0x0000ff ;ᮮ<> 饭<EFBFBD> <E9A5AD>
DEBUG equ 0
macro dbg_dec num
{ pushad
newline
debug_print_dec num
popad
}
include '../../../macros.inc'
;include 'debug.inc'
include 'editbox_ex.mac'
include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US.
include 'SudokuSolve.pas'
START:
mcall 40 , 7
mcall 3
mov [ rsx1 ], ax
ror eax , 16
mov [ rsx2 ], ax
rol eax , 7
mov [ rsx3 ], ax
rol eax , 7
mov [ rsx4 ], ax
; call LOAD_LIB ;loading Box_Lib library
; This is the part of the macros for load any library/libraries by <Lrz>
LOAD_LIB:
mcall 68 , 19 , system_path ; load of sys directory
test eax , eax
jnz .end_steep
bts [ flags ], 7
; ret
jmp .end
.end_steep:
; initialize import
mov edx , eax
mov esi , myimport
.import_loop:
lodsd
test eax , eax
jz .import_done
push edx
.import_find:
mov ebx , [ ds : edx ]
test ebx , ebx
jz .exit ;import_not_found
push eax
.lp:
mov cl , [ ds : eax ]
cmp cl , [ ds : ebx ]
jnz .import_find_next
test cl , cl
jz .import_found
inc eax
inc ebx
jmp .lp
.import_find_next:
pop eax
add edx , 8
jmp .import_find
.import_found:
pop eax
mov eax , [ ds : edx + 4 ]
mov [ esi - 4 ], eax
pop edx
jmp .import_loop
.exit:
add esp , 4
bts [ flags ], 7
;ret
jmp .end
.import_done:
btr [ flags ], 7
;<3B> <> ।<EFBFBD> <E0A5A4> 塞 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ப<EFBFBD> <20> <20> <> ࠬ<EFBFBD> <E0A0AC> ࠬ<EFBFBD>
mov esi , buf_cmd_lin
xor eax , eax
@ @ : cmp byte [ esi + eax ], 0
je @ f
inc eax
jmp @ b
@ @ : mov dword [ edi t1.size ], eax
mov dword [ edi t1.pos ], eax
;ret
.end:
bt [ flags ], 7
jc @ f
mcall 68 , 11
cmp dword [ edi t1.pos ], 0
je @ f
call load_sudoku
jnc redraw_all
@ @ : jmp key.new_game
redraw_all:
mcall 12 , 1
mcall 48 , 4
add eax , 100 * 65536 + ( 24 * 9 + 67 )
mov ecx , eax
mcall 0 , 100 * 65536 + ( 24 * 9 + 12 ),,( 0x34000000 + Bckgrd_clr ),, title
mcall 38 , 1 * 65536 + ( 24 * 9 + 1 ), 21 * 65536 + 21 , Brdr_line_clr
mov edx , Inter_line_clr
mov edi , 3
mov esi , 3
@ @ : add ecx , 24 * 65536 + 24
mcall
dec esi
jnz @ b
mov esi , 3
push edx
mcall ,,, Brdr_line_clr
pop edx
dec edi
jnz @ b
mcall , 1 * 65536 + 1 , 22 * 65536 + 236 , Inter_line_clr ;0xe7e6a0
mov edx , Inter_line_clr
mov edi , 3
mov esi , 3
push edx
mcall ,,, Brdr_line_clr
pop edx
@ @ : add ebx , 24 * 65536 + 24
mcall
dec esi
jnz @ b
mov esi , 3
push edx
mcall ,,, Brdr_line_clr
pop edx
dec edi
jnz @ b
mcall 8 , < 208 , 8 > , < 257 , 8 > , 2 , 0xbbbbbb
mcall 4 , < 5 , 5 > ,( 0x80000000 + Text_clr ), txt.new
mcall , < 105 , 5 > ,, txt.dif
mcall , < 5 , 258 > ,, txt.space
mcall , < 5 , 246 > ,, txt.check
mcall , < 129 , 246 > ,, txt.time
mcall , < 5 , 285 > ,, txt.own_map
mcall , < 5 , 296 > ,, txt.solve
mcall , < 90 , 296 > ,, txt.load
mcall , < 5 , 306 > ,, txt.save
mcall , < 90 , 306 > ,, txt.save_solve
bts [ flags ], 5
call Timer.0
call show_level
push dword Map ;esi; mov esi,Map
mcall 12 , 2
draw_pole:
if DEBUG
call SysMsgBoardNum ;show esp
endf
movzx eax ,[ Y ]
dec al
mov ebx , 9
mul bl
mov bl ,[ X ]
add al , bl
pop esi ; mov esi,Map
push eax ;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 稪
mov edi , 81 - 9
mov ebp , 9
mov ebx , 1 * 65536 + 21
mov ecx , 21 * 65536 + 41
call out_numbers
pop eax
bt [ flags ], 2
jc key.0
still:
mcall 23 , 10
test eax , eax
jz Timer
dec al
jz redraw_all
dec al
jz key
dec al
jnz still
;button:
mcall 17
cmp ah , 1
jne @ f
mcall - 1
@ @ : cmp ah , 2
jne still
btc [ flags ], 9
mcall 48 , 4
add eax ,( 24 * 9 + 67 )
mov esi , eax
bt [ flags ], 9
jnc @ f
add esi , 40
@ @ : mcall 67 , - 1 , - 1 ,( 24 * 9 + 12 ),
jmp still
key:
mcall 2
cmp ah , 32 ;<3B> <EFBFBD> <E0AEA1>
jne @ f
btc [ flags ], 3
jc .todraw
push dword SolveMap
jmp draw_pole
.todraw:
push dword Map
jmp draw_pole
@ @ :
bt [ flags ], 3
jnc @ f
bts [ flags ], 2
push eax
push dword Map
jmp draw_pole
.0: pop eax
btr [ flags ], 2
btr [ flags ], 3
@ @ : cmp ah , 108 ;l
jne @ f
bt [ flags ], 7
jc still
bt [ flags ], 6
jc still
bts [ flags ], 8
call window_load_save
jmp still
@ @ : cmp ah , 115 ;s
jne @ f
btr [ flags ], 10
.sresh: bt [ flags ], 7
jc still
bt [ flags ], 6
jc still
btr [ flags ], 8
call window_load_save
jmp still
@ @ : cmp ah , 97 ;a
jne @ f
bts [ flags ], 10
jmp .sresh
@ @ : cmp ah , 116 ;t
jne @ f
btc [ flags ], 1
jnc still
mcall 26 , 9
sub eax ,[ Ticks_new ]
push eax
mov eax ,[ Ticks ]
mov ebx , 100
mul ebx
pop ecx
sub ecx , eax
add [ Ticks_new ], ecx
jmp still
@ @ : cmp ah , 105 ;i
jne @ f
xor ecx , ecx
.105_0:
mov byte [ SolveMap + ecx ], 0
mov byte [ Map + ecx ], 0
inc ecx
cmp ecx , 9 * 9
jb .105_0
jmp .todraw
@ @ : cmp ah , 114 ;r
jne .43
xor ecx , ecx
.114_0:
mov al ,[ Map + ecx ]
cmp al , 9
jbe @ f
sub al , 10
@ @ :
mov [ SolveMap + ecx ], al
inc ecx
cmp ecx , 9 * 9
jb .114_0
mov esi , SolveMap
call Solve
cmp [ _iRet ], 1
jne @ f
mov edx , txt.check_yes
call Show_message
jmp still
@ @ : ;<3B> <> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD>
xor ecx , ecx
@ @ :
mov byte [ SolveMap + ecx ], 0
inc ecx
cmp ecx , 9 * 9
jb @ b
mov edx , txt.nosolve
call Show_message
jmp still
.43: cmp ah , 43 ;+
jne .45
cmp [ Di fficult ], 9
je still
inc [ Di fficult ]
call show_level
jmp still
.45: ;-
cmp ah , 45
jne .99
cmp [ Di fficult ], 0
je still
dec [ Di fficult ]
call show_level
jmp still
.99: ;Check
cmp ah , 99
jne .39
bts [ flags ], 15
xor ecx , ecx
mov edx , txt.check_no
; @@: mov al,byte [Map+ecx]
; cmp byte [SolveMap+ecx],al
; jne @f
; inc ecx
; cmp ecx,9*9
; jb @b
@ @ : mov al , byte [ Map + ecx ] ;<3B> <> ७<EFBFBD> ᨬ <20> <> <EFBFBD> 祭<EFBFBD> <E7A5AD> <20> <> <20> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ᨢ
cmp al , 9
jbe .991
sub al , 10
.991:
mov [ TempMap + ecx ], al
inc ecx
cmp ecx , 9 * 9
jb @ b
mov esi , TempMap
call Ch eckSudoku
jc @ f
mov edx , txt.check_yes
@ @ : btr [ flags ], 15
call Show_message
jmp .todraw
.39: cmp ah , 0x39
ja .110
cmp ah , 0x30
jb still
sub ah , 0x30
mov cl , ah
movzx eax ,[ Y ]
dec al
mov ebx , 9
mul bl
mov bl ,[ X ]
dec bl
add al , bl
mov esi , Map
cmp byte [ esi + eax ], 9
jg still
mov [ esi + eax ], cl
jmp .onedraw
.110: cmp ah , 110 ;n
jne .176
.new_game:
call GeneratePlayBoard
mov [ Ticks ], 0
mcall 26 , 9
mov [ Ticks_new ], eax
jmp redraw_all
.176: cmp ah , 176 ;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
jne .177
call draw_one_symbol
dec [ X ]
cmp [ X ], 1
jge @ f
mov [ X ], 9
@ @ : jmp .onedraw
.177: cmp ah , 177
jne .178
call draw_one_symbol
inc [ Y ]
cmp [ Y ], 9
jbe @ f
mov [ Y ], 1
@ @ : jmp .onedraw
.178: cmp ah , 178
jne .179
call draw_one_symbol
dec [ Y ]
cmp [ Y ], 1
jge @ f
mov [ Y ], 9
@ @ : jmp .onedraw
.179: cmp ah , 179
jne still
call draw_one_symbol
inc [ X ]
cmp [ X ], 9
jbe @ f
mov [ X ], 1
@ @ :
.onedraw:
bts [ flags ], 4
call draw_one_symbol
jmp still ;.todraw
show_level:
movzx ecx ,[ Di fficult ]
mcall 47 , 0x10000 ,, < 205 , 5 > ,( 0x50000000 + Text_clr ), Bckgrd_clr
ret
Show_message:
mcall 4 , < 5 , 269 > ,( 0xd0000000 + Message_clr ),,, Bckgrd_clr
ret
Timer:
bt [ flags ], 1
jc still
mcall 26 , 9
sub eax ,[ Ticks_new ]
mov ebx , 100
xor edx , edx
div ebx
cmp eax ,[ Ticks ]
je still
mov [ Ticks ], eax
.1: mov ebx , 60
xor edx , edx
div ebx
push eax
mov ecx , edx
mcall 47 , 0x00020000 ,, < 206 , 246 > ,( 0x40000000 + Text_clr ), Bckgrd_clr
pop ecx
mov edx , 189 * 65536 + 246
mcall
bt [ flags ], 5
jnc @ f
btr [ flags ], 5
ret
@ @ : jmp still
.0: mov eax ,[ Ticks ]
jmp .1
draw_one_symbol:
movzx eax ,[ X ]
mov ebx , 24 * 65536 + 24
mul ebx
xchg eax , ebx
add ebx ,( 1 * 65536 + 21 - 24 * 65536 + 24 )
movzx eax ,[ Y ]
mov ecx , 24 * 65536 + 24
mul ecx
xchg eax , ecx
add ecx ,( 21 * 65536 + 41 - 24 * 65536 + 24 )
movzx eax ,[ Y ]
dec al
push ebx
mov ebx , 9
mul bl
mov bl ,[ X ]
add al , bl
dec al
pop ebx
mov esi , Map
add esi , eax
push dword 0 ;<3B> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
bt [ flags ], 4
jnc @ f
mov dword [ esp ], 1 ;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
btr [ flags ], 4
@ @ : mov edi , 0
mov ebp , 1
call out_numbers
pop eax
ret
out_numbers:
push ebx ecx esi
shr ebx , 16
inc bx
shl ebx , 16
add ebx , 23
shr ecx , 16
inc cx
shl ecx , 16
add ecx , 23
mov edx , Bckgrd_clr
push ebp
dec dword [ esp + 4 * 5 ]
jnz @ f
mov edx , Square_clr
@ @ : mcall 13
pop ebp
pop esi
cmp byte [ esi ], 0
je .null
cmp byte [ esi ], 9
jbe .changeable_number
cmp byte [ esi ], 19
jbe .fixed_number
jmp .null
.end:
inc esi
dec ebp
jnz out_numbers
test edi , edi
jz @ f
sub edi , 9
mov ebp , 9
add ebx , - 9 * 24 * 65536 - 9 * 24
add ecx , 24 * 65536 + 24
jmp out_numbers
@ @ :
ret
.fixed_number:
push esi
shr ebx , 16
shr ecx , 16
mov dx , bx
shl edx , 16
mov dx , cx
add edx , 8 * 65536 + 4
movzx ebx , byte [ esi ]
sub ebx , 10
dec ebx
shl ebx , 4
add ebx , FONT
mov ecx , 8 * 65536 + 16
push esi ebp edi
mov edi , Pltr.fx
cmp dword [ esp + 4 * 7 ], 0
jne @ f
mov edi , Pltr.fxk
@ @ : mov esi , 1
mov ebp , 0
mcall 65
pop edi ebp esi
.1: pop esi ecx ebx
add ebx , 24 * 65536 + 24
jmp .end
.null:
pop ecx ebx
add ebx , 24 * 65536 + 24
jmp .end
.changeable_number:
push esi
shr ebx , 16
shr ecx , 16
mov dx , bx
shl edx , 16
mov dx , cx
add edx , 8 * 65536 + 4
movzx ebx , byte [ esi ]
dec ebx
shl ebx , 4
add ebx , FONT
mov ecx , 8 * 65536 + 16
push esi ebp edi
mov edi , Pltr.ch
cmp dword [ esp + 4 * 7 ], 0
jne @ f
mov edi , Pltr.chk
@ @ : mov esi , 1
mov ebp , 0
mcall 65
pop edi ebp esi
jmp .1
GeneratePlayBoard:
;i db 0
;j db 0
;RandI db 0
;RandJ db 0
;iRet db 0
;//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 㥬 <20> <> 襭<EFBFBD> <E8A5AD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
;m:
;for i:=0 to 8 do
; for j:=0 to 8 do
; begin
; Map[i,j]:=0;
; SolveMap[i,j]:=0;
; RealMap[i,j]:=0;
; end;
mov edi , Map
mov esi , SolveMap
mov edx , RealMap
xor ecx , ecx
@ @ :
mov byte [ edi + ecx ], 0
mov byte [ esi + ecx ], 0
mov byte [ edx + ecx ], 0
inc ecx
cmp ecx , 9 * 9
jb @ b
;//<2F> ⠢<EFBFBD> <E2A0A2> ࠭<> <E0A0AD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> 쪮 <20> <> ᥫ <20> <> <20> <> <EFBFBD> <EFBFBD>
;for i:=1 to 21 do
; begin
; RandI:=random(9);
; RandJ:=random(9);
; if SolveMap[RandI,RandJ]=0 then
; begin
; SolveMap[RandI,RandJ]:=random(9)+1;
; if not CheckSudoku(SolveMap) then
; begin
; SolveMap[RandI,RandJ]:=0;
; Continue;
; end;
; end else Continue;
; end;
mov ecx , 21
.1: mov eax , 9
call random
mov ebx , eax
mov eax , 9
call random
mov ah , 9
mul ah
add eax , ebx ;RandI,RandJ
cmp byte [ esi + eax ], 0
jne .loop
mov ebx , eax
mov eax , 9
call random
mov byte [ esi + ebx ], al
call Ch eckSudoku
jnc .loop
mov byte [ esi + ebx ], 0
.loop:
loop .1
;//<2F> <> 蠥<EFBFBD> <20> 㤮<EFBFBD> <E3A4AE>
;iRet:=Solve(SolveMap);
;if iRet<>1 then goto m;
;i:=1;
mov esi , SolveMap
call Solve
cmp [ _iRet ], 1
jne GeneratePlayBoard
movzx ecx ,[ Di fficult ]
movzx ecx , byte [ Di fficult_array + ecx ]
;case Difficult of
;1:
; while i<=42 do
; begin
; RandI:=random(9);
; RandJ:=random(9);
; if RealMap[RandI,RandJ]<>0 then Continue else
; RealMap[RandI,RandJ]:=SolveMap[RandI,RandJ];
; inc(i);
; end;
;2:
; while i<=32 do
; begin
; RandI:=random(9);
; RandJ:=random(9);
; if RealMap[RandI,RandJ]<>0 then Continue else
; RealMap[RandI,RandJ]:=SolveMap[RandI,RandJ];
; inc(i);
; end;
;3:
; while i<=25 do
; begin
; RandI:=random(9);
; RandJ:=random(9);
; if RealMap[RandI,RandJ]<>0 then Continue else
; RealMap[RandI,RandJ]:=SolveMap[RandI,RandJ];
; inc(i);
; end;
;end;
.2:
mov eax , 9
call random
mov ebx , eax
mov eax , 9
call random
mov ah , 9
mul ah
cmp al , 81
jb @ f
dec al
@ @ :
add eax , ebx ;RandI,RandJ
cmp byte [ RealMap + eax ], 0
jne .loop2
add byte [ SolveMap + eax ], 10
mov bl ,[ SolveMap + eax ]
mov byte [ RealMap + eax ], bl
.loop2:
loop .2
;for i:=0 to 8 do
; for j:=0 to 8 do
; Map[i,j]:=RealMap[i,j];
;end;
xor ecx , ecx
@ @ : mov al ,[ RealMap + ecx ]
mov [ Map + ecx ], al
inc ecx
cmp ecx , 9 * 9
jb @ b
ret
align 4
rsx1 dw ? ;0x4321
rsx2 dw ? ;0x1234
rsx3 dw ? ;0x62e9
rsx4 dw ? ;0x3619
random: ; <20> <> ASCL
push ecx ebx esi edx
mov cx , ax
mov ax ,[ rsx1 ]
mov bx ,[ rsx2 ]
mov si , ax
mov di , bx
mov dl , ah
mov ah , al
mov al , bh
mov bh , bl
xor bl , bl
rcr dl , 1
rcr ax , 1
rcr bx , 1
add bx , di
adc ax , si
add bx ,[ rsx3 ]
adc ax ,[ rsx4 ]
sub [ rsx3 ], di
adc [ rsx4 ], si
mov [ rsx1 ], bx
mov [ rsx2 ], ax
xor dx , dx
cmp ax , 0
je nodiv
cmp cx , 0
je nodiv
div cx
nodiv:
mov ax , dx
pop edx esi ebx ecx
and eax , 0000ffffh
ret
if DEBUG
SysMsgBoardNum: ;warning: destroys eax,ebx,ecx,esi
mov ebx , esp
mov ecx , 8
mov esi ,( number_to_out + 1 )
.1:
mov eax , ebx
and eax , 0xF
add al , '0'
cmp al ,( 10 + '0' )
jb @ f
add al ,( 'A' - '0' - 10 )
@ @ :
mov [ esi + ecx ], al
shr ebx , 4
loop .1
dec esi
mcall 71 , 1 , number_to_out
ret
number_to_out db '0x00000000' , 13 , 10 , 0
endf
window_load_save:
popad
mcall 51 , 1 , .thread ,( threat_stack + 32 * 4 )
pushad
ret
.thread:
bts [ flags ], 6
.red:
mcall 12 , 1
mov edi , txt.load
bt [ flags ], 8
jc @ f
mov edi , txt.save
bt [ flags ], 10
jnc @ f
mov edi , txt.save_solve
@ @ : mcall 0 , 50 * 65536 + 300 , 0x70 * 65536 + 60 ,( 0x34000000 + Bckgrd_clr ),,
mcall 8 , < 245 , 43 > , < 2 , 14 > , 100 , 0xaaaaaa
mcall 4 , < 252 , 5 > ,( 0x80000000 + Text_clr ), txt.enter
push dword edi t1
call [ edi t_box_draw ]
mcall 12 , 2
.still:
mcall 10
dec al
jz .red
dec al
jz .key
dec al
jz .button
jmp .still
.button:
mcall 17 , 1
cmp ah , 1
jne @ f
.end: btr [ flags ], 6
mcall - 1
@ @ : cmp ah , 100
jne .still
bt [ flags ], 8
jc .ld
.sv: call save_sudoku
jnc .end
jmp .err
.ld: call load_sudoku
jnc .end
.err: mcall 4 , < 5 , 19 > ,( 0x80000000 + Text_clr ), txt.error
jmp .still
.key:
mcall 2
cmp ah , 13
jne @ f
bt [ flags ], 8
jc .ld
jmp .sv
@ @ : cmp ah , 27
je .end
push dword edi t1
call [ edi t_box_key ]
jmp .still
save_sudoku:
mov [ _size ], 9 * ( 9 + 2 )
mcall 68 , 12 ,[ _size ]
test eax , eax
jnz @ f
stc
ret
@ @ : mov [ _buffer ], eax
mov edx , Map
bt [ flags ], 10
jnc @ f
mov edx , SolveMap
@ @ : mov esi , eax ;[_buffer]
mov ecx ,[ _size ]
xor edi , edi
dec edi
mov ebx , 9
.1: test ecx , ecx
jz .end
test ebx , ebx
jz .2
inc edi
dec ebx
mov al ,[ edx + edi ]
test al , al
jnz @ f
mov byte [ esi + edi ], 0x23
loop .1
jmp .end
@ @ : cmp al , 9
jbe @ f
sub al , 10
@ @ : add al , 48
mov byte [ esi + edi ], al
loop .1
jmp .end
.2: mov ebx , 9
mov byte [ esi + edi + 1 ], 13
mov byte [ esi + edi + 2 ], 10
add esi , 2
sub ecx , 2
jmp .1
.end: mov [ func_70.func_n ], 2
push [ _size ]
pop [ func_70.param3 ]
push [ _buffer ]
pop [ func_70.param4 ]
mov [ func_70.name ], buf_cmd_lin
mcall 70 , func_70
cmp al , 0 ;<3B> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> 㤠筮?
je @ f
mcall 68 , 13 ,[ _buffer ]
stc
ret
@ @ : mcall 68 , 13 ,[ _buffer ]
clc
ret
load_sudoku:
mov [ func_70.func_n ], 5
mov [ func_70.param3 ], 0
mov [ func_70.param4 ], bufferfinfo
mov [ func_70.name ], buf_cmd_lin
mcall 70 , func_70
test al , al ;䠩<> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ?
jz @ f
stc
ret
@ @ : mov eax , dword [ bufferfinfo + 32 ] ;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> 㥬 ࠧ<> <E0A0A7> <EFBFBD> 䠩<> <E4A0A9>
cmp eax , 81
jge @ f
stc
ret
@ @ : cmp eax , 100
jb @ f
stc
ret
_size dd 0
_buffer dd 0
@ @ : mov [ _size ], eax
mcall 68 , 12 ,[ _size ]
test eax , eax
jnz @ f
stc
ret ;<3B> 訡<EFBFBD> <E8A8A1> <20> <> <20> 뤥<EFBFBD> <EBA4A5> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
@ @ :
mov [ _buffer ], eax
mov [ func_70.func_n ], 0
mov [ func_70.name ], buf_cmd_lin
push dword [ _size ]
pop dword [ func_70.param3 ]
push dword [ _buffer ]
pop dword [ func_70.param4 ]
mcall 70 , func_70
test eax , eax
jz @ f
stc
ret ;<3B> 訡<EFBFBD> <E8A8A1> <20> ⥭<EFBFBD> <E2A5AD>
@ @ :
mov edx , Map
mov esi ,[ _buffer ]
mov ecx ,[ _size ]
xor edi , edi
dec edi
.1: test ecx , ecx
jz .end
inc edi
mov al ,[ esi + edi ]
cmp al , 0x23
jne @ f
mov byte [ edx + edi ], 0
loop .1
jmp .end
@ @ : cmp al , 13
jne @ f
add esi , 2
dec edi
sub ecx , 2
jmp .1
@ @ : sub al , 48
mov byte [ edx + edi ], al
loop .1
.end: mcall 68 , 13 ,[ _buffer ]
xor ecx , ecx
@ @ : mov byte [ SolveMap + ecx ], 0
inc ecx
cmp ecx , 9 * 9
jb @ b
mov [ Ticks ], 0
mcall 26 , 9
mov [ Ticks_new ], eax
clc
ret
align 4
myimport:
edit_box_draw dd aEdit_box_draw
edit_box_key dd aEdit_box_key
edit_box_mouse dd aEdit_box_mouse
version_ed dd aVersion_ed
dd 0
dd 0
aEdit_box_draw db 'edit_box_draw' , 0
aEdit_box_key db 'edit_box_key' , 0
aEdit_box_mouse db 'edit_box_mouse' , 0
aVersion_ed db 'version_ed' , 0
edit1 edi t_box 240 , 2 , 2 , Bckgrd_clr , 0x6a9480 , 0 , 0xAABBCC , 0 , 4096 , buf_cmd_lin , ed_focus , 2 , 0 , 0
func_70:
.func_n dd ?
.param1 dd 0
.param2 dd 0
.param3 dd ?
.param4 dd ?
.rezerv db 0
.name dd ?
if lang eq ru_RU
title db '<27> 㤮<EFBFBD> <E3A4AE> ' , 0
txt:
.dif db "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (+/-):" , 0
.new db '<27> <> <EFBFBD> <EFBFBD> <EFBFBD> (N)' , 0
.space db '<27> <> 襭<EFBFBD> <E8A5AD> (<28> <EFBFBD> <E0AEA1> )' , 0
.check db '<27> <EFBFBD> <E0AEA2> <EFBFBD> <EFBFBD> <EFBFBD> (C)' , 0
.check_yes db '<27> <> 襭<EFBFBD> <E8A5AD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ' , 0
.check_no = .nosolve
.time db "<22> ६<EFBFBD> (T) :" , 0
.own_map db '<27> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <> <20> 㤮<EFBFBD> <E3A4AE> <20> <> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD> (I)' , 0
.nosolve db '<27> <> <20> <> 襭<EFBFBD> ' , 0
.solve db '<27> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (R)' , 0
.save db '<27> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> (S)' , 0
.save_solve db '<27> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD> (A)' , 0
.error db '<27> 訡<EFBFBD> <E8A8A1> ' , 0
.load db '<27> <> <EFBFBD> <EFBFBD> 㧨<EFBFBD> <E3A7A8> (L)' , 0
.enter db 'Enter' , 0
else ; Default to en_US
title db 'Sudoku' , 0
txt:
.dif db "Difficult (+/-)" , 0
.new db 'New (N)' , 0
.space db 'Solution (Space)' , 0
.check db 'Check (C)' , 0
.check_yes db 'Right ' , 0
.check_no db 'Not right ' , 0
.time db " Time (T) :" , 0
.own_map db 'Input your own Sudoku (I)' , 0
.nosolve db 'It is not solved' , 0
.solve db 'Solve (R)' , 0
.save db 'Save (S)' , 0
.save_solve db 'Save solution (A)' , 0
.error db 'Error' ;,0
.load db 'Load (L)' , 0
.enter db 'Enter' , 0
endf
system_path db '/sys/lib/'
boxlib_name db 'box_lib.obj' , 0
X db 1
Y db 1
Pltr:
.ch dd Bckgrd_clr , Ch g_nmb_clr
.chk dd Square_clr , Ch g_nmb_clr
.fx dd Bckgrd_clr , Fix_nmb_clr
.fxk dd Square_clr , Fix_nmb_clr
align 4
FONT file "sudoku.fnt"
;<3B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> :
I_END:
align 16
Map rb 9 * 9
SolveMap rb 9 * 9
RealMap rb 9 * 9
TempMap rb 9 * 9
cur_dir_path rb 4096
buf_cmd_lin rb 4096
bufferfinfo rb 40
Ticks_new rd 1 ;dd 0
Ticks rd 1 ;dd 0
flags rw 1
threat_stack rd 32 ;: times 32 dd 0
D_END:
;<3B> <> <EFBFBD> 0: <20> <> . <20> <> । draw_pole
;1: 1-⠩<> <E2A0A9> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
;2: <20> draw_pole <20> key
;3: 1-<2D> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
;4: in draw_one_symbol
;5: in Timer
;6: 1 <20> <> <20> <> ࠭<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> 㧪<EFBFBD>
;7: box_lib is not loaded
;8: 0 - <20> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> 1 - <20> <> <EFBFBD> <EFBFBD> 㧨<EFBFBD> <E3A7A8>
;9: 1 - 㢥<> <E3A2A5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
;10: 1 - <20> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> 襭<EFBFBD> <E8A5AD>
;15 1 - <20> <EFBFBD> ઠ <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ⨨ <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> (<28> <> <EFBFBD> CheckSudoku)