source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm@ 496

Last change on this file since 496 was 493, checked in by gregli@…, 12 years ago

Separated MODULE_8BIT_IDE into the basic part used by XTIDE rev 1 and rev 2 which is PIO based, and MODULE_8BIT_IDE_ADVANCED for JRIDE and XTCF support which requires memory mapping and/or DMA. This allows for creating an 8KB image with boot menu support (but no hotkeys) for the XTIDE rev 1. Cleaned up how we reset the drive translation information, ensuring it is properly set between boot attempt on a primary and secondary drive - as a result we clean it when needed, rather than trying to always keep it clean. Also fixed translation bugs in int13h.asm where I had previously missed converting some MODULE_HOTKEYS into MODULE_DRIVEXLATE.

File size: 11.1 KB
RevLine 
[99]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for creating Disk Parameter Table.
3
[376]4;
[445]5; XTIDE Universal BIOS and Associated Tools
[376]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
[445]12;
[376]13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
[445]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[445]18;
[376]19
[3]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Creates new Disk Parameter Table for detected hard disk.
25; Drive is then fully accessible using any BIOS function.
26;
27; CreateDPT_FromAtaInformation
28; Parameters:
29; BH: Drive Select byte for Drive and Head Register
[473]30; DX: Autodetected port (for devices that support autodetection)
[3]31; ES:SI: Ptr to 512-byte ATA information read from the drive
32; CS:BP: Ptr to IDEVARS for the controller
33; DS: RAMVARS segment
34; ES: BDA Segment
35; Returns:
[294]36; DS:DI: Ptr to Disk Parameter Table (if successful)
[3]37; CF: Cleared if DPT created successfully
38; Set if any error
39; Corrupts registers:
[99]40; AX, BX, CX, DH
[3]41;--------------------------------------------------------------------
42CreateDPT_FromAtaInformation:
[150]43 call FindDPT_ForNewDriveToDSDI
[99]44 ; Fall to .InitializeDPT
[3]45
46;--------------------------------------------------------------------
[99]47; .InitializeDPT
[3]48; Parameters:
49; BH: Drive Select byte for Drive and Head Register
[473]50; DX: Autodetected port (for devices that support autodetection)
[3]51; DS:DI: Ptr to Disk Parameter Table
52; CS:BP: Ptr to IDEVARS for the controller
53; Returns:
[150]54; Nothing
[3]55; Corrupts registers:
[150]56; AX
[3]57;--------------------------------------------------------------------
[99]58.InitializeDPT:
[473]59 call CreateDPT_StoreIdevarsOffsetAndBasePortFromCSBPtoDPTinDSDI
[150]60 ; Fall to .StoreDriveSelectAndDriveControlByte
[3]61
62;--------------------------------------------------------------------
[150]63; .StoreDriveSelectAndDriveControlByte
[3]64; Parameters:
65; BH: Drive Select byte for Drive and Head Register
66; DS:DI: Ptr to Disk Parameter Table
67; ES:SI: Ptr to 512-byte ATA information read from the drive
68; CS:BP: Ptr to IDEVARS for the controller
69; Returns:
[99]70; Nothing
[3]71; Corrupts registers:
72; AX
73;--------------------------------------------------------------------
[150]74.StoreDriveSelectAndDriveControlByte:
75 mov al, bh
76 and ax, BYTE FLG_DRVNHEAD_DRV ; AL now has Master/Slave bit
[411]77%ifdef MODULE_IRQ
[150]78 cmp [cs:bp+IDEVARS.bIRQ], ah ; Interrupts enabled?
79 jz SHORT .StoreFlags ; If not, do not set interrupt flag
[158]80 or al, FLGL_DPT_ENABLE_IRQ
[150]81.StoreFlags:
[411]82%endif
[150]83 mov [di+DPT.wFlags], ax
[421]84 ; Fall to .StoreCHSparametersAndAddressingMode
[3]85
86;--------------------------------------------------------------------
[421]87; .StoreCHSparametersAndAddressingMode
[3]88; Parameters:
89; DS:DI: Ptr to Disk Parameter Table
90; ES:SI: Ptr to 512-byte ATA information read from the drive
91; CS:BP: Ptr to IDEVARS for the controller
92; Returns:
[227]93; Nothing
[3]94; Corrupts registers:
[227]95; AX, BX, CX, DX
[3]96;--------------------------------------------------------------------
[421]97.StoreCHSparametersAndAddressingMode:
[173]98 ; Check if CHS defined in ROMVARS
[422]99 call GetUserDefinedCapacityToBXAXandFlagsToCXandModeToDXfromROMVARS
100 test cl, FLG_DRVPARAMS_USERCHS
[421]101 jz SHORT .AutodetectPCHSvalues
[173]102
[422]103 ; Translate P-CHS to L-CHS
104 call AtaGeometry_GetLCHStoAXBLBHfromPCHSinAXBLBHandTranslateModeInDX
[421]105 jmp SHORT .StoreLCHStoDPT
106.AutodetectPCHSvalues:
[422]107 call AtaGeometry_GetLCHStoAXBLBHfromAtaInfoInESSIandTranslateModeInDX
[421]108
109.StoreLCHStoDPT:
[422]110 eSHL_IM dl, TRANSLATEMODE_FIELD_POSITION
[421]111 or cl, dl
112 or [di+DPT.bFlagsLow], cl ; Shift count and addressing mode
113 mov [di+DPT.wLchsCylinders], ax
114 mov [di+DPT.wLchsHeadsAndSectors], bx
115
116 ; Store P-CHS to DPT
117 call AtaGeometry_GetPCHStoAXBLBHfromAtaInfoInESSI
118 mov [di+DPT.bPchsHeads], bl
119%ifdef MODULE_EBIOS
120 mov [di+DPT.wPchsCylinders], ax
121 mov [di+DPT.bPchsSectorsPerTrack], bh
122 ; Fall to .StoreNumberOfLbaSectors
123
124;--------------------------------------------------------------------
125; .StoreNumberOfLbaSectors
126; Parameters:
127; DS:DI: Ptr to Disk Parameter Table
128; ES:SI: Ptr to 512-byte ATA information read from the drive
129; CS:BP: Ptr to IDEVARS for the controller
130; Returns:
131; Nothing
132; Corrupts registers:
133; AX, BX, CX, DX
134;--------------------------------------------------------------------
[173]135 ; Check if LBA supported
136 test BYTE [es:si+ATA1.wCaps+1], A1_wCaps_LBA>>8
[421]137 jz SHORT .NoLbaSupportedSoNoEBIOS
[3]138
[421]139 ; Store LBA 28/48 total sector count
140 call AtaGeometry_GetLbaSectorCountToBXDXAXfromAtaInfoInESSI
141 call StoreLba48AddressingFromCLandTotalSectorCountFromBXDXAX
[324]142
[421]143 ; Load user defined LBA
[422]144 call GetUserDefinedCapacityToBXAXandFlagsToCXandModeToDXfromROMVARS
145 test cl, FLG_DRVPARAMS_USERLBA
[324]146 jz SHORT .KeepTotalSectorsFromAtaID
147
148 ; Compare user defined and ATA-ID sector count and select smaller
[445]149 mov dx, bx
150 xor bx, bx ; User defined LBA now in BX:DX:AX
[324]151 cmp bx, [di+DPT.twLbaSectors+4]
152 jb SHORT .StoreUserDefinedSectorCountToDPT
153 cmp dx, [di+DPT.twLbaSectors+2]
154 jb SHORT .StoreUserDefinedSectorCountToDPT
155 ja SHORT .KeepTotalSectorsFromAtaID
156 cmp ax, [di+DPT.twLbaSectors]
157 jae SHORT .KeepTotalSectorsFromAtaID
158.StoreUserDefinedSectorCountToDPT:
[422]159 ; CL bit FLGL_DPT_LBA48 is clear at this point
[421]160 call StoreLba48AddressingFromCLandTotalSectorCountFromBXDXAX
[324]161
162.KeepTotalSectorsFromAtaID:
[421]163.NoLbaSupportedSoNoEBIOS:
164%endif ; MODULE_EBIOS
[99]165 ; Fall to .StoreBlockMode
[3]166
167;--------------------------------------------------------------------
[99]168; .StoreBlockMode
[3]169; Parameters:
170; DS:DI: Ptr to Disk Parameter Table
171; ES:SI: Ptr to 512-byte ATA information read from the drive
[160]172; CS:BP: Ptr to IDEVARS for the controller
[3]173; Returns:
[99]174; Nothing
[3]175; Corrupts registers:
[150]176; Nothing
[3]177;--------------------------------------------------------------------
[99]178.StoreBlockMode:
[150]179 cmp BYTE [es:si+ATA1.bBlckSize], 1 ; Max block size in sectors
180 jbe SHORT .BlockModeTransfersNotSupported
[158]181 or BYTE [di+DPT.bFlagsHigh], FLGH_DPT_BLOCK_MODE_SUPPORTED
[150]182.BlockModeTransfersNotSupported:
183 ; Fall to .StoreDeviceSpecificParameters
[3]184
185;--------------------------------------------------------------------
[150]186; .StoreDeviceSpecificParameters
[3]187; Parameters:
188; DS:DI: Ptr to Disk Parameter Table
189; ES:SI: Ptr to 512-byte ATA information read from the drive
[160]190; CS:BP: Ptr to IDEVARS for the controller
[3]191; Returns:
[99]192; Nothing
[3]193; Corrupts registers:
[150]194; AX, BX, CX, DX
[3]195;--------------------------------------------------------------------
[150]196.StoreDeviceSpecificParameters:
197 call Device_FinalizeDPT
[258]198
[262]199;----------------------------------------------------------------------
200; Update drive counts (hard and floppy)
[294]201;----------------------------------------------------------------------
202
[258]203%ifdef MODULE_SERIAL_FLOPPY
204;
205; These two instructions serve two purposes:
206; 1. If the drive is a floppy drive (CF set), then we effectively increment the counter.
[294]207; 2. If this is a hard disk, and there have been any floppy drives previously added, then the hard disk is
[258]208; effectively discarded. This is more of a safety check then code that should ever normally be hit (see below).
[294]209; Since the floppy DPT's come after the hard disk DPT's, without expensive (code size) code to relocate a DPT,
[258]210; this was necessary. Now, this situation shouldn't happen in normal operation, for a couple of reasons:
[294]211; A. xtidecfg always puts configured serial ports at the end of the IDEVARS list
[258]212; B. the auto serial code is always executed last
213; C. the serial server always returns floppy drives last
214;
215 adc byte [RAMVARS.xlateVars+XLATEVARS.bFlopCreateCnt], 0
[294]216 jnz .AllDone
[258]217%else
218;
219; Even without floppy support enabled, we shouldn't try to mount a floppy image as a hard disk, which
[294]220; could lead to unpredictable results since no MBR will be present, etc. The server doesn't know that
[258]221; floppies are supported, so it is important to still fail here if a floppy is seen during the drive scan.
222;
223 jc .AllDone
224%endif
225
[150]226 inc BYTE [RAMVARS.bDrvCnt] ; Increment drive count to RAMVARS
[294]227
228.AllDone:
[162]229 clc
[3]230 ret
[258]231
[324]232
[422]233;--------------------------------------------------------------------
[473]234; CreateDPT_StoreIdevarsOffsetAndBasePortFromCSBPtoDPTinDSDI
235; Parameters:
236; DX: Autodetected port (for devices that support autodetection)
237; DS:DI: Ptr to Disk Parameter Table
238; CS:BP: Ptr to IDEVARS for the controller
239; Returns:
240; Nothing
241; Corrupts registers:
242; AX
243;--------------------------------------------------------------------
244CreateDPT_StoreIdevarsOffsetAndBasePortFromCSBPtoDPTinDSDI:
245 mov [di+DPT.bIdevarsOffset], bp ; IDEVARS must start in first 256 bytes of ROM
246
[493]247%ifdef MODULE_8BIT_IDE_ADVANCED
[473]248 call DetectDrives_DoesIdevarsInCSBPbelongToXTCF
249 jne SHORT .DeviceUsesPortSpecifiedInIDEVARS
250 mov [di+DPT.wBasePort], dx
251 ret
252.DeviceUsesPortSpecifiedInIDEVARS:
[493]253%endif ; MODULE_8BIT_IDE_ADVANCED
[473]254
255 mov ax, [cs:bp+IDEVARS.wBasePort]
256 mov [di+DPT.wBasePort], ax
257 ret
258
259
260;--------------------------------------------------------------------
[422]261; GetUserDefinedCapacityToBXAXandFlagsToCXandModeToDXfromROMVARS
262; Parameters:
263; DS:DI: Ptr to Disk Parameter Table
264; Returns:
265; AX: User defined P-CHS Cylinders or LBA low word
266; BX: User defined P-CHS Heads and Sectors or LBA high word
267; DX: Translate mode or TRANSLATEMODE_AUTO
268; CX: FLG_DRVPARAMS_USERCHS if user defined CHS in BX:AX
269; FLG_DRVPARAMS_USERLBA if user defined LBA in BX:AX
270; Zero if user has not defined capacity
271; Corrupts registers:
272; Nothing
273;--------------------------------------------------------------------
274GetUserDefinedCapacityToBXAXandFlagsToCXandModeToDXfromROMVARS:
275 call AccessDPT_GetPointerToDRVPARAMStoCSBX
276
277 ; Get settings
278 mov cx, [cs:bx+DRVPARAMS.wFlags]
279 mov dx, cx
280 and cx, BYTE FLG_DRVPARAMS_USERCHS | FLG_DRVPARAMS_USERLBA
281 and dx, BYTE MASK_DRVPARAMS_TRANSLATEMODE
282 eSHR_IM dx, TRANSLATEMODE_FIELD_POSITION
283
284 ; Get capacity
285 mov ax, [cs:bx+DRVPARAMS.wCylinders] ; Or .dwMaximumLBA
286 mov bx, [cs:bx+DRVPARAMS.wHeadsAndSectors] ; Or .dwMaximumLBA+2
287 ret
288
289
[421]290%ifdef MODULE_EBIOS
[324]291;--------------------------------------------------------------------
[421]292; StoreLba48AddressingFromCLandTotalSectorCountFromBXDXAX
[324]293; Parameters:
294; BX:DX:AX: Total Sector Count
[421]295; CL: FLGL_DPT_LBA48 if LBA48 supported
[324]296; DS:DI: Ptr to Disk Parameter Table
297; Returns:
298; Nothing
299; Corrupts registers:
[421]300; CL
[324]301;--------------------------------------------------------------------
[421]302StoreLba48AddressingFromCLandTotalSectorCountFromBXDXAX:
303 or cl, FLGL_DPT_LBA_AND_EBIOS_SUPPORTED
304 and BYTE [di+DPT.bFlagsLow], ~FLGL_DPT_LBA48
305 or [di+DPT.bFlagsLow], cl
[324]306 mov [di+DPT.twLbaSectors], ax
307 mov [di+DPT.twLbaSectors+2], dx
308 mov [di+DPT.twLbaSectors+4], bx
309 ret
[421]310%endif ; MODULE_EBIOS
Note: See TracBrowser for help on using the repository browser.