source: xtideuniversalbios/trunk/Assembly_Library/Src/String/Char.asm @ 369

Last change on this file since 369 was 369, checked in by gregli@…, 12 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 6.2 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for handling characters.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; This macro can only be used within this source file!!!
9; IS_BETWEEN_IMMEDIATES
10;   Parameters:
11;       %1:     Value to check
12;       %2:     First accepted value in range
13;       %3:     Last accepted value in range
14;   Returns:
15;       CF:     Set if character is range
16;               (Jumps to Char_CharIsNotValid if before range)
17;   Corrupts registers:
18;       Nothing
19;--------------------------------------------------------------------
20%macro IS_BETWEEN_IMMEDIATES 3
21    cmp     %1, %2
22    jb      SHORT Char_CharIsNotValid
23    cmp     %1, (%3)+1              ; Set CF if %1 is lesser
24%endmacro
25
26
27;--------------------------------------------------------------------
28; Char_IsLowerCaseLetterInAL
29;   Parameters:
30;       AL:     Character to check
31;   Returns:
32;       CF:     Set if character is lower case letter ('a'...'z')
33;               Cleared if character is not lower case letter
34;   Corrupts registers:
35;       Nothing
36;--------------------------------------------------------------------
37ALIGN STRING_JUMP_ALIGN
38Char_IsLowerCaseLetterInAL:
39    IS_BETWEEN_IMMEDIATES al, 'a', 'z'
40    ret
41
42;--------------------------------------------------------------------
43; Char_IsUpperCaseLetterInAL
44;   Parameters:
45;       AL:     Character to check
46;   Returns:
47;       CF:     Set if character is upper case letter ('A'...'Z')
48;               Cleared if character is not upper case letter
49;   Corrupts registers:
50;       Nothing
51;--------------------------------------------------------------------
52%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
53ALIGN STRING_JUMP_ALIGN
54Char_IsUpperCaseLetterInAL:
55    IS_BETWEEN_IMMEDIATES al, 'A', 'Z'
56    ret
57%endif
58
59;--------------------------------------------------------------------
60; Char_IsHexadecimalDigitInAL
61;   Parameters:
62;       AL:     Character to check
63;   Returns:
64;       AL:     Character converted to lower case
65;       CF:     Set if character is decimal digit ('0'...'F')
66;               Cleared if character is not decimal digit
67;   Corrupts registers:
68;       Nothing
69;--------------------------------------------------------------------
70%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
71ALIGN STRING_JUMP_ALIGN
72Char_IsHexadecimalDigitInAL:
73    call    Char_IsDecimalDigitInAL
74    jc      SHORT Char_CharIsValid
75    call    Char_ALtoLowerCaseLetter
76    IS_BETWEEN_IMMEDIATES al, 'a', 'f'
77    ret
78%endif
79
80;--------------------------------------------------------------------
81; Char_IsDecimalDigitInAL
82;   Parameters:
83;       AL:     Character to check
84;   Returns:
85;       CF:     Set if character is decimal digit ('0'...'9')
86;               Cleared if character is not decimal digit
87;   Corrupts registers:
88;       Nothing
89;--------------------------------------------------------------------
90%ifndef MODULE_STRINGS_COMPRESSED
91ALIGN STRING_JUMP_ALIGN
92Char_IsDecimalDigitInAL:
93    IS_BETWEEN_IMMEDIATES al, '0', '9'
94    ret
95%endif
96
97;--------------------------------------------------------------------
98; Char_ConvertIntegerToALfromDigitInALwithBaseInBX
99;   Parameters:
100;       AL:     Character to convert
101;       BX:     Numeric base (10 or 16)
102;   Returns:
103;       AL:     Character converted to integer
104;       CF:     Set if character was valid
105;               Cleared if character was invalid
106;   Corrupts registers:
107;       Nothing
108;--------------------------------------------------------------------
109%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
110ALIGN STRING_JUMP_ALIGN
111Char_ConvertIntegerToALfromDigitInALwithBaseInBX:
112    push    dx
113    call    Char_GetFilterFunctionToDXforNumericBaseInBX
114    call    dx                      ; Converts to lower case
115    pop     dx
116    jnc     SHORT Char_CharIsNotValid
117
118    cmp     al, '9'                 ; Decimal digit
119    jbe     SHORT .ConvertToDecimalDigit
120    sub     al, 'a'-'0'-10          ; Convert to hexadecimal integer
121ALIGN STRING_JUMP_ALIGN
122.ConvertToDecimalDigit:
123    sub     al, '0'                 ; Convert to decimal integer
124    ; Fall to Char_CharIsValid
125%endif
126
127;--------------------------------------------------------------------
128; Char_CharIsValid
129; Char_CharIsNotValid
130;   Parameters:
131;       Nothing
132;   Returns:
133;       CF:     Set for Char_CharIsValid
134;               Cleared for Char_CharIsNotValid
135;   Corrupts registers:
136;       Nothing
137;--------------------------------------------------------------------
138%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
139ALIGN STRING_JUMP_ALIGN
140Char_CharIsValid:
141    stc
142    ret
143%endif
144
145ALIGN STRING_JUMP_ALIGN
146Char_CharIsNotValid:
147    clc
148    ret
149
150
151;--------------------------------------------------------------------
152; Char_ALtoLowerCaseLetter
153;   Parameters:
154;       AL:     Character to convert
155;   Returns:
156;       AL:     Character with possible conversion
157;   Corrupts registers:
158;       Nothing
159;--------------------------------------------------------------------
160%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
161ALIGN STRING_JUMP_ALIGN
162Char_ALtoLowerCaseLetter:
163    call    Char_IsUpperCaseLetterInAL  ; Is upper case character?
164    jmp     SHORT Char_ALtoUpperCaseLetter.CheckCF
165%endif
166
167;--------------------------------------------------------------------
168; Char_ALtoUpperCaseLetter
169;   Parameters:
170;       AL:     Character to convert
171;   Returns:
172;       AL:     Character with possible conversion
173;   Corrupts registers:
174;       Nothing
175;--------------------------------------------------------------------
176ALIGN STRING_JUMP_ALIGN
177Char_ALtoUpperCaseLetter:
178    call    Char_IsLowerCaseLetterInAL  ; Is lower case character?
179.CheckCF:
180    jnc     SHORT Char_ChangeCaseInAL.Return
181    ; Fall to Char_ChangeCaseInAL
182
183;--------------------------------------------------------------------
184; Char_ChangeCaseInAL
185;   Parameters:
186;       AL:     Character to convert (must be A-Z or a-z)
187;   Returns:
188;       AL:     Character converted
189;   Corrupts registers:
190;       Nothing
191;--------------------------------------------------------------------
192Char_ChangeCaseInAL:
193    xor     al, 32
194.Return:
195    ret
196
197;--------------------------------------------------------------------
198; Char_GetFilterFunctionToDXforNumericBaseInBX
199;   Parameters
200;       BX:     Numeric base (10 or 16)
201;   Returns:
202;       CS:DX:  Ptr to character filter function
203;   Corrupts registers:
204;       Nothing
205;--------------------------------------------------------------------
206%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
207ALIGN STRING_JUMP_ALIGN
208Char_GetFilterFunctionToDXforNumericBaseInBX:
209    mov     dx, Char_IsDecimalDigitInAL
210    cmp     bl, 10
211    je      SHORT .Return
212    mov     dx, Char_IsHexadecimalDigitInAL
213.Return:
214    ret
215%endif
Note: See TracBrowser for help on using the repository browser.