Changeset 592 in xtideuniversalbios for trunk/Assembly_Library/Src/Util


Ignore:
Timestamp:
Jun 25, 2018, 10:29:27 PM (6 years ago)
Author:
Krister Nordvall
Message:

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
Location:
trunk/Assembly_Library/Src/Util
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Assembly_Library/Src/Util/Bit.asm

    r526 r592  
    2424; Bit_GetSetCountToCXfromDXAX
    2525;   Parameters
    26 ;       DX:AX:      Source DWORD
     26;       DX:AX:  Source DWORD
    2727;   Returns:
    2828;       CX:     Number of bits set in DX:AX
     
    5858    push    ax
    5959
    60     xor     cx, cx
     60    mov     cx, -1
    6161ALIGN JUMP_ALIGN
    62 .BitScanLoop:
     62.IncrementCX:
     63    inc     cx
     64.ShiftLoop:
    6365    shr     ax, 1
    64     jz      SHORT .LastBitInCF
    65     adc     cl, ch
    66     jmp     SHORT .BitScanLoop
    67 ALIGN JUMP_ALIGN
    68 .LastBitInCF:
    69     adc     cl, ch
     66    jc      SHORT .IncrementCX
     67    jnz     SHORT .ShiftLoop
    7068
    7169    pop     ax
     
    9593    ret
    9694
     95
    9796;--------------------------------------------------------------------
    9897; Bit_SetToAXfromIndexInCL
     
    115114    pop     dx
    116115    ret
     116
  • trunk/Assembly_Library/Src/Util/Math.asm

    r589 r592  
    3333;       AX
    3434;--------------------------------------------------------------------
    35 %ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG
     35%ifndef EXCLUDE_FROM_XTIDECFG
    3636ALIGN JUMP_ALIGN
    3737Math_DivQWatSSBPbyCX:
    38 %if 1
    39     xor     dx, dx
    40     mov     ax, [bp+6]      ; Load highest divident WORD to DX:AX
    41     div     cx
    42     mov     [bp+6], ax      ; Store quotient
    43 
    44     mov     ax, [bp+4]
    45     div     cx
    46     mov     [bp+4], ax
    47 
    48     mov     ax, [bp+2]
    49     div     cx
    50     mov     [bp+2], ax
    51 
    52     mov     ax, [bp]
    53     div     cx
    54     mov     [bp], ax
    55     ret
    56 %else ; ~1
    57 ; This is about half the size compared to the above code but it's not tested which is why it's commented away.
    5838    push    di
    5939    mov     di, 6
     
    6545    dec     di
    6646    dec     di
    67     jns     .Next
     47    jns     SHORT .Next
    6848    pop     di
    6949    ret
    70 %endif ; 1
    7150%endif
    7251
     
    8362;       Nothing
    8463;--------------------------------------------------------------------
    85 %ifndef EXCLUDE_FROM_XTIDECFG
     64%ifndef EXCLUDE_FROM_XTIDECFG OR EXCLUDE_FROM_BIOSDRVS
    8665ALIGN JUMP_ALIGN
    8766Math_DivDXAXbyCX:
  • trunk/Assembly_Library/Src/Util/Memory.asm

    r580 r592  
    2424; OPTIMIZE_STRING_OPERATION
    2525;   Parameters
    26 ;       %1:     Repeat instruction
    27 ;       %2:     String instruction without size (for example MOVS and not MOVSB or MOVSW)
     26;       %1:     String instruction without size (only MOVS and STOS is supported)
    2827;       CX:     Number of BYTEs to operate
    29 ;       DS:SI:  Ptr to source data
     28;       DS:SI:  Ptr to source data (for MOVS)
    3029;       ES:DI:  Ptr to destination
    3130;   Returns:
     31;       CF:     Cleared
     32;       CX:     Zero
    3233;       SI, DI: Updated by number of bytes operated
    3334;   Corrupts registers:
    3435;       Nothing
    3536;--------------------------------------------------------------------
    36 %macro OPTIMIZE_STRING_OPERATION 2
    37     push    cx
    38 
    39     shr     cx, 1           ; Operate with WORDs for performance
    40     jz  %%HandleRemainingByte
    41     %1      %2w
    42 %%HandleRemainingByte:
    43     jnc     SHORT %%OperationCompleted
    44     %2b
    45 
    46 ALIGN JUMP_ALIGN
    47 %%OperationCompleted:
    48     pop     cx
     37%macro OPTIMIZE_STRING_OPERATION 1
     38    shr     cx, 1
     39    rep     %1w
     40    eRCL_IM cx, 1
     41    rep     %1b
    4942%endmacro
    5043
     
    5750;       ES:DI:  Ptr to destination buffer
    5851;   Returns:
     52;       CF:     Cleared
    5953;       SI, DI: Updated by number of bytes copied
    6054;   Corrupts registers:
    6155;       Nothing
    6256;--------------------------------------------------------------------
    63 %ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
     57%ifndef EXCLUDE_FROM_XUB
    6458ALIGN JUMP_ALIGN
    6559Memory_CopyCXbytesFromDSSItoESDI:
    66     OPTIMIZE_STRING_OPERATION rep, movs
     60    push    cx
     61    OPTIMIZE_STRING_OPERATION movs
     62    pop     cx
    6763    ret
    6864%endif
     
    7773;       Nothing
    7874;   Corrupts registers:
    79 ;       Nothing
     75;       CX
    8076;--------------------------------------------------------------------
    8177%ifdef INCLUDE_MENU_LIBRARY
     
    10298;       DI:     Updated by number of BYTEs stored
    10399;   Corrupts registers:
    104 ;       AX
     100;       AX, CX
    105101;--------------------------------------------------------------------
    106102ALIGN JUMP_ALIGN
     
    118114;       DI:     Updated by number of BYTEs stored
    119115;   Corrupts registers:
    120 ;       Nothing
     116;       CX
    121117;--------------------------------------------------------------------
    122 ALIGN JUMP_ALIGN
    123118Memory_StoreCXbytesFromAccumToESDI:
    124     OPTIMIZE_STRING_OPERATION rep, stos
     119    OPTIMIZE_STRING_OPERATION stos
    125120    ret
    126121
     
    135130;       AX
    136131;--------------------------------------------------------------------
    137 %ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
     132%ifndef EXCLUDE_FROM_XUB
    138133ALIGN JUMP_ALIGN
    139134Memory_ReserveCXbytesFromStackToDSSI:
  • trunk/Assembly_Library/Src/Util/Reboot.asm

    r526 r592  
    4444    mov     al, 0FEh                ; System reset (AT+ keyboard controller)
    4545    out     64h, al                 ; Reset computer (AT+)
    46 %ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
     46%ifndef EXCLUDE_FROM_XUB
    4747    %ifdef INCLUDE_TIME_LIBRARY
    4848        mov     ax, 10
  • trunk/Assembly_Library/Src/Util/Registers.asm

    r526 r592  
    5959%endif
    6060
    61 %ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
     61%ifndef EXCLUDE_FROM_XUB
    6262ALIGN JUMP_ALIGN
    6363Registers_CopySSBPtoDSSI:
     
    9191;
    9292;--------------------------------------------------------------------
    93 %ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG
     93%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_XTIDECFG
    9494ALIGN JUMP_ALIGN
    9595Registers_NormalizeESSI:
    9696    mov         cx, si
    97     and         si, byte 0fh
    98     jmp         Registers_NormalizeFinish
     97    and         si, BYTE 0Fh
     98    jmp         SHORT Registers_NormalizeFinish
    9999
    100100ALIGN JUMP_ALIGN
    101101Registers_NormalizeESDI:
    102102    mov         cx, di
    103     and         di, byte 0fh
     103    and         di, BYTE 0Fh
    104104;;; fall-through
    105105
  • trunk/Assembly_Library/Src/Util/Size.asm

    r580 r592  
    7070    jae     SHORT Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
    7171    add     sp, BYTE 2                  ; Clean return address from stack
    72     xchg    si, cx                      ; CX = Remainder (0...1023), SI = Magnitude
    7372
    7473    ; Convert remainder to tenths
    75     xchg    bx, ax                      ; Store AX
    76     mov     al, 5                       ; AH = 0
    77     mul     cx                          ; DX:AX = remainder * (10 / 2)
    78 %ifdef USE_186
    79     shr     ax, 9                       ; Divide AX by (1024 / 2)
    80 %else
    81     shr     ax, 1
    82     mov     al, ah
    83     cbw
    84 %endif
    85     xchg    cx, ax                      ; CX = tenths
    86     xchg    ax, bx
     74    mov     bx, 640
     75    xchg    bx, ax                      ; BX = Size, AX = (10 / 1024) * 65536
     76    mul     si                          ; DX = Remainder * (10 / 1024)
     77    xchg    dx, ax
     78    xchg    cx, ax                      ; CX = Tenths, AX = Magnitude
     79    xchg    bx, ax                      ; AX = Size, BX = Magnitude
    8780
    8881    ; Convert magnitude to character
    89     mov     dl, [cs:si+.rgbMagnitudeToChar]
     82    mov     dl, [cs:bx+.rgbMagnitudeToChar]
    9083
    9184    pop     si
     
    154147;       Nothing
    155148;--------------------------------------------------------------------
    156 %ifdef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
     149%ifdef EXCLUDE_FROM_XUB
    157150    %ifdef USE_386
    158151        %define EXCLUDE
  • trunk/Assembly_Library/Src/Util/Sort.asm

    r526 r592  
    6363    push    cx
    6464
     65%ifdef CLD_NEEDED
    6566    cld
     67%endif
    6668    mov     cx, di                      ; Restore item size to CX
    6769    xor     ax, ax                      ; Zero starting index
     
    191193
    192194    cmp     ax, dx  ; If (left <= right)
    193     jg      SHORT ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI
     195    jg      SHORT .BreakLoopSinceAllItemsExamined
    194196    call    SwapItemsFromIndexesAXandDX
    195197    inc     ax
Note: See TracChangeset for help on using the changeset viewer.