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

Last change on this file since 241 was 241, checked in by gregli@…, 12 years ago

Space optimizations in the Boot Menu and BootInfo routines, taking advantage of nested %s. Optimization in the init of RamVars to avoid writing the signature twice. Preparing for addition of serial floppy support, starting to break the assumption that our drives are always 80h or higher.

File size: 2.8 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;   Corrupts registers:
[241]19;       AX, BX, CX, DX, DI, SI
[3]20;--------------------------------------------------------------------
21BootInfo_CreateForHardDisk:
[241]22    call    BootInfo_ConvertDPTtoBX     ; ES:BX now points to new BOOTNFO
23    push    bx                          ; Preserve for return
[3]24
[241]25    mov     di, bx                      ; Starting pointer at beginning of structure
[3]26
[241]27;
28; Store Drive Name
29;       
30    push    ds                          ; Preserve RAMVARS
31    push    si                          ; Preserve SI for call to GetTotalSectorCount...
[3]32
[241]33    push    es                          ; ES copied to DS
[3]34    pop     ds
[241]35
[100]36    add     si, BYTE ATA1.strModel      ; DS:SI now points drive name
37    lea     di, [bx+BOOTNFO.szDrvName]  ; ES:DI now points to name destination
[121]38    mov     cx, LEN_BOOTNFO_DRV / 2     ; Max number of WORDs allowed
39.CopyNextWord:
40    lodsw
41    xchg    al, ah                      ; Change endianness
42    stosw
43    loop    .CopyNextWord
[128]44    xor     ax, ax                      ; Zero AX and clear CF
[241]45    stosw                               ; Terminate with NULL
[3]46
47    pop     si
48    pop     ds
[241]49
50;
51; Store Sector Count
52;
53    call    AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
54
55    stosw
56    xchg    ax, dx
57    stosw
58    xchg    ax, bx
59    stosw
60
61    pop     bx
62       
[3]63    ret
64
[241]65       
[3]66;--------------------------------------------------------------------
[100]67; Finds BOOTNFO for drive and returns total sector count.
[3]68;
69; BootInfo_GetTotalSectorCount
70;   Parameters:
[241]71;       DS:DI:      DPT Pointer
[3]72;   Returns:
73;       BX:DX:AX:   48-bit sector count
74;   Corrupts registers:
75;       Nothing
[128]76;--------------------------------------------------------------------
[3]77ALIGN JUMP_ALIGN
78BootInfo_GetTotalSectorCount:
79    push    ds
[241]80    call    BootInfo_ConvertDPTtoBX
[3]81    LOAD_BDA_SEGMENT_TO ds, ax
82    mov     ax, [bx+BOOTNFO.twSectCnt]
83    mov     dx, [bx+BOOTNFO.twSectCnt+2]
84    mov     bx, [bx+BOOTNFO.twSectCnt+4]
85    pop     ds
86    ret
[100]87
88
89;--------------------------------------------------------------------
[241]90; Returns offset to BOOTNFO based on DPT pointer.
[100]91;
[241]92; BootInfo_ConvertDPTtoBX
[100]93;   Parameters:
[241]94;       DS:DI:  DPT Pointer
[100]95;   Returns:
96;       BX:     Offset to BOOTNFO struct
97;   Corrupts registers:
98;       AX
99;--------------------------------------------------------------------
100ALIGN JUMP_ALIGN
[241]101BootInfo_ConvertDPTtoBX:
102    mov     ax, di
103    sub     ax, RAMVARS_size                ; subtract off base of DPTs
104    mov     bl, DPT_BOOTNFO_SIZE_MULTIPLIER ; BOOTNFO's are a whole number multiple of DPT size
105    mul     bl                             
106    add     ax, BOOTVARS.rgBootNfo          ; add base of BOOTNFO
107    xchg    ax, bx
108    ret         
Note: See TracBrowser for help on using the repository browser.