-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimer.asm
104 lines (79 loc) · 1.3 KB
/
timer.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
bits 16
cpu 386
segment _TEXT class=CODE
global timer_init_
timer_init_:
push ax
push es
push ds
mov ax, 3508h
int 21h
mov [prev_isr], bx
mov [prev_isr + 2], es
cli
mov ax, 2508h
mov dx, timer_isr ; ds is already equal to cs
int 21h
; Set to 1165.215 Hz
mov dx, 0x43
mov al, 0x36
out dx, al
mov dx, 0x40
mov al, 0x00 ; Divisor LSB
out dx, al
mov al, 0x04 ; MSB
out dx, al
sti
pop ds
pop es
pop ax
ret
global timer_cleanup_
timer_cleanup_:
push ax
push dx
push ds
cli
mov dx, [prev_isr]
mov ds, [prev_isr + 2]
mov ax, 2508h
int 21h
mov dx, 0x43
mov al, 0x36
out dx, al
mov dx, 0x40
mov al, 0
out dx, al
out dx, al
sti
pop ds
pop dx
pop ax
ret
extern _timer_ticks
extern timer_update_
timer_isr:
inc dword [cs:_timer_ticks]
pushad
push ds
push es
mov ax, cs
mov ds, ax
mov es, ax
call timer_update_
pop es
pop ds
popad
dec word [cs:clock_counter]
jz clock_update
push ax
mov al, 0x20
out 0x20, al
pop ax
iret
clock_update:
mov word [cs:clock_counter], 0x40
jmp far [cs:prev_isr]
align 4
prev_isr dd 0
clock_counter dw 0x40