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

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

Changes to all parts of the project:

  • Size optimizations.
  • Added a define (EXCLUDE_FROM_XTIDECFG) to exclude unused library code from XTIDECFG.
  • Tried to minimize time spent with interrupts disabled.
  • Some minor attempts to improve speed (reordering instructions etc).
  • Tried to improve readability, did some cleanup and fixed some errors in comments.
File size: 3.2 KB
RevLine 
[140]1; Project name  :   XTIDE Universal BIOS
2; Description   :   Timeout and delay functions for INT 13h services.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
[155]8; Timer_InitializeTimeoutWithTicksInCL
[140]9;   Parameters:
[155]10;       CL:     Timeout value in system timer ticks
[140]11;       DS:     Segment to RAMVARS
12;   Returns:
13;       Nothing
14;   Corrupts registers:
15;       CX
16;--------------------------------------------------------------------
17ALIGN JUMP_ALIGN
[155]18Timer_InitializeTimeoutWithTicksInCL:
19    mov     [RAMVARS.bTimeoutTicksLeft], cl     ; Ticks until timeout
[140]20    call    ReadTimeFromBdaToCX
[155]21    mov     [RAMVARS.bLastTimeoutUpdate], cl    ; Start time
[140]22    ret
23
24
25;--------------------------------------------------------------------
[155]26; Timer_SetCFifTimeout
[140]27;   Parameters:
28;       DS:     Segment to RAMVARS
29;   Returns:
30;       CF:     Set if timeout
31;               Cleared if time left
32;   Corrupts registers:
33;       CX
34;--------------------------------------------------------------------
35ALIGN JUMP_ALIGN
[155]36Timer_SetCFifTimeout:
[140]37    call    ReadTimeFromBdaToCX
[155]38    cmp     cl, [RAMVARS.bLastTimeoutUpdate]
39    je      SHORT .StillPollingTheSameTick
40    mov     [RAMVARS.bLastTimeoutUpdate], cl
41    sub     BYTE [RAMVARS.bTimeoutTicksLeft], 1 ; DEC does not update CF
42.StillPollingTheSameTick:
[140]43    ret
44
45
46;--------------------------------------------------------------------
47; Delay is always at least one millisecond since
48; RTC resolution is 977 microsecs.
49;
[155]50; Timer_DelayMicrosecondsFromAX
[140]51;   Parameters:
52;       AX:     Number of microsecs to wait
53;   Returns:
54;       Nothing
55;   Corrupts registers:
56;       AX
57;--------------------------------------------------------------------
[155]58Timer_DelayMicrosecondsFromAX:
[140]59%ifndef USE_AT
[150]60    mov     ax, 2
[181]61    ; Fall to Timer_DelayTimerTicksFromAX
[140]62%else
63    push    dx
64    push    cx
65
66    xor     cx, cx
[148]67    xchg    dx, ax                      ; Microsecs now in CX:DX
[140]68    mov     ah, EVENT_WAIT
69    int     BIOS_SYSTEM_INTERRUPT_15h
[181]70    sti                                 ; XT BIOSes return with interrupts disabled. TODO: Maybe we can remove this since it's in an AT-only block?
[140]71
72    pop     cx
73    pop     dx
[148]74    mov     ax, 1                               ; Prepare to wait 1 timer tick
[155]75    jc      SHORT Timer_DelayTimerTicksFromAX   ; Event Wait was unsupported or busy
[140]76    ret
77%endif
78
79
80;--------------------------------------------------------------------
81; First tick might take 0...54.9 ms and remaining ticks
82; will occur at 54.9 ms intervals.
83;
[155]84; Timer_DelayTimerTicksFromAX
[140]85;   Parameters:
86;       AX:     Number of timer ticks to wait
87;   Returns:
88;       Nothing
89;   Corrupts registers:
90;       AX
91;--------------------------------------------------------------------
[155]92Timer_DelayTimerTicksFromAX:
[140]93    sti                             ; Make sure that interrupts are enabled
94    call    ReadTimeFromBdaToCX
95    add     ax, cx                  ; AX = end time
96.WaitLoop:
97    call    ReadTimeFromBdaToCX
98    cmp     cx, ax
[155]99    jne     SHORT .WaitLoop         ; Loop until end time is reached
[140]100    ret
101
102
103;--------------------------------------------------------------------
104; ReadTimeFromBdaToCX
105;   Parameters
106;       Nothing
107;   Returns:
108;       CX:     System time in 54.9 ms ticks
109;   Corrupts registers:
110;       Nothing
111;--------------------------------------------------------------------
112ALIGN JUMP_ALIGN
113ReadTimeFromBdaToCX:
114    push    ds
115    LOAD_BDA_SEGMENT_TO ds, cx
116    mov     cx, [BDA.dwTimerTicks]  ; Read low WORD only
117    pop     ds
118    ret
Note: See TracBrowser for help on using the repository browser.