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

Last change on this file since 181 was 181, checked in by krille_n_@…, 12 years ago

Changes to all parts of the project:

  • Size optimizations.
  • Added a define (EXCLUDE_FROM_XTIDECFG) to exclude unused library code from XTIDECFG.
  • Tried to minimize time spent with interrupts disabled.
  • Some minor attempts to improve speed (reordering instructions etc).
  • Tried to improve readability, did some cleanup and fixed some errors in comments.
File size: 7.1 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     .StoreAddressing
69    or      byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
70%endif
71    ; Fall to .StoreAddressing
72
73;--------------------------------------------------------------------
74; .StoreAddressing
75;   Parameters:
76;       DS:DI:  Ptr to Disk Parameter Table
77;       ES:SI:  Ptr to 512-byte ATA information read from the drive
78;       CS:BP:  Ptr to IDEVARS for the controller
79;   Returns:
80;       DX:AX or AX:    Number of cylinders
81;       BH:             Number of sectors per track
82;       BL:             Number of heads
83;   Corrupts registers:
84;       CX, (DX)
85;--------------------------------------------------------------------
86.StoreAddressing:
87    ; Check if CHS defined in ROMVARS
88    mov     al, FLG_DRVPARAMS_USERCHS   ; User specified CHS?
89    call    AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive
90    jnz     SHORT .StoreUserDefinedCHSaddressing
91
92    ; Check if LBA supported
93    call    AtaID_GetPCHStoAXBLBHfromAtaInfoInESSI
94    test    BYTE [es:si+ATA1.wCaps+1], A1_wCaps_LBA>>8
95    jz      SHORT .StoreCHSaddressing
96
97    ; Check if 48-bit LBA supported
98    test    BYTE [es:si+ATA6.wSetSup83+1], A6_wSetSup83_LBA48>>8
99    jz      SHORT .StoreLBA28addressing
100    or      BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION
101.StoreLBA28addressing:
102    or      BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION
103    call    AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
104    call    AtaID_GetLbaAssistedCHStoDXAXBLBH
105    jmp     SHORT .StoreChsFromDXAXBX
106
107    ; Check if P-CHS to L-CHS translation required
108.StoreUserDefinedCHSaddressing:
109    call    AccessDPT_GetPointerToDRVPARAMStoCSBX
110    mov     ax, [cs:bx+DRVPARAMS.wCylinders]
111    mov     bx, [cs:bx+DRVPARAMS.wHeadsAndSectors]
112.StoreCHSaddressing:
113    cmp     ax, MAX_LCHS_CYLINDERS
114    jbe     SHORT .StoreChsFromAXBX     ; No translation required
115
116    ; We need to get number of bits to shift for translation
117    push    ax
118    eMOVZX  dx, bl                      ; Heads now in DX
119    xchg    bx, ax                      ; Cylinders now in BX
120    call    AccessDPT_ShiftPCHinBXDXtoLCH   ; Leaves AX untouched
121    xchg    bx, ax                      ; Restore HeadsAndSectors to BX
122    or      cl, ADDRESSING_MODE_PCHS<<ADDRESSING_MODE_FIELD_POSITION
123    or      [di+DPT.bFlagsLow], cl      ; Store bits to shift
124    pop     ax
125    ; Fall to .StoreChsFromAXBX
126
127;--------------------------------------------------------------------
128; .StoreChsFromAXBX
129; .StoreChsFromDXAXBX
130;   Parameters:
131;       DX:AX or AX:    Number of cylinders
132;       BH:     Number of sectors per track
133;       BL:     Number of heads
134;       DS:DI:  Ptr to Disk Parameter Table
135;       ES:SI:  Ptr to 512-byte ATA information read from the drive
136;       CS:BP:  Ptr to IDEVARS for the controller
137;   Returns:
138;       Nothing
139;   Corrupts registers:
140;       DX
141;--------------------------------------------------------------------
142.StoreChsFromAXBX:
143    xor     dx, dx
144.StoreChsFromDXAXBX:
145    mov     [di+DPT.dwCylinders], ax
146    mov     [di+DPT.dwCylinders+2], dx
147    mov     [di+DPT.wHeadsAndSectors], bx
148    ; Fall to .StoreBlockMode
149
150;--------------------------------------------------------------------
151; .StoreBlockMode
152;   Parameters:
153;       DS:DI:  Ptr to Disk Parameter Table
154;       ES:SI:  Ptr to 512-byte ATA information read from the drive
155;       CS:BP:  Ptr to IDEVARS for the controller
156;   Returns:
157;       Nothing
158;   Corrupts registers:
159;       Nothing
160;--------------------------------------------------------------------
161.StoreBlockMode:
162    cmp     BYTE [es:si+ATA1.bBlckSize], 1  ; Max block size in sectors
163    jbe     SHORT .BlockModeTransfersNotSupported
164    or      BYTE [di+DPT.bFlagsHigh], FLGH_DPT_BLOCK_MODE_SUPPORTED
165.BlockModeTransfersNotSupported:
166    ; Fall to .StoreDeviceSpecificParameters
167
168;--------------------------------------------------------------------
169; .StoreDeviceSpecificParameters
170;   Parameters:
171;       DS:DI:  Ptr to Disk Parameter Table
172;       ES:SI:  Ptr to 512-byte ATA information read from the drive
173;       CS:BP:  Ptr to IDEVARS for the controller
174;   Returns:
175;       Nothing
176;   Corrupts registers:
177;       AX, BX, CX, DX
178;--------------------------------------------------------------------
179.StoreDeviceSpecificParameters:
180    call    Device_FinalizeDPT
181    ; Fall to .StoreDriveNumberAndUpdateDriveCount
182
183;--------------------------------------------------------------------
184; .StoreDriveNumberAndUpdateDriveCount
185;   Parameters:
186;       DS:DI:  Ptr to Disk Parameter Table
187;       ES:SI:  Ptr to 512-byte ATA information read from the drive
188;       CS:BP:  Ptr to IDEVARS for the controller
189;       ES:     BDA Segment
190;   Returns:
191;       DL:     Drive number for new drive
192;       CF:     Always cleared
193;   Corrupts registers:
194;       Nothing
195;--------------------------------------------------------------------
196.StoreDriveNumberAndUpdateDriveCount:
197    mov     dl, [es:BDA.bHDCount]
198    or      dl, 80h                     ; Set bit 7 since hard disk
199
200    inc     BYTE [RAMVARS.bDrvCnt]      ; Increment drive count to RAMVARS
201    inc     BYTE [es:BDA.bHDCount]      ; Increment drive count to BDA
202
203    cmp     BYTE [RAMVARS.bFirstDrv], 0 ; First drive set?
204    ja      SHORT .AllDone              ;  If so, return
205    mov     [RAMVARS.bFirstDrv], dl     ; Store first drive number
206    clc
207.AllDone:
208    ret
Note: See TracBrowser for help on using the repository browser.