diff --git a/programs/other/calcplus/calcplus.asm b/programs/other/calcplus/calcplus.asm index fee6515a8e..f210984285 100644 --- a/programs/other/calcplus/calcplus.asm +++ b/programs/other/calcplus/calcplus.asm @@ -1,5 +1,4 @@ - VERSION equ "0.1Å" - + VERSION equ "0.2Å" use32 org 0 db 'MENUET01' @@ -10,11 +9,12 @@ include "../../dll.inc" include "../../develop/libraries/box_lib/trunk/box_lib.mac" include "parser.inc" + ;include "../../debug.inc" ;=============================== sz_head db "Calc+ [v", VERSION, "]", 0 - buttons db "1234567890.%-+*/()" + buttons db "123456789()%^-+/*0" edb1 edit_box 184, 8, 12, 0, 0, 0, 0, 0, 500, \ exp, group, ed_always_focus + ed_focus, 0, 0 @@ -44,7 +44,7 @@ ;---------------------- update: - mcall 23, 50 + mcall 23, 5 cmp eax, EV_REDRAW je ev_redraw @@ -68,87 +68,42 @@ or edx, 0x34 shl 24 mcall 0, <100, 236>, <100, 164>, , , sz_head - mcall 13, < 4, 220>, < 8, 23>, [scn.gui_frame] - mov edx, [scn.gui_face] - cmp [error_n], 0 - je @f - mov edx, 0xFFAAAA - @@: - mcall 13, < 5, 218>, < 9, 21> - mcall , < 5, 218>, < 9, 1>, [scn.3d_face] - mcall , < 5, 1>, < 10, 20> - mcall , < 5, 218>, < 31, 1>, [scn.3d_light] - - mov ebx, 224 - sub ebx, [ans.size] - shl ebx, 16 - inc ebx - mcall , , < 9, 21>, [scn.gui_frame] - add ebx, [ans.size] - add ebx, 1 shl 16 - sub ebx, 3 - mcall , , , [scn.3d_light] - add ebx, 1 shl 16 - add ecx, 1 shl 16 - dec ebx - dec ecx - mcall , , , [scn.win_face] - shr ecx, 16 - mov bx, cx - add ebx, 3 shl 16 + 6 - mov ecx, [scn.win_text] - or ecx, 1b shl 31 - mcall 4, , , ans.buffer - - mcall 1, 4, 8, [scn.win_body] - mcall , 223 - mcall , , 30, [scn.3d_light] - mcall , 4 - - mov ebx, 214 - sub ebx, [ans.size] - cmp ebx, 24 - jg @f - mov ebx, 24 - @@: - mov [edb1.width], ebx - m2m [edb1.color], [scn.gui_face] - m2m [edb1.focus_border_color], [scn.gui_face] - cmp [error_n], 0 - je @f - mov [edb1.color], 0xFFAAAA - mov [edb1.focus_border_color], 0xFFAAAA - @@: - invoke editbox.draw, edb1 + call draw_textbox mov [but_id], 0x4000000A - stdcall draw_button, 4, 38, 42, buttons + 00, 15 - stdcall draw_button, 46, 38, 42, buttons + 01, 15 - stdcall draw_button, 88, 38, 42, buttons + 02, 15 - stdcall draw_button, 4, 38, 66, buttons + 03, 15 - stdcall draw_button, 46, 38, 66, buttons + 04, 15 - stdcall draw_button, 88, 38, 66, buttons + 05, 15 - stdcall draw_button, 4, 38, 90, buttons + 06, 15 - stdcall draw_button, 46, 38, 90, buttons + 07, 15 - stdcall draw_button, 88, 38, 90, buttons + 08, 15 - stdcall draw_button, 4, 80, 114, buttons + 09, 35 - stdcall draw_button, 88, 38, 114, buttons + 10, 15 + mov [txt_id], buttons + mov [txt_x], 16 + mov [but_w], 38 + stdcall draw_button, 4, 42 + stdcall draw_button, 46, 42 + stdcall draw_button, 88, 42 + stdcall draw_button, 4, 66 + stdcall draw_button, 46, 66 + stdcall draw_button, 88, 66 + stdcall draw_button, 4, 90 + stdcall draw_button, 46, 90 + stdcall draw_button, 88, 90 + stdcall draw_button, 88, 114 - stdcall draw_button, 144, 38, 42, buttons + 11, 15 - stdcall draw_button, 186, 38, 42, buttons + 12, 15 - stdcall draw_button, 144, 38, 66, buttons + 13, 15 - stdcall draw_button, 186, 38, 66, buttons + 14, 15 - stdcall draw_button, 144, 38, 90, buttons + 15, 15 - stdcall draw_button, 186, 38, 90, buttons + 16, 15 - stdcall draw_button, 144, 38, 114, buttons + 17, 15 - stdcall draw_button, 186, 38, 114, buttons + 18, 15 + stdcall draw_button, 144, 42 + stdcall draw_button, 186, 42 + stdcall draw_button, 144, 66 + stdcall draw_button, 186, 66 + stdcall draw_button, 144, 90 + stdcall draw_button, 186, 90 + stdcall draw_button, 144, 114 + stdcall draw_button, 186, 114 + + mov [txt_x], 37 + mov [but_w], 80 + stdcall draw_button, 4, 114 jmp update ;---------------------- ev_key: - mov [timer], 1 + mov [timer], 10 mcall 2 cmp ah, 27 @@ -159,16 +114,43 @@ ;---------------------- ev_button: - mov [timer], 1 + mov [timer], 10 mcall 17 cmp ah, 1 je exit - cmp ah, 22 + cmp ah, 2 + jne .not_copy + + .copy: + + mov eax, exp + mov ebx, ans.buffer + mov ecx, 0 + @@: + mov dl, [ebx] + mov [eax], dl + inc eax + inc ebx + inc ecx + cmp [eax - 1], byte 0 + jne @b + + dec ecx + mov [edb1.size], ecx + m2m [edb1.pos], [edb1.size] + + jmp .redraw + + .not_copy: + + cmp ah, 19 jne .not_del + .del: + cmp [edb1.pos], 0 je update mov eax, exp @@ -188,7 +170,7 @@ dec [edb1.pos] dec [edb1.size] m2m [edb1.shift], [edb1.pos] - jmp ev_redraw + jmp .redraw .not_del: @@ -219,7 +201,9 @@ inc [edb1.size] inc [edb1.pos] - jmp ev_redraw + .redraw: + call draw_textbox + jmp update ;---------------------- @@ -245,24 +229,50 @@ imul eax, 6 add eax, 9 mov [ans.size], eax - jmp ev_redraw + jmp .redraw .error: cmp [error_n], 1 je .err_1 - jmp ev_redraw + cmp [error_n], 4 + je .err_4 + + mov [ans.buffer + 0], dword "Expe" + mov [ans.buffer + 4], dword "cted" + mov [ans.buffer + 8], dword " ')'" + mov [ans.buffer + 12], byte 0 + mov [ans.size], 81 + + cmp [error_n], 2 + je .redraw + cmp [error_n], 3 + je .err_3 .err_1: mov [ans.buffer + 0], dword "Div." mov [ans.buffer + 4], dword " by " - mov [ans.buffer + 8], dword "zero" + mov [ans.buffer + 8], byte "0" + mov [ans.buffer + 9], byte 0 + mov [ans.size], 63 + jmp .redraw + .err_4: + mov [ans.buffer + 0], dword "Inpu" + mov [ans.buffer + 4], dword "t er" + mov [ans.buffer + 8], dword "rror" mov [ans.buffer + 12], byte 0 mov [ans.size], 81 - jmp ev_redraw + jmp .redraw + .err_3: + mov [ans.buffer + 10], byte "(" + jmp .redraw + + .redraw: + call draw_textbox + jmp update ;---------------------- - proc draw_button, x, w, y, txt, txtx - mcall 13, <[x], [w]>, <[y], 20>, [scn.gui_frame] + proc draw_button, x, y + mcall 13, <[x], [but_w]>, <[y], 20>, [scn.gui_frame] add ebx, 1 shl 16 add ecx, 1 shl 16 @@ -282,7 +292,7 @@ mcall 1, [x], [y], [scn.win_body] - add ebx, [w] + add ebx, [but_w] dec ebx mcall @@ -290,14 +300,14 @@ dec ecx mcall - sub ebx, [w] + sub ebx, [but_w] inc ebx mcall mov ebx, [x] inc ebx shl ebx, 16 - add ebx, [w] + add ebx, [but_w] sub ebx, 3 mov ecx, [y] inc ecx @@ -306,14 +316,79 @@ sub ecx, 3 mov edx, [but_id] mcall 8 - inc dword[but_id] mov ebx, [x] - add ebx, [txtx] + add ebx, [txt_x] shl ebx, 16 add ebx, [y] add ebx, 7 - mcall 4, , [scn.win_text], [txt], 1 + mcall 4, , [scn.win_text], [txt_id], 1 + + inc dword [txt_id] + inc dword [but_id] + + ret + endp + + ;---------------------- + + proc draw_textbox + mcall 13, < 4, 220>, < 8, 23>, [scn.gui_frame] + mov edx, [scn.gui_face] + cmp [error_n], 0 + je @f + mov edx, 0xFFAAAA + @@: + mcall 13, < 5, 218>, < 9, 21> + mcall , < 5, 218>, < 9, 1>, [scn.3d_face] + mcall , < 5, 1>, < 10, 20> + mcall , < 5, 218>, < 31, 1>, [scn.3d_light] + + mov ebx, 224 + sub ebx, [ans.size] + shl ebx, 16 + inc ebx + mcall , , < 9, 21>, [scn.gui_frame] + add ebx, [ans.size] + add ebx, 1 shl 16 + sub ebx, 3 + mcall , , , [scn.3d_light] + cmp [error_n], 0 + jne .btn_not + mcall 8, , , 0x40000002 + .btn_not: + add ebx, 1 shl 16 + add ecx, 1 shl 16 + dec ebx + dec ecx + mcall 13, , , [scn.win_face] + shr ecx, 16 + mov bx, cx + add ebx, 3 shl 16 + 6 + mov ecx, [scn.win_text] + or ecx, 1b shl 31 + mcall 4, , , ans.buffer + + mcall 1, 4, 8, [scn.win_body] + mcall , 223 + mcall , , 30, [scn.3d_light] + mcall , 4 + + mov ebx, 214 + sub ebx, [ans.size] + cmp ebx, 24 + jg @f + mov ebx, 24 + @@: + mov [edb1.width], ebx + m2m [edb1.color], [scn.gui_face] + m2m [edb1.focus_border_color], [scn.gui_face] + cmp [error_n], 0 + je @f + mov [edb1.color], 0xFFAAAA + mov [edb1.focus_border_color], 0xFFAAAA + @@: + invoke editbox.draw, edb1 ret endp @@ -339,5 +414,8 @@ scn sys_colors_new timer rd 1 but_id rd 1 + but_w rd 1 + txt_id rd 1 + txt_x rd 1 memory: diff --git a/programs/other/calcplus/parser.inc b/programs/other/calcplus/parser.inc index b4db2bb8f5..cb5077e506 100644 --- a/programs/other/calcplus/parser.inc +++ b/programs/other/calcplus/parser.inc @@ -12,48 +12,25 @@ ret } - proc convert_to_str uses ebx ecx edx esi edi, _num, _str - mov eax, [_num] - mov esi, [_str] - mov edi, 0 - mov ecx, eax - and ecx, 1 shl 31 - cmp ecx, 0 - je @f - mov [esi], byte "-" - inc esi - inc edi - not eax - inc eax - @@: - mov ebx, 10 - xor ecx, ecx - @@: - xor edx, edx - div ebx - push edx - inc ecx - inc edi - cmp eax, 0 - jne @b - @@: - pop eax - add al, "0" - mov [esi], al - inc esi - loop @b - mov [esi], byte 0 - mov eax, edi - ret - endp - ; --------------------------- proc parse mov [exp_pos], 0 + stdcall skip_spaces + + mov ebx, exp + add ebx, [exp_pos] + cmp [ebx], byte 0 + je .null_exp + + mov [exp_lvl], 0 mov [error_n], 0 stdcall parse_lvl0 ret + + .null_exp: + mov eax, 0 + ret endp ; --------------------------- @@ -68,7 +45,7 @@ cmp [ebx], byte 0 je .end cmp [ebx], byte ")" - je .end + je .brk_end inc [exp_pos] cmp [ebx], byte "+" jne .not_add @@ -79,15 +56,23 @@ jmp @b .not_add: cmp [ebx], byte "-" - jne @b + jne .unexp_char mov ecx, eax stdcall parse_lvl1 test_err sub ecx, eax mov eax, ecx jmp @b + .brk_end: + cmp [exp_lvl], 0 + jne @f + set_err 3 + @@: + dec [exp_lvl] .end: ret + .unexp_char: + set_err 4 endp ; --------------------------- @@ -101,9 +86,9 @@ add ebx, [exp_pos] cmp [ebx], byte 0 je .end - inc [exp_pos] cmp [ebx], byte "*" jne .not_mul + inc [exp_pos] mov ecx, eax stdcall parse_lvl2 test_err @@ -117,6 +102,7 @@ je .div_or_mod jmp .end .div_or_mod: + inc [exp_pos] mov ecx, eax stdcall parse_lvl2 test_err @@ -134,13 +120,35 @@ mov eax, edx jmp @b .end: - dec [exp_pos] ret endp ; --------------------------- - proc parse_lvl2 uses ebx + proc parse_lvl2 uses ebx ecx edx + test_err + stdcall parse_lvl3 + test_err + @@: + mov ebx, exp + add ebx, [exp_pos] + cmp [ebx], byte 0 + je .end + cmp [ebx], byte "^" + jne .end + inc [exp_pos] + mov ecx, eax + stdcall parse_lvl2 + test_err + stdcall c_power + jmp @b + .end: + ret + endp + + ; --------------------------- + + proc parse_lvl3 uses ebx test_err stdcall skip_spaces mov ebx, exp @@ -149,36 +157,73 @@ jl @f cmp [ebx], byte 57 jg @f - stdcall parse_lvl3 + stdcall parse_lvl4 jmp .end @@: inc [exp_pos] cmp [ebx], byte "(" jne @f + inc [exp_lvl] stdcall parse_lvl0 test_err + mov ebx, exp + add ebx, [exp_pos] + cmp [ebx], byte ")" + je .brk_ok + set_err 2 + .brk_ok: inc [exp_pos] jmp .end @@: cmp [ebx], byte "+" jne @f - stdcall parse_lvl2 + stdcall parse_lvl3 test_err jmp .end @@: cmp [ebx], byte "-" - jne .end - stdcall parse_lvl2 + jne .unexp_char + stdcall parse_lvl3 test_err neg eax .end: stdcall skip_spaces ret + .unexp_char: + set_err 4 endp ; --------------------------- - proc parse_lvl3 uses ebx ecx + proc parse_lvl4 uses ebx ecx + stdcall parse_lvl5 + @@: + mov ebx, exp + add ebx, [exp_pos] + cmp [ebx], byte 0 + je .end + cmp [ebx], byte "^" + jne .end + inc [exp_pos] + mov ecx, eax + mov ebx, exp + add ebx, [exp_pos] + cmp [ebx], byte 48 + jl .unexp_char + cmp [ebx], byte 57 + jg .unexp_char + stdcall parse_lvl4 + stdcall c_power + jmp @b + .end: + ret + .unexp_char: + set_err 4 + endp + + ; --------------------------- + + proc parse_lvl5 uses ebx ecx sub eax, eax sub ecx, ecx mov ebx, exp @@ -214,4 +259,56 @@ jmp @b @@: ret + endp + + ; --------------------------- + + proc c_power uses ebx + mov ebx, eax + mov eax, 1 + @@: + cmp ebx, 0 + je @f + imul eax, ecx + dec ebx + jmp @b + @@: + ret + endp + + ; --------------------------- + + proc convert_to_str uses ebx ecx edx esi edi, _num, _str + mov eax, [_num] + mov esi, [_str] + mov edi, 0 + mov ecx, eax + and ecx, 1 shl 31 + cmp ecx, 0 + je @f + mov [esi], byte "-" + inc esi + inc edi + not eax + inc eax + @@: + mov ebx, 10 + xor ecx, ecx + @@: + xor edx, edx + div ebx + push edx + inc ecx + inc edi + cmp eax, 0 + jne @b + @@: + pop eax + add al, "0" + mov [esi], al + inc esi + loop @b + mov [esi], byte 0 + mov eax, edi + ret endp \ No newline at end of file