source: xtideuniversalbios/tags/XTIDE_Universal_BIOS_v1.1.3/Src/SoftDelay.asm @ 31

Last change on this file since 31 was 3, checked in by aitotat, 14 years ago
File size: 4.0 KB
Line 
1; File name     :   SoftDelay.asm
2; Project name  :   IDE BIOS
3; Created date  :   22.9.2007
4; Last update   :   13.4.2010
5; Author        :   Tomi Tilli
6; Description   :   Software delay loops for I/O timeout and other loops.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; There should be at least 400ns delay between outputting
13; IDE command / drive selection and reading IDE Status Register.
14;
15; SoftDelay_BeforePollingStatusRegister
16;   Parameters:
17;       Nothing
18;   Returns:
19;       Nothing
20;   Corrupts registers:
21;       Nothing
22;--------------------------------------------------------------------
23ALIGN JUMP_ALIGN                        ; Cycles required
24SoftDelay_BeforePollingStatusRegister:  ; 8088 | 286 | 386 | 486
25    push    cx                          ;   15 |   3 |   2 |   1
26    mov     cx, 2                       ;    4 |   2 |   2 |   1
27.DelayLoop:
28    loop    .DelayLoop                  ;      |  10 |  12 |   6
29    pop     cx                          ;    8 |   5 |   4 |   4
30    ret                                 ;   20 |  11m|  10m|   5
31
32
33;--------------------------------------------------------------------
34; Initializes timeout counter. Timeouts are implemented using system
35; timer ticks. First tick might take 0...54.9ms and remaining ticks
36; will occur at 54.9ms intervals. Use delay of two (or more) ticks to
37; ensure at least 54.9ms wait.
38;
39; SoftDelay_InitTimeout
40;   Parameters:
41;       CL:     Number of system timer ticks before timeout
42;       DS:     Segment to RAMVARS
43;   Returns:
44;       Nothing
45;   Corrupts registers:
46;       CX
47;--------------------------------------------------------------------
48ALIGN JUMP_ALIGN
49SoftDelay_InitTimeout:
50    mov     [RAMVARS.bEndTime], cl      ; Store timeout ticks
51    push    ds
52    LOAD_BDA_SEGMENT_TO ds, cx
53    mov     cl, [BDA.dwTimerTicks]      ; Load current time lowest byte
54    pop     ds
55    add     [RAMVARS.bEndTime], cl      ; Timeout to end time
56    sti                                 ; Enable interrupts
57    ret
58
59
60;--------------------------------------------------------------------
61; Updates timeout counter. Timeout counter can be
62; initialized with SoftDelay_InitTimeout.
63;
64; SoftDelay_UpdTimeout
65;   Parameters:
66;       DS:     Segment to RAMVARS
67;   Returns:
68;       CF:     Set if timeout
69;               Cleared if time left
70;   Corrupts registers:
71;       Nothing
72;--------------------------------------------------------------------
73ALIGN JUMP_ALIGN
74SoftDelay_UpdTimeout:
75    push    ax
76    push    ds
77    LOAD_BDA_SEGMENT_TO ds, ax
78    mov     al, [BDA.dwTimerTicks]      ; Load current time lowest byte
79    pop     ds
80
81    cmp     al, [RAMVARS.bEndTime]      ; End time reached?
82    pop     ax
83    je      SHORT .ReturnTimeout
84    clc
85    ret
86.ReturnTimeout:
87    stc
88    ret
89
90
91;--------------------------------------------------------------------
92; Microsecond delay.
93; Current implementation uses BIOS event wait services that are not
94; available on XT systems. Calling overhead should be enough so it does
95; not matter for IDE waits. On AT+ the delay will be at least 1ms since
96; RTC resolution is 977 microsecs.
97;
98; SoftDelay_us
99;   Parameters:
100;       CX:     Number of microsecs to wait
101;   Returns:
102;       Nothing
103;   Corrupts registers:
104;       CX
105;--------------------------------------------------------------------
106ALIGN JUMP_ALIGN
107SoftDelay_us:
108    push    dx
109    push    ax
110
111    xor     dx, dx                      ; Zero DX
112    xchg    cx, dx                      ; Microsecs now in CX:DX
113    mov     ah, 86h                     ; Event Wait
114    int     INTV_SYSTEM_SERVICES
115
116    pop     ax
117    pop     dx
118    mov     cx, 2                       ; Prepare to wait 2 timer ticks
119    jc      SHORT SoftDelay_TimerTicks  ; Unsupported or busy
120    ret
121
122
123;--------------------------------------------------------------------
124; Timer tick delay.
125; One tick is about 54.9ms but first tick may occur anytime between
126; 0...54.9ms!
127;
128; SoftDelay_TimerTicks
129;   Parameters:
130;       CX:     Number of timer ticks to wait
131;   Returns:
132;       Nothing
133;   Corrupts registers:
134;       CX
135;--------------------------------------------------------------------
136ALIGN JUMP_ALIGN
137SoftDelay_TimerTicks:
138    push    ds
139    push    ax
140    LOAD_BDA_SEGMENT_TO ds, ax
141    add     cx, [BDA.dwTimerTicks]      ; CX to end time
142    sti                                 ; Enable interrupts
143.DelayLoop:
144    cmp     cx, [BDA.dwTimerTicks]      ; Wait complete?
145    jne     SHORT .DelayLoop            ;  If not, loop
146    pop     ax
147    pop     ds
148    ret
Note: See TracBrowser for help on using the repository browser.