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

Last change on this file since 373 was 369, checked in by gregli@…, 13 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.