source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootInfo.asm@ 124

Last change on this file since 124 was 121, checked in by Tomi Tilli, 14 years ago

Changes to XTIDE Universal BIOS:

  • Endianness is now corrected for ATA device names.
  • Converted all BootVars.asm functions to macros in BootVars.inc.
  • Display library is now initialized second time before trying to display boot menu.
File size: 3.6 KB
RevLine 
[88]1; Project name : XTIDE Universal BIOS
[3]2; Description : Functions for generating and accessing drive
3; information to be displayed on boot menu.
4
5; Section containing code
6SECTION .text
7
8;--------------------------------------------------------------------
9; Creates new BOOTNFO struct for detected hard disk.
10;
11; BootInfo_CreateForHardDisk
12; Parameters:
13; DL: Drive number
14; DS:DI: Ptr to Disk Parameter Table
15; ES:SI: Ptr to 512-byte ATA information read from the drive
16; Returns:
17; ES:BX: Ptr to BOOTNFO (if successful)
18; CF: Cleared if BOOTNFO created succesfully
19; Set if any error
20; Corrupts registers:
21; AX, BX, CX, DX
22;--------------------------------------------------------------------
23BootInfo_CreateForHardDisk:
24 call BootInfo_GetOffsetToBX ; ES:BX now points to new BOOTNFO
[100]25 ; Fall to .StoreSectorCount
[3]26
27;--------------------------------------------------------------------
[100]28; .StoreSectorCount
[3]29; Parameters:
30; ES:BX: Ptr to BOOTNFO
31; ES:SI: Ptr to 512-byte ATA information read from the drive
32; DS:DI: Ptr to Disk Parameter Table
33; Returns:
[100]34; Nothing
[3]35; Corrupts registers:
36; AX, CX, DX
37;--------------------------------------------------------------------
[100]38.StoreSectorCount:
[3]39 push bx
40 call AtaID_GetTotalSectorCount ; Get to BX:DX:AX
41 mov cx, bx ; Now in CX:DX:AX
42 pop bx
43 mov [es:bx+BOOTNFO.twSectCnt], ax
44 mov [es:bx+BOOTNFO.twSectCnt+2], dx
45 mov [es:bx+BOOTNFO.twSectCnt+4], cx
[100]46 ; Fall to .StoreDriveName
[3]47
48;--------------------------------------------------------------------
[100]49; .StoreDriveName
[3]50; Parameters:
51; ES:BX: Ptr to BOOTNFO
52; ES:SI: Ptr to 512-byte ATA information read from the drive
53; DS:DI: Ptr to Disk Parameter Table
54; Returns:
55; CF: Cleared if variables stored succesfully
56; Set if any error
57; Corrupts registers:
58; AX, CX
59;--------------------------------------------------------------------
[100]60.StoreDriveName:
[3]61 push ds
62 push si
63 push di
64
65 push es
66 pop ds
[100]67 add si, BYTE ATA1.strModel ; DS:SI now points drive name
68 lea di, [bx+BOOTNFO.szDrvName] ; ES:DI now points to name destination
[121]69 mov cx, LEN_BOOTNFO_DRV / 2 ; Max number of WORDs allowed
70.CopyNextWord:
71 lodsw
72 xchg al, ah ; Change endianness
73 stosw
74 loop .CopyNextWord
[100]75 xor ax, ax
76 stosb ; Terminate with NULL
[3]77
78 pop di
79 pop si
80 pop ds
81 clc
82 ret
83
84
85;--------------------------------------------------------------------
[100]86; Finds BOOTNFO for drive and returns total sector count.
[3]87;
88; BootInfo_GetTotalSectorCount
89; Parameters:
90; DL: Drive number
91; DS: RAMVARS segment
92; Returns:
93; BX:DX:AX: 48-bit sector count
94; Corrupts registers:
95; Nothing
96;--------------------------------------------------------------------
97ALIGN JUMP_ALIGN
98BootInfo_GetTotalSectorCount:
99 push ds
100 call BootInfo_GetOffsetToBX
101 LOAD_BDA_SEGMENT_TO ds, ax
102 mov ax, [bx+BOOTNFO.twSectCnt]
103 mov dx, [bx+BOOTNFO.twSectCnt+2]
104 mov bx, [bx+BOOTNFO.twSectCnt+4]
105 pop ds
106 ret
[100]107
108
109;--------------------------------------------------------------------
110; Returns offset to BOOTNFO for wanted drive.
111;
112; BootInfo_GetOffsetToBX
113; Parameters:
114; DL: Drive number
115; DS: RAMVARS segment
116; Returns:
117; BX: Offset to BOOTNFO struct
118; Corrupts registers:
119; AX
120;--------------------------------------------------------------------
121ALIGN JUMP_ALIGN
122BootInfo_GetOffsetToBX:
123 mov bl, dl ; Copy drive number to BL
124 mov al, BOOTNFO_size ; Size of struct
125 sub bl, [RAMVARS.bFirstDrv] ; Drive number to index
126 mul bl ; AX = Offset inside BOOTNFO array
127 add ax, BOOTVARS.rgBootNfo ; Add offset to BOOTNFO array
128 xchg bx, ax ; Copy result to BX
129 ret
Note: See TracBrowser for help on using the repository browser.