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

Last change on this file since 500 was 493, checked in by gregli@…, 11 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.