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

Last change on this file since 175 was 175, checked in by gregli@…, 13 years ago

ifdef of existing serial code, in preperation for checkin

File size: 7.0 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for creating Disk Parameter Table.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Creates new Disk Parameter Table for detected hard disk.
9; Drive is then fully accessible using any BIOS function.
10;
11; CreateDPT_FromAtaInformation
12;   Parameters:
13;       BH:     Drive Select byte for Drive and Head Register
14;       ES:SI:  Ptr to 512-byte ATA information read from the drive
15;       CS:BP:  Ptr to IDEVARS for the controller
16;       DS:     RAMVARS segment
17;       ES:     BDA Segment
18;   Returns:
19;       DL:     Drive number for new drive
20;       DS:DI:  Ptr to Disk Parameter Table (if succesfull)
21;       CF:     Cleared if DPT created successfully
22;               Set if any error
23;   Corrupts registers:
24;       AX, BX, CX, DH
25;--------------------------------------------------------------------
26CreateDPT_FromAtaInformation:
27    call    FindDPT_ForNewDriveToDSDI
28    ; Fall to .InitializeDPT
29
30;--------------------------------------------------------------------
31; .InitializeDPT
32;   Parameters:
33;       BH:     Drive Select byte for Drive and Head Register
34;       DS:DI:  Ptr to Disk Parameter Table
35;       CS:BP:  Ptr to IDEVARS for the controller
36;   Returns:
37;       Nothing
38;   Corrupts registers:
39;       AX
40;--------------------------------------------------------------------
41.InitializeDPT:
42    mov     [di+DPT.bIdevarsOffset], bp ; IDEVARS must start in first 256 bytes of ROM
43    ; Fall to .StoreDriveSelectAndDriveControlByte
44
45;--------------------------------------------------------------------
46; .StoreDriveSelectAndDriveControlByte
47;   Parameters:
48;       BH:     Drive Select byte for Drive and Head Register
49;       DS:DI:  Ptr to Disk Parameter Table
50;       ES:SI:  Ptr to 512-byte ATA information read from the drive
51;       CS:BP:  Ptr to IDEVARS for the controller
52;   Returns:
53;       Nothing
54;   Corrupts registers:
55;       AX
56;--------------------------------------------------------------------
57.StoreDriveSelectAndDriveControlByte:
58    mov     al, bh
59    and     ax, BYTE FLG_DRVNHEAD_DRV       ; AL now has Master/Slave bit
60    cmp     [cs:bp+IDEVARS.bIRQ], ah        ; Interrupts enabled?
61    jz      SHORT .StoreFlags               ;  If not, do not set interrupt flag
62    or      al, FLGL_DPT_ENABLE_IRQ
63.StoreFlags:
64    mov     [di+DPT.wFlags], ax
65
66%ifdef MODULE_SERIAL
67    cmp     byte [cs:bp+IDEVARS.bDevice], DEVICE_SERIAL_PORT
68    jnz     .around
69    or      byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
70.around:               
71%endif     
72
73    ; Fall to .StoreAddressing
74
75;--------------------------------------------------------------------
76; .StoreAddressing
77;   Parameters:
78;       DS:DI:  Ptr to Disk Parameter Table
79;       ES:SI:  Ptr to 512-byte ATA information read from the drive
80;       CS:BP:  Ptr to IDEVARS for the controller
81;   Returns:
82;       DX:AX or AX:    Number of cylinders
83;       BH:             Number of sectors per track
84;       BL:             Number of heads
85;   Corrupts registers:
86;       CX, (DX)
87;--------------------------------------------------------------------
88.StoreAddressing:
89    ; Check if CHS defined in ROMVARS
90    mov     al, FLG_DRVPARAMS_USERCHS   ; User specified CHS?
91    call    AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive
92    jnz     SHORT .StoreUserDefinedCHSaddressing
93
94    ; Check if LBA supported
95    call    AtaID_GetPCHStoAXBLBHfromAtaInfoInESSI
96    test    BYTE [es:si+ATA1.wCaps+1], A1_wCaps_LBA>>8
97    jz      SHORT .StoreCHSaddressing
98
99    ; Check if 48-bit LBA supported
100    test    BYTE [es:si+ATA6.wSetSup83+1], A6_wSetSup83_LBA48>>8
101    jz      SHORT .StoreLBA28addressing
102    or      BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION
103.StoreLBA28addressing:
104    or      BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION
105    call    AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
106    call    AtaID_GetLbaAssistedCHStoDXAXBLBH
107    jmp     SHORT .StoreChsFromDXAXBX
108
109    ; Check if P-CHS to L-CHS translation required
110.StoreUserDefinedCHSaddressing:
111    call    AccessDPT_GetPointerToDRVPARAMStoCSBX
112    mov     ax, [cs:bx+DRVPARAMS.wCylinders]
113    mov     bx, [cs:bx+DRVPARAMS.wHeadsAndSectors]
114.StoreCHSaddressing:
115    cmp     ax, MAX_LCHS_CYLINDERS
116    jbe     SHORT .StoreChsFromAXBX     ; No translation required
117
118    ; We need to get number of bits to shift for translation
119    push    bx
120    push    ax
121    eMOVZX  dx, bl                      ; Heads now in DX
122    xchg    bx, ax                      ; Sectors now in BX
123    call    AccessDPT_ShiftPCHinBXDXtoLCH
124    or      cl, ADDRESSING_MODE_PCHS<<ADDRESSING_MODE_FIELD_POSITION
125    or      [di+DPT.bFlagsLow], cl      ; Store bits to shift
126    pop     ax
127    pop     bx
128    ; Fall to .StoreChsFromAXBX
129
130;--------------------------------------------------------------------
131; .StoreChsFromAXBX
132; .StoreChsFromDXAXBX
133;   Parameters:
134;       DX:AX or AX:    Number of cylinders
135;       BH:     Number of sectors per track
136;       BL:     Number of heads
137;       DS:DI:  Ptr to Disk Parameter Table
138;       ES:SI:  Ptr to 512-byte ATA information read from the drive
139;       CS:BP:  Ptr to IDEVARS for the controller
140;   Returns:
141;       Nothing
142;   Corrupts registers:
143;       DX
144;--------------------------------------------------------------------
145.StoreChsFromAXBX:
146    xor     dx, dx
147.StoreChsFromDXAXBX:
148    mov     [di+DPT.dwCylinders], ax
149    mov     [di+DPT.dwCylinders+2], dx
150    mov     [di+DPT.wHeadsAndSectors], bx
151    ; Fall to .StoreBlockMode
152
153;--------------------------------------------------------------------
154; .StoreBlockMode
155;   Parameters:
156;       DS:DI:  Ptr to Disk Parameter Table
157;       ES:SI:  Ptr to 512-byte ATA information read from the drive
158;       CS:BP:  Ptr to IDEVARS for the controller
159;   Returns:
160;       Nothing
161;   Corrupts registers:
162;       Nothing
163;--------------------------------------------------------------------
164.StoreBlockMode:
165    cmp     BYTE [es:si+ATA1.bBlckSize], 1  ; Max block size in sectors
166    jbe     SHORT .BlockModeTransfersNotSupported
167    or      BYTE [di+DPT.bFlagsHigh], FLGH_DPT_BLOCK_MODE_SUPPORTED
168.BlockModeTransfersNotSupported:
169    ; Fall to .StoreDeviceSpecificParameters
170
171;--------------------------------------------------------------------
172; .StoreDeviceSpecificParameters
173;   Parameters:
174;       DS:DI:  Ptr to Disk Parameter Table
175;       ES:SI:  Ptr to 512-byte ATA information read from the drive
176;       CS:BP:  Ptr to IDEVARS for the controller
177;   Returns:
178;       Nothing
179;   Corrupts registers:
180;       AX, BX, CX, DX
181;--------------------------------------------------------------------
182.StoreDeviceSpecificParameters:
183    call    Device_FinalizeDPT
184    ; Fall to .StoreDriveNumberAndUpdateDriveCount
185
186;--------------------------------------------------------------------
187; .StoreDriveNumberAndUpdateDriveCount
188;   Parameters:
189;       DS:DI:  Ptr to Disk Parameter Table
190;       ES:SI:  Ptr to 512-byte ATA information read from the drive
191;       CS:BP:  Ptr to IDEVARS for the controller
192;       ES:     BDA Segment
193;   Returns:
194;       DL:     Drive number for new drive
195;       CF:     Always cleared
196;   Corrupts registers:
197;       Nothing
198;--------------------------------------------------------------------
199.StoreDriveNumberAndUpdateDriveCount:
200    mov     dl, [es:BDA.bHDCount]
201    or      dl, 80h                     ; Set bit 7 since hard disk
202
203    inc     BYTE [RAMVARS.bDrvCnt]      ; Increment drive count to RAMVARS
204    inc     BYTE [es:BDA.bHDCount]      ; Increment drive count to BDA
205
206    cmp     BYTE [RAMVARS.bFirstDrv], 0 ; First drive set?
207    ja      SHORT .AllDone              ;  If so, return
208    mov     [RAMVARS.bFirstDrv], dl     ; Store first drive number
209    clc
210.AllDone:
211    ret
Note: See TracBrowser for help on using the repository browser.