⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ewcalc.asm

📁 简易的计算器,能进行加,减,乘,除等简单的运算!
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;=========================================================================|
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 + -