summaryrefslogtreecommitdiff
path: root/asm/pit.s
blob: ab8dcdb7edd98cb7a8b4dffccc5d071537f54071 (plain)
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
.global pit_init
.global pit_interrupt_handler
.global pit_get_ticks

ticks:
.int 0

pit_get_ticks:
    
    mov (ticks),%eax
    ret

pit_interrupt_handler:

    // increase tick counter
    push %eax
    mov $ticks, %eax
    incl (%eax)
    pop %eax

    ////

    pusha          //Push all standard registers

    mov %esp, %eax	//save current stack pointer (pointing to registers!)

    movl $stack_top, %esp	//use stack from multiboot.s(16Kb)

    // call our scheduler passing it the old stack addres (pointing to pushed registers (pusha))
    push %eax   
    call task_switch_next 

    // the scheduler returned the new stack pointer (after taskswitch)
    mov %eax, %esp   //Replace the stack with what the C code gave us

    // acknowlege irq
    mov $0x20,%al   
    out %al,$0x20   
    
    popa           //Put the standard registers back

    iret

pit_init:

    // configure ticking 25 times a second
    // 1193180 / 25 = 47727.2
    mov $47727, %dx

    mov $0b00110100, %al
    outb %al,$0x43

    mov %dx,%ax

    out %al, $0x40
    xchg %ah,%al
    out %al, $0x40

    ret