source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/DrvDetectInfo.asm@ 591

Last change on this file since 591 was 591, checked in by Krister Nordvall, 8 years ago

Changes:

  • Added a small optimization to DrvDetectInfo.asm. This works but is not as optimal as it should be due to a problem with NASM.
File size: 3.2 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Functions for generating and accessing drive
3; information to be displayed on boot menu.
4
5;
6; XTIDE Universal BIOS and Associated Tools
7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
8;
9; This program is free software; you can redistribute it and/or modify
10; it under the terms of the GNU General Public License as published by
11; the Free Software Foundation; either version 2 of the License, or
12; (at your option) any later version.
13;
14; This program is distributed in the hope that it will be useful,
15; but WITHOUT ANY WARRANTY; without even the implied warranty of
16; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17; GNU General Public License for more details.
18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19;
20
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
25; Creates new DRVDETECTINFO struct for detected hard disk.
26;
27; DriveDetectInfo_CreateForHardDisk
28; Parameters:
29; DL: Drive number
30; DS:DI: Ptr to Disk Parameter Table
31; ES:SI: Ptr to 512-byte ATA information read from the drive
32; Returns:
33; ES:BX: Ptr to DRVDETECTINFO (if successful)
34; Corrupts registers:
35; AX, BX, CX, DX, DI
36;--------------------------------------------------------------------
37DriveDetectInfo_CreateForHardDisk:
38 call DriveDetectInfo_ConvertDPTtoBX ; ES:BX now points to new DRVDETECTINFO
39
40 ; Store Drive Name
41 push ds ; Preserve RAMVARS
42 push si
43
44 push es ; ES copied to DS
45 pop ds
46
47 add si, BYTE ATA1.strModel ; DS:SI now points drive name (Clears CF)
48%if DRVDETECTINFO.szDrvName = 0
49 mov di, bx
50%else
51 lea di, [bx+DRVDETECTINFO.szDrvName] ; ES:DI now points to name destination
52%endif
53 mov cx, MAX_HARD_DISK_NAME_LENGTH / 2 ; Max number of WORDs allowed
54.CopyNextWord:
55 lodsw
56 xchg al, ah ; Change endianness
57 stosw
58 loop .CopyNextWord
59 xchg cx, ax ; Zero AX (CF already cleared from the ADD above)
60 stosw ; Terminate with NULL
61
62 pop si
63 pop ds
64
65 ret
66
67
68;--------------------------------------------------------------------
69; Returns offset to DRVDETECTINFO based on DPT pointer.
70;
71; DriveDetectInfo_ConvertDPTtoBX
72; Parameters:
73; DS:DI: DPT Pointer
74; Returns:
75; BX: Offset to DRVDETECTINFO struct
76; Corrupts registers:
77; AX
78;--------------------------------------------------------------------
79DriveDetectInfo_ConvertDPTtoBX:
80%if DPT_DRVDETECTINFO_SIZE_MULTIPLIER = 2
81%if BOOTVARS.rgDrvDetectInfo & 1 ; Should never be odd but better safe than sorry
82 lea ax, [di-RAMVARS_size]
83 eSHL_IM ax, 1
84 add ax, BOOTVARS.rgDrvDetectInfo
85%else
86 lea ax, [di-RAMVARS_size+(BOOTVARS.rgDrvDetectInfo/2)]
87; eSHL_IM ax, 1 ; *FIXME* For some reason this will cause NASM to crap itself.
88 shl ax, 1 ; So this will have to suffice for now.
89%endif
90%else
91 lea ax, [di-RAMVARS_size] ; subtract off base of DPTs
92 mov bl, DPT_DRVDETECTINFO_SIZE_MULTIPLIER ; DRVDETECTINFO are a whole number multiple of DPT size
93 mul bl
94 add ax, BOOTVARS.rgDrvDetectInfo ; add base of DRVDETECTINFO
95%endif
96 xchg bx, ax
97 ret
Note: See TracBrowser for help on using the repository browser.