source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Address.asm@ 164

Last change on this file since 164 was 161, checked in by krille_n_@…, 14 years ago

Changes to XTIDE Universal BIOS:

  • Minor size optimizations.
  • Tried to minimize the time spent with interrupts disabled in IdeIrq.asm and Int13h.asm
File size: 5.6 KB
RevLine 
[150]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for address translations.
3
4; Section containing code
5SECTION .text
6
[150]7; Jump table for conversion functions
8ALIGN WORD_ALIGN
9g_rgfnAddressTranslation:
10 dw DoNotConvertLCHS ; 0, ADDR_DPT_LCHS
11 dw ConvertLCHStoPCHS ; 1, ADDR_DPT_PCHS
12 dw ConvertLCHStoLBARegisterValues ; 2, ADDR_DPT_LBA28
13 dw ConvertLCHStoLBARegisterValues ; 3, ADDR_DPT_LBA48
14
15
[3]16;--------------------------------------------------------------------
[155]17; Address_OldInt13hAddressToIdeAddress
[3]18; Parameters:
19; CH: Cylinder number, bits 7...0
20; CL: Bits 7...6: Cylinder number bits 9 and 8
21; Bits 5...0: Starting sector number (1...63)
22; DH: Starting head number (0...255)
23; DS:DI: Ptr to DPT
24; Returns:
25; BL: LBA Low Register / Sector Number Register (LBA 7...0)
26; CL: LBA Mid Register / Low Cylinder Register (LBA 15...8)
27; CH: LBA High Register / High Cylinder Register (LBA 23...16)
28; BH: Drive and Head Register (LBA 27...24)
29; Corrupts registers:
30; AX, DX
31;--------------------------------------------------------------------
32ALIGN JUMP_ALIGN
[155]33Address_OldInt13hAddressToIdeAddress:
[150]34 call AccessDPT_GetAddressingModeForWordLookToBX
[3]35 push WORD [cs:bx+g_rgfnAddressTranslation] ; Push return address
[155]36 ; Fall to Address_ExtractLCHSparametersFromOldInt13hAddress
[3]37
38;---------------------------------------------------------------------
[155]39; Address_ExtractLCHSparametersFromOldInt13hAddress
[3]40; Parameters:
41; CH: Cylinder number, bits 7...0
42; CL: Bits 7...6: Cylinder number bits 9 and 8
43; Bits 5...0: Sector number
44; DH: Head number
45; Returns:
46; BL: Sector number (1...63)
47; BH: Head number (0...255)
48; CX: Cylinder number (0...1023)
49; Corrupts registers:
50; Nothing
51;--------------------------------------------------------------------
[155]52Address_ExtractLCHSparametersFromOldInt13hAddress:
[3]53 mov bl, cl ; Copy sector number...
54 and bl, 3Fh ; ...and limit to 1...63
55 sub cl, bl ; Remove from cylinder number high
56 eROL_IM cl, 2 ; High bits to beginning
57 mov bh, dh ; Copy Head number
58 xchg cl, ch ; Cylinder number now in CX
59 ret
60
61
62;---------------------------------------------------------------------
[150]63; Converts LCHS parameters to IDE P-CHS parameters.
[3]64; PCylinder = (LCylinder << n) + (LHead / PHeadCount)
65; PHead = LHead % PHeadCount
66; PSector = LSector
67;
[155]68; Address_ConvertLCHStoPCHS:
[3]69; Parameters:
70; BL: Sector number (1...63)
71; BH: Head number (0...255)
72; CX: Cylinder number (0...1023)
73; DS:DI: Ptr to Disk Parameter Table
74; Returns:
75; BL: Sector number (1...63)
76; BH: Head number (0...15)
77; CX: Cylinder number (0...16382)
78; Corrupts registers:
79; AX, DX
80;--------------------------------------------------------------------
81ALIGN JUMP_ALIGN
[150]82ConvertLCHStoPCHS:
[3]83 ; LHead / PHeadCount and LHead % PHeadCount
84 eMOVZX ax, bh ; Copy L-CHS Head number to AX
[150]85 div BYTE [di+DPT.bPchsHeads]; AL = LHead / PHeadCount, AH = LHead % PHeadCount
[3]86 mov bh, ah ; Copy P-CHS Head number to BH
87 xor ah, ah ; AX = LHead / PHeadCount
88
89 ; (LCylinder << n) + (LHead / PHeadCount)
90 mov dx, cx ; Copy L-CHS Cylinder number to DX
[158]91 mov cl, [di+DPT.bFlagsLow] ; Load shift count
92 and cl, MASKL_DPT_CHS_SHIFT_COUNT
[3]93 shl dx, cl ; DX = LCylinder << n
94 add ax, dx ; AX = P-CHS Cylinder number
[161]95 xchg cx, ax ; Move P-CHS Cylinder number to CX
[150]96DoNotConvertLCHS:
[3]97 ret
98
99
100;---------------------------------------------------------------------
101; Converts LCHS parameters to 28-bit LBA address.
[150]102; Only 24-bits are used since LHCS to LBA28 conversion has 8.4GB limit.
103; LBA = ((cylToSeek*headsPerCyl+headToSeek)*sectPerTrack)+sectToSeek-1
104;
[3]105; Returned address is in same registers that
[155]106; Address_DoNotConvertLCHS and Address_ConvertLCHStoPCHS returns.
[3]107;
[150]108; ConvertLCHStoLBARegisterValues:
[3]109; Parameters:
110; BL: Sector number (1...63)
111; BH: Head number (0...255)
112; CX: Cylinder number (0...1023)
113; DS:DI: Ptr to Disk Parameter Table
114; Returns:
115; BL: LBA Low Register / Sector Number Register (LBA 7...0)
116; CL: LBA Mid Register / Low Cylinder Register (LBA 15...8)
117; CH: LBA High Register / High Cylinder Register (LBA 23...16)
118; BH: Drive and Head Register (LBA 27...24)
119; Corrupts registers:
120; AX, DX
121;--------------------------------------------------------------------
122ALIGN JUMP_ALIGN
[150]123ConvertLCHStoLBARegisterValues:
[3]124 ; cylToSeek*headsPerCyl (18-bit result)
125 mov ax, cx ; Copy Cylinder number to AX
[150]126 eMOVZX dx, BYTE [di+DPT.bLchsHeads]
127 mul dx ; DX:AX = cylToSeek*headsPerCyl
[3]128
129 ; +=headToSeek (18-bit result)
130 add al, bh ; Add Head number to DX:AX
131 adc ah, dh ; DH = Zero after previous multiplication
132 adc dl, dh
133
134 ; *=sectPerTrack (18-bit by 6-bit multiplication with 24-bit result)
[150]135 eMOVZX cx, BYTE [di+DPT.bPchsSectors] ; Load Sectors per Track
[3]136 xchg ax, dx ; Hiword to AX, loword to DX
137 mul cl ; AX = hiword * Sectors per Track
138 mov bh, al ; Backup hiword * Sectors per Track
139 xchg ax, dx ; Loword back to AX
140 mul cx ; DX:AX = loword * Sectors per Track
141 add dl, bh ; DX:AX = (cylToSeek*headsPerCyl+headToSeek)*sectPerTrack
142
143 ; +=sectToSeek-1 (24-bit result)
144 xor bh, bh ; Sector number now in BX
145 dec bx ; sectToSeek-=1
146 add ax, bx ; Add to loword
147 adc dl, bh ; Add possible carry to byte2, BH=zero
[150]148
149 ; Copy DX:AX to proper return registers
150 xchg bx, ax ; BL = Sector Number Register (LBA 7...0)
151 mov cl, bh ; Low Cylinder Register (LBA 15...8)
152 mov ch, dl ; High Cylinder Register (LBA 23...16)
153 mov bh, dh ; Drive and Head Register (LBA 27...24)
[3]154 ret
Note: See TracBrowser for help on using the repository browser.