source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeWait.asm@ 566

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

Changes:

  • Changed unused.pl to remove a false positive when MODULE_STRINGS_COMPRESSED is not included ('loop PrependOrAppendSpaces' in DisplayFormat.asm).
  • XTIDECFG: Moved the contents of all text files under Help into Strings.asm to simplify editing and to avoid them being "out of sight and forgotten", essentially making it easier to keep strings up to date. Also made changes to some strings in the process (spelling mistakes etc).
  • Other minor fixes and optimizations to the BIOS.
File size: 4.5 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : IDE Device wait functions.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; IdeWait_IRQorDRQ
25; Parameters:
26; DS:DI: Ptr to DPT (in RAMVARS segment)
27; SS:BP: Ptr to IDEPACK, PIOVARS or MEMPIOVARS
28; Returns:
29; AH: INT 13h Error Code
30; CF: Cleared if success, Set if error
31; Corrupts registers:
32; AL, BX, CX, DX
33;--------------------------------------------------------------------
34IdeWait_IRQorDRQ:
35 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
36
37%ifdef MODULE_IRQ
38 test BYTE [bp+IDEPACK.bDeviceControl], FLG_DEVCONTROL_nIEN
39 jnz SHORT IdeWait_PollStatusFlagInBLwithTimeoutInBH ; Interrupt disabled
40%endif
41 ; Fall to IdeWait_IRQorStatusFlagInBLwithTimeoutInBH
42
43
44;--------------------------------------------------------------------
45; IdeWait_IRQorStatusFlagInBLwithTimeoutInBH
46; Parameters:
47; BH: Timeout ticks
48; BL: IDE Status Register bit to wait
49; DS:DI: Ptr to DPT (in RAMVARS segment)
50; Returns:
51; AH: INT 13h Error Code
52; CF: Cleared if success, Set if error
53; Corrupts registers:
54; AL, BX, CX, DX
55;--------------------------------------------------------------------
56IdeWait_IRQorStatusFlagInBLwithTimeoutInBH:
57%ifdef MODULE_IRQ
58 call IdeIrq_WaitForIRQ
59%endif
60 ; Always fall to IdeWait_PollStatusFlagInBLwithTimeoutInBH for error processing
61
62
63;--------------------------------------------------------------------
64; IdeWait_PollStatusFlagInBLwithTimeoutInBH
65; Parameters:
66; BH: Timeout ticks
67; BL: IDE Status Register bit to poll
68; DS:DI: Ptr to DPT (in RAMVARS segment)
69; Returns:
70; AH: INT 13h Error Code
71; CF: Cleared if success, Set if error
72; Corrupts registers:
73; AL, BX, CX, DX
74;--------------------------------------------------------------------
75IdeWait_PollStatusFlagInBLwithTimeoutInBH:
76 mov ah, bl
77 mov cl, bh
78 call Timer_InitializeTimeoutWithTicksInCL
79 call IdeIO_InputStatusRegisterToAL ; Discard contents of first read
80 and ah, ~FLG_STATUS_BSY
81 jz SHORT PollBsyOnly
82 ; Fall to PollBsyAndFlgInAH
83
84;--------------------------------------------------------------------
85; PollBsyAndFlgInAH
86; Parameters:
87; AH: Status Register Flag to poll (until set) when device not busy
88; DS:DI: Ptr to DPT (in RAMVARS segment)
89; Returns:
90; AH: BIOS Error code
91; CF: Clear if wait completed successfully (no errors)
92; Set if any error
93; Corrupts registers:
94; AL, BX, CX, DX
95;--------------------------------------------------------------------
96PollBsyAndFlgInAH:
97.PollLoop:
98 call IdeIO_InputStatusRegisterToAL
99 test al, FLG_STATUS_BSY ; Controller busy?
100 jnz SHORT .UpdateTimeout ; If so, jump to timeout update
101 test al, ah ; Test secondary flag
102 jnz SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
103.UpdateTimeout:
104 call Timer_SetCFifTimeout
105 jnc SHORT .PollLoop ; Loop if time left
106 call IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
107 jc SHORT .ReturnErrorCodeInAH
108 mov ah, RET_HD_TIMEOUT ; Expected bit never got set
109 stc
110.ReturnErrorCodeInAH:
111 ret
112
113
114;--------------------------------------------------------------------
115; PollBsyOnly
116; Parameters:
117; DS:DI: Ptr to DPT (in RAMVARS segment)
118; Returns:
119; AH: BIOS Error code
120; CF: Clear if wait completed successfully (no errors)
121; Set if any error
122; Corrupts registers:
123; AL, BX, CX, DX
124;--------------------------------------------------------------------
125PollBsyOnly:
126.PollLoop:
127 call IdeIO_InputStatusRegisterToAL
128 test al, FLG_STATUS_BSY ; Controller busy?
129 jz SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
130 call Timer_SetCFifTimeout ; Update timeout counter
131 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout)
132 jmp SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
Note: See TracBrowser for help on using the repository browser.