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

Last change on this file since 556 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
RevLine 
[150]1; Project name : XTIDE Universal BIOS
2; Description : IDE Device wait functions.
3
[376]4;
[491]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[491]12;
[376]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
[491]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[491]18;
[376]19
[150]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; IdeWait_IRQorDRQ
25; Parameters:
26; DS:DI: Ptr to DPT (in RAMVARS segment)
[267]27; SS:BP: Ptr to IDEPACK, PIOVARS or MEMPIOVARS
[150]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;--------------------------------------------------------------------
[400]34IdeWait_IRQorDRQ:
[150]35 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
[400]36
37%ifdef MODULE_IRQ
[150]38 test BYTE [bp+IDEPACK.bDeviceControl], FLG_DEVCONTROL_nIEN
[400]39 jnz SHORT IdeWait_PollStatusFlagInBLwithTimeoutInBH ; Interrupt disabled
[238]40%endif
[150]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;--------------------------------------------------------------------
[400]56IdeWait_IRQorStatusFlagInBLwithTimeoutInBH:
57%ifdef MODULE_IRQ
58 call IdeIrq_WaitForIRQ
[238]59%endif
[150]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;--------------------------------------------------------------------
[400]75IdeWait_PollStatusFlagInBLwithTimeoutInBH:
[150]76 mov ah, bl
[155]77 mov cl, bh
78 call Timer_InitializeTimeoutWithTicksInCL
[532]79 call IdeIO_InputStatusRegisterToAL ; Discard contents of first read
[150]80 and ah, ~FLG_STATUS_BSY
[400]81 jz SHORT PollBsyOnly
[150]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;--------------------------------------------------------------------
[491]96PollBsyAndFlgInAH:
[150]97.PollLoop:
[400]98 call IdeIO_InputStatusRegisterToAL
[150]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
[400]102 jnz SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
[150]103.UpdateTimeout:
[155]104 call Timer_SetCFifTimeout
[150]105 jnc SHORT .PollLoop ; Loop if time left
[400]106 call IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
[150]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;--------------------------------------------------------------------
[400]125PollBsyOnly:
[150]126.PollLoop:
[400]127 call IdeIO_InputStatusRegisterToAL
[150]128 test al, FLG_STATUS_BSY ; Controller busy?
[400]129 jz SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
[155]130 call Timer_SetCFifTimeout ; Update timeout counter
[150]131 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout)
[400]132 jmp SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
Note: See TracBrowser for help on using the repository browser.