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

Last change on this file since 200 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
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
[165]40 call AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
[3]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
[128]75 xor ax, ax ; Zero AX and clear CF
[100]76 stosb ; Terminate with NULL
[3]77
78 pop di
79 pop si
80 pop ds
81 ret
82
83
84;--------------------------------------------------------------------
[100]85; Finds BOOTNFO for drive and returns total sector count.
[3]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
[128]95;--------------------------------------------------------------------
[3]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
[100]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
[181]127 xchg bx, ax ; Move result to BX
[100]128 ret
Note: See TracBrowser for help on using the repository browser.