format PE GUI 4.0
entry start

include 'c:\FASM\include\win32a.inc'

section '.data' data readable writeable

  _class TCHAR 'FASMWIN32CALC',0
  _title TCHAR 'Calculator',0
  _error TCHAR 'Startup failed.',0
  EditClass	       db "EDIT",0
  ButtonClass	       db "BUTTON",0
  timestxt	       db "X",0
  dividetxt	       db "/",0
  addtxt	       db "+",0
  minustxt	       db "-",0
  hwndnuma	       dd ?
  hwndnumb	       dd ?
  hwndanswer	       dd ?
  hwndtimes	       dd ?
  hwnddivide	       dd ?
  hwndadd	       dd ?
  hwndminus	       dd ?
  timestxtID	       equ 100
  dividetxtID	       equ 101
  addtxtID	       equ 102
  minustxtID	       equ 103
  timesID	       equ 104
  divideID	       equ 105
  addID 	       equ 106
  minusID	       equ 107
  numaID	       equ 108
  numbID	       equ 109
  answerID	       equ 110
  numatext: times 100  db 0
  numbtext: times 100  db 0
  numaint	       dd 0
  numbint	       dd 0
  return	       db 0

  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class

  msg MSG

section '.code' code readable executable

  start:

	invoke	GetModuleHandle,0
	mov	[wc.hInstance],eax
	invoke	LoadIcon,0,IDI_APPLICATION
	mov	[wc.hIcon],eax
	invoke	LoadCursor,0,IDC_ARROW
	mov	[wc.hCursor],eax
	invoke	RegisterClass,wc
	test	eax,eax
	jz	error

	invoke	CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,105,139,NULL,NULL,[wc.hInstance],NULL
	test	eax,eax
	jz	error

  msg_loop:
	invoke	GetMessage,msg,NULL,0,0
	cmp	eax,1
	jb	end_loop
	jne	msg_loop
	invoke	TranslateMessage,msg
	invoke	DispatchMessage,msg
	jmp	msg_loop

  error:
	invoke	MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

  end_loop:
	invoke	ExitProcess,[msg.wParam]

proc WindowProc hwnd,wmsg,wparam,lparam
	push	ebx esi edi
	cmp	[wmsg],WM_DESTROY
	je	.wmdestroy
	cmp	[wmsg],WM_CREATE
	je	.wmcreate
	cmp	[wmsg],WM_COMMAND
	je	.wmcommand

  .defwndproc:
	invoke	DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
	jmp	.finish

  .wmcreate:
	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ ; first textbox
	EditClass,\
	NULL,\
	WS_CHILD+ WS_VISIBLE+ ES_NUMBER,\
	5,5,100,25,\
	[hwnd],\
	numaID,\
	[wc.hInstance],\
	NULL
	mov [hwndnuma],eax

	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ ; second textbox
	EditClass,\
	NULL,\
	WS_CHILD+ WS_VISIBLE+ ES_NUMBER,\
	5,32,100,25,\
	[hwnd],\
	numbID,\
	[wc.hInstance],\
	NULL
	mov [hwndnumb],eax

	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ ; last (answer) textbox
	EditClass,\
	NULL,\
	WS_CHILD+ WS_VISIBLE,\
	5,80,100,25,\
	[hwnd],\
	answerID,\
	[wc.hInstance],\
	NULL
	mov [hwndanswer],eax

	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ ; X button
	ButtonClass,\
	timestxt,\
	WS_CHILD+ WS_VISIBLE+ BS_PUSHBUTTON,\
	5,60,20,20,\
	[hwnd],\
	timesID,\
	[wc.hInstance],\
	NULL
	mov [hwndtimes],eax

	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\  ; \ button
	ButtonClass,\
	dividetxt,\
	WS_CHILD+ WS_VISIBLE+ BS_PUSHBUTTON,\
	30,60,20,20,\
	[hwnd],\
	divideID,\
	[wc.hInstance],\
	NULL
	mov [hwnddivide],eax

	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\  ; + button
	ButtonClass,\
	addtxt,\
	WS_CHILD+ WS_VISIBLE+ BS_PUSHBUTTON,\
	55,60,20,20,\
	[hwnd],\
	addID,\
	[wc.hInstance],\
	NULL
	mov [hwndadd],eax

	invoke CreateWindowEx,WS_EX_CLIENTEDGE,\  ; - button
	ButtonClass,\
	minustxt,\
	WS_CHILD+ WS_VISIBLE+ BS_PUSHBUTTON,\
	80,60,20,20,\
	[hwnd],\
	minusID,\
	[wc.hInstance],\
	NULL
	mov [hwndminus],eax
	jmp .finish

  .wmcommand:
	cmp [wparam],timesID   ; X pressed
	je  .timesthem
	cmp [wparam],divideID  ; / pressed
	je  .dividethem
	cmp [wparam],addID     ; + pressed
	je  .addthem
	cmp [wparam],minusID   ; - pressed
	je  .minusthem
	jmp .finish

	.worked:
		invoke	  MessageBox,NULL,eax,return,MB_OK
		jmp .finish
	.timesthem:	       ; X function

		jmp .finish

	.dividethem:	       ; / function

		jmp .finish

	.addthem:	       ; + function
		mov eax,0
		invoke GetDlgItemInt, [hwndnuma],numaID,NULL,FALSE ; 1st textbox
		;cmp eax,0
		;je .worked
		mov [numaint],eax				   ; store return value
		invoke GetDlgItemInt,[hwndnumb],numbID,NULL,FALSE  ; 2nd textbox
		add eax,[numaint]				   ; add values
		invoke SetDlgItemInt,[hwndanswer],answerID,eax,1   ; set the answer
		jmp .finish

	.minusthem:	       ; - function

		jmp .finish
	jmp .finish

  .wmdestroy:
	invoke	PostQuitMessage,0
	xor	eax,eax
  .finish:
	pop	edi esi ebx
	ret
endp

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
	  user32,'USER32.DLL'

  include 'C:\FASM\INCLUDE\api\kernel32.inc'
  include 'C:\FASM\INCLUDE\api\user32.inc'