core, pxe: Don't push on one stack and pop from the other in pxenv
[syslinux.git] / core / timer.inc
blob8064798310b94c3cb4cafdfcf7019526c93f8f0f
1 ;; -----------------------------------------------------------------------
2 ;;
3 ;;   Copyright 2009 Intel Corporation; author: H. Peter Anvin
4 ;;
5 ;;   This program is free software; you can redistribute it and/or modify
6 ;;   it under the terms of the GNU General Public License as published by
7 ;;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
8 ;;   Boston MA 02110-1301, USA; either version 2 of the License, or
9 ;;   (at your option) any later version; incorporated herein by reference.
11 ;; -----------------------------------------------------------------------
14 ;; timer.inc
16 ;; Very simple counting timer
18 ;; This lets us have a simple incrementing variable without worrying
19 ;; about the BIOS_timer variable wrapping around at "midnight" and other
20 ;; weird things.
22 ;; This also maintains a timer variable calibrated in milliseconds
23 ;; (wraparound time = 49.7 days!)
26                 section .text16
28 timer_init:
29                 ; Hook INT 1Ch
30                 mov eax,[BIOS_timer_hook]
31                 mov [BIOS_timer_next],eax
32                 mov dword [BIOS_timer_hook],timer_irq
33                 ret
35                 global bios_timer_cleanup:function hidden
36 bios_timer_cleanup:
37                 ; Unhook INT 1Ch
38                 mov eax,[BIOS_timer_next]
39                 mov [BIOS_timer_hook],eax
40                 ret
43 ; The specified frequency is 14.31818 MHz/12/65536; this turns out
44 ; to be a period of 54.92542 ms, or 0x36.ece8(187c) hexadecimal.
46                 global timer_irq:function hidden
47 timer_irq:
48                 inc dword [cs:__jiffies]
49                 add word  [cs:__ms_timer_adj],0xece8
50                 adc dword [cs:__ms_timer],0x36
51                 jmp 0:0
52                 global BIOS_timer_next:data hidden
53 BIOS_timer_next equ $-4
55                 section .data16
56                 alignz 4
57                 global __jiffies:data hidden, __ms_timer
58 __jiffies       dd 0                    ; Clock tick timer
59 __ms_timer      dd 0                    ; Millisecond timer
60 __ms_timer_adj  dw 0                    ; Millisecond timer correction factor