Subversion Repositories Kolibri OS

Rev

Rev 750 | Rev 769 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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