[41] | 1 | ; Project name : Assembly Library |
---|
| 2 | ; Description : Functions for handling characters. |
---|
| 3 | |
---|
| 4 | ; Section containing code |
---|
| 5 | SECTION .text |
---|
| 6 | |
---|
| 7 | ;-------------------------------------------------------------------- |
---|
[53] | 8 | ; String_ConvertDSSItoLowerCase |
---|
| 9 | ; Parameters: |
---|
| 10 | ; DS:SI: Ptr to string to convert |
---|
| 11 | ; Returns: |
---|
| 12 | ; CX: Number of characters processed |
---|
| 13 | ; SI: Updated |
---|
| 14 | ; Corrupts registers: |
---|
| 15 | ; Nothing |
---|
| 16 | ;-------------------------------------------------------------------- |
---|
| 17 | ALIGN JUMP_ALIGN |
---|
| 18 | String_ConvertDSSItoLowerCase: |
---|
| 19 | push dx |
---|
| 20 | push ax |
---|
| 21 | |
---|
| 22 | mov dx, StringProcess_ConvertToLowerCase |
---|
| 23 | call StringProcess_DSSIwithFunctionInDX |
---|
| 24 | |
---|
| 25 | pop ax |
---|
| 26 | pop dx |
---|
| 27 | ret |
---|
| 28 | |
---|
| 29 | |
---|
| 30 | ;-------------------------------------------------------------------- |
---|
[41] | 31 | ; String_ConvertWordToAXfromStringInDSSIwithBaseInBX |
---|
| 32 | ; Parameters: |
---|
| 33 | ; BX: Numeric base (10 or 16) |
---|
| 34 | ; DS:SI: Ptr to string to convert |
---|
| 35 | ; Returns: |
---|
| 36 | ; AX: Word converted from string |
---|
[53] | 37 | ; CX: Number of characters processed |
---|
[52] | 38 | ; SI: Updated |
---|
[293] | 39 | ; CF: Cleared if successful |
---|
[52] | 40 | ; Set if error during conversion |
---|
[41] | 41 | ; Corrupts registers: |
---|
[52] | 42 | ; Nothing |
---|
[41] | 43 | ;-------------------------------------------------------------------- |
---|
| 44 | ALIGN JUMP_ALIGN |
---|
| 45 | String_ConvertWordToAXfromStringInDSSIwithBaseInBX: |
---|
[52] | 46 | push di |
---|
| 47 | push dx |
---|
[41] | 48 | |
---|
[52] | 49 | xor di, di |
---|
| 50 | mov dx, StringProcess_ConvertToWordInDIWithBaseInBX |
---|
| 51 | call StringProcess_DSSIwithFunctionInDX |
---|
| 52 | xchg ax, di |
---|
[41] | 53 | |
---|
[52] | 54 | pop dx |
---|
| 55 | pop di |
---|
[41] | 56 | ret |
---|
| 57 | |
---|
| 58 | |
---|
| 59 | ;-------------------------------------------------------------------- |
---|
[53] | 60 | ; String_CopyDSSItoESDIandGetLengthToCX |
---|
[41] | 61 | ; Parameters: |
---|
| 62 | ; DS:SI: Ptr to source NULL terminated string |
---|
| 63 | ; ES:DI: Ptr to destination buffer |
---|
| 64 | ; Returns: |
---|
| 65 | ; CX: Number of characters copied |
---|
| 66 | ; SI,DI: Updated by CX characters |
---|
| 67 | ; Corrupts registers: |
---|
| 68 | ; Nothing |
---|
| 69 | ;-------------------------------------------------------------------- |
---|
| 70 | ALIGN JUMP_ALIGN |
---|
[53] | 71 | String_CopyDSSItoESDIandGetLengthToCX: |
---|
[41] | 72 | push ax |
---|
[52] | 73 | |
---|
[41] | 74 | xor cx, cx |
---|
| 75 | ALIGN JUMP_ALIGN |
---|
[52] | 76 | .CopyNextCharacter: |
---|
[41] | 77 | lodsb ; Load from DS:SI to AL |
---|
| 78 | test al, al ; NULL to end string? |
---|
| 79 | jz SHORT .EndOfString |
---|
| 80 | stosb ; Store from AL to ES:DI |
---|
| 81 | inc cx ; Increment number of characters written |
---|
[52] | 82 | jmp SHORT .CopyNextCharacter |
---|
[41] | 83 | |
---|
| 84 | ALIGN JUMP_ALIGN |
---|
| 85 | .EndOfString: |
---|
| 86 | pop ax |
---|
| 87 | ret |
---|
[46] | 88 | |
---|
| 89 | |
---|
| 90 | ;-------------------------------------------------------------------- |
---|
[52] | 91 | ; String_GetLengthFromDSSItoCX |
---|
[46] | 92 | ; Parameters: |
---|
[52] | 93 | ; DS:SI: Ptr to NULL terminated string |
---|
[46] | 94 | ; Returns: |
---|
[52] | 95 | ; CX: String length in characters |
---|
[46] | 96 | ; Corrupts registers: |
---|
| 97 | ; Nothing |
---|
| 98 | ;-------------------------------------------------------------------- |
---|
| 99 | ALIGN JUMP_ALIGN |
---|
[52] | 100 | String_GetLengthFromDSSItoCX: |
---|
| 101 | push ax |
---|
[46] | 102 | push si |
---|
| 103 | |
---|
[54] | 104 | call Registers_ExchangeDSSIwithESDI |
---|
[52] | 105 | xor ax, ax ; Find NULL |
---|
| 106 | mov cx, -1 ; Full segment if necessary |
---|
| 107 | repne scasb |
---|
| 108 | mov cx, di |
---|
[54] | 109 | call Registers_ExchangeDSSIwithESDI |
---|
[46] | 110 | |
---|
[52] | 111 | pop si |
---|
| 112 | stc |
---|
| 113 | sbb cx, si ; Subtract NULL |
---|
[46] | 114 | pop ax |
---|
| 115 | ret |
---|