Ignore:
Timestamp:
May 22, 2016, 12:26:57 PM (8 years ago)
Author:
krille_n_
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.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta/PDC20x30.asm

    r588 r589  
    3636    mov     dx, bx
    3737    call    EnablePdcProgrammingMode
    38     jz      .ControllerDetected
    39     clc
    40     ret
    41 .ControllerDetected:
    42     call    GetPdcIDtoAX
     38    jnz     SHORT DisablePdcProgrammingMode.Return  ; PDC controller not detected
     39;   ePUSH_T ax, DisablePdcProgrammingMode           ; Uncomment this if GetPdcIDtoAX needs to be a real function
     40    ; Fall to GetPdcIDtoAX
     41
     42;--------------------------------------------------------------------
     43; Programming mode must be enabled for this function.
     44; This function also enables PDC 20630 extra registers.
     45;
     46; GetPdcIDtoAX
     47;   Parameters:
     48;       DX:     IDE Base port
     49;   Returns:
     50;       AH:     PDC ID
     51;   Corrupts registers:
     52;       AL, BX
     53;--------------------------------------------------------------------
     54GetPdcIDtoAX:
     55    push    dx
     56
     57    ; Try to enable PDC 20630 extra registers
     58    add     dx, BYTE LOW_CYLINDER_REGISTER
     59    in      al, dx
     60    or      al, FLG_PDCLCR_ENABLE_EXTRA_REGISTERS
     61    out     dx, al
     62
     63    ; Try to access PDC 20630 registers to see if they are available
     64    ; Hopefully this does not cause problems for systems with PDC 20230
     65    add     dx, BYTE PDC20630_INDEX_REGISTER - LOW_CYLINDER_REGISTER
     66    mov     al, PDCREG7_STATUS  ; Try to access PDC 20630 status register
     67    out     dx, al
     68    xchg    bx, ax
     69    in      al, dx              ; Does index register contain status register index?
     70    cmp     al, bl
     71    mov     ah, ID_PDC20630
     72    eCMOVNE ah, ID_PDC20230
     73
     74    pop     dx
     75;   ret                         ; Uncomment this to make GetPdcIDtoAX a real function
    4376    ; Fall to DisablePdcProgrammingMode
    4477
     
    4982;       DX:     Base port
    5083;   Returns:
    51 ;       Nothing
     84;       CF:     Set
    5285;   Corrupts registers:
    5386;       AL
     
    5689    add     dx, BYTE HIGH_CYLINDER_REGISTER
    5790    in      al, dx
    58     sub     dx, BYTE HIGH_CYLINDER_REGISTER
    59     stc     ; Set for PDC20x30_DetectControllerForIdeBaseInBX
     91    add     dx, -HIGH_CYLINDER_REGISTER     ; Sets CF for PDC20x30_DetectControllerForIdeBaseInBX
     92.Return:
    6093    ret
    6194
     
    6699;       DX:     Base port
    67100;   Returns:
     101;       CF:     Cleared
    68102;       ZF:     Set if programming mode enabled
    69103;   Corrupts registers:
     
    72106EnablePdcProgrammingMode:
    73107    ; Set bit 7 to sector count register
    74     add     dx, BYTE SECTOR_COUNT_REGISTER
    75     in      al, dx
     108    inc     dx
     109    inc     dx
     110    in      al, dx  ; 1F2h (SECTOR_COUNT_REGISTER)
    76111    or      al, 80h
    77112    out     dx, al
     
    93128    ; PDC20230C and PDC20630 clears the bit we set at the beginning
    94129    in      al, dx
    95     sub     dx, BYTE SECTOR_COUNT_REGISTER
    96     test    al, 80h
    97     ret
    98 
    99 
    100 ;--------------------------------------------------------------------
    101 ; Programming mode must be enabled for this function.
    102 ; This function also enables PDC 20630 extra registers.
    103 ;
    104 ; GetPdcIDtoAX
    105 ;   Parameters:
    106 ;       DX:     IDE Base port
    107 ;   Returns:
    108 ;       AX:     PDC ID word
    109 ;   Corrupts registers:
    110 ;       BX
    111 ;--------------------------------------------------------------------
    112 GetPdcIDtoAX:
    113     ; Try to enable PDC 20630 extra registers
    114     add     dx, BYTE LOW_CYLINDER_REGISTER
    115     in      al, dx
    116     or      al, FLG_PDCLCR_ENABLE_EXTRA_REGISTERS
    117     out     dx, al
    118 
    119     ; Try to access PDC 20630 registers to see if they are available
    120     ; Hopefully this does not cause problems for systems with PDC 20230
    121     add     dx, BYTE PDC20630_INDEX_REGISTER - LOW_CYLINDER_REGISTER
    122     mov     al, PDCREG7_STATUS  ; Try to access PDC 20630 status register
    123     out     dx, al
    124     xchg    bx, ax
    125     in      al, dx              ; Does index register contain status register index?
    126     cmp     al, bl
    127     mov     ah, ID_PDC20630
    128     eCMOVNE ah, ID_PDC20230
     130    dec     dx
     131    dec     dx      ; Base port
     132    test    al, 80h ; Clears CF
    129133    ret
    130134
     
    145149PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX:
    146150    cmp     ah, ID_PDC20630
    147     je      SHORT .return       ; No need to limit anything
     151    je      SHORT .Return       ; No need to limit anything
    148152    mov     ax, 2               ; Limit PIO to 2 for ID_PDC20230
    149153    mov     bx, PIO_2_MIN_CYCLE_TIME_NS
    150154    stc
    151 .return:
     155.Return:
    152156    ret
    153157
     
    165169;--------------------------------------------------------------------
    166170PDC20x30_InitializeForDPTinDSDI:
     171%ifdef USE_386
     172    xor     ch, ch
     173    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
     174    setnz   cl
     175%else
    167176    xor     cx, cx
    168177    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
    169     eCSETNZ cl
     178    jz      SHORT .NotSlave
     179    inc     cx
     180.NotSlave:
     181%endif
    170182
    171183    mov     dx, [di+DPT.wBasePort]
     
    173185    call    SetSpeedForDriveInCX
    174186    cmp     BYTE [di+DPT_ADVANCED_ATA.wControllerID+1], ID_PDC20630
    175     jne     .initializationCompleted
     187    jne     SHORT .InitializationCompleted
    176188    call    SetPdc20630SpeedForDriveInCX
    177 .initializationCompleted:
     189.InitializationCompleted:
    178190    mov     dx, [di+DPT.wBasePort]
    179191    call    DisablePdcProgrammingMode
     
    201213    mov     bh, ~MASK_PDCSCR_DEV1SPEED  ; Assume slave
    202214    inc     cx
    203     loop    .setSpeed
     215    loop    .SetSpeed
    204216    eSHL_IM bl, POS_PDCSCR_DEV0SPEED
    205217    mov     bh, ~MASK_PDCSCR_DEV0SPEED
    206 .setSpeed:
     218.SetSpeed:
    207219    in      al, dx
    208220    and     al, bh
    209221    or      al, bl
    210222    cmp     bl, 7
    211     jb      SHORT OutputNewValue
     223    jb      SHORT .OutputNewValue
    212224    or      al, FLG_PDCSCR_UNKNOWN_BIT7 ; Flag for PIO 2 and above?
    213     jmp     SHORT OutputNewValue
     225.OutputNewValue:
     226    out     dx, al
     227    ret
    214228
    215229.rgbPioModeToPDCspeedValue:
     
    228242;       DX:     Low Cylinder Register
    229243;   Corrupts registers:
    230 ;       AX, CX
     244;       AX
    231245;--------------------------------------------------------------------
    232246SetPdc20630SpeedForDriveInCX:
    233247    inc     dx      ; LOW_CYLINDER_REGISTER
    234     mov     ah, FLG_PDCLCR_DEV0SPEED_BIT4 | FLG_PDCLCR_DEV0IORDY
    235     shr     ah, cl
    236     in      al, dx
    237     not     ah
     248    mov     ah, ~(FLG_PDCLCR_DEV0SPEED_BIT4 | FLG_PDCLCR_DEV0IORDY)
     249    ror     ah, cl
     250    in      al, dx
    238251    and     al, ah  ; Clear drive specific bits
    239252    cmp     BYTE [di+DPT_ADVANCED_ATA.bPioMode], 2
    240     jbe     .clearBitsOnly
     253    jbe     .ClearBitsOnly
    241254    not     ah
    242255    or      al, ah
    243 .clearBitsOnly:
    244 OutputNewValue:
    245     out     dx, al
    246     ret
    247 
     256.ClearBitsOnly:
     257    out     dx, al
     258    ret
     259
Note: See TracChangeset for help on using the changeset viewer.