Changeset 46 in xtideuniversalbios for trunk/Assembly_Library/Src/Menu/Dialog/DialogFile.asm


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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Assembly_Library/Src/Menu/Dialog/DialogFile.asm

    r45 r46  
    22; Project name  :   Assembly Library
    33; Created date  :   6.9.2010
    4 ; Last update   :   28.9.2010
     4; Last update   :   4.10.2010
    55; Author        :   Tomi Tilli
    66; Description   :   Displays file dialog.
     
    112112    call    LoadItemStringBufferToESDI
    113113    call    CreateStringFromCurrentDirectoryContentsToESDI
     114    call    LoadItemStringBufferToESDI
     115    call    SortDirectoryContentsStringFromESDIwithCountInCX
    114116    push    ss
    115117    pop     ds
     
    120122    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
    121123    mov     [bp+MENUINIT.bHeight], ah               ; Always max height
    122     mov     WORD [bp+MENU.wHighlightedItem], 0
     124    xor     ax, ax
     125    mov     [bp+MENU.wHighlightedItem], ax
     126    mov     [bp+MENU.wFirstVisibleItem], ax
    123127    ret
    124128
     
    146150;       SS:BP:  Ptr to DIALOG
    147151;   Returns:
    148 ;       Nothing
    149 ;   Corrupts registers:
    150 ;       AX, CX, DX, SI, DI, DS, ES
     152;       CX:     Number of files or directories found
     153;   Corrupts registers:
     154;       AX, DX, SI, DI, DS, ES
    151155;--------------------------------------------------------------------
    152156ALIGN JUMP_ALIGN
     
    160164    call    Directory_GetDiskTransferAreaAddressToDSSI
    161165    rcl     cx, 1           ; Restore CF
     166    xor     cx, cx          ; Clear file/directory count
    162167    ; Fall to .FindMatchingFilesAndWriteThemToESDI
    163168
     
    165170; .FindMatchingFilesAndWriteThemToESDI
    166171;   Parameters:
     172;       CX:     Initial directory count
    167173;       DL:     Zero if root directory selected
    168174;       DS:SI:  Ptr to DTA with first matching file
    169175;       ES:DI:  Ptr to destination string buffer
    170176;   Returns:
    171 ;       Nothing
    172 ;   Corrupts registers:
    173 ;       AX, CX, DX, DI
     177;       CX:     Incremented by number of files/directories found
     178;   Corrupts registers:
     179;       AX, DX, DI
    174180;--------------------------------------------------------------------
    175181;ALIGN JUMP_ALIGN
    176182.FindMatchingFilesAndWriteThemToESDI:
    177     jc      SHORT RemoveLastLFandTerminateESDIwithNull
     183    jc      SHORT TerminateESDIwithNull
    178184    call    AppendFileToBufferInESDIfromDtaInDSSI
    179185    call    Directory_UpdateDTAForNextMatchUsingPreviousParameters
     
    200206    ret
    201207
    202 ;--------------------------------------------------------------------
    203 ; RemoveLastLFandTerminateESDIwithNull
     208
     209;--------------------------------------------------------------------
     210; TerminateESDIwithNull
    204211;   Parameters:
    205212;       ES:DI:  Ptr to destination string buffer
     
    210217;--------------------------------------------------------------------
    211218ALIGN JUMP_ALIGN
    212 RemoveLastLFandTerminateESDIwithNull:
     219TerminateESDIwithNull:
    213220    xor     ax, ax
    214     dec     di              ; Remove last LF
    215221    stosb
    216222    ret
    217223
     224
    218225;--------------------------------------------------------------------
    219226; AppendFileToBufferInESDIfromDtaInDSSI
    220227;   Parameters:
     228;       CX:     Files/directores found
    221229;       DL:     Zero if root directory selected
    222230;       DS:SI:  Ptr to DTA containing file information
    223231;       ES:DI:  Ptr to destination string buffer
    224232;   Returns:
     233;       CX:     Incremented by number of files/directories found
    225234;       DI:     Updated for next file
    226235;   Corrupts registers:
    227 ;       AX, BX, CX, DX
     236;       AX, BX, DX
    228237;--------------------------------------------------------------------
    229238ALIGN JUMP_ALIGN
     
    231240    call    .FilterCurrentDirectory         ; We never want "."
    232241    call    .FilterUpDirectoryWhenInRoot    ; No ".." when in root directory
     242    inc     cx                              ; Nothing filtered so increment files/directories
    233243    ; Fall to .PrepareBufferFormattingAndFormatFromDTAinDSSI
    234244
     
    241251;       DI:     Updated for next file
    242252;   Corrupts registers:
    243 ;       AX, BX, CX, DX
     253;       AX, BX, DX
    244254;--------------------------------------------------------------------
    245255;ALIGN JUMP_ALIGN
     
    247257    push    bp
    248258    push    si
    249     mov     cx, di
     259    push    cx
     260    mov     bx, di
    250261    CALL_DISPLAY_LIBRARY PushDisplayContext
    251262
     263    xchg    ax, bx
    252264    mov     bx, es
    253     xchg    ax, cx
    254265    CALL_DISPLAY_LIBRARY SetCharacterPointerFromBXAX
    255266    mov     bl, ATTRIBUTES_NOT_USED
     
    261272    CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX
    262273    mov     es, bx
    263     xchg    cx, ax
     274    xchg    bx, ax
    264275    CALL_DISPLAY_LIBRARY PopDisplayContext
    265     mov     di, cx
     276    mov     di, bx
     277    pop     cx
    266278    pop     si
    267279    pop     bp
     
    281293    mov     bp, sp
    282294    lea     ax, [si+DTA.szFile]
    283     push    ax
    284     push    ds
    285295
    286296    test    BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
    287297    jnz     SHORT .FormatDirectory
    288 
     298    ; Fall to .FormatFile
     299
     300;--------------------------------------------------------------------
     301; .FormatFile
     302;   Parameters:
     303;       BP:     SP before pushing formatting parameters
     304;       DS:AX:  Far pointer to file name
     305;       DS:SI:  Ptr to DTA containing file information
     306;   Returns:
     307;       Nothing
     308;   Corrupts registers:
     309;       AX, BX, CX, DX, SI, DI, BP
     310;--------------------------------------------------------------------
     311.FormatFile:
     312    ; Push parameters for file name
     313    xchg    si, ax
     314    call    String_ConvertDSSItoLowerCase
     315    xchg    ax, si
     316    push    ax              ; Push directory name offset
     317    push    ds              ; Push directory name segment
     318
     319    ; Push parameters for file size
    289320    mov     ax, [si+DTA.dwFileSize]
    290321    mov     dx, [si+DTA.dwFileSize+2]
     
    298329    push    dx
    299330    push    cx
     331
     332    ; Format to buffer
    300333    mov     si, g_szFileFormat
    301334    jmp     SHORT .FormatStringInCSSIandReturn
    302335
     336;--------------------------------------------------------------------
     337; .FormatDirectory
     338;   Parameters:
     339;       BP:     SP before pushing formatting parameters
     340;       DS:AX:  Far pointer to directory name
     341;       DS:SI:  Ptr to DTA containing file information
     342;   Returns:
     343;       Nothing
     344;   Corrupts registers:
     345;       AX, BX, CX, DX, SI, DI, BP
     346;--------------------------------------------------------------------
    303347ALIGN JUMP_ALIGN
    304348.FormatDirectory:
     349    push    ax              ; Push directory name offset
     350    push    ds              ; Push directory name segment
    305351    mov     ax, g_szSub
    306352    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
     
    345391
    346392;--------------------------------------------------------------------
     393; SortDirectoryContentsStringFromESDIwithCountInCX
     394;   Parameters:
     395;       CX:     Number of files and directories
     396;       ES:DI:  Buffer containing directory contents string
     397;       SS:BP:  Ptr to DIALOG
     398;   Returns:
     399;       Nothing
     400;   Corrupts registers:
     401;       AX, BX, CX, DX, SI, DI, DS, ES
     402;--------------------------------------------------------------------
     403ALIGN JUMP_ALIGN
     404SortDirectoryContentsStringFromESDIwithCountInCX:
     405    call    Memory_ExchangeDSSIwithESDI
     406    mov     bx, .FileStringComparator
     407    xchg    dx, cx
     408    mov     cx, FILE_STRING_LENGTH
     409    jmp     Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
     410
     411;--------------------------------------------------------------------
     412; .FileStringComparator
     413;   Parameters:
     414;       CX:     Item size in bytes
     415;       DS:SI:  Ptr to first item to compare
     416;       ES:DI:  Ptr to second item to compare
     417;   Returns:
     418;       FLAGS:  Signed comparition between first and second item
     419;   Corrupts registers:
     420;       Nothing
     421;--------------------------------------------------------------------
     422ALIGN JUMP_ALIGN
     423.FileStringComparator:
     424    push    di
     425    push    si
     426    push    cx
     427    push    bx
     428
     429    mov     bx, FILE_STRING_LENGTH-2            ; Zero BH
     430    cmp     WORD [si], UPDIR_CHARACTERS
     431    je      SHORT .ForceValueFromDSSItoBeLess
     432    mov     bl, [si+bx]
     433    cmp     bl, [es:di+FILE_STRING_LENGTH-2]    ; 'B' for files, 'R' for directories
     434    jne     SHORT .ForceValueFromDSSItoBeMoreOrLess
     435    repe cmpsb                                  ; Two directories or two files
     436
     437ALIGN JUMP_ALIGN
     438.ReturnFromComparison:
     439    pop     bx
     440    pop     cx
     441    pop     si
     442    pop     di
     443    ret
     444ALIGN JUMP_ALIGN
     445.ForceValueFromDSSItoBeMoreOrLess:
     446    ja      SHORT .ForceValueFromDSSItoBeLess   ; Directory in SI, file in DI
     447    xchg    bl, bh
     448    ; Fall to ForceValueFromDSSItoBeLess
     449ALIGN JUMP_ALIGN
     450.ForceValueFromDSSItoBeLess:
     451    cmp     bh, bl
     452    jmp     SHORT .ReturnFromComparison
     453
     454
     455;--------------------------------------------------------------------
    347456; GetInfoLinesToCXandDialogFlagsToAX
    348457;   Parameters:
     
    388497ALIGN JUMP_ALIGN
    389498ParseSelectionFromItemLineInDSSI:
    390     cmp     BYTE [si], '['
    391     je      SHORT .ChangeToSubdirInDSSI
    392     ; Fall to .SelectFileFromDSSI
    393 
    394 ;--------------------------------------------------------------------
    395 ; .SelectFileFromDSSI
    396 ;   Parameters:
    397 ;       DS:SI:  Ptr to char buffer containing file name to be selected
     499    mov     ax, [si]
     500    cmp     ax, UPDIR_CHARACTERS
     501    je      SHORT .ChangeToUpdir
     502    call    Char_IsUpperCaseLetterInAL
     503    jc      SHORT .ParseAndChangeToSubdirInDSSI
     504    ; Fall to .ParseAndSelectFileFromDSSI
     505
     506;--------------------------------------------------------------------
     507; .ParseAndSelectFileFromDSSI
     508;   Parameters:
     509;       DS:SI:  NULL terminated string selected from dialog
    398510;       SS:BP:  Ptr to DIALOG
    399511;   Returns:
     
    402514;       All, except BP
    403515;--------------------------------------------------------------------
    404 ;ALIGN JUMP_ALIGN
    405 .SelectFileFromDSSI:
     516.ParseAndSelectFileFromDSSI:
    406517    les     di, [bp+DIALOG.fpDialogIO]
    407518    add     di, BYTE FILE_DIALOG_IO.szFile
     
    414525
    415526;--------------------------------------------------------------------
    416 ; ChangeToSubdirInDSSI
    417 ;   Parameters:
    418 ;       DS:SI:  NULL terminated string containing new subdir in []
    419 ;       SS:BP:  Ptr to DIALOG
    420 ;   Returns:
    421 ;       Nothing
    422 ;   Corrupts registers:
    423 ;       All, except BP
    424 ;--------------------------------------------------------------------
    425 ALIGN JUMP_ALIGN
    426 .ChangeToSubdirInDSSI:
    427     inc     si                  ; Skip '['
    428     mov     BYTE [si+12], NULL  ; Replace ']' with NULL
    429     cmp     WORD [si], UPDIR_CHARACTERS
    430     eCMOVE  si, g_szUpdir       ; Real DOS do not accept spaces after ".."
     527; .ChangeToUpdir
     528;   Parameters:
     529;       SS:BP:  Ptr to DIALOG
     530;   Returns:
     531;       Nothing
     532;   Corrupts registers:
     533;       All, except BP
     534;--------------------------------------------------------------------
     535ALIGN JUMP_ALIGN
     536.ChangeToUpdir:
     537    mov     si, g_szUpdir
     538    jmp     SHORT .ChangeDirectoryToDSSI
     539
     540;--------------------------------------------------------------------
     541; .ParseAndChangeToSubdirInDSSI
     542;   Parameters:
     543;       DS:SI:  NULL terminated string selected from dialog
     544;       SS:BP:  Ptr to DIALOG
     545;   Returns:
     546;       Nothing
     547;   Corrupts registers:
     548;       All, except BP
     549;--------------------------------------------------------------------
     550ALIGN JUMP_ALIGN
     551.ParseAndChangeToSubdirInDSSI:
     552    mov     BYTE [si+12], NULL  ; Terminate with NULL (unnecessary spaces do not matter)
     553.ChangeDirectoryToDSSI:
    431554    call    Directory_ChangeToPathFromDSSI
    432555    ; Fall to RefreshFilesToDisplay
     
    624747    or      bx, cx
    625748    jnz     SHORT .BitShiftLoop
    626     jmp     RemoveLastLFandTerminateESDIwithNull
     749    jmp     TerminateESDIwithNull
    627750
    628751;--------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.