Changeset 221 in xtideuniversalbios


Ignore:
Timestamp:
Jan 25, 2012, 2:36:47 PM (11 years ago)
Author:
aitotat@…
google:author:
aitotat@gmail.com
Message:

Changes to XTIDE Universal BIOS:

  • AH=0Ch (Seek) should work properly again.
  • More than 127 sectors are no longer allowed for EBIOS functions.
  • Changed location for BOOTNFO structs.
Location:
trunk/XTIDE_Universal_BIOS
Files:
1 deleted
13 edited
1 moved

Legend:

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

    r121 r221  
    2222; Segment is always 0000h, same as BDA segment
    2323struc BOOTVARS
    24                     resb    800h
    25     .dwPostStack    resb    4       ;  804h, POST stack when entering INT 19h
    26                     resb    8
    27     .rgBootNfo      resb    73F4h   ;  80Ch, Array containing BOOTNFO structs
    28     .rgbMnuStack:                   ; 7C00h and below, Boot Menu stack
     24                    resb    7C00h
    2925    .rgbAtaInfo:                    ; 7C00h, ATA Information for drive detection
    3026    .rgbBootSect    resb    512     ; 7C00h, Boot sector
     27                    resb    256     ; Boot Menu stack
     28    .rgbMnuStack:
     29    .dwPostStack    resb    4       ; POST stack pointer when entering INT 19h
     30    .rgBootNfo:                     ; Array containing BOOTNFO structs
    3131endstruc
    3232
  • trunk/XTIDE_Universal_BIOS/Inc/EBIOS.inc

    r218 r221  
    4141    .bSize                  resb    1   ; 0, Size of this packet in bytes
    4242    .bReservedAt1           resb    1   ; 1, Currently unused, must be zero
    43     .bSectorCount           resb    1   ; 2, Number of sectors to process (0...127)
    44     .bReservedAt3           resb    1   ; 3, Currently unused, must be zero
     43    .wSectorCount           resb    1   ; 2, Number of sectors to process (0...127)
    4544    .dwMemoryAddress:
    4645    .wOffset                resb    2   ; 4, Memory offset for transfer
  • trunk/XTIDE_Universal_BIOS/Src/Device/Idepack.asm

    r218 r221  
    2525;   Parameters:
    2626;       AH:     IDE command to issue
     27;       AL:     Number of sectors to transfer (for xfer commands)
    2728;       BH:     Timeout ticks
    2829;       BL:     IDE Status Register flag to wait after command
     
    3940ALIGN JUMP_ALIGN
    4041Idepack_ConvertDapToIdepackAndIssueCommandFromAH:
     42    mov     [bp+IDEPACK.bSectorCount], al
    4143    mov     [bp+IDEPACK.bCommand], ah
    42     mov     al, [es:si+DAP.bSectorCount]
    43     mov     [bp+IDEPACK.bSectorCount], al
    4444
    4545    mov     al, [es:si+DAP.qwLBA]       ; LBA byte 0
     
    5656    or      al, ah
    5757    mov     [bp+IDEPACK.bDrvAndHead], al
    58     les     si, [es:si+DAP.dwMemoryAddress]
     58
     59    ; Normalize data buffer pointer to ES:SI
     60    mov     ax, [es:si+DAP.dwMemoryAddress]     ; Load offset
     61    mov     cx, ax
     62    eSHR_IM ax, 4                               ; Divide offset by 16
     63    add     ax, [es:si+DAP.dwMemoryAddress+2]   ; Add segment
     64    mov     es, ax                              ; Segment normalized
     65    mov     si, cx
     66    and     si, BYTE 0Fh                        ; Offset normalized
    5967    jmp     SHORT GetDeviceControlByteToIdepackAndStartTransfer
    6068%endif
     
    6573;   Parameters:
    6674;       AH:     IDE command to issue
    67 ;       AL:     Number of sectors to transfer
     75;       AL:     Number of sectors to transfer (for xfer commands)
    6876;       BH:     Timeout ticks
    6977;       BL:     IDE Status Register flag to wait after command
     
    7381;       DH:     Starting head number (0...255)
    7482;       DS:DI:  Ptr to DPT (in RAMVARS segment)
     83;       ES:SI:  Ptr to normalized data buffer (for xfer commands)
    7584;       SS:BP:  Ptr to IDEPACK (containing INTPACK)
    76 ;   Parameters on INTPACK:
    77 ;       ES:BX:  Ptr to data buffer
    7885;   Returns:
    7986;       AH:     INT 13h Error Code
     
    8895
    8996    push    bx
    90     call    PrepareBuffer_ToESSIforOldInt13hTransfer
    9197    call    Address_OldInt13hAddressToIdeAddress
    9298    call    AccessDPT_GetDriveSelectByteToAL
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH25h_HDrvID.asm

    r170 r221  
    2222ALIGN JUMP_ALIGN
    2323AH25h_HandlerForGetDriveInformation:
    24     mov     si, [bp+IDEPACK.intpack+INTPACK.bx]
     24    mov     al, 1           ; Read 1 sector
     25    call    Prepare_BufferToESSIforOldInt13hTransfer
    2526%ifdef USE_186
    2627    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH2h_HRead.asm

    r218 r221  
    1515;       SS:BP:  Ptr to IDEPACK
    1616;   Parameters on INTPACK:
    17 ;       AL:     Number of sectors to read (1...255, 0=256)
     17;       AL:     Number of sectors to read (1...128)
    1818;       CH:     Cylinder number, bits 7...0
    1919;       CL:     Bits 7...6: Cylinder number bits 9 and 8
     
    2828ALIGN JUMP_ALIGN
    2929AH2h_HandlerForReadDiskSectors:
    30     call    CommandLookup_GetOldInt13hIndexToBX
     30    call    Prepare_BufferToESSIforOldInt13hTransfer
     31    call    Prepare_GetOldInt13hCommandIndexToBX
    3132    mov     ah, [cs:bx+g_rgbReadCommandLookup]
    3233    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH3h_HWrite.asm

    r169 r221  
    1515;       SS:BP:  Ptr to IDEREGS_AND_INTPACK
    1616;   Parameters on INTPACK:
    17 ;       AL:     Number of sectors to write (1...255, 0=256)
     17;       AL:     Number of sectors to write (1...128)
    1818;       CH:     Cylinder number, bits 7...0
    1919;       CL:     Bits 7...6: Cylinder number bits 9 and 8
     
    2727ALIGN JUMP_ALIGN
    2828AH3h_HandlerForWriteDiskSectors:
    29     call    CommandLookup_GetOldInt13hIndexToBX
     29    call    Prepare_BufferToESSIforOldInt13hTransfer
     30    call    Prepare_GetOldInt13hCommandIndexToBX
    3031    mov     ah, [cs:bx+g_rgbWriteCommandLookup]
    3132    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
    32     mov     si, [bp+IDEPACK.intpack+INTPACK.bx]
    3333%ifdef USE_186
    3434    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH4h_HVerify.asm

    r169 r221  
    1515;       SS:BP:  Ptr to INTPACK
    1616;   Parameters on INTPACK in SS:BP:
    17 ;       AL:     Number of sectors to verify (1...255, 0=256)
     17;       AL:     Number of sectors to verify (1...128)
    1818;       CH:     Cylinder number, bits 7...0
    1919;       CL:     Bits 7...6: Cylinder number bits 9 and 8
     
    2626ALIGN JUMP_ALIGN
    2727AH4h_HandlerForVerifyDiskSectors:
     28    call    Prepare_ByValidatingSectorsInALforOldInt13h
    2829    mov     ah, COMMAND_VERIFY_SECTORS
    2930    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH42h_ExtendedReadSectors.asm

    r218 r221  
    2424ALIGN JUMP_ALIGN
    2525AH42h_HandlerForExtendedReadSectors:
    26     call    AH42h_LoadDapToESSIandVerifyForTransfer
    27     call    CommandLookup_GetEbiosIndexToBX
     26    call    Prepare_ByLoadingDapToESSIandVerifyingForTransfer
    2827    mov     ah, [cs:bx+g_rgbReadCommandLookup]
    2928    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
     
    3534    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
    3635%endif
    37 
    38 
    39 ;--------------------------------------------------------------------
    40 ; AH42h_LoadDapToESSIandVerifyForTransfer
    41 ;   Parameters:
    42 ;       SI:     Same as in INTPACK
    43 ;       SS:BP:  Ptr to IDEPACK
    44 ;   Parameters on INTPACK:
    45 ;       DS:SI:  Ptr to Disk Address Packet
    46 ;   Returns:
    47 ;       ES:SI:  Ptr to Disk Address Packet (DAP)
    48 ;       Exits from INT 13h if invalid DAP
    49 ;   Corrupts registers:
    50 ;       Nothing
    51 ;--------------------------------------------------------------------
    52 ALIGN JUMP_ALIGN
    53 AH42h_LoadDapToESSIandVerifyForTransfer:
    54     mov     es, [bp+IDEPACK.intpack+INTPACK.ds] ; ES:SI to point Disk Address Packet
    55     cmp     BYTE [es:si+DAP.bSize], MINIMUM_DAP_SIZE
    56     jb      SHORT AH42h_ReturnWithInvalidFunctionError
    57     cmp     WORD [es:si+DAP.bSectorCount], BYTE 0
    58     je      SHORT AH42h_ReturnWithInvalidFunctionError
    59     ret
    60 AH42h_ReturnWithInvalidFunctionError:
    61     mov     ah, RET_HD_INVALID
    62     jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH43h_ExtendedWriteSectors.asm

    r169 r221  
    2727AH43h_HandlerForExtendedWriteSectors:
    2828    cmp     BYTE [bp+IDEPACK.intpack+INTPACK.al], 2 ; Verify requested?
    29     jae     SHORT AH42h_ReturnWithInvalidFunctionError
     29    jae     SHORT Prepare_ReturnFromInt13hWithInvalidFunctionError
    3030
    31     call    AH42h_LoadDapToESSIandVerifyForTransfer
    32     call    CommandLookup_GetEbiosIndexToBX
     31    call    Prepare_ByLoadingDapToESSIandVerifyingForTransfer
    3332    mov     ah, [cs:bx+g_rgbWriteCommandLookup]
    3433    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH44h_ExtendedVerifySectors.asm

    r165 r221  
    2424ALIGN JUMP_ALIGN
    2525AH44h_HandlerForExtendedVerifySectors:
    26     call    AH42h_LoadDapToESSIandVerifyForTransfer
    27     call    CommandLookup_GetEbiosIndexToBX
     26    call    Prepare_ByLoadingDapToESSIandVerifyingForTransfer
    2827    mov     ah, [cs:bx+g_rgbVerifyCommandLookup]
    2928    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH47h_ExtendedSeek.asm

    r169 r221  
    2525    mov     es, [bp+IDEPACK.intpack+INTPACK.ds] ; ES:SI to point Disk Address Packet
    2626    cmp     BYTE [es:si+DAP.bSize], MINIMUM_DAP_SIZE
    27     jb      SHORT AH42h_ReturnWithInvalidFunctionError
     27    jb      SHORT Prepare_ReturnFromInt13hWithInvalidFunctionError
    2828
    2929    mov     ah, COMMAND_SEEK
     
    3636    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
    3737%endif
     38
     39.WriteWithVerifyNotSupported:
     40    jmp     Prepare_ReturnFromInt13hWithInvalidFunctionError
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH48h_GetExtendedDriveParameters.asm

    r170 r221  
    4040    mov     ax, MINIMUM_EDRIVEINFO_SIZE
    4141    cmp     [di+EDRIVE_INFO.wSize], ax
    42     jb      SHORT AH42h_ReturnWithInvalidFunctionError
     42    jb      SHORT Prepare_ReturnFromInt13hWithInvalidFunctionError
    4343    je      SHORT .SkipEddConfigurationParameters
    4444
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/Prepare.asm

    r220 r221  
    55SECTION .text
    66
     7;--------------------------------------------------------------------
     8; Prepare_ByLoadingDapToESSIandVerifyingForTransfer
     9;   Parameters:
     10;       SI:     Offset to DAP
     11;       DS:DI:  Ptr to DPT
     12;       SS:BP:  Ptr to IDEPACK
     13;   Parameters on INTPACK:
     14;       DS:SI:  Ptr to Disk Address Packet
     15;   Returns:
     16;       BX:     Index to command lookup table
     17;       ES:SI:  Ptr to Disk Address Packet (DAP)
     18;       Exits from INT 13h if invalid DAP
     19;   Corrupts registers:
     20;       AX, DX
     21;--------------------------------------------------------------------
     22%ifdef MODULE_EBIOS
     23ALIGN JUMP_ALIGN
     24Prepare_ByLoadingDapToESSIandVerifyingForTransfer:
     25    ; Load pointer to DAP to ES:SI and make sure it is valid
     26    mov     es, [bp+IDEPACK.intpack+INTPACK.ds] ; ES:SI to point Disk Address Packet
     27    cmp     BYTE [es:si+DAP.bSize], MINIMUM_DAP_SIZE
     28    jb      SHORT InvalidDAP
     29
     30    ; Make sure that sector count is valid
     31    mov     ax, [es:si+DAP.wSectorCount]
     32    test    ax, ax
     33    jz      SHORT ZeroSectorsRequestedSoNoErrors
     34    cmp     ax, BYTE 127
     35    ja      SHORT InvalidNumberOfSectorsRequested
     36    ; Fall to GetEbiosCommandIndexToBX
     37
     38;--------------------------------------------------------------------
     39; GetEbiosCommandIndexToBX
     40;   Parameters:
     41;       DS:DI:  Ptr to DPT
     42;       ES:SI:  Ptr to DAP (Disk Address Packet)
     43;   Returns:
     44;       BX:     Index to command lookup table
     45;   Corrupts registers:
     46;       AX, DX
     47;--------------------------------------------------------------------
     48GetEbiosCommandIndexToBX:
     49    ; LBA28 or LBA48 command
     50    xor     dx, dx
     51    mov     al, [es:si+DAP.qwLBA+3] ; Load LBA48 byte 3 (bits 24...31)
     52    and     ax, 00F0h               ; Clear LBA28 bits 24...27
     53    or      ax, [es:si+DAP.qwLBA+4] ; Set bits from LBA bytes 4 and 5
     54    cmp     dx, ax                  ; Set CF if any of bits 28...47 set
     55    rcl     dx, 1                   ; DX = 0 for LBA28, DX = 1 for LBA48
     56    call    Prepare_GetOldInt13hCommandIndexToBX
     57    or      bx, dx                  ; Set block mode / single sector bit
     58    ret
     59%endif
     60
     61
     62;--------------------------------------------------------------------
     63; Prepare_GetOldInt13hCommandIndexToBX
     64;   Parameters:
     65;       DS:DI:  Ptr to DPT
     66;   Returns:
     67;       BX:     Index to command lookup table
     68;   Corrupts registers:
     69;       Nothing
     70;--------------------------------------------------------------------
     71ALIGN JUMP_ALIGN
     72Prepare_GetOldInt13hCommandIndexToBX:
     73    ; Block mode or single sector
     74    mov     bl, [di+DPT.bFlagsHigh]
     75    and     bx, BYTE FLGH_DPT_BLOCK_MODE_SUPPORTED  ; Bit 1
     76    ret
     77
     78
    779;---------------------------------------------------------------------
    8 ; PrepareBuffer_ToESSIforOldInt13hTransfer
     80; Prepare_BufferToESSIforOldInt13hTransfer
    981;   Parameters:
    1082;       AL:     Number of sectors to transfer
     
    1991;--------------------------------------------------------------------
    2092ALIGN JUMP_ALIGN
    21 PrepareBuffer_ToESSIforOldInt13hTransfer:
     93Prepare_BufferToESSIforOldInt13hTransfer:
    2294    ; Normalize buffer pointer
    2395    mov     bx, [bp+IDEPACK.intpack+INTPACK.bx] ; Load offset
     
    2799    mov     es, bx                              ; Segment normalized
    28100    and     si, BYTE 0Fh                        ; Offset normalized
     101    ; Fall to Prepare_ByValidatingSectorsInALforOldInt13h
    29102
    30     ; Check if valid number of sectors
     103
     104;---------------------------------------------------------------------
     105; Prepare_ByValidatingSectorsInALforOldInt13h
     106;   Parameters:
     107;       AL:     Number of sectors to transfer
     108;   Returns:
     109;       Exits INT 13h if invalid number of sectors in AL
     110;   Corrupts registers:
     111;       Nothing
     112;--------------------------------------------------------------------
     113ALIGN JUMP_ALIGN
     114Prepare_ByValidatingSectorsInALforOldInt13h:
    31115    test    al, al
    32     js      SHORT .CheckZeroOffsetFor128Sectors
    33     jz      SHORT .InvalidNumberOfSectorsRequested
     116    js      SHORT .CheckZeroOffsetFor128Sectors     ; 128 or more
     117    jz      SHORT InvalidNumberOfSectorsRequested   ; Zero not allowed for old INT 13h
    34118    ret     ; Continue with transfer
    35119
     
    37121.CheckZeroOffsetFor128Sectors:
    38122    cmp     al, 128
    39     ja      SHORT .InvalidNumberOfSectorsRequested
     123    ja      SHORT InvalidNumberOfSectorsRequested
    40124    mov     ah, RET_HD_BOUNDARY
    41125    test    si, si                              ; Offset must be zero to xfer 128 sectors
    42     jnz     SHORT .CannotAlignPointerProperly
     126    jnz     SHORT CannotAlignPointerProperly
    43127    ret     ; Continue with transfer
    44128
    45 .InvalidNumberOfSectorsRequested:
     129InvalidDAP:
     130InvalidNumberOfSectorsRequested:
     131Prepare_ReturnFromInt13hWithInvalidFunctionError:
    46132    mov     ah, RET_HD_INVALID
    47 .CannotAlignPointerProperly:
     133ZeroSectorsRequestedSoNoErrors:
     134CannotAlignPointerProperly:
    48135    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
    49136
     137
     138
     139; Command lookup tables
     140g_rgbReadCommandLookup:
     141    db      COMMAND_READ_SECTORS        ; 00b, CHS or LBA28 single sector
     142    db      COMMAND_READ_SECTORS_EXT    ; 01b, LBA48 single sector
     143    db      COMMAND_READ_MULTIPLE       ; 10b, CHS or LBA28 block mode
     144    db      COMMAND_READ_MULTIPLE_EXT   ; 11b, LBA48 block mode
     145
     146g_rgbWriteCommandLookup:
     147    db      COMMAND_WRITE_SECTORS
     148    db      COMMAND_WRITE_SECTORS_EXT
     149    db      COMMAND_WRITE_MULTIPLE
     150    db      COMMAND_WRITE_MULTIPLE_EXT
     151
     152g_rgbVerifyCommandLookup:
     153    db      COMMAND_VERIFY_SECTORS
     154    db      COMMAND_VERIFY_SECTORS_EXT
     155    db      COMMAND_VERIFY_SECTORS
     156    db      COMMAND_VERIFY_SECTORS_EXT
  • trunk/XTIDE_Universal_BIOS/Src/Main.asm

    r218 r221  
    207207
    208208    ; INT 13h Hard Disk BIOS functions
    209     %include "DriveXlate.asm"       ; For swapping drive numbers
    210     %include "Address.asm"          ; For sector address translations
    211     %include "CommandLookup.asm"    ; For getting correct transfer command
    212     %include "PrepareBuffer.asm"    ; For buffer pointer normalization
    213209    %include "Int13h.asm"           ; For Int 13h, Disk functions
    214210    %include "AH0h_HReset.asm"      ; Required by Int13h_Jump.asm
     
    227223    %include "AH24h_HSetBlocks.asm" ; Required by Int13h_Jump.asm
    228224    %include "AH25h_HDrvID.asm"     ; Required by Int13h_Jump.asm
     225    %include "DriveXlate.asm"       ; For swapping drive numbers
     226    %include "Address.asm"          ; For sector address translations
     227    %include "Prepare.asm"          ; For buffer pointer normalization
    229228%ifdef MODULE_EBIOS
    230     %include "AH41h_CheckIfExtensionsPresent.asm"
    231229    %include "AH42h_ExtendedReadSectors.asm"
    232230    %include "AH43h_ExtendedWriteSectors.asm"
     
    234232    %include "AH47h_ExtendedSeek.asm"
    235233    %include "AH48h_GetExtendedDriveParameters.asm"
     234    %include "AH41h_CheckIfExtensionsPresent.asm"
    236235%endif
    237236
Note: See TracChangeset for help on using the changeset viewer.