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

Last change on this file since 237 was 181, checked in by krille_n_@…, 13 years ago

Changes to all parts of the project:

  • Size optimizations.
  • Added a define (EXCLUDE_FROM_XTIDECFG) to exclude unused library code from XTIDECFG.
  • Tried to minimize time spent with interrupts disabled.
  • Some minor attempts to improve speed (reordering instructions etc).
  • Tried to improve readability, did some cleanup and fixed some errors in comments.
File size: 3.6 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; 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
25 ; Fall to .StoreSectorCount
26
27;--------------------------------------------------------------------
28; .StoreSectorCount
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:
34; Nothing
35; Corrupts registers:
36; AX, CX, DX
37;--------------------------------------------------------------------
38.StoreSectorCount:
39 push bx
40 call AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
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
46 ; Fall to .StoreDriveName
47
48;--------------------------------------------------------------------
49; .StoreDriveName
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;--------------------------------------------------------------------
60.StoreDriveName:
61 push ds
62 push si
63 push di
64
65 push es
66 pop ds
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
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
75 xor ax, ax ; Zero AX and clear CF
76 stosb ; Terminate with NULL
77
78 pop di
79 pop si
80 pop ds
81 ret
82
83
84;--------------------------------------------------------------------
85; Finds BOOTNFO for drive and returns total sector count.
86;
87; BootInfo_GetTotalSectorCount
88; Parameters:
89; DL: Drive number
90; DS: RAMVARS segment
91; Returns:
92; BX:DX:AX: 48-bit sector count
93; Corrupts registers:
94; Nothing
95;--------------------------------------------------------------------
96ALIGN JUMP_ALIGN
97BootInfo_GetTotalSectorCount:
98 push ds
99 call BootInfo_GetOffsetToBX
100 LOAD_BDA_SEGMENT_TO ds, ax
101 mov ax, [bx+BOOTNFO.twSectCnt]
102 mov dx, [bx+BOOTNFO.twSectCnt+2]
103 mov bx, [bx+BOOTNFO.twSectCnt+4]
104 pop ds
105 ret
106
107
108;--------------------------------------------------------------------
109; Returns offset to BOOTNFO for wanted drive.
110;
111; BootInfo_GetOffsetToBX
112; Parameters:
113; DL: Drive number
114; DS: RAMVARS segment
115; Returns:
116; BX: Offset to BOOTNFO struct
117; Corrupts registers:
118; AX
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121BootInfo_GetOffsetToBX:
122 mov bl, dl ; Copy drive number to BL
123 mov al, BOOTNFO_size ; Size of struct
124 sub bl, [RAMVARS.bFirstDrv] ; Drive number to index
125 mul bl ; AX = Offset inside BOOTNFO array
126 add ax, BOOTVARS.rgBootNfo ; Add offset to BOOTNFO array
127 xchg bx, ax ; Move result to BX
128 ret
Note: See TracBrowser for help on using the repository browser.