Changeset 46 in xtideuniversalbios for trunk/Assembly_Library
- Timestamp:
- Oct 4, 2010, 7:38:36 AM (14 years ago)
- google:author:
- aitotat
- Location:
- trunk/Assembly_Library/Src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Assembly_Library/Src/LibraryTests.asm
r45 r46 33 33 CALL_DISPLAY_LIBRARY ClearScreen 34 34 35 call LibraryTests_Sort35 ;call LibraryTests_Sort 36 36 ;call LibraryTests_ForDisplayLibrary 37 37 ;call LibraryTests_ForKeyboardLibrary 38 ;call LibraryTests_ForMenuLibrary38 call LibraryTests_ForMenuLibrary 39 39 40 40 ; Exit to DOS … … 571 571 push ax 572 572 mov ax, [si] 573 ;DISPLAY_DEBUG_CHARACTER 'I'574 ;DISPLAY_DEBUG_WORD_AND_WAIT_ANY_KEY ax, 10575 ;DISPLAY_DEBUG_CHARACTER ','576 ;DISPLAY_DEBUG_WORD_AND_WAIT_ANY_KEY [es:di], 10577 ;DISPLAY_DEBUG_CHARACTER ' '573 DISPLAY_DEBUG_CHARACTER 'I' 574 DISPLAY_DEBUG_WORD_AND_WAIT_ANY_KEY ax, 16 575 DISPLAY_DEBUG_CHARACTER ',' 576 DISPLAY_DEBUG_WORD_AND_WAIT_ANY_KEY [es:di], 16 577 DISPLAY_DEBUG_CHARACTER ' ' 578 578 cmp ax, [es:di] 579 579 pop ax … … 586 586 pop ds 587 587 mov si, .rgwItems 588 mov bx, 1 0588 mov bx, 16 589 589 .Loop: 590 590 lodsw … … 596 596 597 597 .rgwItems: 598 dw 435599 dw -31551600 dw 345601 dw 0602 dw -18603 dw 23604 dw 435598 dw '[' 599 dw 'n' 600 dw '5' 601 dw '.' 602 dw ']' 603 dw 'a' 604 dw 'A' 605 605 606 606 -
trunk/Assembly_Library/Src/Menu/Dialog/Dialog.asm
r44 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 6.8.2010 4 ; Last update : 27.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Common functions for many dialogs. … … 28 28 eENTER_STRUCT DIALOG_size 29 29 30 mov cx, DIALOG_size / 231 call Memory_ZeroSSBP byWordsInCX30 mov cx, DIALOG_size 31 call Memory_ZeroSSBPwithSizeInCX 32 32 mov [bp+DIALOG.fpDialogIO], si 33 33 mov [bp+DIALOG.fpDialogIO+2], ds -
trunk/Assembly_Library/Src/Menu/Dialog/DialogFile.asm
r45 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 6.9.2010 4 ; Last update : 28.9.20104 ; Last update : 4.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Displays file dialog. … … 112 112 call LoadItemStringBufferToESDI 113 113 call CreateStringFromCurrentDirectoryContentsToESDI 114 call LoadItemStringBufferToESDI 115 call SortDirectoryContentsStringFromESDIwithCountInCX 114 116 push ss 115 117 pop ds … … 120 122 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH 121 123 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 123 127 ret 124 128 … … 146 150 ; SS:BP: Ptr to DIALOG 147 151 ; Returns: 148 ; Nothing149 ; Corrupts registers: 150 ; AX, CX,DX, SI, DI, DS, ES152 ; CX: Number of files or directories found 153 ; Corrupts registers: 154 ; AX, DX, SI, DI, DS, ES 151 155 ;-------------------------------------------------------------------- 152 156 ALIGN JUMP_ALIGN … … 160 164 call Directory_GetDiskTransferAreaAddressToDSSI 161 165 rcl cx, 1 ; Restore CF 166 xor cx, cx ; Clear file/directory count 162 167 ; Fall to .FindMatchingFilesAndWriteThemToESDI 163 168 … … 165 170 ; .FindMatchingFilesAndWriteThemToESDI 166 171 ; Parameters: 172 ; CX: Initial directory count 167 173 ; DL: Zero if root directory selected 168 174 ; DS:SI: Ptr to DTA with first matching file 169 175 ; ES:DI: Ptr to destination string buffer 170 176 ; Returns: 171 ; Nothing172 ; Corrupts registers: 173 ; AX, CX,DX, DI177 ; CX: Incremented by number of files/directories found 178 ; Corrupts registers: 179 ; AX, DX, DI 174 180 ;-------------------------------------------------------------------- 175 181 ;ALIGN JUMP_ALIGN 176 182 .FindMatchingFilesAndWriteThemToESDI: 177 jc SHORT RemoveLastLFandTerminateESDIwithNull183 jc SHORT TerminateESDIwithNull 178 184 call AppendFileToBufferInESDIfromDtaInDSSI 179 185 call Directory_UpdateDTAForNextMatchUsingPreviousParameters … … 200 206 ret 201 207 202 ;-------------------------------------------------------------------- 203 ; RemoveLastLFandTerminateESDIwithNull 208 209 ;-------------------------------------------------------------------- 210 ; TerminateESDIwithNull 204 211 ; Parameters: 205 212 ; ES:DI: Ptr to destination string buffer … … 210 217 ;-------------------------------------------------------------------- 211 218 ALIGN JUMP_ALIGN 212 RemoveLastLFandTerminateESDIwithNull:219 TerminateESDIwithNull: 213 220 xor ax, ax 214 dec di ; Remove last LF215 221 stosb 216 222 ret 217 223 224 218 225 ;-------------------------------------------------------------------- 219 226 ; AppendFileToBufferInESDIfromDtaInDSSI 220 227 ; Parameters: 228 ; CX: Files/directores found 221 229 ; DL: Zero if root directory selected 222 230 ; DS:SI: Ptr to DTA containing file information 223 231 ; ES:DI: Ptr to destination string buffer 224 232 ; Returns: 233 ; CX: Incremented by number of files/directories found 225 234 ; DI: Updated for next file 226 235 ; Corrupts registers: 227 ; AX, BX, CX,DX236 ; AX, BX, DX 228 237 ;-------------------------------------------------------------------- 229 238 ALIGN JUMP_ALIGN … … 231 240 call .FilterCurrentDirectory ; We never want "." 232 241 call .FilterUpDirectoryWhenInRoot ; No ".." when in root directory 242 inc cx ; Nothing filtered so increment files/directories 233 243 ; Fall to .PrepareBufferFormattingAndFormatFromDTAinDSSI 234 244 … … 241 251 ; DI: Updated for next file 242 252 ; Corrupts registers: 243 ; AX, BX, CX,DX253 ; AX, BX, DX 244 254 ;-------------------------------------------------------------------- 245 255 ;ALIGN JUMP_ALIGN … … 247 257 push bp 248 258 push si 249 mov cx, di 259 push cx 260 mov bx, di 250 261 CALL_DISPLAY_LIBRARY PushDisplayContext 251 262 263 xchg ax, bx 252 264 mov bx, es 253 xchg ax, cx254 265 CALL_DISPLAY_LIBRARY SetCharacterPointerFromBXAX 255 266 mov bl, ATTRIBUTES_NOT_USED … … 261 272 CALL_DISPLAY_LIBRARY GetCharacterPointerToBXAX 262 273 mov es, bx 263 xchg cx, ax274 xchg bx, ax 264 275 CALL_DISPLAY_LIBRARY PopDisplayContext 265 mov di, cx 276 mov di, bx 277 pop cx 266 278 pop si 267 279 pop bp … … 281 293 mov bp, sp 282 294 lea ax, [si+DTA.szFile] 283 push ax284 push ds285 295 286 296 test BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY 287 297 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 289 320 mov ax, [si+DTA.dwFileSize] 290 321 mov dx, [si+DTA.dwFileSize+2] … … 298 329 push dx 299 330 push cx 331 332 ; Format to buffer 300 333 mov si, g_szFileFormat 301 334 jmp SHORT .FormatStringInCSSIandReturn 302 335 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 ;-------------------------------------------------------------------- 303 347 ALIGN JUMP_ALIGN 304 348 .FormatDirectory: 349 push ax ; Push directory name offset 350 push ds ; Push directory name segment 305 351 mov ax, g_szSub 306 352 cmp WORD [si+DTA.szFile], UPDIR_CHARACTERS … … 345 391 346 392 ;-------------------------------------------------------------------- 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 ;-------------------------------------------------------------------- 403 ALIGN JUMP_ALIGN 404 SortDirectoryContentsStringFromESDIwithCountInCX: 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 ;-------------------------------------------------------------------- 422 ALIGN 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 437 ALIGN JUMP_ALIGN 438 .ReturnFromComparison: 439 pop bx 440 pop cx 441 pop si 442 pop di 443 ret 444 ALIGN JUMP_ALIGN 445 .ForceValueFromDSSItoBeMoreOrLess: 446 ja SHORT .ForceValueFromDSSItoBeLess ; Directory in SI, file in DI 447 xchg bl, bh 448 ; Fall to ForceValueFromDSSItoBeLess 449 ALIGN JUMP_ALIGN 450 .ForceValueFromDSSItoBeLess: 451 cmp bh, bl 452 jmp SHORT .ReturnFromComparison 453 454 455 ;-------------------------------------------------------------------- 347 456 ; GetInfoLinesToCXandDialogFlagsToAX 348 457 ; Parameters: … … 388 497 ALIGN JUMP_ALIGN 389 498 ParseSelectionFromItemLineInDSSI: 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 398 510 ; SS:BP: Ptr to DIALOG 399 511 ; Returns: … … 402 514 ; All, except BP 403 515 ;-------------------------------------------------------------------- 404 ;ALIGN JUMP_ALIGN 405 .SelectFileFromDSSI: 516 .ParseAndSelectFileFromDSSI: 406 517 les di, [bp+DIALOG.fpDialogIO] 407 518 add di, BYTE FILE_DIALOG_IO.szFile … … 414 525 415 526 ;-------------------------------------------------------------------- 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 ;-------------------------------------------------------------------- 535 ALIGN 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 ;-------------------------------------------------------------------- 550 ALIGN JUMP_ALIGN 551 .ParseAndChangeToSubdirInDSSI: 552 mov BYTE [si+12], NULL ; Terminate with NULL (unnecessary spaces do not matter) 553 .ChangeDirectoryToDSSI: 431 554 call Directory_ChangeToPathFromDSSI 432 555 ; Fall to RefreshFilesToDisplay … … 624 747 or bx, cx 625 748 jnz SHORT .BitShiftLoop 626 jmp RemoveLastLFandTerminateESDIwithNull749 jmp TerminateESDIwithNull 627 750 628 751 ;-------------------------------------------------------------------- -
trunk/Assembly_Library/Src/Menu/Dialog/LineSplitter.asm
r41 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 8.8.2010 4 ; Last update : 1 5.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Splits long strings to multiple lines. … … 131 131 .ProcessControlCharacter: 132 132 cmp al, NULL ; End of string? 133 je SHORT . EndOfString133 je SHORT .RemoveEmptyLinesAtTheEndIfAnyExists 134 134 cmp al, LF ; Line feed? 135 135 je SHORT .NewlineCharacter … … 142 142 ALIGN JUMP_ALIGN 143 143 .NewlineCharacter: 144 mov BYTE [si-1], SOH 144 mov BYTE [si-1], SOH ; SOH marks previous newline character 145 145 mov [bp+LINE_SPLITTER.pLastWord], si 146 146 jmp SHORT .StartNewLine 147 147 148 148 ALIGN JUMP_ALIGN 149 .EndOfString: 150 ret 149 .RemoveEmptyLinesAtTheEndIfAnyExists: 150 mov al, [si-2] ; Load character before NULL 151 cmp al, SOH 152 je SHORT .RemoveEmptyLineAtTheEndOfString 153 cmp al, LF 154 je SHORT .RemoveEmptyLineAtTheEndOfString 155 ret 156 ALIGN JUMP_ALIGN 157 .RemoveEmptyLineAtTheEndOfString: 158 dec si 159 dec WORD [bp+LINE_SPLITTER.wLines] 160 mov BYTE [si-1], NULL 161 jmp SHORT .RemoveEmptyLinesAtTheEndIfAnyExists 151 162 152 163 -
trunk/Assembly_Library/Src/Menu/Dialog/StringsForDialogs.asm
r44 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 14.9.2010 4 ; Last update : 27.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Strings used by dialogs. … … 22 22 db "Enter name for new file or directory.",NULL 23 23 24 FILE_STRING_LENGTH EQU (24+1) ; +1 = LF in directory contents string 24 25 g_szFileFormat: 25 db "%1 4S%4-u %c%cB",LF,NULL26 db "%16S%4-u %c%cB",LF,NULL 26 27 g_szDirectoryFormat: 27 db " [%12S]%s-DIR",LF,NULL28 db "%16S%s-DIR",LF,NULL 28 29 g_szSub: 29 30 db ANGLE_QUOTE_RIGHT,"SUB",NULL 30 31 g_szUp: 31 db ANGLE_QUOTE_LEFT," UP",NULL32 db ANGLE_QUOTE_LEFT," UP",NULL 32 33 33 34 g_szSingleItem: ; Used by Dialog.asm for single item line -
trunk/Assembly_Library/Src/Menu/MenuAttributes.asm
r41 r46 94 94 istruc ATTRIBUTE_CHARS 95 95 at ATTRIBUTE_CHARS.cBordersAndBackground, db COLOR_ATTRIBUTE(COLOR_BRIGHT_WHITE, COLOR_BLACK) 96 at ATTRIBUTE_CHARS.cShadow, db COLOR_ATTRIBUTE(COLOR_GRAY, COLOR_ WHITE)96 at ATTRIBUTE_CHARS.cShadow, db COLOR_ATTRIBUTE(COLOR_GRAY, COLOR_BLACK) 97 97 at ATTRIBUTE_CHARS.cTitle, db COLOR_ATTRIBUTE(COLOR_BRIGHT_WHITE, COLOR_BLACK) 98 98 at ATTRIBUTE_CHARS.cItem, db COLOR_ATTRIBUTE(COLOR_WHITE, COLOR_BLACK) -
trunk/Assembly_Library/Src/Menu/MenuInit.asm
r41 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 13.7.2010 4 ; Last update : 1 6.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Functions for initializing menu system. … … 27 27 eENTER_STRUCT MENU_size 28 28 29 mov cx, MENU_size / 230 call Memory_ZeroSSBP byWordsInCX29 mov cx, MENU_size 30 call Memory_ZeroSSBPwithSizeInCX 31 31 call MenuInit_EnterMenuWithHandlerInBXandUserDataInDXAX 32 32 mov ax, [bp+MENU.wHighlightedItem] -
trunk/Assembly_Library/Src/String/String.asm
r41 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 12.7.2010 4 ; Last update : 6.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Functions for handling characters. … … 76 76 pop ax 77 77 ret 78 79 80 ;-------------------------------------------------------------------- 81 ; String_ConvertDSSItoLowerCase 82 ; Parameters: 83 ; DS:SI: Ptr to NULL terminated string to convert 84 ; Returns: 85 ; Nothing 86 ; Corrupts registers: 87 ; Nothing 88 ;-------------------------------------------------------------------- 89 ALIGN JUMP_ALIGN 90 String_ConvertDSSItoLowerCase: 91 push si 92 push ax 93 94 ALIGN JUMP_ALIGN 95 .ConvertNextCharacter: 96 lodsb 97 test al, al ; NULL to end string? 98 jz SHORT .EndOfString 99 call Char_ALtoLowerCaseLetter 100 mov [si-1], al 101 jmp SHORT .ConvertNextCharacter 102 103 ALIGN JUMP_ALIGN 104 .EndOfString: 105 pop ax 106 pop si 107 ret -
trunk/Assembly_Library/Src/Util/Memory.asm
r41 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 14.7.2010 4 ; Last update : 1 5.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Functions for memory access. … … 10 10 11 11 ;-------------------------------------------------------------------- 12 ; Memory_ZeroDSSIbyWordsInCX12 ; OPTIMIZE_STRING_OPERATION 13 13 ; 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 16 19 ; Returns: 20 ; SI, DI: Updated by number of bytes operated 21 ; Corrupts registers: 17 22 ; 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 34 ALIGN 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 18 48 ; Corrupts registers: 19 ; AX49 ; Nothing 20 50 ;-------------------------------------------------------------------- 21 51 ALIGN JUMP_ALIGN 22 Memory_ ZeroDSSIbyWordsInCX:23 call Memory_ExchangeDSSIwithESDI24 call Memory_ZeroESDIbyWordsInCX25 jmp SHORT Memory_ExchangeDSSIwithESDI 52 Memory_CopyCXbytesFromDSSItoESDI: 53 OPTIMIZE_STRING_OPERATION rep, movs 54 ret 55 26 56 27 57 ;-------------------------------------------------------------------- 28 ; Memory_ZeroSSBP byWordsInCX58 ; Memory_ZeroSSBPwithSizeInCX 29 59 ; Parameters 30 ; CX: Number of words to zero60 ; CX: Number of bytes to zero 31 61 ; SS:BP: Ptr to buffer to zero 32 62 ; Returns: … … 36 66 ;-------------------------------------------------------------------- 37 67 ALIGN JUMP_ALIGN 38 Memory_ZeroSSBPbyWordsInCX: 39 push es 40 push di 68 Memory_ZeroSSBPwithSizeInCX: 41 69 push ax 42 70 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 47 74 48 75 pop ax 49 pop di50 pop es51 76 ret 52 77 53 78 ;-------------------------------------------------------------------- 54 ; Memory_ZeroESDI byWordsInCX79 ; Memory_ZeroESDIwithSizeInCX 55 80 ; Parameters 56 ; CX: Number of words to zero57 ; ES:DI: Ptr to buffer to zero81 ; CX: Number of bytes to zero 82 ; ES:DI: Ptr to destination buffer 58 83 ; Returns: 59 84 ; Nothing … … 62 87 ;-------------------------------------------------------------------- 63 88 ALIGN JUMP_ALIGN 64 Memory_ZeroESDI byWordsInCX:89 Memory_ZeroESDIwithSizeInCX: 65 90 xor ax, ax 66 ; Fall to Memory_ FillESDIwithAXbyCXtimes91 ; Fall to Memory_StoreCXbytesFromAccumToESDI 67 92 68 93 ;-------------------------------------------------------------------- 69 ; Memory_ FillESDIwithAXbyCXtimes94 ; Memory_StoreCXbytesFromAccumToESDI 70 95 ; Parameters 71 96 ; AX: Word to use to fill buffer 72 ; CX: Number of words to fill73 ; ES:DI: Ptr to buffer to fill97 ; CX: Number of BYTEs to store 98 ; ES:DI: Ptr to destination buffer 74 99 ; Returns: 75 100 ; Nothing … … 78 103 ;-------------------------------------------------------------------- 79 104 ALIGN JUMP_ALIGN 80 Memory_FillESDIwithAXbyCXtimes: 81 cld 82 push di 83 push cx 84 rep stosw 85 pop cx 86 pop di 105 Memory_StoreCXbytesFromAccumToESDI: 106 OPTIMIZE_STRING_OPERATION rep, stos 107 sub di, cx 87 108 ret 88 109 89 110 90 111 ;-------------------------------------------------------------------- 112 ; Memory_ExchangeSSBPwithESDI 91 113 ; Memory_ExchangeDSSIwithESDI 92 114 ; Parameters 93 115 ; Nothing 94 116 ; Returns: 95 ; DS:SI and ES:DI are exchanged.117 ; SS:BP/DS:SI and ES:DI are exchanged. 96 118 ; Corrupts registers: 97 119 ; Nothing 98 120 ;-------------------------------------------------------------------- 121 ALIGN JUMP_ALIGN 122 Memory_ExchangeSSBPwithESDI: 123 xchg bp, di 124 push ss 125 push es 126 pop ss 127 pop es 128 ret 129 99 130 ALIGN JUMP_ALIGN 100 131 Memory_ExchangeDSSIwithESDI: … … 108 139 109 140 ;-------------------------------------------------------------------- 110 ; Memory_CopySSBPtoDSSI111 141 ; Memory_CopySSBPtoESDI 112 142 ; Parameters 113 143 ; Nothing 114 144 ; Returns: 115 ; DS:SI: Same as SS:BP145 ; ES:DI: Same as SS:BP 116 146 ; Corrupts registers: 117 147 ; Nothing 118 148 ;-------------------------------------------------------------------- 119 ALIGN JUMP_ALIGN120 Memory_CopySSBPtoDSSI:121 push ss122 pop ds123 mov si, bp124 ret125 126 149 ALIGN JUMP_ALIGN 127 150 Memory_CopySSBPtoESDI: -
trunk/Assembly_Library/Src/Util/Sort.asm
r45 r46 2 2 ; Project name : Assembly Library 3 3 ; Created date : 28.9.2010 4 ; Last update : 29.9.20104 ; Last update : 1.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Sorting algorithms … … 9 9 10 10 struc QSORT_PARAMS 11 .lpItems resb 412 .temp Struct:11 .lpItems resb 4 12 .tempAndPivotItems: 13 13 endstruc 14 14 … … 16 16 ; Prototype for comparator callback function 17 17 ; 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 20 21 ; Returns: 21 22 ; FLAGS: Signed comparition between first and second item … … 29 30 30 31 ;-------------------------------------------------------------------- 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 35 38 ; Returns: 36 39 ; Nothing … … 42 45 push es 43 46 push di 47 mov di, cx 48 shl cx, 1 ; Reserve temp and pivot items 44 49 add cx, BYTE QSORT_PARAMS_size 45 50 eENTER_STRUCT cx 51 push cx 46 52 47 53 cld 48 sub cx, BYTE QSORT_PARAMS_size ; Restore CX to item size49 xor ax, ax ; Zero forstarting index54 mov cx, di ; Restore item size to CX 55 xor ax, ax ; Zero starting index 50 56 dec dx ; Count to index of last item 51 57 mov [bp+QSORT_PARAMS.lpItems], si … … 54 60 55 61 lds si, [bp+QSORT_PARAMS.lpItems] 56 add cx, BYTE QSORT_PARAMS_size57 eLEAVE_STRUCT cx62 pop ax 63 eLEAVE_STRUCT ax 58 64 pop di 59 65 pop es … … 86 92 ; Does left partition need more sorting 87 93 cmp si, dx ; if (first index < Index of rightmost unsorted item) 88 j ae SHORT .CheckIfRightPartitionNeedsMoreSorting94 jge SHORT .CheckIfRightPartitionNeedsMoreSorting 89 95 xchg ax, si ; AX = first index, SI = Index of leftmost unsorted item 90 96 call QuicksortItemsInRangeFromAXtoDXwithQsortParamsInSSBP … … 93 99 .CheckIfRightPartitionNeedsMoreSorting: 94 100 cmp ax, di ; if (Index of leftmost unsorted item < last index) 95 j ae SHORT .SortCompleted101 jge SHORT .SortCompleted 96 102 mov dx, di ; DI = Index of leftmost unsorted item 97 103 call QuicksortItemsInRangeFromAXtoDXwithQsortParamsInSSBP … … 133 139 .GetPivotPointerToESDI: 134 140 push ax 141 135 142 add ax, dx 136 shr ax, 1 143 shr ax, 1 ; AX = Middle index in partition 137 144 call GetItemPointerToDSSIfromIndexInAX 145 call GetPointerToTemporaryItemToESDI 146 add di, cx ; Pivot is after temporary item 147 call CopyItemFromDSSItoESDI 148 sub di, cx ; Restore DI 149 138 150 pop ax 139 jmp Memory_ExchangeDSSIwithESDI151 ret 140 152 141 153 … … 158 170 ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI: 159 171 cmp ax, dx ; while (left <= right) 160 j aSHORT .BreakLoopSinceAllItemsExamined172 jg SHORT .BreakLoopSinceAllItemsExamined 161 173 162 174 call GetItemPointerToDSSIfromIndexInAX … … 167 179 168 180 cmp ax, dx ; If (left <= right) 169 j aSHORT ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI181 jg SHORT ArrangeItemsInRangeAXtoDXtoBothSidesOfPivotInESDI 170 182 call SwapItemsFromIndexesAXandDX 171 183 inc ax … … 213 225 214 226 ; Item AX to stack 215 call .GetPtrToTemporaryStructToESDI227 call GetPointerToTemporaryItemToESDI 216 228 call GetItemPointerToDSSIfromIndexInAX 217 call .CopyItemFromDSSItoESDI229 call CopyItemFromDSSItoESDI 218 230 219 231 ; Item DX to Item AX 220 232 call Memory_ExchangeDSSIwithESDI 221 233 call GetItemPointerToDSSIfromIndexInDX 222 call .CopyItemFromDSSItoESDI234 call CopyItemFromDSSItoESDI 223 235 224 236 ; Stack to Item DX 225 call .GetPtrToTemporaryStructToESDI237 call GetPointerToTemporaryItemToESDI 226 238 call Memory_ExchangeDSSIwithESDI 227 call .CopyItemFromDSSItoESDI239 call CopyItemFromDSSItoESDI 228 240 229 241 pop di … … 231 243 ret 232 244 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 ;-------------------------------------------------------------------- 255 ALIGN JUMP_ALIGN 256 GetPointerToTemporaryItemToESDI: 257 lea di, [bp+QSORT_PARAMS.tempAndPivotItems] 236 258 push ss 237 259 pop es 238 ret239 240 ALIGN JUMP_ALIGN241 .CopyItemFromDSSItoESDI:242 push si243 push cx244 245 shr cx, 1 ; We want to copy WORDs for performance246 jcxz .CopyLastByte247 rep movsw248 .CopyLastByte:249 jnc SHORT .CopyComplete250 movsb251 .CopyComplete:252 pop cx253 pop si254 260 ret 255 261 … … 286 292 pop dx 287 293 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 ;-------------------------------------------------------------------- 307 ALIGN JUMP_ALIGN 308 CopyItemFromDSSItoESDI: 309 call Memory_CopyCXbytesFromDSSItoESDI 310 sub si, cx ; Restore SI 311 ret
Note:
See TracChangeset
for help on using the changeset viewer.