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

Last change on this file since 148 was 148, checked in by aitotat, 13 years ago

Changes to XTIDE Universal BIOS:

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