Subversion Repositories Kolibri OS

Rev

Rev 66 | Rev 101 | 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. align 32
  6. irq0:
  7.         save_ring3_context
  8.         mov   ax, os_data
  9.         mov   ds, ax
  10.         mov   es, ax
  11.  
  12.         mov   edi,[0x3000]
  13.         shl   edi, 3
  14.                          ; fields of TSS descriptor:
  15. ;        mov   [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
  16.  
  17.         inc   dword [timer_ticks]
  18.  
  19.         mov   eax, [timer_ticks]
  20.         call  playNote           ; <<<--- Speaker driver
  21.  
  22.         cmp   eax,[next_usage_update]
  23.         jb    .nocounter
  24.         add   eax,100
  25.         mov   [next_usage_update],eax
  26.         call  updatecputimes
  27.      .nocounter:
  28.  
  29.         mov   edi, [0x3010]
  30.  
  31.         mov   ebx, [edi+0x18] ; time stamp counter add
  32.         call  _rdtsc
  33.         sub   eax, ebx
  34.         add   eax, [edi+0x14] ; counter sum
  35.         mov   [edi+0x14], eax
  36.  
  37.         mov   ebx,[0x3000]
  38.         mov   [prev_slot], ebx
  39.  
  40.         cmp   [0xffff], byte 1
  41.         je    .do_not_change_task
  42.  
  43.  
  44.       .waiting_for_termination:
  45.       .waiting_for_reuse:
  46.       .waiting_for_event:
  47.       .suspended:
  48.         cmp   ebx, [0x3004]
  49.         jb    @f
  50.         mov   edi, 0x3000
  51.         xor   ebx, ebx
  52.       @@:
  53.  
  54.         add   edi,0x20
  55.         inc   ebx
  56.  
  57.         mov   al, byte [edi+0xA]
  58.         cmp   al, 1
  59.         jz    .suspended
  60.         cmp   al, 2
  61.         jz    .suspended
  62.         cmp   al, 3
  63.         je    .waiting_for_termination
  64.         cmp   al, 4
  65.         je    .waiting_for_termination
  66.         cmp   al, 9
  67.         je    .waiting_for_reuse
  68.  
  69.         mov   [0x3000],ebx
  70.         mov   [0x3010],edi
  71.  
  72.         cmp   al, 5
  73.         jne   .noevents
  74.         call  get_event_for_app
  75.         test  eax, eax
  76.         jz    .waiting_for_event
  77.         mov   [event_sched], eax
  78.         mov   [edi+0xA], byte 0
  79.       .noevents:
  80.         cmp   ebx, [prev_slot]
  81.         sete  [0xffff]
  82.  
  83.  
  84.      .do_not_change_task:
  85.  
  86.         call  _rdtsc
  87.         mov   [edi+0x18],eax
  88.  
  89.         shl   ebx, 3
  90.         xor   eax, eax
  91.         add   ebx, tss0
  92.         mov   word  [far_jump.sel],  bx   ; selector
  93.         mov   dword [far_jump.offs], eax  ; offset
  94.        
  95.         cmp   [irq0needeoi],byte 0
  96.         mov   [irq0needeoi],byte 1          
  97.         jz    .noeoi
  98.  
  99.         mov   al,0x20   ; send End Of Interrupt signal
  100.         mov   dx,0x20
  101.         out   dx,al
  102. .noeoi:  
  103.  
  104.         cmp   [0xffff],byte 0
  105.         je    .switch
  106.         dec   byte [0xffff]
  107.         jz    @f
  108.      .switch:
  109.         jmp   pword [far_jump]
  110.         inc   [context_counter] ;noname & halyavin
  111.        @@:
  112.        
  113.         restore_ring3_context
  114.         iret
  115.  
  116.  
  117. uglobal
  118.    align 4
  119.    far_jump:
  120.     .offs dd ?
  121.     .sel  dw ?
  122.    context_counter     dd ? ;noname & halyavin
  123.    next_usage_update   dd ?
  124.    timer_ticks         dd ?
  125.    prev_slot dd ?
  126.    event_sched dd ?
  127. endg
  128. iglobal
  129.    irq0needeoi         db 1  
  130. endg
  131.  
  132.  
  133. align 4
  134. change_task:
  135.  
  136.         pushfd
  137.         cli
  138.         mov   [0xffff],byte 2
  139.  
  140.         mov   [irq0needeoi],byte 0
  141.         dec   dword [timer_ticks]  ; because irq0 will increase it
  142.  
  143.         int   0x20   ; irq0 handler
  144.         popfd
  145.  
  146.         ret
  147.  
  148.  
  149.  
  150. align 4
  151. updatecputimes:
  152.  
  153.         mov  eax,[idleuse]
  154.         mov  [idleusesec],eax
  155.         mov  [idleuse],dword 0
  156.         mov  ecx, [0x3004]
  157.         mov  edi, 0x3020
  158.       .newupdate:
  159.         mov  ebx,[edi+0x14]
  160.         mov  [edi+0x1c],ebx
  161.         mov  [edi+0x14],dword 0
  162.         add  edi,0x20
  163.         dec  ecx
  164.         jnz  .newupdate
  165.  
  166.         ret
  167.