kolibrios/programs/games/MSquare/trunk/MSquare.asm

735 lines
11 KiB
NASM
Raw Normal View History

; 10.06.2010 staper@inbox.ru
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><><E2A0AA><><E6A5AB> <20><>ᥫ, <20><><EFBFBD> <20><> <20><EFBFBD>
;<3B> <20><><EFBFBD><E0AEAA>, <20><EFBFBD><E2AEAB><EFBFBD><EFBFBD> (<> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) ࠢ<><E0A0A2>.
;<3B><EFBFBD><E0A8AC>:
; 16 3 2 13
; 5 10 11 8
; 9 6 7 12
; 4 15 14 1
use32
org 0x0
db 'MENUET01'
dd 0x1, START, I_END, (D_END+100) and not 3, (D_END+100) and not 3, 0, 0
;<3B><><EFBFBD><EFBFBD><EFBFBD>:
Bckgrd_clr equ 0xffffff ;䮭
Brdr_line_clr equ 0xb0b0b0 ;<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 0x83459 ;<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>
max_dif equ 10
min_dif equ 2
len_kub equ 30 ;<3B><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
beg_x equ 40 ;<3B><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5ADA5><>
beg_y equ 50 ;<3B><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> Y <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5ADA5><>
sym_x equ 20
sym_y equ 20
win_x equ 400 ;<3B><><EFBFBD> <20><><EFBFBD><EFBFBD>
win_y equ 400 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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'
START:
;mcall 40,7
redraw_all:
mcall 12,1
mcall 48,4
add eax,100*65536+win_x
mov ecx,eax
mcall 0,100*65536+win_y,,(0x34000000+Bckgrd_clr),,title
movzx eax,[Difficult]
mov ebx,len_kub
xor edx,edx
mul ebx
add eax,beg_x*65536+beg_x
xchg eax,ebx
mcall 38,,beg_y*65536+beg_y,Brdr_line_clr
mov edx,Inter_line_clr
movzx esi,[Difficult]
dec esi
@@: add ecx,len_kub*65536+len_kub
mcall
dec esi
jnz @b
add ecx,len_kub*65536+len_kub
mcall ,,,Brdr_line_clr
movzx eax,[Difficult]
mov ecx,len_kub
xor edx,edx
mul ecx
add eax,(beg_y+1)*65536+beg_y-1
xchg eax,ecx
mov ebx,beg_x*65536+beg_x
mcall 38,,,Brdr_line_clr
mov edx,Inter_line_clr
movzx esi,[Difficult]
dec esi
@@: add ebx,len_kub*65536+len_kub
mcall
dec esi
jnz @b
add ebx,len_kub*65536+len_kub
mcall ,,,Brdr_line_clr
mcall 8,<4,78>,<4,13>,2,0xbbbbbb
mcall 4,<8,7>,(0x80000000+Text_clr),txt.clear
mcall ,<105,7>,,txt.dif
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
movzx ebx,[Difficult]
mul bl
mov bl,[X]
add al,bl
pop esi ; mov esi,Map
push eax ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
movzx eax,[Difficult]
mov ebx,eax
mul eax
sub eax,ebx
mov edi,eax
pop eax
push eax
; mov edi,81-9
movzx ebp,[Difficult]
mov ebx,beg_x*65536+beg_x+sym_x
mov ecx,beg_y*65536+beg_y+sym_y
call out_numbers
pop eax
call out_sum
still:
mcall 10
dec al
jz redraw_all
dec al
jz key
dec al
jnz still
;button:
mcall 17
cmp ah,1
jne @f
mcall -1
.clear:
@@: mov ecx,max_dif*max_dif
mov esi,Map
@@: mov byte [esi+ecx-1],0
loop @b
jmp redraw_all
key:
mcall 2
.43: cmp ah,43 ;+
jne .45
cmp [Difficult],max_dif
je still
inc [Difficult]
jmp redraw_all
jmp still
.45: ;-
cmp ah,45
jne .99
cmp [Difficult],min_dif
je still
dec [Difficult]
movzx eax, [Difficult]
cmp al, [X]
jae @f
mov [X], al
@@:
cmp al, [Y]
jae @f
mov [Y], al
@@:
jmp redraw_all
jmp still
.99: cmp ah,0x58
je @f
cmp ah,0x78
jne .39
@@: jmp still.clear
.39: cmp ah,0x39
ja .110
cmp ah,0x30
jb still
sub ah,0x30
mov cl,ah
movzx eax,[Y]
dec al
mov ebx,max_dif;[Difficult]
mul bl
mov bl,[X]
dec bl
add al,bl
mov esi,Map
bt [flags],9
jnc @f
mov bl,[esi+eax]
push eax
mov ax,10
xor dl,dl
mul bl
add cl,al
pop eax
mov [esi+eax],cl
btr [flags],9
jmp .onedraw
@@: mov [esi+eax],cl
bts [flags],9
jmp .onedraw
.110: cmp ah,110 ;n
jne .176
.new_game:
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
push eax
movzx eax,[Difficult]
mov [X],al
pop eax
@@: btr [flags],9
jmp .onedraw
.177: cmp ah,177
jne .178
call draw_one_symbol
inc [Y]
push eax
movzx eax,[Difficult]
cmp [Y],al
jbe @f
mov [Y],1
@@: pop eax
btr [flags],9
jmp .onedraw
.178: cmp ah,178
jne .179
call draw_one_symbol
dec [Y]
cmp [Y],1
jge @f
push eax
movzx eax,[Difficult]
mov [Y],al
pop eax
@@: btr [flags],9
jmp .onedraw
.179: cmp ah,179
jne still
call draw_one_symbol
inc [X]
push eax
movzx eax,[Difficult]
cmp [X],al
jbe @f
mov [X],1
@@: btr [flags],9
pop eax
.onedraw:
bts [flags],4
call draw_one_symbol
call out_one_sum
jmp still ;.todraw
show_level:
movzx ecx,[Difficult]
mcall 47,0x80020000,,<205,5>,(0x50000000+Text_clr),Bckgrd_clr
ret
draw_one_symbol:
movzx eax,[X]
mov ebx,len_kub*65536+len_kub
mul ebx
xchg eax,ebx
add ebx,(beg_x*65536+beg_y-len_kub*65536+len_kub)
movzx eax,[Y]
mov ecx,len_kub*65536+len_kub
mul ecx
xchg eax,ecx
add ecx,(beg_y*65536+beg_y+sym_y-len_kub*65536+len_kub)
movzx eax,[Y]
dec al
push ebx
movzx ebx,[Difficult]
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,len_kub-1
shr ecx,16
inc cx
shl ecx,16
add ecx,len_kub-1
mov edx,Bckgrd_clr
push ebp
dec dword [esp+4*5]
jnz @f
mov edx,Square_clr
@@: mcall 13
pop ebp
pop esi
push ebx edx
mov eax,esi
sub eax,Map-1
xor edx,edx
movzx ebx,[Difficult]
div ebx
push edx
xor edx,edx
mov ebx,max_dif
mul ebx
pop edx
test edx,edx
jnz @f
movzx edx,[Difficult]
sub eax,max_dif
@@: add eax,edx
mov al,[eax+Map-1]
pop edx ebx
test al,al
; cmp byte [esi],0
jnz .changeable_number
jmp .null
.end:
inc esi
dec ebp
jnz out_numbers
test edi,edi
jz @f
push ebx edx
movzx eax,[Difficult]
sub edi,eax
mov ebp,eax
mov ebx,len_kub*65536
xor edx,edx
mul ebx
push eax
movzx eax,[Difficult]
mov ebx,len_kub
mul ebx
pop ebx
add eax,ebx
pop edx
pop ebx
sub ebx,eax
; add ebx,-9*24*65536-9*24
add ecx,len_kub*65536+len_kub
jmp out_numbers
@@:
ret
.null:
pop ecx ebx
add ebx,len_kub*65536+len_kub
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
push ebx edx
mov eax,esi
sub eax,Map-1
xor edx,edx
movzx ebx,[Difficult]
div ebx
push edx
xor edx,edx
mov ebx,max_dif
mul ebx
pop edx
test edx,edx
jnz @f
movzx edx,[Difficult]
sub eax,max_dif
@@: add eax,edx
pop edx ebx
movzx ebx,byte [eax+Map-1];[esi]
push esi ebp edi edx
sub edx,2*65536-3
push edx
xchg eax,ebx
mov ebx,10
xor edx,edx
div ebx
mov ebx,edx
pop edx
push ebx
test eax,eax
jz .only_first_num
; bt [flags],9
; jc .only_first_num
xchg eax,ebx
shl bx,4
add ebx,FONT
mov ecx,8*65536+16
mov edi,Pltr.ch
cmp dword [esp+4*9],0
jne @f
mov edi,Pltr.chk
@@: mov esi,1
mov ebp,0
mcall 65
.only_first_num:
pop ebx
shl bl,4
add ebx,FONT
mov ecx,8*65536+16
add edx,8*65536
mov edi,Pltr.ch
cmp dword [esp+4*8],0
jne @f
mov edi,Pltr.chk
@@: mov esi,1
mov ebp,0
mcall 65
pop edx edi ebp esi
pop esi ecx ebx
add ebx,len_kub*65536+len_kub
jmp .end
out_sum:
movzx eax,[Difficult]
push eax
mov esi,Map
mov edi,out_sum_buf
.1: xor ebx,ebx
xor ecx,ecx
xor edx,edx
.2: mov dl,[ebx+esi]
add ecx,edx
inc ebx
cmp ebx,[esp]
jne .2
mov word [edi],cx
add edi,2
add esi,max_dif
dec eax
jnz .1
push out_sum_buf
movzx eax,[Difficult]
mov ebx,len_kub*65536
xor edx,edx
mul ebx
add eax,40*65536
push eax
mov edx,(beg_x-30)*65536+beg_y+10
mov ebx,0x30000
mov esi,0x50000000+Fix_nmb_clr
mov edi,Bckgrd_clr
.3: mov ecx,[esp+4]
mov cx,[ecx]
shl ecx,16
shr ecx,16
mcall 47
push edx
add edx,[esp+4]
mcall
pop edx
add edx,len_kub
add dword [esp+4],2
dec dword [esp+8]
jnz .3
pop eax
pop eax
pop eax
movzx eax,[Difficult]
push eax
mov esi,Map
mov edi,out_sum_buf
xor ebx,ebx
.4: xor ecx,ecx
xor edx,edx
mov ebx,[esp]
.5: mov dl,[esi]
add ecx,edx
add esi,max_dif
dec ebx
jnz .5
mov word [edi],cx
add edi,2
push eax
mov eax,max_dif
xor edx,edx
mul dword [esp+4]
dec eax
sub esi,eax
pop eax
dec eax
jnz .4
push out_sum_buf
movzx eax,[Difficult]
mov ebx,len_kub
xor edx,edx
mul ebx
add eax,35
push eax
mov edx,(beg_x+5)*65536+beg_y-20
mov ebx,0x30000
mov esi,0x50000000+Fix_nmb_clr
mov edi,Bckgrd_clr
.6: mov ecx,[esp+4]
mov ecx,[ecx]
shl ecx,16
shr ecx,16
mcall 47
push edx
add edx,[esp+4]
mcall
pop edx
add edx,len_kub*65536;[esp]
add dword [esp+4],2
dec dword [esp+8]
jnz .6
pop eax
pop eax
pop eax
ret
out_one_sum:
movzx ecx,[Difficult]
mov esi,Map
xor edx,edx
movzx eax,[Y]
dec al
mov ebx,max_dif
mul bl
add esi,eax
@@: mov al,[esi]
inc esi
add edx,eax
loop @b
mov ecx,edx
movzx eax,[Difficult]
mov ebx,len_kub*65536
xor edx,edx
mul ebx
add eax,40*65536
push eax
movzx eax,[Y]
dec eax
mov ebx,len_kub
xor edx,edx
mul ebx
mov edx,(beg_x-30)*65536+beg_y+10
add edx,eax
mov ebx,0x30000
mov esi,0x50000000+Fix_nmb_clr
mov edi,Bckgrd_clr
mcall 47
add edx,[esp]
mcall
pop eax
movzx ecx,[Difficult]
mov esi,Map
xor edx,edx
movzx eax,[X]
dec al
add esi,eax
@@: mov al,[esi]
add esi,max_dif
add edx,eax
loop @b
mov ecx,edx
movzx eax,[Difficult]
mov ebx,len_kub
xor edx,edx
mul ebx
add eax,35
push eax
movzx eax,[X]
dec eax
mov ebx,len_kub*65536
xor edx,edx
mul ebx
mov edx,eax
add edx,(beg_x+5)*65536+beg_y-20
mov ebx,0x30000
mov esi,0x50000000+Fix_nmb_clr
mov edi,Bckgrd_clr
mcall 47
add edx,[esp]
mcall
pop edx
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
if lang eq ru
title db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',0
txt:
.dif db "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (+/-):",0
.clear db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (x)',0
else
title db 'Magical square',0
txt:
.dif db "Difficult (+/-)",0
.clear db 'Clear (x)',0
endf
align 4
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
Pltr:
.ch dd Bckgrd_clr,Chg_nmb_clr
.chk dd Square_clr,Chg_nmb_clr
.fx dd Bckgrd_clr,Fix_nmb_clr
.fxk dd Square_clr,Fix_nmb_clr
FONT file "MSquare.fnt"
X db 1
Y db 1
Difficult db 3
I_END:
align 16
Map rb max_dif*max_dif
out_sum_buf rw max_dif
flags rw 1
D_END:
;<3B><><EFBFBD> 0: <20><>. <20><>। draw_pole
;2: <20> draw_pole <20> key
;4: in draw_one_symbol
;9: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>