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

Last change on this file since 175 was 160, checked in by Tomi Tilli, 13 years ago

Changes to XTIDE Universal BIOS:

  • Support for XTIDE mod now works.
File size: 4.3 KB
RevLine 
[150]1; Project name : XTIDE Universal BIOS
2; Description : IDE Device wait functions.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; IdeWait_IRQorDRQ
9; Parameters:
10; DS:DI: Ptr to DPT (in RAMVARS segment)
11; SS:BP: Ptr to IDEPACK or PIOVARS
12; Returns:
13; AH: INT 13h Error Code
14; CF: Cleared if success, Set if error
15; Corrupts registers:
16; AL, BX, CX, DX
17;--------------------------------------------------------------------
18IdeWait_IRQorDRQ:
19 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
20 test BYTE [bp+IDEPACK.bDeviceControl], FLG_DEVCONTROL_nIEN
21 jnz SHORT IdeWait_PollStatusFlagInBLwithTimeoutInBH ; Interrupt disabled
22 ; Fall to IdeWait_IRQorStatusFlagInBLwithTimeoutInBH
23
24
25;--------------------------------------------------------------------
26; IdeWait_IRQorStatusFlagInBLwithTimeoutInBH
27; Parameters:
28; BH: Timeout ticks
29; BL: IDE Status Register bit to wait
30; DS:DI: Ptr to DPT (in RAMVARS segment)
31; Returns:
32; AH: INT 13h Error Code
33; CF: Cleared if success, Set if error
34; Corrupts registers:
35; AL, BX, CX, DX
36;--------------------------------------------------------------------
37IdeWait_IRQorStatusFlagInBLwithTimeoutInBH:
38 call IdeIrq_WaitForIRQ
39 ; Always fall to IdeWait_PollStatusFlagInBLwithTimeoutInBH for error processing
40
41
42;--------------------------------------------------------------------
43; IdeWait_PollStatusFlagInBLwithTimeoutInBH
44; Parameters:
45; BH: Timeout ticks
46; BL: IDE Status Register bit to poll
47; DS:DI: Ptr to DPT (in RAMVARS segment)
48; Returns:
49; AH: INT 13h Error Code
50; CF: Cleared if success, Set if error
51; Corrupts registers:
52; AL, BX, CX, DX
53;--------------------------------------------------------------------
54IdeWait_PollStatusFlagInBLwithTimeoutInBH:
55 mov ah, bl
[155]56 mov cl, bh
57 call Timer_InitializeTimeoutWithTicksInCL
[150]58 and ah, ~FLG_STATUS_BSY
59 jz SHORT PollBsyOnly
60 ; Fall to PollBsyAndFlgInAH
61
62;--------------------------------------------------------------------
63; PollBsyAndFlgInAH
64; Parameters:
65; AH: Status Register Flag to poll (until set) when device not busy
66; DS:DI: Ptr to DPT (in RAMVARS segment)
67; Returns:
68; AH: BIOS Error code
69; CF: Clear if wait completed successfully (no errors)
70; Set if any error
71; Corrupts registers:
72; AL, BX, CX, DX
73;--------------------------------------------------------------------
74PollBsyAndFlgInAH:
75 call ReadIdeStatusRegisterToAL ; Discard contents for first read
76ALIGN JUMP_ALIGN
77.PollLoop:
78 call ReadIdeStatusRegisterToAL
79 test al, FLG_STATUS_BSY ; Controller busy?
80 jnz SHORT .UpdateTimeout ; If so, jump to timeout update
81 test al, ah ; Test secondary flag
82 jnz SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
83.UpdateTimeout:
[155]84 call Timer_SetCFifTimeout
[150]85 jnc SHORT .PollLoop ; Loop if time left
86 call IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
87 jc SHORT .ReturnErrorCodeInAH
88 mov ah, RET_HD_TIMEOUT ; Expected bit never got set
89 stc
90.ReturnErrorCodeInAH:
91 ret
92
93
94;--------------------------------------------------------------------
95; PollBsyOnly
96; Parameters:
97; DS:DI: Ptr to DPT (in RAMVARS segment)
98; Returns:
99; AH: BIOS Error code
100; CF: Clear if wait completed successfully (no errors)
101; Set if any error
102; Corrupts registers:
103; AL, BX, CX, DX
104;--------------------------------------------------------------------
105PollBsyOnly:
106 call ReadIdeStatusRegisterToAL ; Discard contents for first read
107ALIGN JUMP_ALIGN
108.PollLoop:
109 call ReadIdeStatusRegisterToAL
110 test al, FLG_STATUS_BSY ; Controller busy?
111 jz SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
[155]112 call Timer_SetCFifTimeout ; Update timeout counter
[150]113 jnc SHORT .PollLoop ; Loop if time left (sets CF on timeout)
114 jmp SHORT IdeError_GetBiosErrorCodeToAHfromPolledStatusRegisterInAL
115
116
117;--------------------------------------------------------------------
118; ReadIdeStatusRegisterToAL
119; Parameters:
120; DS:DI: Ptr to DPT (in RAMVARS segment)
121; Returns:
122; AL: IDE Status Register contents
123; Corrupts registers:
124; BX, DX
125;--------------------------------------------------------------------
126ALIGN JUMP_ALIGN
127ReadIdeStatusRegisterToAL:
128 mov dl, STATUS_REGISTER_in
[160]129 jmp IdeIO_InputToALfromIdeRegisterInDL
Note: See TracBrowser for help on using the repository browser.