Changeset 589 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Device/IDE


Ignore:
Timestamp:
May 22, 2016, 12:26:57 PM (9 years ago)
Author:
Krister Nordvall
Message:

Changes:

  • BIOS: Fixed a purely cosmetic bug from r542 where, in builds containing MODULE_EBIOS, the boot menu would display an incorrect drive size (0.4 kB with MODULE_STRINGS_COMPRESSED or 0.5 kB without) for old drives with no support for LBA.
  • Fixed a bug from r392 where Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent would return the ID in AL instead of AH (if DANGEROUS_DETECTION had been defined).
  • Fixed a bug from r587 in AdvAtaInit.asm that would prevent detection of QDI Vision controllers.
  • Also changed how the QDI Vision IDs are defined (removed the need for shifting) to avoid confusion. This fixed a potential bug from r587 in AdvAtaInit.asm where some IDs were not being shifted.
  • Fixed a bug in PDC20x30.asm from r587 where GetPdcIDtoAX would not return with the IDE base port in DX so DisablePdcProgrammingMode would fail.
  • Made some changes to ModuleDependency.inc and other files so that MODULE_ADVANCED_ATA now requires USE_386. Consequently it is no longer included in the regular AT-builds, only in the 386_8k-build.
  • Moved the UNROLL_SECTORS_IN_CX_TO_xWORDS macros from IDE_8bit.inc to IdeIO.inc which means it's now possible to build a BIOS without MODULE_8BIT_IDE.
  • XTIDECFG: Added a minimum DOS version check (since it needs DOS version 2+) to allow the program to quit gracefully in the unlikely scenario where someone tries to run it under DOS version 1.
  • Made some changes to Drive.asm to improve drive enumeration. The old method using GET_DOS_DRIVE_PARAMETER_BLOCK_FOR_SPECIFIC_DRIVE worked well in Windows XP but not in Windows 98 SE (in Windows or in DOS mode). The two problems were; 1) The function call would access the drives which on single floppy drive systems would cause Windows to swap between A: and B: (throwing a blue screen asking the user to insert a disk etc). 2) Only floppy drives and FAT16 drives would be available in the list of drives, no FAT32/optical/network drives.
  • Improved code in IdeControllerMenu.asm so that the default port addresses for all IDE interfaces are now restored when (re-)selecting the (same) type of IDE device.
  • Also made it impossible to select a device type unless the required module is included in the loaded BIOS.
  • The version check done when loading a BIOS now uses the FLASH_SIGNATURE definition from Version.inc. Any changes affecting RomVars now only requires updating that definition. This means that changes to RomVars must be implemented in both the BIOS and XTIDECFG before being committed to the repository.
  • Added a compatibility fix for 3Com 3C503 cards to the ROM checksumming code in Buffers.asm (Buffers_GenerateChecksum).
  • SerDrive: Made some minor changes to file names and paths to improve compatibility with case sensitive environments.
  • BIOSDRVS: Made a minor size optimization which as a side effect also makes it compatible with all DOS versions including DOS version 1.
  • Library: Renamed the WAIT_RETRACE_IF_NECESSARY_THEN macro to CALL_WAIT_FOR_RETRACE_IF_NECESSARY_THEN and made a tail-call-optimized version of it (JMP_WAIT_FOR_RETRACE_IF_NECESSARY_THEN).
  • A speed optimization to the eRCL_IM macro for 386 and higher. This change breaks emulation in the sense that the macro will fail when given a memory operand as the first parameter.
  • Other minor optimizations and fixes.
Location:
trunk/XTIDE_Universal_BIOS/Src/Device/IDE
Files:
4 edited

Legend:

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

    r584 r589  
    3333IdeCommand_ResetMasterAndSlaveController:
    3434    ; HSR0: Set_SRST
    35     call    AccessDPT_GetDeviceControlByteToAL
    36     or      al, FLG_DEVCONTROL_SRST | FLG_DEVCONTROL_nIEN   ; Set Reset bit
     35; Used to be:
     36;   call    AccessDPT_GetDeviceControlByteToAL
     37;   or      al, FLG_DEVCONTROL_SRST | FLG_DEVCONTROL_nIEN   ; Set Reset bit
     38; Is now:
     39    mov     al, FLG_DEVCONTROL_SRST | FLG_DEVCONTROL_nIEN
     40; ---
    3741    OUTPUT_AL_TO_IDE_CONTROL_BLOCK_REGISTER     DEVICE_CONTROL_REGISTER_out
    3842    mov     ax, HSR0_RESET_WAIT_US
     
    4044
    4145    ; HSR1: Clear_wait
    42     call    AccessDPT_GetDeviceControlByteToAL
    43     or      al, FLG_DEVCONTROL_nIEN
    44     and     al, ~FLG_DEVCONTROL_SRST                        ; Clear reset bit
     46; Used to be:
     47;   call    AccessDPT_GetDeviceControlByteToAL
     48;   or      al, FLG_DEVCONTROL_nIEN
     49;   and     al, ~FLG_DEVCONTROL_SRST                        ; Clear reset bit
     50; Is now:
     51    mov     al, FLG_DEVCONTROL_nIEN
     52; ---
    4553    OUTPUT_AL_TO_IDE_CONTROL_BLOCK_REGISTER     DEVICE_CONTROL_REGISTER_out
    4654    mov     ax, HSR1_RESET_WAIT_US
     
    5159    jmp     IdeWait_PollStatusFlagInBLwithTimeoutInBH
    5260
     61; *FIXME* AccessDPT_GetDeviceControlByteToAL currently always returns with
     62; AL cleared (0) or with only bit 1 set (FLG_DEVCONTROL_nIEN = 2).
     63; The commented away instructions above sets FLG_DEVCONTROL_nIEN anyway
     64; making the call to AccessDPT_GetDeviceControlByteToAL redundant.
     65; I have left this code as is since I don't know if it's a mistake
     66; (from all the way back to r150) or if it's coded this way in anticipation
     67; of some future changes to AccessDPT_GetDeviceControlByteToAL.
    5368
    5469;--------------------------------------------------------------------
  • trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDmaBlock.asm

    r567 r589  
    9494    ; When DI is zero only one transfer is required since we've limited the
    9595    ; XT-CFv3 block size to 32k
    96     jnc     SHORT .TransferLastDmaPageWithSizeInCX
     96    jnc     SHORT StartDMAtransferForXTCFwithDmaModeInBL
    9797
    9898    ; CF was set, so DI != 0 and we might need one or two transfers
    99     cmp     cx, ax                                  ; if we won't cross a physical page boundary...
    100     jbe     SHORT .TransferLastDmaPageWithSizeInCX  ; ...perform the transfer in one operation
     99    cmp     cx, ax                                          ; if we won't cross a physical page boundary...
     100    jbe     SHORT StartDMAtransferForXTCFwithDmaModeInBL    ; ...perform the transfer in one operation
    101101
    102102    ; Calculate how much we can transfer on first and second rounds
     
    108108    call    StartDMAtransferForXTCFwithDmaModeInBL
    109109    pop     cx                                      ; Pop size for second DMA page
    110 
    111 .TransferLastDmaPageWithSizeInCX:
    112110    ; Fall to StartDMAtransferForXTCFwithDmaModeInBL
    113111
     
    115113;--------------------------------------------------------------------
    116114; StartDMAtransferForXTCFwithDmaModeInBL
    117 ; Updated for XT-CFv3, 11-Apr-13
    118115;   Parameters:
    119116;       BL:     Byte for DMA Mode Register
  • trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdePioBlock.asm

    r580 r589  
    2929; --------------------------------------------------------------------------------------------------
    3030
    31 
    3231%ifdef MODULE_8BIT_IDE
    33 
    3432;--------------------------------------------------------------------
    3533; IdePioBlock_ReadFromXtideRev1
     
    5755
    5856;--------------------------------------------------------------------
     57; 8-bit PIO from a single data port.
     58;
    5959; IdePioBlock_ReadFrom8bitDataPort
    60 ;
    61 ; 8-bit PIO from a single data port.
    62 ;
    6360;   Parameters:
    6461;       CX:     Block size in 512 byte sectors
     
    6865;       Nothing
    6966;   Corrupts registers:
    70 ;       AX, BX, CX
     67;       AX, CX
    7168;--------------------------------------------------------------------
    7269ALIGN JUMP_ALIGN
     
    8784    ret
    8885%endif
    89 
    90 %endif  ; MODULE_8BIT_IDE
    91 
    92 
    93 ;--------------------------------------------------------------------
     86%endif ; MODULE_8BIT_IDE
     87
     88
     89;--------------------------------------------------------------------
     90; 16-bit and 32-bit PIO from a single data port.
     91;
    9492; IdePioBlock_ReadFrom16bitDataPort
    95 ;
    96 ; 16-bit PIO from a single data port.
    97 ;
     93; IdePioBlock_ReadFrom32bitDataPort
    9894;   Parameters:
    9995;       CX:     Block size in 512 byte sectors
     
    10399;       Nothing
    104100;   Corrupts registers:
    105 ;       AX, BX, CX
     101;       AX, CX
    106102;--------------------------------------------------------------------
    107103ALIGN JUMP_ALIGN
    108104IdePioBlock_ReadFrom16bitDataPort:
    109105%ifdef USE_186
    110     xchg    cl, ch  ; Sectors to WORDs
     106    xchg    cl, ch      ; Sectors to WORDs
    111107    rep insw
    112108    ret
     
    126122
    127123;--------------------------------------------------------------------
     124%ifdef MODULE_ADVANCED_ATA
    128125ALIGN JUMP_ALIGN
    129126IdePioBlock_ReadFrom32bitDataPort:
    130     db      0C1h        ; SHL
    131     db      0E1h        ; CX
    132     db      7           ; 7 (Sectors to DWORDs)
    133     rep
    134     db      66h         ; Override operand size to 32-bit
    135     db      6Dh         ; INSW/INSD
    136     ret
    137 
     127    shl     cx, 7       ; Sectors to DWORDs
     128    rep insd
     129    ret
     130%endif ; MODULE_ADVANCED_ATA
    138131
    139132
     
    145138
    146139%ifdef MODULE_8BIT_IDE
    147 
    148140;--------------------------------------------------------------------
    149141; IdePioBlock_WriteToXtideRev1
     
    151143;       CX:     Block size in 512-byte sectors
    152144;       DX:     IDE Data port address
    153 ;       ES:SI:  Normalized ptr to buffer containing data
     145;       DS:SI:  Normalized ptr to buffer containing data
    154146;   Returns:
    155147;       Nothing
     
    159151ALIGN JUMP_ALIGN
    160152IdePioBlock_WriteToXtideRev1:
    161     push    ds
    162153    UNROLL_SECTORS_IN_CX_TO_QWORDS
    163154    mov     bl, 8       ; Bit mask for toggling data low/high reg
    164     push    es
    165     pop     ds
    166155ALIGN JUMP_ALIGN
    167156.OutswLoop:
     
    170159    %endrep
    171160    loop    .OutswLoop
    172     pop     ds
    173161    ret
    174162
     
    179167;       CX:     Block size in 512-byte sectors
    180168;       DX:     IDE Data port address
    181 ;       ES:SI:  Normalized ptr to buffer containing data
    182 ;   Returns:
    183 ;       Nothing
    184 ;   Corrupts registers:
    185 ;       AX, BX, CX
     169;       DS:SI:  Normalized ptr to buffer containing data
     170;   Returns:
     171;       Nothing
     172;   Corrupts registers:
     173;       AX, CX
    186174;--------------------------------------------------------------------
    187175ALIGN JUMP_ALIGN
    188176IdePioBlock_WriteToXtideRev2:
    189177    UNROLL_SECTORS_IN_CX_TO_QWORDS
    190     push    ds
    191     push    es
    192     pop     ds
    193178ALIGN JUMP_ALIGN
    194179.WriteNextQword:
     
    197182    %endrep
    198183    loop    .WriteNextQword
    199     pop     ds
    200184    ret
    201185
     
    206190;       CX:     Block size in 512-byte sectors
    207191;       DX:     IDE Data port address
    208 ;       ES:SI:  Normalized ptr to buffer containing data
    209 ;   Returns:
    210 ;       Nothing
    211 ;   Corrupts registers:
    212 ;       AX, BX, CX
     192;       DS:SI:  Normalized ptr to buffer containing data
     193;   Returns:
     194;       Nothing
     195;   Corrupts registers:
     196;       AX, CX
    213197;--------------------------------------------------------------------
    214198ALIGN JUMP_ALIGN
     
    216200%ifdef USE_186
    217201    shl     cx, 9       ; Sectors to BYTEs
    218     es                  ; Source is ES segment
    219202    rep outsb
    220203    ret
     
    222205%else ; 808x
    223206    UNROLL_SECTORS_IN_CX_TO_QWORDS
    224     push    ds
    225     push    es
    226     pop     ds
    227207ALIGN JUMP_ALIGN
    228208.WriteNextQword:
     
    232212    %endrep
    233213    loop    .WriteNextQword
    234     pop     ds
    235     ret
    236 %endif
    237 
     214    ret
     215%endif
    238216%endif ; MODULE_8BIT_IDE
    239217
     
    245223;       CX:     Block size in 512-byte sectors
    246224;       DX:     IDE Data port address
    247 ;       ES:SI:  Normalized ptr to buffer containing data
    248 ;   Returns:
    249 ;       Nothing
    250 ;   Corrupts registers:
    251 ;       AX, BX, CX
     225;       DS:SI:  Normalized ptr to buffer containing data
     226;   Returns:
     227;       Nothing
     228;   Corrupts registers:
     229;       AX, CX
    252230;--------------------------------------------------------------------
    253231ALIGN JUMP_ALIGN
     
    255233%ifdef USE_186
    256234    xchg    cl, ch      ; Sectors to WORDs
    257     es                  ; Source is ES segment
    258235    rep outsw
    259236    ret
     
    261238%else ; 808x
    262239    UNROLL_SECTORS_IN_CX_TO_QWORDS
    263     push    ds
    264     push    es
    265     pop     ds
    266240ALIGN JUMP_ALIGN
    267241.WriteNextQword:
     
    271245    %endrep
    272246    loop    .WriteNextQword
    273     pop     ds
    274     ret
    275 %endif
    276 
    277 ;--------------------------------------------------------------------
     247    ret
     248%endif
     249
     250;--------------------------------------------------------------------
     251%ifdef MODULE_ADVANCED_ATA
    278252ALIGN JUMP_ALIGN
    279253IdePioBlock_WriteTo32bitDataPort:
    280     db      0C1h        ; SHL
    281     db      0E1h        ; CX
    282     db      7           ; 7 (Sectors to DWORDs)
    283     es                  ; Source is ES segment
    284     rep
    285     db      66h         ; Override operand size to 32-bit
    286     db      6Fh         ; OUTSW/OUTSD
    287     ret
     254    shl     cx, 7       ; Sectors to DWORDs
     255    rep outsd
     256    ret
     257%endif ; MODULE_ADVANCED_ATA
  • trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm

    r584 r589  
    173173    cmp     [bp+PIOVARS.bSectorsLeft], cl
    174174    jbe     SHORT .WriteLastBlockToDrive
     175    push    ds
     176    push    es
     177    pop     ds
    175178    call    [bp+PIOVARS.fnXfer]
    176 
     179    pop     ds
    177180    ; Wait until ready for next block and check for errors
    178181    call    IdeWait_IRQorDRQ                    ; Wait until ready to transfer
     
    189192    mov     cl, [bp+PIOVARS.bSectorsLeft]       ; CH is already zero
    190193    push    cx
     194    push    ds
     195    push    es
     196    pop     ds
    191197    call    [bp+PIOVARS.fnXfer]                 ; Transfer possibly partial block
     198    pop     ds
    192199    jmp     SHORT CheckErrorsAfterTransferringLastBlock
    193200
     
    237244    ; Convert ES:SI to physical address
    238245%ifdef USE_386
    239 
    240246    mov     dx, es
    241247    xor     ax, ax
     
    247253
    248254%elifdef USE_186
    249                         ; Bytes EU Cycles(286)
    250     mov     ax, es      ; 2     2
    251     rol     ax, 4       ; 3     9
    252     mov     dx, ax      ; 2     2
    253     and     ax, BYTE 0Fh; 3     3
    254     xor     dx, ax      ; 2     2
    255     add     si, dx      ; 2     2
    256     adc     al, ah      ; 2     2
    257     mov     es, ax      ; 2     2
    258     ;------------------------------------
    259                         ; 18    24
     255    mov     ax, es
     256    rol     ax, 4
     257    mov     dx, ax
     258    and     ax, 0Fh
     259    xor     dx, ax
     260    add     si, dx
     261    adc     al, ah
     262    mov     es, ax
     263
    260264%else ; 808x
    261                         ; Bytes EU Cycles(808x)
    262     mov     al, 4       ; 2     4
    263     mov     dx, es      ; 2     2
    264     xchg    cx, ax      ; 1     3
    265     rol     dx, cl      ; 2     24
    266     mov     cx, dx      ; 2     2
    267     xchg    cx, ax      ; 1     3
    268     and     ax, BYTE 0Fh; 3     4
    269     xor     dx, ax      ; 2     3
    270     add     si, dx      ; 2     3
    271     adc     al, ah      ; 2     3
    272     mov     es, ax      ; 2     2
    273     ;------------------------------------
    274                         ; 21    53
    275 ;
    276 ; Judging by the Execution Unit cycle count the above block of code is
    277 ; apparently slower. However, the shifts and rotates in the block below
    278 ; execute faster than the Bus Interface Unit on an 8088 can fetch them,
    279 ; thus causing the EU to starve. The difference in true execution speed
    280 ; (if any) might not be worth the extra 5 bytes.
    281 ; In other words, we could use a real world test here.
    282 ;
    283 %if 0
    284                         ; Bytes EU Cycles(808x/286)
    285     xor     dx, dx      ; 2     3/2
    286     mov     ax, es      ; 2     2/2
    287 %rep 4
    288     shl     ax, 1       ; 8     8/8
    289     rcl     dx, 1       ; 8     8/8
    290 %endrep
    291     add     si, ax      ; 2     3/2
    292     adc     dl, dh      ; 2     3/2
    293     mov     es, dx      ; 2     2/2
    294     ;------------------------------------
    295                         ; 26    29/26
    296 %endif ; 0
     265    mov     al, 4
     266    mov     dx, es
     267    xchg    cx, ax
     268    rol     dx, cl
     269    mov     cx, dx
     270    xchg    cx, ax
     271    and     ax, 0Fh
     272    xor     dx, ax
     273    add     si, dx
     274    adc     al, ah
     275    mov     es, ax
     276
    297277%endif
    298278
     
    334314%ifdef USE_AT       ; CF is always clear for XT builds
    335315    ; AH = RET_HD_INVALID (01) if CF set, RET_HD_SUCCESS (00) if not. CF unchanged.
     316%ifdef USE_386
     317    setc    ah
     318%else
    336319    sbb     ah, ah
    337320    neg     ah
    338321%endif
     322%endif ; USE_AT
    339323    ret
    340324
     
    345329g_rgfnPioRead:
    346330        dw      IdePioBlock_ReadFrom16bitDataPort   ; 0, DEVICE_16BIT_ATA
     331%ifdef MODULE_ADVANCED_ATA
    347332        dw      IdePioBlock_ReadFrom32bitDataPort   ; 1, DEVICE_32BIT_ATA
     333%elifdef MODULE_8BIT_IDE
     334        dw      NULL
     335%endif ; MODULE_ADVANCED_ATA
    348336%ifdef MODULE_8BIT_IDE
    349337        dw      IdePioBlock_ReadFrom8bitDataPort    ; 2, DEVICE_8BIT_ATA
     
    361349g_rgfnPioWrite:
    362350        dw      IdePioBlock_WriteTo16bitDataPort    ; 0, DEVICE_16BIT_ATA
     351%ifdef MODULE_ADVANCED_ATA
    363352        dw      IdePioBlock_WriteTo32bitDataPort    ; 1, DEVICE_32BIT_ATA
     353%elifdef MODULE_8BIT_IDE
     354        dw      NULL
     355%endif ; MODULE_ADVANCED_ATA
    364356%ifdef MODULE_8BIT_IDE
    365357        dw      IdePioBlock_WriteTo8bitDataPort     ; 2, DEVICE_8BIT_ATA
Note: See TracChangeset for help on using the changeset viewer.