source: xtideuniversalbios/trunk/Assembly_Library/Src/Time/TimerTicks.asm@ 45

Last change on this file since 45 was 41, checked in by Tomi Tilli, 14 years ago

Initial commit for Assembly Library.

File size: 4.2 KB
Line 
1; File name : TimerTicks.asm
2; Project name : Assembly Library
3; Created date : 24.7.2010
4; Last update : 3.8.2010
5; Author : Tomi Tilli
6; Description : Functions for system timer related operations.
7
8; System timer ticks 18.2 times per second = 54.9 ms / tick
9TICKS_PER_HOUR EQU 65520
10TICKS_PER_MINUTE EQU 1092
11TICKS_PER_SECOND EQU 18
12
13
14; Section containing code
15SECTION .text
16
17;--------------------------------------------------------------------
18; TimerTicks_GetHoursToAXfromTicksInDXAX
19; TimerTicks_GetMinutesToAXfromTicksInDX
20; TimerTicks_GetSecondsToAXfromTicksInDX
21; Parameters
22; DX(:AX): Timer ticks to convert
23; Returns:
24; AX: Hours, minutes or seconds
25; DX: Remainder ticks
26; Corrupts registers:
27; CX
28;--------------------------------------------------------------------
29ALIGN JUMP_ALIGN
30TimerTicks_GetHoursToAXfromTicksInDXAX:
31 mov cx, TICKS_PER_HOUR
32 div cx ; Divide DX:AX by CX, Hours to AX, remainder ticks to DX
33 ret
34
35ALIGN JUMP_ALIGN
36TimerTicks_GetMinutesToAXfromTicksInDX:
37 xor ax, ax
38 xchg ax, dx ; Ticks now in DX:AX
39 mov cx, TICKS_PER_MINUTE
40 div cx ; Divide DX:AX by CX, Minutes to AX, remainder ticks to DX
41 ret
42
43ALIGN JUMP_ALIGN
44TimerTicks_GetSecondsToAXfromTicksInDX:
45 xchg ax, dx ; Ticks now in AX
46 mov cl, TICKS_PER_SECOND
47 div cl ; Divide AX by CL, Seconds to AL, remainder ticks to AH
48 xor dx, dx
49 xchg dl, ah ; Seconds in AX, remainder in DX
50 ret
51
52
53;--------------------------------------------------------------------
54; First tick might take 0...54.9 ms and remaining ticks
55; will occur at 54.9 ms intervals. Use delay of two (or more) ticks to
56; ensure at least 54.9 ms timeout.
57;
58; TimerTicks_InitializeTimeoutFromAX
59; Parameters:
60; AX: Timeout ticks (54.9 ms) before timeout
61; DS:BX: Ptr to timeout variable WORD
62; Returns:
63; [DS:BX]: Initialized for TimerTicks_SetCarryIfTimeoutFromDSBX
64; Corrupts registers:
65; AX
66;--------------------------------------------------------------------
67ALIGN JUMP_ALIGN
68TimerTicks_InitializeTimeoutFromAX:
69 mov [bx], ax ; Store timeout ticks
70 call TimerTicks_ReadFromBdaToAX
71 add [bx], ax ; Add latest time to timeout ticks
72 ret
73
74;--------------------------------------------------------------------
75; Timeout counter can be initialized with TimerTicks_InitializeTimeoutFromAX.
76;
77; TimerTicks_SetCarryIfTimeoutFromDSBX
78; Parameters:
79; DS:BX: Ptr to timeout variable WORD
80; Returns:
81; CF: Set if timeout
82; Cleared if time left
83; Corrupts registers:
84; Nothing
85;--------------------------------------------------------------------
86ALIGN JUMP_ALIGN
87TimerTicks_SetCarryIfTimeoutFromDSBX:
88 push ax
89 call TimerTicks_ReadFromBdaToAX
90 cmp [bx], ax ; Set CF if timeout WORD is less than time
91 pop ax
92 ret
93
94
95;--------------------------------------------------------------------
96; TimerTicks_GetElapsedToAXandResetDSBX
97; Parameters
98; DS:BX: Ptr to WORD containing previous reset time
99; Returns:
100; AX: 54.9 ms ticks elapsed since last reset
101; [DS:BX]: Reset to latest time
102; Corrupts registers:
103; Nothing
104;--------------------------------------------------------------------
105ALIGN JUMP_ALIGN
106TimerTicks_GetElapsedToAXandResetDSBX:
107 call TimerTicks_ReadFromBdaToAX
108 push ax
109 sub ax, [bx]
110 pop WORD [bx] ; Latest time to [DS:BX]
111 ret
112
113;--------------------------------------------------------------------
114; TimerTicks_GetElapsedToAXfromDSBX
115; Parameters
116; DS:BX: Ptr to WORD containing previous update time
117; Returns:
118; AX: 54.9 ms ticks elapsed since initializing [DS:BX]
119; Corrupts registers:
120; Nothing
121;--------------------------------------------------------------------
122ALIGN JUMP_ALIGN
123TimerTicks_GetElapsedToAXfromDSBX:
124 call TimerTicks_ReadFromBdaToAX
125 sub ax, [bx]
126 ret
127
128
129;--------------------------------------------------------------------
130; TimerTicks_ReadFromBdaToAX
131; Parameters
132; Nothing
133; Returns:
134; AX: System time in 54.9 ms ticks
135; Corrupts registers:
136; Nothing
137;--------------------------------------------------------------------
138ALIGN JUMP_ALIGN
139TimerTicks_ReadFromBdaToAX:
140 push ds
141
142 LOAD_BDA_SEGMENT_TO ds, ax
143 mov ax, [BDA.dwTimerTicks] ; Read low WORD only
144
145 pop ds
146 ret
Note: See TracBrowser for help on using the repository browser.