source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/FindDPT.asm@ 209

Last change on this file since 209 was 203, checked in by gregli@…, 13 years ago

Reworked the 'skip detecting the slave if there was no master' code to be more complete (includes configurator drives) and to take into account int13h/25h calls. Some of the changes in my last checkin have been rolled back as a result (they are no longer needed). I did take a byte out of RAMVARS, but there was an alignment byte available for the taking. I also added a perl script for padding and adding the checksum byte to a binary image, which can be invoked manually or with 'make checksum'.

File size: 5.5 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Functions for finding Disk Parameter Table.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Finds pointer to first unused Disk Parameter Table.
9;
10; FindDPT_ForNewDriveToDSDI
11; Parameters:
12; DS: RAMVARS segment
13; Returns:
14; DS:DI: Ptr to first unused DPT
15; Corrupts registers:
16; DL
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
19FindDPT_ForNewDriveToDSDI:
20 mov dl, [RAMVARS.bFirstDrv]
21 add dl, [RAMVARS.bDrvCnt]
22 ; Fall to FindDPT_ForDriveNumber
23
24
25;--------------------------------------------------------------------
26; Finds Disk Parameter Table for drive number.
27; IDE Base Port address will be stored to RAMVARS if correct DPT is found.
28;
29; FindDPT_ForDriveNumber
30; Parameters:
31; DL: Drive number
32; DS: RAMVARS segment
33; Returns:
34; DS:DI: Ptr to DPT
35; Corrupts registers:
36; Nothing
37;--------------------------------------------------------------------
38ALIGN JUMP_ALIGN
39FindDPT_ForDriveNumber:
40 push dx
41 xchg di, ax ; Save the contents of AX in DI
42
43 mov al, LARGEST_DPT_SIZE
44 sub dl, [RAMVARS.bFirstDrv]
45 mul dl
46 add ax, BYTE RAMVARS_size
47
48 xchg di, ax ; Restore AX and put result in DI
49 pop dx
50 ret
51
52;--------------------------------------------------------------------
53; Finds Disk Parameter Table for
54; Master or Slave drive at wanted port.
55;
56; FindDPT_ToDSDIForIdeMasterAtPortDX
57; FindDPT_ToDSDIForIdeSlaveAtPortDX
58; Parameters:
59; DX: IDE Base Port address
60; DS: RAMVARS segment
61; Returns:
62; DL: Drive number (if DPT found)
63; DS:DI: Ptr to DPT
64; CF: Set if wanted DPT found
65; Cleared if DPT not found
66; Corrupts registers:
67; SI
68;
69; Converted to macros since there is only once call site for each of these
70;
71;--------------------------------------------------------------------
72
73%macro FindDPT_ToDSDIForIdeMasterAtPortDX 0
74 mov si, IterateToMasterAtPortCallback
75 call IterateAllDPTs
76%endmacro
77
78%macro FindDPT_ToDSDIForIdeSlaveAtPortDX 0
79 mov si, IterateToSlaveAtPortCallback
80 call IterateAllDPTs
81%endmacro
82
83
84;--------------------------------------------------------------------
85; Iteration callback for finding DPT using
86; IDE base port for Master or Slave drive.
87;
88; IterateToSlaveAtPortCallback
89; IterateToMasterAtPortCallback
90; Parameters:
91; CH: Drive number
92; DX: IDE Base Port address
93; DS:DI: Ptr to DPT to examine
94; Returns:
95; DL: Drive number if correct DPT
96; CF: Set if wanted DPT found
97; Cleared if wrong DPT
98; Corrupts registers:
99; Nothing
100;--------------------------------------------------------------------
101ALIGN JUMP_ALIGN
102IterateToSlaveAtPortCallback:
103 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE ; Clears CF
104 jnz SHORT CompareBasePortAddress
105 ret ; Wrong DPT
106
107ALIGN JUMP_ALIGN
108IterateToMasterAtPortCallback:
109 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
110 jnz SHORT ReturnWrongDPT ; Return if slave drive
111
112CompareBasePortAddress:
113 push bx
114 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset] ; CS:BX now points to IDEVARS
115 cmp dx, [cs:bx+IDEVARS.wPort] ; Wanted port?
116 pop bx
117 jne SHORT ReturnWrongDPT
118 mov dl, ch ; Return drive number in DL
119
120ReturnRightDPT:
121 stc ; Set CF since wanted DPT
122 ret
123
124
125;--------------------------------------------------------------------
126; IterateToDptWithInterruptInServiceFlagSet
127; Parameters:
128; DS:DI: Ptr to DPT to examine
129; Returns:
130; CF: Set if wanted DPT found
131; Cleared if wrong DPT
132; Corrupts registers:
133; Nothing
134;--------------------------------------------------------------------
135ALIGN JUMP_ALIGN
136IterateToDptWithInterruptInServiceFlagSet:
137 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_INTERRUPT_IN_SERVICE ; Clears CF (but we need the clc
138 ; below anyway for callers above)
139 jnz SHORT ReturnRightDPT
140
141ReturnWrongDPT:
142 clc ; Clear CF since wrong DPT
143 ret
144
145;--------------------------------------------------------------------
146; FindDPT_ToDSDIforInterruptInService
147; Parameters:
148; DS: RAMVARS segment
149; Returns:
150; DS:DI: Ptr to DPT
151; CF: Set if wanted DPT found
152; Cleared if DPT not found
153; Corrupts registers:
154; SI
155;--------------------------------------------------------------------
156ALIGN JUMP_ALIGN
157FindDPT_ToDSDIforInterruptInService:
158 mov si, IterateToDptWithInterruptInServiceFlagSet
159 ; Fall to IterateAllDPTs
160
161;--------------------------------------------------------------------
162; Iterates all Disk Parameter Tables.
163;
164; IterateAllDPTs
165; Parameters:
166; AX,BX,DX: Parameters to callback function
167; CS:SI: Ptr to callback function
168; DS: RAMVARS segment
169; Returns:
170; DS:DI: Ptr to wanted DPT (if found)
171; CF: Set if wanted DPT found
172; Cleared if DPT not found, or no DPTs present
173; Corrupts registers:
174; Nothing unless corrupted by callback function
175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
177IterateAllDPTs:
178 push cx
179 mov cx, [RAMVARS.wDrvCntAndFirst]
180 jcxz .NotFound ; Return if no drives
181 mov di, RAMVARS_size ; Point DS:DI to first DPT
182ALIGN JUMP_ALIGN
183.LoopWhileDPTsLeft:
184 call si ; Is wanted DPT?
185 jc SHORT .AllDptsIterated ; If so, return
186 inc ch ; Increment drive number
187 add di, BYTE LARGEST_DPT_SIZE ; Point to next DPT
188 dec cl ; Decrement drives left
189 jnz SHORT .LoopWhileDPTsLeft
190.NotFound:
191 clc ; Clear CF since DPT not found
192ALIGN JUMP_ALIGN
193.AllDptsIterated:
194 pop cx
195 ret
Note: See TracBrowser for help on using the repository browser.