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

Last change on this file since 275 was 271, checked in by aitotat@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • AH=0h (Reset) should now work but our drives are no longer reset if DL belongs to foreign drive.
File size: 7.9 KB
RevLine 
[150]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for finding Disk Parameter Table.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
[262]8; Checks if drive is handled by this BIOS, and return DPT pointer.
[3]9;
[262]10; FindDPT_ForDriveNumberInDL
[3]11; Parameters:
[262]12; DL: Drive number
[3]13; DS: RAMVARS segment
14; Returns:
[262]15; CF: Cleared if drive is handled by this BIOS
16; Set if drive belongs to some other BIOS
17; DI: DPT Pointer if drive is handled by this BIOS
18; Zero if drive belongs to some other BIOS
[3]19; Corrupts registers:
[262]20; Nothing
[150]21;--------------------------------------------------------------------
22ALIGN JUMP_ALIGN
[262]23FindDPT_ForDriveNumberInDL:
24 xchg di, ax ; Save the contents of AX in DI
25
26;
27; Check Our Hard Disks
28;
29 mov ax, [RAMVARS.wDrvCntAndFirst] ; Drive count to AH, First number to AL
30 add ah, al ; One past last drive to AH
31
[258]32%ifdef MODULE_SERIAL_FLOPPY
[262]33 cmp dl, ah ; Above last supported?
34 jae SHORT .HardDiskNotHandledByThisBIOS
35
36 cmp dl, al ; Below first supported?
37 jae SHORT .CalcDPTForDriveNumber
38
39ALIGN JUMP_ALIGN
40.HardDiskNotHandledByThisBIOS:
41;
42; Check Our Floppy Disks
43;
44 call RamVars_UnpackFlopCntAndFirstToAL
45 cbw ; normally 0h, could be ffh if no drives present
46 adc ah, al ; if no drives present, still ffh (ffh + ffh + 1 = ffh)
47 js SHORT .DiskIsNotHandledByThisBIOS
48 cmp ah, dl ; Check second drive if two, first drive if only one
49 jz SHORT .CalcDPTForDriveNumber
50 cmp al, dl ; Check first drive in all cases, redundant but OK to repeat
51 jnz SHORT .DiskIsNotHandledByThisBIOS
52%else
53 cmp dl, ah ; Above last supported?
54 jae SHORT .DiskIsNotHandledByThisBIOS
55
56 cmp dl, al ; Below first supported?
57 jb SHORT .DiskIsNotHandledByThisBIOS
[258]58%endif
[262]59 ; fall-through to CalcDPTForDriveNumber
[150]60
61;--------------------------------------------------------------------
62; Finds Disk Parameter Table for drive number.
[262]63; Note intended to be called except by FindDPT_ForDriveNumber
[150]64;
[262]65; CalcDPTForDriveNumber
[150]66; Parameters:
67; DL: Drive number
68; DS: RAMVARS segment
[262]69; DI: Saved copy of AX from entry at FindDPT_ForDriveNumber
[150]70; Returns:
71; DS:DI: Ptr to DPT
[262]72; CF: Clear
[150]73; Corrupts registers:
[3]74; Nothing
75;--------------------------------------------------------------------
76ALIGN JUMP_ALIGN
[262]77.CalcDPTForDriveNumber:
[150]78 push dx
[3]79
[258]80%ifdef MODULE_SERIAL_FLOPPY
81 mov ax, [RAMVARS.wDrvCntAndFirst]
82
83 test dl, dl
84 js .harddisk
85
86 call RamVars_UnpackFlopCntAndFirstToAL
87 add dl, ah ; add in end of hard disk DPT list, floppies start immediately after
[262]88
89ALIGN JUMP_ALIGN
[258]90.harddisk:
91 sub dl, al ; subtract off beginning of either hard disk or floppy list (as appropriate)
92%else
93 sub dl, [RAMVARS.bFirstDrv] ; subtract off beginning of hard disk list
94%endif
[262]95
96.CalcDPTForNewDrive:
[150]97 mov al, LARGEST_DPT_SIZE
[258]98
[150]99 mul dl
[262]100 add ax, BYTE RAMVARS_size ; Clears CF (will not oveflow)
[3]101
[150]102 pop dx
[262]103
104 xchg di, ax ; Restore AX from entry at FindDPT_ForDriveNumber, put DPT pointer in DI
[150]105 ret
106
[262]107ALIGN JUMP_ALIGN
108.DiskIsNotHandledByThisBIOS:
[259]109;
[262]110; Drive not found...
111;
112 xor ax, ax ; Clear DPT pointer
113 stc ; Is not supported by our BIOS
114
115 xchg di, ax ; Restore AX from save at top
[259]116 ret
117
[271]118
[259]119;--------------------------------------------------------------------
[271]120; FindDPT_ForIdevarsOffsetInDL
121; Parameters:
122; DL: Offset to IDEVARS to search for
123; DS: RAMVARS segment
124; Returns:
125; DS:DI: Ptr to first DPT with same IDEVARS as in DL
126; CF: Clear if wanted DPT found
127; Set if DPT not found, or no DPTs present
128; Corrupts registers:
129; SI
130;--------------------------------------------------------------------
131FindDPT_ForIdevarsOffsetInDL:
132 mov si, IterateFindFirstDPTforIdevars ; iteration routine (see below)
133 jmp SHORT FindDPT_IterateAllDPTs ; look for the first drive on this controller, if any
134
135;--------------------------------------------------------------------
136; Iteration routine for FindDPT_ForIdevarsOffsetInDL,
137; for use with IterateAllDPTs
138;
139; Returns when DPT is found on the controller with Idevars offset in DL
140;
141; IterateFindFirstDPTforIdevars
142; DL: Offset to IDEVARS to search from DPTs
143; DS:DI: Ptr to DPT to examine
144; Returns:
145; CF: Clear if wanted DPT found
146; Set if wrong DPT
147;--------------------------------------------------------------------
148IterateFindFirstDPTforIdevars:
149 cmp dl, [di+DPT.bIdevarsOffset] ; Clears CF if matched
150 je .done
151 stc ; Set CF for not found
152.done:
153 ret
154
155
156;--------------------------------------------------------------------
[262]157; Finds pointer to first unused Disk Parameter Table.
158; Should only be used before DetectDrives is complete (not valid after this time).
[3]159;
[262]160; FindDPT_ForNewDriveToDSDI
[3]161; Parameters:
162; DS: RAMVARS segment
163; Returns:
[262]164; DS:DI: Ptr to first unused DPT
[3]165; Corrupts registers:
[262]166; AX
[3]167;--------------------------------------------------------------------
[262]168ALIGN JUMP_ALIGN
169FindDPT_ForNewDriveToDSDI:
170 push dx
[200]171
[262]172%ifdef MODULE_SERIAL_FLOPPY
173 mov dx, [RAMVARS.wDrvCntAndFlopCnt]
174 add dl, dh
175%else
176 mov dl, [RAMVARS.bDrvCnt]
177%endif
178
179 jmp short FindDPT_ForDriveNumberInDL.CalcDPTForNewDrive
[3]180
[152]181;--------------------------------------------------------------------
[233]182; IterateToDptWithFlagsHighInBL
[152]183; Parameters:
184; DS:DI: Ptr to DPT to examine
[233]185; BL: Bit(s) to test in DPT.bFlagsHigh
[152]186; Returns:
[262]187; CF: Clear if wanted DPT found
188; Set if wrong DPT
[152]189; Corrupts registers:
190; Nothing
191;--------------------------------------------------------------------
192ALIGN JUMP_ALIGN
[233]193IterateToDptWithFlagsHighInBL:
[262]194 test BYTE [di+DPT.bFlagsHigh], bl ; Clears CF
195 jnz SHORT .ReturnRightDPT
196 stc
197.ReturnRightDPT:
[3]198 ret
199
200;--------------------------------------------------------------------
[233]201; FindDPT_ToDSDIforSerialDevice
[161]202; Parameters:
203; DS: RAMVARS segment
204; Returns:
205; DS:DI: Ptr to DPT
206; CF: Set if wanted DPT found
207; Cleared if DPT not found
208; Corrupts registers:
[203]209; SI
[161]210;--------------------------------------------------------------------
[265]211%ifdef MODULE_SERIAL
[233]212ALIGN JUMP_ALIGN
213FindDPT_ToDSDIforSerialDevice:
214 mov bl, FLGH_DPT_SERIAL_DEVICE
215; fall-through
[265]216%endif
[233]217
218;--------------------------------------------------------------------
219; FindDPT_ToDSDIforFlagsHigh
220; Parameters:
221; DS: RAMVARS segment
222; BL: Bit(s) to test in DPT.bFlagsHigh
223; Returns:
224; DS:DI: Ptr to DPT
225; CF: Set if wanted DPT found
226; Cleared if DPT not found
227; Corrupts registers:
228; SI
229;--------------------------------------------------------------------
[161]230ALIGN JUMP_ALIGN
[233]231FindDPT_ToDSDIforFlagsHighInBL:
232 mov si, IterateToDptWithFlagsHighInBL
[161]233 ; Fall to IterateAllDPTs
234
235;--------------------------------------------------------------------
[3]236; Iterates all Disk Parameter Tables.
237;
[271]238; FindDPT_IterateAllDPTs
[3]239; Parameters:
[152]240; AX,BX,DX: Parameters to callback function
241; CS:SI: Ptr to callback function
[262]242; Callback routine should return CF=clear if found
[152]243; DS: RAMVARS segment
[3]244; Returns:
[152]245; DS:DI: Ptr to wanted DPT (if found)
[258]246; If not found, points to first empty DPT
[262]247; CF: Clear if wanted DPT found
248; Set if DPT not found, or no DPTs present
[3]249; Corrupts registers:
[150]250; Nothing unless corrupted by callback function
[3]251;--------------------------------------------------------------------
252ALIGN JUMP_ALIGN
[271]253FindDPT_IterateAllDPTs:
[3]254 push cx
[258]255
256 mov di, RAMVARS_size ; Point DS:DI to first DPT
257
[259]258 mov cl, [RAMVARS.bDrvCnt]
259 xor ch, ch ; Clears CF
[258]260
[262]261 jcxz .NotFound ; Return if no drives
[259]262
[3]263ALIGN JUMP_ALIGN
264.LoopWhileDPTsLeft:
265 call si ; Is wanted DPT?
[262]266 jnc SHORT .Found ; If so, return
267 add di, BYTE LARGEST_DPT_SIZE ; Point to next DPT
[258]268 loop .LoopWhileDPTsLeft
[262]269
[3]270ALIGN JUMP_ALIGN
[262]271.NotFound:
272 stc
273
274ALIGN JUMP_ALIGN
275.Found:
[3]276 pop cx
277 ret
[259]278
Note: See TracBrowser for help on using the repository browser.