source: xtideuniversalbios/trunk/Assembly_Library/Src/String/String.asm @ 619

Last change on this file since 619 was 619, checked in by aitotat, 3 years ago

Fixed return register info on two string library functions. No changes to code.

File size: 3.4 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for handling characters.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; String_ConvertDSSItoLowerCase
25;   Parameters:
26;       DS:SI:  Ptr to string to convert
27;   Returns:
28;       CX:     Number of characters processed
29;   Corrupts registers:
30;       Nothing
31;--------------------------------------------------------------------
32ALIGN STRING_JUMP_ALIGN
33String_ConvertDSSItoLowerCase:
34    push    dx
35    push    ax
36
37    mov     dx, StringProcess_ConvertToLowerCase
38    call    StringProcess_DSSIwithFunctionInDX
39
40    pop     ax
41    pop     dx
42    ret
43
44
45;--------------------------------------------------------------------
46; String_ConvertWordToAXfromStringInDSSIwithBaseInBX
47;   Parameters:
48;       BX:     Numeric base (10 or 16)
49;       DS:SI:  Ptr to string to convert
50;   Returns:
51;       AX:     Word converted from string
52;       CX:     Number of characters processed
53;       CF:     Cleared if successful
54;               Set if error during conversion
55;   Corrupts registers:
56;       Nothing
57;--------------------------------------------------------------------
58ALIGN STRING_JUMP_ALIGN
59String_ConvertWordToAXfromStringInDSSIwithBaseInBX:
60    push    di
61    push    dx
62
63    xor     di, di
64    mov     dx, StringProcess_ConvertToWordInDIWithBaseInBX
65    call    StringProcess_DSSIwithFunctionInDX
66    xchg    ax, di
67
68    pop     dx
69    pop     di
70    ret
71
72
73;--------------------------------------------------------------------
74; String_CopyDSSItoESDIandGetLengthToCX
75;   Parameters:
76;       DS:SI:  Ptr to source NULL terminated string
77;       ES:DI:  Ptr to destination buffer
78;   Returns:
79;       CX:     Number of characters copied
80;       SI,DI:  Updated by CX characters
81;   Corrupts registers:
82;       Nothing
83;--------------------------------------------------------------------
84ALIGN STRING_JUMP_ALIGN
85String_CopyDSSItoESDIandGetLengthToCX:
86    push    ax
87
88    xor     cx, cx
89ALIGN STRING_JUMP_ALIGN
90.CopyNextCharacter:
91    lodsb                       ; Load from DS:SI to AL
92    test    al, al              ; NULL to end string?
93    jz      SHORT .EndOfString
94    stosb                       ; Store from AL to ES:DI
95    inc     cx                  ; Increment number of characters written
96    jmp     SHORT .CopyNextCharacter
97
98ALIGN STRING_JUMP_ALIGN
99.EndOfString:
100    pop     ax
101    ret
102
103
104;--------------------------------------------------------------------
105; String_GetLengthFromDSSItoCX
106;   Parameters:
107;       DS:SI:  Ptr to NULL terminated string
108;   Returns:
109;       CX:     String length in characters
110;   Corrupts registers:
111;       Nothing
112;--------------------------------------------------------------------
113ALIGN STRING_JUMP_ALIGN
114String_GetLengthFromDSSItoCX:
115    push    ax
116    push    si
117
118    call    Registers_ExchangeDSSIwithESDI
119    xor     ax, ax      ; Find NULL
120    mov     cx, -1      ; Full segment if necessary
121    repne scasb
122    mov     cx, di
123    call    Registers_ExchangeDSSIwithESDI
124
125    pop     si
126    stc
127    sbb     cx, si      ; Subtract NULL
128    pop     ax
129    ret
Note: See TracBrowser for help on using the repository browser.