Changeset 324 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src
- Timestamp:
- Mar 11, 2012, 6:45:03 PM (13 years ago)
- google:author:
- aitotat@gmail.com
- Location:
- trunk/XTIDE_Universal_BIOS/Src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeError.asm
r294 r324 29 29 30 30 ; I don't think anything actually reads these from BDA 31 push ds32 LOAD_BDA_SEGMENT_TO ds, dx33 mov [HDBDA.wHDStAndErr], ax34 pop ds31 ;push ds 32 ;LOAD_BDA_SEGMENT_TO ds, dx 33 ;mov [HDBDA.wHDStAndErr], ax 34 ;pop ds 35 35 36 36 ; Fall to GetBiosErrorCodeToAHfromStatusAndErrorRegistersInAX -
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH48h_GetExtendedDriveParameters.asm
r294 r324 45 45 mov WORD [si+EDRIVE_INFO.wFlags], FLG_DMA_BOUNDARY_ERRORS_HANDLED_BY_BIOS 46 46 47 push ds ; Move CS to DS to avoid segment overrides 48 push cs 49 pop ds 50 51 ; Limit LBA if necessary 52 test BYTE [di+DRVPARAMS.wFlags], FLG_DRVPARAMS_USERLBA 53 jz SHORT .StoreTotalSectorsFromBXDXAX 54 test bx, bx 55 jnz SHORT .LimitTotalSectors 56 cmp dx, [di+DRVPARAMS.dwMaximumLBA+2] 57 jb SHORT .StoreTotalSectorsFromBXDXAX ; Real size less than max 58 ja SHORT .LimitTotalSectors 59 cmp ax, [di+DRVPARAMS.dwMaximumLBA] 60 jbe SHORT .StoreTotalSectorsFromBXDXAX ; Real size less than max 61 62 .LimitTotalSectors: 63 xor bx, bx 64 mov ax, [di+DRVPARAMS.dwMaximumLBA] 65 mov dx, [di+DRVPARAMS.dwMaximumLBA+2] 66 67 .StoreTotalSectorsFromBXDXAX: 68 pop ds ; Restore DS from the change above 47 ; Store total sector count 69 48 mov [si+EDRIVE_INFO.qwTotalSectors], ax 70 49 xor ax, ax ; Return with success -
trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm
r181 r324 5 5 ; Section containing code 6 6 SECTION .text 7 8 ;--------------------------------------------------------------------9 ; LBA assist calculation:10 ; this is how to fit a big drive into INT13's skimpy size requirements,11 ; with a maximum of 8.4G available.12 ;13 ; total LBAs (as obtained by words 60+61)14 ; divided by 63 (sectors per track) (save as value A)15 ; Sub 1 from A16 ; divide A by 1024 + truncate.17 ; == total number of heads to use.18 ; add 119 ; this value must be either 16, 32, 64, 128, or 256 (round up)20 ; then take the value A above and divide by # of heads21 ; to get the # of cylinders to use.22 ;23 ;24 ; so a LBA28 drive will have 268,435,456 as maximum LBAs25 ;26 ; 10000000h / 63 = 410410h (total cylinders or tracks)27 ; 410410h / 1024 = 1041h, which is way more than 256 heads, but 256 is max.28 ; 410410h / 256 = 4104h cylinders29 ;30 ; there's a wealth of information at: http://www.mossywell.com/boot-sequence31 ; they show a slightly different approach to LBA assist calulations, but32 ; the method here provides compatibility with phoenix BIOS33 ;34 ; we're using the values from 60+61 here because we're topping out at 8.4G35 ; anyway, so there's no need to use the 48bit LBA values.36 ;37 ; AtaID_GetLbaAssistedCHStoDXAXBLBH:38 ; Parameters:39 ; BX:DX:AX: Total number of sectors40 ; Returns:41 ; DX:AX: Number of cylinders42 ; BH: Number of sectors per track (always 63)43 ; BL: Number of heads (16, 32, 64, 128 or 255)44 ; Corrupts registers:45 ; CX46 ;--------------------------------------------------------------------47 AtaID_GetLbaAssistedCHStoDXAXBLBH:48 push bp49 push si50 51 ; Value A = Total sector count / 6352 xor cx, cx53 push cx ; Push zero for bits 48...6354 push bx55 push dx56 push ax ; 64-bit sector count now in stack57 mov cl, LBA_ASSIST_SPT58 mov bp, sp ; SS:BP now points sector count59 call Math_DivQWatSSBPbyCX ; Temporary value A now in stack60 61 ; BX = Number of heads = A / 102462 mov ax, [bp]63 mov dx, [bp+2]64 mov bx, [bp+4]65 call Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX66 67 ; Heads must be 16, 32, 64, 128 or 256 (round up)68 mov bx, 256 ; Max number of heads69 test dx, dx ; 65536 or more heads?70 jnz SHORT .GetNumberOfCylinders71 mov cx, 128 ; Half BX for rounding up72 .FindMostSignificantBitForHeadSize:73 cmp ax, cx74 jae SHORT .GetNumberOfCylinders75 shr cx, 176 shr bx, 1 ; Halve number of heads77 jmp SHORT .FindMostSignificantBitForHeadSize78 79 ; DX:AX = Number of cylinders = A / number of heads80 .GetNumberOfCylinders:81 mov cx, bx82 call Math_DivQWatSSBPbyCX83 mov ax, [bp]84 mov dx, [bp+2] ; Cylinders now in DX:AX85 86 ; Return LBA assisted CHS87 add sp, BYTE 8 ; Clean stack88 sub bl, bh ; Limit heads to 25589 mov bh, LBA_ASSIST_SPT90 pop si91 pop bp92 ret93 94 7 95 8 ;-------------------------------------------------------------------- -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm
r231 r324 58 58 59 59 call AccessDPT_GetLbaSectorCountToBXDXAX 60 call A taID_GetLbaAssistedCHStoDXAXBLBH60 call AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH 61 61 test dx, dx 62 62 jnz SHORT .LimitAXtoMaxLCHScylinders … … 157 157 and al, MASKL_DPT_ADDRESSING_MODE 158 158 %endmacro 159 160 161 ;-------------------------------------------------------------------- 162 ; LBA assist calculation: 163 ; this is how to fit a big drive into INT13's skimpy size requirements, 164 ; with a maximum of 8.4G available. 165 ; 166 ; total LBAs (as obtained by words 60+61) 167 ; divided by 63 (sectors per track) (save as value A) 168 ; Sub 1 from A 169 ; divide A by 1024 + truncate. 170 ; == total number of heads to use. 171 ; add 1 172 ; this value must be either 16, 32, 64, 128, or 256 (round up) 173 ; then take the value A above and divide by # of heads 174 ; to get the # of cylinders to use. 175 ; 176 ; 177 ; so a LBA28 drive will have 268,435,456 as maximum LBAs 178 ; 179 ; 10000000h / 63 = 410410h (total cylinders or tracks) 180 ; 410410h / 1024 = 1041h, which is way more than 256 heads, but 256 is max. 181 ; 410410h / 256 = 4104h cylinders 182 ; 183 ; there's a wealth of information at: http://www.mossywell.com/boot-sequence 184 ; they show a slightly different approach to LBA assist calulations, but 185 ; the method here provides compatibility with phoenix BIOS 186 ; 187 ; we're using the values from 60+61 here because we're topping out at 8.4G 188 ; anyway, so there's no need to use the 48bit LBA values. 189 ; 190 ; AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHStoDXAXBLBH: 191 ; Parameters: 192 ; BX:DX:AX: Total number of sectors 193 ; Returns: 194 ; DX:AX: Number of cylinders 195 ; BH: Number of sectors per track (always 63) 196 ; BL: Number of heads (16, 32, 64, 128 or 255) 197 ; Corrupts registers: 198 ; CX 199 ;-------------------------------------------------------------------- 200 AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH: 201 push bp 202 push si 203 204 ; Value A = Total sector count / 63 205 xor cx, cx 206 push cx ; Push zero for bits 48...63 207 push bx 208 push dx 209 push ax ; 64-bit sector count now in stack 210 mov cl, LBA_ASSIST_SPT 211 mov bp, sp ; SS:BP now points sector count 212 call Math_DivQWatSSBPbyCX ; Temporary value A now in stack 213 214 ; BX = Number of heads = A / 1024 215 mov ax, [bp] 216 mov dx, [bp+2] 217 mov bx, [bp+4] 218 call Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX 219 220 ; Heads must be 16, 32, 64, 128 or 256 (round up) 221 mov bx, 256 ; Max number of heads 222 test dx, dx ; 65536 or more heads? 223 jnz SHORT .GetNumberOfCylinders 224 mov cx, 128 ; Half BX for rounding up 225 .FindMostSignificantBitForHeadSize: 226 cmp ax, cx 227 jae SHORT .GetNumberOfCylinders 228 shr cx, 1 229 shr bx, 1 ; Halve number of heads 230 jmp SHORT .FindMostSignificantBitForHeadSize 231 232 ; DX:AX = Number of cylinders = A / number of heads 233 .GetNumberOfCylinders: 234 mov cx, bx 235 call Math_DivQWatSSBPbyCX 236 mov ax, [bp] 237 mov dx, [bp+2] ; Cylinders now in DX:AX 238 239 ; Return LBA assisted CHS 240 add sp, BYTE 8 ; Clean stack 241 sub bl, bh ; Limit heads to 255 242 mov bh, LBA_ASSIST_SPT 243 pop si 244 pop bp 245 ret -
trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm
r294 r324 87 87 jz SHORT .StoreCHSfromAXBHBL ; Small old drive with CHS addressing only 88 88 89 ; Check if 48-bit LBA supported 90 test BYTE [es:si+ATA6.wSetSup83+1], A6_wSetSup83_LBA48>>8 91 jz SHORT .StoreLBA28addressing 92 or BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION 93 .StoreLBA28addressing: 94 or BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION 89 ; Store LBA 28/48 addressing and total sector count 95 90 call AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI 96 mov [di+DPT.twLbaSectors], ax 97 mov [di+DPT.twLbaSectors+2], dx 98 mov [di+DPT.twLbaSectors+4], bx 99 call AtaID_GetLbaAssistedCHStoDXAXBLBH 91 call StoreLbaAddressingAndTotalSectorCountFromBXDXAX 92 93 ; Replace sector count with user defined if necessary 94 call AccessDPT_GetPointerToDRVPARAMStoCSBX 95 test BYTE [cs:bx+DRVPARAMS.wFlags], FLG_DRVPARAMS_USERLBA 96 jz SHORT .KeepTotalSectorsFromAtaID 97 mov ax, [cs:bx+DRVPARAMS.dwMaximumLBA] 98 mov dx, [cs:bx+DRVPARAMS.dwMaximumLBA+2] 99 xor bx, bx 100 101 ; Compare user defined and ATA-ID sector count and select smaller 102 cmp bx, [di+DPT.twLbaSectors+4] 103 jb SHORT .StoreUserDefinedSectorCountToDPT 104 cmp dx, [di+DPT.twLbaSectors+2] 105 jb SHORT .StoreUserDefinedSectorCountToDPT 106 ja SHORT .KeepTotalSectorsFromAtaID 107 cmp ax, [di+DPT.twLbaSectors] 108 jae SHORT .KeepTotalSectorsFromAtaID 109 .StoreUserDefinedSectorCountToDPT: 110 call StoreLbaAddressingAndTotalSectorCountFromBXDXAX 111 112 ; Calculate L-CHS for old INT 13h 113 .KeepTotalSectorsFromAtaID: 114 mov bx, [di+DPT.twLbaSectors+4] ; Restore BX 115 call AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH 100 116 mov [di+DPT.bLbaHeads], bl 101 117 jmp SHORT .StoreBlockMode … … 233 249 ret 234 250 251 252 ;-------------------------------------------------------------------- 253 ; StoreLbaAddressingAndTotalSectorCountFromBXDXAX 254 ; Parameters: 255 ; BX:DX:AX: Total Sector Count 256 ; DS:DI: Ptr to Disk Parameter Table 257 ; Returns: 258 ; Nothing 259 ; Corrupts registers: 260 ; CX 261 ;-------------------------------------------------------------------- 262 StoreLbaAddressingAndTotalSectorCountFromBXDXAX: 263 mov [di+DPT.twLbaSectors], ax 264 mov [di+DPT.twLbaSectors+2], dx 265 mov [di+DPT.twLbaSectors+4], bx 266 267 and BYTE [di+DPT.bFlagsLow], ~MASKL_DPT_ADDRESSING_MODE 268 test bx, bx 269 jnz SHORT .SetLba48AddressingToDPT 270 test dh, 0F0h 271 jz SHORT .SetLba28AddressingToDPT 272 .SetLba48AddressingToDPT: 273 or BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION 274 .SetLba28AddressingToDPT: 275 or BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION 276 ret
Note:
See TracChangeset
for help on using the changeset viewer.