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

Last change on this file since 591 was 591, checked in by krille_n_, 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
RevLine 
[392]1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for generating and accessing drive
3;                   information to be displayed on boot menu.
4
5;
[399]6; XTIDE Universal BIOS and Associated Tools
[526]7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[392]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.
[399]13;
[392]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.
[399]18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[392]19;
[399]20
[392]21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
[397]25; Creates new DRVDETECTINFO struct for detected hard disk.
[392]26;
[397]27; DriveDetectInfo_CreateForHardDisk
[392]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:
[397]33;       ES:BX:  Ptr to DRVDETECTINFO (if successful)
[392]34;   Corrupts registers:
35;       AX, BX, CX, DX, DI
36;--------------------------------------------------------------------
[397]37DriveDetectInfo_CreateForHardDisk:
38    call    DriveDetectInfo_ConvertDPTtoBX      ; ES:BX now points to new DRVDETECTINFO
[392]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
[399]47    add     si, BYTE ATA1.strModel              ; DS:SI now points drive name (Clears CF)
[591]48%if DRVDETECTINFO.szDrvName = 0
49    mov     di, bx
50%else
[399]51    lea     di, [bx+DRVDETECTINFO.szDrvName]    ; ES:DI now points to name destination
[591]52%endif
[392]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
[399]59    xchg    cx, ax                              ; Zero AX (CF already cleared from the ADD above)
[392]60    stosw                                       ; Terminate with NULL
61
62    pop     si
63    pop     ds
[399]64
[392]65    ret
66
67
68;--------------------------------------------------------------------
[397]69; Returns offset to DRVDETECTINFO based on DPT pointer.
[392]70;
[397]71; DriveDetectInfo_ConvertDPTtoBX
[392]72;   Parameters:
73;       DS:DI:  DPT Pointer
74;   Returns:
[397]75;       BX:     Offset to DRVDETECTINFO struct
[392]76;   Corrupts registers:
77;       AX
78;--------------------------------------------------------------------
[397]79DriveDetectInfo_ConvertDPTtoBX:
[591]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
[399]91    lea     ax, [di-RAMVARS_size]                   ; subtract off base of DPTs
[397]92    mov     bl, DPT_DRVDETECTINFO_SIZE_MULTIPLIER   ; DRVDETECTINFO are a whole number multiple of DPT size
[399]93    mul     bl
[397]94    add     ax, BOOTVARS.rgDrvDetectInfo            ; add base of DRVDETECTINFO
[591]95%endif
[399]96    xchg    bx, ax
97    ret
Note: See TracBrowser for help on using the repository browser.