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. 10;; 11;; ----------------------------------------------------------------------- 12 13;; 14;; timer.inc 15;; 16;; Very simple counting timer 17;; 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. 21;; 22;; This also maintains a timer variable calibrated in milliseconds 23;; (wraparound time = 49.7 days!) 24;; 25 26 section .text16 27 28timer_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 34 35 global bios_timer_cleanup:function hidden 36bios_timer_cleanup: 37 ; Unhook INT 1Ch 38 mov eax,[BIOS_timer_next] 39 mov [BIOS_timer_hook],eax 40 ret 41 42; 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. 45; 46 global timer_irq:function hidden 47timer_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 53BIOS_timer_next equ $-4 54 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 61