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


Ignore:
Timestamp:
Oct 4, 2010, 7:38:36 AM (14 years ago)
Author:
aitotat
google:author:
aitotat
Message:

Changes to Assembly Library:
Sorting now works (pivot item is copied for comparison and index comparisons are now signed instead of unsigned).
Menu shadow now looks better on black and white modes.
Sorting is now implemented for File Fialog: directories are displayed before files.
File Dialog now displays directories with upper case letters and files with lower case letters.
Line splitter now removes all empty lines from the end.

Location:
trunk/Assembly_Library/Src/Util
Files:
2 edited

Legend:

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

    r41 r46  
    22; Project name  :   Assembly Library
    33; Created date  :   14.7.2010
    4 ; Last update   :   15.9.2010
     4; Last update   :   1.10.2010
    55; Author        :   Tomi Tilli
    66; Description   :   Functions for memory access.
     
    1010
    1111;--------------------------------------------------------------------
    12 ; Memory_ZeroDSSIbyWordsInCX
     12; OPTIMIZE_STRING_OPERATION
    1313;   Parameters
    14 ;       CX:     Number of words to zero
    15 ;       DS:SI:  Ptr to buffer to zero
     14;       %1:     Repeat instruction
     15;       %2:     String instruction without size (for example MOVS and not MOVSB or MOVSW)
     16;       CX:     Number of BYTEs to operate
     17;       DS:SI:  Ptr to source data
     18;       ES:DI:  Ptr to destination
    1619;   Returns:
     20;       SI, DI: Updated by number of bytes operated
     21;   Corrupts registers:
    1722;       Nothing
     23;--------------------------------------------------------------------
     24%macro OPTIMIZE_STRING_OPERATION 2
     25    push    cx
     26
     27    shr     cx, 1           ; Operate with WORDs for performance
     28    jcxz    %%HandleRemainingByte
     29    %1      %2w
     30%%HandleRemainingByte:
     31    jnc     SHORT %%OperationCompleted
     32    %2b
     33
     34ALIGN JUMP_ALIGN
     35%%OperationCompleted:
     36    pop     cx
     37%endmacro
     38
     39
     40;--------------------------------------------------------------------
     41; Memory_CopyCXbytesFromDSSItoESDI
     42;   Parameters
     43;       CX:     Number of bytes to copy
     44;       DS:SI:  Ptr to source data
     45;       ES:DI:  Ptr to destination buffer
     46;   Returns:
     47;       SI, DI: Updated by number of bytes copied
    1848;   Corrupts registers:
    19 ;       AX
     49;       Nothing
    2050;--------------------------------------------------------------------
    2151ALIGN JUMP_ALIGN
    22 Memory_ZeroDSSIbyWordsInCX:
    23     call    Memory_ExchangeDSSIwithESDI
    24     call    Memory_ZeroESDIbyWordsInCX
    25     jmp     SHORT Memory_ExchangeDSSIwithESDI
     52Memory_CopyCXbytesFromDSSItoESDI:
     53    OPTIMIZE_STRING_OPERATION rep, movs
     54    ret
     55
    2656
    2757;--------------------------------------------------------------------
    28 ; Memory_ZeroSSBPbyWordsInCX
     58; Memory_ZeroSSBPwithSizeInCX
    2959;   Parameters
    30 ;       CX:     Number of words to zero
     60;       CX:     Number of bytes to zero
    3161;       SS:BP:  Ptr to buffer to zero
    3262;   Returns:
     
    3666;--------------------------------------------------------------------
    3767ALIGN JUMP_ALIGN
    38 Memory_ZeroSSBPbyWordsInCX:
    39     push    es
    40     push    di
     68Memory_ZeroSSBPwithSizeInCX:
    4169    push    ax
    4270
    43     push    ss
    44     pop     es
    45     mov     di, bp
    46     call    Memory_ZeroESDIbyWordsInCX
     71    call    Memory_ExchangeSSBPwithESDI
     72    call    Memory_ZeroESDIwithSizeInCX
     73    call    Memory_ExchangeSSBPwithESDI
    4774
    4875    pop     ax
    49     pop     di
    50     pop     es
    5176    ret
    5277
    5378;--------------------------------------------------------------------
    54 ; Memory_ZeroESDIbyWordsInCX
     79; Memory_ZeroESDIwithSizeInCX
    5580;   Parameters
    56 ;       CX:     Number of words to zero
    57 ;       ES:DI:  Ptr to buffer to zero
     81;       CX:     Number of bytes to zero
     82;       ES:DI:  Ptr to destination buffer
    5883;   Returns:
    5984;       Nothing
     
    6287;--------------------------------------------------------------------
    6388ALIGN JUMP_ALIGN
    64 Memory_ZeroESDIbyWordsInCX:
     89Memory_ZeroESDIwithSizeInCX:
    6590    xor     ax, ax
    66     ; Fall to Memory_FillESDIwithAXbyCXtimes
     91    ; Fall to Memory_StoreCXbytesFromAccumToESDI
    6792
    6893;--------------------------------------------------------------------
    69 ; Memory_FillESDIwithAXbyCXtimes
     94; Memory_StoreCXbytesFromAccumToESDI
    7095;   Parameters
    7196;       AX:     Word to use to fill buffer
    72 ;       CX:     Number of words to fill
    73 ;       ES:DI:  Ptr to buffer to fill
     97;       CX:     Number of BYTEs to store
     98;       ES:DI:  Ptr to destination buffer
    7499;   Returns:
    75100;       Nothing
     
    78103;--------------------------------------------------------------------
    79104ALIGN JUMP_ALIGN
    80 Memory_FillESDIwithAXbyCXtimes:
    81     cld
    82     push    di
    83     push    cx
    84     rep stosw
    85     pop     cx
    86     pop     di
     105Memory_StoreCXbytesFromAccumToESDI:
     106    OPTIMIZE_STRING_OPERATION rep, stos
     107    sub     di, cx
    87108    ret
    88109
    89110
    90111;--------------------------------------------------------------------
     112; Memory_ExchangeSSBPwithESDI
    91113; Memory_ExchangeDSSIwithESDI
    92114;   Parameters
    93115;       Nothing
    94116;   Returns:
    95 ;       DS:SI and ES:DI are exchanged.
     117;       SS:BP/DS:SI and ES:DI are exchanged.
    96118;   Corrupts registers:
    97119;       Nothing
    98120;--------------------------------------------------------------------
     121ALIGN JUMP_ALIGN
     122Memory_ExchangeSSBPwithESDI:
     123    xchg    bp, di
     124    push    ss
     125    push    es
     126    pop     ss
     127    pop     es
     128    ret
     129
    99130ALIGN JUMP_ALIGN
    100131Memory_ExchangeDSSIwithESDI:
     
    108139
    109140;--------------------------------------------------------------------
    110 ; Memory_CopySSBPtoDSSI
    111141; Memory_CopySSBPtoESDI
    112142;   Parameters
    113143;       Nothing
    114144;   Returns:
    115 ;       DS:SI:      Same as SS:BP
     145;       ES:DI:      Same as SS:BP
    116146;   Corrupts registers:
    117147;       Nothing
    118148;--------------------------------------------------------------------
    119 ALIGN JUMP_ALIGN
    120 Memory_CopySSBPtoDSSI:
    121     push    ss
    122     pop     ds
    123     mov     si, bp
    124     ret
    125 
    126149ALIGN JUMP_ALIGN
    127150Memory_CopySSBPtoESDI:
  • trunk/Assembly_Library/Src/Util/Sort.asm

    r45 r46  
    22; Project name  :   Assembly Library
    33; Created date  :   28.9.2010
    4 ; Last update   :   29.9.2010
     4; Last update   :   1.10.2010
    55; Author        :   Tomi Tilli
    66; Description   :   Sorting algorithms
     
    99
    1010struc QSORT_PARAMS
    11     .lpItems        resb    4
    12     .tempStruct:
     11    .lpItems            resb    4
     12    .tempAndPivotItems:
    1313endstruc
    1414
     
    1616; Prototype for comparator callback function
    1717;   Parameters:
    18 ;       DS:SI:  Offset to first item to compare
    19 ;       ES:DI:  Offset to second item to compare
     18;       CX:     Item size in bytes
     19;       DS:SI:  Ptr to first item to compare
     20;       ES:DI:  Ptr to second item to compare
    2021;   Returns:
    2122;       FLAGS:  Signed comparition between first and second item
     
    2930
    3031;--------------------------------------------------------------------
    31 ; DialogFile_GetFileNameWithIoInDSSI
    32 ;   Parameters:
    33 ;       DS:SI:  Ptr to FILE_DIALOG_IO
    34 ;       SS:BP:  Ptr to parent MENU
     32; Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
     33;   Parameters:
     34;       CX:     Item size in bytes
     35;       DX:     Number of items to sort (signed)
     36;       CS:BX:  Comparator function
     37;       DS:SI:  Ptr to array of items to sort
    3538;   Returns:
    3639;       Nothing
     
    4245    push    es
    4346    push    di
     47    mov     di, cx
     48    shl     cx, 1                       ; Reserve temp and pivot items
    4449    add     cx, BYTE QSORT_PARAMS_size
    4550    eENTER_STRUCT cx
     51    push    cx
    4652
    4753    cld
    48     sub     cx, BYTE QSORT_PARAMS_size  ; Restore CX to item size
    49     xor     ax, ax                      ; Zero for starting index
     54    mov     cx, di                      ; Restore item size to CX
     55    xor     ax, ax                      ; Zero starting index
    5056    dec     dx                          ; Count to index of last item
    5157    mov     [bp+QSORT_PARAMS.lpItems], si
     
    5460
    5561    lds     si, [bp+QSORT_PARAMS.lpItems]
    56     add     cx, BYTE QSORT_PARAMS_size
    57     eLEAVE_STRUCT cx
     62    pop     ax
     63    eLEAVE_STRUCT ax
    5864    pop     di
    5965    pop     es
     
    8692    ; Does left partition need more sorting
    8793    cmp     si, dx          ; if (first index < Index of rightmost unsorted item)
    88     jae     SHORT .CheckIfRightPartitionNeedsMoreSorting
     94    jge     SHORT .CheckIfRightPartitionNeedsMoreSorting
    8995    xchg    ax, si          ; AX = first index, SI = Index of leftmost unsorted item
    9096    call    QuicksortItemsInRangeFromAXtoDXwithQsortParamsInSSBP
     
    9399.CheckIfRightPartitionNeedsMoreSorting:
    94100    cmp     ax, di          ; if (Index of leftmost unsorted item < last index)
    95     jae     SHORT .SortCompleted
     101    jge     SHORT .SortCompleted
    96102    mov     dx, di          ; DI = Index of leftmost unsorted item
    97103    call    QuicksortItemsInRangeFromAXtoDXwithQsortParamsInSSBP
     
    133139.GetPivotPointerToESDI:
    134140    push    ax
     141
    135142    add     ax, dx
    136     shr     ax, 1
     143    shr     ax, 1           ; AX = Middle index in partition
    137144    call    GetItemPointerToDSSIfromIndexInAX
     145    call    GetPointerToTemporaryItemToESDI
     146    add     di, cx          ; Pivot is after temporary item
     147    call    CopyItemFromDSSItoESDI
     148    sub     di, cx          ; Restore DI
     149
    138150    pop     ax
    139     jmp     Memory_ExchangeDSSIwithESDI
     151    ret
    140152
    141153
     
    158170ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI:
    159171    cmp     ax, dx  ; while (left <= right)
    160     ja      SHORT .BreakLoopSinceAllItemsExamined
     172    jg      SHORT .BreakLoopSinceAllItemsExamined
    161173
    162174    call    GetItemPointerToDSSIfromIndexInAX
     
    167179
    168180    cmp     ax, dx  ; If (left <= right)
    169     ja      SHORT ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI
     181    jg      SHORT ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI
    170182    call    SwapItemsFromIndexesAXandDX
    171183    inc     ax
     
    213225
    214226    ; Item AX to stack
    215     call    .GetPtrToTemporaryStructToESDI
     227    call    GetPointerToTemporaryItemToESDI
    216228    call    GetItemPointerToDSSIfromIndexInAX
    217     call    .CopyItemFromDSSItoESDI
     229    call    CopyItemFromDSSItoESDI
    218230
    219231    ; Item DX to Item AX
    220232    call    Memory_ExchangeDSSIwithESDI
    221233    call    GetItemPointerToDSSIfromIndexInDX
    222     call    .CopyItemFromDSSItoESDI
     234    call    CopyItemFromDSSItoESDI
    223235
    224236    ; Stack to Item DX
    225     call    .GetPtrToTemporaryStructToESDI
     237    call    GetPointerToTemporaryItemToESDI
    226238    call    Memory_ExchangeDSSIwithESDI
    227     call    .CopyItemFromDSSItoESDI
     239    call    CopyItemFromDSSItoESDI
    228240
    229241    pop     di
     
    231243    ret
    232244
    233 ALIGN JUMP_ALIGN
    234 .GetPtrToTemporaryStructToESDI:
    235     lea     di, [bp+QSORT_PARAMS.tempStruct]
     245
     246;--------------------------------------------------------------------
     247; GetPointerToTemporaryItemToESDI
     248;   Parameters:
     249;       SS:BP:  Ptr to QSORT_PARAMS
     250;   Returns:
     251;       ES:DI:  Ptr to temporary item
     252;   Corrupts registers:
     253;       Nothing
     254;--------------------------------------------------------------------
     255ALIGN JUMP_ALIGN
     256GetPointerToTemporaryItemToESDI:
     257    lea     di, [bp+QSORT_PARAMS.tempAndPivotItems]
    236258    push    ss
    237259    pop     es
    238     ret
    239 
    240 ALIGN JUMP_ALIGN
    241 .CopyItemFromDSSItoESDI:
    242     push    si
    243     push    cx
    244 
    245     shr     cx, 1           ; We want to copy WORDs for performance
    246     jcxz    .CopyLastByte
    247     rep     movsw
    248 .CopyLastByte:
    249     jnc     SHORT .CopyComplete
    250     movsb
    251 .CopyComplete:
    252     pop     cx
    253     pop     si
    254260    ret
    255261
     
    286292    pop     dx
    287293    ret
     294
     295
     296;--------------------------------------------------------------------
     297; CopyItemFromDSSItoESDI
     298;   Parameters:
     299;       CX:     Item size in bytes
     300;       DS:SI:  Ptr to source item
     301;       ES:DI:  Ptr to destination buffer
     302;   Returns:
     303;       Nothing
     304;   Corrupts registers:
     305;       DI
     306;--------------------------------------------------------------------
     307ALIGN JUMP_ALIGN
     308CopyItemFromDSSItoESDI:
     309    call    Memory_CopyCXbytesFromDSSItoESDI
     310    sub     si, cx          ; Restore SI
     311    ret
Note: See TracChangeset for help on using the changeset viewer.