Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1 ha 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;; IRQ0 HANDLER (TIMER INTERRUPT) ;;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
 
5
align 32
6
irq0:
40 halyavin 7
        save_ring3_context
8 poddubny 8
	mov   ax, os_data
9
	mov   ds, ax
10
	mov   es, ax
1 ha 11
 
12
        mov   edi,[0x3000]
13
        shl   edi, 3
14
                         ; fields of TSS descriptor:
66 diamond 15
;        mov   [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
1 ha 16
 
17
        inc   dword [timer_ticks]
18
 
19
        mov   eax, [timer_ticks]
22 poddubny 20
        call  playNote           ; <<<--- Speaker driver
21
 
1 ha 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]
21 poddubny 38
        mov   [prev_slot], ebx
1 ha 39
 
8 poddubny 40
        cmp   [0xffff], byte 1
41
        je    .do_not_change_task
1 ha 42
 
21 poddubny 43
 
1 ha 44
      .waiting_for_termination:
45
      .waiting_for_reuse:
21 poddubny 46
      .waiting_for_event:
40 halyavin 47
      .suspended:
21 poddubny 48
        cmp   ebx, [0x3004]
49
        jb    @f
50
        mov   edi, 0x3000
51
        xor   ebx, ebx
52
      @@:
53
 
1 ha 54
        add   edi,0x20
55
        inc   ebx
56
 
57
        mov   al, byte [edi+0xA]
40 halyavin 58
	cmp   al, 1
59
	jz    .suspended
60
	cmp   al, 2
61
	jz    .suspended
1 ha 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
 
21 poddubny 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
26 halyavin 79
      .noevents:
21 poddubny 80
        cmp   ebx, [prev_slot]
81
        sete  [0xffff]
82
 
83
 
8 poddubny 84
     .do_not_change_task:
1 ha 85
 
86
        call  _rdtsc
87
        mov   [edi+0x18],eax
88
 
89
        shl   ebx, 3
90
        xor   eax, eax
91
        add   ebx, tss0
14 poddubny 92
        mov   word  [far_jump.sel],  bx   ; selector
93
        mov   dword [far_jump.offs], eax  ; offset
100 halyavin 94
 
95
        cmp   [irq0needeoi],byte 0
96
        mov   [irq0needeoi],byte 1
97
        jz    .noeoi
1 ha 98
 
99
        mov   al,0x20   ; send End Of Interrupt signal
100
        mov   dx,0x20
101
        out   dx,al
100 halyavin 102
.noeoi:
8 poddubny 103
 
10 poddubny 104
        cmp   [0xffff],byte 0
105
        je    .switch
106
        dec   byte [0xffff]
11 poddubny 107
        jz    @f
10 poddubny 108
     .switch:
14 poddubny 109
        jmp   pword [far_jump]
9 halyavin 110
        inc   [context_counter] ;noname & halyavin
8 poddubny 111
       @@:
10 poddubny 112
 
40 halyavin 113
        restore_ring3_context
8 poddubny 114
        iret
1 ha 115
 
8 poddubny 116
 
117
uglobal
21 poddubny 118
   align 4
14 poddubny 119
   far_jump:
120
    .offs dd ?
121
    .sel  dw ?
122
   context_counter     dd ? ;noname & halyavin
123
   next_usage_update   dd ?
124
   timer_ticks         dd ?
21 poddubny 125
   prev_slot dd ?
126
   event_sched dd ?
1 ha 127
endg
100 halyavin 128
iglobal
129
   irq0needeoi         db 1
130
endg
1 ha 131
 
132
 
133
align 4
134
change_task:
135
 
100 halyavin 136
        pushfd
137
        cli
1 ha 138
        mov   [0xffff],byte 2
139
 
100 halyavin 140
        mov   [irq0needeoi],byte 0
1 ha 141
        dec   dword [timer_ticks]  ; because irq0 will increase it
142
 
143
        int   0x20   ; irq0 handler
100 halyavin 144
        popfd
1 ha 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