| ;; ----------------------------------------------------------------------- |
| ;; |
| ;; Copyright 2009 Intel Corporation; author: H. Peter Anvin |
| ;; |
| ;; This program is free software; you can redistribute it and/or modify |
| ;; it under the terms of the GNU General Public License as published by |
| ;; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
| ;; Boston MA 02110-1301, USA; either version 2 of the License, or |
| ;; (at your option) any later version; incorporated herein by reference. |
| ;; |
| ;; ----------------------------------------------------------------------- |
| |
| ;; |
| ;; timer.inc |
| ;; |
| ;; Very simple counting timer |
| ;; |
| ;; This lets us have a simple incrementing variable without worrying |
| ;; about the BIOS_timer variable wrapping around at "midnight" and other |
| ;; weird things. |
| ;; |
| ;; This also maintains a timer variable calibrated in milliseconds |
| ;; (wraparound time = 49.7 days!) |
| ;; |
| |
| section .text16 |
| |
| timer_init: |
| ; Hook INT 1Ch |
| mov eax,[BIOS_timer_hook] |
| mov [BIOS_timer_next],eax |
| mov dword [BIOS_timer_hook],timer_irq |
| ret |
| |
| global bios_timer_cleanup:function hidden |
| bios_timer_cleanup: |
| ; Unhook INT 1Ch |
| mov eax,[BIOS_timer_next] |
| mov [BIOS_timer_hook],eax |
| ret |
| |
| ; |
| ; The specified frequency is 14.31818 MHz/12/65536; this turns out |
| ; to be a period of 54.92542 ms, or 0x36.ece8(187c) hexadecimal. |
| ; |
| global timer_irq:function hidden |
| timer_irq: |
| inc dword [cs:__jiffies] |
| add word [cs:__ms_timer_adj],0xece8 |
| adc dword [cs:__ms_timer],0x36 |
| jmp 0:0 |
| global BIOS_timer_next:data hidden |
| BIOS_timer_next equ $-4 |
| |
| section .data16 |
| alignz 4 |
| global __jiffies:data hidden, __ms_timer |
| __jiffies dd 0 ; Clock tick timer |
| __ms_timer dd 0 ; Millisecond timer |
| __ms_timer_adj dw 0 ; Millisecond timer correction factor |