source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuInfo.asm@ 364

Last change on this file since 364 was 364, checked in by aitotat@…, 13 years ago

Changes to XTIDE Universal BIOS:

  • Advanced ATA Module variables are now kept in DPTs.
  • Forced full mode when using Advanced ATA Module.
File size: 3.0 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 BOOTMENUINFO struct for detected hard disk.
10;
11; BootMenuInfo_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 BOOTMENUINFO (if successful)
18; Corrupts registers:
19; AX, BX, CX, DX, DI
20;--------------------------------------------------------------------
21BootMenuInfo_CreateForHardDisk:
22 call BootMenuInfo_ConvertDPTtoBX ; ES:BX now points to new BOOTMENUINFO
23
24 ; Store Drive Name
25 push ds ; Preserve RAMVARS
26 push si
27
28 push es ; ES copied to DS
29 pop ds
30
31 add si, BYTE ATA1.strModel ; DS:SI now points drive name
32 lea di, [bx+BOOTMENUINFO.szDrvName] ; ES:DI now points to name destination
33 mov cx, MAX_HARD_DISK_NAME_LENGTH / 2 ; Max number of WORDs allowed
34.CopyNextWord:
35 lodsw
36 xchg al, ah ; Change endianness
37 stosw
38 loop .CopyNextWord
39 xor ax, ax ; Zero AX and clear CF
40 stosw ; Terminate with NULL
41
42 pop si
43 pop ds
44
45 ret
46
47
48;--------------------------------------------------------------------
49; BootMenuInfo_GetTotalSectorCount
50; Parameters:
51; DS:DI: DPT Pointer
52; Returns:
53; BX:DX:AX: 48-bit sector count
54; Corrupts registers:
55; CX
56;--------------------------------------------------------------------
57ALIGN JUMP_ALIGN
58BootMenuInfo_GetTotalSectorCount:
59 test BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
60 jnz SHORT .ReturnFullCapacity
61 jmp AH15h_GetSectorCountToBXDXAX
62.ReturnFullCapacity:
63 jmp AccessDPT_GetLbaSectorCountToBXDXAX
64
65
66;--------------------------------------------------------------------
67; BootMenuInfo_IsAvailable
68; Parameters:
69; Nothing
70; Returns:
71; ES: Segment to BOOTVARS with BOOTMENUINFOs
72; ZF: Set if BOOTVARS with BOOTMENUINFOs is available
73; Cleared if not available (no longer initializing)
74; Corrupts registers:
75; BX
76;--------------------------------------------------------------------
77BootMenuInfo_IsAvailable:
78 LOAD_BDA_SEGMENT_TO es, bx
79 cmp WORD [es:BOOTVARS.wMagicWord], BOOTVARS_MAGIC_WORD
80 ret
81
82
83;--------------------------------------------------------------------
84; Returns offset to BOOTMENUINFO based on DPT pointer.
85;
86; BootMenuInfo_ConvertDPTtoBX
87; Parameters:
88; DS:DI: DPT Pointer
89; Returns:
90; BX: Offset to BOOTMENUINFO struct
91; Corrupts registers:
92; Nothing
93;--------------------------------------------------------------------
94BootMenuInfo_ConvertDPTtoBX:
95 push ax
96 mov ax, di
97 sub ax, BYTE RAMVARS_size ; subtract off base of DPTs
98 mov bl, DPT_BOOTMENUINFO_SIZE_MULTIPLIER ; BOOTMENUINFO's are a whole number multiple of DPT size
99 mul bl
100 add ax, BOOTVARS.rgBootNfo ; add base of BOOTMENUINFO
101 xchg ax, bx
102 pop ax
103 ret
Note: See TracBrowser for help on using the repository browser.