source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/Timer.asm @ 376

Last change on this file since 376 was 376, checked in by gregli@…, 12 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 3.9 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Timeout and delay functions for INT 13h services.
3
4;
5; XTIDE Universal BIOS and Associated Tools 
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12; 
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html               
18;       
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Timer_InitializeTimeoutWithTicksInCL
25;   Parameters:
26;       CL:     Timeout value in system timer ticks
27;       DS:     Segment to RAMVARS
28;   Returns:
29;       Nothing
30;   Corrupts registers:
31;       CX
32;--------------------------------------------------------------------
33ALIGN JUMP_ALIGN
34Timer_InitializeTimeoutWithTicksInCL:
35    mov     [RAMVARS.bTimeoutTicksLeft], cl     ; Ticks until timeout
36    call    ReadTimeFromBdaToCX
37    mov     [RAMVARS.bLastTimeoutUpdate], cl    ; Start time
38    ret
39
40
41;--------------------------------------------------------------------
42; Timer_SetCFifTimeout
43;   Parameters:
44;       DS:     Segment to RAMVARS
45;   Returns:
46;       CF:     Set if timeout
47;               Cleared if time left
48;   Corrupts registers:
49;       CX
50;--------------------------------------------------------------------
51ALIGN JUMP_ALIGN
52Timer_SetCFifTimeout:
53    call    ReadTimeFromBdaToCX
54    cmp     cl, [RAMVARS.bLastTimeoutUpdate]
55    je      SHORT .StillPollingTheSameTick
56    mov     [RAMVARS.bLastTimeoutUpdate], cl
57    sub     BYTE [RAMVARS.bTimeoutTicksLeft], 1 ; DEC does not update CF
58.StillPollingTheSameTick:
59    ret
60
61
62;--------------------------------------------------------------------
63; Delay is always at least one millisecond since
64; RTC resolution is 977 microsecs.
65;
66; Timer_DelayMicrosecondsFromAX
67;   Parameters:
68;       AX:     Number of microsecs to wait
69;   Returns:
70;       Nothing
71;   Corrupts registers:
72;       AX
73;--------------------------------------------------------------------
74Timer_DelayMicrosecondsFromAX:
75%ifndef USE_AT
76    mov     ax, 2
77    ; Fall to Timer_DelayTimerTicksFromAX
78%else
79    push    dx
80    push    cx
81
82    xor     cx, cx
83    xchg    dx, ax                      ; Microsecs now in CX:DX
84    mov     ah, EVENT_WAIT
85    int     BIOS_SYSTEM_INTERRUPT_15h
86    sti                                 ; XT BIOSes return with interrupts disabled. TODO: Maybe we can remove this since it's in an AT-only block?
87
88    pop     cx
89    pop     dx
90    mov     ax, 1                               ; Prepare to wait 1 timer tick
91    jc      SHORT Timer_DelayTimerTicksFromAX   ; Event Wait was unsupported or busy
92    ret
93%endif
94
95
96;--------------------------------------------------------------------
97; First tick might take 0...54.9 ms and remaining ticks
98; will occur at 54.9 ms intervals.
99;
100; Timer_DelayTimerTicksFromAX
101;   Parameters:
102;       AX:     Number of timer ticks to wait
103;   Returns:
104;       Nothing
105;   Corrupts registers:
106;       AX
107;--------------------------------------------------------------------
108Timer_DelayTimerTicksFromAX:
109    sti                             ; Make sure that interrupts are enabled
110    call    ReadTimeFromBdaToCX
111    add     ax, cx                  ; AX = end time
112.WaitLoop:
113    call    ReadTimeFromBdaToCX
114    cmp     cx, ax
115    jne     SHORT .WaitLoop         ; Loop until end time is reached
116    ret
117
118
119;--------------------------------------------------------------------
120; ReadTimeFromBdaToCX
121;   Parameters
122;       Nothing
123;   Returns:
124;       CX:     System time in 54.9 ms ticks
125;   Corrupts registers:
126;       Nothing
127;--------------------------------------------------------------------
128ALIGN JUMP_ALIGN
129ReadTimeFromBdaToCX:
130    push    ds
131    LOAD_BDA_SEGMENT_TO ds, cx
132    mov     cx, [BDA.dwTimerTicks]  ; Read low WORD only
133    pop     ds
134    ret
Note: See TracBrowser for help on using the repository browser.