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

Last change on this file since 374 was 370, checked in by krille_n_@…, 13 years ago

Changes:

  • Added some missing PIO mode timings to ATA_ID.inc (based on info from http://www.singlix.net/specs/cfspc4_0.pdf)
  • Updated Configuration_FullMode.txt but it may need additional changes as the Tandy info doesn't match the wiki.
  • Optimizations.
  • Excluded some unused code from XTIDECFG.
File size: 4.3 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for system timer related operations.
3
4; System timer ticks 18.2 times per second = 54.9 ms / tick
5TICKS_PER_HOUR EQU 65520
6TICKS_PER_MINUTE EQU 1092
7TICKS_PER_SECOND EQU 18
8
9
10; Section containing code
11SECTION .text
12
13;--------------------------------------------------------------------
14; TimerTicks_GetHoursToAXfromTicksInDXAX
15; TimerTicks_GetMinutesToAXfromTicksInDX
16; TimerTicks_GetSecondsToAXfromTicksInDX
17; Parameters
18; DX(:AX): Timer ticks to convert
19; Returns:
20; AX: Hours, minutes or seconds
21; DX: Remainder ticks
22; Corrupts registers:
23; CX
24;--------------------------------------------------------------------
25%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
26%ifndef EXCLUDE_FROM_XTIDECFG
27ALIGN JUMP_ALIGN
28TimerTicks_GetHoursToAXfromTicksInDXAX:
29 mov cx, TICKS_PER_HOUR
30 div cx ; Divide DX:AX by CX, Hours to AX, remainder ticks to DX
31 ret
32%endif ; EXCLUDE_FROM_XTIDECFG
33
34ALIGN JUMP_ALIGN
35TimerTicks_GetMinutesToAXfromTicksInDX:
36 xor ax, ax
37 xchg ax, dx ; Ticks now in DX:AX
38 mov cx, TICKS_PER_MINUTE
39 div cx ; Divide DX:AX by CX, Minutes to AX, remainder ticks to DX
40 ret
41%endif ; EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
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 ; [bx] now contains end time for timeout
72 ret
73
74
75;--------------------------------------------------------------------
76; TimerTicks_GetTimeoutTicksLeftToAXfromDSBX
77; Parameters:
78; DS:BX: Ptr to timeout variable WORD
79; Returns:
80; AX: Number of ticks left before timeout
81; CF: Set if timeout
82; Cleared if time left
83; Corrupts registers:
84; Nothing
85;--------------------------------------------------------------------
86ALIGN JUMP_ALIGN
87TimerTicks_GetTimeoutTicksLeftToAXfromDSBX:
88 push dx
89 mov dx, [bx]
90 call TimerTicks_ReadFromBdaToAX
91 xchg ax, dx
92 sub ax, dx ; AX = End time - current time
93 pop dx
94 ret
95
96
97;--------------------------------------------------------------------
98; TimerTicks_GetElapsedToAXandResetDSBX
99; Parameters
100; DS:BX: Ptr to WORD containing previous reset time
101; Returns:
102; AX: 54.9 ms ticks elapsed since last reset
103; [DS:BX]: Reset to latest time
104; Corrupts registers:
105; Nothing
106;--------------------------------------------------------------------
107%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
108ALIGN JUMP_ALIGN
109TimerTicks_GetElapsedToAXandResetDSBX:
110 call TimerTicks_ReadFromBdaToAX
111 push ax
112 sub ax, [bx]
113 pop WORD [bx] ; Latest time to [DS:BX]
114 ret
115%endif
116
117;--------------------------------------------------------------------
118; TimerTicks_GetElapsedToAXfromDSBX
119; Parameters
120; DS:BX: Ptr to WORD containing previous update time
121; Returns:
122; AX: 54.9 ms ticks elapsed since initializing [DS:BX]
123; Corrupts registers:
124; Nothing
125;--------------------------------------------------------------------
126%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
127ALIGN JUMP_ALIGN
128TimerTicks_GetElapsedToAXfromDSBX:
129 call TimerTicks_ReadFromBdaToAX
130 sub ax, [bx]
131 ret
132%endif
133
134
135;--------------------------------------------------------------------
136; TimerTicks_ReadFromBdaToAX
137; Parameters
138; Nothing
139; Returns:
140; AX: System time in 54.9 ms ticks
141; Corrupts registers:
142; Nothing
143;--------------------------------------------------------------------
144ALIGN JUMP_ALIGN
145TimerTicks_ReadFromBdaToAX:
146 push ds
147
148 LOAD_BDA_SEGMENT_TO ds, ax
149 mov ax, [BDA.dwTimerTicks] ; Read low WORD only
150
151 pop ds
152 ret
Note: See TracBrowser for help on using the repository browser.