summaryrefslogtreecommitdiff
path: root/types.asm
blob: 35eea53a0013f43beee7063ccb3219e5c0dcee23 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
%ifndef _TYPES_ASM
%define _TYPES_ASM

isalpha:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test
	cmp ax, 40h
	jl .no
	cmp ax, 7Ah		; 40h..7Ah (A..z, ascii)
	jg .no

	.yes:
		clc		; clear carry (is alpha)
		jmp .return
	.no:
		stc		; set carry (not alpha)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


isalnum:
	push bp
	mov bp, sp
	push ax

	clc			; clear carry
	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test

	push ax
	call isalpha
	jc .no
	call isdigit
	jc .no

	.yes:
		clc		; clear carry (is alphanumeric)
		jmp .return
	.no:
		stc		; set carry (not alphanumeric)
	.return:
		add sp, 2
		pop ax
		mov sp, bp
		pop bp
		ret


isascii:
	push bp
	mov bp, sp
	push ax

	clc			; clear carry
	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test

	cmp ax, 00h
	jl .no
	cmp ax, 80h		; 00h..80h (standard ascii)
	jg .no

	.yes:
		clc		; clear carry (is ascii)
		jmp .return
	.no:
		stc		; set carry (not ascii)
	.return:
		add sp, 2
		pop ax
		mov sp, bp
		pop bp
		ret


isblank:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test
	cmp ax, 09h		; 09h ('\t', ascii)
	je .yes
	cmp ax, 0Ah		; 0Ah ('\n', ascii)
	je .yes
	cmp ax, 0Dh		; 0Dh ('\r', ascii)
	je .yes
	cmp ax, 20h		; 20h (' ', ascii)
	je .yes

	jmp .no			; no match

	.yes:
		clc		; clear carry (is space)
		jmp .return
	.no:
		stc		; set carry (not space)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


iscntrl:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test
	cmp ax, 00h
	jl .no
	cmp ax, 1fh		; 00h..1fh (ascii control codes)
	jg .no

	.yes:
		clc		; clear carry (is a control code)
		jmp .return
	.no:
		stc		; set carry (not a control code)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


isdigit:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test
	sub ax, '0'
	cmp ax, 0
	jl .no
	cmp ax, 9		; 30h..39h (0..9, ascii)
	jg .no

	.yes:
		clc		; clear carry (is a digit)
		jmp .return
	.no:
		stc		; set carry (not a digit)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret

isgraph:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test
	cmp ax, 21h
	jl .no
	cmp ax, 0FFh		; 21h..0FFh (graphical chars, except space)
	jg .no

	.yes:
		clc		; clear carry (is graphical)
		jmp .return
	.no:
		stc		; set carry (not graphical)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


islower:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test

	cmp ax, 'a'
	jl .no
	cmp ax, 'z'		; 61h..7Ah (a..z, ascii)
	jg .no

	.yes:
		clc		; clear carry (is lowercase)
		jmp .return
	.no:
		stc		; set carry (not lowercase)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


isprint:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test
	cmp ax, 20h
	jl .no
	cmp ax, 0FFh		; 20h..0FFh (graphical chars, including space)
	jg .no

	.yes:
		clc		; clear carry (is graphical)
		jmp .return
	.no:
		stc		; set carry (not graphical)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


ispunct:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test

	push ax
	call isalnum		; should not be alphanumeric
	jc .no

	call isblank		; should not be blank
	jc .no

	cmp ax, 21h		; 21h ('!', ascii)
	jl .no
	cmp ax, 40h		; 40h ('@')
	jg .no

	jmp .yes		; other possibilities exhausted
				; this must be punctuation of some kind

	.yes:
		add sp, 2
		clc		; clear carry (is punctuation)
		jmp .return
	.no:
		add sp, 2
		stc		; set carry (not punctuation)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


isupper:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test

	cmp ax, 'A'
	jl .no
	cmp ax, 'Z'		; 41h..5Ah (A..Z, ascii)
	jg .no

	.yes:
		clc		; clear carry (is uppercase)
		jmp .return
	.no:
		stc		; set carry (not uppercase)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret


isxdigit:
	push bp
	mov bp, sp
	push ax

	xor ax, ax		; initialize AX
	mov ax, [bp + 4]	; value to test

	push ax
	call isdigit
	jnc .yes

	.check_hexalpha_upper:
		cmp ax, 'A'
		jl .no
		cmp ax, 'F'	; 41h..46h (A..F, ascii)
		jg .check_hexalpha_lower

		jmp .yes

	.check_hexalpha_lower:
		cmp ax, 'a'
		jl .no
		cmp ax, 'f'	; 61h..66h (a..f, ascii)
		jg .no

	.yes:
		add sp, 2
		clc		; clear carry (is hex)
		jmp .return
	.no:
		add sp, 2
		stc		; set carry (not hex)
	.return:
		pop ax
		mov sp, bp
		pop bp
		ret
%endif