Changeset 617 in xtideuniversalbios


Ignore:
Timestamp:
Aug 10, 2021, 7:27:30 AM (3 years ago)
Author:
Tomi Tilli
Message:
  • Verify functions did not return correctly the number of succesfully verified sectors. That should be now fixed except for serial device. Serial device do not have error handling implemented yet.
Location:
trunk/XTIDE_Universal_BIOS/Src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Src/Device/Device.asm

    r613 r617  
    164164
    165165;--------------------------------------------------------------------
     166; Device_ReadLBAlowRegisterToAL
     167; Returns LBA low register / Sector number register contents.
     168; Note that this returns valid value only after transfer command (read/write/verify)
     169; has stopped to an error. Do not call this otherwise.
     170;   Parameters:
     171;       DS:DI:  Ptr to DPT (in RAMVARS segment)
     172;   Returns:
     173;       AL:     Byte read from the device register
     174;   Corrupts registers:
     175;       BX, DX
     176;--------------------------------------------------------------------
     177;%ifdef MODULE_SERIAL   ; IDE + Serial
     178;ALIGN JUMP_ALIGN
     179;Device_ReadLBAlowRegisterToAL:
     180;   test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
     181;%ifdef USE_386
     182;   jz      IdeCommand_ReadLBAlowRegisterToAL
     183;   jmp     SerialCommand_ReadLBAlowRegisterToAL
     184;%else
     185;   jnz     SHORT .ReadFromSerialPort
     186;   jmp     IdeCommand_ReadLBAlowRegisterToAL
     187
     188;ALIGN JUMP_ALIGN
     189;.ReadFromSerialPort:
     190;   jmp     SerialCommand_ReadLBAlowRegisterToAL
     191;%endif
     192
     193;%else                  ; IDE only
     194    Device_ReadLBAlowRegisterToAL       EQU     IdeCommand_ReadLBAlowRegisterToAL
     195;%endif
     196; TODO: For now we simply assume serial device do not produce verify errors
     197
     198
     199;--------------------------------------------------------------------
    166200; Device_SelectDrive
    167201;   Parameters:
  • trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeCommand.asm

    r612 r617  
    288288    OUTPUT_AL_TO_IDE_REGISTER   LBA_HIGH_REGISTER
    289289    ret
     290
     291
     292;--------------------------------------------------------------------
     293; IdeCommand_ReadLBAlowRegisterToAL
     294; Returns LBA low register / Sector number register contents.
     295; Note that this returns valid value only after transfer command (read/write/verify)
     296; has stopped to an error. Do not call this otherwise.
     297;   Parameters:
     298;       DS:DI:  Ptr to DPT (in RAMVARS segment)
     299;   Returns:
     300;       AL:     Byte read from the register
     301;   Corrupts registers:
     302;       BX, DX
     303;--------------------------------------------------------------------
     304ALIGN JUMP_ALIGN
     305IdeCommand_ReadLBAlowRegisterToAL:
     306    ; HOB bit (defined in 48-bit address feature set) should be zero by default
     307    ; so we get the correct value for CHS, LBA28 and LBA48 drives and commands
     308    INPUT_TO_AL_FROM_IDE_REGISTER   LBA_LOW_REGISTER
     309    ret
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH4h_HVerify.asm

    r568 r617  
    2929;       DL:     Translated Drive number
    3030;       DS:DI:  Ptr to DPT (in RAMVARS segment)
    31 ;       SS:BP:  Ptr to INTPACK
     31;       SS:BP:  Ptr to IDEPACK
    3232;   Parameters on INTPACK in SS:BP:
    3333;       AL:     Number of sectors to verify (1...128)
     
    4646    call    Prepare_ByValidatingSectorsInALforOldInt13h ; Preserves AX
    4747    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)
    48 %ifdef USE_186
    49     push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAHandTransferredSectorsFromCL
    50     jmp     Idepack_TranslateOldInt13hAddressAndIssueCommandFromAH
    51 %else
     48    push    ax          ; Store number of sectors to verify
    5249    call    Idepack_TranslateOldInt13hAddressAndIssueCommandFromAH
     50    pop     cx          ; Number of sectors verified if successful
     51    jnc     SHORT .NoErrors
     52
     53; TODO: For now we assume serial device do not produce verify errors
     54    call    AH4h_CalculateNumberOfSuccessfullyVerifiedSectors
     55.NoErrors:
    5356    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAHandTransferredSectorsFromCL
    54 %endif
     57
     58
     59;--------------------------------------------------------------------
     60; Calculates number of succesfully verified sectors. This function works only
     61; if verify command stopped to an device error (such as bad sector) since IDE
     62; register contents are not valid unless error.
     63;
     64; AH4h_CalculateNumberOfSuccessfullyVerifiedSectors
     65;   Parameters:
     66;       AH:     INT 13h error code
     67;       CX:     Number of sectors that was meant to we verified
     68;       DS:DI:  Ptr to DPT (in RAMVARS segment)
     69;       SS:BP:  Ptr to IDEPACK
     70;   Returns with INTPACK in SS:BP:
     71;       CX:     Number of sectors succesfully verified
     72;       CF:     1
     73;--------------------------------------------------------------------
     74ALIGN JUMP_ALIGN
     75AH4h_CalculateNumberOfSuccessfullyVerifiedSectors:
     76    xchg    cx, ax          ; Store error code to CL
     77    call    Device_ReadLBAlowRegisterToAL
     78    mov     ah, [bp+IDEPACK.bLbaLow]
     79    sub     al, ah          ; AL = sector address with verify failure - starting sector address
     80    xor     ah, ah
     81    xchg    cx, ax          ; Number of successfully verified sectors in CX, error code in AH
     82    stc
     83    ret
  • trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/EBIOS/AH44h_ExtendedVerifySectors.asm

    r568 r617  
    4141AH44h_HandlerForExtendedVerifySectors:
    4242    call    Prepare_ByLoadingDapToESSIandVerifyingForTransfer
     43    push    WORD [es:si+DAP.wSectorCount]               ; Store for successfull number of sectors transferred
    4344    mov     ah, [cs:bx+g_rgbVerifyCommandLookup]
    4445    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)
    4546    call    Idepack_ConvertDapToIdepackAndIssueCommandFromAH
     47
     48    ; Now we need number of succesfully verifed sectors to CX. Since we did not transfer anything,
     49    ; we did not have any sector counter like in read and write functions.
     50    ; In case of error, drive LBA registers are set to address where the error occurred. We must
     51    ; calculate number of succesfully transferred sectors from it.
     52    pop     cx
     53    jnc     SHORT .AllSectorsVerifiedSuccessfully
     54
     55; TODO: For now we assume serial device do not produce verify errors
     56    call    AH4h_CalculateNumberOfSuccessfullyVerifiedSectors
     57
     58ALIGN JUMP_ALIGN
     59.AllSectorsVerifiedSuccessfully:
    4660    jmp     SHORT AH42h_ReturnFromInt13hAfterStoringErrorCodeFromAHandTransferredSectorsFromCX
Note: See TracChangeset for help on using the changeset viewer.