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/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.