source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CompatibleDPT.asm @ 542

Last change on this file since 542 was 542, checked in by aitotat@…, 11 years ago

Changes to XTIDE Universal BIOS:

  • Fixed a bug that allowed EBIOS functions for user defined CHS.
  • Simplified user defined CHS and LBA setup a little.
File size: 9.1 KB
RevLine 
[541]1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions to handle DPT structs to present drive geometry
3;                   to ill behaving applications that want
4;                   to read DPT from interrupt vectors 41h and 46h.
5
6;
7; XTIDE Universal BIOS and Associated Tools
8; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
9;
10; This program is free software; you can redistribute it and/or modify
11; it under the terms of the GNU General Public License as published by
12; the Free Software Foundation; either version 2 of the License, or
13; (at your option) any later version.
14;
15; This program is distributed in the hope that it will be useful,
16; but WITHOUT ANY WARRANTY; without even the implied warranty of
17; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18; GNU General Public License for more details.
19; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20;
21
22; Section containing code
23SECTION .text
24
25;--------------------------------------------------------------------
26; CompatibleDPT_CreateToAXSIforDriveDL
27;   Parameters:
28;       DL:     Drive number (80h or 81h)
29;       DS:DI:  Ptr to DPT
30;   Returns:
31;       AX:SI   Ptr to destination buffer
32;   Corrupts registers:
33;       CX, DX
34;--------------------------------------------------------------------
35CompatibleDPT_CreateToAXSIforDriveDL:
36    push    es
37
38    call    AccessDPT_GetDeviceControlByteToAL
39    xchg    cx, ax                          ; Device control byte to CL
40    mov     si, di                          ; DPT now in DS:SI
41    call    GetBufferForDrive80hToESDI
42    shr     dx, 1
43    jnc     SHORT .BufferLoadedToESDI
44    add     di, BYTE TRANSLATED_DPT_size    ; For drive 81h
45.BufferLoadedToESDI:
46
47    call    FillToESDIusingDPTfromDSSI
48    xchg    di, si
49    mov     ax, es
50
51    pop     es
52    ret
53
54
55;--------------------------------------------------------------------
56; GetTemporaryBufferForDPTEtoESDI
57; GetBufferForDrive80hToESDI
58;   Parameters:
59;       DS:     RAMVARS segment
60;   Returns:
61;       ES:DI:  Ptr to buffer (in RAMVARS segment)
62;   Corrupts registers:
63;       Nothing
64;--------------------------------------------------------------------
65GetTemporaryBufferForDPTEtoESDI:
66    call    GetBufferForDrive80hToESDI
67    add     di, BYTE TRANSLATED_DPT_size * 2
68    ret
69
70GetBufferForDrive80hToESDI:
71    push    ds
72    pop     es
73    mov     di, [cs:ROMVARS.bStealSize] ; No harm to read WORD
74    eSHL_IM di, 10                      ; DI = RAMVARS size in bytes
75    sub     di, BYTE (TRANSLATED_DPT_size * 2) + DPTE_size
76    ret
77
78
79;--------------------------------------------------------------------
80; FillToESDIusingDPTfromDSSI
81;   Parameters:
82;       CL:     Device Control Byte
83;       DS:SI:  Ptr to DPT
84;       ES:DI   Ptr to destination buffer
85;   Returns:
86;       Nothing
87;   Corrupts registers:
88;       AX, CX, DX
89;--------------------------------------------------------------------
90FillToESDIusingDPTfromDSSI:
91    test    BYTE [si+DPT.bFlagsLow], MASKL_DPT_TRANSLATEMODE
92    jz      SHORT FillStandardDPTtoESDIfromDPTinDSSI
93    ; Fall to FillTranslatedDPTtoESDIfromDPTinDSSI
94
95;--------------------------------------------------------------------
96; FillTranslatedDPTtoESDIfromDPTinDSSI
97;   Parameters:
98;       CL:     Device Control Byte
99;       DS:SI:  Ptr to DPT
100;       ES:DI:  Ptr to destination buffer
101;   Returns:
102;       Nothing
103;   Corrupts registers:
104;       AX, CX, DX
105;--------------------------------------------------------------------
106FillTranslatedDPTtoESDIfromDPTinDSSI:
107    xor     dx, dx                      ; Clear for checksum
108    mov     ax, [si+DPT.wLchsCylinders]
[542]109    ;MIN_U  ax, MAX_LCHS_CYLINDERS      ; Our DPT can have up to 1027
[541]110    call    StoswThenAddALandAHtoDL     ; Bytes 0 and 1 (Logical number of cylinders)
111
112    mov     al, BYTE [si+DPT.bLchsHeads]
113    mov     ah, TRANSLATED_DPT_SIGNATURE
114    call    StoswThenAddALandAHtoDL     ; Bytes 2 (Logical number of heads) and 3 (Axh signature to indicate Translated DPT)
115
116    eMOVZX  ax, BYTE [si+DPT.bPchsSectorsPerTrack]
117    call    StoswThenAddALandAHtoDL     ; Bytes 4 (Physical sectors per track) and 5 (Write Precompensation Cylinder low)
118
119    mov     al, ah
120    call    StoswThenAddALandAHtoDL     ; Bytes 6 (Write Precompensation Cylinder high) and 7
121
122    xchg    ax, cx                      ; Device Control byte to AL
123    mov     ah, [si+DPT.wPchsCylinders]
124    call    StoswThenAddALandAHtoDL     ; Bytes 8 (Drive Control Byte) and 9 (Physical number of cylinders low)
125
126    mov     al, [si+DPT.wPchsCylinders+1]
127    mov     ah, [si+DPT.bPchsHeads]
128    call    StoswThenAddALandAHtoDL     ; Bytes 10 (Physical number of cylinders high) and 11 (Physical number of heads)
129
130    xor     ax, ax
131    call    StoswThenAddALandAHtoDL     ; Bytes 12 and 13 (Landing Zone Cylinder)
132
133    mov     al, [si+DPT.bLchsSectorsPerTrack]
134%ifdef USE_186
135    push    FillStandardDPTtoESDIfromDPTinDSSI.RestoreOffsetsAndReturn
136    jmp     StoswALandChecksumFromDL    ; Bytes 14 (Logical sectors per track) and 15 (Checksum)
137%else
138    call    StoswALandChecksumFromDL
139    jmp     SHORT FillStandardDPTtoESDIfromDPTinDSSI.RestoreOffsetsAndReturn
140%endif
141
142
143;--------------------------------------------------------------------
144; FillStandardDPTtoESDIfromDPTinDSSI
145;   Parameters:
146;       CL:     Device Control Byte
147;       DS:SI:  Ptr to DPT
148;       ES:DI:  Ptr to destination buffer
149;   Returns:
150;       Nothing
151;   Corrupts registers:
152;       AX
153;--------------------------------------------------------------------
154FillStandardDPTtoESDIfromDPTinDSSI:
155    mov     ax, [si+DPT.wLchsCylinders]
156    stosw               ; Bytes 0 and 1 (Physical number of cylinders)
157    eMOVZX  ax, BYTE [si+DPT.bLchsHeads]
158    stosw               ; Bytes 2 (Physical number of heads) and 3
159    mov     al, ah      ; Zero AX
160    stosw               ; Bytes 4 and 5 (Write Precompensation Cylinder low)
161    stosw               ; Bytes 6 (Write Precompensation Cylinder high) and 7
162    mov     al, cl      ; Device control byte to AL
163    stosw               ; Bytes 8 (Drive Control Byte) and 9
164    mov     al, ah      ; Zero AX
165    stosw               ; Bytes 10 and 11
166    stosw               ; Bytes 12 and 13 (Landing Zone Cylinder)
167    mov     al, [si+DPT.bLchsSectorsPerTrack]
168    stosw               ; Bytes 14 (Physical sectors per track) and 15
169
170.RestoreOffsetsAndReturn:
171    sub     di, BYTE STANDARD_DPT_size
172    ret
173
174
175;--------------------------------------------------------------------
176; CompatibleDPT_CreateDeviceParameterTableExtensionToESBXfromDPTinDSSI
177;   Parameters:
178;       DS:SI:  Ptr to DPT (in RAMVARS segment)
179;   Returns:
180;       ES:BX:  Ptr to Device Parameter Table Extension (DPTE)
181;   Corrupts registers:
182;       AX, CX, DX, DI
183;--------------------------------------------------------------------
184CompatibleDPT_CreateDeviceParameterTableExtensionToESBXfromDPTinDSSI:
185    call    GetTemporaryBufferForDPTEtoESDI ; valid until next AH=48h call
186
187    ; Set 32-bit flag for 32-bit controllers
188    mov     cx, FLG_LBA_TRANSLATION_ENABLED ; DPTE.wFlags
189    cmp     BYTE [si+DPT_ATA.bDevice], DEVICE_32BIT_ATA
190    eCMOVE  cl, FLG_LBA_TRANSLATION_ENABLED | FLG_32BIT_XFER_MODE
191
192    ; DPTE.wBasePort
193    mov     ax, [si+DPT.wBasePort]
194    call    StoswThenAddALandAHtoDL         ; Bytes 0 and 1
195
196    ; DPTE.wControlBlockPort
197    eMOVZX  bx, BYTE [si+DPT.bIdevarsOffset]
198    mov     ax, [cs:bx+IDEVARS.wControlBlockPort]
199    call    StoswThenAddALandAHtoDL         ; Bytes 2 and 3
200
201    ; DPTE.bDrvnhead and DPTE.bBiosVendor
202    xchg    di, si
[542]203    call    AccessDPT_GetDriveSelectByteToAL
[541]204    xchg    si, di
205    call    StoswThenAddALandAHtoDL         ; Bytes 4 and 5
206
207    ; DPTE.bIRQ and DPTE.bBlockSize
208    mov     al, [cs:bx+IDEVARS.bIRQ]        ; No way to define that we might not use IRQ
209    mov     ah, [si+DPT_ATA.bBlockSize]
210    cmp     ah, 1
211    jbe     SHORT .DoNotSetBlockModeFlag
212    or      cl, FLG_BLOCK_MODE_ENABLED
213.DoNotSetBlockModeFlag:
214    call    StoswThenAddALandAHtoDL         ; Bytes 6 and 7
215
216    ; DPTE.bDmaChannelAndType and DPTE.bPioMode
217    xor     ax, ax
218%ifdef MODULE_ADVANCED_ATA
219    or      ah, [si+DPT_ADVANCED_ATA.bPioMode]
220    jz      SHORT .NoDotSetFastPioFlag
221    cmp     WORD [si+DPT_ADVANCED_ATA.wControllerID], BYTE 0
222    je      SHORT .NoDotSetFastPioFlag
223    inc     cx      ; FLG_FAST_PIO_ENABLED
224.NoDotSetFastPioFlag:
225%endif
226    call    StoswThenAddALandAHtoDL         ; Bytes 8 and 9
227
228    ; Set CHS translation flags and store DPTE.wFlags
229    mov     al, [si+DPT.bFlagsLow]
230    and     al, MASKL_DPT_TRANSLATEMODE
231    jz      SHORT .NoChsTranslationOrBitShiftTranslationSet
232    or      cl, FLG_CHS_TRANSLATION_ENABLED
233    test    al, FLGL_DPT_ASSISTED_LBA
234    jz      SHORT .NoChsTranslationOrBitShiftTranslationSet
235    or      cx, LBA_ASSISTED_TRANSLATION << TRANSLATION_TYPE_FIELD_POSITION
236.NoChsTranslationOrBitShiftTranslationSet:
237    xchg    ax, cx
238    call    StoswThenAddALandAHtoDL         ; Bytes 10 and 11
239
240    ; DPTE.wReserved (must be zero)
241    xor     ax, ax
242    call    StoswThenAddALandAHtoDL         ; Bytes 12 and 13
243
244    ; DPTE.bRevision and DPTE.bChecksum
245    mov     al, DPTE_REVISION
246    call    StoswALandChecksumFromDL        ; Bytes 14 and 15
247    lea     bx, [di-DPTE_size]
248    ret
249
250
251;--------------------------------------------------------------------
252; StoswThenAddALandAHtoDL
253;   Parameters:
254;       AX:     WORD to store
255;       DL:     Sum of bytes so far
256;       ES:DI:  Ptr to where to store AX
257;   Returns:
258;       DL:     Sum of bytes so far
259;       DI:     Incremented by 2
260;   Corrupts registers:
261;       Nothing
262;--------------------------------------------------------------------
263StoswThenAddALandAHtoDL:
264    stosw
265    add     dl, al
266    add     dl, ah
267    ret
268
269
270;--------------------------------------------------------------------
271; StoswALandChecksumFromDL
272;   Parameters:
273;       AL:     Last byte to store before checksum byte
274;       DL:     Sum of bytes so far
275;       ES:DI:  Ptr to where to store AL and Checksum byte
276;   Returns:
277;       DL:     Sum of bytes so far
278;       DI:     Incremented by 2
279;   Corrupts registers:
280;       Nothing
281;--------------------------------------------------------------------
282StoswALandChecksumFromDL:
283    mov     ah, al
284    add     ah, dl
285    neg     ah
286    stosw
287    ret
Note: See TracBrowser for help on using the repository browser.