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

Last change on this file since 168 was 161, checked in by krille_n_@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • Minor size optimizations.
  • Tried to minimize the time spent with interrupts disabled in IdeIrq.asm and Int13h.asm
File size: 5.3 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;--------------------------------------------------------------------
54; Finds Disk Parameter Table for
55; Master or Slave drive at wanted port.
56;
57; FindDPT_ToDSDIForIdeMasterAtPortDX
58; FindDPT_ToDSDIForIdeSlaveAtPortDX
59; Parameters:
60; DX: IDE Base Port address
61; DS: RAMVARS segment
62; Returns:
63; DL: Drive number (if DPT found)
64; DS:DI: Ptr to DPT
65; CF: Set if wanted DPT found
66; Cleared if DPT not found
67; Corrupts registers:
68; SI
69;--------------------------------------------------------------------
70ALIGN JUMP_ALIGN
71FindDPT_ToDSDIForIdeMasterAtPortDX:
72 mov si, IterateToMasterAtPortCallback
73 jmp SHORT IterateAllDPTs
74
75ALIGN JUMP_ALIGN
76FindDPT_ToDSDIForIdeSlaveAtPortDX:
77 mov si, IterateToSlaveAtPortCallback
78 jmp SHORT IterateAllDPTs
79
80;--------------------------------------------------------------------
81; Iteration callback for finding DPT using
82; IDE base port for Master or Slave drive.
83;
84; IterateToSlaveAtPortCallback
85; IterateToMasterAtPortCallback
86; Parameters:
87; CH: Drive number
88; DX: IDE Base Port address
89; DS:DI: Ptr to DPT to examine
90; Returns:
91; DL: Drive number if correct DPT
92; CF: Set if wanted DPT found
93; Cleared if wrong DPT
94; Corrupts registers:
95; Nothing
96;--------------------------------------------------------------------
97ALIGN JUMP_ALIGN
98IterateToSlaveAtPortCallback:
99 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE ; Clears CF
100 jnz SHORT CompareBasePortAddress
101 ret ; Wrong DPT
102
103ALIGN JUMP_ALIGN
104IterateToMasterAtPortCallback:
105 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
106 jnz SHORT ReturnWrongDPT ; Return if slave drive
107
108CompareBasePortAddress:
109 push bx
110 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset] ; CS:BX now points to IDEVARS
111 cmp dx, [cs:bx+IDEVARS.wPort] ; Wanted port?
112 pop bx
113 jne SHORT ReturnWrongDPT
114 mov dl, ch ; Return drive number in DL
115 stc ; Set CF since wanted DPT
116 ret
117
118
119;--------------------------------------------------------------------
120; IterateToDptWithInterruptInServiceFlagSet
121; Parameters:
122; DS:DI: Ptr to DPT to examine
123; Returns:
124; CF: Set if wanted DPT found
125; Cleared if wrong DPT
126; Corrupts registers:
127; Nothing
128;--------------------------------------------------------------------
129ALIGN JUMP_ALIGN
130IterateToDptWithInterruptInServiceFlagSet:
131 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_INTERRUPT_IN_SERVICE
132 jz SHORT ReturnWrongDPT
133 stc ; Set CF since wanted DPT
134 ret
135ReturnWrongDPT:
136 clc ; Clear CF since wrong DPT
137 ret
138
139
140;--------------------------------------------------------------------
141; FindDPT_ToDSDIforInterruptInService
142; Parameters:
143; DS: RAMVARS segment
144; Returns:
145; DS:DI: Ptr to DPT
146; CF: Set if wanted DPT found
147; Cleared if DPT not found
148; Corrupts registers:
149; SI
150;--------------------------------------------------------------------
151ALIGN JUMP_ALIGN
152FindDPT_ToDSDIforInterruptInService:
153 mov si, IterateToDptWithInterruptInServiceFlagSet
154 ; Fall to IterateAllDPTs
155
156
157;--------------------------------------------------------------------
158; Iterates all Disk Parameter Tables.
159;
160; IterateAllDPTs
161; Parameters:
162; AX,BX,DX: Parameters to callback function
163; CS:SI: Ptr to callback function
164; DS: RAMVARS segment
165; Returns:
166; DS:DI: Ptr to wanted DPT (if found)
167; CF: Set if wanted DPT found
168; Cleared if DPT not found
169; Corrupts registers:
170; Nothing unless corrupted by callback function
171;--------------------------------------------------------------------
172ALIGN JUMP_ALIGN
173IterateAllDPTs:
174 push cx
175 mov cx, [RAMVARS.wDrvCntAndFirst]
176 jcxz .AllDptsIterated ; Return if no drives
177 mov di, RAMVARS_size ; Point DS:DI to first DPT
178ALIGN JUMP_ALIGN
179.LoopWhileDPTsLeft:
180 call si ; Is wanted DPT?
181 jc SHORT .AllDptsIterated ; If so, return
182 inc ch ; Increment drive number
183 add di, BYTE LARGEST_DPT_SIZE ; Point to next DPT
184 dec cl ; Decrement drives left
185 jnz SHORT .LoopWhileDPTsLeft
186 clc ; Clear CF since DPT not found
187ALIGN JUMP_ALIGN
188.AllDptsIterated:
189 pop cx
190 ret
Note: See TracBrowser for help on using the repository browser.