Changeset 589 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Initialization


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.
Location:
trunk/XTIDE_Universal_BIOS/Src/Initialization
Files:
6 edited

Legend:

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

    r587 r589  
    3737AdvAtaInit_DetectControllerForIdeBaseInBX:
    3838    call    Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent
    39     jne     SHORT .NoAdvancedControllerForPortBX
     39    jnz     SHORT .NoVisionControllerFound
     40
    4041    call    Vision_DoesIdePortInBXbelongToControllerWithIDinAX
    41     jne     SHORT .NoAdvancedControllerForPortBX
     42    jz      SHORT .AdvancedControllerFoundForPortBX
     43
     44.NoVisionControllerFound:
    4245    call    PDC20x30_DetectControllerForIdeBaseInBX
    4346    jnc     SHORT .NoAdvancedControllerForPortBX
    4447
    45     stc     ; Advanced Controller found for port BX
     48.AdvancedControllerFoundForPortBX:
     49    stc
    4650    ret
    4751
    4852.NoAdvancedControllerForPortBX:
    49     xor     ax, ax
     53    xor     ax, ax      ; Clear ID in AX and CF
    5054    ret
    5155
     
    6670AdvAtaInit_GetControllerMaxPioModeToALandMinPioCycleTimeToBX:
    6771    cmp     ah, ID_QD6580_ALTERNATE
     72%ifdef USE_386
     73    jae     Vision_GetMaxPioModeToALandMinCycleTimeToBX
     74    jmp     PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX
     75%else
    6876    jae     SHORT .Vision
    6977    jmp     PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX
    7078.Vision:
    7179    jmp     Vision_GetMaxPioModeToALandMinCycleTimeToBX
     80%endif
    7281
    7382
     
    8897    test    ax, ax
    8998    jz      SHORT .NoAdvancedController ; Return with CF cleared
    90    
     99
    91100    cmp     ah, ID_QD6580_ALTERNATE
    92101    jae     SHORT .Vision
     
    98107
    99108    call    AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI
    100     call    Vision_InitializeWithIDinAHandConfigInAL
     109    call    Vision_InitializeWithIDinAH
    101110    xor     ax, ax                      ; Success
    102111
     
    116125;               Zero if Slave Drive not present
    117126;   Corrupts registers:
    118 ;       AX
     127;       AL
    119128;--------------------------------------------------------------------
    120129AdvAtaInit_LoadMasterDPTtoDSSIifSlaveInDSDI:
  • 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
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta/Vision.asm

    r582 r589  
    2929;       AX:     ID WORD specific for QDI Vision Controllers
    3030;               (AL = QD65xx Config Register contents)
    31 ;               (AH = QDI Vision Controller ID (bits 4...7))
     31;               (AH = QDI Vision Controller ID)
    3232;       DX:     Controller port (not IDE port)
    3333;       ZF:     Set if controller found
     
    4646    ; from Axh to Bxh.
    4747    call    IsConfigRegisterWithIDinAL
    48     je      SHORT VisionControllerDetected
     48    je      SHORT VisionControllerDetected.Return
    4949
    5050    ; Check QD65xx alternative base port
    51     or      dl, QD65XX_ALTERNATIVE_BASE_PORT
     51    mov     dl, QD65XX_ALTERNATIVE_BASE_PORT
    5252    in      al, QD65XX_ALTERNATIVE_BASE_PORT + QD65XX_CONFIG_REGISTER_in
    5353%endif ; DANGEROUS_DETECTION
     
    6868    mov     ah, al
    6969    and     al, MASK_QDCONFIG_CONTROLLER_ID
    70     cmp     al, ID_QD6500 << 4
     70    cmp     al, ID_QD6500
    7171    je      SHORT VisionControllerDetected
    72     cmp     al, ID_QD6580 << 4
     72    cmp     al, ID_QD6580
    7373    je      SHORT VisionControllerDetected
    74     cmp     al, ID_QD6580_ALTERNATE << 4
     74    cmp     al, ID_QD6580_ALTERNATE
    7575VisionControllerDetected:
    7676    xchg    ah, al
     77.Return:
    7778    ret
    7879
     
    8283;   Parameters:
    8384;       AL:     QD65xx Config Register contents
    84 ;       AH:     QDI Vision Controller ID (bits 4...7)
     85;       AH:     QDI Vision Controller ID
    8586;       BX:     IDE Base port to check
    8687;       DX:     Vision Controller port
     
    9293;--------------------------------------------------------------------
    9394Vision_DoesIdePortInBXbelongToControllerWithIDinAX:
    94     cmp     ah, ID_QD6500 << 4
     95    cmp     ah, ID_QD6500
    9596    je      SHORT .DoesIdePortInDXbelongToQD6500
    9697
     
    128129;   Parameters:
    129130;       AL:     QD65xx Config Register contents
    130 ;       AH:     QDI Vision Controller ID (bits 4...7)
     131;       AH:     QDI Vision Controller ID
    131132;   Returns:
    132133;       AL:     Max supported PIO mode
     
    139140;--------------------------------------------------------------------
    140141Vision_GetMaxPioModeToALandMinCycleTimeToBX:
    141     cmp     ah, ID_QD6500 << 4
     142    cmp     ah, ID_QD6500
    142143    jne     SHORT .NoNeedToLimitForQD6580
    143144
     
    149150
    150151;--------------------------------------------------------------------
    151 ; Vision_InitializeWithIDinAHandConfigInAL
    152 ;   Parameters:
    153 ;       AL:     QD65xx Config Register contents
    154 ;       AH:     QDI Vision Controller ID (bits 4...7)
     152; Vision_InitializeWithIDinAH
     153;   Parameters:
     154;       AH:     QDI Vision Controller ID
    155155;       DS:DI:  Ptr to DPT for Single or Slave Drive
    156156;       SI:     Offset to Master DPT if Slave Drive present
     
    162162;       AX, BX, CX, DX, BP
    163163;--------------------------------------------------------------------
    164 Vision_InitializeWithIDinAHandConfigInAL:
     164Vision_InitializeWithIDinAH:
    165165    ; QD6580 has a Control Register that needs to be programmed
    166     cmp     ah, ID_QD6500 << 4
     166    cmp     ah, ID_QD6500
    167167    mov     dx, [di+DPT_ADVANCED_ATA.wControllerBasePort]
    168168    mov     bp, QD6500_MAX_ACTIVE_TIME_CLOCKS | (QD6500_MIN_ACTIVE_TIME_CLOCKS << 8)    ; Assume QD6500
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm

    r580 r589  
    8181    mov     al, [cs:ROMVARS.wFlags]         ; Configurator set to always scan?
    8282    or      al, [es:BDA.bKBFlgs1]           ; Or, did the user hold down the ALT key?
    83     and     al, 8                           ; 8 = alt key depressed, same as FLG_ROMVARS_SERIAL_ALWAYSDETECT
     83    and     al, 8                           ; 8 = alt key depressed, same as FLG_ROMVARS_SERIAL_SCANDETECT
    8484    jnz     .DriveDetectLoop
    8585%endif ; MODULE_SERIAL
     
    135135
    136136    shr     ch, 1                           ; number of drives, 1 or 2 only, to CF flag (clear=1, set=2)
    137     rcl     al, 1                           ; starting drive number in upper 7 bits, number of drives in low bit
     137    eRCL_IM al, 1                           ; starting drive number in upper 7 bits, number of drives in low bit
    138138.NoFloppies:
    139139    mov     [RAMVARS.xlateVars+XLATEVARS.bFlopCntAndFirst], al
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectPrint.asm

    r568 r589  
    9090%ifdef MODULE_SERIAL
    9191    cmp     dh, DEVICE_SERIAL_PORT          ; Check if this is a serial device
    92 
    93     jnz     .pushAndPrint                   ; CX = string to print, AX = port address, DX won't be used
     92    jne     SHORT .pushAndPrint             ; CX = string to print, AX = port address, DX won't be used
    9493
    9594    mov     cl, (g_szDetectCOM-$$) & 0xff   ; Setup print string for COM ports
     
    106105
    107106    test    dl, dl                          ; Check if serial port "Auto"
    108     jz      .pushAndPrintSerial             ; CX = string to print, AX and DX won't be used
     107    jz      SHORT .pushAndPrintSerial       ; CX = string to print, AX and DX won't be used
    109108
    110109    mov     cl, (g_szDetectCOMLarge-$$) & 0xff  ; Setup secondary print string for "COMn/xx.yK"
    111110
    112     mov     al,ah                           ; baud rate divisor to AL
     111    mov     al, ah                          ; baud rate divisor to AL
    113112    cbw                                     ; clear AH, AL will always be less than 128
    114     xchg    si,ax                           ; move AX to SI for divide
    115     mov     ax,1152                         ; baud rate to display is 115200/divisor, the "00" is handled
     113    xchg    si, ax                          ; move AX to SI for divide
     114    mov     ax, 1152                        ; baud rate to display is 115200/divisor, the "00" is handled
    116115                                            ; in the print strings
    117116    cwd                                     ; clear top 16-bits of dividend
    118117    div     si                              ; and divide...  Now AX = baud rate/100, DX = 0 (always a clean divide)
    119118
    120     mov     si,10                           ; Now separate the whole portion from the fractional for "K" display
     119    mov     si, 10                          ; Now separate the whole portion from the fractional for "K" display
    121120    div     si                              ; and divide...  Now AX = baud rate/1000, DX = low order digit
    122121
    123     cmp     ax,si                           ; < 10: "2400", "9600", etc.; >= 10: "19.2K", "38.4K", etc.
    124     jae     .pushAndPrintSerial
     122    cmp     ax, si                          ; < 10: "2400", "9600", etc.; >= 10: "19.2K", "38.4K", etc.
     123    jae     SHORT .pushAndPrintSerial
    125124
    126125    mov     cl, (g_szDetectCOMSmall-$$) & 0xff  ; Setup secondary print string for "COMn/XXy00"
     
    150149DetectPrint_DriveNameFromDrvDetectInfoInESBX:
    151150    push    bp
    152     mov     bp,sp
    153     lea     si,[bx+DRVDETECTINFO.szDrvName]
     151    mov     bp, sp
     152    lea     si, [bx+DRVDETECTINFO.szDrvName]
    154153    push    si
    155     mov     si,g_szDriveName
     154    mov     si, g_szDriveName
    156155    jmp     SHORT DetectPrint_FormatCSSIfromParamsInSSBP
    157156
     
    276275;
    277276    push    bp
    278     mov     bp,sp
     277    mov     bp, sp
    279278    ; Fall to DetectPrint_FormatCSSIfromParamsInSSBP
    280279
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/Interrupts.asm

    r580 r589  
    240240    push    cx
    241241    xchg    ax, cx              ; IRQ index to CL
    242     mov     ch, 1               ; Load 1 to be shifted
    243     shl     ch, cl              ; Shift bit to correct position
    244     not     ch                  ; Invert to create bit mask for clearing
     242    mov     ch, ~1              ; Load bit mask to be rotated
     243    rol     ch, cl              ; Rotate mask to correct position for clearing
    245244    in      al, dx              ; Read Interrupt Mask Register
    246245    and     al, ch              ; Clear wanted bit
Note: See TracChangeset for help on using the changeset viewer.