Changeset 358 in xtideuniversalbios


Ignore:
Timestamp:
Mar 19, 2012, 2:20:32 PM (13 years ago)
Author:
aitotat@…
google:author:
aitotat@gmail.com
Message:

Changes to XTIDE Universal BIOS:

  • Moved BIOS title and version strings to Version.inc.
  • Moved LBA to L-CHS conversion function to LbaAssist.asm.
Location:
trunk/XTIDE_Universal_BIOS
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Inc/CustomDPT.inc

    r294 r358  
    8585
    8686
     87;--------------------------------------------------------------------
     88; LIMIT_LBA_CYLINDERS_IN_DXAX_TO_LCHS_CYLINDERS
     89;   Parameters:
     90;       DX:AX:  Number of LBA cylinders
     91;   Returns:
     92;       AX:     Number of L-CHS cylinders
     93;   Corrupts registers:
     94;       Nothing
     95;--------------------------------------------------------------------
     96%macro LIMIT_LBA_CYLINDERS_IN_DXAX_TO_LCHS_CYLINDERS 0
     97    test    dx, dx
     98    jnz     SHORT %%LoadMaxValueToAX
     99    cmp     ax, MAX_LCHS_CYLINDERS
     100    jbe     SHORT %%NoNeedToModify
     101%%LoadMaxValueToAX:
     102    mov     ax, MAX_LCHS_CYLINDERS
     103%%NoNeedToModify:
     104%endmacro
     105
     106
    87107%endif ; CUSTOMDPT_INC
  • trunk/XTIDE_Universal_BIOS/Src/Main.asm

    r334 r358  
    1919    ; Included .inc files
    2020    %include "AssemblyLibrary.inc"  ; Assembly Library. Must be included first!
     21    %include "Version.inc"
    2122    %include "IntController.inc"    ; For Interrupt Controller equates
    2223    %include "ATA_ID.inc"           ; For ATA Drive Information structs
     
    4445    at  ROMVARS.bRomSize,   db  CNT_ROM_BLOCKS  ; ROM size in 512B blocks
    4546    at  ROMVARS.rgbJump,    jmp Initialize_FromMainBiosRomSearch
    46     at  ROMVARS.rgbSign,    db  "XTIDE200"      ; Signature for flash program
    47     at  ROMVARS.szTitle
    48         db  "-=XTIDE Universal BIOS"
    49 %ifdef USE_AT
    50         db  " (AT)=-",NULL
    51 %elifdef USE_186
    52         db  " (XT+)=-",NULL
    53 %else
    54         db  " (XT)=-",NULL
    55 %endif
    56     at  ROMVARS.szVersion,  db  "v2.0.0",BETA,"1 (",__DATE__,")",NULL
     47    at  ROMVARS.rgbSign,    db  FLASH_SIGNATURE
     48    at  ROMVARS.szTitle,    db  TITLE_STRING
     49    at  ROMVARS.szVersion,  db  ROM_VERSION_STRING
    5750
    5851;;; For OR'ing into wFlags below
     
    187180    %include "FindDPT.asm"          ; For finding DPTs
    188181    %include "AccessDPT.asm"        ; For accessing DPTs
     182    %include "LbaAssist.asm"        ; For generating L-CHS parameters to LBA drives
    189183    %include "BootMenuInfo.asm"     ; For creating BOOTMENUINFO structs
    190184    %include "AtaID.asm"            ; For ATA Identify Device information
  • trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm

    r324 r358  
    5858
    5959    call    AccessDPT_GetLbaSectorCountToBXDXAX
    60     call    AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH
    61     test    dx, dx
    62     jnz     SHORT .LimitAXtoMaxLCHScylinders
    63     cmp     ax, MAX_LCHS_CYLINDERS
    64     jb      SHORT .returnLCHS
    65 .LimitAXtoMaxLCHScylinders:
    66     mov     ax, MAX_LCHS_CYLINDERS
    67 .returnLCHS:
     60    call    LbaAssist_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH
     61    LIMIT_LBA_CYLINDERS_IN_DXAX_TO_LCHS_CYLINDERS
    6862    ret
    6963
     
    157151    and     al, MASKL_DPT_ADDRESSING_MODE
    158152%endmacro
    159 
    160 
    161 ;--------------------------------------------------------------------
    162 ; LBA assist calculation:
    163 ; this is how to fit a big drive into INT13's skimpy size requirements,
    164 ; with a maximum of 8.4G available.
    165 ;
    166 ; total LBAs (as obtained by words 60+61)
    167 ; divided by 63 (sectors per track) (save as value A)
    168 ; Sub 1 from A
    169 ; divide A by 1024 + truncate.
    170 ; == total number of heads to use.
    171 ; add 1
    172 ; this value must be either 16, 32, 64, 128, or 256 (round up)
    173 ; then take the value A above and divide by # of heads
    174 ; to get the # of cylinders to use.
    175 ;
    176 ;
    177 ; so a LBA28 drive will have 268,435,456 as maximum LBAs
    178 ;
    179 ; 10000000h / 63   = 410410h (total cylinders or tracks)
    180 ;   410410h / 1024 = 1041h, which is way more than 256 heads, but 256 is max.
    181 ;   410410h / 256  = 4104h cylinders
    182 ;
    183 ; there's a wealth of information at: http://www.mossywell.com/boot-sequence
    184 ; they show a slightly different approach to LBA assist calulations, but
    185 ; the method here provides compatibility with phoenix BIOS
    186 ;
    187 ; we're using the values from 60+61 here because we're topping out at 8.4G
    188 ; anyway, so there's no need to use the 48bit LBA values.
    189 ;
    190 ; AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHStoDXAXBLBH:
    191 ;   Parameters:
    192 ;       BX:DX:AX:   Total number of sectors
    193 ;   Returns:
    194 ;       DX:AX:  Number of cylinders
    195 ;       BH:     Number of sectors per track (always 63)
    196 ;       BL:     Number of heads (16, 32, 64, 128 or 255)
    197 ;   Corrupts registers:
    198 ;       CX
    199 ;--------------------------------------------------------------------
    200 AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH:
    201     push    bp
    202     push    si
    203 
    204     ; Value A = Total sector count / 63
    205     xor     cx, cx
    206     push    cx      ; Push zero for bits 48...63
    207     push    bx
    208     push    dx
    209     push    ax                      ; 64-bit sector count now in stack
    210     mov     cl, LBA_ASSIST_SPT
    211     mov     bp, sp                  ; SS:BP now points sector count
    212     call    Math_DivQWatSSBPbyCX    ; Temporary value A now in stack
    213 
    214     ; BX = Number of heads =  A / 1024
    215     mov     ax, [bp]
    216     mov     dx, [bp+2]
    217     mov     bx, [bp+4]
    218     call    Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
    219 
    220     ; Heads must be 16, 32, 64, 128 or 256 (round up)
    221     mov     bx, 256                     ; Max number of heads
    222     test    dx, dx                      ; 65536 or more heads?
    223     jnz     SHORT .GetNumberOfCylinders
    224     mov     cx, 128                     ; Half BX for rounding up
    225 .FindMostSignificantBitForHeadSize:
    226     cmp     ax, cx
    227     jae     SHORT .GetNumberOfCylinders
    228     shr     cx, 1
    229     shr     bx, 1                       ; Halve number of heads
    230     jmp     SHORT .FindMostSignificantBitForHeadSize
    231 
    232     ; DX:AX = Number of cylinders = A / number of heads
    233 .GetNumberOfCylinders:
    234     mov     cx, bx
    235     call    Math_DivQWatSSBPbyCX
    236     mov     ax, [bp]
    237     mov     dx, [bp+2]                  ; Cylinders now in DX:AX
    238 
    239     ; Return LBA assisted CHS
    240     add     sp, BYTE 8                  ; Clean stack
    241     sub     bl, bh                      ; Limit heads to 255
    242     mov     bh, LBA_ASSIST_SPT
    243     pop     si
    244     pop     bp
    245     ret
  • trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm

    r346 r358  
    113113.KeepTotalSectorsFromAtaID:
    114114    mov     bx, [di+DPT.twLbaSectors+4]     ; Restore BX
    115     call    AccessDPT_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH
     115    call    LbaAssist_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH
    116116    mov     [di+DPT.bLbaHeads], bl
    117117    jmp     SHORT .StoreBlockMode
Note: See TracChangeset for help on using the changeset viewer.