source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Common/HStatus.asm @ 34

Last change on this file since 34 was 34, checked in by aitotat, 14 years ago

OS hooks are now enabled for all builds.
IRQ waiting no longer uses HLT instruction to fix some EMM386 and VCPI issues.

File size: 7.3 KB
Line 
1; File name     :   HStatus.asm
2; Project name  :   IDE BIOS
3; Created date  :   15.12.2009
4; Last update   :   23.8.2010
5; Author        :   Tomi Tilli
6; Description   :   IDE Status Register polling functions.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Waits Hard Disk IRQ when not transferring data.
13; If interrupts are disabled, RDY flag is polled.
14;
15; HStatus_WaitIrqOrRdy
16;   Parameters:
17;       DS:BX:  Ptr to DPT
18;   Returns:
19;       AH:     BIOS Error code
20;       CF:     0 if wait succesfull
21;               1 if any error
22;   Corrupts registers:
23;       AL, CX, DX
24;--------------------------------------------------------------------
25ALIGN JUMP_ALIGN
26HStatus_WaitIrqOrRdy:
27    call    HIRQ_WaitForIRQ
28    jnc     SHORT .PollRdySinceNoWaitingOnOsHook
29    jmp     HError_ProcessErrorsAfterPollingBSY
30
31ALIGN JUMP_ALIGN
32.PollRdySinceNoWaitingOnOsHook:
33    mov     cl, B_TIMEOUT_DRQ               ; Load DRQ (not RDY) timeout
34    jmp     SHORT HStatus_WaitRdy           ; Jump to poll RDY
35
36
37;--------------------------------------------------------------------
38; Waits until Hard Disk is ready to transfer data.
39;
40; HStatus_WaitIrqOrDrq
41;   Parameters:
42;       DS:BX:  Ptr to DPT (in RAMVARS segment)
43;   Returns:
44;       AH:     BIOS Error code
45;       CF:     0 if wait succesfull
46;               1 if any error
47;   Corrupts registers:
48;       AL
49;--------------------------------------------------------------------
50ALIGN JUMP_ALIGN
51HStatus_WaitIrqOrDrq:
52    call    HIRQ_WaitForIRQ
53    jnc     SHORT .PollDrqSinceNoWaitingOnOsHook
54    jmp     HError_ProcessErrorsAfterPollingBSY
55
56ALIGN JUMP_ALIGN
57.PollDrqSinceNoWaitingOnOsHook:
58    push    dx
59    push    cx
60    call    HStatus_WaitDrqDefTime
61    pop     cx
62    pop     dx
63    ret
64
65
66;--------------------------------------------------------------------
67; Waits until busy flag is cleared from selected Hard Disk drive.
68;
69; HStatus_WaitBsyDefTime    Uses default timeout
70; HStatus_WaitBsy           Uses user defined timeout
71; HStatus_WaitBsyBase       Uses user base port address and timeout
72;   Parameters:
73;       CL:     Timeout value in system timer ticks (not HStatus_WaitBsyDefTime)
74;       DX:     IDE Base port address (HUtil_WaitBsyBase only)
75;       DS:     Segment to RAMVARS
76;   Returns:
77;       AH:     BIOS Error code
78;       DX:     IDE Status Register Address
79;       CF:     0 if wait succesfull
80;               1 if any error
81;   Corrupts registers:
82;       AL, CX
83;--------------------------------------------------------------------
84ALIGN JUMP_ALIGN
85HStatus_WaitBsyDefTime:
86    mov     cl, B_TIMEOUT_BSY           ; Load timeout value
87ALIGN JUMP_ALIGN
88HStatus_WaitBsy:
89    mov     dx, [RAMVARS.wIdeBase]      ; Load offset to base port
90ALIGN JUMP_ALIGN
91HStatus_WaitBsyBase:
92    add     dx, BYTE REGR_IDE_ST        ; Add offset to status reg
93    jmp     SHORT HStatus_PollBsy       ; Wait until not busy
94
95
96;--------------------------------------------------------------------
97; Waits until Hard Disk is ready to accept commands.
98;
99; HStatus_WaitRdyDefTime    Uses default timeout
100; HStatus_WaitRdy           Uses user defined timeout
101; HStatus_WaitRdyBase       Uses user base port address and timeout
102;   Parameters:
103;       CL:     Timeout value in system timer ticks (not HStatus_WaitRdyDefTime)
104;       DX:     IDE Base port address (HStatus_WaitRdyBase only)
105;       DS:     Segment to RAMVARS
106;   Returns:
107;       AH:     BIOS Error code
108;       DX:     IDE Status Register Address
109;       CF:     0 if wait succesfull
110;               1 if any error
111;   Corrupts registers:
112;       AL, CX
113;--------------------------------------------------------------------
114ALIGN JUMP_ALIGN
115HStatus_WaitRdyDefTime:
116    mov     cl, B_TIMEOUT_RDY           ; Load timeout value
117ALIGN JUMP_ALIGN
118HStatus_WaitRdy:
119    mov     dx, [RAMVARS.wIdeBase]      ; Load offset to base port
120ALIGN JUMP_ALIGN
121HStatus_WaitRdyBase:
122    add     dx, BYTE REGR_IDE_ST        ; Add offset to status reg
123    mov     ah, FLG_IDE_ST_DRDY         ; Flag to poll
124    jmp     SHORT HStatus_PollBsyAndFlg ; Wait until flag set
125
126
127;--------------------------------------------------------------------
128; Waits until Hard Disk is ready to transfer data.
129; Note! This function polls DRQ even if interrupts are enabled!
130;
131; HStatus_WaitDrqDefTime    Uses default timeout
132; HStatus_WaitDrq           Uses user defined timeout
133; HStatus_WaitDrqBase       Uses user base port address and timeout
134;   Parameters:
135;       CL:     Timeout value in system timer ticks (not HStatus_WaitDrqDefTime)
136;       DX:     IDE Base port address (HStatus_WaitDrqBase only)
137;       DS:     Segment to RAMVARS
138;   Returns:
139;       AH:     BIOS Error code
140;       DX:     IDE Status Register Address
141;       CF:     0 if wait succesfull
142;               1 if any error
143;   Corrupts registers:
144;       AL, CX
145;--------------------------------------------------------------------
146ALIGN JUMP_ALIGN
147HStatus_WaitDrqDefTime:
148    mov     cl, B_TIMEOUT_DRQ           ; Load timeout value
149ALIGN JUMP_ALIGN
150HStatus_WaitDrq:
151    mov     dx, [RAMVARS.wIdeBase]      ; Load offset to base port
152ALIGN JUMP_ALIGN
153HStatus_WaitDrqBase:
154    add     dx, BYTE REGR_IDE_ST        ; Add offset to status reg
155    mov     ah, FLG_IDE_ST_DRQ          ; Flag to poll
156    ; Fall to HStatus_PollBsyAndFlg
157
158;--------------------------------------------------------------------
159; IDE Status register polling.
160; This function first waits until controller is not busy.
161; When not busy, IDE Status Register is polled until wanted flag is set.
162;
163; HStatus_PollBusyAndFlg
164;   Parameters:
165;       AH:     Status Register Flag to poll (until set) when not busy
166;       CL:     Timeout value in system timer ticks
167;       DX:     IDE Status Register Address
168;       DS:     Segment to RAMVARS
169;   Returns:
170;       AH:     BIOS Error code
171;       CF:     Clear if wait completed successfully (no errors)
172;               Set if any error
173;   Corrupts registers:
174;       AL, CX
175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
177HStatus_PollBsyAndFlg:
178    call    SoftDelay_InitTimeout               ; Initialize timeout counter
179    in      al, dx                              ; Discard contents for first read
180                                                ; (should read Alternate Status Register)
181ALIGN JUMP_ALIGN
182.PollLoop:
183    in      al, dx                              ; Load IDE Status Register
184    test    al, FLG_IDE_ST_BSY                  ; Controller busy?
185    jnz     SHORT .UpdateTimeout                ;  If so, jump to timeout update
186    test    al, ah                              ; Test secondary flag
187    jnz     SHORT GetErrorCodeFromPollingToAH   ; If set, break loop
188ALIGN JUMP_ALIGN
189.UpdateTimeout:
190    call    SoftDelay_UpdTimeout                ; Update timeout counter
191    jnc     SHORT .PollLoop                     ; Loop if time left (sets CF on timeout)
192    jmp     HError_ProcessTimeoutAfterPollingBSYandSomeOtherStatusBit
193
194;--------------------------------------------------------------------
195; IDE Status register polling.
196; This function waits until controller is not busy.
197;
198; HStatus_PollBsy
199;   Parameters:
200;       CL:     Timeout value in system timer ticks
201;       DX:     IDE Status Register Address
202;       DS:     Segment to RAMVARS
203;   Returns:
204;       AH:     BIOS Error code
205;       CF:     Clear if wait completed successfully (no errors)
206;               Set if any error
207;   Corrupts registers:
208;       AL, CX
209;--------------------------------------------------------------------
210ALIGN JUMP_ALIGN
211HStatus_PollBsy:
212    call    SoftDelay_InitTimeout               ; Initialize timeout counter
213    in      al, dx                              ; Discard contents for first read
214                                                ; (should read Alternate Status Register)
215ALIGN JUMP_ALIGN
216.PollLoop:
217    in      al, dx                              ; Load IDE Status Reg
218    test    al, FLG_IDE_ST_BSY                  ; Controller busy?
219    jz      SHORT GetErrorCodeFromPollingToAH   ;  If not, jump to check errors
220    call    SoftDelay_UpdTimeout                ; Update timeout counter
221    jnc     SHORT .PollLoop                     ; Loop if time left (sets CF on timeout)
222ALIGN JUMP_ALIGN
223GetErrorCodeFromPollingToAH:
224    jmp     HError_ProcessErrorsAfterPollingBSY
Note: See TracBrowser for help on using the repository browser.