option casemap:none
option dotname

includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib
includelib opengl32.lib
includelib glu32.lib
includelib comctl32.lib

extern __ImageBase: BYTE
extern gluPerspective: PROC
extern glViewport: PROC
extern glVertex3f: PROC
extern glShadeModel: PROC
extern glRotatef: PROC
extern glPushMatrix: PROC
extern glPopMatrix: PROC
extern glMultMatrixf: PROC
extern glMatrixMode: PROC
extern glLoadMatrixf: PROC
extern glLoadIdentity: PROC
extern glHint: PROC
extern glGetFloatv: PROC
extern glFrontFace: PROC
extern glEnd: PROC
extern glEnable: PROC
extern glCullFace: PROC
extern glColor3f: PROC
extern glClear: PROC
extern glBegin: PROC
extern InitCommonControlsEx: PROC
extern LoadIconA: PROC
extern LoadCursorA: PROC
extern MessageBoxA: PROC
extern GetClientRect: PROC
extern ReleaseDC: PROC
extern GetDC: PROC
extern SetForegroundWindow: PROC
extern UpdateWindow: PROC
extern AppendMenuA: PROC
extern CreatePopupMenu: PROC
extern CreateMenu: PROC
extern TranslateAcceleratorA: PROC
extern DestroyAcceleratorTable: PROC
extern CreateAcceleratorTableA: PROC
extern SetFocus: PROC
extern DestroyWindow: PROC
extern CreateWindowExA: PROC
extern RegisterClassExA: PROC
extern PostQuitMessage: PROC
extern DefWindowProcA: PROC
extern SendMessageA: PROC
extern PeekMessageA: PROC
extern DispatchMessageA: PROC
extern TranslateMessage: PROC
extern wsprintfA: PROC
extern SwapBuffers: PROC
extern wglMakeCurrent: PROC
extern wglDeleteContext: PROC
extern wglCreateContext: PROC
extern SetPixelFormat: PROC
extern GetStockObject: PROC
extern ChoosePixelFormat: PROC
extern lstrlenA: PROC
extern GetModuleHandleA: PROC
extern ExitProcess: PROC
extern Sleep: PROC
extern QueryPerformanceFrequency: PROC
extern QueryPerformanceCounter: PROC
extern GetLastError: PROC
extern CloseHandle: PROC
extern WriteFile: PROC
extern CreateFileA: PROC

.data?
  ghInst QWORD ?
  gnWndClass DWORD ?
  isRefreshed BYTE 4 dup(?)
  ghWnd QWORD ?
  ghMenu QWORD ?
  ghMenuFile QWORD ?
  ghMenuHelp QWORD ?
  ghAccTable QWORD ?
  ghwndStatusBar QWORD ?
  xStatusParts BYTE 36 dup(?)
  giPixelFormat DWORD ?
  ghDC QWORD ?
  ghRC QWORD ?
  gRectClientWidth DWORD ?
  gRectClientHeight DWORD ?
  xScrCenter DWORD ?
  yScrCenter DWORD ?
  gnFrame BYTE 4 dup(?)
  nTitleFrames BYTE 4 dup(?)
  qpcFreq BYTE 8 dup(?)
  qpcPrev QWORD ?
  gDeltaT QWORD ?
  tStatusAcc BYTE 8 dup(?)
  tTitleAcc BYTE 8 dup(?)
  nKeyCode BYTE 4 dup(?)
  gnMouseMode DWORD ?
  key BYTE 256 dup(?)
  xMouseNew DWORD ?
  yMouseNew DWORD ?
  xMouseOld DWORD ?
  yMouseOld DWORD ?
  dxMouse DWORD ?
  dyMouse DWORD ?
  SpinRadius DWORD ?
  autoAngle DWORD ?
  autoAngle2 DWORD ?
  xVectorNew DWORD ?
  yVectorNew DWORD ?
  zVectorNew DWORD ?
  wVectorNew BYTE 4 dup(?)
  xVectorOld DWORD ?
  yVectorOld DWORD ?
  zVectorOld DWORD ?
  wVectorOld BYTE 4 dup(?)
  xCamPos DWORD ?
  yCamPos DWORD ?
  zCamPos DWORD ?
  wCamPos BYTE 4 dup(?)
  PanMagnitudeX DWORD ?
  PanMagnitudeY DWORD ?
  DollyMagnitude DWORD ?
  
  ALIGN 16
  mtxArcball XMMWORD 4 dup(?)  ; 64 bytes
  mtxWorld XMMWORD 4 dup(?)  ; 64 bytes
  mtxTemp XMMWORD 4 dup(?)  ; 64 bytes
  
  WalkMagnitude DWORD ?
  dwBytesWritten BYTE 4 dup(?)
  ghLogFile QWORD ?
  gnLastError DWORD ?
  gVertCount BYTE 4 dup(?)
  gVerts BYTE 8 dup(?)
  gNorms BYTE 8 dup(?)
  gCols BYTE 8 dup(?)
  
  ALIGN 16
  mtxObjectVolatile XMMWORD 4 dup(?)  ; 64 bytes
  mtxCameraVolatile XMMWORD 4 dup(?)  ; 64 bytes
  mtxProjectionVolatile XMMWORD 4 dup(?)  ; 64 bytes
  mtxProjectionDefault XMMWORD 4 dup(?)  ; 64 bytes

.data
  __isa_available DWORD 2
  xStatusProportions DWORD 102, 204, 307, 430, 552, 675, 788, 901
  gRectClientAspect REAL8 1.0
  isActive BYTE 1
  isInitialPosition BYTE 1
  autoRotate BYTE 1,0
  SpinSpeed REAL4 0.5
  eps REAL4 0.001
  PanSpeed REAL4 20.0
  DollySpeed REAL4 1.0
  posOne REAL4 1.0
  negOne REAL4 -1.0
  WalkSpeed REAL4 20.0
  WalkBoost REAL4 10.0
  sinSlow REAL4 0.017452406
  cosSlow REAL4 0.99984771
  sinFast REAL4 0.17364818
  cosFast REAL4 0.98480773
  PiOver180 REAL4 0.017453292
  fovy REAL8 45.0
  zNear REAL8 1.0
  zFar REAL8 1000000.0
  szMenuFile db "&File",0
  
  ALIGN 16
  mtxCameraDefault REAL4 1.0,0.0,0.0,0.0, 0.0,0.5,-0.8660254,0.0, 0.0,0.8660254,0.5,0.0, 0.0,1500.0,-12000.0,1.0
  mtxObjectDefault REAL4 0.9396926,0.3420201,0.0,0.0, -0.3420201,0.9396926,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0
  
  lightPosition REAL4 -2000.0, -1000.0, 2000.0, 1.0
  lightDiffuse REAL4 0.4, 0.4, 0.35, 0.0
  lightAmbient REAL4 0.4, 0.4, 0.35, 0.0
  szMainWndTitle db "MASM64 OpenGL Environment - RBMK Viewer",0
  szMenuFileSave db "&Save",9,"Ctrl+S",0
  szMenuFileExit db "E&xit",9,"Ctrl+W",0
  szMenuHelp db "&Help",0
  szMenuHelpAbout db "&About...",9,"F1",0
  szStatusClassName db "msctls_statusbar32",0
  szLogFileName db "RBMK64.log",0
  szOK db ": OK",13,10,0
  szLogInit db "Application Started",13,10,0
  szLogEnterWinMain db "Entered WinMain",13,10,0
  szGetModuleHandleA db "GetModuleHandleA",0
  szRegisterClassExA db "RegisterClassExA",0
  szLogCreatingMenu db "Creating the Menu",0
  szCreateAcceleratorTableA db "CreateAcceleratorTableA",0
  szCreateWindowExA db "CreateWindowExA",0
  szLogCreatingStatusBar db "Creating the Status Bar",0
  szExitProcess db "ExitProcess",13,10,0
  szAboutMsgTitle db "About MASM64 OpenGL Demo",0
  
  szAboutMsgText db "Controls:",13,10
  db "Left Mouse Button - Spin the Object",13,10
  db "Mouse Wheel Down - Move the Camera Left-Right, Up-Down",13,10
  db "Mouse Scroll - Dolly the Camera",13,10
  db "Right Mouse Button - Rotate the Camera",13,10,13,10
  db "Arrow Up - Move the Camera Forward",13,10
  db "Arrow Down - Move the Camera Backward",13,10
  db "Arrow Left - Move the Camera Left",13,10
  db "Arrow Right - Move the Camera Right",13,10
  db "Page Up - Move the Camera Up",13,10
  db "Page Down - Move the Camera Down",13,10,13,10
  db "Object Rotation:",13,10
  db "W,S - Tilt the Object",13,10
  db "A,D - Turn the Object",13,10
  db "Q,E - Roll the Object",13,10,13,10
  db "Shift - Boost",13,10
  db "Space, Esc - Reset Scene",0
  
  szMsgCloseTitle db "MASM64 OpenGL Demo",0
  szMsgCloseText db "Exit?",0
  szGetDC db "GetDC",0
  szChoosePixelFormat db "ChoosePixelFormat",0
  szSetPixelFormat db "SetPixelFormat",0
  szWglCreateContext db "wglCreateContext",0
  szWglMakeCurrent db "wglMakeCurrent",0
  szErrMouseToVector db "Failed to convert Screen cordinates to Sphere",13,10,0
  szErrArcball db "Arcball Failed",13,10,0
  szErrOrbit db "Orbit Failed",13,10,0
  szErrGeocentric db "Geocentric Failed",13,10,0
  szErrCode db " Error: 0x%08X",13,10,0
  szErrWarning db "An Error occurred",13,10,"See the log file",0
  szError db " Error",13,10,0
  szMainWndClass db "MainWndClass",0
  fmt_ErrorHex db " Error: 0x%08X",13,10,0

.const
  __real@3ccccccd REAL4 0.02500000037252903
  __real@3d23d70a REAL4 0.03999999910593033
  __real@3e19999a REAL4 0.15000000596046448
  __real@3e4ccccd REAL4 0.20000000298023224
  __real@3e99999a REAL4 0.30000001192092896
  __real@3ecccccd REAL4 0.4000000059604645
  __real@3f000000 REAL4 0.5
  __real@3f19999a REAL4 0.6000000238418579
  __real@3f4ccccd REAL4 0.800000011920929
  __real@3f666666 REAL4 0.8999999761581421
  __real@3f800000 REAL4 1.0
  __real@40c90fdb REAL4 6.2831854820251465
  __real@43340000 REAL4 180.0
  __real@43b40000 REAL4 360.0
  __real@44a28000 REAL4 1300.0
  __real@44fa0000 REAL4 2000.0
  __real@45dac000 REAL4 7000.0
  __real@c5dac000 REAL4 -7000.0
  
  ALIGN 16
  __xmm@000003ff000003ff000003ff000003ff LABEL XMMWORD
  dd 000003FFH, 000003FFH
  dd 000003FFH, 000003FFH
  
  ALIGN 16
  __xmm@3f800000000000000000000000000000 LABEL XMMWORD
  dq 0000000000000000H
  dq 3F80000000000000H
  
  ALIGN 16
  __xmm@80000000800000008000000080000000 LABEL XMMWORD
  dd 80000000H, 80000000H
  dd 80000000H, 80000000H

.code



ArcballRotation PROC
        mov     rax, rsp
        sub     rsp, 168
        movss   xmm1, dword ptr [yVectorOld]
        movss   xmm2, dword ptr [xVectorNew]
        movss   xmm4, dword ptr [zVectorNew]
        movss   xmm5, dword ptr [zVectorOld]
        movss   xmm3, dword ptr [xVectorOld]
        movaps  xmmword ptr [rax-18H], xmm6
        movaps  xmm6, xmm4
        movaps  xmmword ptr [rax-48H], xmm9
        movss   xmm9, dword ptr [yVectorNew]
        movaps  xmm0, xmm9
        movaps  xmmword ptr [rax-58H], xmm10
        mulss   xmm0, xmm5
        movaps  xmm10, xmm2
        mulss   xmm6, xmm1
        movaps  xmmword ptr [rax-68H], xmm11
        movaps  xmm11, xmm9
        mulss   xmm9, xmm1
        subss   xmm6, xmm0
        mulss   xmm10, xmm5
        movaps  xmm0, xmm4
        mulss   xmm11, xmm3
        mulss   xmm0, xmm3
        movaps  xmmword ptr [rax-78H], xmm12
        mulss   xmm4, xmm5
        subss   xmm10, xmm0
        movaps  xmm0, xmm2
        mulss   xmm0, xmm1
        mulss   xmm2, xmm3
        subss   xmm11, xmm0
        movaps  xmm0, xmm6
        mulss   xmm0, xmm6
        addss   xmm9, xmm2
        movaps  xmm2, xmm10
        mulss   xmm2, xmm10
        movaps  xmm1, xmm11
        mulss   xmm1, xmm11
        addss   xmm2, xmm0
        xorps   xmm0, xmm0
        addss   xmm9, xmm4
        addss   xmm2, xmm1
        ucomiss xmm0, xmm2
        ja      L_001
        xorps   xmm12, xmm12
        sqrtss  xmm12, xmm2
        jmp     L_002

L_001:  movaps  xmm0, xmm2
        call    sqrtf
        movaps  xmm12, xmm0
L_002:  movss   xmm1, dword ptr [eps]
        comiss  xmm1, xmm12
        jbe     L_004
        mov     rax, qword ptr [ghLogFile]
        dec     rax
        cmp     rax, -3
        ja      L_003
        lea     rcx, [szErrArcball]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], 0
        lea     rdx, [szErrArcball]
        call WriteFile
L_003:  mov     eax, 4294967295
        jmp     L_005

L_004:  divss   xmm10, xmm12
        xor     eax, eax
        mov     dword ptr [mtxArcball+0CH], 0
        mov     dword ptr [mtxArcball+1CH], 0
        mov     dword ptr [mtxArcball+2CH], 0
        movaps  xmmword ptr [rsp+80H], xmm7
        movaps  xmm7, xmm10
        movaps  xmmword ptr [rsp+70H], xmm8
        mulss   xmm7, dword ptr [mtxCameraVolatile+14H]
        movaps  xmm8, xmm10
        mulss   xmm8, dword ptr [mtxCameraVolatile+4H]
        mulss   xmm10, dword ptr [mtxCameraVolatile+24H]
        divss   xmm6, xmm12
        divss   xmm11, xmm12
        movaps  xmm0, xmm6
        mulss   xmm0, dword ptr [mtxCameraVolatile]
        movaps  xmm1, xmm11
        mulss   xmm1, dword ptr [mtxCameraVolatile+8H]
        addss   xmm8, xmm0
        movaps  xmm0, xmm6
        mulss   xmm0, dword ptr [mtxCameraVolatile+10H]
        mulss   xmm6, dword ptr [mtxCameraVolatile+20H]
        addss   xmm7, xmm0
        addss   xmm8, xmm1
        movaps  xmm1, xmm11
        mulss   xmm1, dword ptr [mtxCameraVolatile+18H]
        addss   xmm10, xmm6
        movss   xmm6, dword ptr [__real@3f800000]
        mulss   xmm11, dword ptr [mtxCameraVolatile+28H]
        subss   xmm6, xmm9
        addss   xmm7, xmm1
        movaps  xmm0, xmm8
        movaps  xmm2, xmm8
        mulss   xmm8, xmm12
        addss   xmm10, xmm11
        mulss   xmm2, xmm6
        movaps  xmm1, xmm7
        movaps  xmm5, xmm7
        mulss   xmm5, xmm12
        mulss   xmm0, xmm2
        movaps  xmm4, xmm10
        mulss   xmm1, xmm2
        movaps  xmm3, xmm10
        addss   xmm0, xmm9
        mulss   xmm3, xmm12
        mulss   xmm4, xmm2
        movss   dword ptr [mtxArcball], xmm0
        movaps  xmm0, xmm1
        addss   xmm0, xmm3
        subss   xmm1, xmm3
        movss   dword ptr [mtxArcball+4H], xmm0
        movaps  xmm0, xmm4
        subss   xmm0, xmm5
        movss   dword ptr [mtxArcball+10H], xmm1
        movaps  xmm1, xmm10
        addss   xmm4, xmm5
        movss   dword ptr [mtxArcball+8H], xmm0
        movaps  xmm0, xmm7
        mulss   xmm0, xmm6
        movss   dword ptr [mtxArcball+20H], xmm4
        mulss   xmm7, xmm0
        mulss   xmm1, xmm0
        addss   xmm7, xmm9
        movaps  xmm0, xmm1
        subss   xmm1, xmm8
        addss   xmm0, xmm8
        movaps  xmm8, xmmword ptr [rsp+70H]
        movss   dword ptr [mtxArcball+14H], xmm7
        movaps  xmm7, xmmword ptr [rsp+80H]
        movss   dword ptr [mtxArcball+24H], xmm1
        movss   dword ptr [mtxArcball+18H], xmm0
        movaps  xmm0, xmm10
        mulss   xmm0, xmm6
        mulss   xmm0, xmm10
        addss   xmm0, xmm9
        movss   dword ptr [mtxArcball+28H], xmm0
        movdqa  xmm0, xmmword ptr [__xmm@3f800000000000000000000000000000]
        movaps  xmmword ptr [mtxArcball+30H], xmm0
L_005:  movaps  xmm6, xmmword ptr [rsp+90H]
        movaps  xmm9, xmmword ptr [rsp+60H]
        movaps  xmm10, xmmword ptr [rsp+50H]
        movaps  xmm11, xmmword ptr [rsp+40H]
        movaps  xmm12, xmmword ptr [rsp+30H]
        add     rsp, 168
        ret

ArcballRotation ENDP


CameraMove PROC
        movaps  xmm4, xmm0
        mov     eax, edx
        movaps  xmm5, xmm0
        mov     byte ptr [isInitialPosition], 0
        movaps  xmm3, xmm0
        mov     byte ptr [isRefreshed], 0
        lea     r8, [mtxCameraVolatile]
        mulss   xmm3, dword ptr [r8+rax*4]
        lea     eax, [rdx+4H]
        mulss   xmm4, dword ptr [r8+rax*4]
        lea     eax, [rdx+8H]
        mulss   xmm5, dword ptr [r8+rax*4]
        movaps  xmm0, xmm3
        mulss   xmm0, dword ptr [mtxCameraVolatile]
        movaps  xmm2, xmm4
        mulss   xmm2, dword ptr [mtxCameraVolatile+10H]
        movaps  xmm1, xmm5
        mulss   xmm1, dword ptr [mtxCameraVolatile+20H]
        addss   xmm2, xmm0
        movss   xmm0, dword ptr [mtxCameraVolatile+30H]
        addss   xmm2, xmm1
        movaps  xmm1, xmm5
        mulss   xmm1, dword ptr [mtxCameraVolatile+24H]
        mulss   xmm5, dword ptr [mtxCameraVolatile+28H]
        addss   xmm0, xmm2
        movaps  xmm2, xmm4
        mulss   xmm2, dword ptr [mtxCameraVolatile+14H]
        mulss   xmm4, dword ptr [mtxCameraVolatile+18H]
        movss   dword ptr [mtxCameraVolatile+30H], xmm0
        movaps  xmm0, xmm3
        mulss   xmm0, dword ptr [mtxCameraVolatile+4H]
        mulss   xmm3, dword ptr [mtxCameraVolatile+8H]
        addss   xmm2, xmm0
        movss   xmm0, dword ptr [mtxCameraVolatile+34H]
        addss   xmm4, xmm3
        addss   xmm2, xmm1
        addss   xmm4, xmm5
        addss   xmm0, xmm2
        movss   dword ptr [mtxCameraVolatile+34H], xmm0
        movss   xmm0, dword ptr [mtxCameraVolatile+38H]
        addss   xmm0, xmm4
        movss   dword ptr [mtxCameraVolatile+38H], xmm0
        ret
CameraMove ENDP


CheckKeys PROC
        sub     rsp, 40
        cmp     byte ptr [key+26H], 0
        jz      L_007
        cmp     byte ptr [key+10H], 0
        movss   xmm0, dword ptr [WalkSpeed]
        jz      L_006
        mulss   xmm0, dword ptr [WalkBoost]
L_006:  mulss   xmm0, dword ptr [posOne]
        mov     edx, 2
        movss   dword ptr [WalkMagnitude], xmm0
        call    CameraMove
L_007:  cmp     byte ptr [key+28H], 0
        jz      L_009
        cmp     byte ptr [key+10H], 0
        movss   xmm0, dword ptr [WalkSpeed]
        jz      L_008
        mulss   xmm0, dword ptr [WalkBoost]
L_008:  mulss   xmm0, dword ptr [negOne]
        mov     edx, 2
        movss   dword ptr [WalkMagnitude], xmm0
        call    CameraMove
L_009:  cmp     byte ptr [key+25H], 0
        jz      L_011
        cmp     byte ptr [key+10H], 0
        movss   xmm0, dword ptr [WalkSpeed]
        jz      L_010
        mulss   xmm0, dword ptr [WalkBoost]
L_010:  mulss   xmm0, dword ptr [posOne]
        xor     edx, edx
        movss   dword ptr [WalkMagnitude], xmm0
        call    CameraMove
L_011:  cmp     byte ptr [key+27H], 0
        jz      L_013
        cmp     byte ptr [key+10H], 0
        movss   xmm0, dword ptr [WalkSpeed]
        jz      L_012
        mulss   xmm0, dword ptr [WalkBoost]
L_012:  mulss   xmm0, dword ptr [negOne]
        xor     edx, edx
        movss   dword ptr [WalkMagnitude], xmm0
        call    CameraMove
L_013:  cmp     byte ptr [key+21H], 0
        jz      L_015
        cmp     byte ptr [key+10H], 0
        movss   xmm0, dword ptr [WalkSpeed]
        jz      L_014
        mulss   xmm0, dword ptr [WalkBoost]
L_014:  mulss   xmm0, dword ptr [negOne]
        mov     edx, 1
        movss   dword ptr [WalkMagnitude], xmm0
        call    CameraMove
L_015:  cmp     byte ptr [key+22H], 0
        jz      L_017
        cmp     byte ptr [key+10H], 0
        movss   xmm0, dword ptr [WalkSpeed]
        jz      L_016
        mulss   xmm0, dword ptr [WalkBoost]
L_016:  mulss   xmm0, dword ptr [posOne]
        mov     edx, 1
        movss   dword ptr [WalkMagnitude], xmm0
        call    CameraMove
L_017:  cmp     byte ptr [key+57H], 0
        jz      L_018
        movss   xmm0, dword ptr [negOne]
        xor     edx, edx
        call    ModelRotate
L_018:  cmp     byte ptr [key+53H], 0
        jz      L_019
        movss   xmm0, dword ptr [posOne]
        xor     edx, edx
        call    ModelRotate
L_019:  cmp     byte ptr [key+41H], 0
        jz      L_020
        movss   xmm0, dword ptr [posOne]
        mov     edx, 2
        call    ModelRotate
L_020:  cmp     byte ptr [key+44H], 0
        jz      L_021
        movss   xmm0, dword ptr [negOne]
        mov     edx, 2
        call    ModelRotate
L_021:  cmp     byte ptr [key+51H], 0
        jz      L_022
        movss   xmm0, dword ptr [negOne]
        mov     edx, 1
        call    ModelRotate
L_022:  cmp     byte ptr [key+45H], 0
        jz      L_023
        movss   xmm0, dword ptr [posOne]
        mov     edx, 1
        call    ModelRotate
L_023:  cmp     byte ptr [key+52H], 0
        jz      L_024
        xor     byte ptr [autoRotate], 01H
        mov     byte ptr [key+52H], 0
L_024:  add     rsp, 40
        ret
CheckKeys ENDP


CloseLogger PROC
        sub     rsp, 40
        mov     rcx, qword ptr [ghLogFile]
        lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_027
        call CloseHandle
L_027:  mov     qword ptr [ghLogFile], 0
        add     rsp, 40
        ret
CloseLogger ENDP


CloseWndProc PROC
        push    rbx
        sub     rsp, 32
        mov     r9d, 36
        lea     r8, [szMsgCloseTitle]
        lea     rdx, [szMsgCloseText]
        mov     rbx, rcx
        call MessageBoxA
        cmp     eax, 6
        jnz     L_031
        mov     rcx, qword ptr [ghAccTable]
        test    rcx, rcx
        jz      L_028
        call DestroyAcceleratorTable
L_028:  xor     edx, edx
        xor     ecx, ecx
        call wglMakeCurrent
        mov     rcx, qword ptr [ghRC]
        test    rcx, rcx
        jz      L_029
        call wglDeleteContext
        mov     qword ptr [ghRC], 0
L_029:  mov     rdx, qword ptr [ghDC]
        test    rdx, rdx
        jz      L_030
        mov     rcx, rbx
        call ReleaseDC
        mov     qword ptr [ghDC], 0
L_030:  mov     rcx, rbx
        add     rsp, 32
        pop     rbx
        jmp DestroyWindow
L_031:
        add     rsp, 32
        pop     rbx
        ret
CloseWndProc ENDP


DrawScene PROC
        mov     qword ptr [rsp+8H], rbx
        mov     qword ptr [rsp+10H], rsi
        push    rdi
        sub     rsp, 112
        movaps  xmmword ptr [rsp+60H], xmm6
        mov     ecx, 5889
        movaps  xmmword ptr [rsp+50H], xmm7
        movaps  xmmword ptr [rsp+40H], xmm8
        movaps  xmmword ptr [rsp+30H], xmm9
        call glMatrixMode
        lea     rcx, [mtxProjectionVolatile]
        call glLoadMatrixf
        mov     ecx, 5888
        call glMatrixMode
        lea     rcx, [mtxCameraVolatile]
        call glLoadMatrixf
        lea     rcx, [mtxObjectVolatile]
        call glMultMatrixf
        mov     ecx, 16640
        call glClear
        movss   xmm0, dword ptr [__real@3e19999a]
        movaps  xmm2, xmm0
        movaps  xmm1, xmm0
        call glColor3f
        mov     ecx, 7
        call glBegin
        movss   xmm7, dword ptr [__real@c5dac000]
        xorps   xmm2, xmm2
        movaps  xmm1, xmm7
        movaps  xmm0, xmm7
        call glVertex3f
        movss   xmm6, dword ptr [__real@45dac000]
        xorps   xmm2, xmm2
        movaps  xmm0, xmm6
        movaps  xmm1, xmm7
        call glVertex3f
        xorps   xmm2, xmm2
        movaps  xmm1, xmm6
        movaps  xmm0, xmm6
        call glVertex3f
        xorps   xmm2, xmm2
        movaps  xmm1, xmm6
        movaps  xmm0, xmm7
        call glVertex3f
        call glEnd
        call glPushMatrix
        movss   xmm9, dword ptr [__real@3f800000]
        xorps   xmm2, xmm2
        movss   xmm0, dword ptr [autoAngle]
        movaps  xmm3, xmm9
        xorps   xmm1, xmm1
        call glRotatef
        movss   xmm6, dword ptr [__real@43340000]
        xor     edi, edi
        movss   xmm8, dword ptr [__real@44fa0000]
        mov     esi, edi
        mov     ebx, edi
ALIGN   8
L_033:  movd    xmm0, esi
        movaps  xmm3, xmm6
        cvtdq2ps xmm0, xmm0
        mov     dword ptr [rsp+28H], ebx
        mov     edx, 48
        movaps  xmm2, xmm6
        mulss   xmm0, xmm6
        movss   dword ptr [rsp+20H], xmm0
        movaps  xmm0, xmm8
        call    DrawVoxelRing
        inc     esi
        add     ebx, 3
        cmp     ebx, 12
        jl      L_033
        call glPopMatrix
        call glPushMatrix
        movss   xmm0, dword ptr [autoAngle2]
        movaps  xmm3, xmm9
        xorps   xmm0, xmmword ptr [__xmm@80000000800000008000000080000000]
        xorps   xmm2, xmm2
        xorps   xmm1, xmm1
        call glRotatef
        movss   xmm7, dword ptr [__real@44a28000]
        mov     ebx, edi
ALIGN   16
L_034:  movd    xmm0, edi
        movaps  xmm3, xmm6
        cvtdq2ps xmm0, xmm0
        mov     dword ptr [rsp+28H], ebx
        mov     edx, 36
        movaps  xmm2, xmm6
        mulss   xmm0, xmm6
        movss   dword ptr [rsp+20H], xmm0
        movaps  xmm0, xmm7
        call    DrawVoxelRing
        inc     edi
        add     ebx, 3
        cmp     ebx, 12
        jl      L_034
        call glPopMatrix
        mov     ecx, 1
        call glBegin
        xorps   xmm2, xmm2
        xorps   xmm1, xmm1
        movaps  xmm0, xmm9
        call glColor3f
        xorps   xmm2, xmm2
        xorps   xmm1, xmm1
        xorps   xmm0, xmm0
        call glVertex3f
        xorps   xmm2, xmm2
        xorps   xmm1, xmm1
        movaps  xmm0, xmm8
        call glVertex3f
        xorps   xmm2, xmm2
        movaps  xmm1, xmm9
        xorps   xmm0, xmm0
        call glColor3f
        xorps   xmm2, xmm2
        xorps   xmm1, xmm1
        xorps   xmm0, xmm0
        call glVertex3f
        xorps   xmm2, xmm2
        movaps  xmm1, xmm8
        xorps   xmm0, xmm0
        call glVertex3f
        movaps  xmm2, xmm9
        xorps   xmm1, xmm1
        xorps   xmm0, xmm0
        call glColor3f
        xorps   xmm2, xmm2
        xorps   xmm1, xmm1
        xorps   xmm0, xmm0
        call glVertex3f
        movaps  xmm2, xmm8
        xorps   xmm1, xmm1
        xorps   xmm0, xmm0
        call glVertex3f
        call glEnd
        mov     rcx, qword ptr [ghDC]
        call SwapBuffers
        movaps  xmm6, xmmword ptr [rsp+60H]
        lea     r11, [rsp+70H]
        mov     rbx, qword ptr [r11+10H]
        mov     rsi, qword ptr [r11+18H]
        movaps  xmm8, xmmword ptr [r11-30H]
        movaps  xmm9, xmmword ptr [r11-40H]
        movaps  xmm7, xmmword ptr [rsp+50H]
        mov     byte ptr [isRefreshed], 1
        mov     rsp, r11
        pop     rdi
        ret
DrawScene ENDP


DrawVoxelRing PROC
        test    edx, edx
        jle     L_045
        mov     rax, rsp
        movss   dword ptr [rax+8H], xmm0
        push    rbx
        push    rsi
        sub     rsp, 200
        addss   xmm3, dword ptr [rsp+100H]
        movaps  xmmword ptr [rax-58H], xmm9
        xorps   xmm1, xmm1
        mov     qword ptr [rax-18H], rdi
        mov     esi, edx
        mov     edi, dword ptr [rsp+108H]
        movaps  xmm9, xmm0
        movaps  xmmword ptr [rax-28H], xmm6
        xor     ebx, ebx
        movaps  xmmword ptr [rax-38H], xmm7
        movaps  xmmword ptr [rax-48H], xmm8
        movss   xmm8, dword ptr [__real@3f4ccccd]
        movaps  xmmword ptr [rax-68H], xmm10
        movss   xmm10, dword ptr [__real@3f800000]
        movaps  xmmword ptr [rax-78H], xmm11
        movss   xmm11, dword ptr [__real@3f000000]
        movaps  xmmword ptr [rsp+50H], xmm12
        movss   xmm12, dword ptr [__real@3e4ccccd]
        movaps  xmmword ptr [rsp+40H], xmm13
        movss   xmm13, dword ptr [__real@3e99999a]
        cvtsi2ss xmm1, edx
        mulss   xmm2, xmm11
        movaps  xmmword ptr [rsp+30H], xmm14
        movaps  xmmword ptr [rsp+20H], xmm15
        movss   xmm15, dword ptr [__real@3f19999a]
        movss   dword ptr [rsp+0F0H], xmm2
        movss   dword ptr [rsp+0E8H], xmm1
        movss   dword ptr [rsp+0F8H], xmm3
ALIGN   16
L_037:  movd    xmm6, ebx
        cvtdq2ps xmm6, xmm6
        mulss   xmm6, dword ptr [__real@40c90fdb]
        divss   xmm6, xmm1
        movaps  xmm0, xmm6
        call    cosf
        movaps  xmm7, xmm0
        movaps  xmm0, xmm6
        mulss   xmm7, xmm9
        call    sinf
        lea     ecx, [rbx+rdi]
        movaps  xmm14, xmm0
        ; --- ВЫЧИСЛЕНИЕ ОСТАТКА (i % 6) ---
        mov     eax, 715827883
        mulss   xmm14, xmm9
        imul    ecx
        movaps  xmm0, xmm11
        movaps  xmm1, xmm11
        movaps  xmm2, xmm11
        mov     eax, edx
        shr     eax, 31
        add     edx, eax
        lea     eax, [rdx+rdx*2]
        add     eax, eax
        sub     ecx, eax
        ; ----------------------------------
        jnz     L_038
        movaps  xmm0, xmm12
        movaps  xmm1, xmm15
        movaps  xmm2, xmm10
        jmp     L_044
L_038:  cmp     ecx, 1
        jnz     L_039
        movaps  xmm1, xmm13
        movaps  xmm2, xmm13
        jmp     L_043
L_039:  cmp     ecx, 2
        jnz     L_040
        movss   xmm2, dword ptr [__real@3ecccccd]
        movaps  xmm0, xmm12
        movaps  xmm1, xmm8
        jmp     L_044
L_040:  cmp     ecx, 3
        jnz     L_041
        movaps  xmm1, xmm8
        movaps  xmm2, xmm12
        jmp     L_043
L_041:  cmp     ecx, 4
        jnz     L_042
        movss   xmm2, dword ptr [__real@3f666666]
        movaps  xmm0, xmm15
        movaps  xmm1, xmm13
        jmp     L_044
L_042:  cmp     ecx, 5
        jnz     L_044
        movaps  xmm1, xmm11
        xorps   xmm2, xmm2
L_043:  movaps  xmm0, xmm10
L_044:  call glColor3f
        movss   xmm0, dword ptr [rsp+0F0H]
        movaps  xmm6, xmm7
        movaps  xmm9, xmm0
        subss   xmm6, xmm0
        addss   xmm9, xmm7
        movaps  xmm8, xmm0
        movaps  xmm7, xmm14
        addss   xmm8, xmm14
        mov     ecx, 7
        subss   xmm7, xmm0
        call glBegin
        movss   xmm14, dword ptr [rsp+100H]
        movaps  xmm1, xmm7
        movaps  xmm2, xmm14
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm7
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm6
        call glVertex3f
        movss   xmm14, dword ptr [rsp+0F8H]
        movaps  xmm1, xmm7
        movaps  xmm2, xmm14
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm7
        movaps  xmm0, xmm9
        call glVertex3f
        movss   xmm2, dword ptr [rsp+100H]
        movaps  xmm1, xmm7
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm7
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm7
        movaps  xmm0, xmm9
        call glVertex3f
        movss   xmm2, dword ptr [rsp+100H]
        movaps  xmm1, xmm7
        movaps  xmm0, xmm9
        call glVertex3f
        movss   xmm2, dword ptr [rsp+100H]
        movaps  xmm1, xmm8
        movaps  xmm0, xmm6
        call glVertex3f
        movss   xmm2, dword ptr [rsp+100H]
        movaps  xmm1, xmm8
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm6
        call glVertex3f
        movss   xmm2, dword ptr [rsp+100H]
        movaps  xmm1, xmm7
        movaps  xmm0, xmm6
        call glVertex3f
        movss   xmm2, dword ptr [rsp+100H]
        movaps  xmm1, xmm8
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm6
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm7
        movaps  xmm0, xmm6
        call glVertex3f
        movss   xmm6, dword ptr [rsp+100H]
        movaps  xmm1, xmm7
        movaps  xmm2, xmm6
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm7
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm14
        movaps  xmm1, xmm8
        movaps  xmm0, xmm9
        call glVertex3f
        movaps  xmm2, xmm6
        movaps  xmm1, xmm8
        movaps  xmm0, xmm9
        call glVertex3f
        call glEnd
        movss   xmm8, dword ptr [__real@3f4ccccd]
        inc     ebx
        movss   xmm9, dword ptr [rsp+0E0H]
        movss   xmm1, dword ptr [rsp+0E8H]
        cmp     ebx, esi
        jl      L_037
        movaps  xmm15, xmmword ptr [rsp+20H]
        movaps  xmm14, xmmword ptr [rsp+30H]
        movaps  xmm13, xmmword ptr [rsp+40H]
        movaps  xmm12, xmmword ptr [rsp+50H]
        movaps  xmm11, xmmword ptr [rsp+60H]
        movaps  xmm10, xmmword ptr [rsp+70H]
        movaps  xmm8, xmmword ptr [rsp+90H]
        movaps  xmm7, xmmword ptr [rsp+0A0H]
        movaps  xmm6, xmmword ptr [rsp+0B0H]
        mov     rdi, qword ptr [rsp+0C0H]
        movaps  xmm9, xmmword ptr [rsp+80H]
        add     rsp, 200
        pop     rsi
        pop     rbx
L_045:  ret
DrawVoxelRing ENDP


InitGL PROC
        push    rbx
        sub     rsp, 96
        mov     rax, qword ptr [ghLogFile]
        xor     ebx, ebx
        dec     rax
        cmp     rax, -3
        ja      L_048
        lea     rcx, [szGetDC]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szGetDC]
        call WriteFile
L_048:  mov     rcx, qword ptr [ghWnd]
        call GetDC
        mov     qword ptr [ghDC], rax
        test    rax, rax
        je      L_058
        mov     rcx, qword ptr [ghLogFile]
        lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_049
        lea     rcx, [szOK]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szOK]
        call WriteFile
        mov     rcx, qword ptr [ghLogFile]
L_049:  xor     eax, eax
        xorps   xmm0, xmm0
        movups  xmmword ptr [rsp+30H], xmm0
        mov     qword ptr [rsp+50H], rax
        movups  xmmword ptr [rsp+40H], xmm0
        mov     byte ptr [rsp+4AH], al
        lea     rax, [rcx-1H]
        mov     dword ptr [rsp+30H], 65576
        mov     dword ptr [rsp+34H], 37
        mov     word ptr [rsp+38H], 4096
        mov     byte ptr [rsp+47H], 16
        cmp     rax, -3
        ja      L_050
        lea     rcx, [szChoosePixelFormat]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szChoosePixelFormat]
        call WriteFile
L_050:  mov     rcx, qword ptr [ghDC]
        lea     rdx, [rsp+30H]
        call ChoosePixelFormat
        mov     dword ptr [giPixelFormat], eax
        test    eax, eax
        je      L_058
        mov     rcx, qword ptr [ghLogFile]
        lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_051
        lea     rcx, [szOK]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szOK]
        call WriteFile
        mov     rcx, qword ptr [ghLogFile]
L_051:  lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_052
        lea     rcx, [szSetPixelFormat]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szSetPixelFormat]
        call WriteFile
L_052:  mov     edx, dword ptr [giPixelFormat]
        lea     r8, [rsp+30H]
        mov     rcx, qword ptr [ghDC]
        call SetPixelFormat
        test    eax, eax
        je      L_058
        mov     rcx, qword ptr [ghLogFile]
        lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_053
        lea     rcx, [szOK]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szOK]
        call WriteFile
        mov     rcx, qword ptr [ghLogFile]
L_053:  lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_054
        lea     rcx, [szWglCreateContext]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szWglCreateContext]
        call WriteFile
L_054:  mov     rcx, qword ptr [ghDC]
        call wglCreateContext
        mov     qword ptr [ghRC], rax
        test    rax, rax
        je      L_058
        mov     rcx, qword ptr [ghLogFile]
        lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_055
        lea     rcx, [szOK]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szOK]
        call WriteFile
        mov     rcx, qword ptr [ghLogFile]
L_055:  lea     rax, [rcx-1H]
        cmp     rax, -3
        ja      L_056
        lea     rcx, [szWglMakeCurrent]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szWglMakeCurrent]
        call WriteFile
L_056:  mov     rdx, qword ptr [ghRC]
        mov     rcx, qword ptr [ghDC]
        call wglMakeCurrent
        test    eax, eax
        je      L_058
        mov     rax, qword ptr [ghLogFile]
        dec     rax
        cmp     rax, -3
        ja      L_057
        lea     rcx, [szOK]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], rbx
        lea     rdx, [szOK]
        call WriteFile
L_057:  mov     ecx, 2305
        call glFrontFace
        mov     ecx, 2884
        call glEnable
        mov     ecx, 1029
        call glCullFace
        mov     ecx, 2929
        call glEnable
        mov     ecx, 7425
        call glShadeModel
        mov     edx, 4354
        mov     ecx, 3152
        call glHint
        mov     ecx, 5889
        call glMatrixMode
        call glLoadIdentity
        movsd   xmm3, qword ptr [zFar]
        movsd   xmm2, qword ptr [zNear]
        movsd   xmm1, qword ptr [gRectClientAspect]
        movsd   xmm0, qword ptr [fovy]
        call    gluPerspective
        lea     rdx, [mtxProjectionDefault]
        mov     ecx, 2983
        call glGetFloatv
        movups  xmm0, xmmword ptr [mtxProjectionDefault]
        mov     byte ptr [isInitialPosition], 1
        xor     eax, eax
        movups  xmm1, xmmword ptr [mtxProjectionDefault+10H]
        mov     byte ptr [isRefreshed], bl
        movups  xmmword ptr [mtxProjectionVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxProjectionDefault+20H]
        movups  xmmword ptr [mtxProjectionVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxProjectionDefault+30H]
        movups  xmmword ptr [mtxProjectionVolatile+20H], xmm0
        movaps  xmm0, xmmword ptr [mtxCameraDefault]
        movups  xmmword ptr [mtxProjectionVolatile+30H], xmm1
        movaps  xmm1, xmmword ptr [mtxCameraDefault+10H]
        movups  xmmword ptr [mtxCameraVolatile], xmm0
        movaps  xmm0, xmmword ptr [mtxCameraDefault+20H]
        movups  xmmword ptr [mtxCameraVolatile+10H], xmm1
        movaps  xmm1, xmmword ptr [mtxCameraDefault+30H]
        movups  xmmword ptr [mtxCameraVolatile+20H], xmm0
        movaps  xmm0, xmmword ptr [mtxObjectDefault]
        movups  xmmword ptr [mtxCameraVolatile+30H], xmm1
        movaps  xmm1, xmmword ptr [mtxObjectDefault+10H]
        movups  xmmword ptr [mtxObjectVolatile], xmm0
        movaps  xmm0, xmmword ptr [mtxObjectDefault+20H]
        movups  xmmword ptr [mtxObjectVolatile+10H], xmm1
        movaps  xmm1, xmmword ptr [mtxObjectDefault+30H]
        movups  xmmword ptr [mtxObjectVolatile+20H], xmm0
        movups  xmmword ptr [mtxObjectVolatile+30H], xmm1
        add     rsp, 96
        pop     rbx
        ret
L_058:
        mov     eax, 4294967295
        add     rsp, 96
        pop     rbx
        ret
InitGL ENDP


InitLogger PROC
        sub     rsp, 72
        mov     qword ptr [rsp+30H], 0
        lea     rcx, [szLogFileName]
        mov     dword ptr [rsp+28H], 128
        xor     r9d, r9d
        mov     edx, 1073741824
        mov     dword ptr [rsp+20H], 2
        mov     r8d, 1
        call CreateFileA
        mov     qword ptr [ghLogFile], rax
        dec     rax
        cmp     rax, -3
        ja      L_059
        lea     rcx, [szLogInit]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], 0
        lea     rdx, [szLogInit]
        call WriteFile
L_059:  add     rsp, 72
        ret
InitLogger ENDP


InitTimer PROC
        sub     rsp, 40
        lea     rcx, [qpcFreq]
        call QueryPerformanceFrequency
        lea     rcx, [qpcPrev]
        add     rsp, 40
        jmp QueryPerformanceCounter
InitTimer ENDP


Mat4byMat4 PROC
        lea     rax, [rdx+4H]
        sub     r8, rdx
        mov     edx, 4
ALIGN   8
L_060:  movss   xmm2, dword ptr [rcx]
        mulss   xmm2, dword ptr [rax-4H]
        movss   xmm0, dword ptr [rcx+10H]
        mulss   xmm0, dword ptr [rax]
        movss   xmm1, dword ptr [rcx+20H]
        mulss   xmm1, dword ptr [rax+4H]
        addss   xmm2, xmm0
        movss   xmm0, dword ptr [rax+8H]
        mulss   xmm0, dword ptr [rcx+30H]
        addss   xmm2, xmm1
        addss   xmm2, xmm0
        movss   dword ptr [r8+rax-4H], xmm2
        movss   xmm3, dword ptr [rax]
        mulss   xmm3, dword ptr [rcx+14H]
        movss   xmm0, dword ptr [rax-4H]
        mulss   xmm0, dword ptr [rcx+4H]
        movss   xmm1, dword ptr [rax+4H]
        mulss   xmm1, dword ptr [rcx+24H]
        addss   xmm3, xmm0
        movss   xmm0, dword ptr [rax+8H]
        mulss   xmm0, dword ptr [rcx+34H]
        addss   xmm3, xmm1
        addss   xmm3, xmm0
        movss   dword ptr [r8+rax], xmm3
        movss   xmm0, dword ptr [rax]
        mulss   xmm0, dword ptr [rcx+18H]
        movss   xmm1, dword ptr [rax+4H]
        mulss   xmm1, dword ptr [rcx+28H]
        movss   xmm2, dword ptr [rcx+8H]
        mulss   xmm2, dword ptr [rax-4H]
        addss   xmm2, xmm0
        movss   xmm0, dword ptr [rax+8H]
        mulss   xmm0, dword ptr [rcx+38H]
        addss   xmm2, xmm1
        addss   xmm2, xmm0
        movss   dword ptr [r8+rax+4H], xmm2
        movss   xmm3, dword ptr [rax-4H]
        mulss   xmm3, dword ptr [rcx+0CH]
        movss   xmm0, dword ptr [rcx+1CH]
        mulss   xmm0, dword ptr [rax]
        movss   xmm1, dword ptr [rax+4H]
        mulss   xmm1, dword ptr [rcx+2CH]
        addss   xmm3, xmm0
        movss   xmm0, dword ptr [rax+8H]
        mulss   xmm0, dword ptr [rcx+3CH]
        addss   xmm3, xmm1
        addss   xmm3, xmm0
        movss   dword ptr [r8+rax+8H], xmm3
        add     rax, 16
        sub     rdx, 1
        jne     L_060
        ret
Mat4byMat4 ENDP


ModelRotate PROC
        sub     rsp, 120
        cmp     byte ptr [key+10H], 0
        movaps  xmmword ptr [rsp+10H], xmm11
        movaps  xmmword ptr [rsp], xmm12
        jz      L_061
        movss   xmm11, dword ptr [sinFast]
        movss   xmm12, dword ptr [cosFast]
        jmp     L_062
L_061:  movss   xmm11, dword ptr [sinSlow]
        movss   xmm12, dword ptr [cosSlow]
L_062:  movaps  xmmword ptr [rsp+60H], xmm6
        movaps  xmmword ptr [rsp+50H], xmm7
        movaps  xmmword ptr [rsp+40H], xmm8
        movaps  xmmword ptr [rsp+30H], xmm9
        movaps  xmmword ptr [rsp+20H], xmm10
        mulss   xmm11, xmm0
        test    edx, edx
        jne     L_063
        movss   xmm4, dword ptr [mtxObjectVolatile+10H]
        movss   xmm3, dword ptr [mtxObjectVolatile+20H]
        movaps  xmm0, xmm4
        movss   xmm6, dword ptr [mtxObjectVolatile+14H]
        movaps  xmm1, xmm3
        movss   xmm5, dword ptr [mtxObjectVolatile+24H]
        movss   xmm8, dword ptr [mtxObjectVolatile+18H]
        movaps  xmm2, xmm5
        movss   xmm7, dword ptr [mtxObjectVolatile+28H]
        movss   xmm10, dword ptr [mtxObjectVolatile+1CH]
        movss   xmm9, dword ptr [mtxObjectVolatile+2CH]
        mulss   xmm0, xmm12
        mulss   xmm1, xmm11
        mulss   xmm2, xmm11
        addss   xmm1, xmm0
        mulss   xmm3, xmm12
        movaps  xmm0, xmm6
        mulss   xmm4, xmm11
        mulss   xmm0, xmm12
        movss   dword ptr [mtxObjectVolatile+10H], xmm1
        movaps  xmm1, xmm7
        mulss   xmm1, xmm11
        subss   xmm3, xmm4
        addss   xmm2, xmm0
        mulss   xmm5, xmm12
        movaps  xmm0, xmm8
        mulss   xmm6, xmm11
        mulss   xmm0, xmm12
        movss   dword ptr [mtxObjectVolatile+14H], xmm2
        movaps  xmm2, xmm9
        mulss   xmm2, xmm11
        subss   xmm5, xmm6
        addss   xmm1, xmm0
        mulss   xmm7, xmm12
        movaps  xmm0, xmm10
        mulss   xmm8, xmm11
        mulss   xmm0, xmm12
        mulss   xmm9, xmm12
        subss   xmm7, xmm8
        mulss   xmm10, xmm11
        addss   xmm2, xmm0
        movss   dword ptr [mtxObjectVolatile+18H], xmm1
        movss   dword ptr [mtxObjectVolatile+20H], xmm3
        subss   xmm9, xmm10
        movss   dword ptr [mtxObjectVolatile+24H], xmm5
        movss   dword ptr [mtxObjectVolatile+1CH], xmm2
        movss   dword ptr [mtxObjectVolatile+28H], xmm7
        movss   dword ptr [mtxObjectVolatile+2CH], xmm9
        jmp     L_066
L_063:  cmp     edx, 1
        jne     L_064
        movss   xmm4, dword ptr [mtxObjectVolatile]
        movss   xmm3, dword ptr [mtxObjectVolatile+20H]
        movaps  xmm1, xmm4
        movss   xmm6, dword ptr [mtxObjectVolatile+4H]
        movaps  xmm0, xmm3
        movss   xmm5, dword ptr [mtxObjectVolatile+24H]
        movaps  xmm2, xmm6
        movss   xmm7, dword ptr [mtxObjectVolatile+28H]
        movss   xmm9, dword ptr [mtxObjectVolatile+2CH]
        movss   xmm8, dword ptr [mtxObjectVolatile+8H]
        movss   xmm10, dword ptr [mtxObjectVolatile+0CH]
        mulss   xmm0, xmm11
        mulss   xmm1, xmm12
        mulss   xmm2, xmm12
        subss   xmm1, xmm0
        mulss   xmm3, xmm12
        movaps  xmm0, xmm5
        mulss   xmm4, xmm11
        mulss   xmm0, xmm11
        movss   dword ptr [mtxObjectVolatile], xmm1
        movaps  xmm1, xmm8
        mulss   xmm1, xmm12
        addss   xmm3, xmm4
        subss   xmm2, xmm0
        mulss   xmm5, xmm12
        movaps  xmm0, xmm7
        mulss   xmm6, xmm11
        mulss   xmm0, xmm11
        movss   dword ptr [mtxObjectVolatile+4H], xmm2
        movaps  xmm2, xmm10
        mulss   xmm7, xmm12
        addss   xmm5, xmm6
        subss   xmm1, xmm0
        mulss   xmm8, xmm11
        movaps  xmm0, xmm9
        mulss   xmm10, xmm11
        mulss   xmm9, xmm12
        addss   xmm7, xmm8
        mulss   xmm2, xmm12
        addss   xmm9, xmm10
        mulss   xmm0, xmm11
        movss   dword ptr [mtxObjectVolatile+20H], xmm3
        movss   dword ptr [mtxObjectVolatile+24H], xmm5
        movss   dword ptr [mtxObjectVolatile+28H], xmm7
        subss   xmm2, xmm0
        movss   dword ptr [mtxObjectVolatile+2CH], xmm9
        jmp     L_065
L_064:  cmp     edx, 2
        jne     L_066
        movss   xmm4, dword ptr [mtxObjectVolatile]
        movss   xmm3, dword ptr [mtxObjectVolatile+10H]
        movaps  xmm0, xmm4
        movss   xmm6, dword ptr [mtxObjectVolatile+4H]
        movaps  xmm1, xmm3
        movss   xmm5, dword ptr [mtxObjectVolatile+14H]
        movss   xmm7, dword ptr [mtxObjectVolatile+18H]
        movaps  xmm2, xmm5
        movss   xmm9, dword ptr [mtxObjectVolatile+1CH]
        movss   xmm8, dword ptr [mtxObjectVolatile+8H]
        movss   xmm10, dword ptr [mtxObjectVolatile+0CH]
        mulss   xmm0, xmm12
        mulss   xmm1, xmm11
        mulss   xmm2, xmm11
        addss   xmm1, xmm0
        mulss   xmm3, xmm12
        movaps  xmm0, xmm6
        mulss   xmm4, xmm11
        mulss   xmm0, xmm12
        movss   dword ptr [mtxObjectVolatile], xmm1
        movaps  xmm1, xmm7
        mulss   xmm1, xmm11
        subss   xmm3, xmm4
        addss   xmm2, xmm0
        mulss   xmm5, xmm12
        movaps  xmm0, xmm8
        mulss   xmm6, xmm11
        mulss   xmm0, xmm12
        movss   dword ptr [mtxObjectVolatile+4H], xmm2
        movaps  xmm2, xmm9
        mulss   xmm7, xmm12
        subss   xmm5, xmm6
        addss   xmm1, xmm0
        mulss   xmm8, xmm11
        movaps  xmm0, xmm10
        mulss   xmm9, xmm12
        mulss   xmm10, xmm11
        subss   xmm7, xmm8
        mulss   xmm2, xmm11
        subss   xmm9, xmm10
        mulss   xmm0, xmm12
        movss   dword ptr [mtxObjectVolatile+10H], xmm3
        movss   dword ptr [mtxObjectVolatile+14H], xmm5
        movss   dword ptr [mtxObjectVolatile+18H], xmm7
        addss   xmm2, xmm0
        movss   dword ptr [mtxObjectVolatile+1CH], xmm9
L_065:  movss   dword ptr [mtxObjectVolatile+0CH], xmm2
        movss   dword ptr [mtxObjectVolatile+8H], xmm1
L_066:  movaps  xmm10, xmmword ptr [rsp+20H]
        movaps  xmm9, xmmword ptr [rsp+30H]
        movaps  xmm8, xmmword ptr [rsp+40H]
        movaps  xmm7, xmmword ptr [rsp+50H]
        movaps  xmm6, xmmword ptr [rsp+60H]
        movaps  xmm11, xmmword ptr [rsp+10H]
        movaps  xmm12, xmmword ptr [rsp]
        mov     byte ptr [isRefreshed], 0
        mov     byte ptr [isInitialPosition], 0
        add     rsp, 120
        ret
ModelRotate ENDP


MouseToVector PROC
        push    rbx
        sub     rsp, 96
        movss   xmm1, dword ptr [SpinRadius]
        mov     rbx, r8
        movss   xmm0, dword ptr [eps]
        comiss  xmm0, xmm1
        jbe     L_068
        mov     rax, qword ptr [ghLogFile]
        dec     rax
        cmp     rax, -3
        ja      L_067
        lea     rcx, [szErrMouseToVector]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], 0
        lea     rdx, [szErrMouseToVector]
        call WriteFile
L_067:  mov     qword ptr [rbx], 0
        mov     eax, 4294967295
        mov     dword ptr [rbx+8H], 1065353216
        add     rsp, 96
        pop     rbx
        ret
L_068:
        sub     ecx, dword ptr [xScrCenter]
        mov     eax, dword ptr [yScrCenter]
        movaps  xmmword ptr [rsp+50H], xmm6
        sub     eax, edx
        movss   xmm6, dword ptr [__real@3f800000]
        movaps  xmmword ptr [rsp+40H], xmm7
        xorps   xmm7, xmm7
        movaps  xmmword ptr [rsp+30H], xmm8
        xorps   xmm8, xmm8
        cvtsi2ss xmm8, eax
        cvtsi2ss xmm7, ecx
        divss   xmm8, xmm1
        divss   xmm7, xmm1
        mulss   xmm8, dword ptr [SpinSpeed]
        mulss   xmm7, dword ptr [SpinSpeed]
        movaps  xmm1, xmm8
        mulss   xmm1, xmm8
        movaps  xmm0, xmm7
        mulss   xmm0, xmm7
        addss   xmm1, xmm0
        xorps   xmm0, xmm0
        comiss  xmm1, xmm6
        jbe     L_071
        ucomiss xmm0, xmm1
        ja      L_069
        xorps   xmm0, xmm0
        sqrtss  xmm0, xmm1
        jmp     L_070
L_069:  movaps  xmm0, xmm1
        call    sqrtf
L_070:  divss   xmm6, xmm0
        xorps   xmm1, xmm1
        movaps  xmm0, xmm6
        mulss   xmm6, xmm7
        mulss   xmm0, xmm8
        jmp     L_074
L_071:  subss   xmm6, xmm1
        ucomiss xmm0, xmm6
        ja      L_072
        xorps   xmm1, xmm1
        sqrtss  xmm1, xmm6
        jmp     L_073
L_072:  movaps  xmm0, xmm6
        call    sqrtf
        movaps  xmm1, xmm0
L_073:  movaps  xmm0, xmm8
        movaps  xmm6, xmm7
L_074:  movss   dword ptr [rbx], xmm6
        xor     eax, eax
        movss   dword ptr [rbx+4H], xmm0
        movss   dword ptr [rbx+8H], xmm1
        movaps  xmm8, xmmword ptr [rsp+30H]
        movaps  xmm7, xmmword ptr [rsp+40H]
        movaps  xmm6, xmmword ptr [rsp+50H]
        add     rsp, 96
        pop     rbx
        ret
MouseToVector ENDP


SpellError PROC
        push    rbx
        sub     rsp, 112
        call GetLastError
        mov     r8d, eax
        mov     dword ptr [gnLastError], eax
        lea     rdx, [fmt_ErrorHex]
        mov     ebx, eax
        lea     rcx, [rsp+30H]
        call wsprintfA
        mov     rcx, qword ptr [ghLogFile]
        dec     rcx
        cmp     rcx, -3
        ja      L_077
        lea     rcx, [rsp+30H]
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], 0
        lea     rdx, [rsp+30H]
        call WriteFile
L_077:  mov     rcx, qword ptr [ghWnd]
        lea     r8, [szError]
        xor     r9d, r9d
        lea     rdx, [szErrWarning]
        call MessageBoxA
        mov     eax, ebx
        add     rsp, 112
        pop     rbx
        ret
SpellError ENDP


Tick PROC
        sub     rsp, 40
        lea     rcx, [rsp+30H]
        call QueryPerformanceCounter
        mov     rax, qword ptr [rsp+30H]
        mov     rcx, rax
        sub     rcx, qword ptr [qpcPrev]
        mov     qword ptr [gDeltaT], rcx
        mov     qword ptr [qpcPrev], rax
        add     rsp, 40
        ret
Tick ENDP


WinMain PROC
        mov     rax, rsp
        mov     qword ptr [rax+10H], rsi
        mov     qword ptr [rax+18H], rdi
        mov     qword ptr [rax+20H], r14
        push    rbp
        lea     rbp, [rax-38H]
        sub     rsp, 304
        xorps   xmm0, xmm0
        movaps  xmmword ptr [rax-18H], xmm6
        movaps  xmmword ptr [rax-28H], xmm7
        movaps  xmmword ptr [rax-38H], xmm8
        movups  xmmword ptr [rsp+78H], xmm0
        movups  xmmword ptr [rbp-78H], xmm0
        movups  xmmword ptr [rbp-68H], xmm0
        call    InitLogger
        lea     rcx, [szLogEnterWinMain]
        call    WriteLog
        lea     rcx, [szGetModuleHandleA]
        call    WriteLog
        xor     ecx, ecx
        call GetModuleHandleA
        mov     qword ptr [ghInst], rax
        test    rax, rax
        je      L_085
        lea     rcx, [szOK]
        call    WriteLog
        xorps   xmm0, xmm0
        mov     dword ptr [rbp-50H], 80
        lea     rax, [WndProc]
        movdqa  xmmword ptr [rbp-30H], xmm0
        mov     qword ptr [rbp-48H], rax
        xorps   xmm1, xmm1
        mov     rax, qword ptr [ghInst]
        xor     edi, edi
        mov     edx, 32512
        mov     qword ptr [rbp-38H], rax
        xor     ecx, ecx
        mov     qword ptr [rbp-40H], rdi
        movdqa  xmmword ptr [rbp-20H], xmm1
        movdqa  xmmword ptr [rbp-10H], xmm0
        mov     dword ptr [rbp-4CH], 43
        call LoadIconA
        mov     edx, 32512
        xor     ecx, ecx
        mov     qword ptr [rbp-30H], rax
        mov     qword ptr [rbp-8H], rax
        call LoadCursorA
        mov     ecx, 4
        mov     qword ptr [rbp-28H], rax
        call GetStockObject
        lea     rsi, [szMainWndClass]
        mov     qword ptr [rbp-20H], rax
        lea     rcx, [szRegisterClassExA]
        mov     qword ptr [rbp-10H], rsi
        call    WriteLog
        lea     rcx, [rbp-50H]
        call RegisterClassExA
        movzx   eax, ax
        mov     dword ptr [gnWndClass], eax
        test    eax, eax
        je      L_085
        lea     rcx, [szOK]
        call    WriteLog
        lea     rcx, [szLogCreatingMenu]
        call    WriteLog
        call CreateMenu
        mov     qword ptr [ghMenu], rax
        test    rax, rax
        je      L_085
        call CreatePopupMenu
        mov     qword ptr [ghMenuFile], rax
        test    rax, rax
        je      L_085
        mov     rcx, qword ptr [ghMenu]
        lea     r9, [szMenuFile]
        mov     r8, rax
        mov     edx, 16
        call AppendMenuA
        mov     rcx, qword ptr [ghMenuFile]
        lea     r9, [szMenuFileSave]
        mov     edx, 1
        mov     r8d, 259
        call AppendMenuA
        mov     rcx, qword ptr [ghMenuFile]
        lea     r9, [szMenuFileExit]
        xor     edx, edx
        mov     r8d, 265
        call AppendMenuA
        call CreatePopupMenu
        mov     qword ptr [ghMenuHelp], rax
        test    rax, rax
        je      L_085
        mov     rcx, qword ptr [ghMenu]
        lea     r9, [szMenuHelp]
        mov     r8, rax
        mov     qword ptr [rsp+140H], rbx
        mov     edx, 16
        call AppendMenuA
        mov     rcx, qword ptr [ghMenuHelp]
        lea     r9, [szMenuHelpAbout]
        xor     edx, edx
        mov     r8d, 2305
        call AppendMenuA
        lea     rcx, [szOK]
        call    WriteLog
        lea     rcx, [szCreateAcceleratorTableA]
        call    WriteLog
        mov     edx, 2
        mov     byte ptr [rsp+60H], 9
        lea     rcx, [rsp+60H]
        mov     dword ptr [rsp+62H], 17367127
        mov     byte ptr [rsp+66H], 1
        mov     dword ptr [rsp+68H], 151060592
        call CreateAcceleratorTableA
        mov     rbx, qword ptr [rsp+140H]
        mov     qword ptr [ghAccTable], rax
        test    rax, rax
        je      L_085
        lea     rcx, [szOK]
        call    WriteLog
        lea     rcx, [szCreateWindowExA]
        call    WriteLog
        mov     rax, qword ptr [ghInst]
        lea     r8, [szMainWndTitle]
        mov     qword ptr [rsp+58H], rdi
        mov     r9d, 382664704
        mov     qword ptr [rsp+50H], rax
        mov     rdx, rsi
        mov     rax, qword ptr [ghMenu]
        mov     ecx, 262400
        mov     qword ptr [rsp+48H], rax
        mov     qword ptr [rsp+40H], rdi
        mov     dword ptr [rsp+38H], 600
        mov     dword ptr [rsp+30H], 800
        mov     dword ptr [rsp+28H], 16
        mov     dword ptr [rsp+20H], 16
        call CreateWindowExA
        mov     qword ptr [ghWnd], rax
        test    rax, rax
        je      L_085
        lea     rcx, [szOK]
        call    WriteLog
        lea     rcx, [szLogCreatingStatusBar]
        call    WriteLog
        lea     rcx, [rsp+70H]
        mov     dword ptr [rsp+70H], 8
        mov     dword ptr [rsp+74H], 4
        call InitCommonControlsEx
        mov     rax, qword ptr [ghInst]
        lea     rdx, [szStatusClassName]
        mov     qword ptr [rsp+58H], rdi
        mov     r9d, 1342177536
        mov     qword ptr [rsp+50H], rax
        xor     r8d, r8d
        mov     rax, qword ptr [ghWnd]
        xor     ecx, ecx
        mov     qword ptr [rsp+48H], 1
        mov     qword ptr [rsp+40H], rax
        mov     dword ptr [rsp+38H], edi
        mov     dword ptr [rsp+30H], edi
        mov     dword ptr [rsp+28H], edi
        mov     dword ptr [rsp+20H], edi
        call CreateWindowExA
        mov     qword ptr [ghwndStatusBar], rax
        test    rax, rax
        je      L_085
        lea     r9, [xStatusParts]
        mov     edx, 1028
        mov     r8d, 9
        mov     rcx, rax
        call SendMessageA
        lea     rcx, [szOK]
        call    WriteLog
        mov     rcx, qword ptr [ghWnd]
        call UpdateWindow
        mov     rcx, qword ptr [ghWnd]
        call SetForegroundWindow
        mov     rcx, qword ptr [ghWnd]
        call SetFocus
        call    InitGL
        test    eax, eax
        jne     L_085
        call    InitTimer
        movss   xmm7, dword ptr [__real@3ccccccd]
        movss   xmm6, dword ptr [__real@43b40000]
        movss   xmm8, dword ptr [__real@3d23d70a]
ALIGN   8
L_078:  xor     r9d, r9d
        mov     dword ptr [rsp+20H], 1
        xor     r8d, r8d
        lea     rcx, [rsp+78H]
        xor     edx, edx
        call PeekMessageA
        test    eax, eax
        jz      L_079
        cmp     dword ptr [rbp-80H], 18
        je      L_086
        mov     rdx, qword ptr [ghAccTable]
        lea     r8, [rsp+78H]
        mov     rcx, qword ptr [ghWnd]
        call TranslateAcceleratorA
        test    eax, eax
        jnz     L_078
        lea     rcx, [rsp+78H]
        call TranslateMessage
        lea     rcx, [rsp+78H]
        call DispatchMessageA
        jmp     L_078
L_079:  cmp     byte ptr [isActive], dil
        je      L_084
        call    Tick
        call    CheckKeys
        cmp     byte ptr [autoRotate], dil
        jz      L_082
        movss   xmm0, dword ptr [autoAngle]
        addss   xmm0, xmm7
        comiss  xmm0, xmm6
        movss   dword ptr [autoAngle], xmm0
        jbe     L_080
        subss   xmm0, xmm6
        movss   dword ptr [autoAngle], xmm0
L_080:  movss   xmm0, dword ptr [autoAngle2]
        addss   xmm0, xmm8
        comiss  xmm0, xmm6
        movss   dword ptr [autoAngle2], xmm0
        jbe     L_081
        subss   xmm0, xmm6
        movss   dword ptr [autoAngle2], xmm0
L_081:  mov     byte ptr [isRefreshed], dil
        call    DrawScene
        jmp     L_078
L_082:  cmp     byte ptr [isRefreshed], dil
        jnz     L_083
        call    DrawScene
        jmp     L_078
L_083:  mov     ecx, 16
        call Sleep
        jmp     L_078
L_084:  mov     ecx, 2
        call Sleep
        jmp     L_078
L_085:  call    SpellError
L_086:  lea     rcx, [szExitProcess]
        call    WriteLog
        call    CloseLogger
        xor     ecx, ecx
        call ExitProcess
        int 3
WinMain ENDP


WndProc PROC
        push    rbx
        sub     rsp, 128
        mov     rbx, r9
        cmp     edx, 273
        ja      L_103
        je      L_102
        cmp     edx, 16
        ja      L_095
        je      L_094
        mov     eax, edx
        sub     eax, 2
        je      L_093
        sub     eax, 3
        jz      L_088
        cmp     eax, 1
        jne     LN_2
        test    r8w, r8w
        jz      L_087
        shr     r8, 16
        test    r8w, r8w
        jnz     L_087
        mov     byte ptr [isActive], al
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_087:  xor     al, al
        mov     byte ptr [isActive], al
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_088:  cmp     r8, 1
        je      L_110
        lea     rdx, [rsp+30H]
        call GetClientRect
        movzx   edx, bx
        shr     rbx, 16
        movzx   ecx, bx
        mov     dword ptr [gRectClientHeight], ecx
        mov     dword ptr [gRectClientWidth], edx
        test    edx, edx
        je      L_110
        test    ecx, ecx
        je      L_110
        movd    xmm0, ecx
        mov     eax, edx
        cvtdq2pd xmm0, xmm0
        shr     eax, 1
        mov     dword ptr [xScrCenter], eax
        mov     eax, ecx
        shr     eax, 1
        cmp     edx, ecx
        mov     dword ptr [yScrCenter], eax
        cmovc   ecx, edx
        movd    xmm1, edx
        cvtdq2pd xmm1, xmm1
        shr     ecx, 1
        xor     r9d, r9d
        xor     r8d, r8d
        mov     edx, 5
        divsd   xmm1, xmm0
        movd    xmm0, ecx
        mov     rcx, qword ptr [ghwndStatusBar]
        cvtdq2ps xmm0, xmm0
        movsd   qword ptr [gRectClientAspect], xmm1
        movss   dword ptr [SpinRadius], xmm0
        call SendMessageA
        xor     ecx, ecx
        lea     r9, [xStatusParts]
        cmp     dword ptr [__isa_available], 2
        jl      L_089
        movd    xmm2, dword ptr [gRectClientWidth]
        xorps   xmm1, xmm1
        movdqu  xmm0, xmmword ptr [xStatusProportions]
        xorps   xmm4, xmm4
        pshufd  xmm2, xmm2, 00H
        pmulld  xmm0, xmm2
        pcmpgtd xmm1, xmm0
        andps   xmm1, xmmword ptr [__xmm@000003ff000003ff000003ff000003ff]
        paddd   xmm1, xmm0
        movdqu  xmm0, xmmword ptr [xStatusProportions+10H]
        psrad   xmm1, 10
        pmulld  xmm0, xmm2
        pcmpgtd xmm4, xmm0
        andps   xmm4, xmmword ptr [__xmm@000003ff000003ff000003ff000003ff]
        paddd   xmm4, xmm0
        psrad   xmm4, 10
        movdqu  xmmword ptr [xStatusParts+10H], xmm4
        movdqu  xmmword ptr [xStatusParts], xmm1
        jmp     L_091
L_089:  mov     r8d, dword ptr [gRectClientWidth]
        lea     rcx, [rcx*4]
        lea     r10, [xStatusProportions]
L_090:  mov     eax, dword ptr [rcx+r10]
        imul    eax, r8d
        cdq
        and     edx, 3FFH
        add     eax, edx
        sar     eax, 10
        mov     dword ptr [rcx+r9], eax
        add     rcx, 4
        cmp     rcx, 32
        jl      L_090
L_091:  mov     rcx, qword ptr [ghwndStatusBar]
        mov     edx, 1028
        mov     r8d, 9
        mov     dword ptr [xStatusParts+20H], -1
        call SendMessageA
        cmp     qword ptr [ghRC], 0
        jz      L_092
        mov     r9d, dword ptr [gRectClientHeight]
        xor     edx, edx
        mov     r8d, dword ptr [gRectClientWidth]
        xor     ecx, ecx
        call glViewport
L_092:  mov     byte ptr [isRefreshed], 0
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_093:  xor     ecx, ecx
        call PostQuitMessage
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_094:  call    CloseWndProc
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_095:  mov     eax, edx
        sub     eax, 36
        je      L_101
        sub     eax, 220
        jz      L_096
        cmp     eax, 1
        jne     LN_2
        cmp     r8, 255
        jnc     L_110
        lea     r10, [key]
        xor     eax, eax
        mov     byte ptr [r8+r10], 0
        add     rsp, 128
        pop     rbx
        ret
L_096:  cmp     r8, 255
        jnc     L_110
        cmp     r8, 27
        jne     L_098
        cmp     byte ptr [isInitialPosition], 0
        jne     L_097
        movups  xmm0, xmmword ptr [mtxProjectionDefault]
        mov     byte ptr [isInitialPosition], 1
        xor     eax, eax
        movups  xmm1, xmmword ptr [mtxProjectionDefault+10H]
        mov     byte ptr [isRefreshed], 0
        movups  xmmword ptr [mtxProjectionVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxProjectionDefault+20H]
        movups  xmmword ptr [mtxProjectionVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxProjectionDefault+30H]
        movups  xmmword ptr [mtxProjectionVolatile+20H], xmm0
        movups  xmm0, xmmword ptr [mtxCameraDefault]
        movups  xmmword ptr [mtxProjectionVolatile+30H], xmm1
        movups  xmm1, xmmword ptr [mtxCameraDefault+10H]
        movups  xmmword ptr [mtxCameraVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxCameraDefault+20H]
        movups  xmmword ptr [mtxCameraVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxCameraDefault+30H]
        movups  xmmword ptr [mtxCameraVolatile+20H], xmm0
        movups  xmm0, xmmword ptr [mtxObjectDefault]
        movups  xmmword ptr [mtxCameraVolatile+30H], xmm1
        movups  xmm1, xmmword ptr [mtxObjectDefault+10H]
        movups  xmmword ptr [mtxObjectVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxObjectDefault+20H]
        movups  xmmword ptr [mtxObjectVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxObjectDefault+30H]
        movups  xmmword ptr [mtxObjectVolatile+20H], xmm0
        movups  xmmword ptr [mtxObjectVolatile+30H], xmm1
        add     rsp, 128
        pop     rbx
        ret
L_097:  call    CloseWndProc
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_098:  cmp     r8, 32
        jne     L_099
LN_44:
        movups  xmm0, xmmword ptr [mtxProjectionDefault]
        mov     byte ptr [isInitialPosition], 1
        xor     eax, eax
        movups  xmm1, xmmword ptr [mtxProjectionDefault+10H]
        mov     byte ptr [isRefreshed], 0
        movups  xmmword ptr [mtxProjectionVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxProjectionDefault+20H]
        movups  xmmword ptr [mtxProjectionVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxProjectionDefault+30H]
        movups  xmmword ptr [mtxProjectionVolatile+20H], xmm0
        movups  xmm0, xmmword ptr [mtxCameraDefault]
        movups  xmmword ptr [mtxProjectionVolatile+30H], xmm1
        movups  xmm1, xmmword ptr [mtxCameraDefault+10H]
        movups  xmmword ptr [mtxCameraVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxCameraDefault+20H]
        movups  xmmword ptr [mtxCameraVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxCameraDefault+30H]
        movups  xmmword ptr [mtxCameraVolatile+20H], xmm0
        movups  xmm0, xmmword ptr [mtxObjectDefault]
        movups  xmmword ptr [mtxCameraVolatile+30H], xmm1
        movups  xmm1, xmmword ptr [mtxObjectDefault+10H]
        movups  xmmword ptr [mtxObjectVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxObjectDefault+20H]
        movups  xmmword ptr [mtxObjectVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxObjectDefault+30H]
        movups  xmmword ptr [mtxObjectVolatile+20H], xmm0
        movups  xmmword ptr [mtxObjectVolatile+30H], xmm1
        add     rsp, 128
        pop     rbx
        ret
L_099:  cmp     r8, 13
        jnz     L_100
        mov     rcx, qword ptr [ghWnd]
        lea     r8, [szAboutMsgTitle]
        mov     r9d, 64
        lea     rdx, [szAboutMsgText]
        call MessageBoxA
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_100:  lea     r10, [key]
        xor     eax, eax
        mov     byte ptr [r8+r10], 1
        add     rsp, 128
        pop     rbx
        ret
L_101:  mov     dword ptr [r9+18H], 480
        xor     eax, eax
        mov     dword ptr [r9+1CH], 360
        add     rsp, 128
        pop     rbx
        ret
L_102:  mov     eax, 265
        cmp     r8w, ax
        je      L_097
        mov     eax, 2305
        cmp     r8w, ax
        jne     L_110
        mov     rcx, qword ptr [ghWnd]
        lea     r8, [szAboutMsgTitle]
        mov     r9d, 64
        lea     rdx, [szAboutMsgText]
        call MessageBoxA
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
L_103:  lea     eax, [rdx-200H]
        cmp     eax, 10
        ja      LN_2
        lea     r10, [__ImageBase]
        lea     r11, [LN_95]
        mov     eax, dword ptr [r11+rax*4]
        add     rax, r10
        jmp     rax
LN_32:
        mov     eax, dword ptr [gnMouseMode]
        cmp     eax, 1
        jne     L_105
        movsx   ecx, bx
        lea     r8, [rsp+30H]
        mov     eax, ecx
        shr     rbx, 16
        sub     eax, dword ptr [xMouseOld]
        movsx   edx, bx
        mov     dword ptr [dxMouse], eax
        mov     eax, edx
        sub     eax, dword ptr [yMouseOld]
        mov     dword ptr [dyMouse], eax
        mov     dword ptr [xMouseNew], ecx
        mov     dword ptr [yMouseNew], edx
        call    MouseToVector
        movss   xmm0, dword ptr [rsp+30H]
        movss   xmm1, dword ptr [rsp+34H]
        movss   dword ptr [xVectorNew], xmm0
        movss   xmm0, dword ptr [rsp+38H]
        movss   dword ptr [zVectorNew], xmm0
        movss   dword ptr [yVectorNew], xmm1
        call    ArcballRotation
        test    eax, eax
        jz      L_104
        mov     rax, qword ptr [ghLogFile]
        dec     rax
        cmp     rax, -3
        ja      L_108
        lea     rcx, [szErrOrbit]
        call lstrlenA
        xor     ecx, ecx
        lea     r9, [dwBytesWritten]
        mov     qword ptr [rsp+20H], rcx
        lea     rdx, [szErrOrbit]
        mov     rcx, qword ptr [ghLogFile]
        mov     r8d, eax
        call WriteFile
        jmp     L_108
L_104:  lea     r8, [mtxTemp]
        lea     rdx, [mtxCameraVolatile]
        lea     rcx, [mtxArcball]
        call    Mat4byMat4
        movups  xmm0, xmmword ptr [mtxTemp]
        movups  xmm1, xmmword ptr [mtxTemp+10H]
        movups  xmmword ptr [mtxCameraVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxTemp+20H]
        movups  xmmword ptr [mtxCameraVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxTemp+30H]
        movups  xmmword ptr [mtxCameraVolatile+20H], xmm0
        movups  xmmword ptr [mtxCameraVolatile+30H], xmm1
        jmp     L_108
L_105:  cmp     eax, 2
        jnz     L_106
        movsx   eax, bx
        xor     edx, edx
        mov     dword ptr [xMouseNew], eax
        sub     eax, dword ptr [xMouseOld]
        shr     rbx, 16
        movsx   ecx, bx
        mov     dword ptr [yMouseNew], ecx
        sub     ecx, dword ptr [yMouseOld]
        mov     dword ptr [dyMouse], ecx
        neg     ecx
        movd    xmm0, eax
        cvtdq2ps xmm0, xmm0
        mov     dword ptr [dxMouse], eax
        movd    xmm1, ecx
        mulss   xmm0, dword ptr [PanSpeed]
        cvtdq2ps xmm1, xmm1
        movss   dword ptr [PanMagnitudeX], xmm0
        mulss   xmm1, dword ptr [PanSpeed]
        movss   dword ptr [PanMagnitudeY], xmm1
        call    CameraMove
        movss   xmm0, dword ptr [PanMagnitudeY]
        mov     edx, 1
        call    CameraMove
        jmp     L_109
L_106:  cmp     eax, 3
        jne     L_110
        movsx   ecx, bx
        lea     r8, [rsp+30H]
        shr     rbx, 16
        movsx   edx, bx
        mov     dword ptr [yMouseNew], edx
        mov     dword ptr [xMouseNew], ecx
        call    MouseToVector
        movss   xmm0, dword ptr [rsp+30H]
        movss   xmm1, dword ptr [rsp+34H]
        movss   dword ptr [xVectorNew], xmm0
        movss   xmm0, dword ptr [rsp+38H]
        movss   dword ptr [zVectorNew], xmm0
        movss   dword ptr [yVectorNew], xmm1
        call    ArcballRotation
        test    eax, eax
        jz      L_107
        mov     rax, qword ptr [ghLogFile]
        dec     rax
        cmp     rax, -3
        ja      L_108
        lea     rcx, [szErrGeocentric]
        call lstrlenA
        xor     ecx, ecx
        lea     r9, [dwBytesWritten]
        mov     qword ptr [rsp+20H], rcx
        lea     rdx, [szErrGeocentric]
        mov     rcx, qword ptr [ghLogFile]
        mov     r8d, eax
        call WriteFile
        jmp     L_108
L_107:  movups  xmm5, xmmword ptr [mtxArcball]
        movss   xmm3, dword ptr [mtxCameraVolatile+30H]
        movss   xmm4, dword ptr [mtxCameraVolatile+38H]
        movaps  xmm0, xmm3
        mulss   xmm0, dword ptr [mtxCameraVolatile]
        movaps  xmm1, xmm4
        mulss   xmm1, dword ptr [mtxCameraVolatile+8H]
        movss   xmm2, dword ptr [__xmm@80000000800000008000000080000000]
        movaps  xmmword ptr [rsp+70H], xmm6
        movups  xmm6, xmmword ptr [mtxArcball+20H]
        movaps  xmmword ptr [rsp+60H], xmm7
        movaps  xmmword ptr [rsp+50H], xmm8
        movaps  xmmword ptr [rsp+40H], xmm9
        movss   xmm9, dword ptr [mtxCameraVolatile+34H]
        movaps  xmm8, xmm9
        movups  xmmword ptr [mtxWorld], xmm5
        mulss   xmm8, dword ptr [mtxCameraVolatile+4H]
        movaps  xmm7, xmm9
        mulss   xmm7, dword ptr [mtxCameraVolatile+14H]
        mulss   xmm9, dword ptr [mtxCameraVolatile+24H]
        addss   xmm8, xmm0
        movaps  xmm0, xmm3
        movups  xmmword ptr [mtxWorld+20H], xmm6
        mulss   xmm0, dword ptr [mtxCameraVolatile+10H]
        mulss   xmm3, dword ptr [mtxCameraVolatile+20H]
        addss   xmm8, xmm1
        addss   xmm7, xmm0
        movaps  xmm1, xmm4
        mulss   xmm4, dword ptr [mtxCameraVolatile+28H]
        mulss   xmm1, dword ptr [mtxCameraVolatile+18H]
        addss   xmm9, xmm3
        movups  xmm0, xmmword ptr [mtxArcball+30H]
        xorps   xmm8, xmm2
        movups  xmmword ptr [mtxWorld+30H], xmm0
        movaps  xmm0, xmm8
        addss   xmm7, xmm1
        mulss   xmm0, xmm5
        addss   xmm9, xmm4
        movss   dword ptr [xCamPos], xmm8
        movups  xmm4, xmmword ptr [mtxArcball+10H]
        movups  xmmword ptr [mtxWorld+10H], xmm4
        xorps   xmm7, xmm2
        movaps  xmm3, xmm7
        movss   dword ptr [yCamPos], xmm7
        xorps   xmm9, xmm2
        movaps  xmm2, xmm7
        mulss   xmm2, xmm4
        movaps  xmm1, xmm9
        mulss   xmm1, xmm6
        addss   xmm2, xmm0
        movss   dword ptr [zCamPos], xmm9
        movaps  xmm0, xmm8
        addss   xmm2, xmm1
        movaps  xmm1, xmm4
        shufps  xmm1, xmm4, 85
        mulss   xmm3, xmm1
        movaps  xmm1, xmm9
        shufps  xmm4, xmm4, 170
        subss   xmm0, xmm2
        movaps  xmm2, xmm8
        movss   dword ptr [mtxWorld+30H], xmm0
        movaps  xmm0, xmm5
        shufps  xmm0, xmm5, 85
        mulss   xmm2, xmm0
        movaps  xmm0, xmm6
        shufps  xmm0, xmm6, 85
        mulss   xmm1, xmm0
        movaps  xmm0, xmm7
        mulss   xmm7, xmm4
        addss   xmm3, xmm2
        shufps  xmm5, xmm5, 170
        mulss   xmm8, xmm5
        addss   xmm3, xmm1
        shufps  xmm6, xmm6, 170
        addss   xmm7, xmm8
        subss   xmm0, xmm3
        movss   dword ptr [mtxWorld+34H], xmm0
        movaps  xmm0, xmm9
        mulss   xmm0, xmm6
        addss   xmm7, xmm0
        subss   xmm9, xmm7
        lea     r8, [mtxTemp]
        movss   dword ptr [mtxWorld+38H], xmm9
        lea     rdx, [mtxObjectVolatile]
        lea     rcx, [mtxWorld]
        call    Mat4byMat4
        movups  xmm0, xmmword ptr [mtxTemp]
        movups  xmm1, xmmword ptr [mtxTemp+10H]
        movaps  xmm9, xmmword ptr [rsp+40H]
        movaps  xmm8, xmmword ptr [rsp+50H]
        movaps  xmm7, xmmword ptr [rsp+60H]
        movaps  xmm6, xmmword ptr [rsp+70H]
        movups  xmmword ptr [mtxObjectVolatile], xmm0
        movups  xmm0, xmmword ptr [mtxTemp+20H]
        movups  xmmword ptr [mtxObjectVolatile+10H], xmm1
        movups  xmm1, xmmword ptr [mtxTemp+30H]
        movups  xmmword ptr [mtxObjectVolatile+20H], xmm0
        movups  xmmword ptr [mtxObjectVolatile+30H], xmm1
L_108:  movss   xmm0, dword ptr [xVectorNew]
        movss   xmm1, dword ptr [yVectorNew]
        movss   dword ptr [xVectorOld], xmm0
        movss   xmm0, dword ptr [zVectorNew]
        movss   dword ptr [zVectorOld], xmm0
        movss   dword ptr [yVectorOld], xmm1
L_109:  mov     eax, dword ptr [xMouseNew]
        mov     dword ptr [xMouseOld], eax
        mov     eax, dword ptr [yMouseNew]
        mov     dword ptr [yMouseOld], eax
        mov     byte ptr [isInitialPosition], 0
        mov     byte ptr [isRefreshed], 0
L_110:  xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
LN_38:
        mov     dword ptr [gnMouseMode], 3
L_111:  movsx   ecx, bx
        lea     r8, [rsp+30H]
        shr     rbx, 16
        movsx   edx, bx
        mov     dword ptr [yMouseOld], edx
        mov     dword ptr [xMouseOld], ecx
        call    MouseToVector
        movss   xmm0, dword ptr [rsp+30H]
        movss   xmm1, dword ptr [rsp+34H]
        movss   dword ptr [xVectorOld], xmm0
        movss   xmm0, dword ptr [rsp+38H]
        movss   dword ptr [zVectorOld], xmm0
        movss   dword ptr [yVectorOld], xmm1
L_112:  mov     byte ptr [isInitialPosition], 0
        xor     eax, eax
        mov     byte ptr [isRefreshed], 0
        add     rsp, 128
        pop     rbx
        ret
LN_40:
        mov     dword ptr [gnMouseMode], 1
        jmp     L_111
LN_42:
        movsx   eax, bx
        shr     rbx, 16
        mov     dword ptr [xMouseOld], eax
        movsx   eax, bx
        mov     dword ptr [yMouseOld], eax
        mov     dword ptr [gnMouseMode], 2
        jmp     L_112
LN_43:
        xor     ecx, ecx
        mov     dword ptr [gnMouseMode], ecx
        xor     eax, eax
        add     rsp, 128
        pop     rbx
        ret
LN_45:
        shr     r8, 16
        mov     edx, 2
        movsx   eax, r8w
        movd    xmm0, eax
        cvtdq2ps xmm0, xmm0
        mulss   xmm0, dword ptr [DollySpeed]
        movss   dword ptr [DollyMagnitude], xmm0
        call    CameraMove
        jmp     L_112
LN_2:
        add     rsp, 128
        pop     rbx
        jmp DefWindowProcA

ALIGN   4
LN_95   label dword
        dd imagerel LN_32
        dd imagerel LN_38
        dd imagerel LN_43
        dd imagerel LN_2
        dd imagerel LN_40
        dd imagerel LN_43
        dd imagerel LN_2
        dd imagerel LN_42
        dd imagerel LN_43
        dd imagerel LN_44
        dd imagerel LN_45
WndProc ENDP


WriteLog PROC
        test    rcx, rcx
        jz      L_114
        push    rbx
        sub     rsp, 48
        mov     rax, qword ptr [ghLogFile]
        mov     rbx, rcx
        dec     rax
        cmp     rax, -3
        ja      L_113
        call lstrlenA
        mov     rcx, qword ptr [ghLogFile]
        lea     r9, [dwBytesWritten]
        mov     r8d, eax
        mov     qword ptr [rsp+20H], 0
        mov     rdx, rbx
        call WriteFile
L_113:  add     rsp, 48
        pop     rbx
L_114:  ret
WriteLog ENDP


sqrtf PROC
        sqrtss  xmm0, xmm0
        ret
sqrtf ENDP

sinf PROC
        movss   dword ptr [rsp+8], xmm0
        fld     dword ptr [rsp+8]
        fsin
        fstp    dword ptr [rsp+8]
        movss   xmm0, dword ptr [rsp+8]
        ret
sinf ENDP

cosf PROC
        movss   dword ptr [rsp+8], xmm0
        fld     dword ptr [rsp+8]
        fcos
        fstp    dword ptr [rsp+8]
        movss   xmm0, dword ptr [rsp+8]
        ret
cosf ENDP

END