Analog watch
; GUI #
include win64a.inc
W = 256
H = 256
.code
WinMain proc
local hbrBackground:qword
local msg:MSG
xor ebx,ebx
mov esi,IMAGE_BASE
mov edi,offset AppName
mov qword ptr[rsp+28h],LR_LOADFROMFILE
mov [rsp+20h],rbx
mov edx,offset BmpName
invoke LoadImage,esi,,0,0
invoke CreatePatternBrush,eax
mov hbrBackground,rax
mov ecx,offset FileName
invoke LoadCursorFromFile
push rax ;hIconSm
push rdi ;lpszClassName
push rbx
push hbrBackground
push rax ;hCursor
push rax ;hIcon
push rsi ;hInstance
push rbx ;cbClsExtra & cbWndExtra
pushaddr WndProc ;lpfnWndProc
push sizeof WNDCLASSEX;cbSize & style
invoke RegisterClassEx,esp ;addr WNDCLASSEX
push rbx
push rsi ;rsi=400000h
shl esi,9 ;rsi=CW_USEDEFAULT
push rbx
push rbx
push H+20;rsi
push W
push rsi
push rsi
sub esp,20h
mov r9d,WS_OVERLAPPED or WS_VISIBLE or WS_CAPTION or WS_SYSMENU
invoke CreateWindowEx,0,edi,edi
mov hWin,rax
lea edi,msg
@@: invoke GetMessage,edi,NULL,0,0
invoke DispatchMessage,edi
jmp @b
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local ps:PAINTSTRUCT
local hdc:HDC
local hpen:DWORD
local hPenOld:DWORD
local hBrush:DWORD
local hBrushOld:DWORD
local X:DWORD
local temp2:DWORD
local Time:SYSTEMTIME
mov hWnd,rcx
cmp edx,WM_CREATE
je wmCREATE
cmp edx,WM_PAINT
je wmPAINT
cmp edx,WM_DESTROY
je wmDESTROY
leave
jmp NtdllDefWindowProc_
wmDESTROY: invoke timeKillEvent,hTimer
invoke RtlExitUserProcess,NULL
wmCREATE:mov qword ptr[rsp+20h],TIME_PERIODIC
mov r8d,offset TimeProc
invoke timeSetEvent,1000,1000,,777
mov hTimer,rax
lea ecx,Time
invoke GetLocalTime
movzx eax,Time.wHour
mov ecx,12
xor edx,edx
div ecx
cvtsi2ss xmm0,edx
movss Hour,xmm0
movzx eax,Time.wMinute
cvtsi2ss xmm0,eax
movss Minute,xmm0
movzx eax,Time.wSecond
cvtsi2ss xmm0,eax
movss Second,xmm0
mulss xmm0,const1_60
addss xmm0,Minute
movss Minute,xmm0
mulss xmm0,const1_60
addss xmm0,Hour
movss Hour,xmm0
jmp wmBYE
wmPAINT:lea edx,ps
invoke BeginPaint;,hWnd
mov hdc,rax
invoke CreatePen,PS_SOLID,2,6464FFh;(255,100,100)
mov hpen,eax
invoke SelectObject,hdc,eax;hpen
mov hPenOld,eax
invoke MoveToEx,hdc,H/2,W/2,NULL
movss xmm0,temp;pi/30
mulss xmm0,Second
movss temp2,xmm0
invoke cosf
mulss xmm0,Second_arrow
cvtss2si eax,xmm0
mov X,eax
movss xmm0,temp2
invoke sinf
mulss xmm0,Second_arrow
cvtss2si edx,xmm0
add edx,H/2
mov r8d,W/2
sub r8d,X
invoke LineTo,hdc
invoke DeleteObject,hpen
invoke CreatePen,PS_SOLID,7,808080h;(128,128,128)
mov hpen,eax
invoke SelectObject,hdc,eax
invoke MoveToEx,hdc,W/2,H/2,NULL
;------------------------------------------------------
movss xmm0,temp;pi/30
mulss xmm0,Minute
movss temp2,xmm0
invoke cosf
mulss xmm0,Minute_arrow
cvtss2si eax,xmm0
mov X,eax
movss xmm0,temp2
invoke sinf
mulss xmm0,Minute_arrow
cvtss2si edx,xmm0
add edx,H/2;119
mov r8d,W/2;119
sub r8d,X
;-------------------------------------------------------
invoke LineTo,hdc
invoke MoveToEx,hdc,W/2,H/2,NULL
;------------------------------------------------------
movss xmm0,Hour
mulss xmm0,temp1;pi/6
movss temp2,xmm0
invoke cosf
mulss xmm0,Hour_arrow
cvtss2si eax,xmm0
mov X,eax
movss xmm0,temp2
invoke sinf
mulss xmm0,Hour_arrow
cvtss2si edx,xmm0
add edx,H/2;119
mov r8d,W/2;119
sub r8d,X
;-------------------------------------------------------
invoke LineTo,hdc
invoke SelectObject,hdc,hPenOld
invoke DeleteObject,hpen
invoke CreatePen,PS_SOLID,3,0AAAAAAh;(170,170,170)
mov hpen,eax
invoke SelectObject,hdc,eax
mov hPenOld,eax
invoke CreateSolidBrush,505050h;80,80,80
mov hBrush,eax
invoke SelectObject,hdc,eax;hBrush
mov hBrushOld,eax
invoke Ellipse,hdc,123,123,135,135
invoke SelectObject,hdc,hBrushOld
invoke DeleteObject,hBrush
lea edx,ps
invoke EndPaint,hWnd
wmBYE: leave
retn
WndProc endp
TimeProc proc uTimerID:QWORD,uMsg:QWORD,dwUser:QWORD,dw1:QWORD,dw2:QWORD
movss xmm0,const1
addss xmm0,Second
movss Second,xmm0
movss xmm0,Minute
addss xmm0,const1_60
movss Minute,xmm0
movss xmm0,Hour
addss xmm0,const1_3600
movss Hour,xmm0
invoke InvalidateRect,hWin,0,TRUE
leave
retn
TimeProc endp
;-----------------------------------------------------------
.data
Second dd ?
Minute dd ?
Hour dd ?
const1_60 dd 0.0166666666666666666666666667;1/60
const1_3600 dd 0.0002777777777777777777777778;1/3600
temp dd 0.1047197551196597746154214461;pi/30
temp1 dd 0.5235987755982988730771072305;pi/6
Second_arrow dd 100.0
Minute_arrow dd 75.0
Hour_arrow dd 50.0
AppName db 'Wristwatch',0
FileName db "br_Rabbit3.cur",0
BmpName db "clock256.bmp",0
hWin dq ?
hTimer dq ?
const1 dd 1.0
end