📄 ewcalc.asm
字号:
;=========================================================================|
InfoAbDlg proc hdlg:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
.if wmsg != WM_COMMAND
jmp AboutDone
.endif
mov eax, wparam
.if eax == 1 || eax == 2 ; CANCEL or OK
INVOKE EndDialog, hdlg, wparam
mov eax, TRUE ; Return
jmp AboutRet ; with TRUE
.endif
AboutDone:
mov eax, FALSE ; Return with FALSE
AboutRet:
ret
InfoAbDlg endp
;=========================================================================|
; Processes keyboard input. |
;=========================================================================|
EditProc PROC hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
mov Key, 0
.if wmsg == WM_KEYDOWN
.endif
.if wmsg == WM_KEYUP
INVOKE SendMessage, hEdit, WM_GETTEXT, 35, ADDR Buff
INVOKE lstrlen, ADDR Buff
.if eax > 16 && BPress == 3
INVOKE MessageBeep, MB_OK
mov Buff + 15, 0
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR Buff
.endif
.if eax > 19 && BPress == 4 || eax > 19 && Float == 1
INVOKE MessageBeep, MB_OK
mov Buff + 18, 0
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR Buff
.endif
.if wparam > 2fh && wparam < 3ah
MOVmd Key, wparam
sub Key, 48
add Key, 200
jmp pass
.endif
.if wparam > 5fh && wparam < 6ah
MOVmd Key, wparam
sub Key, 96
add Key, 200
jmp pass
.endif
.if wparam > 40h && wparam < 47h
MOVmd Key, wparam
sub Key, 55
add Key, 200
jmp pass
.endif
.if wparam == 6eh || wparam == 0beh
mov Key, 216 ; .
.elseif wparam == 6bh || wparam == 0bbh
mov Key, 218 ; +
.elseif wparam == 6dh || wparam == 0bdh
mov Key, 219 ; -
.elseif wparam == 6ah || wparam == 0bah
mov Key, 220 ; *
.elseif wparam == 6fh || wparam == 0bfh
mov Key, 221 ; /
.elseif wparam == 0dh
mov Key, 222 ; =
.else
.endif
pass:
.endif
INVOKE CallWindowProc, SubEdit, hwnd, wmsg, wparam, lparam
.if Key > 0
call ToolbarProc
.endif
RET
EditProc ENDP
;=========================================================================|
; Processes calculator input. |
;=========================================================================|
ToolbarProc PROC hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
.if wmsg == WM_COMMAND || Key > 0
push edi
push esi
INVOKE SendMessage, hOpr, WM_SETTEXT, NULL, ADDR Clear
.if Key > 0
MOVmd wparam, Key
mov Key, 0
INVOKE SetFocus, hWnd
.endif
INVOKE SendMessage, hEdit, WM_GETTEXT, 35, offset ConvO
INVOKE SendMessage, hEdit, WM_GETTEXT, 35, offset Buff
.if Buff == '*'
jmp GetOut
.endif
mov eax, wparam
mov N, 0
.if Base == 10 || Base == 8 ; Dec or Oct
or N, 1
.endif
.if ((eax > 199 && eax < 210 && N == 1 || eax > 199 && eax < 216 && Base == 16)\
|| (eax > 199 && eax < 202 && Base == 2 || eax == 216))
mov eax, wparam
sub eax, 200
.if eax == 16
.if DP == 0
mov ConvI, '.'
mov ConvI+1, 0
.else
mov ConvI, 0
.endif
jmp DecP
.endif
lea ebx, offset FmtA
.if Base ==16
lea ebx, offset FmtH
.endif
INVOKE wsprintf, ADDR ConvI, ebx, eax
DecP:
.if ConvO == '0' && ConvO + 1 == 0
mov ConvO, 0
.endif
INVOKE lstrcat, offset ConvO, offset ConvI
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, offset ConvO
INVOKE lstrlen, ADDR ConvO
mov ebx, 34
.if Base == 16
mov ebx, 28
.endif
.if eax > ebx
INVOKE MessageBeep, MB_OK
mov ConvO[ebx], 0
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
.endif
.if eax > 16 && BPress == 3
INVOKE MessageBeep, MB_OK
mov ConvO + 16, 0
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
.endif
.if eax > 19 && BPress == 4 || eax > 19 && Float == 1
INVOKE MessageBeep, MB_OK
mov ConvO + 19, 0
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
.endif
INVOKE SendMessage, hEdit, EM_SETSEL, 34, 34
INVOKE lstrcpyn, ADDR Buff, ADDR ConvO, 34
call AsciiToBase
INVOKE lstrcpyn, ADDR Buff, ADDR ConvO, 34
call AsciiToFloat
mov edx, offset RNum10
call FloatToAscii
call Display
mov eax, wparam
.endif
;--------[ Memory clear ]-------------------------------------------------
.if eax == IDB_BUTMC
fldz
fstp RMem10
INVOKE CLRMW, offset MEM, 12
INVOKE SendMessage, hMem, WM_SETTEXT, NULL, ADDR Clear
.endif
;--------[ Memory recall ]------------------------------------------------
.if eax == IDB_BUTMR
.if BPress == 0
fld RMem10
fstp RNum10
fld RMem10
fstp RWrk10
.else
fld RNum10
fstp RWrk10
fld RMem10
fstp RNum10
.endif
mov edx, offset RNum10
call FloatToAscii
INVOKE CopyMW, offset R, offset MEM, 12
call BaseToAscii
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR ConvO
INVOKE SendMessage, hEdit, EM_SETSEL, 33, 33
call Display
.endif
;--------[ Memory store ]-------------------------------------------------
.if eax == IDB_BUTMS
fld RNum10
fstp RMem10
INVOKE CopyMW, offset MEM, offset R, 12
INVOKE SendMessage, hMem, WM_SETTEXT, NULL, ADDR M
call StoreCLR
.endif
;--------[ Memory add ]---------------------------------------------------
.if eax == IDB_BUTMP
fld RNum10
fld RMem10
fadd ST(0), ST(1)
fstp RMem10
mov edx, offset RMem10
call FloatToAscii
INVOKE CopyMW, offset PT, offset MEM, 12
mov BPress, 1
call Prep
call AddEM
mov BPress, 0
INVOKE CopyMW, offset MEM, offset R, 12
INVOKE SendMessage, hMem, WM_SETTEXT, NULL, ADDR M
call StoreCLR
.endif
;--------[ Memory subtract ]----------------------------------------------
.if eax == IDB_BUTMM
fld RNum10
fld RMem10
fsub ST(0), ST(1)
fstp RMem10
mov edx, offset RMem10
call FloatToAscii
INVOKE CopyMW, offset PT, offset MEM, 12
mov BPress, 2
call Prep
call SubEM
and BPress, 0
INVOKE CopyMW, offset MEM, offset R, 12
INVOKE SendMessage, hMem, WM_SETTEXT, NULL, ADDR M
call StoreCLR
.endif
;--------[ Load pi ]------------------------------------------------------
.if eax == IDB_BUTPI
fldpi
fstp RNum10
mov edx, offset RNum10
call FloatToAscii
INVOKE SendMessage, hEdit, WM_SETTEXT, NULL, ADDR Pi
INVOKE SendMessage, hEdit, EM_SETSEL, 33, 33
INVOKE lstrcpy, ADDR Buff, ADDR Pi
call AsciiToBase
call Display
.endif
;--------[ Trig functions ]-----------------------------------------------
.if eax == IDB_BUTSIN || eax == IDB_BUTCOS || eax == IDB_BUTTAN ||\
eax == IDB_BUTSEC || eax == IDB_BUTCSC || eax == IDB_BUTCOT
finit
fld RNum10
.if T == 1
fld RDeg10
fmul ST(0), ST(1)
.if eax == IDB_BUTTAN && ArcOn == 1
fld RNum10
.endif
.endif
.if eax == IDB_BUTSIN
.if ArcOn == 0
fsin
.else
fld st(0) ; Duplicate X on tos.
fmul ; Compute X**2.
fld st(0) ; Duplicate X**2 on tos.
fld1 ; Compute 1-X**2.
fsubr
fdiv ; Compute X**2/(1-X**2).
fsqrt ; Compute sqrt(x**2/(1-X**2)).
fld1 ; To compute full arctangent.
fpatan ; Compute atan of the above.
.endif
.elseif eax == IDB_BUTCOS
.if ArcOn == 0
fcos
.else
fld st(0) ; Duplicate X on tos.
fmul ; Compute X**2.
fld st(0) ; Duplicate X**2 on tos.
fld1 ; Compute 1-X**2.
fsubr
fdivr ; Compute (1-x**2)/X**2.
fsqrt ; Compute sqrt((1-X**2)/X**2).
fld1 ; To compute full arctangent.
fpatan ; Compute atan of the above.
.endif
.elseif eax == IDB_BUTTAN && ArcOn == 0
fptan
fmul ST(0), ST(1)
.elseif eax == IDB_BUTTAN && ArcOn == 1
fld1 ; To compute full arctangent.
fpatan ; Compute atan of the above.
.if T == 1
fld RRad10
fmul ST(0), ST(1)
.endif
.elseif eax == IDB_BUTSEC
.if ArcOn == 0
fcos
fld1
fdivr
.else
fld st(0) ; Duplicate
fmul ; Compute x*x
fld1 ; Load 1
fsub ; Compute x*x-1
fsqrt ; Compute sqrt(x*x-1)
fld1 ; Load 1
fpatan ; Compute atan of above.
.endif
.elseif eax == IDB_BUTCSC
.if ArcOn == 0
fsin
fld1
fdivr
.else
fld st(0) ; Duplicate
fmul ; Compute x*x
fld1 ; Load 1
fsub ; Compute x*x-1
fld1 ; Load 1
fdivr ; Compute 1/(x*x-1)
fsqrt ; Compute sqrt(1/(x*x-1))
fld1 ; Load 1
fpatan ; Compute atan of above.
.endif
.elseif eax == IDB_BUTCOT
.if ArcOn == 0
fsincos
fdivr
.else
fld1 ; fpatan computes
fxch ; atan(st(1)/st(0)).
fpatan ; atan(st(0)/st(1)).
.endif
.endif
fstp RNum10
.if ArcOn == 0 || ArcOn == 1 && eax == IDB_BUTTAN
or NoFix, 1
.endif
mov edx,offset RNum10
call FloatToAscii
and NoFix, 0
jmp FromSQ
.endif
;--------[ Log 10 function ]----------------------------------------------
.if eax == IDB_BUTLOG && Buff != 0
finit
call AsciiToFloat
fld RNum10
fld1
fxch
fyl2x ; st(1) * log2(st(0)) 'alpha l not num 1'
fldl2t
fdiv
fstp RNum10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -