; ======================================================================================== align 16 export Window_Startup: sub rsp, 78h mov [rsp+60h], rsi mov [rsp+68h], rdi mov [rsp+70h], rbx ; ----- Enter ----- ; ---------------------------- ; clear WNDCLASSEXA stucture ; ---------------------------- lea edi, win ; win = address of the structure mov ecx, 10 ; ecx: loop limit = # of bytes / 8 xor eax, eax ; eax: fillvalue = 0 dec ecx ; ecx: loop counter - 1 ; loop : mov [edi+ecx*8], rax ; use indexed*8 addressing dec ecx jns < ; until loop counter = loop limit ; -------------------------------------- ; fill the WNDCLASSEXA structure ; -------------------------------------- mov D[win.cbSize], sizeof(WNDCLASSEXA) ; (50h) structure size in bytes mov rax, [hInstance] ; get program's instance handle mov [win.hInstance], rax ; store handle in the window structure lea ebx, ClassName lea eax, WndProc mov [win.lpszClassName], ebx ; ptr to window class name mov [win.lpfnWndProc], eax ; ptr to window procedure ; win.hbrBackground = CreateSolidBrush(RGB(color)); mov ecx, 0 ;AlmostBlack ; p1: COLORREF crColor (brush color) mov [GUISkinColor], ecx ; save a copy for gui updates ; convert the color to Windows: bgr = rgb bswap ecx ; flip the alpha channel into bits 0-7 shr ecx, 8 ; get rid of bits 0-7 call CreateSolidBrush ; returns: handle of a logical brush for LoadCursor test rax, rax jz >> wcError mov [win.hbrBackground], rax ; store the handle ; ---------------------------- ; load the hand cursor ; ---------------------------- xor ecx, ecx ; p1: NULL mov edx, IDC_HAND ; p2: const for the hand call LoadCursorA test rax, rax jz >> wcError mov [win.hCursor], rax ; = hand cursor ; ---------------------------- ; register the window ; ---------------------------- lea ecx, win ; p1: &win call RegisterClassExA ; register the window test eax, eax jz >> wcError ; -------------------------------------- ; create a centered 1920x1080 window ; -------------------------------------- xor ecx, ecx ; p1: DWORD dwExStyle (0) lea edx, ClassName ; p2: LPCTSTR lpClassName lea r8d, WindowTitle ; p3: LPCTSTR lpWindowName mov r9d, WS_POPUP+WS_VISIBLE ; p4: DWORD dwStyle mov [rsp+20h], ecx ; p5: int x (x=0) mov [rsp+28h], ecx ; p6: int y (y=0) mov eax, [monitor_w] mov ebx, [monitor_h] mov [rsp+30h], eax ; p7: int nWidth (monitor width) mov [rsp+38h], ebx ; p8: int nHeight (monitor height) mov [rsp+40h], rcx ; p9: HWND hWndParent (0 = top level) mov [rsp+48h], rcx ; p10: HMENU hMenu (0 = no menu) mov rax, [hInstance] mov [rsp+50h], rax ; p11: HINSTANCE hInstance mov [rsp+58h], rcx ; p12: LPVOID lpParam (0) ; ------------------ ; create the window ; ------------------ call CreateWindowExA test rax, rax jz >> wcError mov [hWindow], rax ; store the window handle ; --------------- ; hide the cursor ; --------------- mov ecx, 0 call ShowCursor ; ----- REPORT SUCCESS ----- mov eax, TRUE ; 1 signals success ; ----- EXIT ----- ; if eax = 0, then an error occurred wcError: mov rsi, [rsp+60h] mov rdi, [rsp+68h] mov rbx, [rsp+70h] add rsp, 78h ret ; ========================================================================================