Subversion Repositories Kolibri OS

Rev

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

Rev 759 Rev 769
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;                                                              ;;
6
;;                                                              ;;
7
;;  MenuetOS process management, protected ring3                ;;
7
;;  MenuetOS process management, protected ring3                ;;
8
;;                                                              ;;
8
;;                                                              ;;
9
;;  Distributed under GPL. See file COPYING for details.        ;;
9
;;  Distributed under GPL. See file COPYING for details.        ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
11
;;                                                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
 
13
 
14
$Revision: 759 $
14
$Revision: 769 $
15
 
15
 
16
 
16
 
17
align 4
17
align 4
18
idtreg:
18
idtreg:
19
     dw   8*0x41-1
19
     dw   8*0x41-1
20
     dd   idts+8
20
     dd   idts+8
21
 
21
 
22
build_interrupt_table:
22
build_interrupt_table:
23
 
23
 
24
	mov    edi, idts+8
24
	mov    edi, idts+8
25
	mov    esi, sys_int
25
	mov    esi, sys_int
26
	mov    ecx, 0x40
26
	mov    ecx, 0x40
27
     @@:
27
     @@:
28
	lodsd
28
	lodsd
29
	mov    [edi],	ax	     ; lower part of offset
29
	mov    [edi],	ax	     ; lower part of offset
30
	mov    [edi+2], word os_code ; segment selector
30
	mov    [edi+2], word os_code ; segment selector
31
	mov	ax, word 10001110b shl 8	; type: interrupt gate
31
	mov	ax, word 10001110b shl 8	; type: interrupt gate
32
	mov	[edi+4], eax
32
	mov	[edi+4], eax
33
	add    edi, 8
33
	add    edi, 8
34
	loop	@b
34
	loop	@b
35
 
35
 
36
	;mov    edi,8*0x40+idts+8
36
	;mov    edi,8*0x40+idts+8
37
	mov	dword [edi], (i40 and 0xFFFF) or (os_code shl 16)
37
	mov	dword [edi], (i40 and 0xFFFF) or (os_code shl 16)
38
	mov	dword [edi+4], (11101111b shl 8) or (i40 and 0xFFFF0000)
38
	mov	dword [edi+4], (11101111b shl 8) or (i40 and 0xFFFF0000)
39
						; type: trap gate
39
						; type: trap gate
40
	ret
40
	ret
41
 
41
 
42
iglobal
42
iglobal
43
 
43
 
44
  msg_sel_ker	db "kernel", 0
44
  msg_sel_ker	db "kernel", 0
45
  msg_sel_app	db "application", 0
45
  msg_sel_app	db "application", 0
46
 
46
 
47
  sys_int:
47
  sys_int:
48
    dd e0,debug_exc,e2,e3
48
    dd e0,debug_exc,e2,e3
49
    dd e4,e5,e6,e7
49
    dd e4,e5,e6,e7
50
    dd e8,e9,e10,e11
50
    dd e8,e9,e10,e11
51
    dd e12,e13,page_fault_handler,e15
51
    dd e12,e13,page_fault_handler,e15
52
 
52
 
53
    dd except_16, e17,e18, except_19
53
    dd except_16, e17,e18, except_19
54
    times 12 dd unknown_interrupt
54
    times 12 dd unknown_interrupt
55
 
55
 
56
    dd	 irq0, irq_serv.irq_1, p_irq2
56
    dd	 irq0, irq_serv.irq_1, p_irq2
57
if USE_COM_IRQ
57
if USE_COM_IRQ
58
    dd	 irq_serv.irq_3, irq_serv.irq_4
58
    dd	 irq_serv.irq_3, irq_serv.irq_4
59
else
59
else
60
    dd	 p_irq3, p_irq4
60
    dd	 p_irq3, p_irq4
61
end if
61
end if
62
    dd	 irq_serv.irq_5,  p_irq6,	  irq_serv.irq_7
62
    dd	 irq_serv.irq_5,  p_irq6,	  irq_serv.irq_7
63
    dd	 irq_serv.irq_8,  irq_serv.irq_9, irq_serv.irq_10
63
    dd	 irq_serv.irq_8,  irq_serv.irq_9, irq_serv.irq_10
64
    dd	 irq_serv.irq_11, irq_serv.irq_12,irqD ,p_irq14,p_irq15
64
    dd	 irq_serv.irq_11, irq_serv.irq_12,irqD ,p_irq14,p_irq15
65
 
65
 
66
    times 16 dd unknown_interrupt
66
    times 16 dd unknown_interrupt
67
 
67
 
68
    dd	 i40
68
    dd	 i40
69
endg
69
endg
70
 
70
 
71
macro save_ring3_context
71
macro save_ring3_context
72
{
72
{
73
    pushad
73
    pushad
74
}
74
}
75
macro restore_ring3_context
75
macro restore_ring3_context
76
{
76
{
77
    popad
77
    popad
78
}
78
}
79
 
79
 
80
; simply return control to interrupted process
80
; simply return control to interrupted process
81
unknown_interrupt:
81
unknown_interrupt:
82
     iret
82
     iret
83
 
83
 
84
macro exc_wo_code [num]
84
macro exc_wo_code [num]
85
{
85
{
86
  forward
86
  forward
87
  e#num :
87
  e#num :
88
      save_ring3_context
88
      save_ring3_context
89
      mov bl, num
89
      mov bl, num
90
      jmp exc_c
90
      jmp exc_c
91
}
91
}
92
 
92
 
93
macro exc_w_code [num]
93
macro exc_w_code [num]
94
{
94
{
95
  forward
95
  forward
96
  e#num :
96
  e#num :
97
      add esp, 4
97
      add esp, 4
98
      save_ring3_context
98
      save_ring3_context
99
      mov bl, num
99
      mov bl, num
100
      jmp exc_c
100
      jmp exc_c
101
}
101
}
102
 
102
 
103
exc_wo_code 0, 2, 3, 4, 5, 6, 9, 15, 18
103
exc_wo_code 0, 2, 3, 4, 5, 6, 9, 15, 18
104
exc_w_code 8, 10, 11, 12, 13, 14, 17
104
exc_w_code 8, 10, 11, 12, 13, 14, 17
105
 
105
 
106
exc_c:
106
exc_c:
107
	mov   ax, app_data  ;èñêëþ÷åíèå
107
	mov   ax, app_data  ;èñêëþ÷åíèå
108
	mov   ds, ax	    ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
108
	mov   ds, ax	    ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
109
	mov   es, ax	    ;â ðåãèñòðû
109
	mov   es, ax	    ;â ðåãèñòðû
110
 
110
 
111
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
111
; redirect to V86 manager? (EFLAGS & 0x20000) != 0?
112
	test	byte [esp+20h+8+2], 2
112
	test	byte [esp+20h+8+2], 2
113
	jnz	v86_exc_c
113
	jnz	v86_exc_c
114
 
114
 
115
; test if debugging
115
; test if debugging
116
	cli
116
	cli
117
	mov   eax, [current_slot]
117
	mov   eax, [current_slot]
118
	mov   eax, [eax+APPDATA.debugger_slot]
118
	mov   eax, [eax+APPDATA.debugger_slot]
119
	test  eax, eax
119
	test  eax, eax
120
	jnz   .debug
120
	jnz   .debug
121
	sti
121
	sti
122
; not debuggee => say error and terminate
122
; not debuggee => say error and terminate
123
	movzx eax, bl
123
	movzx eax, bl
124
	mov   [error_interrupt], eax
124
	mov   [error_interrupt], eax
125
	call  show_error_parameters
125
	call  show_error_parameters
126
	add   esp, 0x20
126
	add   esp, 0x20
127
	mov   edx, [TASK_BASE]
127
	mov   edx, [TASK_BASE]
128
	mov   [edx + TASKDATA.state], byte 4
128
	mov   [edx + TASKDATA.state], byte 4
129
 
129
 
130
	jmp   change_task
130
	jmp   change_task
131
 
131
 
132
.debug:
132
.debug:
133
; we are debugged process, notify debugger and suspend ourself
133
; we are debugged process, notify debugger and suspend ourself
134
; eax=debugger PID
134
; eax=debugger PID
135
	cld
135
	cld
136
	movzx ecx, bl
136
	movzx ecx, bl
137
	push  ecx
137
	push  ecx
138
	mov   ecx, [TASK_BASE]
138
	mov   ecx, [TASK_BASE]
139
	push  dword [ecx+TASKDATA.pid]	  ; PID of current process
139
	push  dword [ecx+TASKDATA.pid]	  ; PID of current process
140
	push  12
140
	push  12
141
	pop   ecx
141
	pop   ecx
142
	push  1        ; 1=exception
142
	push  1        ; 1=exception
143
	call  debugger_notify
143
	call  debugger_notify
144
	pop   ecx
144
	pop   ecx
145
	pop   ecx
145
	pop   ecx
146
	pop   ecx
146
	pop   ecx
147
	mov   edx, [TASK_BASE]
147
	mov   edx, [TASK_BASE]
148
	mov   byte [edx+TASKDATA.state], 1	  ; suspended
148
	mov   byte [edx+TASKDATA.state], 1	  ; suspended
149
	call  change_task
149
	call  change_task
150
	restore_ring3_context
150
	restore_ring3_context
151
	iretd
151
	iretd
152
 
152
 
153
iglobal
153
iglobal
154
	hexletters	db '0123456789ABCDEF'
154
	hexletters	db '0123456789ABCDEF'
155
	error_interrupt dd  -1
155
	error_interrupt dd  -1
156
endg
156
endg
157
 
157
 
158
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
158
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
159
show_error_parameters:
159
show_error_parameters:
160
    mov eax,[CURRENT_TASK]
160
    mov eax,[CURRENT_TASK]
161
    shl eax, 5
161
    shl eax, 5
162
    DEBUGF  1, "K : Process - forced terminate PID: %x\n", [CURRENT_TASK + TASKDATA.pid + eax]
162
    DEBUGF  1, "K : Process - forced terminate PID: %x\n", [CURRENT_TASK + TASKDATA.pid + eax]
163
    DEBUGF  1, "K : Exception : %x Error : xxxxxxxx\n", [error_interrupt]
163
    DEBUGF  1, "K : Exception : %x Error : xxxxxxxx\n", [error_interrupt]
164
    DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [esp + 0x20], [esp - 12 + 0x20], [esp - 4 + 0x20]
164
    DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [esp + 0x20], [esp - 12 + 0x20], [esp - 4 + 0x20]
165
    DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [esp - 8 + 0x20], [esp - 24 + 0x20], [esp - 28 + 0x20]
165
    DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [esp - 8 + 0x20], [esp - 24 + 0x20], [esp - 28 + 0x20]
166
    DEBUGF  1, "K : EBP : %x EIP : %x ", [esp - 20 + 0x20], [esp + 4 + 0x20]
166
    DEBUGF  1, "K : EBP : %x EIP : %x ", [esp - 20 + 0x20], [esp + 4 + 0x20]
167
 
167
 
168
    mov eax, [esp + 8 + 0x20]
168
    mov eax, [esp + 8 + 0x20]
169
    mov edi, msg_sel_app
169
    mov edi, msg_sel_app
170
    mov ebx, [esp + 16 + 0x20]
170
    mov ebx, [esp + 16 + 0x20]
171
    cmp eax, app_code
171
    cmp eax, app_code
172
    je	@f
172
    je	@f
173
    mov edi, msg_sel_ker
173
    mov edi, msg_sel_ker
174
    mov ebx, [esp - 16 + 0x20]
174
    mov ebx, [esp - 16 + 0x20]
175
@@:
175
@@:
176
    DEBUGF  1, "ESP : %x\nK : Flags : %x CS : %x (%s)\n", ebx, [esp + 12 + 0x20], eax, edi
176
    DEBUGF  1, "ESP : %x\nK : Flags : %x CS : %x (%s)\n", ebx, [esp + 12 + 0x20], eax, edi
177
    ret
177
    ret
178
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
178
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
179
 
179
 
180
 
180
 
181
; irq1  ->  hid/keyboard.inc
181
; irq1  ->  hid/keyboard.inc
182
macro irqh [num]
182
macro irqh [num]
183
{
183
{
184
  forward
184
  forward
185
  p_irq#num :
185
  p_irq#num :
186
     save_ring3_context
-
 
187
     mov   edi, num
186
     mov   edi, num
188
     jmp   irq_c
187
     jmp   irqhandler
189
}
188
}
190
 
189
 
191
irqh 2,5,7,8,9,10,11
-
 
192
 
-
 
193
irq_c:
-
 
194
     mov   ax, app_data  ;os_data
-
 
195
     mov   ds, ax
-
 
196
     mov   es, ax
-
 
197
     call  irqhandler
-
 
198
     restore_ring3_context
190
irqh 2,3,4,5,7,8,9,10,11
199
     iret
191
 
200
 
192
 
201
p_irq6:
193
p_irq6:
202
     save_ring3_context
194
     save_ring3_context
203
     mov   ax, app_data  ;os_data
195
     mov   ax, app_data  ;os_data
204
     mov   ds, ax
196
     mov   ds, ax
205
     mov   es, ax
197
     mov   es, ax
206
     call  fdc_irq
198
     call  fdc_irq
207
     call  ready_for_next_irq
199
     call  ready_for_next_irq
208
     restore_ring3_context
200
     restore_ring3_context
209
     iret
201
     iret
210
 
-
 
211
p_irq3:
-
 
212
     save_ring3_context
-
 
213
     mov   ax, app_data  ;os_data
-
 
214
     mov   ds, ax
-
 
215
     mov   es, ax
-
 
216
     cmp   [com2_mouse_detected],0
-
 
217
     je    old_irq3_handler
-
 
218
     mov   esi, com2_mouse
-
 
219
     mov   dx, 2F8h	;[COMPortBaseAddr]
-
 
220
     call  check_mouse_data_com
-
 
221
     jmp   p_irq3_1
-
 
222
 old_irq3_handler:
-
 
223
     mov   edi,3
-
 
224
     call  irqhandler
-
 
225
  p_irq3_1:
-
 
226
     restore_ring3_context
-
 
227
     iret
-
 
228
 
-
 
229
p_irq4:
-
 
230
     save_ring3_context
-
 
231
     mov   ax, app_data  ;os_data
-
 
232
     mov   ds, ax
-
 
233
     mov   es, ax
-
 
234
     cmp   [com1_mouse_detected],0
-
 
235
     je    old_irq4_handler
-
 
236
     mov   esi, com1_mouse
-
 
237
     mov   dx, 3F8h	;[COMPortBaseAddr]
-
 
238
     call  check_mouse_data_com
-
 
239
     jmp   p_irq4_1
-
 
240
 old_irq4_handler:
-
 
241
     mov   edi,4
-
 
242
     call  irqhandler
-
 
243
  p_irq4_1:
-
 
244
     restore_ring3_context
-
 
245
     iret
202
 
246
 
203
 
247
p_irq14:
204
p_irq14:
248
	save_ring3_context
205
	save_ring3_context
249
	mov	ax, app_data  ;os_data
206
	mov	ax, app_data  ;os_data
250
	mov	ds, ax
207
	mov	ds, ax
251
	mov	es, ax
208
	mov	es, ax
252
	mov	byte [BOOT_VAR + 0x48E], 0xFF
209
	mov	byte [BOOT_VAR + 0x48E], 0xFF
253
	call	[irq14_func]
210
	call	[irq14_func]
254
	call	ready_for_next_irq_1
211
	call	ready_for_next_irq_1
255
	restore_ring3_context
212
	restore_ring3_context
256
	iret
213
	iret
257
p_irq15:
214
p_irq15:
258
	save_ring3_context
215
	save_ring3_context
259
	mov	ax, app_data  ;os_data
216
	mov	ax, app_data  ;os_data
260
	mov	ds, ax
217
	mov	ds, ax
261
	mov	es, ax
218
	mov	es, ax
262
	mov	byte [BOOT_VAR + 0x48E], 0xFF
219
	mov	byte [BOOT_VAR + 0x48E], 0xFF
263
	call	[irq15_func]
220
	call	[irq15_func]
264
	call	ready_for_next_irq_1
221
	call	ready_for_next_irq_1
265
	restore_ring3_context
222
	restore_ring3_context
266
	iret
223
	iret
267
 
224
 
268
ready_for_next_irq:
225
ready_for_next_irq:
269
     mov    [check_idle_semaphore],5
226
     mov    [check_idle_semaphore],5
270
     mov   al, 0x20
227
     mov   al, 0x20
271
     out   0x20, al
228
     out   0x20, al
272
     ret
229
     ret
273
 
230
 
274
ready_for_next_irq_1:
231
ready_for_next_irq_1:
275
     mov    [check_idle_semaphore],5
232
     mov    [check_idle_semaphore],5
276
     mov   al, 0x20
233
     mov   al, 0x20
277
     out    0xa0,al
234
     out    0xa0,al
278
     out   0x20, al
235
     out   0x20, al
279
     ret
236
     ret
280
 
237
 
281
irqD:
238
irqD:
282
     save_ring3_context
239
     save_ring3_context
283
     mov   ax, app_data  ;os_data
240
     mov   ax, app_data  ;os_data
284
     mov   ds, ax
241
     mov   ds, ax
285
     mov   es, ax
242
     mov   es, ax
286
 
243
 
287
     mov   dx,0xf0
244
     mov   dx,0xf0
288
     mov   al,0
245
     mov   al,0
289
     out   dx,al
246
     out   dx,al
290
 
247
 
291
     mov   dx,0xa0
248
     mov   dx,0xa0
292
     mov   al,0x20
249
     mov   al,0x20
293
     out   dx,al
250
     out   dx,al
294
     mov   dx,0x20
251
     mov   dx,0x20
295
     out   dx,al
252
     out   dx,al
296
 
253
 
297
     restore_ring3_context
254
     restore_ring3_context
298
 
255
 
299
     iret
256
     iret
300
 
257
 
301
 
258
 
302
irqhandler:
259
irqhandler:
303
	cmp	[v86_irqhooks+edi*8], 0
260
	cmp	[v86_irqhooks+edi*8], 0
304
	jnz	v86_irq2
261
	jnz	v86_irq2
305
 
-
 
306
     push   edi
262
 
307
 
263
 
308
     mov    esi,edi	     ; 1
264
     mov    esi,edi	     ; 1
309
     shl    esi,6	     ; 1
265
     shl    esi,6	     ; 1
310
     add    esi,irq00read    ; 1
266
     add    esi,irq00read    ; 1
311
     shl    edi,12	     ; 1
267
     shl    edi,12	     ; 1
312
     add    edi,IRQ_SAVE
268
     add    edi,IRQ_SAVE
313
     mov    ecx,16
269
     mov    ecx,16
314
 
-
 
315
     mov    [check_idle_semaphore],5
-
 
316
 
270
 
317
   irqnewread:
271
   irqnewread:
318
     dec    ecx
272
     dec    ecx
319
     js     irqover
273
     js     irqover
320
 
274
 
321
     movzx  edx, word [esi]	   ; 2+
275
     movzx  edx, word [esi]	   ; 2+
322
 
276
 
323
     test   edx, edx		   ; 1
277
     test   edx, edx		   ; 1
324
     jz     irqover
278
     jz     irqover
325
 
279
 
326
 
280
 
327
     mov    ebx, [edi]		   ; address of begin of buffer in edi      ; + 0x0 dword - data size
281
     mov    ebx, [edi]		   ; address of begin of buffer in edi      ; + 0x0 dword - data size
328
     mov    eax, 4000							    ; + 0x4 dword - data begin offset
282
     mov    eax, 4000							    ; + 0x4 dword - data begin offset
329
     cmp    ebx, eax
283
     cmp    ebx, eax
330
     je     irqfull
284
     je     irqfull
331
     add    ebx, [edi + 0x4]	   ; add data size to data begin offset
285
     add    ebx, [edi + 0x4]	   ; add data size to data begin offset
332
     cmp    ebx, eax		   ; if end of buffer, begin cycle again
286
     cmp    ebx, eax		   ; if end of buffer, begin cycle again
333
     jb     @f
287
     jb     @f
334
 
288
 
335
     xor    ebx, ebx
289
     xor    ebx, ebx
336
 
290
 
337
  @@:
291
  @@:
338
     add    ebx, edi
292
     add    ebx, edi
339
     movzx  eax, byte[esi + 3]	   ; get type of data being received 1 - byte, 2 - word
293
     movzx  eax, byte[esi + 3]	   ; get type of data being received 1 - byte, 2 - word
340
     dec    eax
294
     dec    eax
341
     jz     irqbyte
295
     jz     irqbyte
342
     dec    eax
296
     dec    eax
343
     jnz    noirqword
297
     jnz    noirqword
344
 
298
 
345
     in     ax,dx
299
     in     ax,dx
346
     cmp    ebx, 3999		   ; check for address odd in the end of buffer
300
     cmp    ebx, 3999		   ; check for address odd in the end of buffer
347
     jne    .odd
301
     jne    .odd
348
     mov    [ebx + 0x10], ax
302
     mov    [ebx + 0x10], ax
349
     jmp    .add_size
303
     jmp    .add_size
350
  .odd:
304
  .odd:
351
     mov    [ebx + 0x10], al	   ; I could make mistake here :)
305
     mov    [ebx + 0x10], al	   ; I could make mistake here :)
352
     mov    [edi + 0x10], ah
306
     mov    [edi + 0x10], ah
353
  .add_size:
307
  .add_size:
354
     add    dword [edi], 2
308
     add    dword [edi], 2
355
     jmp    nextport
309
     jmp    nextport
356
 
310
 
357
 
311
 
358
  irqbyte:
312
  irqbyte:
359
     in     al,dx
313
     in     al,dx
360
     mov    [ebx + 0x10],al
314
     mov    [ebx + 0x10],al
361
     inc    dword [edi]
315
     inc    dword [edi]
362
  nextport:
316
  nextport:
363
     add    esi,4
317
     add    esi,4
364
     jmp    irqnewread
318
     jmp    irqnewread
365
 
319
 
366
 
320
 
367
   noirqword:
321
   noirqword:
368
   irqfull:
322
   irqfull:
369
   irqover:
323
   irqover:
370
 
-
 
371
     mov    al,0x20	       ; ready for next irq
-
 
372
     out    0x20,al
-
 
373
 
-
 
374
     pop    ebx
-
 
375
     cmp    ebx,7
-
 
376
     jbe    noa0
-
 
377
     out    0xa0,al
-
 
378
   noa0:
-
 
379
 
324
 
380
     ret
325
     ret
381
 
326
 
382
 
327
 
383
 
328
 
384
set_application_table_status:
329
set_application_table_status:
385
	push eax
330
	push eax
386
 
331
 
387
	mov  eax,[CURRENT_TASK]
332
	mov  eax,[CURRENT_TASK]
388
	shl  eax, 5
333
	shl  eax, 5
389
	add  eax,CURRENT_TASK+TASKDATA.pid
334
	add  eax,CURRENT_TASK+TASKDATA.pid
390
	mov  eax,[eax]
335
	mov  eax,[eax]
391
 
336
 
392
	mov  [application_table_status],eax
337
	mov  [application_table_status],eax
393
 
338
 
394
	pop  eax
339
	pop  eax
395
 
340
 
396
	ret
341
	ret
397
 
342
 
398
 
343
 
399
clear_application_table_status:
344
clear_application_table_status:
400
	push eax
345
	push eax
401
 
346
 
402
	mov  eax,[CURRENT_TASK]
347
	mov  eax,[CURRENT_TASK]
403
	shl  eax, 5
348
	shl  eax, 5
404
	add  eax,CURRENT_TASK+TASKDATA.pid
349
	add  eax,CURRENT_TASK+TASKDATA.pid
405
	mov  eax,[eax]
350
	mov  eax,[eax]
406
 
351
 
407
	cmp  eax,[application_table_status]
352
	cmp  eax,[application_table_status]
408
	jne  apptsl1
353
	jne  apptsl1
409
	mov  [application_table_status],0
354
	mov  [application_table_status],0
410
      apptsl1:
355
      apptsl1:
411
 
356
 
412
	pop  eax
357
	pop  eax
413
 
358
 
414
	ret
359
	ret
415
 
360
 
416
sys_resize_app_memory:
361
sys_resize_app_memory:
417
	; eax = 1 - resize
362
	; eax = 1 - resize
418
	;     ebx = new amount of memory
363
	;     ebx = new amount of memory
419
 
364
 
420
	cmp    eax,1
365
	cmp    eax,1
421
	jne    .no_application_mem_resize
366
	jne    .no_application_mem_resize
422
 
367
 
423
	stdcall new_mem_resize, ebx
368
	stdcall new_mem_resize, ebx
424
	mov [esp+36], eax
369
	mov [esp+36], eax
425
	ret
370
	ret
426
 
371
 
427
.no_application_mem_resize:
372
.no_application_mem_resize:
428
	ret
373
	ret
429
 
374
 
430
sys_threads:
375
sys_threads:
431
 
376
 
432
; eax=1 create thread
377
; eax=1 create thread
433
;
378
;
434
;   ebx=thread start
379
;   ebx=thread start
435
;   ecx=thread stack value
380
;   ecx=thread stack value
436
;
381
;
437
; on return : eax = pid
382
; on return : eax = pid
438
jmp new_sys_threads
383
jmp new_sys_threads
439
 
384
 
440
iglobal
385
iglobal
441
  process_terminating	db 'K : Process - terminating',13,10,0
386
  process_terminating	db 'K : Process - terminating',13,10,0
442
  process_terminated	db 'K : Process - done',13,10,0
387
  process_terminated	db 'K : Process - done',13,10,0
443
  msg_obj_destroy	db 'K : destroy app object',13,10,0
388
  msg_obj_destroy	db 'K : destroy app object',13,10,0
444
endg
389
endg
445
 
390
 
446
; param
391
; param
447
;  esi= slot
392
;  esi= slot
448
 
393
 
449
terminate: ; terminate application
394
terminate: ; terminate application
450
 
395
 
451
	   .slot equ esp   ;locals
396
	   .slot equ esp   ;locals
452
 
397
 
453
	   push   esi	   ;save .slot
398
	   push   esi	   ;save .slot
454
 
399
 
455
	   shl esi, 8
400
	   shl esi, 8
456
	   cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
401
	   cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
457
	   jne @F
402
	   jne @F
458
	   pop	  esi
403
	   pop	  esi
459
	   shl	  esi, 5
404
	   shl	  esi, 5
460
	   mov	  [CURRENT_TASK+esi+TASKDATA.state], 9
405
	   mov	  [CURRENT_TASK+esi+TASKDATA.state], 9
461
	   ret
406
	   ret
462
@@:
407
@@:
463
	   ;mov    esi,process_terminating
408
	   ;mov    esi,process_terminating
464
	   ;call   sys_msg_board_str
409
	   ;call   sys_msg_board_str
465
	   DEBUGF 1,"%s",process_terminating
410
	   DEBUGF 1,"%s",process_terminating
466
@@:
411
@@:
467
	   cli
412
	   cli
468
	   cmp	 [application_table_status],0
413
	   cmp	 [application_table_status],0
469
	   je	 term9
414
	   je	 term9
470
	   sti
415
	   sti
471
	   call  change_task
416
	   call  change_task
472
	   jmp	 @b
417
	   jmp	 @b
473
term9:
418
term9:
474
	   call  set_application_table_status
419
	   call  set_application_table_status
475
 
420
 
476
; if the process is in V86 mode...
421
; if the process is in V86 mode...
477
	mov	eax, [.slot]
422
	mov	eax, [.slot]
478
	shl	eax, 8
423
	shl	eax, 8
479
	mov	esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
424
	mov	esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
480
	add	esi, RING0_STACK_SIZE
425
	add	esi, RING0_STACK_SIZE
481
	cmp	[eax+SLOT_BASE+APPDATA.saved_esp0], esi
426
	cmp	[eax+SLOT_BASE+APPDATA.saved_esp0], esi
482
	jz	.nov86
427
	jz	.nov86
483
; ...it has page directory for V86 mode
428
; ...it has page directory for V86 mode
484
	mov	esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
429
	mov	esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
485
	mov	ecx, [esi+4]
430
	mov	ecx, [esi+4]
486
	mov	[eax+SLOT_BASE+APPDATA.dir_table], ecx
431
	mov	[eax+SLOT_BASE+APPDATA.dir_table], ecx
487
; ...and I/O permission map for V86 mode
432
; ...and I/O permission map for V86 mode
488
	mov	ecx, [esi+12]
433
	mov	ecx, [esi+12]
489
	mov	[eax+SLOT_BASE+APPDATA.io_map], ecx
434
	mov	[eax+SLOT_BASE+APPDATA.io_map], ecx
490
	mov	ecx, [esi+8]
435
	mov	ecx, [esi+8]
491
	mov	[eax+SLOT_BASE+APPDATA.io_map+4], ecx
436
	mov	[eax+SLOT_BASE+APPDATA.io_map+4], ecx
492
.nov86:
437
.nov86:
493
 
438
 
494
	   mov esi, [.slot]
439
	   mov esi, [.slot]
495
	   shl esi,8
440
	   shl esi,8
496
	   add esi, SLOT_BASE+APP_OBJ_OFFSET
441
	   add esi, SLOT_BASE+APP_OBJ_OFFSET
497
@@:
442
@@:
498
	   mov eax, [esi+APPOBJ.fd]
443
	   mov eax, [esi+APPOBJ.fd]
499
	   test eax, eax
444
	   test eax, eax
500
	   jz @F
445
	   jz @F
501
 
446
 
502
	   cmp eax, esi
447
	   cmp eax, esi
503
	   je @F
448
	   je @F
504
 
449
 
505
	   push esi
450
	   push esi
506
	   call [eax+APPOBJ.destroy]
451
	   call [eax+APPOBJ.destroy]
507
	   DEBUGF 1,"%s",msg_obj_destroy
452
	   DEBUGF 1,"%s",msg_obj_destroy
508
	   pop esi
453
	   pop esi
509
	   jmp @B
454
	   jmp @B
510
@@:
455
@@:
511
	   mov eax, [.slot]
456
	   mov eax, [.slot]
512
	   shl eax, 8
457
	   shl eax, 8
513
	   mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
458
	   mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
514
	   stdcall destroy_app_space, eax
459
	   stdcall destroy_app_space, eax
515
 
460
 
516
	   mov esi, [.slot]
461
	   mov esi, [.slot]
517
	   cmp [fpu_owner],esi	 ; if user fpu last -> fpu user = 1
462
	   cmp [fpu_owner],esi	 ; if user fpu last -> fpu user = 1
518
	   jne @F
463
	   jne @F
519
 
464
 
520
	   mov [fpu_owner],1
465
	   mov [fpu_owner],1
521
	   mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
466
	   mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
522
	   clts
467
	   clts
523
	   bt [cpu_caps], CAPS_SSE
468
	   bt [cpu_caps], CAPS_SSE
524
	   jnc .no_SSE
469
	   jnc .no_SSE
525
	   fxrstor [eax]
470
	   fxrstor [eax]
526
	   jmp @F
471
	   jmp @F
527
.no_SSE:
472
.no_SSE:
528
	   fnclex
473
	   fnclex
529
	   frstor [eax]
474
	   frstor [eax]
530
@@:
475
@@:
531
 
476
 
532
    mov   [KEY_COUNT],byte 0	       ; empty keyboard buffer
477
    mov   [KEY_COUNT],byte 0	       ; empty keyboard buffer
533
    mov   [BTN_COUNT],byte 0	       ; empty button buffer
478
    mov   [BTN_COUNT],byte 0	       ; empty button buffer
534
 
479
 
535
 
480
 
536
; remove defined hotkeys
481
; remove defined hotkeys
537
	mov	eax, hotkey_list
482
	mov	eax, hotkey_list
538
.loop:
483
.loop:
539
	cmp	[eax+8], esi
484
	cmp	[eax+8], esi
540
	jnz	.cont
485
	jnz	.cont
541
	mov	ecx, [eax]
486
	mov	ecx, [eax]
542
	jecxz	@f
487
	jecxz	@f
543
	push	dword [eax+12]
488
	push	dword [eax+12]
544
	pop	dword [ecx+12]
489
	pop	dword [ecx+12]
545
@@:
490
@@:
546
	mov	ecx, [eax+12]
491
	mov	ecx, [eax+12]
547
	push	dword [eax]
492
	push	dword [eax]
548
	pop	dword [ecx]
493
	pop	dword [ecx]
549
	xor	ecx, ecx
494
	xor	ecx, ecx
550
	mov	[eax], ecx
495
	mov	[eax], ecx
551
	mov	[eax+4], ecx
496
	mov	[eax+4], ecx
552
	mov	[eax+8], ecx
497
	mov	[eax+8], ecx
553
	mov	[eax+12], ecx
498
	mov	[eax+12], ecx
554
.cont:
499
.cont:
555
	add	eax, 16
500
	add	eax, 16
556
	cmp	eax, hotkey_list+256*16
501
	cmp	eax, hotkey_list+256*16
557
	jb	.loop
502
	jb	.loop
558
; remove hotkeys in buffer
503
; remove hotkeys in buffer
559
	mov	eax, hotkey_buffer
504
	mov	eax, hotkey_buffer
560
.loop2:
505
.loop2:
561
	cmp	[eax], esi
506
	cmp	[eax], esi
562
	jnz	.cont2
507
	jnz	.cont2
563
	and	dword [eax+4], 0
508
	and	dword [eax+4], 0
564
	and	dword [eax], 0
509
	and	dword [eax], 0
565
.cont2:
510
.cont2:
566
	add	eax, 8
511
	add	eax, 8
567
	cmp	eax, hotkey_buffer+120*8
512
	cmp	eax, hotkey_buffer+120*8
568
	jb	.loop2
513
	jb	.loop2
569
 
514
 
570
    mov   ecx,esi		  ; remove buttons
515
    mov   ecx,esi		  ; remove buttons
571
  bnewba2:
516
  bnewba2:
572
    mov   edi,[BTN_ADDR]
517
    mov   edi,[BTN_ADDR]
573
    mov   eax,edi
518
    mov   eax,edi
574
    cld
519
    cld
575
    movzx ebx,word [edi]
520
    movzx ebx,word [edi]
576
    inc   bx
521
    inc   bx
577
  bnewba:
522
  bnewba:
578
    dec   bx
523
    dec   bx
579
    jz	  bnmba
524
    jz	  bnmba
580
    add   eax,0x10
525
    add   eax,0x10
581
    cmp   cx,[eax]
526
    cmp   cx,[eax]
582
    jnz   bnewba
527
    jnz   bnewba
583
    pusha
528
    pusha
584
    mov   ecx,ebx
529
    mov   ecx,ebx
585
    inc   ecx
530
    inc   ecx
586
    shl   ecx,4
531
    shl   ecx,4
587
    mov   ebx,eax
532
    mov   ebx,eax
588
    add   eax,0x10
533
    add   eax,0x10
589
    call  memmove
534
    call  memmove
590
    dec   dword [edi]
535
    dec   dword [edi]
591
    popa
536
    popa
592
    jmp   bnewba2
537
    jmp   bnewba2
593
  bnmba:
538
  bnmba:
594
 
539
 
595
    pusha     ; save window coordinates for window restoring
540
    pusha     ; save window coordinates for window restoring
596
    cld
541
    cld
597
    shl   esi,5
542
    shl   esi,5
598
    add   esi,window_data
543
    add   esi,window_data
599
    mov   eax,[esi+WDATA.box.left]
544
    mov   eax,[esi+WDATA.box.left]
600
    mov   [dlx],eax
545
    mov   [dlx],eax
601
    add   eax,[esi+WDATA.box.width]
546
    add   eax,[esi+WDATA.box.width]
602
    mov   [dlxe],eax
547
    mov   [dlxe],eax
603
    mov   eax,[esi+WDATA.box.top]
548
    mov   eax,[esi+WDATA.box.top]
604
    mov   [dly],eax
549
    mov   [dly],eax
605
    add   eax,[esi+WDATA.box.height]
550
    add   eax,[esi+WDATA.box.height]
606
    mov   [dlye],eax
551
    mov   [dlye],eax
607
 
552
 
608
    xor   eax, eax
553
    xor   eax, eax
609
    mov   [esi+WDATA.box.left],eax
554
    mov   [esi+WDATA.box.left],eax
610
    mov   [esi+WDATA.box.width],eax
555
    mov   [esi+WDATA.box.width],eax
611
    mov   [esi+WDATA.box.top],eax
556
    mov   [esi+WDATA.box.top],eax
612
    mov   [esi+WDATA.box.height],eax
557
    mov   [esi+WDATA.box.height],eax
613
    mov   [esi+WDATA.cl_workarea],eax
558
    mov   [esi+WDATA.cl_workarea],eax
614
    mov   [esi+WDATA.cl_titlebar],eax
559
    mov   [esi+WDATA.cl_titlebar],eax
615
    mov   [esi+WDATA.cl_frames],eax
560
    mov   [esi+WDATA.cl_frames],eax
616
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
561
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
617
    lea   edi, [esi-window_data+draw_data]
562
    lea   edi, [esi-window_data+draw_data]
618
    mov   ecx,32/4
563
    mov   ecx,32/4
619
    rep   stosd
564
    rep   stosd
620
    popa
565
    popa
621
 
566
 
622
; debuggee test
567
; debuggee test
623
    pushad
568
    pushad
624
    mov  edi, esi
569
    mov  edi, esi
625
    shl  edi, 5
570
    shl  edi, 5
626
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
571
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
627
    test eax, eax
572
    test eax, eax
628
    jz	 .nodebug
573
    jz	 .nodebug
629
    push 8
574
    push 8
630
    pop  ecx
575
    pop  ecx
631
    push dword [CURRENT_TASK+edi+TASKDATA.pid]	 ; PID
576
    push dword [CURRENT_TASK+edi+TASKDATA.pid]	 ; PID
632
    push 2
577
    push 2
633
    call debugger_notify
578
    call debugger_notify
634
    pop  ecx
579
    pop  ecx
635
    pop  ecx
580
    pop  ecx
636
.nodebug:
581
.nodebug:
637
    popad
582
    popad
638
 
583
 
639
	   mov ebx, [.slot]
584
	   mov ebx, [.slot]
640
	   shl ebx, 8
585
	   shl ebx, 8
641
	   push ebx
586
	   push ebx
642
	   mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
587
	   mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
643
 
588
 
644
	   stdcall kernel_free, ebx
589
	   stdcall kernel_free, ebx
645
 
590
 
646
	   pop ebx
591
	   pop ebx
647
	   mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
592
	   mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
648
	   stdcall kernel_free, ebx
593
	   stdcall kernel_free, ebx
649
 
594
 
650
	   mov edi, [.slot]
595
	   mov edi, [.slot]
651
	   shl edi,8
596
	   shl edi,8
652
	   add edi,SLOT_BASE
597
	   add edi,SLOT_BASE
653
 
598
 
654
	   mov eax, [edi+APPDATA.io_map]
599
	   mov eax, [edi+APPDATA.io_map]
655
	   cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
600
	   cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
656
	   je @F
601
	   je @F
657
	   call free_page
602
	   call free_page
658
@@:
603
@@:
659
	   mov eax, [edi+APPDATA.io_map+4]
604
	   mov eax, [edi+APPDATA.io_map+4]
660
	   cmp eax, (tss._io_map_1-OS_BASE+PG_MAP)
605
	   cmp eax, (tss._io_map_1-OS_BASE+PG_MAP)
661
	   je @F
606
	   je @F
662
	   call free_page
607
	   call free_page
663
@@:
608
@@:
664
	   mov eax, 0x20202020
609
	   mov eax, 0x20202020
665
	   stosd
610
	   stosd
666
	   stosd
611
	   stosd
667
	   stosd
612
	   stosd
668
	   mov ecx,244/4
613
	   mov ecx,244/4
669
	   xor eax, eax
614
	   xor eax, eax
670
	   rep stosd
615
	   rep stosd
671
 
616
 
672
  ; activate window
617
  ; activate window
673
	movzx  eax, word [WIN_STACK + esi*2]
618
	movzx  eax, word [WIN_STACK + esi*2]
674
	cmp    eax, [TASK_COUNT]
619
	cmp    eax, [TASK_COUNT]
675
	jne    .dont_activate
620
	jne    .dont_activate
676
	pushad
621
	pushad
677
 .check_next_window:
622
 .check_next_window:
678
	dec    eax
623
	dec    eax
679
	cmp    eax, 1
624
	cmp    eax, 1
680
	jbe    .nothing_to_activate
625
	jbe    .nothing_to_activate
681
	lea    esi, [WIN_POS+eax*2]
626
	lea    esi, [WIN_POS+eax*2]
682
	movzx  edi, word [esi]		     ; edi = process
627
	movzx  edi, word [esi]		     ; edi = process
683
	shl    edi, 5
628
	shl    edi, 5
684
	cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
629
	cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
685
	je     .check_next_window
630
	je     .check_next_window
686
	add    edi, window_data
631
	add    edi, window_data
687
; \begin{diamond}[19.09.2006]
632
; \begin{diamond}[19.09.2006]
688
; skip minimized windows
633
; skip minimized windows
689
	test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
634
	test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
690
	jnz    .check_next_window
635
	jnz    .check_next_window
691
; \end{diamond}
636
; \end{diamond}
692
	call   waredraw
637
	call   waredraw
693
 .nothing_to_activate:
638
 .nothing_to_activate:
694
	popad
639
	popad
695
 .dont_activate:
640
 .dont_activate:
696
 
641
 
697
	push	esi	; remove hd1 & cd & flp reservation
642
	push	esi	; remove hd1 & cd & flp reservation
698
	shl	esi, 5
643
	shl	esi, 5
699
	mov	esi, [esi+CURRENT_TASK+TASKDATA.pid]
644
	mov	esi, [esi+CURRENT_TASK+TASKDATA.pid]
700
	cmp	[hd1_status], esi
645
	cmp	[hd1_status], esi
701
	jnz	@f
646
	jnz	@f
702
	call	free_hd_channel
647
	call	free_hd_channel
703
	mov	[hd1_status], 0
648
	mov	[hd1_status], 0
704
@@:
649
@@:
705
	cmp	[cd_status], esi
650
	cmp	[cd_status], esi
706
	jnz	@f
651
	jnz	@f
707
	call	free_cd_channel
652
	call	free_cd_channel
708
	mov	[cd_status], 0
653
	mov	[cd_status], 0
709
@@:
654
@@:
710
	cmp	[flp_status], esi
655
	cmp	[flp_status], esi
711
	jnz	@f
656
	jnz	@f
712
	mov	[flp_status], 0
657
	mov	[flp_status], 0
713
@@:
658
@@:
714
	pop	esi
659
	pop	esi
715
	cmp	[bgrlockpid], esi
660
	cmp	[bgrlockpid], esi
716
	jnz	@f
661
	jnz	@f
717
	and	[bgrlockpid], 0
662
	and	[bgrlockpid], 0
718
	mov	[bgrlock], 0
663
	mov	[bgrlock], 0
719
@@:
664
@@:
720
 
665
 
721
    pusha ; remove all irq reservations
666
    pusha ; remove all irq reservations
722
    mov   eax,esi
667
    mov   eax,esi
723
    shl   eax, 5
668
    shl   eax, 5
724
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
669
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
725
    mov   edi,irq_owner
670
    mov   edi,irq_owner
726
    mov   ecx,16
671
    mov   ecx,16
727
  newirqfree:
672
  newirqfree:
728
    scasd
673
    scasd
729
    jne   nofreeirq
674
    jne   nofreeirq
730
    mov   [edi-4],dword 0
675
    mov   [edi-4],dword 0
731
  nofreeirq:
676
  nofreeirq:
732
    loop   newirqfree
677
    loop   newirqfree
733
    popa
678
    popa
734
 
679
 
735
    pusha		      ; remove all port reservations
680
    pusha		      ; remove all port reservations
736
    mov   edx,esi
681
    mov   edx,esi
737
    shl   edx, 5
682
    shl   edx, 5
738
    add   edx,CURRENT_TASK
683
    add   edx,CURRENT_TASK
739
    mov   edx,[edx+TASKDATA.pid]
684
    mov   edx,[edx+TASKDATA.pid]
740
 
685
 
741
  rmpr0:
686
  rmpr0:
742
 
687
 
743
    mov   esi,[RESERVED_PORTS]
688
    mov   esi,[RESERVED_PORTS]
744
 
689
 
745
    cmp   esi,0
690
    cmp   esi,0
746
    je	  rmpr9
691
    je	  rmpr9
747
 
692
 
748
  rmpr3:
693
  rmpr3:
749
 
694
 
750
    mov   edi,esi
695
    mov   edi,esi
751
    shl   edi,4
696
    shl   edi,4
752
    add   edi,RESERVED_PORTS
697
    add   edi,RESERVED_PORTS
753
 
698
 
754
    cmp   edx,[edi]
699
    cmp   edx,[edi]
755
    je	  rmpr4
700
    je	  rmpr4
756
 
701
 
757
    dec   esi
702
    dec   esi
758
    jnz   rmpr3
703
    jnz   rmpr3
759
 
704
 
760
    jmp   rmpr9
705
    jmp   rmpr9
761
 
706
 
762
  rmpr4:
707
  rmpr4:
763
 
708
 
764
    mov   ecx,256
709
    mov   ecx,256
765
    sub   ecx,esi
710
    sub   ecx,esi
766
    shl   ecx,4
711
    shl   ecx,4
767
 
712
 
768
    mov   esi,edi
713
    mov   esi,edi
769
    add   esi,16
714
    add   esi,16
770
    cld
715
    cld
771
    rep   movsb
716
    rep   movsb
772
 
717
 
773
    dec   dword [RESERVED_PORTS]
718
    dec   dword [RESERVED_PORTS]
774
 
719
 
775
    jmp   rmpr0
720
    jmp   rmpr0
776
 
721
 
777
  rmpr9:
722
  rmpr9:
778
 
723
 
779
    popa
724
    popa
780
    mov  edi,esi	 ; do not run this process slot
725
    mov  edi,esi	 ; do not run this process slot
781
    shl  edi, 5
726
    shl  edi, 5
782
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
727
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
783
; debugger test - terminate all debuggees
728
; debugger test - terminate all debuggees
784
    mov  eax, 2
729
    mov  eax, 2
785
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
730
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
786
.xd0:
731
.xd0:
787
    cmp  eax, [TASK_COUNT]
732
    cmp  eax, [TASK_COUNT]
788
    ja	 .xd1
733
    ja	 .xd1
789
    cmp  dword [ecx], esi
734
    cmp  dword [ecx], esi
790
    jnz  @f
735
    jnz  @f
791
    and  dword [ecx], 0
736
    and  dword [ecx], 0
792
    pushad
737
    pushad
793
    xchg eax, ecx
738
    xchg eax, ecx
794
    mov  ebx, 2
739
    mov  ebx, 2
795
    call sys_system
740
    call sys_system
796
    popad
741
    popad
797
@@:
742
@@:
798
    inc  eax
743
    inc  eax
799
    add  ecx, 0x100
744
    add  ecx, 0x100
800
    jmp  .xd0
745
    jmp  .xd0
801
.xd1:
746
.xd1:
802
;    call  systest
747
;    call  systest
803
    sti  ; .. and life goes on
748
    sti  ; .. and life goes on
804
 
749
 
805
    mov   eax, [dlx]
750
    mov   eax, [dlx]
806
    mov   ebx, [dly]
751
    mov   ebx, [dly]
807
    mov   ecx, [dlxe]
752
    mov   ecx, [dlxe]
808
    mov   edx, [dlye]
753
    mov   edx, [dlye]
809
    call  calculatescreen
754
    call  calculatescreen
810
    xor   eax, eax
755
    xor   eax, eax
811
    xor   esi, esi
756
    xor   esi, esi
812
    call  redrawscreen
757
    call  redrawscreen
813
 
758
 
814
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
759
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
815
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
760
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
816
 
761
 
817
    mov   [application_table_status],0
762
    mov   [application_table_status],0
818
    ;mov   esi,process_terminated
763
    ;mov   esi,process_terminated
819
    ;call  sys_msg_board_str
764
    ;call  sys_msg_board_str
820
    DEBUGF 1,"%s",process_terminated
765
    DEBUGF 1,"%s",process_terminated
821
    add esp, 4
766
    add esp, 4
822
    ret
767
    ret
823
restore .slot
768
restore .slot
824
 
769
 
825
iglobal
770
iglobal
826
  boot_sched_1	  db   'Building gdt tss pointer',0
771
  boot_sched_1	  db   'Building gdt tss pointer',0
827
  boot_sched_2	  db   'Building IDT table',0
772
  boot_sched_2	  db   'Building IDT table',0
828
endg
773
endg
829
 
774
 
830
 
775
 
831
build_scheduler:
776
build_scheduler:
832
 
777
 
833
	mov    esi,boot_sched_1
778
	mov    esi,boot_sched_1
834
	call   boot_log
779
	call   boot_log
835
  ;      call   build_process_gdt_tss_pointer
780
  ;      call   build_process_gdt_tss_pointer
836
 
781
 
837
  ;      mov    esi,boot_sched_2
782
  ;      mov    esi,boot_sched_2
838
  ;      call   boot_log
783
  ;      call   boot_log
839
 
784
 
840
	ret
785
	ret