Subversion Repositories Kolibri OS

Rev

Rev 8196 | Rev 8283 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8196 Rev 8236
1
;const int
1
;const int
2
KOLIBRI_BORDER_SIZE = 4;
2
KOLIBRI_BORDER_SIZE = 4;
3
;const int
3
;const int
4
KOLIBRI_HEADER_SIZE = 20;
4
KOLIBRI_HEADER_SIZE = 20;
5
 
5
 
6
;const int
6
;const int
7
KOLIBRI_THREAD_DATA_USER     = 0; // Thread data begin from the user dword
7
KOLIBRI_THREAD_DATA_USER     = 0; // Thread data begin from the user dword
8
;const int
8
;const int
9
KOLIBRI_THREAD_DATA_ST_BEGIN = 1; // Stack beginning follows after the user dword
9
KOLIBRI_THREAD_DATA_ST_BEGIN = 1; // Stack beginning follows after the user dword
10
;const int
10
;const int
11
KOLIBRI_THREAD_DATA_NEXT     = 2;
11
KOLIBRI_THREAD_DATA_NEXT     = 2;
12
;const int
12
;const int
13
KOLIBRI_THREAD_DATA_PID	    = 3;
13
KOLIBRI_THREAD_DATA_PID	    = 3;
14
;const int
14
;const int
15
KOLIBRI_THREAD_DATA_FLAG     = 4;
15
KOLIBRI_THREAD_DATA_FLAG     = 4;
16
;const int
16
;const int
17
KOLIBRI_THREAD_DATA_X	    = 5;
17
KOLIBRI_THREAD_DATA_X	    = 5;
18
;const int
18
;const int
19
KOLIBRI_THREAD_DATA_Y	    = 6;
19
KOLIBRI_THREAD_DATA_Y	    = 6;
20
;const int
20
;const int
21
KOLIBRI_THREAD_DATA_C_WINDOW = 7;
21
KOLIBRI_THREAD_DATA_C_WINDOW = 7;
22
;const int
22
;const int
23
KOLIBRI_THREAD_DATA_C_HEADER = 8;
23
KOLIBRI_THREAD_DATA_C_HEADER = 8;
24
;const int
24
;const int
25
KOLIBRI_THREAD_DATA_C_BORDER = 9;
25
KOLIBRI_THREAD_DATA_C_BORDER = 9;
26
;const int
26
;const int
27
KOLIBRI_THREAD_DATA_C_TITLE  = 10;
27
KOLIBRI_THREAD_DATA_C_TITLE  = 10;
28
;const int
28
;const int
29
KOLIBRI_THREAD_DATA_TITLE    = 11;
29
KOLIBRI_THREAD_DATA_TITLE    = 11;
30
;const int
30
;const int
31
KOLIBRI_THREAD_DATA_PICTURE  = 12;
31
KOLIBRI_THREAD_DATA_PICTURE  = 12;
32
;const int
32
;const int
33
KOLIBRI_THREAD_DATA_SZ_PICT  = 13;
33
KOLIBRI_THREAD_DATA_SZ_PICT  = 13;
34
;const int
34
;const int
35
KOLIBRI_THREAD_DATA_LAST_SX  = 14;
35
KOLIBRI_THREAD_DATA_LAST_SX  = 14;
36
;const int
36
;const int
37
KOLIBRI_THREAD_DATA_LAST_SY  = 15;
37
KOLIBRI_THREAD_DATA_LAST_SY  = 15;
38
;const int
38
;const int
39
KOLIBRI_THREAD_DATA_LEN	    = 16;
39
KOLIBRI_THREAD_DATA_LEN	    = 16;
40
 
40
 
41
;const int
41
;const int
42
KOLIBRI_MUTEX_MAX_TIME_WAIT  = 20;
42
KOLIBRI_MUTEX_MAX_TIME_WAIT  = 20;
43
 
43
 
44
;/***
44
;/***
45
 
45
 
46
macro segment name
46
macro segment name
47
{
47
{
48
  segment name
48
  segment name
49
  if name eq _init_ | name eq _INIT_
49
  if name eq _init_ | name eq _INIT_
50
Kolibri_SegmentInit:
50
Kolibri_SegmentInit:
51
  else if name eq _exit_ | name eq _EXIT_
51
  else if name eq _exit_ | name eq _EXIT_
52
Kolibri_SegmentExit:
52
Kolibri_SegmentExit:
53
  end if
53
  end if
54
}
54
}
55
 
55
 
56
macro endseg  name
56
macro endseg  name
57
{
57
{
58
  if name eq _init_ | name eq _INIT_
58
  if name eq _init_ | name eq _INIT_
59
Kolibri_SegmentInitEnd:
59
Kolibri_SegmentInitEnd:
60
  else if name eq _exit_ | name eq _EXIT_
60
  else if name eq _exit_ | name eq _EXIT_
61
Kolibri_SegmentExitEnd:
61
Kolibri_SegmentExitEnd:
62
  end if
62
  end if
63
  endseg  name
63
  endseg  name
64
}
64
}
65
 
65
 
66
macro Kolibri_Put_MovEaxVal_Ret	address,val
66
macro Kolibri_Put_MovEaxVal_Ret	address,val
67
{
67
{
68
  mov  byte [address],0xB8
68
  mov  byte [address],0xB8
69
  mov  dword [address+4],0xC089C300
69
  mov  dword [address+4],0xC089C300
70
  mov  dword [address+1],val
70
  mov  dword [address+1],val
71
}
71
}
72
 
72
 
73
proc @Kolibri@Main$qv
73
proc @Kolibri@Main$qv
74
  and  esp,not 3
74
  and  esp,not 3
75
  sub  esp,1024
75
  sub  esp,1024
76
  mov  eax,SF_THREAD_INFO
76
  mov  eax,SF_THREAD_INFO
77
  mov  ebx,esp
77
  mov  ebx,esp
78
  mov  ecx,-1
78
  mov  ecx,-1
79
  int  0x40
79
  int  0x40
80
  mov  ebx,[esp+26]
80
  mov  ebx,[esp+process_information.used_memory]
81
  mov  edx,[esp+30]
81
  mov  edx,[esp+process_information.PID]
82
  lea  eax,[ebx-0x20]
82
  lea  eax,[ebx-0x20]
83
  add  esp,1024
83
  add  esp,1024
84
  cmp  esp,eax
84
  cmp  esp,eax
85
  cmova esp,eax
85
  cmova esp,eax
86
  and  esp,not 3
86
  and  esp,not 3
87
if defined @Kolibri@CommandLine
-
 
88
	mov	byte [@Kolibri@CommandLine+256], 0
-
 
89
end if
-
 
90
  xor  eax,eax
87
  xor  eax,eax
91
  cld
88
  cld
92
  mov  edi,@Kolibri@_ThreadTable
89
  mov  edi,@Kolibri@_ThreadTable
93
  mov  ecx,256
90
  mov  ecx,256
94
  rep stosd
91
  rep stosd
95
  mov  esi,@Kolibri@GetPid$qv
92
  mov  esi,@Kolibri@GetPid$qv
96
  mov  edi,@Kolibri@_ThreadSavedBegProc
93
  mov  edi,@Kolibri@_ThreadSavedBegProc
97
  movsd
94
  movsd
98
  movsd
95
  movsd
99
  mov  esi,@Kolibri@GetThreadData$qv
96
  mov  esi,@Kolibri@GetThreadData$qv
100
  movsd
97
  movsd
101
  movsd
98
  movsd
102
  Kolibri_Put_MovEaxVal_Ret  @Kolibri@GetPid$qv,edx
99
  Kolibri_Put_MovEaxVal_Ret  @Kolibri@GetPid$qv,edx
103
if defined KolibriHeapInit
100
if defined KolibriHeapInit
104
  call KolibriHeapInit	; Initialize a dynamic heap
101
  call KolibriHeapInit	; Initialize a dynamic heap
105
end if
102
end if
106
  xor  eax,eax
103
  xor  eax,eax
107
  push eax
104
  push eax
108
  push eax
105
  push eax
109
  call @Kolibri@ThreadMain$qpvt1
106
  call @Kolibri@ThreadMain$qpvt1
110
.ThreadFinish:
107
.ThreadFinish:
111
  add  esp,8
108
  add  esp,8
112
if defined KolibriHeapFreeAndThreadFinish
109
if defined KolibriHeapFreeAndThreadFinish
113
  test eax,eax
110
  test eax,eax
114
  jz   .ThreadFinish_end
111
  jz   .ThreadFinish_end
115
  push dword @Kolibri@_ExitProcessNow
112
  push dword @Kolibri@_ExitProcessNow
116
  push eax
113
  push eax
117
  call KolibriHeapFreeAndThreadFinish   ; Free the given memory and finish the thread,
114
  call KolibriHeapFreeAndThreadFinish   ; Free the given memory and finish the thread,
118
end if				       ; should exit process if second argument points to not zero.
115
end if				       ; should exit process if second argument points to not zero.
119
.ThreadFinish_end:
116
.ThreadFinish_end:
120
  or   eax,-1
117
  or   eax,-1
121
  int  0x40
118
  int  0x40
122
endp
119
endp
123
 
120
 
124
proc @Kolibri@ThreadMain$qpvt1
121
proc @Kolibri@ThreadMain$qpvt1
125
  xchg ebx,[esp+4]
122
  xchg ebx,[esp+4]
126
  xchg ebp,[esp+8]
123
  xchg ebp,[esp+8]
127
  push esi edi
124
  push esi edi
128
  sub  esp,KOLIBRI_THREAD_DATA_LEN*4
125
  sub  esp,KOLIBRI_THREAD_DATA_LEN*4
129
  mov  [esp],ebx
126
  mov  [esp],ebx
130
  mov  [esp+4],ebp
127
  mov  [esp+4],ebp
131
  mov  eax,SF_SET_EVENTS_MASK
128
  mov  eax,SF_SET_EVENTS_MASK
132
  mov  ebx,0x27
129
  mov  ebx,0x27
133
  int  0x40
130
  int  0x40
134
  mov  ebx,esp
131
  mov  ebx,esp
135
  cmp  byte [@Kolibri@_ThreadSavedBegProc],0x90
132
  cmp  byte [@Kolibri@_ThreadSavedBegProc],0x90
136
  jz   .main_else_first_check
133
  jz   .main_else_first_check
137
  Kolibri_Put_MovEaxVal_Ret  @Kolibri@GetThreadData$qv,esp
134
  Kolibri_Put_MovEaxVal_Ret  @Kolibri@GetThreadData$qv,esp
138
if defined Kolibri_SegmentInit & defined Kolibri_SegmentInitEnd
135
if defined Kolibri_SegmentInit & defined Kolibri_SegmentInitEnd
139
  push Kolibri_SegmentInitEnd
136
  push Kolibri_SegmentInitEnd
140
  push Kolibri_SegmentInit
137
  push Kolibri_SegmentInit
141
  jmp  .main_after_first_check
138
  jmp  .main_after_first_check
142
end if
139
end if
143
.main_else_first_check:
140
.main_else_first_check:
144
  xor  eax,eax
141
  xor  eax,eax
145
  push eax eax
142
  push eax eax
146
.main_after_first_check:
143
.main_after_first_check:
147
  push ebx
144
  push ebx
148
  call @@Kolibri@_CallStart$qppvpvt2
145
  call @@Kolibri@_CallStart$qppvpvt2
149
  add  esp,12
146
  add  esp,12
150
  test al,al
147
  test al,al
151
  jnz  .main_test_close_first
148
  jnz  .main_test_close_first
152
  jmp  .main_end
149
  jmp  .main_end
153
.main_close_first:
150
.main_close_first:
154
  btr  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],31
151
  btr  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],31
155
if defined @@KolibriOnClose$qppv
152
if defined @@KolibriOnClose$qppv
156
  push esp
153
  push esp
157
  call @@KolibriOnClose$qppv
154
  call @@KolibriOnClose$qppv
158
  pop  ecx
155
  pop  ecx
159
  test al,al
156
  test al,al
160
  jnz  .main_end
157
  jnz  .main_end
161
end if
158
end if
162
.main_test_close_first:
159
.main_test_close_first:
163
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
160
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
164
  jl   .main_close_first
161
  jl   .main_close_first
165
;  push esp
162
;  push esp
166
;  push dword 1
163
;  push dword 1
167
;  call @Kolibri@Redraw$qippv
164
;  call @Kolibri@Redraw$qippv
168
;  add	esp,8
165
;  add	esp,8
169
.main_paint_msg:
166
.main_paint_msg:
170
  or   dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],3
167
  or   dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],3
171
  sub  esp,1024
168
  sub  esp,1024
172
  mov  eax,SF_THREAD_INFO
169
  mov  eax,SF_THREAD_INFO
173
  mov  ebx,esp
170
  mov  ebx,esp
174
  mov  ecx,-1
171
  mov  ecx,-1
175
  int  0x40
172
  int  0x40
176
  mov  eax,[esp+34]
173
  mov  eax,[esp+process_information.box.left]
177
  mov  ebx,[esp+38]
174
  mov  ebx,[esp+process_information.box.top]
178
  mov  ecx,[esp+42]
175
  mov  ecx,[esp+process_information.box.width]
179
  mov  edx,[esp+46]
176
  mov  edx,[esp+process_information.box.height]
180
  add  esp,1024
177
  add  esp,1024
181
  cmp  ecx,[esp+KOLIBRI_THREAD_DATA_LAST_SX*4]
178
  cmp  ecx,[esp+KOLIBRI_THREAD_DATA_LAST_SX*4]
182
  jnz  .main_size
179
  jnz  .main_size
183
  cmp  edx,[esp+KOLIBRI_THREAD_DATA_LAST_SY*4]
180
  cmp  edx,[esp+KOLIBRI_THREAD_DATA_LAST_SY*4]
184
  jz   .main_paint
181
  jz   .main_paint
185
.main_size:
182
.main_size:
186
  mov  [esp+KOLIBRI_THREAD_DATA_LAST_SX*4],ecx
183
  mov  [esp+KOLIBRI_THREAD_DATA_LAST_SX*4],ecx
187
  mov  [esp+KOLIBRI_THREAD_DATA_LAST_SY*4],edx
184
  mov  [esp+KOLIBRI_THREAD_DATA_LAST_SY*4],edx
188
if defined @@KolibriOnSize$qpippv
185
if defined @@KolibriOnSize$qpippv
189
  push edx
186
  push edx
190
  push ecx
187
  push ecx
191
  push ebx
188
  push ebx
192
  push eax
189
  push eax
193
  lea  ecx,[esp+16]
190
  lea  ecx,[esp+16]
194
  mov  edx,esp
191
  mov  edx,esp
195
  push ecx
192
  push ecx
196
  push edx
193
  push edx
197
  call @@KolibriOnSize$qpippv
194
  call @@KolibriOnSize$qpippv
198
  add  esp,24
195
  add  esp,24
199
end if
196
end if
200
  test dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],3
197
  test dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],3
201
  jz   .main_cycle
198
  jz   .main_cycle
202
.main_paint:
199
.main_paint:
203
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
200
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
204
  jl   .main_close
201
  jl   .main_close
205
  push esp
202
  push esp
206
  push dword 0
203
  push dword 0
207
  call @Kolibri@Redraw$qippv
204
  call @Kolibri@Redraw$qippv
208
  add  esp,8
205
  add  esp,8
209
.main_cycle:
206
.main_cycle:
210
  mov  eax,SF_CHECK_EVENT
207
  mov  eax,SF_CHECK_EVENT
211
.main_message:
208
.main_message:
212
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
209
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
213
  jl   .main_close
210
  jl   .main_close
214
  int  0x40
211
  int  0x40
215
  test eax,eax
212
  test eax,eax
216
  jnz  .main_on_message
213
  jnz  .main_on_message
217
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
214
  cmp  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],0
218
  jne  .main_paint
215
  jne  .main_paint
219
if defined @@KolibriOnIdle$qppv
216
if defined @@KolibriOnIdle$qppv
220
  push esp
217
  push esp
221
  call @@KolibriOnIdle$qppv
218
  call @@KolibriOnIdle$qppv
222
  pop  ecx
219
  pop  ecx
223
else
220
else
224
  or eax,-1
221
  or eax,-1
225
end if
222
end if
226
  test eax,eax
223
  test eax,eax
227
  jz   .main_cycle
224
  jz   .main_cycle
228
  jl   .main_wait_message
225
  jl   .main_wait_message
229
  mov  ebx,eax
226
  mov  ebx,eax
230
  mov  eax,SF_WAIT_EVENT_TIMEOUT
227
  mov  eax,SF_WAIT_EVENT_TIMEOUT
231
  jmp  .main_message
228
  jmp  .main_message
232
.main_wait_message:
229
.main_wait_message:
233
  mov  eax,SF_WAIT_EVENT
230
  mov  eax,SF_WAIT_EVENT
234
  jmp  .main_message
231
  jmp  .main_message
235
if defined @@KolibriOnKeyPress$qppv
232
if defined @@KolibriOnKeyPress$qppv
236
.main_key_press:
233
.main_key_press:
237
  push esp
234
  push esp
238
  call @@KolibriOnKeyPress$qppv
235
  call @@KolibriOnKeyPress$qppv
239
  pop  ecx
236
  pop  ecx
240
  jmp  .main_cycle
237
  jmp  .main_cycle
241
end if
238
end if
242
if defined @@KolibriOnMouse$qppv
239
if defined @@KolibriOnMouse$qppv
243
.main_mouse:
240
.main_mouse:
244
  push esp
241
  push esp
245
  call @@KolibriOnMouse$qppv
242
  call @@KolibriOnMouse$qppv
246
  pop  ecx
243
  pop  ecx
247
  jmp  .main_cycle
244
  jmp  .main_cycle
248
end if
245
end if
249
 
246
 
250
align 4
247
align 4
251
.main_on_message:
248
.main_on_message:
252
  dec  eax
249
  dec  eax
253
  jz   .main_paint_msg
250
  jz   .main_paint_msg
254
  dec  eax
251
  dec  eax
255
if defined @@KolibriOnKeyPress$qppv
252
if defined @@KolibriOnKeyPress$qppv
256
  jz   .main_key_press
253
  jz   .main_key_press
257
else
254
else
258
  jz   .main_cycle
255
  jz   .main_cycle
259
end if
256
end if
260
  cmp  eax,4
257
  cmp  eax,4
261
if defined @@KolibriOnMouse$qppv
258
if defined @@KolibriOnMouse$qppv
262
  jz   .main_mouse
259
  jz   .main_mouse
263
else
260
else
264
  jz   .main_cycle
261
  jz   .main_cycle
265
end if
262
end if
266
  dec  eax
263
  dec  eax
267
  jnz  .main_cycle
264
  jnz  .main_cycle
268
 
265
 
269
align 4
266
align 4
270
.main_button:
267
.main_button:
271
  mov  eax,SF_GET_BUTTON
268
  mov  eax,SF_GET_BUTTON
272
  int  0x40
269
  int  0x40
273
  shr  eax,8
270
  shr  eax,8
274
  cmp  eax,1
271
  cmp  eax,1
275
  je   .main_close
272
  je   .main_close
276
if defined @@KolibriOnButton$qlppv
273
if defined @@KolibriOnButton$qlppv
277
  push esp
274
  push esp
278
  push eax
275
  push eax
279
  call @@KolibriOnButton$qlppv
276
  call @@KolibriOnButton$qlppv
280
  add  esp,8
277
  add  esp,8
281
end if
278
end if
282
  jmp  .main_cycle
279
  jmp  .main_cycle
283
.main_close:
280
.main_close:
284
  btr  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],31
281
  btr  dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],31
285
if defined @@KolibriOnClose$qppv
282
if defined @@KolibriOnClose$qppv
286
  push esp
283
  push esp
287
  call @@KolibriOnClose$qppv
284
  call @@KolibriOnClose$qppv
288
  pop  ecx
285
  pop  ecx
289
  test al,al
286
  test al,al
290
  jz   .main_button
287
  jz   .main_button
291
end if
288
end if
292
.main_end:
289
.main_end:
293
  mov  ebx,esp
290
  mov  ebx,esp
294
  lock dec dword [@Kolibri@_ThreadNumber]
291
  lock dec dword [@Kolibri@_ThreadNumber]
295
if defined Kolibri_SegmentExit & defined Kolibri_SegmentExitEnd
292
if defined Kolibri_SegmentExit & defined Kolibri_SegmentExitEnd
296
  jnz  .main_else_last_check
293
  jnz  .main_else_last_check
297
  push Kolibri_SegmentExitEnd
294
  push Kolibri_SegmentExitEnd
298
  push Kolibri_SegmentExit
295
  push Kolibri_SegmentExit
299
  jmp  .main_after_last_check
296
  jmp  .main_after_last_check
300
end if
297
end if
301
.main_else_last_check:
298
.main_else_last_check:
302
  xor  eax,eax
299
  xor  eax,eax
303
  push eax
300
  push eax
304
  push eax
301
  push eax
305
.main_after_last_check:
302
.main_after_last_check:
306
  push ebx
303
  push ebx
307
  call @@Kolibri@_RemoveThreadData$qppvpvt2
304
  call @@Kolibri@_RemoveThreadData$qppvpvt2
308
  add  esp,12
305
  add  esp,12
309
  lock inc dword [@Kolibri@_ThreadScanCount+4]
306
  lock inc dword [@Kolibri@_ThreadScanCount+4]
310
  mov  ebx,1
307
  mov  ebx,1
311
  jmp  .main_end_wait
308
  jmp  .main_end_wait
312
.main_end_wait_loop:
309
.main_end_wait_loop:
313
  mov  eax,SF_SLEEP
310
  mov  eax,SF_SLEEP
314
  int  0x40
311
  int  0x40
315
  shl  ebx,1
312
  shl  ebx,1
316
  cmp  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
313
  cmp  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
317
  jna  .main_end_wait
314
  jna  .main_end_wait
318
  mov  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
315
  mov  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
319
.main_end_wait:
316
.main_end_wait:
320
  cmp  dword [@Kolibri@_ExitProcessNow],0
317
  cmp  dword [@Kolibri@_ExitProcessNow],0
321
  jnz  @Kolibri@ExitProcess$qv
318
  jnz  @Kolibri@ExitProcess$qv
322
  cmp  dword [@Kolibri@_ThreadScanCount],0
319
  cmp  dword [@Kolibri@_ThreadScanCount],0
323
  jnz  .main_end_wait_loop
320
  jnz  .main_end_wait_loop
324
  lock dec dword [@Kolibri@_ThreadScanCount+4]
321
  lock dec dword [@Kolibri@_ThreadScanCount+4]
325
  mov  ebp,[esp+4]
322
  mov  ebp,[esp+4]
326
  mov  ebx,[esp]
323
  mov  ebx,[esp]
327
  add  esp,KOLIBRI_THREAD_DATA_LEN*4
324
  add  esp,KOLIBRI_THREAD_DATA_LEN*4
328
  mov  eax,ebp
325
  mov  eax,ebp
329
  pop  edi esi
326
  pop  edi esi
330
  xchg ebp,[esp+8]
327
  xchg ebp,[esp+8]
331
  xchg ebx,[esp+4]
328
  xchg ebx,[esp+4]
332
  ret
329
  ret
333
endp
330
endp
334
 
-
 
335
macro call func
-
 
336
{
-
 
337
  if func eq __chkstk
-
 
338
	sub  esp,eax
-
 
339
  else
-
 
340
	call func
-
 
341
  end if
-
 
342
}
-
 
343
 
331
 
344
proc @Kolibri@Redraw$qippv
332
proc @Kolibri@Redraw$qippv
345
  push ebp
333
  push ebp
346
  mov  ebp,[esp+12]
334
  mov  ebp,[esp+12]
347
  mov  edx,[ebp+KOLIBRI_THREAD_DATA_FLAG*4]
335
  mov  edx,[ebp+KOLIBRI_THREAD_DATA_FLAG*4]
348
  cmp  dword [esp+8],0
336
  cmp  dword [esp+8],0
349
  jl   .redraw_only_inv
337
  jl   .redraw_only_inv
350
  jz   .redraw_no_frame
338
  jz   .redraw_no_frame
351
  or   dl,2
339
  or   dl,2
352
.redraw_no_frame:
340
.redraw_no_frame:
353
  bt   edx,30
341
  bt   edx,30
354
  jnc  .redraw_begin
342
  jnc  .redraw_begin
355
  or   dl,1
343
  or   dl,1
356
  mov  [ebp+KOLIBRI_THREAD_DATA_FLAG*4],edx
344
  mov  [ebp+KOLIBRI_THREAD_DATA_FLAG*4],edx
357
  jmp  .redraw_end
345
  jmp  .redraw_end
358
.redraw_only_inv:
346
.redraw_only_inv:
359
  test dl,3
347
  test dl,3
360
  jnz  .redraw_no_frame
348
  jnz  .redraw_no_frame
361
.redraw_end:
349
.redraw_end:
362
  pop  ebp
350
  pop  ebp
363
  ret
351
  ret
364
.redraw_begin:
352
.redraw_begin:
365
  push ebx esi edi
353
  push ebx esi edi
366
  and  dword [ebp+KOLIBRI_THREAD_DATA_FLAG*4],0xFFFFFFFC
354
  and  dword [ebp+KOLIBRI_THREAD_DATA_FLAG*4],0xFFFFFFFC
367
  mov  eax,SF_REDRAW
355
  mov  eax,SF_REDRAW
368
  mov  ebx,SSF_BEGIN_DRAW
356
  mov  ebx,SSF_BEGIN_DRAW
369
  int  0x40
357
  int  0x40
370
  test dl,2
358
  test dl,2
371
  jz   .redraw_picture
359
  jz   .redraw_picture
372
  mov  eax,SF_STYLE_SETTINGS
360
  mov  eax,SF_STYLE_SETTINGS
373
  mov  ebx,SSF_GET_SKIN_HEIGHT
361
  mov  ebx,SSF_GET_SKIN_HEIGHT
374
  int  0x40
362
  int  0x40
375
  mov  ebx,[ebp+KOLIBRI_THREAD_DATA_X*4]
363
  mov  ebx,[ebp+KOLIBRI_THREAD_DATA_X*4]
376
  add  ebx,2*5-1
364
  add  ebx,2*5-1
377
  mov  ecx,[ebp+KOLIBRI_THREAD_DATA_Y*4]
365
  mov  ecx,[ebp+KOLIBRI_THREAD_DATA_Y*4]
378
  add  cx,ax
366
  add  cx,ax
379
  add  ecx,5-1
367
  add  ecx,5-1
380
  mov  edx,[ebp+KOLIBRI_THREAD_DATA_C_WINDOW*4]
368
  mov  edx,[ebp+KOLIBRI_THREAD_DATA_C_WINDOW*4]
381
  mov  edi,[ebp+KOLIBRI_THREAD_DATA_TITLE*4]
369
  mov  edi,[ebp+KOLIBRI_THREAD_DATA_TITLE*4]
382
  xor  eax,eax
370
  xor  eax,eax ;SF_CREATE_WINDOW
383
  int  0x40
371
  int  0x40
384
.redraw_picture:
372
.redraw_picture:
385
  call	@@KolibriOnPaint$qv
373
  call	@@KolibriOnPaint$qv
386
.redraw_end_draw:
374
.redraw_end_draw:
387
  mov  eax,SF_REDRAW
375
  mov  eax,SF_REDRAW
388
  mov  ebx,SSF_END_DRAW
376
  mov  ebx,SSF_END_DRAW
389
  int  0x40
377
  int  0x40
390
  pop  edi esi ebx ebp
378
  pop  edi esi ebx ebp
391
  ret
379
  ret
392
endp
380
endp
393
 
381
 
394
proc @Kolibri@MoveWindow$qxpxi uses ebx esi
382
proc @Kolibri@MoveWindow$qxpxi uses ebx esi
395
  mov  eax,[esp+12]
383
  mov  eax,[esp+12]
396
  mov  ebx,[eax]
384
  mov  ebx,[eax]
397
  mov  ecx,[eax+4]
385
  mov  ecx,[eax+4]
398
  mov  edx,[eax+8]
386
  mov  edx,[eax+8]
399
  mov  esi,[eax+12]
387
  mov  esi,[eax+12]
400
  mov  eax,SF_CHANGE_WINDOW
388
  mov  eax,SF_CHANGE_WINDOW
401
  int  0x40
389
  int  0x40
402
  ret
390
  ret
403
endp
391
endp
404
 
392
 
405
proc @Kolibri@ExitDebug$qv
393
proc @Kolibri@ExitDebug$qv
406
  push dword [@Kolibri@DebugPrefix]
394
  push dword [@Kolibri@DebugPrefix]
407
  call @Kolibri@DebugPutString$qpxc
395
  call @Kolibri@DebugPutString$qpxc
408
  mov	dword [esp],Kolibri_debug_string
396
  mov	dword [esp],Kolibri_debug_string
409
  call @Kolibri@DebugPutString$qpxc
397
  call @Kolibri@DebugPutString$qpxc
410
  pop	ecx
398
  pop	ecx
411
  jmp  @Kolibri@ExitProcess$qv
399
  jmp  @Kolibri@ExitProcess$qv
412
endp
400
endp
413
 
401
 
414
proc @Kolibri@ExitProcess$qv
402
proc @Kolibri@ExitProcess$qv
415
  lock bts dword [@Kolibri@_ExitProcessNow],0
403
  lock bts dword [@Kolibri@_ExitProcessNow],0
416
  jc   .exit_process_wait
404
  jc   .exit_process_wait
417
  sub  esp,1024
405
  sub  esp,1024
418
  mov  eax,SF_THREAD_INFO
406
  mov  eax,SF_THREAD_INFO
419
  mov  ebx,esp
407
  mov  ebx,esp
420
  mov  ecx,-1
408
  mov  ecx,-1
421
  int  0x40
409
  int  0x40
422
  mov  esi,eax
410
  mov  esi,eax
423
  mov  edi,[esp+30]
411
  mov  edi,[esp+process_information.PID]
424
.exit_process_loop:
412
.exit_process_loop:
425
  mov  eax,SF_THREAD_INFO
413
  mov  eax,SF_THREAD_INFO
426
  mov  ebx,esp
414
  mov  ebx,esp
427
  mov  ecx,esi
415
  mov  ecx,esi
428
  int  0x40
416
  int  0x40
429
  mov  eax,[esp+30]
417
  mov  eax,[esp+process_information.PID]
430
  cmp  eax,edi
418
  cmp  eax,edi
431
  jz   .exit_process_continue
419
  jz   .exit_process_continue
432
  mov  ebx,eax
420
  mov  ebx,eax
433
  or   bl,15
421
  or   bl,15
434
  inc  ebx
422
  inc  ebx
435
  jz   .exit_process_continue
423
  jz   .exit_process_continue
436
  mov  ebx,eax
424
  mov  ebx,eax
437
  call Kolibri_HashInt
425
  call Kolibri_HashInt
438
  movzx eax,al
426
  movzx eax,al
439
  mov  eax,dword [@Kolibri@_ThreadTable+eax*4]
427
  mov  eax,dword [@Kolibri@_ThreadTable+eax*4]
440
  jmp  .exit_process_test
428
  jmp  .exit_process_test
441
.exit_process_next:
429
.exit_process_next:
442
  mov  eax,dword [eax+KOLIBRI_THREAD_DATA_NEXT*4]
430
  mov  eax,dword [eax+KOLIBRI_THREAD_DATA_NEXT*4]
443
.exit_process_test:
431
.exit_process_test:
444
  test eax,eax
432
  test eax,eax
445
  jz   .exit_process_continue
433
  jz   .exit_process_continue
446
  cmp  ebx,[eax+KOLIBRI_THREAD_DATA_PID*4]
434
  cmp  ebx,[eax+KOLIBRI_THREAD_DATA_PID*4]
447
  jnz  .exit_process_next
435
  jnz  .exit_process_next
448
  mov  eax,SF_SYSTEM
436
  mov  eax,SF_SYSTEM
449
  mov  ebx,SSF_TERMINATE_THREAD
437
  mov  ebx,SSF_TERMINATE_THREAD
450
  mov  ecx,esi
438
  mov  ecx,esi
451
  int  0x40
439
  int  0x40
452
.exit_process_continue:
440
.exit_process_continue:
453
  dec  esi
441
  dec  esi
454
  jnl  .exit_process_loop
442
  jnl  .exit_process_loop
455
  add  esp,1024
443
  add  esp,1024
456
  mov  dword [@Kolibri@_ExitProcessNow],-1
444
  mov  dword [@Kolibri@_ExitProcessNow],-1
457
if defined EMULATOR
445
if defined EMULATOR
458
  int3
446
  int3
459
  call 0x76543210
447
  call 0x76543210
460
end if
448
end if
461
.exit_process_end:
449
.exit_process_end:
462
  mov  dword [@Kolibri@_ThreadMutex],0
450
  mov  dword [@Kolibri@_ThreadMutex],0
463
  or   eax,-1
451
  or   eax,-1
464
  int  0x40
452
  int  0x40
465
.exit_process_wait:
453
.exit_process_wait:
466
  mov  eax,SF_SLEEP
454
  mov  eax,SF_SLEEP
467
  mov  ebx,1
455
  mov  ebx,1
468
.exit_process_wait_loop:
456
.exit_process_wait_loop:
469
  cmp  dword [@Kolibri@_ExitProcessNow],0
457
  cmp  dword [@Kolibri@_ExitProcessNow],0
470
  jl   .exit_process_end
458
  jl   .exit_process_end
471
  int  0x40
459
  int  0x40
472
  shl  ebx,1
460
  shl  ebx,1
473
  cmp  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
461
  cmp  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
474
  jna  .exit_process_wait_loop
462
  jna  .exit_process_wait_loop
475
  mov  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
463
  mov  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
476
  jmp  .exit_process_wait_loop
464
  jmp  .exit_process_wait_loop
477
endp
465
endp
478
 
466
 
479
proc @Kolibri@ExitThread$qppv,@Kolibri@ThreadMain$qpvt1
467
proc @Kolibri@ExitThread$qppv
480
  mov  esp,[esp+4]
468
  mov  esp,[esp+4]
481
  jmp  Kolibri_main_end
469
  jmp  @Kolibri@ThreadMain$qpvt1.main_end
482
endp
470
endp
483
 
471
 
484
proc @Kolibri@ReturnMessageLoop$qppv,@Kolibri@ThreadMain$qpvt1
472
proc @Kolibri@ReturnMessageLoop$qppv
485
  mov  esp,[esp+4]
473
  mov  esp,[esp+4]
486
  bt   dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],30
474
  bt   dword [esp+KOLIBRI_THREAD_DATA_FLAG*4],30
487
  jc   Kolibri_main_end
475
  jc   @Kolibri@ThreadMain$qpvt1.main_end
488
  jmp  Kolibri_main_cycle
476
  jmp  @Kolibri@ThreadMain$qpvt1.main_cycle
489
endp
477
endp
490
 
478
 
491
proc @Kolibri@Delay$qui uses ebx
479
proc @Kolibri@Delay$qui uses ebx
492
  mov  eax,SF_SLEEP
480
  mov  eax,SF_SLEEP
493
  mov  ebx,[esp+8]
481
  mov  ebx,[esp+8]
494
  int  0x40
482
  int  0x40
495
  ret
483
  ret
496
endp
484
endp
497
 
485
 
498
proc @Kolibri@Clock$qv uses ebx
486
proc @Kolibri@Clock$qv uses ebx
499
  mov  eax,SF_SYSTEM_GET
487
  mov  eax,SF_SYSTEM_GET
500
  mov  ebx,SSF_TIME_COUNT
488
  mov  ebx,SSF_TIME_COUNT
501
  int  0x40
489
  int  0x40
502
  ret
490
  ret
503
endp
491
endp
504
 
492
 
505
proc @Kolibri@DrawButton$qllllll uses ebx esi
493
proc @Kolibri@DrawButton$qllllll uses ebx esi
506
  mov  eax,SF_DEFINE_BUTTON
494
  mov  eax,SF_DEFINE_BUTTON
507
  mov  ebx,[esp+12-2+8]
495
  mov  ebx,[esp+12-2+8]
508
  mov  bx,[esp+20+8]
496
  mov  bx,[esp+20+8]
509
  mov  ecx,[esp+16-2+8]
497
  mov  ecx,[esp+16-2+8]
510
  mov  cx,[esp+24+8]
498
  mov  cx,[esp+24+8]
511
  mov  edx,[esp+4+8]
499
  mov  edx,[esp+4+8]
512
  mov  esi,[esp+8+8]
500
  mov  esi,[esp+8+8]
513
  int  0x40
501
  int  0x40
514
  ret 
502
  ret 
515
endp
503
endp
516
 
504
 
517
proc @Kolibri@GetPackedTime$qv
505
proc @Kolibri@GetPackedTime$qv
518
  mov  eax,SF_GET_SYS_TIME
506
  mov  eax,SF_GET_SYS_TIME
519
  int  0x40
507
  int  0x40
520
  ret
508
  ret
521
endp
509
endp
522
 
510
 
523
proc @Kolibri@GetTime$qpi
511
proc @Kolibri@GetTime$qpi
524
  mov  eax,SF_GET_SYS_TIME
512
  mov  eax,SF_GET_SYS_TIME
525
  int  0x40
513
  int  0x40
526
  mov  edx,[esp+4]
514
  mov  edx,[esp+4]
527
  movzx ecx,al
515
  movzx ecx,al
528
  shr  ecx,4
516
  shr  ecx,4
529
  and  al,0x0F
517
  and  al,0x0F
530
  imul ecx,10
518
  imul ecx,10
531
  add  cl,al
519
  add  cl,al
532
  mov  dword [edx+8],ecx
520
  mov  dword [edx+8],ecx
533
  mov  cl,ah
521
  mov  cl,ah
534
  shr  ecx,4
522
  shr  ecx,4
535
  and  ah,0x0F
523
  and  ah,0x0F
536
  imul ecx,10
524
  imul ecx,10
537
  add  cl,ah
525
  add  cl,ah
538
  mov  dword [edx+4],ecx
526
  mov  dword [edx+4],ecx
539
  bswap eax
527
  bswap eax
540
  mov  cl,ah
528
  mov  cl,ah
541
  shr  ecx,4
529
  shr  ecx,4
542
  and  ah,0x0F
530
  and  ah,0x0F
543
  imul ecx,10
531
  imul ecx,10
544
  add  cl,ah
532
  add  cl,ah
545
  mov  dword [edx],ecx
533
  mov  dword [edx],ecx
546
  ret
534
  ret
547
endp
535
endp
548
 
536
 
549
proc @Kolibri@GetPackedDate$qv
537
proc @Kolibri@GetPackedDate$qv
550
  mov  eax,SF_GET_SYS_DATE
538
  mov  eax,SF_GET_SYS_DATE
551
  int  0x40
539
  int  0x40
552
  ret
540
  ret
553
endp
541
endp
554
 
542
 
555
proc @Kolibri@GetDate$qpi
543
proc @Kolibri@GetDate$qpi
556
  mov  eax,SF_GET_SYS_DATE
544
  mov  eax,SF_GET_SYS_DATE
557
  int  0x40
545
  int  0x40
558
  mov  edx,[esp+4]
546
  mov  edx,[esp+4]
559
  movzx ecx,al
547
  movzx ecx,al
560
  shr  ecx,4
548
  shr  ecx,4
561
  and  al,0x0F
549
  and  al,0x0F
562
  imul ecx,10
550
  imul ecx,10
563
  add  cl,al
551
  add  cl,al
564
  mov  dword [edx+4],ecx
552
  mov  dword [edx+4],ecx
565
  mov  cl,ah
553
  mov  cl,ah
566
  shr  ecx,4
554
  shr  ecx,4
567
  and  ah,0x0F
555
  and  ah,0x0F
568
  imul ecx,10
556
  imul ecx,10
569
  add  cl,ah
557
  add  cl,ah
570
  mov  dword [edx],ecx
558
  mov  dword [edx],ecx
571
  bswap eax
559
  bswap eax
572
  mov  cl,ah
560
  mov  cl,ah
573
  shr  ecx,4
561
  shr  ecx,4
574
  and  ah,0x0F
562
  and  ah,0x0F
575
  imul ecx,10
563
  imul ecx,10
576
  add  cl,ah
564
  add  cl,ah
577
  mov  dword [edx+8],ecx
565
  mov  dword [edx+8],ecx
578
  ret
566
  ret
579
endp
567
endp
580
 
568
 
581
proc @Kolibri@ReadCommonColors$qpui uses ebx
569
proc @Kolibri@ReadCommonColors$qpui uses ebx
582
  mov  eax,SF_STYLE_SETTINGS
570
  mov  eax,SF_STYLE_SETTINGS
583
  mov  ebx,SSF_GET_COLORS
571
  mov  ebx,SSF_GET_COLORS
584
  mov  ecx,[esp+8]
572
  mov  ecx,[esp+8]
585
  mov  edx,40
573
  mov  edx,40
586
  int  0x40
574
  int  0x40
587
  ret
575
  ret
588
endp
576
endp
589
 
577
 
590
proc @Kolibri@DrawText$qssipxc uses ebx
578
proc @Kolibri@DrawText$qssipxc uses ebx
591
  mov  eax,SF_DRAW_TEXT
579
  mov  eax,SF_DRAW_TEXT
592
  mov  ebx,[esp+8-2]
580
  mov  ebx,[esp+8-2]
593
  mov  bx,[esp+12]
581
  mov  bx,[esp+12]
594
  mov  ecx,[esp+16]
582
  mov  ecx,[esp+16]
595
  or   ecx,0x80000000
583
  or   ecx,0x80000000
596
  mov  edx,[esp+20]
584
  mov  edx,[esp+20]
597
  int  0x40
585
  int  0x40
598
  ret
586
  ret
599
endp
587
endp
-
 
588
 
-
 
589
proc @Kolibri@PutImage$qpucllll uses ebx
-
 
590
  mov  eax,SF_PUT_IMAGE
-
 
591
  mov  ebx,[esp+8]
-
 
592
  mov  ecx,[esp+20-2]
-
 
593
  mov  cx,[esp+24]
-
 
594
  mov  edx,[esp+12-2]
-
 
595
  mov  dx,[esp+16]
-
 
596
  int  0x40
-
 
597
  ret
-
 
598
endp
600
 
599
 
601
proc @Kolibri@SetWindowCaption$qpxc uses ebx
600
proc @Kolibri@SetWindowCaption$qpxc uses ebx
602
  mov  eax,SF_SET_CAPTION
601
  mov  eax,SF_SET_CAPTION
603
  mov  ebx,2
602
  mov  ebx,2
604
  mov  ecx,[esp+8]
603
  mov  ecx,[esp+8]
605
  int  0x40
604
  int  0x40
606
  ret
605
  ret
607
endp
606
endp
608
 
607
 
609
proc @Kolibri@GetProcessInfo$qpuipct1t1piui uses ebx esi edi
608
proc @Kolibri@GetProcessInfo$qpuipct1t1piui uses ebx esi edi
610
  sub  esp,1024
609
  sub  esp,1024
611
  mov  eax,SF_THREAD_INFO
610
  mov  eax,SF_THREAD_INFO
612
  mov  ebx,esp
611
  mov  ebx,esp
613
  mov  ecx,[1024+12+24+esp]
612
  mov  ecx,[1024+12+24+esp]
614
  int  0x40
613
  int  0x40
615
  xor  edi,edi
614
  xor  edi,edi
616
  or   edi,[1024+12+4+esp]
615
  or   edi,[1024+12+4+esp]
617
  jz   .get_proc_info_no_usecpu
616
  jz   .get_proc_info_no_usecpu
618
  mov  ecx,[esp]
617
  mov  ecx,[esp]
619
  mov  [edi],ecx
618
  mov  [edi],ecx
620
  xor  edi,edi
619
  xor  edi,edi
621
.get_proc_info_no_usecpu:
620
.get_proc_info_no_usecpu:
622
  or   edi,[1024+12+8+esp]
621
  or   edi,[1024+12+8+esp]
623
  jz   .get_proc_info_no_name
622
  jz   .get_proc_info_no_name
624
  lea  esi,[esp+10]
623
  lea  esi,[esp+process_information.process_name]
625
  cld
624
  cld
626
  movsd
625
  movsd
627
  movsd
626
  movsd
628
  movsd
627
  movsd
629
  mov  byte [edi],0
628
  mov  byte [edi],0
630
  xor  edi,edi
629
  xor  edi,edi
631
.get_proc_info_no_name:
630
.get_proc_info_no_name:
632
  or   edi,[1024+12+12+esp]
631
  or   edi,[1024+12+12+esp]
633
  jz   .get_proc_info_no_mem
632
  jz   .get_proc_info_no_mem
634
  mov  ecx,[esp+26]
633
  mov  ecx,[esp+process_information.used_memory]
635
  mov  [edi],ecx
634
  mov  [edi],ecx
636
  xor  edi,edi
635
  xor  edi,edi
637
.get_proc_info_no_mem:
636
.get_proc_info_no_mem:
638
  or   edi,[1024+12+16+esp]
637
  or   edi,[1024+12+16+esp]
639
  jz   .get_proc_info_no_pid
638
  jz   .get_proc_info_no_pid
640
  mov  ecx,[esp+30]
639
  mov  ecx,[esp+process_information.PID]
641
  mov  [edi],ecx
640
  mov  [edi],ecx
642
  xor  edi,edi
641
  xor  edi,edi
643
.get_proc_info_no_pid:
642
.get_proc_info_no_pid:
644
  or   edi,[1024+12+20+esp]
643
  or   edi,[1024+12+20+esp]
645
  jz   .get_proc_info_no_rect
644
  jz   .get_proc_info_no_rect
646
  lea  esi,[esp+34]
645
  lea  esi,[esp+process_information.box]
647
  cld
646
  cld
648
  movsd
647
  movsd
649
  movsd
648
  movsd
650
  movsd
649
  movsd
651
  movsd
650
  movsd
652
  xor  edi,edi
651
  xor  edi,edi
653
.get_proc_info_no_rect:
652
.get_proc_info_no_rect:
654
  add  esp,1024
653
  add  esp,1024
655
  ret
654
  ret
656
endp
655
endp
657
 
656
 
658
proc @Kolibri@GetPid$qv uses ebx
657
proc @Kolibri@GetPid$qv uses ebx
659
  sub  esp,1024
658
  sub  esp,1024
660
  mov  eax,SF_THREAD_INFO
659
  mov  eax,SF_THREAD_INFO
661
  mov  ebx,esp
660
  mov  ebx,esp
662
  mov  ecx,-1
661
  mov  ecx,-1
663
  int  0x40
662
  int  0x40
664
  mov  eax,[esp+30]
663
  mov  eax,[esp+30]
665
  add  esp,1024
664
  add  esp,1024
666
  ret
665
  ret
667
endp
666
endp
668
 
667
 
669
proc @Kolibri@GetPid$qppv
668
proc @Kolibri@GetPid$qppv
670
  mov  ecx,[esp+4]
669
  mov  ecx,[esp+4]
671
  mov  eax,[ecx+KOLIBRI_THREAD_DATA_PID*4]
670
  mov  eax,[ecx+KOLIBRI_THREAD_DATA_PID*4]
672
  ret
671
  ret
673
endp
672
endp
674
 
673
 
675
proc @Kolibri@_HashByte$qui
674
proc @Kolibri@_HashByte$qui
676
@Kolibri@_HashWord$qui:
675
@Kolibri@_HashWord$qui:
677
@Kolibri@_HashDword$qui:
676
@Kolibri@_HashDword$qui:
678
  mov  eax,[esp+4]
677
  mov  eax,[esp+4]
679
Kolibri_HashInt:
678
Kolibri_HashInt:
680
  mul  dword [Kolibri_hash_int_val0]
679
  mul  dword [Kolibri_hash_int_val0]
681
  xor  eax,edx
680
  xor  eax,edx
682
  bswap eax
681
  bswap eax
683
  mul  dword [Kolibri_hash_int_val1]
682
  mul  dword [Kolibri_hash_int_val1]
684
  shrd eax,edx,14
683
  shrd eax,edx,14
685
  bswap eax
684
  bswap eax
686
  lea  eax,[eax+4*eax]
685
  lea  eax,[eax+4*eax]
687
  ror  eax,9
686
  ror  eax,9
688
  ret
687
  ret
689
endp
688
endp
690
 
689
 
691
if defined @Kolibri@_HashByte$qui | defined @Kolibri@_HashWord$qui | defined @Kolibri@_HashDword$qui
690
if defined @Kolibri@_HashByte$qui | defined @Kolibri@_HashWord$qui | defined @Kolibri@_HashDword$qui
692
Kolibri_hash_int_val0:
691
Kolibri_hash_int_val0:
693
  dd   0xA82F94C5
692
  dd   0xA82F94C5
694
Kolibri_hash_int_val1:
693
Kolibri_hash_int_val1:
695
  dd   0x9193780B
694
  dd   0x9193780B
696
end if
695
end if
697
 
696
 
698
proc @Kolibri@GetThreadData$qv
697
proc @Kolibri@GetThreadData$qv
699
  call @Kolibri@GetPid$qv
698
  call @Kolibri@GetPid$qv
700
  push eax
699
  push eax
701
  call @Kolibri@GetThreadData$qui
700
  call @Kolibri@GetThreadData$qui
702
  pop  ecx
701
  pop  ecx
703
  ret
702
  ret
704
endp
703
endp
705
 
704
 
706
proc @Kolibri@GetThreadData$qui
705
proc @Kolibri@GetThreadData$qui
707
  mov  eax,[esp+4]
706
  mov  eax,[esp+4]
708
  call Kolibri_HashInt
707
  call Kolibri_HashInt
709
  movzx eax,al
708
  movzx eax,al
710
  cmp  dword [@Kolibri@_ThreadScanCount+4],0
709
  cmp  dword [@Kolibri@_ThreadScanCount+4],0
711
  jnz  .get_thread_data_wait
710
  jnz  .get_thread_data_wait
712
.get_thread_data_nowait:
711
.get_thread_data_nowait:
713
  lock inc dword [@Kolibri@_ThreadScanCount]
712
  lock inc dword [@Kolibri@_ThreadScanCount]
714
  mov  eax,dword [@Kolibri@_ThreadTable+eax*4]
713
  mov  eax,dword [@Kolibri@_ThreadTable+eax*4]
715
  mov  ecx,[esp+4]
714
  mov  ecx,[esp+4]
716
  jmp  .get_thread_data_test
715
  jmp  .get_thread_data_test
717
.get_thread_data_loop:
716
.get_thread_data_loop:
718
  mov  eax,dword [eax+KOLIBRI_THREAD_DATA_NEXT*4]
717
  mov  eax,dword [eax+KOLIBRI_THREAD_DATA_NEXT*4]
719
.get_thread_data_test:
718
.get_thread_data_test:
720
  test eax,eax
719
  test eax,eax
721
  jz   .get_thread_data_end
720
  jz   .get_thread_data_end
722
  cmp  ecx,[eax+KOLIBRI_THREAD_DATA_PID*4]
721
  cmp  ecx,[eax+KOLIBRI_THREAD_DATA_PID*4]
723
  jnz  .get_thread_data_loop
722
  jnz  .get_thread_data_loop
724
.get_thread_data_end:
723
.get_thread_data_end:
725
  lock dec dword [@Kolibri@_ThreadScanCount]
724
  lock dec dword [@Kolibri@_ThreadScanCount]
726
  ret
725
  ret
727
.get_thread_data_wait:
726
.get_thread_data_wait:
728
  push eax ebx
727
  push eax ebx
729
  mov  eax,SF_SLEEP
728
  mov  eax,SF_SLEEP
730
  mov  ebx,1
729
  mov  ebx,1
731
.get_thread_data_wait_loop:
730
.get_thread_data_wait_loop:
732
  int  0x40
731
  int  0x40
733
  cmp  dword [@Kolibri@_ThreadScanCount+4],0
732
  cmp  dword [@Kolibri@_ThreadScanCount+4],0
734
  jz   .get_thread_data_wait_end
733
  jz   .get_thread_data_wait_end
735
  shl  ebx,1
734
  shl  ebx,1
736
  cmp  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
735
  cmp  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
737
  jna  .get_thread_data_wait_loop
736
  jna  .get_thread_data_wait_loop
738
  mov  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
737
  mov  ebx,KOLIBRI_MUTEX_MAX_TIME_WAIT
739
  jmp  .get_thread_data_wait_loop
738
  jmp  .get_thread_data_wait_loop
740
.get_thread_data_wait_end:
739
.get_thread_data_wait_end:
741
  pop  ebx eax
740
  pop  ebx eax
742
  jmp .get_thread_data_nowait
741
  jmp .get_thread_data_nowait
743
endp
742
endp
744
 
743
 
745
proc @Kolibri@_GetSkinHeader$qv uses ebx
744
proc @Kolibri@_GetSkinHeader$qv uses ebx
746
  mov  eax,SF_STYLE_SETTINGS
745
  mov  eax,SF_STYLE_SETTINGS
747
  mov  ebx,SSF_GET_SKIN_HEIGHT
746
  mov  ebx,SSF_GET_SKIN_HEIGHT
748
  int  0x40
747
  int  0x40
749
  ret
748
  ret
750
endp
749
endp
751
 
750
 
752
proc @Kolibri@GetScreenSize$qrust1
751
proc @Kolibri@GetScreenSize$qrust1
753
  mov  eax,SF_GET_SCREEN_SIZE
752
  mov  eax,SF_GET_SCREEN_SIZE
754
  int  0x40
753
  int  0x40
755
  mov  ecx,[esp+8]
754
  mov  ecx,[esp+8]
756
  mov  word [ecx],ax
755
  mov  word [ecx],ax
757
  mov  ecx,[esp+4]
756
  mov  ecx,[esp+4]
758
  shr  eax,16
757
  shr  eax,16
759
  mov  word [ecx],ax
758
  mov  word [ecx],ax
760
  ret
759
  ret
761
endp
760
endp
762
 
761
 
763
proc Kolibri_MutexLockNoWait
762
proc Kolibri_MutexLockNoWait
764
  pop  eax
763
  pop  eax
765
  xor  al,al
764
  xor  al,al
766
  ret
765
  ret
767
endp
766
endp
768
 
767
 
769
proc Kolibri_MutexLockWait uses ebx
768
proc Kolibri_MutexLockWait uses ebx
770
  mov  eax,SF_SLEEP
769
  mov  eax,SF_SLEEP
771
  xor  ebx,ebx
770
  xor  ebx,ebx
772
.lock_wait_cycle:
771
.lock_wait_cycle:
773
  int  0x40
772
  int  0x40
774
  shl  byte [ecx],1
773
  shl  byte [ecx],1
775
  jz   .lock_wait_cycle
774
  jz   .lock_wait_cycle
776
  mov  al,1
775
  mov  al,1
777
  ret
776
  ret
778
endp
777
endp
779
 
778
 
780
proc Kolibri_MutexLockWaitTime
779
proc Kolibri_MutexLockWaitTime
781
  cmp  dword [esp+12],0
780
  cmp  dword [esp+12],0
782
  jng  .MutexLockWait
781
  jng  .MutexLockWait
783
  push ebx edx
782
  push ebx edx
784
  mov  edx,[esp+20]
783
  mov  edx,[esp+20]
785
  mov  eax,SF_SYSTEM_GET
784
  mov  eax,SF_SYSTEM_GET
786
  mov  ebx,SSF_TIME_COUNT
785
  mov  ebx,SSF_TIME_COUNT
787
  int  0x40
786
  int  0x40
788
  add  edx,eax
787
  add  edx,eax
789
.lock_wait_time_cycle:
788
.lock_wait_time_cycle:
790
  mov  eax,SF_SLEEP
789
  mov  eax,SF_SLEEP
791
  xor  ebx,ebx
790
  xor  ebx,ebx
792
  int  0x40
791
  int  0x40
793
  shl  byte [ecx],1
792
  shl  byte [ecx],1
794
  jnz  .lock_wait_time_ret_true
793
  jnz  .lock_wait_time_ret_true
795
  mov  eax,SF_SYSTEM_GET
794
  mov  eax,SF_SYSTEM_GET
796
  mov  ebx,SSF_TIME_COUNT
795
  mov  ebx,SSF_TIME_COUNT
797
  int  0x40
796
  int  0x40
798
  cmp  eax,edx
797
  cmp  eax,edx
799
  js   .lock_wait_time_cycle
798
  js   .lock_wait_time_cycle
800
  pop  edx ebx eax
799
  pop  edx ebx eax
801
  xor  al,al
800
  xor  al,al
802
  ret
801
  ret
803
.lock_wait_time_ret_true:
802
.lock_wait_time_ret_true:
804
  pop  edx ebx
803
  pop  edx ebx
805
  mov  al,1
804
  mov  al,1
806
  ret
805
  ret
807
endp
806
endp
808
 
807
 
809
proc Kolibri_MutexLock
808
proc Kolibri_MutexLock
810
  shl  byte [ecx],1
809
  shl  byte [ecx],1
811
  jnz  .lock_first
810
  jnz  .lock_first
812
  call eax
811
  call eax
813
.lock_first:
812
.lock_first:
814
  mov  al,1
813
  mov  al,1
815
  ret
814
  ret
816
endp
815
endp
817
 
816
 
818
proc @Kolibri@TryLock$qp14Kolibri@TMutex
817
proc @Kolibri@TryLock$qp14Kolibri@TMutex
819
  mov  eax,Kolibri_MutexLockNoWait
818
  mov  eax,Kolibri_MutexLockNoWait
820
  mov  ecx,[esp+4]
819
  mov  ecx,[esp+4]
821
  jmp  Kolibri_MutexLock
820
  jmp  Kolibri_MutexLock
822
endp
821
endp
823
 
822
 
824
proc @Kolibri@Lock$qp14Kolibri@TMutex
823
proc @Kolibri@Lock$qp14Kolibri@TMutex
825
  mov  eax,Kolibri_MutexLockWait
824
  mov  eax,Kolibri_MutexLockWait
826
  mov  ecx,[esp+4]
825
  mov  ecx,[esp+4]
827
  jmp  Kolibri_MutexLock
826
  jmp  Kolibri_MutexLock
828
endp
827
endp
829
 
828
 
830
proc @Kolibri@LockTime$qp14Kolibri@TMutexi
829
proc @Kolibri@LockTime$qp14Kolibri@TMutexi
831
  mov  eax,Kolibri_MutexLockWaitTime
830
  mov  eax,Kolibri_MutexLockWaitTime
832
  mov  ecx,[esp+4]
831
  mov  ecx,[esp+4]
833
  jmp  Kolibri_MutexLock
832
  jmp  Kolibri_MutexLock
834
endp
833
endp
835
 
834
 
836
proc @Kolibri@UnLock$qp14Kolibri@TMutex
835
proc @Kolibri@UnLock$qp14Kolibri@TMutex
837
  mov  ecx,[esp+4]
836
  mov  ecx,[esp+4]
838
  shr  byte [ecx],1
837
  shr  byte [ecx],1
839
  jz   .unlock_pause
838
  jz   .unlock_pause
840
  ret
839
  ret
841
.unlock_pause:
840
.unlock_pause:
842
  mov  byte [ecx],0x40
841
  mov  byte [ecx],0x40
843
  push ebx
842
  push ebx
844
  mov  eax,SF_SLEEP
843
  mov  eax,SF_SLEEP
845
  xor  ebx,ebx
844
  xor  ebx,ebx
846
  int  0x40
845
  int  0x40
847
  pop  ebx
846
  pop  ebx
848
  ret
847
  ret
849
endp
848
endp
850
 
849
 
851
proc Kolibri_MutexLockRec
850
proc Kolibri_MutexLockRec
852
  shl  byte [ecx],1
851
  shl  byte [ecx],1
853
  jng  .lock_first
852
  jng  .lock_first
854
  cmp  dword [ecx+4],edx
853
  cmp  dword [ecx+4],edx
855
  jz   .lock_rec_self
854
  jz   .lock_rec_self
856
  call eax
855
  call eax
857
.lock_rec_first:
856
.lock_rec_first:
858
  mov  al,1
857
  mov  al,1
859
  mov  dword [ecx+4],edx
858
  mov  dword [ecx+4],edx
860
  ret
859
  ret
861
.lock_rec_self:
860
.lock_rec_self:
862
  mov  al,1
861
  mov  al,1
863
  add  dword [ecx],0x100
862
  add  dword [ecx],0x100
864
  jc   .lock_rec_overflow
863
  jc   .lock_rec_overflow
865
  ret
864
  ret
866
.lock_rec_overflow:
865
.lock_rec_overflow:
867
  push dword [@Kolibri@DebugPrefix]
866
  push dword [@Kolibri@DebugPrefix]
868
  call @Kolibri@DebugPutString$qpxc
867
  call @Kolibri@DebugPutString$qpxc
869
  mov  dword [esp],Kolibri_try_lock_rec_overflow_string
868
  mov  dword [esp],Kolibri_try_lock_rec_overflow_string
870
  call @Kolibri@DebugPutString$qpxc
869
  call @Kolibri@DebugPutString$qpxc
871
  pop  ecx
870
  pop  ecx
872
  jmp  @Kolibri@ExitDebug$qv
871
  jmp  @Kolibri@ExitDebug$qv
873
endp
872
endp
874
 
873
 
875
proc @Kolibri@TryLock$qp16Kolibri@TRecMutexui
874
proc @Kolibri@TryLock$qp16Kolibri@TRecMutexui
876
  mov  eax,Kolibri_MutexLockNoWait
875
  mov  eax,Kolibri_MutexLockNoWait
877
  mov  ecx,[esp+4]
876
  mov  ecx,[esp+4]
878
  mov  edx,[esp+8]
877
  mov  edx,[esp+8]
879
  jmp  Kolibri_MutexLockRec
878
  jmp  Kolibri_MutexLockRec
880
endp
879
endp
881
 
880
 
882
proc @Kolibri@Lock$qp16Kolibri@TRecMutexui
881
proc @Kolibri@Lock$qp16Kolibri@TRecMutexui
883
  mov  eax,Kolibri_MutexLockWait
882
  mov  eax,Kolibri_MutexLockWait
884
  mov  ecx,[esp+4]
883
  mov  ecx,[esp+4]
885
  mov  edx,[esp+8]
884
  mov  edx,[esp+8]
886
  jmp  Kolibri_MutexLockRec
885
  jmp  Kolibri_MutexLockRec
887
endp
886
endp
888
 
887
 
889
proc @Kolibri@LockTime$qp16Kolibri@TRecMutexiui
888
proc @Kolibri@LockTime$qp16Kolibri@TRecMutexiui
890
  mov  eax,Kolibri_MutexLockWaitTime
889
  mov  eax,Kolibri_MutexLockWaitTime
891
  mov  ecx,[esp+4]
890
  mov  ecx,[esp+4]
892
  mov  edx,[esp+12]
891
  mov  edx,[esp+12]
893
  jmp  Kolibri_MutexLockRec
892
  jmp  Kolibri_MutexLockRec
894
endp
893
endp
895
 
894
 
896
proc @Kolibri@UnLock$qp16Kolibri@TRecMutexui
895
proc @Kolibri@UnLock$qp16Kolibri@TRecMutexui
897
  mov  ecx,[esp+4]
896
  mov  ecx,[esp+4]
898
  mov  edx,[esp+8]
897
  mov  edx,[esp+8]
899
  cmp  dword [ecx+4],edx
898
  cmp  dword [ecx+4],edx
900
  jnz  .unlock_rec_notlocked
899
  jnz  .unlock_rec_notlocked
901
  sub  dword [ecx],0x100
900
  sub  dword [ecx],0x100
902
  jnc  .unlock_rec_end
901
  jnc  .unlock_rec_end
903
  add dword [ecx],0x100
902
  add dword [ecx],0x100
904
  shl byte [ecx],1
903
  shl byte [ecx],1
905
  shr byte [ecx],2
904
  shr byte [ecx],2
906
  jng  .unlock_rec_pause
905
  jng  .unlock_rec_pause
907
.unlock_rec_end:
906
.unlock_rec_end:
908
  ret
907
  ret
909
.unlock_rec_pause:
908
.unlock_rec_pause:
910
  mov  byte [ecx],0x20
909
  mov  byte [ecx],0x20
911
  push ebx
910
  push ebx
912
  mov  eax,SF_SLEEP
911
  mov  eax,SF_SLEEP
913
  xor  ebx,ebx
912
  xor  ebx,ebx
914
  int  0x40
913
  int  0x40
915
  pop  ebx
914
  pop  ebx
916
  ret
915
  ret
917
.unlock_rec_notlocked:
916
.unlock_rec_notlocked:
918
  push dword [@Kolibri@DebugPrefix]
917
  push dword [@Kolibri@DebugPrefix]
919
  call @Kolibri@DebugPutString$qpxc
918
  call @Kolibri@DebugPutString$qpxc
920
  mov  dword [esp],Kolibri_unlock_rec_notlocked_string
919
  mov  dword [esp],Kolibri_unlock_rec_notlocked_string
921
  call @Kolibri@DebugPutString$qpxc
920
  call @Kolibri@DebugPutString$qpxc
922
  pop  ecx
921
  pop  ecx
923
  jmp  @Kolibri@ExitDebug$qv
922
  jmp  @Kolibri@ExitDebug$qv
924
endp
923
endp
925
 
924
 
926
proc @Kolibri@DebugPutChar$qc
925
proc @Kolibri@DebugPutChar$qc
927
  mov  cl,byte [esp+4]
926
  mov  cl,byte [esp+4]
928
  cmp  cl,13
927
  cmp  cl,13
929
  jz   .debug_put_char_ret
928
  jz   .debug_put_char_ret
930
  push ebx
929
  push ebx
931
  cmp  cl,10
930
  cmp  cl,10
932
  jz   .debug_put_char_enter
931
  jz   .debug_put_char_enter
933
.debug_put_char_after_cmp:
932
.debug_put_char_after_cmp:
934
  mov  eax,SF_BOARD
933
  mov  eax,SF_BOARD
935
  mov  ebx,SSF_DEBUG_WRITE
934
  mov  ebx,SSF_DEBUG_WRITE
936
  int  0x40
935
  int  0x40
937
  pop  ebx
936
  pop  ebx
938
.debug_put_char_ret:
937
.debug_put_char_ret:
939
  ret
938
  ret
940
.debug_put_char_enter:
939
.debug_put_char_enter:
941
  mov  cl,13
940
  mov  cl,13
942
  mov  eax,SF_BOARD
941
  mov  eax,SF_BOARD
943
  mov  ebx,SSF_DEBUG_WRITE
942
  mov  ebx,SSF_DEBUG_WRITE
944
  int  0x40
943
  int  0x40
945
  mov  cl,10
944
  mov  cl,10
946
  jmp  .debug_put_char_after_cmp
945
  jmp  .debug_put_char_after_cmp
947
endp
946
endp
948
 
947
 
949
proc @Kolibri@DebugPutString$qpxc uses esi
948
proc @Kolibri@DebugPutString$qpxc uses esi
950
  push dword 0
949
  push dword 0
951
  mov  esi,dword [esp+12]
950
  mov  esi,dword [esp+12]
952
  jmp  .debug_put_string_test
951
  jmp  .debug_put_string_test
953
.debug_put_string_loop:
952
.debug_put_string_loop:
954
  mov  dword [esp],eax
953
  mov  dword [esp],eax
955
  call @Kolibri@DebugPutChar$qc
954
  call @Kolibri@DebugPutChar$qc
956
  inc  esi
955
  inc  esi
957
.debug_put_string_test:
956
.debug_put_string_test:
958
  xor  eax,eax
957
  xor  eax,eax
959
  or   al,[esi]
958
  or   al,[esi]
960
  test al,al
959
  test al,al
961
  jnz  .debug_put_string_loop
960
  jnz  .debug_put_string_loop
962
  pop  ecx
961
  pop  ecx
963
  ret
962
  ret
964
endp
963
endp
965
 
964
 
966
proc @Kolibri@GetKey$qv
965
proc @Kolibri@GetKey$qv
967
  mov  eax,SF_GET_KEY
966
  mov  eax,SF_GET_KEY
968
  int  0x40
967
  int  0x40
969
  test al,al
968
  test al,al
970
  jnz  .get_key_eof
969
  jnz  .get_key_eof
971
  movzx eax,ah
970
  movzx eax,ah
972
  ret
971
  ret
973
.get_key_eof:
972
.get_key_eof:
974
  mov  eax,SF_TERMINATE_PROCESS
973
  mov  eax,SF_TERMINATE_PROCESS
975
  ret
974
  ret
976
endp
975
endp
977
 
976
 
978
proc @Kolibri@GetMouseButton$qv uses ebx
977
proc @Kolibri@GetMouseButton$qv uses ebx
979
  mov  eax,SF_MOUSE_GET
978
  mov  eax,SF_MOUSE_GET
980
  mov  ebx,SSF_BUTTON
979
  mov  ebx,SSF_BUTTON
981
  int  0x40
980
  int  0x40
982
  ret
981
  ret
983
endp
982
endp
984
 
983
 
985
proc @Kolibri@GetMousePosition$qrst1o uses ebx
984
proc @Kolibri@GetMousePosition$qrst1o uses ebx
986
  mov  eax,SF_MOUSE_GET
985
  mov  eax,SF_MOUSE_GET
987
  xor  ebx,ebx ;SSF_SCREEN_POSITION
986
  xor  ebx,ebx ;SSF_SCREEN_POSITION
988
  cmp  byte [esp+16],0
987
  cmp  byte [esp+16],0
989
  jnz  .get_mouse_pos_absolute
988
  jnz  .get_mouse_pos_absolute
990
  inc  ebx
989
  inc  ebx
991
.get_mouse_pos_absolute:
990
.get_mouse_pos_absolute:
992
  int  0x40
991
  int  0x40
993
  mov  ecx,[esp+12]
992
  mov  ecx,[esp+12]
994
  mov  word [ecx],ax
993
  mov  word [ecx],ax
995
  mov  ecx,[esp+8]
994
  mov  ecx,[esp+8]
996
  shr  eax,16
995
  shr  eax,16
997
  mov  word [ecx],ax
996
  mov  word [ecx],ax
998
  ret
997
  ret
999
endp
998
endp
1000
 
999
 
1001
proc @Kolibri@WasThreadCreated$qv
1000
proc @Kolibri@WasThreadCreated$qv
1002
  cmp  byte [@Kolibri@_ThreadSavedBegProc],0x90
1001
  cmp  byte [@Kolibri@_ThreadSavedBegProc],0x90
1003
  setz al
1002
  setz al
1004
  ret
1003
  ret
1005
endp
1004
endp
1006
 
1005
 
1007
proc @Kolibri@CreateThread$qpvuit1
1006
proc @Kolibri@CreateThread$qpvuit1
1008
  push ebx
1007
  push ebx
1009
  mov  edx,[esp+16]
1008
  mov  edx,[esp+16]
1010
  mov  ebx,[esp+12]
1009
  mov  ebx,[esp+12]
1011
  test edx,edx
1010
  test edx,edx
1012
  jnz  .create_thread_after_new
1011
  jnz  .create_thread_after_new
1013
if defined KolibriHeapAlloc
1012
if defined KolibriHeapAlloc
1014
  cmp  ebx,4096
1013
  cmp  ebx,4096
1015
  jnb  .create_thread_alloc
1014
  jnb  .create_thread_alloc
1016
  mov  ebx,STACKSIZE
1015
  mov  ebx,STACKSIZE
1017
.create_thread_alloc:
1016
.create_thread_alloc:
1018
  push ebx
1017
  push ebx
1019
  call KolibriHeapAlloc	 ; Create new dynamic memory of the given size
1018
  call KolibriHeapAlloc	 ; Create new dynamic memory of the given size
1020
  pop  ecx
1019
  pop  ecx
1021
  test eax,eax
1020
  test eax,eax
1022
  jnz  .create_thread_mem_created
1021
  jnz  .create_thread_mem_created
1023
end if
1022
end if
1024
  or   eax,-1
1023
  or   eax,-1
1025
  jmp  .create_thread_end
1024
  jmp  .create_thread_end
1026
.create_thread_mem_created:
1025
.create_thread_mem_created:
1027
  lea  edx,[eax+ebx]
1026
  lea  edx,[eax+ebx]
1028
.create_thread_after_new:
1027
.create_thread_after_new:
1029
  neg  ebx
1028
  neg  ebx
1030
  jz   .create_thread_test_first
1029
  jz   .create_thread_test_first
1031
  add  ebx,edx
1030
  add  ebx,edx
1032
.create_thread_test_first:
1031
.create_thread_test_first:
1033
  cmp  byte [@Kolibri@_ThreadSavedBegProc],0x90
1032
  cmp  byte [@Kolibri@_ThreadSavedBegProc],0x90
1034
  jnz  .create_thread_init
1033
  jnz  .create_thread_init
1035
.create_thread_fill_stack:
1034
.create_thread_fill_stack:
1036
  lock inc dword [@Kolibri@_ThreadNumber]
1035
  lock inc dword [@Kolibri@_ThreadNumber]
1037
  and  edx,not 3
1036
  and  edx,not 3
1038
  sub  edx,12
1037
  sub  edx,12
1039
  mov  ecx,[esp+8]
1038
  mov  ecx,[esp+8]
1040
  mov  dword [edx+8],ebx
1039
  mov  dword [edx+8],ebx
1041
  mov  dword [edx+4],ecx
1040
  mov  dword [edx+4],ecx
1042
  mov  dword [edx],Kolibri_ThreadFinish
1041
  mov  dword [edx],Kolibri_ThreadFinish
1043
  mov  eax,SF_CREATE_THREAD
1042
  mov  eax,SF_CREATE_THREAD
1044
  mov  ebx,1
1043
  mov  ebx,1
1045
  mov  ecx,@Kolibri@ThreadMain$qpvt1
1044
  mov  ecx,@Kolibri@ThreadMain$qpvt1
1046
  int  0x40
1045
  int  0x40
1047
  mov  ebx,eax
1046
  mov  ebx,eax
1048
  or   bl,15
1047
  or   bl,15
1049
  inc  ebx
1048
  inc  ebx
1050
  jnz  .create_thread_end
1049
  jnz  .create_thread_end
1051
  lock dec dword [@Kolibri@_ThreadNumber]
1050
  lock dec dword [@Kolibri@_ThreadNumber]
1052
if defined KolibriHeapFree
1051
if defined KolibriHeapFree
1053
  or   ebx,[edx+8]
1052
  or   ebx,[edx+8]
1054
  jz   .create_thread_end
1053
  jz   .create_thread_end
1055
  push ebx
1054
  push ebx
1056
  call KolibriHeapFree	; Delete the given dynamic memory
1055
  call KolibriHeapFree	; Delete the given dynamic memory
1057
  pop  ecx
1056
  pop  ecx
1058
end if
1057
end if
1059
.create_thread_end:
1058
.create_thread_end:
1060
  pop  ebx
1059
  pop  ebx
1061
  ret
1060
  ret
1062
.create_thread_init:
1061
.create_thread_init:
1063
  push esi edi
1062
  push esi edi
1064
  cld
1063
  cld
1065
  mov  esi,@Kolibri@_ThreadSavedBegProc
1064
  mov  esi,@Kolibri@_ThreadSavedBegProc
1066
  mov  edi,@Kolibri@GetPid$qv
1065
  mov  edi,@Kolibri@GetPid$qv
1067
  movsd
1066
  movsd
1068
  movsd
1067
  movsd
1069
  mov  edi,@Kolibri@GetThreadData$qv
1068
  mov  edi,@Kolibri@GetThreadData$qv
1070
  movsd
1069
  movsd
1071
  movsd
1070
  movsd
1072
  mov  eax,0x90909090
1071
  mov  eax,0x90909090
1073
  mov  edi,@Kolibri@_ThreadSavedBegProc
1072
  mov  edi,@Kolibri@_ThreadSavedBegProc
1074
  stosd
1073
  stosd
1075
  stosd
1074
  stosd
1076
  stosd
1075
  stosd
1077
  stosd
1076
  stosd
1078
  pop  edi esi
1077
  pop  edi esi
1079
  jmp  .create_thread_fill_stack
1078
  jmp  .create_thread_fill_stack
1080
endp
1079
endp
1081
 
1080
 
1082
proc @Kolibri@_FileAccess$qp21Kolibri@FileInfoBlock uses ebx
1081
proc @Kolibri@_FileAccess$qp21Kolibri@FileInfoBlock uses ebx
1083
  mov  eax,SF_FILE
1082
  mov  eax,SF_FILE
1084
  mov  ebx,[esp+8]
1083
  mov  ebx,[esp+8]
1085
  int  0x40
1084
  int  0x40
1086
  mov  ecx,[esp+8]
1085
  mov  ecx,[esp+8]
1087
  mov  [ecx],ebx
1086
  mov  [ecx],ebx
1088
  ret
1087
  ret
1089
endp
1088
endp
1090
 
1089
 
1091
if defined Kolibri_debug_string
1090
if defined Kolibri_debug_string
1092
Kolibri_debug_string:
1091
Kolibri_debug_string:
1093
  db 'Abnormal program termination.',10,0
1092
  db 'Abnormal program termination.',10,0
1094
end if
1093
end if
1095
 
1094
 
1096
if defined Kolibri_MutexLockRec
1095
if defined Kolibri_MutexLockRec
1097
Kolibri_try_lock_rec_overflow_string:
1096
Kolibri_try_lock_rec_overflow_string:
1098
  db 'Recursive mutex lock count overflow.',10,0
1097
  db 'Recursive mutex lock count overflow.',10,0
1099
end if
1098
end if
1100
 
1099
 
1101
if defined @Kolibri@UnLock$qp16Kolibri@TRecMutexui
1100
if defined @Kolibri@UnLock$qp16Kolibri@TRecMutexui
1102
Kolibri_unlock_rec_notlocked_string:
1101
Kolibri_unlock_rec_notlocked_string:
1103
  db 'Recursive mutex unlock error.',10,0
1102
  db 'Recursive mutex unlock error.',10,0
1104
end if
1103
end if
1105
 
1104
 
1106
include "kos_lib.inc"
1105
include "kos_lib.inc"
1107
 
1106
 
1108
;/**/
1107
;/**/