Subversion Repositories Kolibri OS

Rev

Rev 142 | Rev 154 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ha 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                               ;;
3
;;  MenuetOS process management, protected ring3                 ;;
4
;;                                                               ;;
5
;;  Distributed under GPL. See file COPYING for details.         ;;
6
;;  Copyright 2003 Ville Turjanmaa                               ;;
7
;;                                                               ;;
8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
 
10
align 32
11
 
12
; GDT TABLE
13
 
14
gdts:
15
 
16
        dw     gdte-$-1
17
        dd     gdts
18
        dw     0
19
 
20
int_code_l:
21
os_code_l:
22
 
23
        dw     0xffff
24
        dw     0x0000
25
        db     0x00
26
        dw     11011111b *256 +10011010b
27
        db     0x00
28
 
29
int_data_l:
30
os_data_l:
31
 
32
        dw     0xffff
33
        dw     0x0000
34
        db     0x00
35
        dw     11011111b *256 +10010010b
36
        db     0x00
37
 
76 mario79 38
; --------------- APM ---------------------
39
apm_code_32:
40
        dw     0x10        ; limit 64kb
41
        db     0, 0, 0
42
        dw     11011111b *256 +10011010b
43
        db     0x00
44
apm_code_16:
45
        dw     0x10
46
        db     0, 0, 0
47
        dw     10011111b *256 +10011010b
48
        db     0x00
49
apm_data_16:
50
        dw     0x10
51
        db     0, 0, 0
52
        dw     10011111b *256 +10010010b
53
        db     0x00
54
; -----------------------------------------
55
 
1 ha 56
app_code_l:
4 poddubny 57
      dw ((0x80000000-std_application_base_address) shr 12) and 0xffff
58
      dw 0
59
      db 0
60
      dw 11010000b*256+11111010b+256*((0x80000000-std_application_base_address) shr 28)
61
      db std_application_base_address shr 24
1 ha 62
 
63
app_data_l:
4 poddubny 64
      dw (0x80000000-std_application_base_address) shr 12 and 0xffff
65
      dw 0
66
      db 0
67
      dw 11010000b*256+11110010b+256*((0x80000000-std_application_base_address) shr 28)
68
      db std_application_base_address shr 24
1 ha 69
 
8 poddubny 70
graph_data_l:
1 ha 71
 
8 poddubny 72
        dw     0x3ff
73
        dw     0x0000
74
        db     0x00
75
        dw     11010000b *256 +11110010b
76
        db     0x00
77
 
78
tss0_l:
79
      times (max_processes+10) dd 0,0
80
 
1 ha 81
gdte:
82
 
83
 
84
 
85
idtreg:
86
     dw   8*0x41-1
87
     dd   idts+8
88
label idts at 0xB100-8
89
 
90
 
91
 
8 poddubny 92
uglobal
93
 tss_sceleton:
94
  l.back   dw 0,0
95
  l.esp0   dd 0
96
  l.ss0    dw 0,0
97
  l.esp1   dd 0
98
  l.ss1    dw 0,0
99
  l.esp2   dd 0
100
  l.ss2    dw 0,0
101
  l.cr3    dd 0
102
  l.eip    dd 0
103
  l.eflags dd 0
104
  l.eax    dd 0
105
  l.ecx    dd 0
106
  l.edx    dd 0
107
  l.ebx    dd 0
108
  l.esp    dd 0
109
  l.ebp    dd 0
110
  l.esi    dd 0
111
  l.edi    dd 0
112
  l.es     dw 0,0
113
  l.cs     dw 0,0
114
  l.ss     dw 0,0
115
  l.ds     dw 0,0
116
  l.fs     dw 0,0
117
  l.gs     dw 0,0
118
  l.ldt    dw 0,0
119
  l.trap   dw 0
120
  l.io     dw 0
121
endg
122
 
123
 
1 ha 124
build_process_gdt_tss_pointer:
125
 
126
        mov    ecx,tss_data
127
        mov    edi,0
128
      setgdtl2:
129
        mov    [edi+gdts+ tss0 +0], word tss_step
130
        mov    [edi+gdts+ tss0 +2], cx
131
        mov    eax,ecx
132
        shr    eax,16
133
        mov    [edi+gdts+ tss0 +4], al
134
        mov    [edi+gdts+ tss0 +7], ah
135
        mov    [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
136
        add    ecx,tss_step
137
        add    edi,8
138
        cmp    edi,8*(max_processes+5)
139
        jbe    setgdtl2
140
 
141
        ret
142
 
143
 
144
build_interrupt_table:
145
 
6 poddubny 146
        mov    edi, idts+8
147
        mov    esi, sys_int
8 poddubny 148
        mov    ecx, 0x40
6 poddubny 149
     @@:
150
        mov    eax, [esi]
151
        mov    [edi],   ax           ; lower part of offset
152
        mov    [edi+2], word os_code ; segment selector
153
        shr    eax, 16
154
        mov    [edi+4], word 10001110b shl 8 ; interrupt descriptor
155
        mov    [edi+6], ax
156
        add    esi, 4
157
        add    edi, 8
158
        dec    ecx
159
        jnz    @b
8 poddubny 160
 
161
        ;mov    edi,8*0x40+idts+8
3 halyavin 162
        mov    [edi + 0], word (i40 and ((1 shl 16)-1))
163
        mov    [edi + 2], word os_code
164
        mov    [edi + 4], word 11101110b*256
9 halyavin 165
        mov    [edi + 6], word (i40 shr 16)
1 ha 166
 
167
        ret
168
 
169
 
170
 
171
iglobal
172
  sys_int:
66 diamond 173
    dd   e0,debug_exc,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15
8 poddubny 174
    dd   e16,e17
1 ha 175
    times 14 dd unknown_interrupt
176
 
177
    dd   irq0  ,irq1  ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7
178
    dd   p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD  ,p_irq14,p_irq15
179
 
180
    times 16 dd unknown_interrupt
181
 
182
    dd   i40
183
endg
184
 
40 halyavin 185
macro save_ring3_context
186
{
58 mario79 187
    push    ds es
188
    pushad
40 halyavin 189
}
190
macro restore_ring3_context
191
{
58 mario79 192
    popad
193
    pop    es ds
40 halyavin 194
}
195
 
8 poddubny 196
; simply return control to interrupted process
197
unknown_interrupt:
198
     iret
1 ha 199
 
22 poddubny 200
macro exc_wo_code [num]
8 poddubny 201
{
202
  forward
203
  e#num :
40 halyavin 204
      save_ring3_context
20 mario79 205
      mov bl, num
206
      jmp exc_c
8 poddubny 207
}
1 ha 208
 
22 poddubny 209
macro exc_w_code [num]
210
{
211
  forward
212
  e#num :
213
      add esp, 4
40 halyavin 214
      save_ring3_context
22 poddubny 215
      mov bl, num
216
      jmp exc_c
217
}
218
 
219
exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15, 16 ; 18, 19
220
exc_w_code 8, 10, 11, 12, 13, 14, 17
221
 
8 poddubny 222
exc_c:
6 poddubny 223
        mov   ax, os_data
224
        mov   ds, ax
225
        mov   es, ax
1 ha 226
 
40 halyavin 227
; test if debugging
228
        cli
229
        mov   eax, [0x3000]
230
        shl   eax, 8
115 poddubny 231
        mov   eax, [0x80000+eax+APPDATA.debugger_slot]
40 halyavin 232
        test  eax, eax
233
        jnz   .debug
234
        sti
235
; not debuggee => say error and terminate
236
        add   esp, 28h
8 poddubny 237
        movzx eax, bl
238
        mov   [error_interrupt], eax
1 ha 239
        call  show_error_parameters
8 poddubny 240
 
241
        mov   edx, [0x3010]
115 poddubny 242
        mov   [edx + TASKDATA.state], byte 4
8 poddubny 243
 
1 ha 244
        jmp   change_task
245
 
40 halyavin 246
.debug:
247
; we are debugged process, notify debugger and suspend ourself
248
; eax=debugger PID
113 diamond 249
        cld
40 halyavin 250
        movzx ecx, bl
251
        push  ecx
252
        mov   ecx, [0x3010]
115 poddubny 253
        push  dword [ecx+TASKDATA.pid]    ; PID of current process
40 halyavin 254
        push  12
255
        pop   ecx
58 mario79 256
        push  1        ; 1=exception
40 halyavin 257
        call  debugger_notify
258
        pop   ecx
259
        pop   ecx
260
        pop   ecx
261
        mov   edx, [0x3010]
115 poddubny 262
        mov   byte [edx+TASKDATA.state], 1        ; suspended
40 halyavin 263
        call  change_task
264
        restore_ring3_context
265
        iretd
1 ha 266
 
267
;;;;;;;;;;;;;;;;;;;;;;;
268
;; FPU ERROR HANDLER ;;
269
;;;;;;;;;;;;;;;;;;;;;;;
270
 
271
align 4
8 poddubny 272
e7:
40 halyavin 273
        save_ring3_context
6 poddubny 274
        clts
275
        mov   ax, os_data
276
        mov   ds, ax
277
        mov   es, ax
278
 
279
        mov   eax, [prev_user_of_fpu]
280
        shl   eax, 8
115 poddubny 281
        add   eax, 0x80000 + APPDATA.fpu_save_area
6 poddubny 282
        fsave [eax]
283
 
284
        mov   eax, [0x3000]
285
        mov   [prev_user_of_fpu], eax
286
        shl   eax, 8
287
        add   eax, 0x80000
115 poddubny 288
        cmp   [eax + APPDATA.is_fpu_saved], 0
6 poddubny 289
        je    @f
115 poddubny 290
        frstor [eax+APPDATA.fpu_save_area]
6 poddubny 291
     @@:
115 poddubny 292
        mov   [eax + APPDATA.is_fpu_saved], 1
40 halyavin 293
        restore_ring3_context
6 poddubny 294
        iret
295
 
296
iglobal
297
  prev_user_of_fpu dd 1
298
endg
1 ha 299
 
300
 
301
writehex:
302
      pusha
8 poddubny 303
 
304
      mov  edi, [write_error_to]
305
      mov  esi, 8
306
    @@:
307
      mov  ecx, eax
308
      and  ecx, 0xf
1 ha 309
 
8 poddubny 310
      mov  cl,[ecx+hexletters]
1 ha 311
      mov  [edi],cl
8 poddubny 312
      dec  edi
1 ha 313
 
8 poddubny 314
      shr  eax,4
1 ha 315
      dec  esi
8 poddubny 316
      jnz  @b
1 ha 317
 
318
      popa
319
      ret
320
 
321
iglobal
322
  hexletters  db '0123456789ABCDEF'
323
 
324
  error_interrupt         dd  -1
325
 
326
  process_error  db 'K : Process - forced terminate INT: 00000000',13,10,0
327
  process_pid    db 'K : Process - forced terminate PID: 00000000',13,10,0
328
  process_eip    db 'K : Process - forced terminate EIP: 00000000',13,10,0
329
  system_error   db 'K : Kernel error',13,10,0
330
endg
331
 
332
uglobal
333
  write_error_to  dd  0x0
334
endg
335
 
336
show_error_parameters:
337
 
338
        mov    [write_error_to],process_pid+43
339
        mov    eax,[0x3000]
340
        shl    eax, 5
115 poddubny 341
        mov    eax,[0x3000+TASKDATA.pid+eax]
1 ha 342
        call   writehex
343
 
344
        mov    [write_error_to],process_error+43
345
        mov    eax,[error_interrupt]
346
        call   writehex
16 poddubny 347
 
348
        cmp    dword [esp+4+4], os_code ; CS
349
        jnz    @f
10 poddubny 350
        mov    esi,system_error
351
        call   sys_msg_board_str
352
      @@:
16 poddubny 353
        mov    eax, [esp+4] ; EIP
10 poddubny 354
 
1 ha 355
        mov    [write_error_to],process_eip+43
356
        call   writehex
357
 
358
        mov    esi,process_error
359
        call   sys_msg_board_str
360
 
361
        mov    esi,process_pid
362
        call   sys_msg_board_str
363
 
364
        mov    esi,process_eip
365
        call   sys_msg_board_str
366
 
367
        ret
368
 
369
 
370
 
6 poddubny 371
; irq1  ->  hid/keyboard.inc
1 ha 372
 
373
 
10 poddubny 374
macro irqh [num]
8 poddubny 375
{
376
  forward
377
  p_irq#num :
40 halyavin 378
     save_ring3_context
8 poddubny 379
     mov   edi, num
380
     jmp   irq_c
381
}
1 ha 382
 
33 mario79 383
irqh 2,5,7,8,9,10,11,14,15
1 ha 384
 
8 poddubny 385
 irq_c:
386
     mov   ax, os_data
387
     mov   ds, ax
388
     mov   es, ax
1 ha 389
     call  irqhandler
40 halyavin 390
     restore_ring3_context
8 poddubny 391
     iret
11 poddubny 392
 
393
p_irq6:
40 halyavin 394
     save_ring3_context
11 poddubny 395
     mov   ax, os_data
396
     mov   ds, ax
397
     mov   es, ax
398
     call  fdc_irq
33 mario79 399
     call  ready_for_next_irq
40 halyavin 400
     restore_ring3_context
33 mario79 401
     iret
15 poddubny 402
 
33 mario79 403
p_irq3:
40 halyavin 404
     save_ring3_context
33 mario79 405
     mov   ax, os_data
406
     mov   ds, ax
407
     mov   es, ax
58 mario79 408
     cmp   [com2_mouse_detected],0
409
     je    old_irq3_handler
33 mario79 410
     call  check_mouse_data_com2
58 mario79 411
     jmp   p_irq3_1
412
 old_irq3_handler:
413
     mov   edi,3
414
     call  irqhandler
415
  p_irq3_1:
40 halyavin 416
     restore_ring3_context
33 mario79 417
     iret
15 poddubny 418
 
33 mario79 419
p_irq4:
40 halyavin 420
     save_ring3_context
33 mario79 421
     mov   ax, os_data
422
     mov   ds, ax
423
     mov   es, ax
58 mario79 424
     cmp   [com1_mouse_detected],0
425
     je    old_irq4_handler
33 mario79 426
     call  check_mouse_data_com1
58 mario79 427
     jmp   p_irq4_1
428
 old_irq4_handler:
429
     mov   edi,4
430
     call  irqhandler
431
  p_irq4_1:
40 halyavin 432
     restore_ring3_context
11 poddubny 433
     iret
434
 
33 mario79 435
p_irq12:
40 halyavin 436
     save_ring3_context
33 mario79 437
     mov   ax, os_data
438
     mov   ds, ax
439
     mov   es, ax
440
     call  check_mouse_data_ps2
40 halyavin 441
     restore_ring3_context
33 mario79 442
     iret
443
 
444
ready_for_next_irq:
445
     mov    [check_idle_semaphore],5
446
     mov   al, 0x20
447
     out   0x20, al
448
     ret
449
 
450
ready_for_next_irq_1:
451
     mov    [check_idle_semaphore],5
452
     mov   al, 0x20
453
     out    0xa0,al
454
     out   0x20, al
455
     ret
456
 
6 poddubny 457
irqD:
40 halyavin 458
     save_ring3_context
8 poddubny 459
     mov   ax, os_data
460
     mov   ds, ax
461
     mov   es, ax
462
 
6 poddubny 463
     mov   dx,0xf0
464
     mov   al,0
465
     out   dx,al
1 ha 466
 
6 poddubny 467
     mov   dx,0xa0
468
     mov   al,0x20
469
     out   dx,al
470
     mov   dx,0x20
40 halyavin 471
     out   dx,al
472
 
473
     restore_ring3_context
6 poddubny 474
 
8 poddubny 475
     iret
1 ha 476
 
477
 
478
irqhandler:
479
 
480
     push   edi
481
 
482
     mov    esi,edi          ; 1
483
     shl    esi,6            ; 1
484
     add    esi,irq00read    ; 1
485
     shl    edi,12           ; 1
486
     add    edi,0x2E0000
75 diamond 487
     mov    ecx,16
1 ha 488
 
489
     mov    [check_idle_semaphore],5
490
 
491
   irqnewread:
75 diamond 492
     dec    ecx
493
     js     irqover
1 ha 494
 
495
     mov    dx,[esi]         ; 2+
496
 
497
     cmp    dx,0             ; 1
498
     jz     irqover
499
     cmp    [esi+3],byte 1   ; 2     ; byte read
500
     jne    noirqbyte        ; 4-11
501
 
502
     in     al,dx
503
 
504
     mov    edx,[edi]
505
     cmp    edx,4000
506
     je     irqfull
507
     mov    ebx,edi
508
     add    ebx,0x10
509
     add    ebx,edx
510
     mov    [ebx],al
511
     inc    edx
512
     mov    [edi],edx
513
 
514
     add    esi,4
515
     jmp    irqnewread
516
 
517
   noirqbyte:
518
 
519
 
520
     cmp    [esi+3],byte 2     ; word read
521
     jne    noirqword
522
 
523
     in     ax,dx
524
 
525
     mov    edx,[edi]
526
     cmp    edx,4000
527
     je     irqfull
528
     mov    ebx,edi
529
     add    ebx,0x10
530
     add    ebx,edx
531
     mov    [ebx],ax
532
     add    edx,2
533
     mov    [edi],edx
534
     add    esi,4
535
     jmp    irqnewread
536
 
537
   noirqword:
538
   irqfull:
539
   irqover:
540
 
541
     mov    al,0x20            ; ready for next irq
542
     out    0x20,al
543
 
544
     pop    ebx
545
     cmp    ebx,7
546
     jbe    noa0
547
     out    0xa0,al
548
   noa0:
549
 
550
     ret
551
 
552
 
553
 
554
set_application_table_status:
555
        push eax
556
 
557
        mov  eax,[0x3000]
558
        shl  eax, 5
115 poddubny 559
        add  eax,0x3000+TASKDATA.pid
1 ha 560
        mov  eax,[eax]
561
 
562
        mov  [application_table_status],eax
563
 
564
        pop  eax
565
 
566
        ret
567
 
568
 
569
clear_application_table_status:
570
        push eax
571
 
572
        mov  eax,[0x3000]
573
        shl  eax, 5
115 poddubny 574
        add  eax,0x3000+TASKDATA.pid
1 ha 575
        mov  eax,[eax]
576
 
577
        cmp  eax,[application_table_status]
578
        jne  apptsl1
579
        mov  [application_table_status],0
580
      apptsl1:
581
 
582
        pop  eax
583
 
584
        ret
585
 
586
 
587
 
588
sys_resize_app_memory:
589
        ; eax = 1 - resize
590
        ;     ebx = new amount of memory
591
 
592
        cmp    eax,1
4 poddubny 593
        jne    .no_application_mem_resize
1 ha 594
 
4 poddubny 595
        jmp    new_mem_resize ;resize for new type of processes
1 ha 596
 
597
 
4 poddubny 598
     .no_application_mem_resize:
1 ha 599
 
600
        ret
601
 
602
 
603
 
604
get_app_params:
605
 
606
    push eax
607
 
608
    cmp  [0x90000+6],word '00'
609
    jne  no_00_header
610
 
611
    mov  eax,[0x90000+12]
612
    mov  [app_start],eax
613
    mov  eax,[0x90000+16]
614
    mov  [app_i_end],eax
615
    mov  eax,[0x90000+20]
616
    mov  [app_mem],eax
133 diamond 617
; \begin{diamond}[20.08.2006]
618
; sanity check (functions 19,58 load app_i_end bytes and that must
619
; fit in allocated memory to prevent kernel faults)
620
    cmp  eax,[app_i_end]
621
    jb   no_01_header
622
; \end{diamond}[20.08.2006]
1 ha 623
    shr  eax,1
624
    sub  eax,0x10
625
    mov  [app_esp],eax
626
    mov  eax,[0x90000+24]
627
    mov  [app_i_param],eax
628
    mov  [app_i_icon],dword 0
629
 
630
    pop  eax
133 diamond 631
    clc
1 ha 632
    ret
633
 
634
  no_00_header:
635
 
636
 
637
    cmp  [0x90000+6],word '01'
638
    jne  no_01_header
639
 
640
    mov  eax,[0x90000+12]
641
    mov  [app_start],eax
642
    mov  eax,[0x90000+16]
643
    mov  [app_i_end],eax
644
    mov  eax,[0x90000+20]
645
    mov  [app_mem],eax
133 diamond 646
; \begin{diamond}[20.08.2006]
647
    cmp  eax,[app_i_end]
648
    jb   no_01_header
649
; \end{diamond}[20.08.2006]
1 ha 650
    mov  eax,[0x90000+24]
651
    mov  [app_esp],eax
652
    mov  eax,[0x90000+28]
653
    mov  [app_i_param],eax
654
    mov  eax,[0x90000+32]
655
    mov  [app_i_icon],eax
656
 
657
    pop  eax
133 diamond 658
    clc
1 ha 659
    ret
660
 
661
   no_01_header:
662
 
663
    pop  eax
133 diamond 664
    stc
1 ha 665
    ret
666
 
667
 
668
uglobal
669
  new_process_place  dd  0x0
670
  app_start    dd  0x0
671
  app_i_end    dd  0x0
672
  app_mem      dd  0x0
673
  app_esp      dd  0x0
674
  app_i_param  dd  0x0
675
  app_i_icon   dd  0x0
115 poddubny 676
  ;app_mem_pos  dd  0x0
5 halyavin 677
  appl_path        dd 0x0
678
  appl_path_size   dd 0x0
1 ha 679
endg
680
 
681
 
682
sys_threads:
683
 
684
; eax=1 create thread
685
;
686
;   ebx=thread start
687
;   ecx=thread stack value
688
;
689
; on return : eax = pid
690
jmp new_sys_threads
691
 
692
iglobal
693
  process_terminating   db 'K : Process - terminating',13,10,0
694
  process_terminated    db 'K : Process - done',13,10,0
695
endg
696
 
697
 
698
terminate: ; terminate application
699
    push   esi
700
    mov    esi,process_terminating
701
    call   sys_msg_board_str
702
    pop    esi
703
 
40 halyavin 704
@@:
1 ha 705
    cli
706
    cmp   [application_table_status],0
707
    je    term9
708
    sti
709
    call  change_task
40 halyavin 710
    jmp   @b
1 ha 711
  term9:
712
 
713
    call  set_application_table_status
714
 
715
    mov    eax,esi
716
    call   dispose_app_cr3_table
717
 
718
    cmp   [prev_user_of_fpu],esi   ; if user fpu last -> fpu user = 1
719
    jne   fpu_ok_1
720
    mov   [prev_user_of_fpu],1
721
  fpu_ok_1:
722
 
723
    mov   [0xf400],byte 0           ; empty keyboard buffer
724
    mov   [0xf500],byte 0           ; empty button buffer
725
 
726
 
92 diamond 727
; remove defined hotkeys
728
        mov     eax, hotkey_list
729
.loop:
730
        cmp     [eax+8], esi
731
        jnz     .cont
732
        mov     ecx, [eax]
733
        jecxz   @f
734
        push    dword [eax+12]
735
        pop     dword [ecx+12]
736
@@:
737
        mov     ecx, [eax+12]
738
        push    dword [eax]
739
        pop     dword [ecx]
740
        xor     ecx, ecx
741
        mov     [eax], ecx
742
        mov     [eax+4], ecx
743
        mov     [eax+8], ecx
744
        mov     [eax+12], ecx
745
.cont:
746
        add     eax, 16
747
        cmp     eax, hotkey_list+256*16
748
        jb      .loop
749
; remove hotkeys in buffer
750
        mov     eax, hotkey_buffer
751
.loop2:
752
        cmp     [eax], esi
753
        jnz     .cont2
754
        and     dword [eax+4], 0
755
        and     dword [eax], 0
756
.cont2:
757
        add     eax, 8
758
        cmp     eax, hotkey_buffer+120*8
759
        jb      .loop2
760
 
1 ha 761
    mov   ecx,esi                 ; remove buttons
762
  bnewba2:
763
    mov   edi,[0xfe88]
764
    mov   eax,edi
765
    cld
766
    movzx ebx,word [edi]
767
    inc   bx
768
  bnewba:
769
    dec   bx
770
    jz    bnmba
771
    add   eax,0x10
772
    cmp   cx,[eax]
773
    jnz   bnewba
774
    pusha
775
    mov   ecx,ebx
776
    inc   ecx
777
    shl   ecx,4
778
    mov   ebx,eax
779
    add   eax,0x10
780
    call  memmove
781
    dec   dword [edi]
782
    popa
783
    jmp   bnewba2
784
  bnmba:
785
 
786
    pusha     ; save window coordinates for window restoring
787
    cld
788
    shl   esi,5
789
    add   esi,window_data
114 mikedld 790
    mov   eax,[esi+WDATA.box.left]
102 poddubny 791
    mov   [dlx],eax
114 mikedld 792
    add   eax,[esi+WDATA.box.width]
102 poddubny 793
    mov   [dlxe],eax
114 mikedld 794
    mov   eax,[esi+WDATA.box.top]
102 poddubny 795
    mov   [dly],eax
114 mikedld 796
    add   eax,[esi+WDATA.box.height]
102 poddubny 797
    mov   [dlye],eax
1 ha 798
 
142 diamond 799
    xor   eax, eax
800
    mov   [esi+WDATA.box.left],eax
801
    mov   [esi+WDATA.box.width],eax
114 mikedld 802
    mov   [esi+WDATA.box.top],eax
142 diamond 803
    mov   [esi+WDATA.box.height],eax
115 poddubny 804
    mov   [esi+WDATA.cl_workarea],eax
805
    mov   [esi+WDATA.cl_titlebar],eax
806
    mov   [esi+WDATA.cl_frames],eax
807
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
102 poddubny 808
    lea   edi, [esi-window_data+draw_data]
1 ha 809
    mov   ecx,32/4
810
    rep   stosd
811
    popa
812
 
40 halyavin 813
; debuggee test
814
    pushad
815
    mov  edi, esi
816
    shl  edi, 5
115 poddubny 817
    mov  eax, [0x80000+edi*8+APPDATA.debugger_slot]
40 halyavin 818
    test eax, eax
819
    jz   .nodebug
820
    push 8
821
    pop  ecx
115 poddubny 822
    push dword [0x3000+edi+TASKDATA.pid]   ; PID
40 halyavin 823
    push 2
824
    call debugger_notify
825
    pop  ecx
826
    pop  ecx
827
.nodebug:
828
    popad
829
 
1 ha 830
    pusha         ; at 0x80000+
831
    mov   edi,esi
832
    shl   edi,8
833
    add   edi,0x80000
834
    mov   ecx,256/4
835
    xor   eax, eax
836
    rep   stosd
837
    popa
838
 
839
    pusha          ; name to spaces
840
    mov   edi,esi
841
    shl   edi,8
115 poddubny 842
    add   edi,0x80000+APPDATA.app_name
1 ha 843
    mov   ecx,11
844
    mov   eax,' '
845
    rep   stosb
846
    popa
847
 
848
 
102 poddubny 849
  ; activate window
850
        movzx  eax, word [0xC000 + esi*2]
851
        cmp    eax, [0x3004]
852
        jne    .dont_activate
853
        pushad
854
 .check_next_window:
855
        dec    eax
856
        cmp    eax, 1
857
        jbe    .nothing_to_activate
858
        lea    esi, [0xc400+eax*2]
859
        movzx  edi, word [esi]               ; edi = process
860
        shl    edi, 5
115 poddubny 861
        cmp    [0x3000 + edi + TASKDATA.state], byte 9  ; skip dead slots
102 poddubny 862
        je     .check_next_window
863
        add    edi, window_data
864
        call   waredraw
865
 .nothing_to_activate:
866
        popad
867
 .dont_activate:
868
 
92 diamond 869
        push    esi     ; remove hd1 & cd & flp reservation
870
        shl     esi, 5
118 diamond 871
        mov     esi, [esi+0x3000+TASKDATA.pid]
92 diamond 872
        cmp     [hd1_status], esi
873
        jnz     @f
874
        mov     [hd1_status], 0
875
@@:
876
        cmp     [cd_status], esi
877
        jnz     @f
878
        mov     [cd_status], 0
879
@@:
880
        cmp     [flp_status], esi
881
        jnz     @f
882
        mov     [flp_status], 0
883
@@:
884
        pop     esi
1 ha 885
 
886
    pusha ; remove all irq reservations
92 diamond 887
    mov   eax,esi
115 poddubny 888
    shl   eax, 5
118 diamond 889
    mov   eax,[eax+0x3000+TASKDATA.pid]
1 ha 890
    mov   edi,irq_owner
891
    mov   ecx,16
892
  newirqfree:
92 diamond 893
    scasd
1 ha 894
    jne   nofreeirq
92 diamond 895
    mov   [edi-4],dword 0
1 ha 896
  nofreeirq:
897
    loop   newirqfree
898
    popa
899
 
900
 
901
    pusha                     ; remove all port reservations
902
    mov   edx,esi
115 poddubny 903
    shl   edx, 5
1 ha 904
    add   edx,0x3000
115 poddubny 905
    mov   edx,[edx+TASKDATA.pid]
1 ha 906
 
907
  rmpr0:
908
 
909
    mov   esi,[0x2d0000]
910
 
911
    cmp   esi,0
912
    je    rmpr9
913
 
914
  rmpr3:
915
 
916
    mov   edi,esi
917
    shl   edi,4
918
    add   edi,0x2d0000
919
 
920
    cmp   edx,[edi]
921
    je    rmpr4
922
 
923
    dec   esi
924
    jnz   rmpr3
925
 
926
    jmp   rmpr9
927
 
928
  rmpr4:
929
 
930
    mov   ecx,256
931
    sub   ecx,esi
932
    shl   ecx,4
933
 
934
    mov   esi,edi
935
    add   esi,16
936
    cld
937
    rep   movsb
938
 
939
    dec   dword [0x2d0000]
940
 
941
    jmp   rmpr0
942
 
943
  rmpr9:
944
 
945
    popa
946
    mov  edi,esi         ; do not run this process slot
6 poddubny 947
    shl  edi, 5
115 poddubny 948
    mov  [edi+0x3000 + TASKDATA.state],byte 9
40 halyavin 949
; debugger test - terminate all debuggees
950
    mov  eax, 2
115 poddubny 951
    mov  ecx, 0x80000+2*0x100+APPDATA.debugger_slot
40 halyavin 952
.xd0:
953
    cmp  eax, [0x3004]
954
    ja   .xd1
955
    cmp  dword [ecx], esi
956
    jnz  @f
957
    and  dword [ecx], 0
958
    pushad
959
    xchg eax, ebx
960
    mov  eax, 2
961
    call sys_system
962
    popad
963
@@:
964
    inc  eax
965
    add  ecx, 0x100
966
    jmp  .xd0
967
.xd1:
1 ha 968
;    call  systest
969
    sti  ; .. and life goes on
970
 
112 poddubny 971
    mov   eax, [dlx]
972
    mov   ebx, [dly]
973
    mov   ecx, [dlxe]
974
    mov   edx, [dlye]
1 ha 975
    call  calculatescreen
976
    xor   eax, eax
977
    xor   esi, esi
978
    call  redrawscreen
979
 
980
    mov   [0xfff4],byte 0  ; no mouse background
981
    mov   [0xfff5],byte 0  ; draw mouse
982
 
983
    mov   [application_table_status],0
984
    mov   esi,process_terminated
985
    call  sys_msg_board_str
986
 
987
    ret
988
 
989
iglobal
990
  boot_sched_1    db   'Building gdt tss pointer',0
8 poddubny 991
  boot_sched_2    db   'Building IDT table',0
1 ha 992
endg
993
 
994
 
995
build_scheduler:
996
 
997
        mov    esi,boot_sched_1
998
        call   boot_log
999
        call   build_process_gdt_tss_pointer
1000
 
8 poddubny 1001
        mov    esi,boot_sched_2
1 ha 1002
        call   boot_log
1003
        call   build_interrupt_table
1004
 
1005
        ret
1006