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

Last change on this file since 159 was 158, checked in by Tomi Tilli, 14 years ago

Changes to XTIDE Universal BIOS:

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