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

Last change on this file since 370 was 370, checked in by krille_n_@…, 12 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.