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

Last change on this file since 364 was 364, checked in by aitotat@…, 12 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
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;--------------------------------------------------------------------
[254]9; Creates new BOOTMENUINFO struct for detected hard disk.
[3]10;
[254]11; BootMenuInfo_CreateForHardDisk
[3]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:
[254]17;       ES:BX:  Ptr to BOOTMENUINFO (if successful)
[3]18;   Corrupts registers:
[364]19;       AX, BX, CX, DX, DI
[3]20;--------------------------------------------------------------------
[254]21BootMenuInfo_CreateForHardDisk:
22    call    BootMenuInfo_ConvertDPTtoBX         ; ES:BX now points to new BOOTMENUINFO
[3]23
[364]24    ; Store Drive Name
25    push    ds                                  ; Preserve RAMVARS
26    push    si
[3]27
[364]28    push    es                                  ; ES copied to DS
29    pop     ds
[241]30
[254]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
[121]34.CopyNextWord:
35    lodsw
[254]36    xchg    al, ah                              ; Change endianness
[121]37    stosw
38    loop    .CopyNextWord
[254]39    xor     ax, ax                              ; Zero AX and clear CF
40    stosw                                       ; Terminate with NULL
[3]41
42    pop     si
43    pop     ds
[364]44       
[3]45    ret
46
[252]47
[3]48;--------------------------------------------------------------------
[254]49; BootMenuInfo_GetTotalSectorCount
[3]50;   Parameters:
[241]51;       DS:DI:      DPT Pointer
[3]52;   Returns:
53;       BX:DX:AX:   48-bit sector count
54;   Corrupts registers:
[252]55;       CX
[128]56;--------------------------------------------------------------------
[364]57ALIGN JUMP_ALIGN
[254]58BootMenuInfo_GetTotalSectorCount:
[252]59    test    BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
60    jnz     SHORT .ReturnFullCapacity
61    jmp     AH15h_GetSectorCountToBXDXAX
62.ReturnFullCapacity:
63    jmp     AccessDPT_GetLbaSectorCountToBXDXAX
[100]64
65
66;--------------------------------------------------------------------
[363]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;--------------------------------------------------------------------
[254]84; Returns offset to BOOTMENUINFO based on DPT pointer.
[100]85;
[254]86; BootMenuInfo_ConvertDPTtoBX
[100]87;   Parameters:
[241]88;       DS:DI:  DPT Pointer
[100]89;   Returns:
[254]90;       BX:     Offset to BOOTMENUINFO struct
[100]91;   Corrupts registers:
[363]92;       Nothing
[100]93;--------------------------------------------------------------------
[254]94BootMenuInfo_ConvertDPTtoBX:
[363]95    push    ax
[241]96    mov     ax, di
[363]97    sub     ax, BYTE RAMVARS_size                   ; subtract off base of DPTs
[254]98    mov     bl, DPT_BOOTMENUINFO_SIZE_MULTIPLIER    ; BOOTMENUINFO's are a whole number multiple of DPT size
[241]99    mul     bl                             
[254]100    add     ax, BOOTVARS.rgBootNfo                  ; add base of BOOTMENUINFO
[241]101    xchg    ax, bx
[363]102    pop     ax
[364]103    ret 
Note: See TracBrowser for help on using the repository browser.