diff --git a/programs/other/calcplus/calcplus.asm b/programs/other/calcplus/calcplus.asm index 9da123b0e4..32d5aaee01 100644 --- a/programs/other/calcplus/calcplus.asm +++ b/programs/other/calcplus/calcplus.asm @@ -1,4 +1,4 @@ - VERSION equ "0.4Å" + VERSION equ "0.5" use32 org 0 @@ -9,15 +9,27 @@ include "../../macros.inc" include "../../dll.inc" include "../../develop/libraries/box_lib/trunk/box_lib.mac" -; include "../../debug.inc" + ; include "../../debug.inc" include "parser.inc" ;=============================== - sz_cont db "?#" + LIST_ITEM_SIZE equ 16 + LIST_ITEM_COUNT equ 6 + LIST_SIZE equ LIST_ITEM_SIZE * LIST_ITEM_COUNT + LIST_ITEM_COLOR1 equ dword [scn.btn_face] + LIST_ITEM_COLOR2 equ dword [scn.win_face] + LIST_ITEM_TEXT1 equ dword [scn.btn_text] + LIST_ITEM_TEXT2 equ dword [scn.win_text] + LIST_ITEM_Y equ LIST_ITEM_SIZE / 2 - 3 + + KEYB_SIZE equ 140 + + sz_cont db "Keyboard ", 0x10 sz_head db "Calc+ [v", VERSION, "]", 0 -; buttons db "789456123()%^-+/*0" - edb1 edit_box 184, 8, 12, 0, 0, 0, 0, 0, 500, \ + btn_clr db "" + buttons db "|%^*/-+)(=7894561230" + edb1 edit_box 0, 8, 12, 0, 0, 0, 0, 0, 480, \ exp, group, ed_always_focus + ed_focus, 0, 0 imports: @@ -58,69 +70,40 @@ cmp eax, EV_MOUSE je ev_mouse - dec [timer] - cmp [timer], 0 - je calc - jmp update ;---------------------- ev_redraw: - mov edx, [scn.win_body] + mcall 12, 1 + + ; WINDOW + mov edx, [scn.win_face] or edx, 0x34 shl 24 - mcall 0, <100, 236 + 100>, <100, 164 - 102>, , , sz_head + mcall 0, <100, 236 + 100 - 50 - 25>, <100, 66 + LIST_SIZE>, , , sz_head - mcall 8, <275, 12>, <-17, 12>, 2 + 1 shl 30 - sub ebx, 12 shl 16 - inc edx - mcall - - mcall 4, <279, -14>, [scn.win_title], sz_cont, 1 - add ebx, 1 shl 16 - mcall - - sub ebx, 13 shl 16 - inc edx - mcall + ; TOOLBAR + mov ebx, (275 - 50 - 25 - 50) shl 16 + 64 + cmp [keyb], byte 1 + jne @f + add ebx, KEYB_SIZE shl 16 + @@: + mcall 8, , <-17, 12>, 2 + 1 shl 30 + add ebx, 4 shl 16 - (64 + 14) + mcall 4, , [scn.win_title], sz_cont, 10 + ; CONTENT call draw_textbox + call draw_keyb + call draw_list -; mov [but_id], 0x0000000A -; 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, 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 + mcall 12, 2 jmp update ;---------------------- ev_key: - mov [timer], 10 - mcall 2 cmp ah, 27 je exit @@ -132,16 +115,15 @@ ;---------------------- ev_button: - mov [timer], 10 - mcall 17 + ; EXIT cmp ah, 1 je exit - cmp ah, 19 + ; DELETE + cmp ah, 4 jne .not_del - .del: cmp [edb1.pos], 0 je update mov eax, exp @@ -164,33 +146,112 @@ jmp .redraw .not_del: -; cmp ah, 10 -; jl update -; cmp ah, 50 -; jg update -; -; movzx eax, ah -; add eax, buttons -; sub eax, 10 -; mov al, [eax] -; -; mov ebx, exp -; add ebx, [edb1.size] -; mov ecx, exp -; add ecx, [edb1.pos] -; @@: -; cmp ebx, ecx -; je @f -; mov dl, [ebx - 1] -; mov [ebx], dl -; dec ebx -; jmp @b -; @@: -; -; mov [ebx], al -; inc [edb1.size] -; inc [edb1.pos] + ; SHOW/HIDE KEYBOARD + cmp ah, 2 + jne .not_keyb + cmp [keyb], byte 0 + je .open + + mcall 67, -1, -1, 286 - 25, -1 + mov [keyb], 0 + mov [sz_cont + 9], byte 0x10 + jmp ev_redraw + + .open: + mcall 67, -1, -1, 286 - 25 + KEYB_SIZE, -1 + mov [keyb], 1 + mov [sz_cont + 9], byte 0x11 + jmp ev_redraw + + jmp update + .not_keyb: + + ; CALCULATE + cmp ah, 19 + je calc + + ; LIST + cmp ah, 0x60 + jl .not_list + + sub ah, 0x60 + movzx ebx, ah + imul ebx, 512 + add ebx, history + add ebx, 482 + stdcall str_len, ebx + + mov edx, exp + add edx, [edb1.size] + add edx, eax + mov edi, exp + add edi, [edb1.pos] + @@: + cmp edx, edi + je @f + mov esi, edx + sub esi, eax + push eax + mov al, [esi] + mov [edx], al + pop eax + dec edx + jmp @b + @@: + add [edb1.size], eax + + @@: + cmp eax, 0 + je @f + mov cl, [ebx] + mov [edi], cl + inc edi + inc ebx + dec eax + inc [edb1.pos] + jmp @b + @@: + + jmp .redraw + .not_list: + + ; KEYBOARD + cmp ah, 10 + jl update + cmp ah, 50 + jg update + mov dh, ah + + mov ebx, exp + add ebx, [edb1.size] + mov ecx, exp + add ecx, [edb1.pos] + cmp dh, 30 + jl @f + add ebx, 2 + @@: + cmp ebx, ecx + je @f + mov dl, [ebx - 1] + mov [ebx], dl + dec ebx + jmp @b + @@: + + movzx eax, dh + add eax, buttons + sub eax, 10 + mov al, [eax] + + mov [ebx], al + inc [edb1.size] + inc [edb1.pos] + cmp dh, 30 + jl @f + add [edb1.size], 2 + add [edb1.pos], 2 + @@: .redraw: call draw_textbox jmp update @@ -219,11 +280,52 @@ stdcall convert_to_str, eax, ans.buffer + 2 add eax, 2 + mov edi, eax imul eax, 6 add eax, 9 mov [ans.size], eax + + ; HISTORY + mov ecx, LIST_ITEM_COUNT - 1 + mov eax, history + add eax, (LIST_ITEM_COUNT - 1) * 512 + @@: + mov ebx, eax + sub ebx, 512 + stdcall str_cpy, ebx, eax + add ebx, 480 + add eax, 480 + stdcall str_cpy, ebx, eax + sub ebx, 480 + sub eax, 480 + mov esi, [ebx + 508] + mov [eax + 508], esi + sub eax, 512 + loop @b + + stdcall str_cpy, exp, history + stdcall str_cpy, ans.buffer, history + 480 + mov esi, [ans.size] + mov dword[history + 508], esi + not [his_even] + + ; Check length + mov esi, 37 + sub esi, edi + stdcall str_len, exp + sub esi, eax + cmp esi, 0 + jg .redraw + + mov ebx, history + add ebx, eax + add ebx, esi + mov [ebx], dword ".." + jmp .redraw + ; ERRORS + .error: cmp [error_n], 1 je .err_1 @@ -240,6 +342,8 @@ je .redraw cmp [error_n], 3 je .err_3 + cmp [error_n], 5 + je .err_5 .err_1: mov [ans.buffer + 0], dword "Div." mov [ans.buffer + 4], dword " by " @@ -257,52 +361,53 @@ .err_3: mov [ans.buffer + 10], byte "(" jmp .redraw + .err_5: + mov [ans.buffer + 10], byte "|" + jmp .redraw .redraw: call draw_textbox + call draw_list jmp update ;---------------------- -; proc draw_button, x, y -; mcall 8, <[x], [but_w]>, <[y], 20>, [but_id], [scn.btn_face] -; -; mcall 1, [x], [y], [scn.win_face] -; add ebx, [but_w] -; mcall -; add ecx, 20 -; mcall -; sub ebx, [but_w] -; mcall -; -; mov ebx, [x] -; add ebx, [txt_x] -; shl ebx, 16 -; add ebx, [y] -; add ebx, 7 -; mcall 4, , [scn.win_text], [txt_id], 1 -; -; inc dword [txt_id] -; inc dword [but_id] -; -; ret -; endp + proc draw_button, x, y + mcall 8, <[x], 30>, <[y], 21>, [but_id], [but_c] + + mov ebx, [x] + mov esi, [txt_size] + imul esi, 3 + mov edi, 16 + sub edi, esi + add ebx, edi + shl ebx, 16 + add ebx, [y] + add ebx, 7 + mcall 4, , [but_tc], [txt_id], [txt_size] + + mov eax, [txt_size] + add [txt_id], eax + inc dword [but_id] + + ret + endp ;---------------------- proc draw_textbox - mcall 13, <4, 320>, < 8, 23>, [scn.gui_frame] + mcall 13, <4, 320 - 50 - 25>, < 8, 23>, [scn.gui_frame] mov edx, [scn.gui_face] cmp [error_n], 0 je @f mov edx, 0xFFAAAA @@: - mcall 13, < 5, 318>, < 9, 21> - mcall , < 5, 318>, < 9, 1>, [scn.3d_face] + mcall 13, < 5, 318 - 50 - 25>, < 9, 21> + mcall , < 5, 318 - 50 - 25>, < 9, 1>, [scn.3d_face] mcall , < 5, 1>, < 10, 20> - mcall , < 5, 318>, < 31, 1>, [scn.3d_light] + mcall , < 5, 318 - 50 - 25>, < 31, 1>, [scn.3d_light] - mov ebx, 328 + mov ebx, 328 - 16 - 50 - 25 sub ebx, [ans.size] shl ebx, 16 add ebx, 16 @@ -310,12 +415,19 @@ or ecx, 1 shl 31 mcall 4, , , ans.buffer + mov ecx, [scn.gui_text] + mcall , <310 - 50 - 25, 16>, , btn_clr, 1 + add ebx, 1 shl 16 + mcall + + mcall 8, <305 - 50 - 25, 17>, <9, 20>, 0x40000004 + mcall 1, 4, 8, [scn.win_body] - mcall , 323 + mcall , 323 - 50 - 25 mcall , , 30, [scn.3d_light] mcall , 4 - mov ebx, 318 + mov ebx, 318 - 16 - 50 - 25 sub ebx, [ans.size] cmp ebx, 24 jg @f @@ -336,6 +448,172 @@ ;---------------------- + proc draw_keyb + cmp [keyb], byte 0 + je @f + + mov [txt_size], 1 + mov [but_id], 0x0000000A + mov [txt_id], buttons + + mov eax, [scn.win_face] + mov [but_c], eax + mov eax, [scn.win_text] + mov [but_tc], eax + stdcall draw_button, 4 + 278 - 25, 42 - 25 - 8 + stdcall draw_button, 37 + 278 - 25, 42 - 25 - 8 + stdcall draw_button, 70 + 278 - 25, 42 - 25 - 8 + stdcall draw_button, 103 + 278 - 25, 42 - 25 - 8 + stdcall draw_button, 103 + 278 - 25, 66 - 25 - 8 + stdcall draw_button, 103 + 278 - 25, 90 - 25 - 8 + stdcall draw_button, 103 + 278 - 25, 114 - 25 - 8 + stdcall draw_button, 70 + 278 - 25, 139 - 25 - 8 + stdcall draw_button, 37 + 278 - 25, 139 - 25 - 8 + + mov eax, [scn.btn_inface] + mov [but_c], eax + mov eax, [scn.btn_intext] + mov [but_tc], eax + stdcall draw_button, 103 + 278 - 25, 139 - 25 - 8 + + mov eax, [scn.btn_face] + mov [but_c], eax + mov eax, [scn.btn_text] + mov [but_tc], eax + stdcall draw_button, 4 + 278 - 25, 66 - 25 - 8 + stdcall draw_button, 37 + 278 - 25, 66 - 25 - 8 + stdcall draw_button, 70 + 278 - 25, 66 - 25 - 8 + stdcall draw_button, 4 + 278 - 25, 90 - 25 - 8 + stdcall draw_button, 37 + 278 - 25, 90 - 25 - 8 + stdcall draw_button, 70 + 278 - 25, 90 - 25 - 8 + stdcall draw_button, 4 + 278 - 25, 114 - 25 - 8 + stdcall draw_button, 37 + 278 - 25, 114 - 25 - 8 + stdcall draw_button, 70 + 278 - 25, 114 - 25 - 8 + stdcall draw_button, 4 + 278 - 25, 139 - 25 - 8 + + @@: + ret + endp + + ;---------------------- + + proc draw_list + ; BACKGROUND + mov edi, LIST_ITEM_COUNT + mov eax, 13 + mov ebx, 4 shl 16 + 320 - 50 - 25 + mov ecx, 37 shl 16 + LIST_ITEM_SIZE + mov edx, LIST_ITEM_COLOR1 + cmp [his_even], byte 0 + je @f + mov edx, LIST_ITEM_COLOR2 + @@: + mcall + add ecx, LIST_ITEM_SIZE shl 16 + cmp edx, LIST_ITEM_COLOR1 + je .set_color_to_2 + mov edx, LIST_ITEM_COLOR1 + jmp .next + .set_color_to_2: + mov edx, LIST_ITEM_COLOR2 + .next: + dec edi + cmp edi, 0 + jne @b + + ; BUTTONS + mov edi, LIST_ITEM_COUNT + mov eax, 8 + mov ebx, 4 shl 16 + 320 - 50 - 25 + mov ecx, 37 shl 16 + LIST_ITEM_SIZE + mov edx, 0x40000060 + @@: + mcall + add ecx, LIST_ITEM_SIZE shl 16 + inc edx + dec edi + cmp edi, 0 + jne @b + + ; TEXT + mov edi, LIST_ITEM_COUNT + mov eax, 4 + mov ebx, 8 shl 16 + 37 + LIST_ITEM_Y + mov ecx, LIST_ITEM_TEXT1 + cmp [his_even], byte 0 + je @f + mov ecx, LIST_ITEM_TEXT2 + @@: + or ecx, 1 shl 31 + mov edx, history + @@: + mcall + + push ebx + add ebx, (320 - 50 - 25) shl 16 + mov esi, [edx + 508] + shl esi, 16 + sub ebx, esi + add edx, 480 + mcall + pop ebx + + add edx, 32 + add ebx, LIST_ITEM_SIZE + + and ecx, 0xFFFFFF + cmp ecx, LIST_ITEM_TEXT2 + je .set_color_to_2_txt + mov ecx, LIST_ITEM_TEXT2 + jmp .next_txt + .set_color_to_2_txt: + mov ecx, LIST_ITEM_TEXT1 + .next_txt: + or ecx, 1 shl 31 + + dec edi + cmp edi, 0 + jne @b + + ret + endp + + ;---------------------- + + proc str_len uses ebx, str + xor eax, eax + mov ebx, [str] + @@: + cmp [ebx], byte 0 + je @f + inc eax + inc ebx + jmp @b + @@: + + ret + endp + + ;---------------------- + + proc str_cpy uses eax ebx ecx, from, to + mov eax, [from] + mov ebx, [to] + @@: + cmp [eax], byte 0 + je @f + mov cl, [eax] + mov [ebx], cl + inc eax + inc ebx + jmp @b + @@: + mov [ebx], byte 0 + ret + endp + + ;---------------------- + dataend: ;=============================== @@ -343,20 +621,27 @@ rb 2048 stacktop: - exp rb 512 + exp rb 480 exp_pos rd 1 exp_lvl rd 1 + abs_lvl rd 1 group rd 1 - ans.buffer:rb 512 + ans.buffer:rb 480 ans.size rd 1 error_n rd 1 scn sys_colors_new timer rd 1 but_id rd 1 - but_w rd 1 + but_c rd 1 + but_tc rd 1 txt_id rd 1 - txt_x rd 1 + txt_size rd 1 + keyb rb 1 + + his_even rb 1 + history rb 512 * LIST_ITEM_COUNT + rb 512 memory: diff --git a/programs/other/calcplus/parser.inc b/programs/other/calcplus/parser.inc index 9c6fe21473..0dcd263e00 100644 --- a/programs/other/calcplus/parser.inc +++ b/programs/other/calcplus/parser.inc @@ -46,6 +46,8 @@ je .end cmp [ebx], byte ")" je .brk_end + cmp [ebx], byte "|" + je .abs_end inc [exp_pos] cmp [ebx], byte "+" jne .not_add @@ -69,6 +71,13 @@ set_err 3 @@: dec [exp_lvl] + jmp .end + .abs_end: + cmp [abs_lvl], 0 + jne @f + set_err 5 + @@: + dec [abs_lvl] .end: ret .unexp_char: @@ -180,6 +189,24 @@ .brk_ok: inc [exp_pos] jmp .end + @@: + cmp [ebx], byte "|" + jne @f + inc [abs_lvl] + stdcall parse_lvl0 + test_err + mov ebx, exp + add ebx, [exp_pos] + cmp [ebx], byte "|" + je .abs_ok + set_err 5 + .abs_ok: + inc [exp_pos] + cmp eax, 0 + jge .end + not eax + inc eax + jmp .end @@: cmp [ebx], byte "+" jne @f