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

Last change on this file since 364 was 201, checked in by gregli@…, 13 years ago

Fixed up conditional compilation so that we can continue to build without string compression.

File size: 6.1 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 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 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 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 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 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 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 JUMP_ALIGN
140Char_CharIsValid:
141 stc
142 ret
143%endif
144
145ALIGN 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 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 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 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.