Subversion Repositories Kolibri OS

Rev

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

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