1,4 → 1,4 |
VERSION equ "0.4Å" |
VERSION equ "0.5" |
|
use32 |
org 0 |
14,10 → 14,22 |
|
;=============================== |
|
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 |
; 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 |
|
mcall 4, <279, -14>, [scn.win_title], sz_cont, 1 |
add ebx, 1 shl 16 |
mcall |
|
sub ebx, 13 shl 16 |
inc edx |
mcall |
|
; 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 |
mcall 12, 2 |
|
; mov [txt_x], 37 |
; mov [but_w], 80 |
; stdcall draw_button, 4, 114 |
|
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,12 → 621,13 |
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 |
|
355,8 → 634,14 |
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: |