Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; --------------------------------------------------------------------------
  2. ; FILE: TApp.Asm
  3. ; DATE: September 21, 2008
  4. ; --------------------------------------------------------------------------
  5.  
  6. ; --------------------------------------------------------------------------
  7. ; DESTRCT
  8. ; --------------------------------------------------------------------------
  9. virtual at 0
  10. loc84:
  11.     .nCountDown COUNT ?
  12.     .size = $
  13. end virtual
  14. ; --------------------------------------------------------------------------
  15. align PROC_ALIGN
  16. TApp_SelfDestruct:
  17.     mcBeginLocals loc84.size
  18.  
  19.     mov     cl, DEV_COMPUTER
  20.     call    TArray_IsDamaged
  21.     jnc     .L5
  22.  
  23.     call    TConsole_ScrollUp
  24.     mov     ecx, 686
  25.     call    TConsole_ProutGameMsg
  26.     call    TConsole_ScrollUp
  27.     jmp     .done
  28.  
  29. .L5:
  30.     call    TConsole_ScrollUp
  31.     mov     ecx, 290
  32.     call    TConsole_ProutGameMsg
  33.     mov     ecx, 687
  34.     call    TConsole_Prout
  35.     inc     ecx
  36.     call    TConsole_Prout
  37.     call    TConsole_ScrollUp
  38.  
  39.     mcLoad8bitsToReg32 ecx, 10
  40.     mcStoreLocal loc84.nCountDown, ecx
  41.  
  42. .pre_sequence:
  43.     mov     ecx, 694
  44.     call    TConsole_Cram
  45.     mcLoadLocal eax, loc84.nCountDown
  46.     call    TConsole_CramInt
  47.     call    TConsole_RefreshCaretLine
  48.     invoke  Sleep, 1000
  49.  
  50.     dec     [esp + loc84.nCountDown]
  51.     cmp     [esp + loc84.nCountDown], 6
  52.     jae     .pre_sequence
  53.  
  54.     call    TConsole_ScrollUp
  55.     call    TConsole_ScrollUp
  56.  
  57.     mov     cl, ATTR_PROMPT_TEXT
  58.     call    TConsole_SetAttr
  59.  
  60.     mov     ecx, 689
  61.     call    TConsole_Prout
  62.     inc     ecx
  63.     call    TConsole_Prout
  64.     inc     ecx
  65.     call    TGame_Prompt
  66.     call    TConsole_ScrollUp
  67.  
  68.     call    TCmdBuf_Scan
  69.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
  70.     je      .password_rejected
  71.  
  72.     mcLoadGameDataPtr edi
  73.     add     edi, TREKDATA.PASSWD
  74.     call    TString_AnsiEqual
  75.     jnc     .password_rejected
  76.  
  77.     mov     ecx, 692
  78.     call    TConsole_ProutGameMsg
  79.     mov     cl, 22
  80.     call    TConsole_RepeatBlank
  81.  
  82. .final_sequence:
  83.     mov     ecx, 694
  84.     call    TConsole_Cram
  85.     mcLoadLocal eax, loc84.nCountDown
  86.     call    TConsole_CramInt
  87.     call    TConsole_RefreshCaretLine
  88.     invoke  Sleep, 1000
  89.  
  90.     dec     [esp + loc84.nCountDown]
  91.     jnz     .final_sequence
  92.  
  93.     call    TConsole_ScrollUp
  94.  
  95.     fld     [glb_dbl_0dot05]
  96.     call    TRandom_Ranf
  97.     mc_CMP_ST0_ST1
  98.     jnc     .everyone_wasted
  99.  
  100.     mov     ecx, 693
  101.     call    TConsole_ProutGameMsg
  102.     invoke  Sleep, 1000
  103.  
  104. .everyone_wasted:
  105.     call    TConsole_ScrollUp
  106.     call    TConsole_ScrollUp
  107.     call    TPlanet_KaBoom
  108.     jmp     .done
  109.  
  110. .password_rejected:
  111.     mov     ecx, 695
  112.     call    TConsole_ProutGameMsg
  113.     inc     ecx
  114.     call    TConsole_Prout
  115.     call    TConsole_ScrollUp
  116.     call    TConsole_ScrollUp
  117.  
  118. .done:
  119.     mcEndLocals loc84.size
  120.     ret
  121.  
  122. ; --------------------------------------------------------------------------
  123. ; PLAQUE
  124. ; --------------------------------------------------------------------------
  125. virtual at 0
  126. loc112:
  127.     .pNextInByte PCHAR ?
  128.     .pNextOutByte PCHAR ?
  129.     .bufAnsiValue CHARS 16
  130.     .bufAnsiKirkAlias CHARS 32
  131.     .pAllocatedOutBuffer PCHAR ?
  132.     .timeNow rb SYSTIME.size
  133.     .nLenName COUNT ?
  134.     .size = $
  135. end virtual
  136. ; --------------------------------------------------------------------------
  137. align PROC_ALIGN
  138. TApp_PlaqueProcessor:
  139.     mcBeginLocals loc112.size
  140.  
  141.     mov     ecx, 727
  142.     call    TGame_Prompt
  143.  
  144.     call    TCmdBuf_Scan
  145.     cmp     [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL
  146.     je      .done
  147.  
  148.     mcLoadLocalRef edi, loc112.bufAnsiKirkAlias
  149.     call    TString_AnsiCopy
  150.  
  151.     mov     esi, glb_Plaque
  152.     invoke  HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, 8192 ; <-- 2 pages is enough!
  153.     mcStoreLocal loc112.pAllocatedOutBuffer, eax
  154.     mcStoreLocal loc112.pNextOutByte, eax
  155.     mcStoreLocal loc112.pNextInByte, esi
  156.  
  157. .load_input_byte:
  158.     mcLoadLocal esi, loc112.pNextInByte
  159.     inc     [esp + loc112.pNextInByte]
  160.     mov     al, [esi]
  161.  
  162.     mcOnRegEqu al, PLAQUE_STRING, .dump_string
  163.     mcOnRegEqu al, PLAQUE_INSERT_DATE, .dump_date
  164.     mcOnRegEqu al, PLAQUE_INSERT_KLRATE, .dump_klrate
  165.     mcOnRegEqu al, PLAQUE_INSERT_LEVEL, .dump_level
  166.     mcOnRegEqu al, PLAQUE_INSERT_NAME, .dump_captain_name
  167.     mcOnRegEqu al, PLAQUE_INSERT_SCORE, .dump_score
  168.     mcOnRegEqu al, PLAQUE_END_OF_LINE, .dump_CR_LF
  169.     mcOnRegEqu al, PLAQUE_END_OF_ALL, .save
  170.     ;
  171.     ; This byte is a count of charactes defined by next byte
  172.     ;
  173.     movzx   ecx, al
  174.     mov     al, [esi + 1]
  175.     inc     [esp + loc112.pNextInByte]
  176.     mcLoadLocal edi, loc112.pNextOutByte
  177.     add     [esp + loc112.pNextOutByte], ecx
  178.     rep     stosb
  179.     jmp     .load_input_byte
  180.  
  181. .dump_string:
  182.     ;
  183.     ; The next byte is a length of data to be copied
  184.     ;
  185.     movzx   ecx, byte [esi + 1]
  186.     inc     [esp + loc112.pNextInByte]
  187.     ;
  188.     ; Copy data
  189.     ;
  190.     mcLoadLocal edi, loc112.pNextOutByte
  191.     mcLoadLocal esi, loc112.pNextInByte
  192.     add     [esp + loc112.pNextInByte], ecx
  193.     add     [esp + loc112.pNextOutByte], ecx
  194.     rep     movsb
  195.     jmp     .load_input_byte
  196.  
  197. .dump_date:
  198.     mcLoadLocalRef edi, loc112.timeNow
  199.     invoke  GetLocalTime, edi
  200.  
  201.     movzx   ecx, word [edi + SYSTIME.wMonth]
  202.     add     ecx, 714
  203.     call    TMsgTable_GetItem
  204.  
  205.     call    TCmdBuf_AnsiStrLen
  206.     mcLoadLocal edi, loc112.pNextOutByte
  207.     add     [esp + loc112.pNextOutByte], ecx
  208.     rep     movsb
  209.  
  210.     mov     al, ' '
  211.     stosb
  212.     inc     [esp + loc112.pNextOutByte]
  213.  
  214.     mcLoadLocalRef esi, loc112.timeNow
  215.     movzx   eax, word [esi + SYSTIME.wDay]
  216.     mcLoadLocalRef edi, loc112.bufAnsiValue
  217.     call    TFormat_Int32
  218.  
  219.     mov     esi, edi
  220.     mcLoadLocal edi, loc112.pNextOutByte
  221.     add     [esp + loc112.pNextOutByte], ecx
  222.     rep     movsb
  223.  
  224.     mov     al, ','
  225.     stosb
  226.     mov     al, ' '
  227.     stosb
  228.     add     [esp + loc112.pNextOutByte], 2
  229.  
  230.     mcLoadLocalRef esi, loc112.timeNow
  231.     movzx   eax, word [esi + SYSTIME.wYear]
  232.     mcLoadLocalRef edi, loc112.bufAnsiValue
  233.     call    TFormat_Int32
  234.  
  235.     mov     esi, edi
  236.     mcLoadLocal edi, loc112.pNextOutByte
  237.     add     [esp + loc112.pNextOutByte], ecx
  238.     rep     movsb
  239.     jmp     .load_input_byte
  240.  
  241. .dump_klrate:
  242.     mov     cl, 2
  243.     mcLoadLocalRef edi, loc112.bufAnsiValue
  244.     fld     [glb_dbl_KlingonsPerDate]
  245.     call    TFormat_Double
  246.  
  247.     mov     esi, edi
  248.     mcLoadLocal edi, loc112.pNextOutByte
  249.     add     [esp + loc112.pNextOutByte], ecx
  250.     rep     movsb
  251.     jmp     .load_input_byte
  252.  
  253. .dump_level:
  254.     mcLoadGameDataPtr esi
  255.     movzx   ecx, [esi + TREKDATA.SKILL]
  256.     add     cl, 12
  257.     call    TMsgTable_GetItem
  258.  
  259.     mcLoadLocal edi, loc112.pNextOutByte
  260.     mcZeroBits eax
  261.     mcZeroBits ecx
  262.  
  263. .next_level_char:
  264.     lodsb
  265.     mcOnRegZero eax, .level_copied
  266.  
  267.     stosb
  268.     inc     ecx
  269.     jmp     .next_level_char
  270.  
  271. .level_copied:
  272.     add     [esp + loc112.pNextOutByte], ecx
  273.     jmp     .load_input_byte
  274.  
  275. .dump_captain_name:
  276.     ;
  277.     ; NSKIP = 65 - LEN (NAME)/2
  278.     ;
  279.     mcLoadLocalRef esi, loc112.bufAnsiKirkAlias
  280.     call    TCmdBuf_AnsiStrLen
  281.     mcStoreLocal loc112.nLenName, ecx
  282.     mcLoad8bitsToReg32 eax, 65
  283.     shr     ecx, 1
  284.     sub     eax, ecx
  285.  
  286.     mov     cl, ' '
  287.     xchg    eax, ecx
  288.     mcLoadLocal edi, loc112.pNextOutByte
  289.     add     [esp + loc112.pNextOutByte], ecx
  290.     rep     stosb
  291.  
  292.     mcLoadLocalRef esi, loc112.bufAnsiKirkAlias
  293.     mcLoadLocal ecx, loc112.nLenName
  294.     add     [esp + loc112.pNextOutByte], ecx
  295.     rep     movsb
  296.     jmp     .dump_CR_LF
  297.  
  298. .dump_score:
  299.     mcLoadLocalRef edi, loc112.bufAnsiValue
  300.     mov     eax, [glb_Score]
  301.     call    TFormat_Int32
  302.  
  303.     mov     esi, edi
  304.     mcLoadLocal edi, loc112.pNextOutByte
  305.     add     [esp + loc112.pNextOutByte], ecx
  306.     rep     movsb
  307.     jmp     .load_input_byte
  308.  
  309. .dump_CR_LF:
  310.     mcLoadLocal edi, loc112.pNextOutByte
  311.     mov     al, 0Dh
  312.     stosb
  313.     mov     al, 0Ah
  314.     stosb
  315.     mcStoreLocal loc112.pNextOutByte, edi
  316.     jmp     .load_input_byte
  317.  
  318. .save:
  319.     invoke  CreateFileAnsi, str_PlaqueFile, GENERIC_WRITE, 0, 0,\
  320.             CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0
  321.  
  322.     mov     ebx, eax
  323.     mcOnRegEqu ebx, -1, .done
  324.  
  325.     mcLoadLocal esi, loc112.pAllocatedOutBuffer
  326.     mcLoadLocalRef edi, loc112.pNextInByte
  327.     mcLoadLocal ecx, loc112.pNextOutByte
  328.     sub     ecx, esi
  329.     invoke  WriteFile, ebx, esi, ecx, edi, 0
  330.     invoke  CloseHandle, ebx
  331.  
  332.     call    TConsole_SetGameMsgAttr
  333.     mov     cl, 3
  334.     call    TConsole_Skip
  335.  
  336.     mov     ecx, 728
  337.     call    TConsole_Prout
  338.     inc     ecx
  339.     call    TConsole_Prout
  340.     inc     ecx
  341.     call    TConsole_Prout
  342.  
  343.     mov     cl, 3
  344.     call    TConsole_Skip
  345.  
  346. .done:
  347.     mcEndLocals loc112.size
  348.     ret
  349.  
  350. ; --------------------------------------------------------------------------
  351. ; Output:
  352. ;   CF = TRUE if directory has been set
  353. ; --------------------------------------------------------------------------
  354. align PROC_ALIGN
  355. TApp_SetLocalDir:
  356.     mcBeginLocals 260*2
  357.  
  358.     mov     esi, esp
  359.     invoke  GetModuleFileName, 0, esi, 260
  360.  
  361.     mcZeroBits eax
  362.     mcZeroBits edi
  363.  
  364. .next_char:
  365.     lodsw
  366.     mcOnRegZero eax, .set_dir
  367.  
  368.     cmp     al, '\'
  369.     jne     .next_char
  370.  
  371.     mov     edi, esi
  372.     jmp     .next_char
  373.  
  374. .set_dir:
  375.     mcOnRegZero edi, .failed
  376.  
  377.     stosw
  378.     invoke  SetCurrentDir, esp
  379.     mcOnRegZero eax, .failed
  380.  
  381. .done:
  382.     mcEndLocals 260*2
  383.     stc
  384.     ret
  385.  
  386. .failed:
  387.     invoke  MessageBox, 0, str_SetDirFailed, str_MainWndTitle, 10h
  388.     mcEndLocals 260*2
  389.     ret
  390.  
  391. ; --------------------------------------------------------------------------
  392. ; Input:
  393. ;   EAX = HDC
  394. ; --------------------------------------------------------------------------
  395. virtual at 0
  396. loc1:
  397.     .hDC HDC ?
  398.     .hMemDC HDC ?
  399.     .hSurfaceBmp HBITMAP ?
  400.     .hDefaultBmp HBITMAP ?
  401.     .hDefaultFont HFONT ?
  402.     .rect_Client rb RECT.size
  403.     .bkMode INT32 ?
  404.     .size = $
  405. end virtual
  406. ; --------------------------------------------------------------------------
  407. align PROC_ALIGN
  408. TApp_WmPaint:
  409.     mcBeginLocals loc1.size
  410.     mcStoreLocal loc1.hDC, eax
  411.  
  412.     mcLoadLocalRef edi, loc1.rect_Client
  413.     invoke  GetClientRect, [glb_MainWnd], edi
  414.  
  415.     mcLoadLocal edx, loc1.hDC
  416.     invoke  CreateCompatibleDC, edx
  417.     mcStoreLocal loc1.hMemDC, eax
  418.  
  419.     mov     ebx, esp
  420.     invoke  CreateCompatibleBitmap, [ebx + loc1.hDC], \
  421.             dword [ebx + loc1.rect_Client + RECT.rc_Right], \
  422.             dword [ebx + loc1.rect_Client + RECT.rc_Bottom]
  423.  
  424.     mcStoreLocal loc1.hSurfaceBmp, eax
  425.  
  426.     invoke  SelectObject, [ebx + loc1.hMemDC], eax
  427.     mcStoreLocal loc1.hDefaultBmp, eax
  428.  
  429.     invoke  GetStockObject, BLACK_BRUSH
  430.     mcLoadLocalRef esi, loc1.rect_Client
  431.     invoke  FillRect, [ebx + loc1.hMemDC], esi, eax
  432.  
  433.     invoke  SetBkMode, [ebx + loc1.hMemDC], TRANSPARENT
  434.     mcStoreLocal loc1.bkMode, eax
  435.  
  436.     invoke  SelectObject, [ebx + loc1.hMemDC], [glb_Font]
  437.     mcStoreLocal loc1.hDefaultFont, eax
  438.  
  439.     mcLoadLocal edx, loc1.hMemDC
  440.     call    TConsole_DrawAllLines
  441.  
  442.     mov     ebx, esp
  443.     invoke  SetBkMode, [ebx + loc1.hMemDC], [ebx + loc1.bkMode]
  444.     invoke  SelectObject, [ebx + loc1.hMemDC], [ebx + loc1.hDefaultFont]
  445.  
  446.     mcZeroBits ecx
  447.  
  448.     invoke  BitBlt, [ebx + loc1.hDC], ecx, ecx, \
  449.             dword [ebx + loc1.rect_Client + RECT.rc_Right], \
  450.             dword [ebx + loc1.rect_Client + RECT.rc_Bottom], \
  451.             [ebx + loc1.hMemDC], ecx, ecx, SRCCOPY
  452.  
  453.     invoke  SelectObject, [ebx + loc1.hMemDC], [ebx + loc1.hDefaultBmp]
  454.     invoke  DeleteObject, [ebx + loc1.hSurfaceBmp]
  455.     invoke  DeleteDC, [ebx + loc1.hMemDC]
  456.  
  457.     mcEndLocals loc1.size
  458.     ret
  459.  
  460. ; --------------------------------------------------------------------------
  461. ; Input:
  462. ;   EAX = WCHAR received from user
  463. ; --------------------------------------------------------------------------
  464. align PROC_ALIGN
  465. TApp_WmChar:
  466.     and     eax, 0FFh
  467.  
  468.     cmp     al, 20h
  469.     jb      .control_char
  470.  
  471.     cmp     al, 'a'
  472.     jb      .draw_symbol
  473.     cmp     al, 'z'
  474.     ja      .draw_symbol
  475.  
  476.     sub     al, 20h
  477.  
  478. .draw_symbol:
  479.     mov     cl, ATTR_PROMPT_VALUE
  480.     call    TConsole_SetAttr
  481.     call    TCmdBuf_PutChar
  482.     call    TConsole_PutChar
  483.     call    TConsole_RefreshCaretLine
  484.     ret
  485.  
  486. .backspace:
  487.     call    TCmdBuf_IsEmpty
  488.     jnc     .del_last_char
  489.     ret
  490.  
  491. .del_last_char:
  492.     call    TCmdBuf_Backspace
  493.     call    TConsole_Backspace
  494.     ret
  495.  
  496. .command_complete:
  497.     call    TConsole_ScrollUp
  498.     call    TCmdBuf_Parse
  499.     lock    inc [glb_GameThreadBusy]
  500.     ret
  501.  
  502. .key_escape:
  503.     ret
  504.  
  505. .control_char:
  506.     cmp     al, CHAR_BACKSPACE
  507.     je      .backspace
  508.     cmp     al, CHAR_ENTER
  509.     je      .command_complete
  510.     cmp     al, CHAR_ESC
  511.     je      .key_escape
  512.     ret
  513.  
  514. ; --------------------------------------------------------------------------
  515. align PROC_ALIGN
  516. TApp_QueryTextSize:
  517.     invoke  GetDC, 0
  518.     mov     esi, eax
  519.  
  520.     invoke  SelectObject, eax, [glb_Font]
  521.     push    eax
  522.  
  523.     invoke  GetTextExtentPoint32, esi, str_CharSizeText, 2, glb_CharSize
  524.  
  525.     pop     edx
  526.     invoke  SelectObject, esi, edx
  527.  
  528.     invoke  ReleaseDC, 0, esi
  529.  
  530.     shr     dword [glb_CharSize + SIZE.size_Width], 1
  531.     ret
  532.  
  533. ; --------------------------------------------------------------------------
  534. ; Input:
  535. ;   ESI = address of rectangle to redraw
  536. ; --------------------------------------------------------------------------
  537. align PROC_ALIGN
  538. TApp_RefreshMainWndRect:
  539.     mov     ebx, [glb_MainWnd]
  540.     invoke  InvalidateRect, ebx, esi, 1
  541.     invoke  UpdateWindow, ebx
  542.     ret
  543.  
  544. ; --------------------------------------------------------------------------
  545. align PROC_ALIGN
  546. TApp_AdjustWndRect:
  547.     mcBeginLocals RECT.size
  548.  
  549.     mov     esi, esp
  550.  
  551.     mcZeroBits eax
  552.     mov     [esi + RECT.rc_Left], eax
  553.     mov     [esi + RECT.rc_Top], eax
  554.  
  555.     mov     ecx, dword [glb_CharSize + SIZE.size_Width]
  556.     imul    ecx, CONSOLE_COLS
  557.     add     ecx, 2
  558.     mov     [esi + RECT.rc_Right], ecx
  559.  
  560.     mov     ecx, dword [glb_CharSize + SIZE.size_Height]
  561.     imul    ecx, CONSOLE_ROWS
  562.     add     ecx, 2
  563.     mov     [esi + RECT.rc_Bottom], ecx
  564.  
  565.     invoke  OffsetRect, esi, 200, 32
  566.     invoke  AdjustWindowRect, esi, WS_NOSIZEWND, 0
  567.  
  568.     mcRectWidth ecx, esi
  569.     mcRectHeight edx, esi
  570.  
  571.     invoke  MoveWindow, [glb_MainWnd], \
  572.             [esi + RECT.rc_Left], \
  573.             [esi + RECT.rc_Top], \
  574.             ecx, edx, 0
  575.  
  576.     mcEndLocals RECT.size
  577.     ret
  578.  
  579. ; --------------------------------------------------------------------------
  580. align PROC_ALIGN
  581. TApp_WmCreate:
  582.     call    TCommon_Allocate
  583.     call    TMsgTable_Load
  584.     call    TCmdBuf_Create
  585.     call    TApp_QueryTextSize
  586.     call    TApp_AdjustWndRect
  587.  
  588.     invoke  PostMessage, [glb_MainWnd], WM_CUSTOM_DO_PRELIM, 0, 0
  589.     ret
  590.  
  591. ; --------------------------------------------------------------------------
  592. ; Input:
  593. ;   hWnd, uiMsg, WParam, LParam
  594. ; --------------------------------------------------------------------------
  595. align PROC_ALIGN
  596. TApp_WndProc:
  597.     mcProlog
  598.  
  599.     mov     eax, uiMsg
  600.     mcOnRegEqu eax, WM_CREATE, .OnCreate
  601.     mcOnRegEqu eax, WM_DESTROY, .OnDestroy
  602.     mcOnRegEqu eax, WM_ERASEBKGND, .OnEraseBkGnd
  603.     mcOnRegEqu eax, WM_PAINT, .OnPaint
  604.     mcOnRegEqu eax, WM_CHAR, .OnChar
  605.     mcOnRegEqu eax, WM_CUSTOM_DO_PRELIM, .StartGameThread
  606.  
  607.     invoke  DefWindowProc, hWnd, uiMsg, WParam, LParam
  608.  
  609. .exit:
  610.     mcEpilog
  611.     ret     10h
  612.  
  613. .StartGameThread:
  614.     invoke  CreateThread, 0, 0, TGame_Thread, 0, 0, 0
  615.  
  616. .ret_zero:
  617.     mcZeroBits eax
  618.     jmp     .exit
  619.  
  620. .OnCreate:
  621.     mov     eax, hWnd
  622.     mov     [glb_MainWnd], eax
  623.     call    TApp_WmCreate
  624.     jmp     .ret_zero
  625.  
  626. .OnDestroy:
  627.     invoke  PostQuitMessage, 0
  628.     jmp     .ret_zero
  629.  
  630. .OnEraseBkGnd:
  631.     mcLoad1 eax
  632.     jmp     .exit
  633.  
  634. .OnPaint:
  635.     mcBeginLocals PAINTSTRUCT.size
  636.     invoke  BeginPaint, [glb_MainWnd], esp
  637.     call    TApp_WmPaint
  638.     invoke  EndPaint, [glb_MainWnd], esp
  639.     mcEndLocals PAINTSTRUCT.size
  640.     jmp     .ret_zero
  641.  
  642. .OnChar:
  643.     mcZeroBits eax
  644.     lock add [glb_GameThreadBusy], eax
  645.     jnz     .ret_zero
  646.  
  647.     mov     eax, WParam
  648.     call    TApp_WmChar
  649.     jmp     .ret_zero
  650.  
  651. ; --------------------------------------------------------------------------
  652. align PROC_ALIGN
  653. TApp_CreateFont:
  654.     mcBeginLocals LOGFONT.size
  655.  
  656.     mov     edi, esp
  657.     mov     ecx, LOGFONT.size
  658.     mcZeroBits eax
  659.     rep     stosb
  660.  
  661.     mov     edx, FW_NORMAL
  662.     mov     [esp + LOGFONT.lf_Weight], edx
  663.  
  664.     mov     dl, DEFAULT_CHARSET
  665.     mov     [esp + LOGFONT.lf_CharSet], dl
  666.  
  667.     lea     edi, [esp + LOGFONT.lf_FaceName]
  668.     mov     esi, str_FontFace
  669.     call    TString_Copy
  670.  
  671.     invoke  GetDC, 0
  672.     mov     esi, eax
  673.     invoke  GetDeviceCaps, esi, LOGPIXELSY
  674.     invoke  MulDiv, 12, eax, 72
  675.  
  676.     neg     eax
  677.     mov     [esp + LOGFONT.lf_Height], eax
  678.     invoke  ReleaseDC, 0, esi
  679.  
  680.     invoke  CreateFontIndirect, esp
  681.     mov     [glb_Font], eax
  682.  
  683.     mcEndLocals LOGFONT.size
  684.     ret
  685.  
  686. ; --------------------------------------------------------------------------
  687. align PROC_ALIGN
  688. TApp_RegisterWnd:
  689.     mcBeginLocals WNDCLASS.size
  690.  
  691.     mov     ebx, esp
  692.  
  693.     mcZeroBits ecx
  694.     mcStoreMember WNDCLASS.wc_lpszMenuName, ecx
  695.     mcStoreMember WNDCLASS.wc_cbClsExtra, ecx
  696.     mcStoreMember WNDCLASS.wc_cbWndExtra, ecx
  697.     mcStoreMember WNDCLASS.wc_hbrBackground, ecx
  698.  
  699.     invoke  LoadCursor, 0, IDC_ARROW
  700.     mcStoreMember WNDCLASS.wc_hCursor, eax
  701.  
  702.     invoke  LoadIcon, 0, IDI_EXCLAMATION
  703.     mcStoreMember WNDCLASS.wc_hIcon, eax
  704.  
  705.     mov     eax, [glb_Instance]
  706.     mcStoreMember WNDCLASS.wc_hInstance, eax
  707.  
  708.     mov     eax, TApp_WndProc
  709.     mcStoreMember WNDCLASS.wc_lpfnWndProc, eax
  710.  
  711.     mov     eax, str_MainWndClass
  712.     mcStoreMember WNDCLASS.wc_lpszClassName, eax
  713.  
  714.     invoke  RegisterClass, ebx
  715.  
  716.     mcEndLocals WNDCLASS.size
  717.     ret
  718.  
  719. ; --------------------------------------------------------------------------
  720. align PROC_ALIGN
  721. TApp_CreateMainWnd:
  722.     invoke  CreateWindowEx, WS_EX_APPWINDOW, str_MainWndClass, \
  723.             str_MainWndTitle, WS_NOSIZEWND, \
  724.             80, 40, 500, 500, \
  725.             0, 0, [glb_Instance], 0
  726.     ret
  727.  
  728. ; --------------------------------------------------------------------------
  729. align PROC_ALIGN
  730. TApp_Init:
  731.     invoke  GetModuleHandle, 0
  732.     mov     [glb_Instance], eax
  733.  
  734.     invoke  HeapCreate, HEAP_NO_SERIALIZE, 0x20000, 0
  735.     mov     [glb_Allocator], eax
  736.  
  737.     call    TRandom_Create
  738.     call    TApp_RegisterWnd
  739.     call    TApp_CreateFont
  740.     call    TApp_CreateMainWnd
  741.     call    TConsole_Create
  742.     call    TLog_Create
  743.     ret
  744.  
  745. ; --------------------------------------------------------------------------
  746. align PROC_ALIGN
  747. TApp_Run:
  748.     mcBeginLocals MSG.size
  749.  
  750.     mov     esi, [glb_MainWnd]
  751.     invoke  ShowWindow, esi, SW_SHOWNORMAL
  752.     invoke  UpdateWindow, esi
  753.  
  754. @@:
  755.     mcZeroBits eax
  756.     mov     edi, esp
  757.     invoke  GetMessage, edi, eax, eax, eax
  758.     mcOnRegZero eax, .done
  759.  
  760.     invoke  TranslateMessage, edi
  761.     invoke  DispatchMessage, edi
  762.     jmp     @r
  763.  
  764. .done:
  765.     call    TLog_Disable
  766.  
  767.     mcEndLocals MSG.size
  768.     ret
  769.  
  770. ; --- EOF ---
  771.