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
RevLine 
[41]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
[162]16; (Jumps to Char_CharIsNotValid if before range)
[41]17; Corrupts registers:
18; Nothing
19;--------------------------------------------------------------------
20%macro IS_BETWEEN_IMMEDIATES 3
21 cmp %1, %2
[162]22 jb SHORT Char_CharIsNotValid
[41]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;--------------------------------------------------------------------
[369]37ALIGN STRING_JUMP_ALIGN
[41]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;--------------------------------------------------------------------
[162]52%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]53ALIGN STRING_JUMP_ALIGN
[41]54Char_IsUpperCaseLetterInAL:
55 IS_BETWEEN_IMMEDIATES al, 'A', 'Z'
56 ret
[162]57%endif
[41]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;--------------------------------------------------------------------
[162]70%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]71ALIGN STRING_JUMP_ALIGN
[41]72Char_IsHexadecimalDigitInAL:
73 call Char_IsDecimalDigitInAL
74 jc SHORT Char_CharIsValid
75 call Char_ALtoLowerCaseLetter
76 IS_BETWEEN_IMMEDIATES al, 'a', 'f'
77 ret
[162]78%endif
[41]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;--------------------------------------------------------------------
[201]90%ifndef MODULE_STRINGS_COMPRESSED
[369]91ALIGN STRING_JUMP_ALIGN
[41]92Char_IsDecimalDigitInAL:
93 IS_BETWEEN_IMMEDIATES al, '0', '9'
94 ret
[194]95%endif
[41]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;--------------------------------------------------------------------
[162]109%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]110ALIGN STRING_JUMP_ALIGN
[41]111Char_ConvertIntegerToALfromDigitInALwithBaseInBX:
112 push dx
113 call Char_GetFilterFunctionToDXforNumericBaseInBX
114 call dx ; Converts to lower case
115 pop dx
[162]116 jnc SHORT Char_CharIsNotValid
[41]117
118 cmp al, '9' ; Decimal digit
119 jbe SHORT .ConvertToDecimalDigit
[145]120 sub al, 'a'-'0'-10 ; Convert to hexadecimal integer
[369]121ALIGN STRING_JUMP_ALIGN
[41]122.ConvertToDecimalDigit:
123 sub al, '0' ; Convert to decimal integer
[162]124 ; Fall to Char_CharIsValid
125%endif
[41]126
127;--------------------------------------------------------------------
[162]128; Char_CharIsValid
129; Char_CharIsNotValid
[41]130; Parameters:
131; Nothing
132; Returns:
[162]133; CF: Set for Char_CharIsValid
134; Cleared for Char_CharIsNotValid
[41]135; Corrupts registers:
136; Nothing
137;--------------------------------------------------------------------
[162]138%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]139ALIGN STRING_JUMP_ALIGN
[41]140Char_CharIsValid:
141 stc
142 ret
[162]143%endif
[41]144
[369]145ALIGN STRING_JUMP_ALIGN
[162]146Char_CharIsNotValid:
[41]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;--------------------------------------------------------------------
[162]160%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]161ALIGN STRING_JUMP_ALIGN
[41]162Char_ALtoLowerCaseLetter:
163 call Char_IsUpperCaseLetterInAL ; Is upper case character?
[181]164 jmp SHORT Char_ALtoUpperCaseLetter.CheckCF
[162]165%endif
[41]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;--------------------------------------------------------------------
[369]176ALIGN STRING_JUMP_ALIGN
[41]177Char_ALtoUpperCaseLetter:
178 call Char_IsLowerCaseLetterInAL ; Is lower case character?
[181]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
[41]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;--------------------------------------------------------------------
[162]206%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]207ALIGN STRING_JUMP_ALIGN
[41]208Char_GetFilterFunctionToDXforNumericBaseInBX:
209 mov dx, Char_IsDecimalDigitInAL
210 cmp bl, 10
211 je SHORT .Return
[162]212 mov dx, Char_IsHexadecimalDigitInAL
[41]213.Return:
214 ret
[162]215%endif
Note: See TracBrowser for help on using the repository browser.