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