Changeset 167 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Handlers


Ignore:
Timestamp:
Aug 21, 2011, 3:42:15 PM (13 years ago)
Author:
aitotat@…
google:author:
aitotat@gmail.com
Message:

Changes to XTIDE Universal BIOS:

  • Old Int 13h transfer functions work again.
  • Fixes to eINT13h (EBIOS) support.
Location:
trunk/XTIDE_Universal_BIOS/Src/Handlers
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h.asm

    r165 r167  
    4242ALIGN JUMP_ALIGN
    4343.JumpToEbiosFunction:
    44     test    BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE  ; Full mode?
    45     jz      SHORT Int13h_UnsupportedFunction
    46     test    BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA       ; LBA supported?
    47     jz      SHORT Int13h_UnsupportedFunction
    48     cmp     ah, 48h                     ; Above last valid function?
     44    test    BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_FULLMODE
     45    jz      SHORT Int13h_UnsupportedFunction    ; No eINT 13h in lite mode
     46    test    BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
     47    jz      SHORT Int13h_UnsupportedFunction    ; No eINT 13h for CHS drives
     48    cmp     ah, 48h
    4949    ja      SHORT Int13h_UnsupportedFunction
    50     sub     bx, 41h<<1                  ; BX = Offset to EBIOS jump table
     50    sub     bx, 41h<<1                  ; BX = Offset to eINT 13h jump table
    5151    jl      SHORT Int13h_UnsupportedFunction
    5252    jmp     [cs:bx+g_rgwEbiosFunctionJumpTable]
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH25h_HDrvID.asm

    r165 r167  
    2525%ifdef USE_186
    2626    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
    27     ; Fall to AH25h_GetDriveInformationToBufferInESSIfromDriveInDL
     27    ; Fall to AH25h_GetDriveInformationToBufferInESSI
    2828%else
    29     call    AH25h_GetDriveInformationToBufferInESSIfromDriveInDL
     29    call    AH25h_GetDriveInformationToBufferInESSI
    3030    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
    3131%endif
     
    3333
    3434;--------------------------------------------------------------------
    35 ; AH25h_GetDriveInformationToBufferInESSIfromDriveInDL
     35; AH25h_GetDriveInformationToBufferInESSI
    3636;   Parameters:
    37 ;       DL:     Translated Drive number
    3837;       DS:DI:  Ptr to DPT (in RAMVARS segment)
    3938;       ES:SI:  Ptr to buffer to receive 512-byte drive information
     
    4443;       AL, BX, CX, DX
    4544;--------------------------------------------------------------------
    46 AH25h_GetDriveInformationToBufferInESSIfromDriveInDL:
     45ALIGN JUMP_ALIGN
     46AH25h_GetDriveInformationToBufferInESSI:
    4747    push    es
    4848    push    bp
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH2h_HRead.asm

    r165 r167  
    2828ALIGN JUMP_ALIGN
    2929AH2h_HandlerForReadDiskSectors:
    30     cmp     BYTE [bp+IDEPACK.intpack+INTPACK.al], 0
     30    cmp     al, 0
    3131    jle     SHORT AH2h_ExitInt13hSinceSectorCountInIntpackIsZero
    3232
    33     xor     bx, bx
    34     call    CommandLookup_OrOldInt13hIndexToBL
     33    call    CommandLookup_GetOldInt13hIndexToBX
    3534    mov     ah, [cs:bx+g_rgbReadCommandLookup]
    3635    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
     
    5554    mov     ah, RET_HD_INVALID
    5655    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
    57 
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH3h_HWrite.asm

    r165 r167  
    2727ALIGN JUMP_ALIGN
    2828AH3h_HandlerForWriteDiskSectors:
    29     cmp     BYTE [bp+IDEPACK.intpack+INTPACK.al], 0
     29    cmp     al, 0
    3030    jle     SHORT AH2h_ExitInt13hSinceSectorCountInIntpackIsZero
    3131
    32     xor     bx, bx
    33     call    CommandLookup_OrOldInt13hIndexToBL
     32    call    CommandLookup_GetOldInt13hIndexToBX
    3433    mov     ah, [cs:bx+g_rgbWriteCommandLookup]
    3534    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ)
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH4h_HVerify.asm

    r165 r167  
    2626ALIGN JUMP_ALIGN
    2727AH4h_HandlerForVerifyDiskSectors:
    28     cmp     BYTE [bp+IDEPACK.intpack+INTPACK.al], 0
     28    cmp     al, 0
    2929    jle     SHORT AH2h_ExitInt13hSinceSectorCountInIntpackIsZero
    3030
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH41h_CheckIfExtensionsPresent.asm

    r165 r167  
    1717;   Returns with INTPACK:
    1818;       AH:     Major version of EBIOS extensions
    19 ;       BX:     55AAh
     19;       BX:     AA55h
    2020;       CX:     Support bits
    2121;       CF:     0 if succesfull, 1 if error
     
    2626    jne     SHORT .EbiosNotSupported
    2727
     28    mov     BYTE [bp+IDEPACK.intpack+INTPACK.ah], EBIOS_VERSION
     29    mov     WORD [bp+IDEPACK.intpack+INTPACK.bx], 0AA55h
    2830    mov     WORD [bp+IDEPACK.intpack+INTPACK.cx], ENHANCED_DRIVE_ACCESS_SUPPORT
    29     mov     ah, EBIOS_VERSION
    3031    and     BYTE [bp+IDEPACK.intpack+INTPACK.flags], ~FLG_FLAGS_CF  ; Return with CF cleared
    3132    jmp     Int13h_ReturnFromHandlerWithoutStoringErrorCode
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH42h_ExtendedReadSectors.asm

    r165 r167  
    5555    cmp     BYTE [es:si+DAP.bSize], MINIMUM_DAP_SIZE
    5656    jb      SHORT .DapContentsNotValid
    57     cmp     BYTE [es:si+DAP.bSectorCount], 0
     57    cmp     WORD [es:si+DAP.wSectorCount], BYTE 0
    5858    jle     SHORT .DapContentsNotValid          ; Must be 1...127
    5959    ret
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH48h_GetExtendedDriveParameters.asm

    r165 r167  
    2323ALIGN JUMP_ALIGN
    2424AH48h_HandlerForGetExtendedDriveParameters:
    25     ; Get ATA Drive Information and total sector count from it
     25    ; Get our buffer to ES:SI
     26    push    di
     27    call    FindDPT_ForNewDriveToDSDI
     28    lea     si, [di+LARGEST_DPT_SIZE]   ; IdeCommand.asm required fake DPT
     29    pop     di
    2630    push    ds
    27     pop     es          ; ES now points RAMVARS segment
    28     mov     si, [cs:ROMVARS.bStealSize]
    29     and     si, BYTE 7Fh
    30     eSHL_IM si, 10      ; Kilobytes to bytes
    31     sub     si, 512     ; Subtract buffer size for offset in RAMVARS
    32     call    AH25h_GetDriveInformationToBufferInESSIfromDriveInDL
     31    pop     es
     32
     33    ; Get Drive ID and total sector count from it
     34    call    AH25h_GetDriveInformationToBufferInESSI
     35    jc      SHORT .ReturnWithError
    3336    call    AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
    34     xchg    cx, ax
     37    xchg    cx, ax      ; Sector count now in BX:DX:CX
    3538
    3639    ; Point ES:DI to Destination buffer
    3740    mov     di, [bp+IDEPACK.intpack+INTPACK.si]
    3841    mov     es, [bp+IDEPACK.intpack+INTPACK.ds]
    39     cmp     WORD [es:di+EDRIVE_INFO.wSize], MINIMUM_EDRIVEINFO_SIZE
     42    mov     ax, MINIMUM_EDRIVEINFO_SIZE
     43    cmp     WORD [es:di+EDRIVE_INFO.wSize], ax
    4044    jb      SHORT .BufferTooSmall
     45    je      SHORT .SkipEddConfigurationParameters
     46
     47    ; We do not support EDD Configuration Parameters so set to FFFF:FFFFh
     48    xor     ax, ax
     49    dec     ax          ; AX = FFFFh
     50    mov     [es:di+EDRIVE_INFO.fpEDDparams], ax
     51    mov     [es:di+EDRIVE_INFO.fpEDDparams+2], ax
     52    mov     ax, EDRIVE_INFO_size
    4153
    4254    ; Fill Extended Drive Information Table in ES:DI
    43     mov     ax, MINIMUM_EDRIVEINFO_SIZE
    44     stosw
     55.SkipEddConfigurationParameters:
     56    stosw               ; Store Extended Drive Information Table size
    4557    mov     al, FLG_DMA_BOUNDARY_ERRORS_HANDLED_BY_BIOS
    4658    stosw
     
    6375.BufferTooSmall:
    6476    mov     ah, RET_HD_INVALID
     77.ReturnWithError:
    6578    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/CommandLookup.asm

    r165 r167  
    77;--------------------------------------------------------------------
    88; CommandLookup_GetEbiosIndexToBX
    9 ; CommandLookup_OrOldInt13hIndexToBL
    109;   Parameters:
    1110;       DS:DI:  Ptr to DPT
     
    1413;       BX:     Index to command lookup table
    1514;   Corrupts registers:
    16 ;       AX
     15;       AX, DX
    1716;--------------------------------------------------------------------
    1817ALIGN JUMP_ALIGN
    1918CommandLookup_GetEbiosIndexToBX:
    2019    ; LBA28 or LBA48 command
    21     xor     bx, bx
    22     mov     ax, [es:si+DAP.qwLBA+3] ; Load LBA48 bytes 3 and 4
    23     and     al, ~0Fh                ; Clear LBA28 bits 24...27
    24     or      al, [es:si+DAP.qwLBA+5]
    25     cmp     bx, ax                  ; Set CF if any of bits 28...47 set
    26     rcl     bx, 1                   ; BX = 0 for LBA28, BX = 1 for LBA48
     20    xor     dx, dx
     21    mov     al, [es:si+DAP.qwLBA+3] ; Load LBA48 byte 3 (bits 24...31)
     22    and     ax, 00F0h               ; Clear LBA28 bits 24...27
     23    or      ax, [es:si+DAP.qwLBA+4] ; Set bits from LBA bytes 4 and 5
     24    cmp     dx, ax                  ; Set CF if any of bits 28...47 set
     25    rcl     dx, 1                   ; DX = 0 for LBA28, DX = 1 for LBA48
     26    call    CommandLookup_GetOldInt13hIndexToBX
     27    or      bx, dx                  ; Set block mode / single sector bit
     28    ret
    2729
     30;--------------------------------------------------------------------
     31; CommandLookup_GetOldInt13hIndexToBX
     32;   Parameters:
     33;       DS:DI:  Ptr to DPT
     34;   Returns:
     35;       BX:     Index to command lookup table
     36;   Corrupts registers:
     37;       Nothing
     38;--------------------------------------------------------------------
     39ALIGN JUMP_ALIGN
     40CommandLookup_GetOldInt13hIndexToBX:
    2841    ; Block mode or single sector
    29 ALIGN JUMP_ALIGN
    30 CommandLookup_OrOldInt13hIndexToBL:
    31     mov     al, FLGH_DPT_BLOCK_MODE_SUPPORTED   ; Bit 1
    32     and     al, [di+DPT.bFlagsHigh]
    33     or      bl, al                  ; BX = index to lookup table
     42    mov     bl, [di+DPT.bFlagsHigh]
     43    and     bx, BYTE FLGH_DPT_BLOCK_MODE_SUPPORTED  ; Bit 1
    3444    ret
    3545
     
    5262    db      COMMAND_VERIFY_SECTORS
    5363    db      COMMAND_VERIFY_SECTORS_EXT     
    54 
Note: See TracChangeset for help on using the changeset viewer.