Changeset 46 in xtideuniversalbios for trunk/Assembly_Library/Src/Util/Sort.asm
- Timestamp:
- Oct 4, 2010, 7:38:36 AM (14 years ago)
- google:author:
- aitotat
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.