Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1769 yogev_ezra 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