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

Last change on this file since 3 was 3, checked in by aitotat, 14 years ago
File size: 6.2 KB
Line 
1; File name     :   CompatibleDPT.asm
2; Project name  :   IDE BIOS
3; Created date  :   6.4.2010
4; Last update   :   6.4.2010
5; Author        :   Tomi Tilli
6; Description   :   Functions for creating Disk Parameter Tables for
7;                   software compatibility only. These DPTs are not used
8;                   by our BIOS.
9
10; Section containing code
11SECTION .text
12
13;--------------------------------------------------------------------
14; Creates compatible for drives 80h and 81h. There will be stored
15; to interrupt vectors 41h and 46h.
16;
17; CompatibleDPT_CreateForDrives80hAnd81h
18;   Parameters:
19;       DS:     RAMVARS segment
20;       ES:     BDA segment (zero)
21;   Returns:
22;       Nothing
23;   Corrupts registers:
24;       All except DS and ES
25;--------------------------------------------------------------------
26ALIGN JUMP_ALIGN
27CompatibleDPT_CreateForDrives80hAnd81h:
28    ; Only create compatible DPTs in full mode
29    test    BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
30    jz      SHORT CompatibleDPT_StoreCustomDPTs
31
32    mov     dl, 80h
33    call    FindDPT_ForDriveNumber  ; DPT to DS:DI
34    jnc     SHORT .CreateForDrive81h
35    call    CompatibleDPT_CreateForDrive80h
36ALIGN JUMP_ALIGN
37.CreateForDrive81h:
38    mov     dl, 81h
39    call    FindDPT_ForDriveNumber
40    jnc     SHORT .Return
41    call    CompatibleDPT_CreateForDrive81h
42ALIGN JUMP_ALIGN
43.Return:
44    ret
45
46
47;--------------------------------------------------------------------
48; Stores pointers to our custom DPTs for drives 80h and 81h.
49;
50; CompatibleDPT_StoreCustomDPTs
51;   Parameters:
52;       ES:     BDA and interrupt vector segment (zero)
53;   Returns:
54;       Nothing
55;   Corrupts registers:
56;       DX, DI
57;--------------------------------------------------------------------
58ALIGN JUMP_ALIGN
59CompatibleDPT_StoreCustomDPTs:
60    mov     dl, 80h
61    call    FindDPT_ForDriveNumber  ; DPT to DS:DI
62    jnc     SHORT .FindForDrive81h
63    mov     [es:INTV_HD0DPT*4], di
64    mov     [es:INTV_HD0DPT*4+2], ds
65ALIGN JUMP_ALIGN
66.FindForDrive81h:
67    inc     dx
68    call    FindDPT_ForDriveNumber
69    jnc     SHORT .Return
70    mov     [es:INTV_HD1DPT*4], di
71    mov     [es:INTV_HD1DPT*4+2], ds
72ALIGN JUMP_ALIGN
73.Return:
74    ret
75
76
77;--------------------------------------------------------------------
78; Copies parameters from our custom DPT struct to a
79; standard COMPATIBLE_FDPT or COMPATIBLE_EDPT struct.
80;
81; CompatibleDPT_CreateForDrive80h
82; CompatibleDPT_CreateForDrive81h
83;   Parameters:
84;       DS:DI:  Ptr to DPT
85;       ES:     BDA and interrupt vector segment (zero)
86;   Returns:
87;       Nothing
88;   Corrupts registers:
89;       AX, BX, CX, DX, SI
90;--------------------------------------------------------------------
91ALIGN JUMP_ALIGN
92CompatibleDPT_CreateForDrive80h:
93    mov     si, FULLRAMVARS.drv80hCompDPT   ; DS:SI now points compatible DPT
94    call    CompatibleDPT_CopyFromCustom
95    mov     [es:INTV_HD0DPT*4], si
96    mov     [es:INTV_HD0DPT*4+2], ds
97    ret
98ALIGN JUMP_ALIGN
99CompatibleDPT_CreateForDrive81h:
100    mov     si, FULLRAMVARS.drv81hCompDPT   ; DS:SI now points compatible DPT
101    call    CompatibleDPT_CopyFromCustom
102    mov     [es:INTV_HD1DPT*4], si
103    mov     [es:INTV_HD1DPT*4+2], ds
104    ret
105
106
107;--------------------------------------------------------------------
108; Copies parameters from our custom DPT struct to a
109; standard COMPATIBLE_FDPT or COMPATIBLE_EDPT struct.
110;
111; CompatibleDPT_CopyFromCustom
112;   Parameters:
113;       DS:SI:  Ptr to COMPATIBLE_FDPT or COMPATIBLE_EDPT
114;       DS:DI:  Ptr to DPT
115;   Returns:
116;       Nothing
117;   Corrupts registers:
118;       AX, BX, CX, DX
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121CompatibleDPT_CopyFromCustom:
122    call    AccessDPT_GetLCHSfromPCHS           ; AX=Lsects, BX=Lcyls, DX=Lheads
123    test    BYTE [di+DPT.bFlags], FLG_DPT_EBIOS ; Drive larger than 504 MiB?
124    jnz     SHORT CompatibleDPT_CopyFromCustomToEDPT
125    ; Fall to CompatibleDPT_CopyFromCustomToFDPT
126
127;--------------------------------------------------------------------
128; Copies parameters from our custom DPT struct to a
129; standard COMPATIBLE_FDPT struct for drives up to 504 MiB.
130;
131; CompatibleDPT_CopyFromCustomToFDPT
132;   Parameters:
133;       AX:     L-CHS sectors per track
134;       BX:     L-CHS cylinders
135;       DX:     L-CHS heads
136;       DS:SI:  Ptr to COMPATIBLE_FDPT
137;       DS:DI:  Ptr to DPT
138;   Returns:
139;       Nothing
140;   Corrupts registers:
141;       AX, BX
142;--------------------------------------------------------------------
143;ALIGN JUMP_ALIGN
144CompatibleDPT_CopyFromCustomToFDPT:
145    mov     [si+COMPATIBLE_FDPT.wCyls], bx
146    mov     [si+COMPATIBLE_FDPT.bHeads], dl
147    mov     [si+COMPATIBLE_FDPT.bSectPerTrack], al
148    mov     WORD [si+COMPATIBLE_FDPT.wWrPreCmpCyl], -1
149    mov     al, [di+DPT.bDrvCtrl]
150    mov     [si+COMPATIBLE_FDPT.bDrvCtrl], al
151    mov     BYTE [si+COMPATIBLE_FDPT.bNormTimeout], B_TIMEOUT_BSY
152    mov     BYTE [si+COMPATIBLE_FDPT.bFormatTimeout], B_TIMEOUT_DRQ
153    mov     BYTE [si+COMPATIBLE_FDPT.bCheckTimeout], B_TIMEOUT_DRQ
154    dec     bx
155    mov     [si+COMPATIBLE_FDPT.wLZoneCyl], bx
156    ret
157
158
159;--------------------------------------------------------------------
160; Copies parameters from our custom DPT struct to a
161; standard COMPATIBLE_EDPT struct.
162;
163; CompatibleDPT_CopyFromCustomToEDPT
164;   Parameters:
165;       AX:     L-CHS sectors per track
166;       BX:     L-CHS cylinders
167;       DX:     L-CHS heads
168;       DS:SI:  Ptr to COMPATIBLE_EDPT
169;       DS:DI:  Ptr to DPT
170;   Returns:
171;       Nothing
172;   Corrupts registers:
173;       AX, BX, CX, DX
174;--------------------------------------------------------------------
175ALIGN JUMP_ALIGN
176CompatibleDPT_CopyFromCustomToEDPT:
177    mov     [si+COMPATIBLE_EDPT.wLCyls], bx
178    mov     [si+COMPATIBLE_EDPT.bLHeads], dl
179    mov     BYTE [si+COMPATIBLE_EDPT.bSignature], COMPATIBLE_EDPT_SIGNATURE
180    mov     [si+COMPATIBLE_EDPT.bPSect], al
181    mov     [si+COMPATIBLE_EDPT.bLSect], al
182    mov     al, [di+DPT.bDrvCtrl]
183    mov     [si+COMPATIBLE_EDPT.bDrvCtrl], al
184    mov     ax, [di+DPT.wPCyls]
185    mov     [si+COMPATIBLE_EDPT.wPCyls], ax
186    mov     al, [di+DPT.bPHeads]
187    mov     [si+COMPATIBLE_EDPT.bPHeads], al
188    ; Fall to CompatibleDPT_StoreChecksum
189
190;--------------------------------------------------------------------
191; Stores checksum byte to the end of COMPATIBLE_EDPT struct.
192;
193; CompatibleDPT_StoreChecksum
194;   Parameters:
195;       DS:SI:  Ptr to COMPATIBLE_EDPT
196;   Returns:
197;       Nothing
198;   Corrupts registers:
199;       AX, BX, CX
200;--------------------------------------------------------------------
201;ALIGN JUMP_ALIGN
202CompatibleDPT_StoreChecksum:
203    xor     ax, ax
204    xor     bx, bx
205    mov     cx, COMPATIBLE_EDPT_size-1
206ALIGN JUMP_ALIGN
207.SumLoop:
208    add     al, [bx+si]
209    inc     bx
210    loop    .SumLoop
211    neg     al
212    mov     [si+COMPATIBLE_EDPT.bChecksum], al
213    ret
Note: See TracBrowser for help on using the repository browser.