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

Last change on this file since 226 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
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;--------------------------------------------------------------------
8; Finds pointer to first unused Disk Parameter Table.
9;
[150]10; FindDPT_ForNewDriveToDSDI
[3]11; Parameters:
12; DS: RAMVARS segment
13; Returns:
14; DS:DI: Ptr to first unused DPT
15; Corrupts registers:
[150]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:
[3]36; Nothing
37;--------------------------------------------------------------------
38ALIGN JUMP_ALIGN
[150]39FindDPT_ForDriveNumber:
40 push dx
[161]41 xchg di, ax ; Save the contents of AX in DI
[3]42
[150]43 mov al, LARGEST_DPT_SIZE
44 sub dl, [RAMVARS.bFirstDrv]
45 mul dl
46 add ax, BYTE RAMVARS_size
[3]47
[161]48 xchg di, ax ; Restore AX and put result in DI
[150]49 pop dx
50 ret
51
[3]52;--------------------------------------------------------------------
53; Finds Disk Parameter Table for
54; Master or Slave drive at wanted port.
55;
[150]56; FindDPT_ToDSDIForIdeMasterAtPortDX
57; FindDPT_ToDSDIForIdeSlaveAtPortDX
[3]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:
[150]67; SI
[200]68;
69; Converted to macros since there is only once call site for each of these
70;
[3]71;--------------------------------------------------------------------
[200]72
73%macro FindDPT_ToDSDIForIdeMasterAtPortDX 0
[152]74 mov si, IterateToMasterAtPortCallback
[200]75 call IterateAllDPTs
76%endmacro
[3]77
[200]78%macro FindDPT_ToDSDIForIdeSlaveAtPortDX 0
[152]79 mov si, IterateToSlaveAtPortCallback
[200]80 call IterateAllDPTs
81%endmacro
[3]82
[200]83
[3]84;--------------------------------------------------------------------
85; Iteration callback for finding DPT using
86; IDE base port for Master or Slave drive.
87;
[152]88; IterateToSlaveAtPortCallback
89; IterateToMasterAtPortCallback
[3]90; Parameters:
[150]91; CH: Drive number
[3]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
[152]102IterateToSlaveAtPortCallback:
[158]103 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE ; Clears CF
[150]104 jnz SHORT CompareBasePortAddress
105 ret ; Wrong DPT
[3]106
107ALIGN JUMP_ALIGN
[152]108IterateToMasterAtPortCallback:
[158]109 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
[150]110 jnz SHORT ReturnWrongDPT ; Return if slave drive
[3]111
[150]112CompareBasePortAddress:
[3]113 push bx
[150]114 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset] ; CS:BX now points to IDEVARS
115 cmp dx, [cs:bx+IDEVARS.wPort] ; Wanted port?
[3]116 pop bx
[150]117 jne SHORT ReturnWrongDPT
118 mov dl, ch ; Return drive number in DL
[200]119
120ReturnRightDPT:
[150]121 stc ; Set CF since wanted DPT
[3]122 ret
[152]123
124
125;--------------------------------------------------------------------
[203]126; IterateToDptWithInterruptInServiceFlagSet
[152]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
[203]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)
[200]139 jnz SHORT ReturnRightDPT
140
[150]141ReturnWrongDPT:
[152]142 clc ; Clear CF since wrong DPT
[3]143 ret
144
145;--------------------------------------------------------------------
[161]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:
[203]154; SI
[161]155;--------------------------------------------------------------------
156ALIGN JUMP_ALIGN
157FindDPT_ToDSDIforInterruptInService:
[203]158 mov si, IterateToDptWithInterruptInServiceFlagSet
[161]159 ; Fall to IterateAllDPTs
160
161;--------------------------------------------------------------------
[3]162; Iterates all Disk Parameter Tables.
163;
[150]164; IterateAllDPTs
[3]165; Parameters:
[152]166; AX,BX,DX: Parameters to callback function
167; CS:SI: Ptr to callback function
168; DS: RAMVARS segment
[3]169; Returns:
[152]170; DS:DI: Ptr to wanted DPT (if found)
171; CF: Set if wanted DPT found
[200]172; Cleared if DPT not found, or no DPTs present
[3]173; Corrupts registers:
[150]174; Nothing unless corrupted by callback function
[3]175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
[150]177IterateAllDPTs:
[3]178 push cx
[150]179 mov cx, [RAMVARS.wDrvCntAndFirst]
[200]180 jcxz .NotFound ; Return if no drives
[152]181 mov di, RAMVARS_size ; Point DS:DI to first DPT
[3]182ALIGN JUMP_ALIGN
183.LoopWhileDPTsLeft:
184 call si ; Is wanted DPT?
[150]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
[200]190.NotFound:
[3]191 clc ; Clear CF since DPT not found
192ALIGN JUMP_ALIGN
[150]193.AllDptsIterated:
[3]194 pop cx
195 ret
Note: See TracBrowser for help on using the repository browser.