Subversion Repositories Kolibri OS

Rev

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