Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; IRQ0 HANDLER (TIMER INTERRUPT) ;;
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4.  
  5.  
  6. align 32
  7. irq0:
  8.         save_ring3_context
  9.         mov   ax, os_data
  10.         mov   ds, ax
  11.         mov   es, ax
  12.  
  13.         inc   dword [timer_ticks]
  14.  
  15.         mov   eax, [timer_ticks]
  16.         call  playNote           ; <<<--- Speaker driver
  17.  
  18.         cmp   eax,[next_usage_update]
  19.         jb    .nocounter
  20.         add   eax,100
  21.         mov   [next_usage_update],eax
  22.         call  updatecputimes
  23.      .nocounter:
  24.  
  25.         cmp   [0xffff], byte 1
  26.         jne   .change_task
  27.  
  28.         mov   al,0x20   ; send End Of Interrupt signal
  29.         mov   dx,0x20
  30.         out   dx,al
  31.  
  32.         mov   [0xffff], byte 0
  33.  
  34.         restore_ring3_context
  35.         iret
  36.  
  37.      .change_task:
  38.         call  update_counters
  39.  
  40.         call  find_next_task
  41.         mov   ecx, eax
  42.  
  43.         mov   al,0x20   ; send End Of Interrupt signal
  44.         mov   dx,0x20
  45.         out   dx,al
  46.  
  47.         test  ecx, ecx  ; if there is only one running process
  48.         jnz   .return
  49.  
  50.         call  do_change_task
  51.        
  52.      .return:
  53.         restore_ring3_context
  54.         iret
  55.  
  56.  
  57. align 4
  58. change_task:
  59.  
  60.         pushfd
  61.         cli
  62.         pushad
  63.  
  64.         call  update_counters
  65.         call  find_next_task
  66.         test  eax, eax    ; the same task -> skip switch
  67.         jnz    .return
  68.  
  69.         mov   [0xffff],byte 1
  70.         call  do_change_task
  71.  
  72.      .return:
  73.         popad
  74.         popfd
  75.  
  76.         ret
  77.  
  78.  
  79. uglobal
  80.    align 4
  81.    far_jump:
  82.     .offs dd ?
  83.     .sel  dw ?
  84.    context_counter     dd ? ;noname & halyavin
  85.    next_usage_update   dd ?
  86.    timer_ticks         dd ?
  87.    prev_slot           dd ?
  88.    event_sched         dd ?
  89. endg
  90.  
  91.  
  92. update_counters:
  93.         mov   edi, [0x3010]
  94.         mov   ebx, [edi+0x18] ; time stamp counter add
  95.         call  _rdtsc
  96.         sub   eax, ebx
  97.         add   eax, [edi+0x14] ; counter sum
  98.         mov   [edi+0x14], eax
  99. ret
  100.  
  101.  
  102. ; Find next task to execute
  103. ; result: ebx = number of the selected task
  104. ;         [0xffff] = 1  if the task is the same
  105. find_next_task:
  106.         mov   ebx,[0x3000]
  107.         mov   [prev_slot], ebx
  108.  
  109.       .waiting_for_termination:
  110.       .waiting_for_reuse:
  111.       .waiting_for_event:
  112.       .suspended:
  113.         cmp   ebx, [0x3004]
  114.         jb    @f
  115.         mov   edi, 0x3000
  116.         xor   ebx, ebx
  117.       @@:
  118.  
  119.         add   edi,0x20
  120.         inc   ebx
  121.  
  122.         mov   al, byte [edi+0xA]
  123.         test  al, al
  124.         jz    .found
  125.         cmp   al, 1
  126.         jz    .suspended
  127.         cmp   al, 2
  128.         jz    .suspended
  129.         cmp   al, 3
  130.         je    .waiting_for_termination
  131.         cmp   al, 4
  132.         je    .waiting_for_termination
  133.         cmp   al, 9
  134.         je    .waiting_for_reuse
  135.  
  136.         mov   [0x3000],ebx
  137.         mov   [0x3010],edi
  138.  
  139.         cmp   al, 5
  140.         jne   .noevents
  141.         call  get_event_for_app
  142.         test  eax, eax
  143.         jz    .waiting_for_event
  144.         mov   [event_sched], eax
  145.         mov   [edi+0xA], byte 0
  146.       .noevents:
  147.       .found:
  148.         mov   [0x3000],ebx
  149.         mov   [0x3010],edi
  150.         call  _rdtsc
  151.         mov   [edi+0x18],eax
  152.  
  153.         xor   eax, eax
  154.         cmp   ebx, [prev_slot]
  155.         sete  al
  156. ret
  157.  
  158. ; in: ebx = TSS selector index
  159. do_change_task:
  160.         shl   ebx, 3
  161.         xor   eax, eax
  162.         add   ebx, tss0
  163.         mov   [far_jump.sel],  bx   ; selector
  164.         mov   [far_jump.offs], eax  ; offset
  165.         jmp   pword [far_jump]
  166.         inc   [context_counter] ;noname & halyavin
  167. ret
  168.  
  169.  
  170.  
  171. align 4
  172. updatecputimes:
  173.  
  174.         mov  eax,[idleuse]
  175.         mov  [idleusesec],eax
  176.         mov  [idleuse],dword 0
  177.         mov  ecx, [0x3004]
  178.         mov  edi, 0x3020
  179.       .newupdate:
  180.         mov  ebx,[edi+0x14]
  181.         mov  [edi+0x1c],ebx
  182.         mov  [edi+0x14],dword 0
  183.         add  edi,0x20
  184.         dec  ecx
  185.         jnz  .newupdate
  186.  
  187.         ret
  188.