Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;const int
  2. MENUET_BORDER_SIZE = 4;
  3. ;const int
  4. MENUET_HEADER_SIZE = 20;
  5.  
  6. ;const int
  7. MENUET_THREAD_DATA_USER     = 0; // Thread data begin from the user dword
  8. ;const int
  9. MENUET_THREAD_DATA_ST_BEGIN = 1; // Stack beginning follows after the user dword
  10. ;const int
  11. MENUET_THREAD_DATA_NEXT     = 2;
  12. ;const int
  13. MENUET_THREAD_DATA_PID      = 3;
  14. ;const int
  15. MENUET_THREAD_DATA_FLAG     = 4;
  16. ;const int
  17. MENUET_THREAD_DATA_X        = 5;
  18. ;const int
  19. MENUET_THREAD_DATA_Y        = 6;
  20. ;const int
  21. MENUET_THREAD_DATA_C_WINDOW = 7;
  22. ;const int
  23. MENUET_THREAD_DATA_C_HEADER = 8;
  24. ;const int
  25. MENUET_THREAD_DATA_C_BORDER = 9;
  26. ;const int
  27. MENUET_THREAD_DATA_C_TITLE  = 10;
  28. ;const int
  29. MENUET_THREAD_DATA_TITLE    = 11;
  30. ;const int
  31. MENUET_THREAD_DATA_PICTURE  = 12;
  32. ;const int
  33. MENUET_THREAD_DATA_SZ_PICT  = 13;
  34. ;const int
  35. MENUET_THREAD_DATA_LAST_SX  = 14;
  36. ;const int
  37. MENUET_THREAD_DATA_LAST_SY  = 15;
  38. ;const int
  39. MENUET_THREAD_DATA_LEN      = 16;
  40.  
  41. ;const int
  42. MENUET_MUTEX_MAX_TIME_WAIT  = 20;
  43.  
  44. ;const int
  45. MENUET_FILE_BLOCK_SIZE      = 512;
  46.  
  47. ;const int
  48. MENUET_FILE_MEMORY_OS_NEED  = 4096;
  49.  
  50. ;/***
  51.  
  52. macro segment name
  53. {
  54.   segment name
  55.   if name eq _init_ | name eq _INIT_
  56. Menuet_SegmentInit:
  57.   else if name eq _exit_ | name eq _EXIT_
  58. Menuet_SegmentExit:
  59.   end if
  60. }
  61.  
  62. macro endseg  name
  63. {
  64.   if name eq _init_ | name eq _INIT_
  65. Menuet_SegmentInitEnd:
  66.   else if name eq _exit_ | name eq _EXIT_
  67. Menuet_SegmentExitEnd:
  68.   end if
  69.   endseg  name
  70. }
  71.  
  72. macro Menuet_Put_MovEaxVal_Ret  address,val
  73. {
  74.   mov  byte [address],0xB8
  75.   mov  dword [address+4],0xC089C300
  76.   mov  dword [address+1],val
  77. }
  78.  
  79. define @Menuet@Main$qv
  80. nextdef MenuetEntryPoint
  81.   and  esp,not 3
  82.   sub  esp,1024
  83.   mov  eax,9
  84.   mov  ebx,esp
  85.   mov  ecx,-1
  86.   int  0x40
  87.   mov  ebx,[esp+26]
  88.   mov  edx,[esp+30]
  89.   lea  eax,[ebx-0x20]
  90.   add  esp,1024
  91.   cmp  esp,eax
  92.   cmova esp,eax
  93.   and  esp,not 3
  94. if defined @Menuet@CommandLine
  95.         mov     byte [@Menuet@CommandLine+256], 0
  96. end if
  97.   xor  eax,eax
  98.   cld
  99.   mov  edi,@Menuet@_ThreadTable
  100.   mov  ecx,256
  101.   rep stos dword [edi]
  102.   mov  esi,@Menuet@GetPid$qv
  103.   mov  edi,@Menuet@_ThreadSavedBegProc
  104.   movs dword [edi],[esi]
  105.   movs dword [edi],[esi]
  106.   mov  esi,@Menuet@GetThreadData$qv
  107.   movs dword [edi],[esi]
  108.   movs dword [edi],[esi]
  109.   Menuet_Put_MovEaxVal_Ret  @Menuet@GetPid$qv,edx
  110. if defined MenuetHeapInit
  111.   mov  ecx,esp
  112.   push ebx
  113.   push ecx
  114.   push U_END
  115.   call MenuetHeapInit   ; Initialize a dynamic heap and create new memory in its begin.
  116.   pop  ecx              ; Parameters: begin of a new heap, end of data to create in
  117.   mov  [esp+4],eax      ; the begin of a heap. Return address of the created data.
  118.   mov  dword [esp],0
  119. else
  120.   xor  eax,eax
  121.   push eax
  122.   push eax
  123. end if
  124.   call @Menuet@ThreadMain$qpvt1
  125. nextdef Menuet_ThreadFinish
  126.   add  esp,8
  127. if defined MenuetHeapFreeAndThreadFinish
  128.   test eax,eax
  129.   jz   Menuet_ThreadFinish_end
  130.   push dword @Menuet@_ExitProcessNow
  131.   push eax
  132.   call MenuetHeapFreeAndThreadFinish   ; Free the given memory and finish the thread,
  133. end if                                 ; should exit process if second argument points to not zero.
  134. Menuet_ThreadFinish_end:
  135.   or   eax,-1
  136.   int  0x40
  137. enddef
  138.  
  139. define @Menuet@ThreadMain$qpvt1
  140.   xchg ebx,[esp+4]
  141.   xchg ebp,[esp+8]
  142.   push esi
  143.   push edi
  144.   sub  esp,MENUET_THREAD_DATA_LEN*4
  145.   mov  [esp],ebx
  146.   mov  [esp+4],ebp
  147.   mov  eax,40
  148.   mov  ebx,0x27
  149.   int  0x40
  150.   mov  ebx,esp
  151.   cmp  byte [@Menuet@_ThreadSavedBegProc],0x90
  152.   jz   Menuet_main_else_first_check
  153.   Menuet_Put_MovEaxVal_Ret  @Menuet@GetThreadData$qv,esp
  154. if defined Menuet_SegmentInit & defined Menuet_SegmentInitEnd
  155.   push Menuet_SegmentInitEnd
  156.   push Menuet_SegmentInit
  157.   jmp  Menuet_main_after_first_check
  158. end if
  159. Menuet_main_else_first_check:
  160.   xor  eax,eax
  161.   push eax
  162.   push eax
  163. Menuet_main_after_first_check:
  164.   push ebx
  165.   call @@Menuet@_CallStart$qppvpvt2
  166.   add  esp,12
  167.   test al,al
  168.   jnz  Menuet_main_test_close_first
  169.   jmp  Menuet_main_end
  170. Menuet_main_close_first:
  171.   btr  dword [esp+MENUET_THREAD_DATA_FLAG*4],31
  172.   push esp
  173.   call @@MenuetOnClose$qppv
  174.   pop  ecx
  175.   test al,al
  176.   jnz  Menuet_main_end
  177. Menuet_main_test_close_first:
  178.   cmp  dword [esp+MENUET_THREAD_DATA_FLAG*4],0
  179.   jl   Menuet_main_close_first
  180.   push esp
  181.   push dword 1
  182.   call @Menuet@Redraw$qippv
  183.   add  esp,8
  184. Menuet_main_paint_msg:
  185.   or   dword [esp+MENUET_THREAD_DATA_FLAG*4],3
  186.   sub  esp,1024
  187.   mov  eax,9
  188.   mov  ebx,esp
  189.   mov  ecx,-1
  190.   int  0x40
  191.   mov  eax,[esp+34]
  192.   mov  ebx,[esp+38]
  193.   mov  ecx,[esp+42]
  194.   mov  edx,[esp+46]
  195.   add  esp,1024
  196.   cmp  ecx,[esp+MENUET_THREAD_DATA_LAST_SX*4]
  197.   jnz  Menuet_main_size
  198.   cmp  edx,[esp+MENUET_THREAD_DATA_LAST_SY*4]
  199.   jz   Menuet_main_paint
  200. Menuet_main_size:
  201.   mov  [esp+MENUET_THREAD_DATA_LAST_SX*4],ecx
  202.   mov  [esp+MENUET_THREAD_DATA_LAST_SY*4],edx
  203.   push edx
  204.   push ecx
  205.   push ebx
  206.   push eax
  207.   lea  ecx,[esp+16]
  208.   mov  edx,esp
  209.   push ecx
  210.   push edx
  211.   call @@MenuetOnSize$qpippv
  212.   add  esp,24
  213.   test dword [esp+MENUET_THREAD_DATA_FLAG*4],3
  214.   jz   Menuet_main_cycle
  215. Menuet_main_paint:
  216.   cmp  dword [esp+MENUET_THREAD_DATA_FLAG*4],0
  217.   jl   Menuet_main_close
  218.   push esp
  219.   push dword 0
  220.   call @Menuet@Redraw$qippv
  221.   add  esp,8
  222. Menuet_main_cycle:
  223.   mov  eax,11
  224. Menuet_main_message:
  225.   cmp  dword [esp+MENUET_THREAD_DATA_FLAG*4],0
  226.   jl   Menuet_main_close
  227.   int  0x40
  228.   test eax,eax
  229.   jnz  Menuet_main_on_message
  230.   cmp  dword [esp+MENUET_THREAD_DATA_FLAG*4],0
  231.   jne  Menuet_main_paint
  232.   push esp
  233.   call @@MenuetOnIdle$qppv
  234.   pop  ecx
  235.   test eax,eax
  236.   jz   Menuet_main_cycle
  237.   jl   Menuet_main_wait_message
  238.   mov  ebx,eax
  239.   mov  eax,23
  240.   jmp  Menuet_main_message
  241. Menuet_main_wait_message:
  242.   mov  eax,10
  243.   jmp  Menuet_main_message
  244. Menuet_main_key_press:
  245.   push esp
  246.   call @@MenuetOnKeyPress$qppv
  247.   pop  ecx
  248.   jmp  Menuet_main_cycle
  249. Menuet_main_mouse:
  250.   push esp
  251.   call @@MenuetOnMouse$qppv
  252.   pop  ecx
  253.   jmp  Menuet_main_cycle
  254. Menuet_main_on_message:
  255.   dec  eax
  256.   jz   Menuet_main_paint_msg
  257.   dec  eax
  258.   jz   Menuet_main_key_press
  259.   cmp  eax,4
  260.   jz   Menuet_main_mouse
  261.   dec  eax
  262.   jnz  Menuet_main_cycle
  263. Menuet_main_button:
  264.   mov  eax,17
  265.   int  0x40
  266.   test al,al
  267.   jnz  Menuet_main_cycle
  268. Menuet_main_close:
  269.   btr  dword [esp+MENUET_THREAD_DATA_FLAG*4],31
  270.   push esp
  271.   call @@MenuetOnClose$qppv
  272.   pop  ecx
  273.   test al,al
  274.   jz   Menuet_main_button
  275. Menuet_main_end:
  276.   mov  ebx,esp
  277.   lock dec dword [@Menuet@_ThreadNumber]
  278. if defined Menuet_SegmentExit & defined Menuet_SegmentExitEnd
  279.   jnz  Menuet_main_else_last_check
  280.   push Menuet_SegmentExitEnd
  281.   push Menuet_SegmentExit
  282.   jmp  Menuet_main_after_last_check
  283. end if
  284. Menuet_main_else_last_check:
  285.   xor  eax,eax
  286.   push eax
  287.   push eax
  288. Menuet_main_after_last_check:
  289.   push ebx
  290.   call @@Menuet@_RemoveThreadData$qppvpvt2
  291.   add  esp,12
  292.   lock inc dword [@Menuet@_ThreadScanCount+4]
  293.   mov  ebx,1
  294.   jmp  Menuet_main_end_wait
  295. Menuet_main_end_wait_loop:
  296.   mov  eax,5
  297.   int  0x40
  298.   shl  ebx,1
  299.   cmp  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  300.   jna  Menuet_main_end_wait
  301.   mov  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  302. Menuet_main_end_wait:
  303.   cmp  dword [@Menuet@_ExitProcessNow],0
  304.   jnz  @Menuet@ExitProcess$qv
  305.   cmp  dword [@Menuet@_ThreadScanCount],0
  306.   jnz  Menuet_main_end_wait_loop
  307.   lock dec dword [@Menuet@_ThreadScanCount+4]
  308.   mov  ebp,[esp+4]
  309.   mov  ebx,[esp]
  310.   add  esp,MENUET_THREAD_DATA_LEN*4
  311.   mov  eax,ebp
  312.   pop  edi
  313.   pop  esi
  314.   xchg ebp,[esp+8]
  315.   xchg ebx,[esp+4]
  316.   ret
  317. enddef
  318.  
  319. macro call func
  320. {
  321.   if func eq __chkstk
  322.         sub  esp,eax
  323.   else
  324.         call func
  325.   end if
  326. }
  327.  
  328. define @Menuet@Redraw$qippv
  329.   push ebp
  330.   mov  ebp,[esp+12]
  331.   mov  edx,[ebp+MENUET_THREAD_DATA_FLAG*4]
  332.   cmp  dword [esp+8],0
  333.   jl   Menuet_redraw_only_inv
  334.   jz   Menuet_redraw_no_frame
  335.   or   dl,2
  336. Menuet_redraw_no_frame:
  337.   bt   edx,30
  338.   jnc  Menuet_redraw_begin
  339.   or   dl,1
  340.   mov  [ebp+MENUET_THREAD_DATA_FLAG*4],edx
  341.   jmp  Menuet_redraw_end
  342. Menuet_redraw_only_inv:
  343.   test dl,3
  344.   jnz  Menuet_redraw_no_frame
  345. Menuet_redraw_end:
  346.   pop  ebp
  347.   ret
  348. Menuet_redraw_begin:
  349.   push ebx
  350.   push esi
  351.   push edi
  352.   and  dword [ebp+MENUET_THREAD_DATA_FLAG*4],0xFFFFFFFC
  353.   test dl,2
  354.   jz   Menuet_redraw_picture
  355.   mov  eax,12
  356.   mov  ebx,1
  357.   int  0x40
  358.   xor  eax,eax
  359.   mov  ebx,[ebp+MENUET_THREAD_DATA_X*4]
  360.   mov  ecx,[ebp+MENUET_THREAD_DATA_Y*4]
  361.   mov  edx,[ebp+MENUET_THREAD_DATA_C_WINDOW*4]
  362.   mov  esi,[ebp+MENUET_THREAD_DATA_C_HEADER*4]
  363.   mov  edi,[ebp+MENUET_THREAD_DATA_C_BORDER*4]
  364.   int  0x40
  365.   mov  edx,[ebp+MENUET_THREAD_DATA_TITLE*4]
  366.   test edx,edx
  367.   jz   Menuet_window_defined
  368.   mov  edi,edx
  369.   mov  ecx,0xFFFFFFFF
  370.   xor  al,al
  371.   cld
  372.   repnz scas byte [edi]
  373.   not  ecx
  374.   mov  esi,ecx
  375.   dec  esi
  376.   jz   Menuet_window_defined
  377.   mov  eax,4
  378.   mov  ebx,0x00070007
  379.   mov  ecx,[ebp+MENUET_THREAD_DATA_C_TITLE*4]
  380.   int  0x40
  381. Menuet_window_defined:
  382.   mov  eax,12
  383.   mov  ebx,2
  384.   int  0x40
  385. Menuet_redraw_picture:
  386.   mov  eax,12
  387.   mov  ebx,2
  388.   int  0x40
  389.   mov  esi,[ebp+MENUET_THREAD_DATA_PICTURE*4]
  390.   test esi,esi
  391.   jz   Menuet_redraw_end_draw
  392.   mov  ecx,[ebp+MENUET_THREAD_DATA_SZ_PICT*4]
  393.   jecxz Menuet_redraw_end_draw
  394.   mov  al,byte [ebp+MENUET_THREAD_DATA_C_WINDOW*4+3]
  395.   and  al,15
  396.   mov  edx,MENUET_BORDER_SIZE*65536+MENUET_HEADER_SIZE
  397.   cmp  al,3
  398.   jnz  Menuet_redraw_no_skin
  399.   mov  eax,48
  400.   mov  ebx,4
  401.   int  0x40
  402.   mov  dx,ax
  403. Menuet_redraw_no_skin:
  404.   mov  eax,7
  405.   mov  ebx,esi
  406.   int  0x40
  407. Menuet_redraw_end_draw:
  408.   pop  edi
  409.   pop  esi
  410.   pop  ebx
  411.   pop  ebp
  412.   ret
  413. enddef
  414.  
  415. define @Menuet@MoveWindow$qxpxi
  416.   push ebx
  417.   push esi
  418.   mov  eax,[esp+12]
  419.   mov  ebx,[eax]
  420.   mov  ecx,[eax+4]
  421.   mov  edx,[eax+8]
  422.   mov  esi,[eax+12]
  423.   mov  eax,67
  424.   int  0x40
  425.   pop  esi
  426.   pop  ebx
  427.   ret
  428. enddef
  429.  
  430. define @Menuet@Abort$qv
  431.   push dword [@Menuet@DebugPrefix]
  432.   call @Menuet@DebugPutString$qpxc
  433.   mov  dword [esp],Menuet_abort_string
  434.   call @Menuet@DebugPutString$qpxc
  435.   pop  ecx
  436. nextdef @Menuet@ExitProcess$qv
  437.   lock bts dword [@Menuet@_ExitProcessNow],0
  438.   jc   Menuet_exit_process_wait
  439.   sub  esp,1024
  440.   mov  eax,9
  441.   mov  ebx,esp
  442.   mov  ecx,-1
  443.   int  0x40
  444.   mov  esi,eax
  445.   mov  edi,[esp+30]
  446. Menuet_exit_process_loop:
  447.   mov  eax,9
  448.   mov  ebx,esp
  449.   mov  ecx,esi
  450.   int  0x40
  451.   mov  eax,[esp+30]
  452.   cmp  eax,edi
  453.   jz   Menuet_exit_process_continue
  454.   mov  ebx,eax
  455.   or   bl,15
  456.   inc  ebx
  457.   jz   Menuet_exit_process_continue
  458.   mov  ebx,eax
  459.   call Menuet_HashInt
  460.   movzx eax,al
  461.   mov  eax,dword [@Menuet@_ThreadTable+eax*4]
  462.   jmp  Menuet_exit_process_test
  463. Menuet_exit_process_next:
  464.   mov  eax,dword [eax+MENUET_THREAD_DATA_NEXT*4]
  465. Menuet_exit_process_test:
  466.   test eax,eax
  467.   jz   Menuet_exit_process_continue
  468.   cmp  ebx,[eax+MENUET_THREAD_DATA_PID*4]
  469.   jnz  Menuet_exit_process_next
  470.   mov  eax,18
  471.   mov  ebx,2
  472.   mov  ecx,esi
  473.   int  0x40
  474. Menuet_exit_process_continue:
  475.   dec  esi
  476.   jnl  Menuet_exit_process_loop
  477.   add  esp,1024
  478.   mov  dword [@Menuet@_ExitProcessNow],-1
  479. if defined EMULATOR
  480.   int3
  481.   call 0x76543210
  482. end if
  483. Menuet_exit_process_end:
  484.   mov  dword [@Menuet@_ThreadMutex],0
  485.   or   eax,-1
  486.   int  0x40
  487. Menuet_exit_process_wait:
  488.   mov  eax,5
  489.   mov  ebx,1
  490. Menuet_exit_process_wait_loop:
  491.   cmp  dword [@Menuet@_ExitProcessNow],0
  492.   jl   Menuet_exit_process_end
  493.   int  0x40
  494.   shl  ebx,1
  495.   cmp  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  496.   jna  Menuet_exit_process_wait_loop
  497.   mov  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  498.   jmp  Menuet_exit_process_wait_loop
  499. enddef
  500.  
  501. define @Menuet@ExitThread$qppv,@Menuet@ThreadMain$qpvt1
  502.   mov  esp,[esp+4]
  503.   jmp  Menuet_main_end
  504. enddef
  505.  
  506. define @Menuet@ReturnMessageLoop$qppv,@Menuet@ThreadMain$qpvt1
  507.   mov  esp,[esp+4]
  508.   bt   dword [esp+MENUET_THREAD_DATA_FLAG*4],30
  509.   jc   Menuet_main_end
  510.   jmp  Menuet_main_cycle
  511. enddef
  512.  
  513. define @Menuet@Delay$qui
  514.   push ebx
  515.   mov  eax,5
  516.   mov  ebx,[esp+8]
  517.   int  0x40
  518.   pop  ebx
  519.   ret
  520. enddef
  521.  
  522. define @Menuet@Clock$qv
  523.   push ebx
  524.   mov  eax,26
  525.   mov  ebx,9
  526.   int  0x40
  527.   pop  ebx
  528.   ret
  529. enddef
  530.  
  531. define @Menuet@GetPackedTime$qv
  532.   mov  eax,3
  533.   int  0x40
  534.   ret
  535. enddef
  536.  
  537. define @Menuet@GetTime$qpi
  538.   mov  eax,3
  539.   int  0x40
  540.   mov  edx,[esp+4]
  541.   movzx ecx,al
  542.   shr  ecx,4
  543.   and  al,0x0F
  544.   imul ecx,10
  545.   add  cl,al
  546.   mov  dword [edx+8],ecx
  547.   mov  cl,ah
  548.   shr  ecx,4
  549.   and  ah,0x0F
  550.   imul ecx,10
  551.   add  cl,ah
  552.   mov  dword [edx+4],ecx
  553.   bswap eax
  554.   mov  cl,ah
  555.   shr  ecx,4
  556.   and  ah,0x0F
  557.   imul ecx,10
  558.   add  cl,ah
  559.   mov  dword [edx],ecx
  560.   ret
  561. enddef
  562.  
  563. define @Menuet@GetPackedDate$qv
  564.   mov  eax,29
  565.   int  0x40
  566.   ret
  567. enddef
  568.  
  569. define @Menuet@GetDate$qpi
  570.   mov  eax,29
  571.   int  0x40
  572.   mov  edx,[esp+4]
  573.   movzx ecx,al
  574.   shr  ecx,4
  575.   and  al,0x0F
  576.   imul ecx,10
  577.   add  cl,al
  578.   mov  dword [edx+4],ecx
  579.   mov  cl,ah
  580.   shr  ecx,4
  581.   and  ah,0x0F
  582.   imul ecx,10
  583.   add  cl,ah
  584.   mov  dword [edx],ecx
  585.   bswap eax
  586.   mov  cl,ah
  587.   shr  ecx,4
  588.   and  ah,0x0F
  589.   imul ecx,10
  590.   add  cl,ah
  591.   mov  dword [edx+8],ecx
  592.   ret
  593. enddef
  594.  
  595. define @Menuet@ReadCommonColors$qpui
  596.   push ebx
  597.   mov  eax,48
  598.   mov  ebx,3
  599.   mov  ecx,[esp+8]
  600.   mov  edx,40
  601.   int  0x40
  602.   pop  ebx
  603.   ret
  604. enddef
  605.  
  606. define @Menuet@GetProcessInfo$qpuipct1t1piui
  607.   push ebx
  608.   push esi
  609.   push edi
  610.   sub  esp,1024
  611.   mov  eax,9
  612.   mov  ebx,esp
  613.   mov  ecx,[1024+12+24+esp]
  614.   int  0x40
  615.   xor  edi,edi
  616.   or   edi,[1024+12+4+esp]
  617.   jz   Menuet_get_proc_info_no_usecpu
  618.   mov  ecx,[esp]
  619.   mov  [edi],ecx
  620.   xor  edi,edi
  621. Menuet_get_proc_info_no_usecpu:
  622.   or   edi,[1024+12+8+esp]
  623.   jz   Menuet_get_proc_info_no_name
  624.   lea  esi,[esp+10]
  625.   cld
  626.   movs dword [edi],[esi]
  627.   movs dword [edi],[esi]
  628.   movs dword [edi],[esi]
  629.   mov  byte [edi],0
  630.   xor  edi,edi
  631. Menuet_get_proc_info_no_name:
  632.   or   edi,[1024+12+12+esp]
  633.   jz   Menuet_get_proc_info_no_mem
  634.   mov  ecx,[esp+26]
  635.   mov  [edi],ecx
  636.   xor  edi,edi
  637. Menuet_get_proc_info_no_mem:
  638.   or   edi,[1024+12+16+esp]
  639.   jz   Menuet_get_proc_info_no_pid
  640.   mov  ecx,[esp+30]
  641.   mov  [edi],ecx
  642.   xor  edi,edi
  643. Menuet_get_proc_info_no_pid:
  644.   or   edi,[1024+12+20+esp]
  645.   jz   Menuet_get_proc_info_no_rect
  646.   lea  esi,[esp+34]
  647.   cld
  648.   movs dword [edi],[esi]
  649.   movs dword [edi],[esi]
  650.   movs dword [edi],[esi]
  651.   movs dword [edi],[esi]
  652.   xor  edi,edi
  653. Menuet_get_proc_info_no_rect:
  654.   add  esp,1024
  655.   pop  edi
  656.   pop  esi
  657.   pop  ebx
  658.   ret
  659. enddef
  660.  
  661. define @Menuet@GetPid$qv
  662.   push ebx
  663.   sub  esp,1024
  664.   mov  eax,9
  665.   mov  ebx,esp
  666.   mov  ecx,-1
  667.   int  0x40
  668.   mov  eax,[esp+30]
  669.   add  esp,1024
  670.   pop  ebx
  671.   ret
  672. enddef
  673.  
  674. define @Menuet@GetPid$qppv
  675.   mov  ecx,[esp+4]
  676.   mov  eax,[ecx+MENUET_THREAD_DATA_PID*4]
  677.   ret
  678. enddef
  679.  
  680. define @Menuet@_HashByte$qui
  681. nextdef @Menuet@_HashWord$qui
  682. nextdef @Menuet@_HashDword$qui
  683.   mov  eax,[esp+4]
  684. nextdef Menuet_HashInt
  685.   mul  dword [Menuet_hash_int_val0]
  686.   xor  eax,edx
  687.   bswap eax
  688.   mul  dword [Menuet_hash_int_val1]
  689.   shrd eax,edx,14
  690.   bswap eax
  691.   lea  eax,[eax+4*eax]
  692.   ror  eax,9
  693.   ret
  694. Menuet_hash_int_val0:
  695.   dd   0xA82F94C5
  696. Menuet_hash_int_val1:
  697.   dd   0x9193780B
  698. enddef
  699.  
  700. define @Menuet@GetThreadData$qv
  701.   call @Menuet@GetPid$qv
  702.   push eax
  703.   call @Menuet@GetThreadData$qui
  704.   pop  ecx
  705.   ret
  706. enddef
  707.  
  708. define @Menuet@GetThreadData$qui
  709.   mov  eax,[esp+4]
  710.   call Menuet_HashInt
  711.   movzx eax,al
  712.   cmp  dword [@Menuet@_ThreadScanCount+4],0
  713.   jnz  Menuet_get_thread_data_wait
  714. Menuet_get_thread_data_nowait:
  715.   lock inc dword [@Menuet@_ThreadScanCount]
  716.   mov  eax,dword [@Menuet@_ThreadTable+eax*4]
  717.   mov  ecx,[esp+4]
  718.   jmp  Menuet_get_thread_data_test
  719. Menuet_get_thread_data_loop:
  720.   mov  eax,dword [eax+MENUET_THREAD_DATA_NEXT*4]
  721. Menuet_get_thread_data_test:
  722.   test eax,eax
  723.   jz   Menuet_get_thread_data_end
  724.   cmp  ecx,[eax+MENUET_THREAD_DATA_PID*4]
  725.   jnz  Menuet_get_thread_data_loop
  726. Menuet_get_thread_data_end:
  727.   lock dec dword [@Menuet@_ThreadScanCount]
  728.   ret
  729. Menuet_get_thread_data_wait:
  730.   push eax
  731.   push ebx
  732.   mov  eax,5
  733.   mov  ebx,1
  734. Menuet_get_thread_data_wait_loop:
  735.   int  0x40
  736.   cmp  dword [@Menuet@_ThreadScanCount+4],0
  737.   jz   Menuet_get_thread_data_wait_end
  738.   shl  ebx,1
  739.   cmp  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  740.   jna  Menuet_get_thread_data_wait_loop
  741.   mov  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  742.   jmp  Menuet_get_thread_data_wait_loop
  743. Menuet_get_thread_data_wait_end:
  744.   pop  ebx
  745.   pop  eax
  746.   jmp Menuet_get_thread_data_nowait
  747. enddef
  748.  
  749. define @Menuet@_GetSkinHeader$qv
  750.   push ebx
  751.   mov  eax,48
  752.   mov  ebx,4
  753.   int  0x40
  754.   pop  ebx
  755.   ret
  756. enddef
  757.  
  758. define @Menuet@GetScreenSize$qrust1
  759.   mov  eax,14
  760.   int  0x40
  761.   mov  ecx,[esp+8]
  762.   mov  word [ecx],ax
  763.   mov  ecx,[esp+4]
  764.   shr  eax,16
  765.   mov  word [ecx],ax
  766.   ret
  767. enddef
  768.  
  769. define Menuet_MutexLockNoWait
  770.   pop  eax
  771.   xor  al,al
  772.   ret
  773. enddef
  774.  
  775. define Menuet_MutexLockWait
  776.   push ebx
  777.   mov  eax,5
  778.   xor  ebx,ebx
  779. Menuet_lock_wait_cycle:
  780.   int  0x40
  781.   shl  byte [ecx],1
  782.   jz   Menuet_lock_wait_cycle
  783.   pop  ebx
  784.   mov  al,1
  785.   ret
  786. enddef
  787.  
  788. define Menuet_MutexLockWaitTime
  789.   cmp  dword [esp+12],0
  790.   jng  Menuet_MutexLockWait
  791.   push ebx
  792.   push edx
  793.   mov  edx,[esp+20]
  794.   mov  eax,26
  795.   mov  ebx,9
  796.   int  0x40
  797.   add  edx,eax
  798. Menuet_lock_wait_time_cycle:
  799.   mov  eax,5
  800.   xor  ebx,ebx
  801.   int  0x40
  802.   shl  byte [ecx],1
  803.   jnz  Menuet_lock_wait_time_ret_true
  804.   mov  eax,26
  805.   mov  ebx,9
  806.   int  0x40
  807.   cmp  eax,edx
  808.   js   Menuet_lock_wait_time_cycle
  809.   pop  edx
  810.   pop  ebx
  811.   pop  eax
  812.   xor  al,al
  813.   ret
  814. Menuet_lock_wait_time_ret_true:
  815.   pop  edx
  816.   pop  ebx
  817.   mov  al,1
  818.   ret
  819. enddef
  820.  
  821. define Menuet_MutexLock
  822.   shl  byte [ecx],1
  823.   jnz  Menuet_lock_first
  824.   call eax
  825. Menuet_lock_first:
  826.   mov  al,1
  827.   ret
  828. enddef
  829.  
  830. define @Menuet@TryLock$qp13Menuet@TMutex
  831.   mov  eax,Menuet_MutexLockNoWait
  832.   mov  ecx,[esp+4]
  833.   jmp  Menuet_MutexLock
  834. enddef
  835.  
  836. define @Menuet@Lock$qp13Menuet@TMutex
  837.   mov  eax,Menuet_MutexLockWait
  838.   mov  ecx,[esp+4]
  839.   jmp  Menuet_MutexLock
  840. enddef
  841.  
  842. define @Menuet@LockTime$qp13Menuet@TMutexi
  843.   mov  eax,Menuet_MutexLockWaitTime
  844.   mov  ecx,[esp+4]
  845.   jmp  Menuet_MutexLock
  846. enddef
  847.  
  848. define @Menuet@UnLock$qp13Menuet@TMutex
  849.   mov  ecx,[esp+4]
  850.   shr  byte [ecx],1
  851.   jz   Menuet_unlock_pause
  852.   ret
  853. Menuet_unlock_pause:
  854.   mov  byte [ecx],0x40
  855.   push ebx
  856.   mov  eax,5
  857.   xor  ebx,ebx
  858.   int  0x40
  859.   pop  ebx
  860.   ret
  861. enddef
  862.  
  863. define Menuet_MutexLockRec
  864.   shl  byte [ecx],1
  865.   jng  Menuet_lock_first
  866.   cmp  dword [ecx+4],edx
  867.   jz   Menuet_lock_rec_self
  868.   call eax
  869. Menuet_lock_rec_first:
  870.   mov  al,1
  871.   mov  dword [ecx+4],edx
  872.   ret
  873. Menuet_lock_rec_self:
  874.   mov  al,1
  875.   add  dword [ecx],0x100
  876.   jc   Menuet_lock_rec_overflow
  877.   ret
  878. Menuet_lock_rec_overflow:
  879.   push dword [@Menuet@DebugPrefix]
  880.   call @Menuet@DebugPutString$qpxc
  881.   mov  dword [esp],Menuet_try_lock_rec_overflow_string
  882.   call @Menuet@DebugPutString$qpxc
  883.   pop  ecx
  884.   jmp  @Menuet@Abort$qv
  885. enddef
  886.  
  887. define @Menuet@TryLock$qp16Menuet@TRecMutexui
  888.   mov  eax,Menuet_MutexLockNoWait
  889.   mov  ecx,[esp+4]
  890.   mov  edx,[esp+8]
  891.   jmp  Menuet_MutexLockRec
  892. enddef
  893.  
  894. define @Menuet@Lock$qp16Menuet@TRecMutexui
  895.   mov  eax,Menuet_MutexLockWait
  896.   mov  ecx,[esp+4]
  897.   mov  edx,[esp+8]
  898.   jmp  Menuet_MutexLockRec
  899. enddef
  900.  
  901. define @Menuet@LockTime$qp16Menuet@TRecMutexiui
  902.   mov  eax,Menuet_MutexLockWaitTime
  903.   mov  ecx,[esp+4]
  904.   mov  edx,[esp+12]
  905.   jmp  Menuet_MutexLockRec
  906. enddef
  907.  
  908. define @Menuet@UnLock$qp16Menuet@TRecMutexui
  909.   mov  ecx,[esp+4]
  910.   mov  edx,[esp+8]
  911.   cmp  dword [ecx+4],edx
  912.   jnz  Menuet_unlock_rec_notlocked
  913.   sub  dword [ecx],0x100
  914.   jnc  Menuet_unlock_rec_end
  915.   add dword [ecx],0x100
  916.   shl byte [ecx],1
  917.   shr byte [ecx],2
  918.   jng  Menuet_unlock_rec_pause
  919. Menuet_unlock_rec_end:
  920.   ret
  921. Menuet_unlock_rec_pause:
  922.   mov  byte [ecx],0x20
  923.   push ebx
  924.   mov  eax,5
  925.   xor  ebx,ebx
  926.   int  0x40
  927.   pop  ebx
  928.   ret
  929. Menuet_unlock_rec_notlocked:
  930.   push dword [@Menuet@DebugPrefix]
  931.   call @Menuet@DebugPutString$qpxc
  932.   mov  dword [esp],Menuet_unlock_rec_notlocked_string
  933.   call @Menuet@DebugPutString$qpxc
  934.   pop  ecx
  935.   jmp  @Menuet@Abort$qv
  936. enddef
  937.  
  938. define @Menuet@DebugPutChar$qc
  939.   mov  cl,byte [esp+4]
  940.   cmp  cl,13
  941.   jz   Menuet_debug_put_char_ret
  942.   push ebx
  943.   cmp  cl,10
  944.   jz   Menuet_debug_put_char_enter
  945. Menuet_debug_put_char_after_cmp:
  946.   mov  eax,63
  947.   mov  ebx,1
  948.   int  0x40
  949.   pop  ebx
  950. Menuet_debug_put_char_ret:
  951.   ret
  952. Menuet_debug_put_char_enter:
  953.   mov  cl,13
  954.   mov  eax,63
  955.   mov  ebx,1
  956.   int  0x40
  957.   mov  cl,10
  958.   jmp  Menuet_debug_put_char_after_cmp
  959. enddef
  960.  
  961. define @Menuet@DebugPutString$qpxc
  962.   push esi
  963.   push dword 0
  964.   mov  esi,dword [esp+12]
  965.   jmp  Menuet_debug_put_string_test
  966. Menuet_debug_put_string_loop:
  967.   mov  dword [esp],eax
  968.   call @Menuet@DebugPutChar$qc
  969.   inc  esi
  970. Menuet_debug_put_string_test:
  971.   xor  eax,eax
  972.   or   al,[esi]
  973.   test al,al
  974.   jnz  Menuet_debug_put_string_loop
  975.   pop  ecx
  976.   pop  esi
  977.   ret
  978. enddef
  979.  
  980. define @Menuet@GetKey$qv
  981.   mov  eax,2
  982.   int  0x40
  983.   test al,al
  984.   jnz  Menuet_get_key_eof
  985.   movzx eax,ah
  986.   ret
  987. Menuet_get_key_eof:
  988.   mov  eax,-1
  989.   ret
  990. enddef
  991.  
  992. define @Menuet@GetMouseButton$qv
  993.   push ebx
  994.   mov  eax,37
  995.   mov  ebx,2
  996.   int  0x40
  997.   pop  ebx
  998.   ret
  999. enddef
  1000.  
  1001. define @Menuet@GetMousePosition$qrst1o
  1002.   push ebx
  1003.   mov  eax,37
  1004.   xor  ebx,ebx
  1005.   cmp  byte [esp+16],0
  1006.   jnz  Menuet_get_mouse_pos_absolute
  1007.   inc  ebx
  1008. Menuet_get_mouse_pos_absolute:
  1009.   int  0x40
  1010.   mov  ecx,[esp+12]
  1011.   mov  word [ecx],ax
  1012.   mov  ecx,[esp+8]
  1013.   shr  eax,16
  1014.   mov  word [ecx],ax
  1015.   pop  ebx
  1016.   ret
  1017. enddef
  1018.  
  1019. define @Menuet@WasThreadCreated$qv
  1020.   cmp  byte [@Menuet@_ThreadSavedBegProc],0x90
  1021.   setz al
  1022.   ret
  1023. enddef
  1024.  
  1025. define @Menuet@CreateThread$qpvuit1
  1026.   push ebx
  1027.   mov  edx,[esp+16]
  1028.   mov  ebx,[esp+12]
  1029.   test edx,edx
  1030.   jnz  Menuet_create_thread_after_new
  1031. if defined MenuetHeapAlloc
  1032.   cmp  ebx,4096
  1033.   jnb  Menuet_create_thread_alloc
  1034.   mov  ebx,STACKSIZE
  1035. Menuet_create_thread_alloc:
  1036.   push ebx
  1037.   call MenuetHeapAlloc   ; Create new dynamic memory of the given size
  1038.   pop  ecx
  1039.   test eax,eax
  1040.   jnz  Menuet_create_thread_mem_created
  1041. end if
  1042.   or   eax,-1
  1043.   jmp  Menuet_create_thread_end
  1044. Menuet_create_thread_mem_created:
  1045.   lea  edx,[eax+ebx]
  1046. Menuet_create_thread_after_new:
  1047.   neg  ebx
  1048.   jz   Menuet_create_thread_test_first
  1049.   add  ebx,edx
  1050. Menuet_create_thread_test_first:
  1051.   cmp  byte [@Menuet@_ThreadSavedBegProc],0x90
  1052.   jnz  Menuet_create_thread_init
  1053. Menuet_create_thread_fill_stack:
  1054.   lock inc dword [@Menuet@_ThreadNumber]
  1055.   and  edx,not 3
  1056.   sub  edx,12
  1057.   mov  ecx,[esp+8]
  1058.   mov  dword [edx+8],ebx
  1059.   mov  dword [edx+4],ecx
  1060.   mov  dword [edx],Menuet_ThreadFinish
  1061.   mov  eax,51
  1062.   mov  ebx,1
  1063.   mov  ecx,@Menuet@ThreadMain$qpvt1
  1064.   int  0x40
  1065.   mov  ebx,eax
  1066.   or   bl,15
  1067.   inc  ebx
  1068.   jnz  Menuet_create_thread_end
  1069.   lock dec dword [@Menuet@_ThreadNumber]
  1070. if defined MenuetHeapFree
  1071.   or   ebx,[edx+8]
  1072.   jz   Menuet_create_thread_end
  1073.   push ebx
  1074.   call MenuetHeapFree   ; Delete the given dynamic memory
  1075.   pop  ecx
  1076. end if
  1077. Menuet_create_thread_end:
  1078.   pop  ebx
  1079.   ret
  1080. Menuet_create_thread_init:
  1081.   push esi
  1082.   push edi
  1083.   cld
  1084.   mov  esi,@Menuet@_ThreadSavedBegProc
  1085.   mov  edi,@Menuet@GetPid$qv
  1086.   movs dword [edi],[esi]
  1087.   movs dword [edi],[esi]
  1088.   mov  edi,@Menuet@GetThreadData$qv
  1089.   movs dword [edi],[esi]
  1090.   movs dword [edi],[esi]
  1091.   mov  eax,0x90909090
  1092.   mov  edi,@Menuet@_ThreadSavedBegProc
  1093.   stos dword [edi]
  1094.   stos dword [edi]
  1095.   stos dword [edi]
  1096.   stos dword [edi]
  1097.   pop  edi
  1098.   pop  esi
  1099.   jmp  Menuet_create_thread_fill_stack
  1100. enddef
  1101.  
  1102. define @Menuet@_FileAccess$qpv
  1103.   push ebx
  1104.   mov  eax,70
  1105.   mov  ebx,[esp+8]
  1106.   int  0x40
  1107.   mov  ecx,[esp+8]
  1108.   mov  [ecx],ebx
  1109.   pop  ebx
  1110.   ret
  1111. enddef
  1112.  
  1113. define Menuet_abort_string
  1114.   db 'Abnormal program termination.',10,0
  1115. newdef Menuet_try_lock_rec_overflow_string
  1116.   db 'Recursive mutex lock count overflow.',10,0
  1117. newdef Menuet_unlock_rec_notlocked_string
  1118.   db 'Recursive mutex unlock error.',10,0
  1119. enddef
  1120.  
  1121. include "me_lib.inc"
  1122.  
  1123. ;/**/
  1124.  
  1125.