kolibrios/programs/other/calcplus/calcplus.asm
eAndrew 1922dd81c6 Calc+ v0.2β: add "^" operator, bugfixes, optimization.
git-svn-id: svn://kolibrios.org@4875 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-04-22 16:45:27 +00:00

422 lines
8.6 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

VERSION equ "0.2Å"
use32
org 0
db 'MENUET01'
dd 1, main, dataend, memory, stacktop, 0, 0
include "../../proc32.inc"
include "../../macros.inc"
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 "123456789()%^-+/*0"
edb1 edit_box 184, 8, 12, 0, 0, 0, 0, 0, 500, \
exp, group, ed_always_focus + ed_focus, 0, 0
imports:
library gui, "box_lib.obj"
import gui, editbox.draw, "edit_box", \
editbox.key, "edit_box_key", \
editbox.mouse, "edit_box_mouse"
;===============================
main:
mov [ans.buffer], word "0"
mov [ans.size], 15
mcall 40, 100111b
mcall 48, 3, scn, 192
m2m [edb1.color], [scn.gui_face]
m2m [edb1.shift_color], [scn.gui_select]
m2m [edb1.focus_border_color], [scn.gui_face]
m2m [edb1.text_color], [scn.gui_fctext]
mcall 68, 11
stdcall dll.Load, imports
;----------------------
update:
mcall 23, 5
cmp eax, EV_REDRAW
je ev_redraw
cmp eax, EV_KEY
je ev_key
cmp eax, EV_BUTTON
je ev_button
cmp eax, EV_MOUSE
je ev_mouse
dec [timer]
cmp [timer], 0
je calc
jmp update
;----------------------
ev_redraw:
mov edx, [scn.win_body]
or edx, 0x34 shl 24
mcall 0, <100, 236>, <100, 164>, , , sz_head
call draw_textbox
mov [but_id], 0x4000000A
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
jmp update
;----------------------
ev_key:
mov [timer], 10
mcall 2
cmp ah, 27
je exit
invoke editbox.key, edb1
jmp update
;----------------------
ev_button:
mov [timer], 10
mcall 17
cmp ah, 1
je exit
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
add eax, [edb1.pos]
dec eax
mov ebx, exp
add ebx, [edb1.size]
inc ebx
@@:
cmp eax, ebx
je @f
mov cl, [eax + 1]
mov [eax], cl
inc eax
jmp @b
@@:
dec [edb1.pos]
dec [edb1.size]
m2m [edb1.shift], [edb1.pos]
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]
.redraw:
call draw_textbox
jmp update
;----------------------
ev_mouse:
mcall 2
invoke editbox.mouse, edb1
jmp update
;----------------------
exit:
mcall -1
;----------------------
calc:
stdcall parse
cmp [error_n], 0
jne .error
stdcall convert_to_str, eax, ans.buffer
imul eax, 6
add eax, 9
mov [ans.size], eax
jmp .redraw
.error:
cmp [error_n], 1
je .err_1
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], 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 .redraw
.err_3:
mov [ans.buffer + 10], byte "("
jmp .redraw
.redraw:
call draw_textbox
jmp update
;----------------------
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
sub ebx, 2
sub ecx, 2
mcall , , , [scn.3d_light]
add ebx, 1 shl 16
add ecx, 1 shl 16
dec ebx
dec ecx
mcall , , , [scn.3d_dark]
dec ebx
dec ecx
mcall , , , [scn.win_face]
mcall 1, [x], [y], [scn.win_body]
add ebx, [but_w]
dec ebx
mcall
add ecx, 20
dec ecx
mcall
sub ebx, [but_w]
inc ebx
mcall
mov ebx, [x]
inc ebx
shl ebx, 16
add ebx, [but_w]
sub ebx, 3
mov ecx, [y]
inc ecx
shl ecx, 16
add ecx, 20
sub ecx, 3
mov edx, [but_id]
mcall 8
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_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
;----------------------
dataend:
;===============================
rb 2048
stacktop:
exp rb 512
exp_pos rd 1
exp_lvl rd 1
group rd 1
ans.buffer:rb 512
ans.size rd 1
error_n rd 1
scn sys_colors_new
timer rd 1
but_id rd 1
but_w rd 1
txt_id rd 1
txt_x rd 1
memory: