Subversion Repositories Kolibri OS

Rev

Rev 1039 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1039 Rev 1053
1
; flat assembler core
1
; flat assembler core
2
; Copyright (c) 1999-2009, Tomasz Grysztar.
2
; Copyright (c) 1999-2009, Tomasz Grysztar.
3
; All rights reserved.
3
; All rights reserved.
4
 
4
 
5
preprocessor:
5
preprocessor:
6
	mov	edi,characters
6
	mov	edi,characters
7
	xor	al,al
7
	xor	al,al
8
      make_characters_table:
8
      make_characters_table:
9
	stosb
9
	stosb
10
	inc	al
10
	inc	al
11
	jnz	make_characters_table
11
	jnz	make_characters_table
12
	mov	esi,characters+'a'
12
	mov	esi,characters+'a'
13
	mov	edi,characters+'A'
13
	mov	edi,characters+'A'
14
	mov	ecx,26
14
	mov	ecx,26
15
	rep	movsb
15
	rep	movsb
16
	mov	edi,characters
16
	mov	edi,characters
17
	mov	esi,symbol_characters+1
17
	mov	esi,symbol_characters+1
18
	movzx	ecx,byte [esi-1]
18
	movzx	ecx,byte [esi-1]
19
	xor	eax,eax
19
	xor	eax,eax
20
      mark_symbol_characters:
20
      mark_symbol_characters:
21
	lodsb
21
	lodsb
22
	mov	byte [edi+eax],0
22
	mov	byte [edi+eax],0
23
	loop	mark_symbol_characters
23
	loop	mark_symbol_characters
24
	mov	edi,locals_counter
24
	mov	edi,locals_counter
25
	mov	ax,1 + '0' shl 8
25
	mov	ax,1 + '0' shl 8
26
	stos	word [edi]
26
	stos	word [edi]
27
	mov	edi,[memory_start]
27
	mov	edi,[memory_start]
28
	mov	[include_paths],edi
28
	mov	[include_paths],edi
29
	mov	esi,include_variable
29
	mov	esi,include_variable
30
	call	get_environment_variable
30
	call	get_environment_variable
31
	xor	al,al
31
	xor	al,al
32
	stosb
32
	stos	byte [edi]
33
	mov	[memory_start],edi
33
	mov	[memory_start],edi
34
	mov	eax,[additional_memory]
34
	mov	eax,[additional_memory]
35
	mov	[free_additional_memory],eax
35
	mov	[free_additional_memory],eax
36
	mov	eax,[additional_memory_end]
36
	mov	eax,[additional_memory_end]
37
	mov	[labels_list],eax
37
	mov	[labels_list],eax
38
	xor	eax,eax
38
	xor	eax,eax
39
	mov	[display_buffer],eax
39
	mov	[display_buffer],eax
40
	mov	[hash_tree],eax
40
	mov	[hash_tree],eax
41
	mov	[macro_status],al
41
	mov	[macro_status],al
42
 
42
	mov	esi,[input_file]
43
	mov	esi,predefinitions
-
 
44
      process_predefinitions:
-
 
45
	movzx	ecx,byte [esi]
-
 
46
	test	ecx,ecx
-
 
47
	jz	predefinitions_ok
-
 
48
	inc	esi
-
 
49
	lea	eax,[esi+ecx]
-
 
50
	push	eax
-
 
51
	mov	ch,10b
-
 
52
	call	add_preprocessor_symbol
-
 
53
	pop	esi
-
 
54
	mov	edi,[memory_start]
-
 
55
	mov	[edx+8],edi
-
 
56
      convert_predefinition:
-
 
57
	cmp	edi,[memory_end]
-
 
58
	jae	out_of_memory
-
 
59
	lods	byte [esi]
-
 
60
	or	al,al
-
 
61
	jz	predefinition_converted
-
 
62
	cmp	al,20h
-
 
63
	je	convert_predefinition
-
 
64
	mov	ah,al
-
 
65
	mov	ebx,characters
-
 
66
	xlat	byte [ebx]
-
 
67
	or	al,al
-
 
68
	jz	predefinition_separator
-
 
69
	cmp	ah,27h
-
 
70
	je	predefinition_string
-
 
71
	cmp	ah,22h
-
 
72
	je	predefinition_string
-
 
73
	mov	byte [edi],1Ah
-
 
74
	scas	word [edi]
-
 
75
	xchg	al,ah
-
 
76
	stos	byte [edi]
-
 
77
	mov	ebx,characters
-
 
78
	xor	ecx,ecx
-
 
79
      predefinition_symbol:
-
 
80
	lods	byte [esi]
-
 
81
	stos	byte [edi]
-
 
82
	xlat	byte [ebx]
-
 
83
	or	al,al
-
 
84
	loopnzd predefinition_symbol
-
 
85
	neg	ecx
-
 
86
	cmp	ecx,255
-
 
87
	ja	invalid_definition
-
 
88
	mov	ebx,edi
-
 
89
	sub	ebx,ecx
-
 
90
	mov	byte [ebx-2],cl
-
 
91
      found_predefinition_separator:
-
 
92
	dec	edi
-
 
93
	mov	ah,[esi-1]
-
 
94
      predefinition_separator:
-
 
95
	xchg	al,ah
-
 
96
	or	al,al
-
 
97
	jz	predefinition_converted
-
 
98
	cmp	al,20h
-
 
99
	je	convert_line_data
-
 
100
	cmp	al,3Bh
-
 
101
	je	invalid_definition
-
 
102
	cmp	al,5Ch
-
 
103
	je	predefinition_backslash
-
 
104
	stos	byte [edi]
-
 
105
	jmp	convert_predefinition
-
 
106
      predefinition_string:
-
 
107
	mov	al,22h
-
 
108
	stos	byte [edi]
-
 
109
	scas	dword [edi]
-
 
110
	mov	ebx,edi
-
 
111
      copy_predefinition_string:
-
 
112
	lods	byte [esi]
-
 
113
	stos	byte [edi]
-
 
114
	or	al,al
-
 
115
	jz	invalid_definition
-
 
116
	cmp	al,ah
-
 
117
	jne	copy_predefinition_string
-
 
118
	lods	byte [esi]
-
 
119
	cmp	al,ah
-
 
120
	je	copy_predefinition_string
-
 
121
	dec	esi
-
 
122
	dec	edi
-
 
123
	mov	eax,edi
-
 
124
	sub	eax,ebx
-
 
125
	mov	[ebx-4],eax
-
 
126
	jmp	convert_predefinition
-
 
127
      predefinition_backslash:
-
 
128
	mov	byte [edi],0
-
 
129
	lods	byte [esi]
-
 
130
	or	al,al
-
 
131
	jz	invalid_definition
-
 
132
	cmp	al,20h
-
 
133
	je	invalid_definition
-
 
134
	cmp	al,3Bh
-
 
135
	je	invalid_definition
-
 
136
	mov	al,1Ah
-
 
137
	stos	byte [edi]
-
 
138
	mov	ecx,edi
-
 
139
	mov	ax,5C01h
-
 
140
	stos	word [edi]
-
 
141
	dec	esi
-
 
142
      group_predefinition_backslashes:
-
 
143
	lods	byte [esi]
-
 
144
	cmp	al,5Ch
-
 
145
	jne	predefinition_backslashed_symbol
-
 
146
	stos	byte [edi]
-
 
147
	inc	byte [ecx]
-
 
148
	jmp	group_predefinition_backslashes
-
 
149
      predefinition_backslashed_symbol:
-
 
150
	cmp	al,20h
-
 
151
	je	invalid_definition
-
 
152
	cmp	al,22h
-
 
153
	je	invalid_definition
-
 
154
	cmp	al,27h
-
 
155
	je	invalid_definition
-
 
156
	cmp	al,3Bh
-
 
157
	je	invalid_definition
-
 
158
	mov	ah,al
-
 
159
	mov	ebx,characters
-
 
160
	xlat	byte [ebx]
-
 
161
	or	al,al
-
 
162
	jz	predefinition_backslashed_symbol_character
-
 
163
	mov	al,ah
-
 
164
      convert_predefinition_backslashed_symbol:
-
 
165
	stos	byte [edi]
-
 
166
	xlat	byte [ebx]
-
 
167
	or	al,al
-
 
168
	jz	found_predefinition_separator
-
 
169
	inc	byte [ecx]
-
 
170
	jz	invalid_definition
-
 
171
	lods	byte [esi]
-
 
172
	jmp	convert_predefinition_backslashed_symbol
-
 
173
      predefinition_backslashed_symbol_character:
-
 
174
	mov	al,ah
-
 
175
	stos	byte [edi]
-
 
176
	inc	byte [ecx]
-
 
177
	jmp	convert_predefinition
-
 
178
      predefinition_converted:
-
 
179
	mov	[memory_start],edi
-
 
180
	sub	edi,[edx+8]
-
 
181
	mov	[edx+12],edi
-
 
182
	jmp	process_predefinitions
-
 
183
      predefinitions_ok:
-
 
184
 
-
 
185
	mov	esi,[input_file]
-
 
186
	mov	edx,esi
43
	mov	edx,esi
187
	call	open
44
	call	open
188
	jc	main_file_not_found
45
	jc	main_file_not_found
189
	mov	edi,[memory_start]
46
	mov	edi,[memory_start]
190
	call	preprocess_file
47
	call	preprocess_file
191
	mov	eax,[error_line]
48
	mov	eax,[error_line]
192
	mov	[current_line],eax
49
	mov	[current_line],eax
193
	cmp	[macro_status],0
50
	cmp	[macro_status],0
194
	jne	incomplete_macro
51
	jne	incomplete_macro
195
	mov	[source_start],edi
52
	mov	[source_start],edi
196
	ret
53
	ret
197
 
54
 
198
preprocess_file:
55
preprocess_file:
199
	push	[memory_end]
56
	push	[memory_end]
200
	push	esi
57
	push	esi
201
	mov	al,2
58
	mov	al,2
202
	xor	edx,edx
59
	xor	edx,edx
203
	call	lseek
60
	call	lseek
204
	push	eax
61
	push	eax
205
	xor	al,al
62
	xor	al,al
206
	xor	edx,edx
63
	xor	edx,edx
207
	call	lseek
64
	call	lseek
208
	pop	ecx
65
	pop	ecx
209
	mov	edx,[memory_end]
66
	mov	edx,[memory_end]
210
	dec	edx
67
	dec	edx
211
	mov	byte [edx],1Ah
68
	mov	byte [edx],1Ah
212
	sub	edx,ecx
69
	sub	edx,ecx
213
	jc	out_of_memory
70
	jc	out_of_memory
214
	mov	esi,edx
71
	mov	esi,edx
215
	cmp	edx,edi
72
	cmp	edx,edi
216
	jbe	out_of_memory
73
	jbe	out_of_memory
217
	mov	[memory_end],edx
74
	mov	[memory_end],edx
218
	call	read
75
	call	read
219
	call	close
76
	call	close
220
	pop	edx
77
	pop	edx
221
	xor	ecx,ecx
78
	xor	ecx,ecx
222
	mov	ebx,esi
79
	mov	ebx,esi
223
      preprocess_source:
80
      preprocess_source:
224
	inc	ecx
81
	inc	ecx
225
	mov	[current_line],edi
82
	mov	[current_line],edi
226
	mov	eax,edx
83
	mov	eax,edx
227
	stos	dword [edi]
84
	stos	dword [edi]
228
	mov	eax,ecx
85
	mov	eax,ecx
229
	stos	dword [edi]
86
	stos	dword [edi]
230
	mov	eax,esi
87
	mov	eax,esi
231
	sub	eax,ebx
88
	sub	eax,ebx
232
	stos	dword [edi]
89
	stos	dword [edi]
233
	xor	eax,eax
90
	xor	eax,eax
234
	stos	dword [edi]
91
	stos	dword [edi]
235
	push	ebx edx
92
	push	ebx edx
236
	call	convert_line
93
	call	convert_line
237
	call	preprocess_line
94
	call	preprocess_line
238
	pop	edx ebx
95
	pop	edx ebx
239
      next_line:
96
      next_line:
240
	cmp	byte [esi-1],1Ah
97
	cmp	byte [esi-1],1Ah
241
	jne	preprocess_source
98
	jne	preprocess_source
242
      file_end:
99
      file_end:
243
	pop	[memory_end]
100
	pop	[memory_end]
244
	clc
101
	clc
245
	ret
102
	ret
246
 
103
 
247
convert_line:
104
convert_line:
248
	push	ecx
105
	push	ecx
249
	test	[macro_status],0Fh
106
	test	[macro_status],0Fh
250
	jz	convert_line_data
107
	jz	convert_line_data
251
	mov	ax,3Bh
108
	mov	ax,3Bh
252
	stos	word [edi]
109
	stos	word [edi]
253
      convert_line_data:
110
      convert_line_data:
254
	cmp	edi,[memory_end]
111
	cmp	edi,[memory_end]
255
	jae	out_of_memory
112
	jae	out_of_memory
256
	lods	byte [esi]
113
	lods	byte [esi]
257
	cmp	al,20h
114
	cmp	al,20h
258
	je	convert_line_data
115
	je	convert_line_data
259
	cmp	al,9
116
	cmp	al,9
260
	je	convert_line_data
117
	je	convert_line_data
261
	mov	ah,al
118
	mov	ah,al
262
	mov	ebx,characters
119
	mov	ebx,characters
263
	xlat	byte [ebx]
120
	xlat	byte [ebx]
264
	or	al,al
121
	or	al,al
265
	jz	convert_separator
122
	jz	convert_separator
266
	cmp	ah,27h
123
	cmp	ah,27h
267
	je	convert_string
124
	je	convert_string
268
	cmp	ah,22h
125
	cmp	ah,22h
269
	je	convert_string
126
	je	convert_string
270
	mov	byte [edi],1Ah
127
	mov	byte [edi],1Ah
271
	scas	word [edi]
128
	scas	word [edi]
272
	xchg	al,ah
129
	xchg	al,ah
273
	stos	byte [edi]
130
	stos	byte [edi]
274
	mov	ebx,characters
131
	mov	ebx,characters
275
	xor	ecx,ecx
132
	xor	ecx,ecx
276
      convert_symbol:
133
      convert_symbol:
277
	lods	byte [esi]
134
	lods	byte [esi]
278
	stos	byte [edi]
135
	stos	byte [edi]
279
	xlat	byte [ebx]
136
	xlat	byte [ebx]
280
	or	al,al
137
	or	al,al
281
	loopnzd convert_symbol
138
	loopnzd convert_symbol
282
	neg	ecx
139
	neg	ecx
283
	cmp	ecx,255
140
	cmp	ecx,255
284
	ja	name_too_long
141
	ja	name_too_long
285
	mov	ebx,edi
142
	mov	ebx,edi
286
	sub	ebx,ecx
143
	sub	ebx,ecx
287
	mov	byte [ebx-2],cl
144
	mov	byte [ebx-2],cl
288
      found_separator:
145
      found_separator:
289
	dec	edi
146
	dec	edi
290
	mov	ah,[esi-1]
147
	mov	ah,[esi-1]
291
      convert_separator:
148
      convert_separator:
292
	xchg	al,ah
149
	xchg	al,ah
293
	cmp	al,20h
150
	cmp	al,20h
294
	jb	control_character
151
	jb	control_character
295
	je	convert_line_data
152
	je	convert_line_data
296
      symbol_character:
153
      symbol_character:
297
	cmp	al,3Bh
154
	cmp	al,3Bh
298
	je	ignore_comment
155
	je	ignore_comment
299
	cmp	al,5Ch
156
	cmp	al,5Ch
300
	je	backslash_character
157
	je	backslash_character
301
	stos	byte [edi]
158
	stos	byte [edi]
302
	jmp	convert_line_data
159
	jmp	convert_line_data
303
      control_character:
160
      control_character:
304
	cmp	al,1Ah
161
	cmp	al,1Ah
305
	je	line_end
162
	je	line_end
306
	cmp	al,0Dh
163
	cmp	al,0Dh
307
	je	cr_character
164
	je	cr_character
308
	cmp	al,0Ah
165
	cmp	al,0Ah
309
	je	lf_character
166
	je	lf_character
310
	cmp	al,9
167
	cmp	al,9
311
	je	convert_line_data
168
	je	convert_line_data
312
	or	al,al
169
	or	al,al
313
	jnz	symbol_character
170
	jnz	symbol_character
314
	jmp	line_end
171
	jmp	line_end
315
      lf_character:
172
      lf_character:
316
	lods	byte [esi]
173
	lods	byte [esi]
317
	cmp	al,0Dh
174
	cmp	al,0Dh
318
	je	line_end
175
	je	line_end
319
	dec	esi
176
	dec	esi
320
	jmp	line_end
177
	jmp	line_end
321
      cr_character:
178
      cr_character:
322
	lods	byte [esi]
179
	lods	byte [esi]
323
	cmp	al,0Ah
180
	cmp	al,0Ah
324
	je	line_end
181
	je	line_end
325
	dec	esi
182
	dec	esi
326
	jmp	line_end
183
	jmp	line_end
327
      convert_string:
184
      convert_string:
328
	mov	al,22h
185
	mov	al,22h
329
	stos	byte [edi]
186
	stos	byte [edi]
330
	scas	dword [edi]
187
	scas	dword [edi]
331
	mov	ebx,edi
188
	mov	ebx,edi
332
      copy_string:
189
      copy_string:
333
	lods	byte [esi]
190
	lods	byte [esi]
334
	stos	byte [edi]
191
	stos	byte [edi]
335
	cmp	al,0Ah
192
	cmp	al,0Ah
336
	je	missing_end_quote
193
	je	missing_end_quote
337
	cmp	al,0Dh
194
	cmp	al,0Dh
338
	je	missing_end_quote
195
	je	missing_end_quote
339
	or	al,al
196
	or	al,al
340
	jz	missing_end_quote
197
	jz	missing_end_quote
341
	cmp	al,1Ah
198
	cmp	al,1Ah
342
	je	missing_end_quote
199
	je	missing_end_quote
343
	cmp	al,ah
200
	cmp	al,ah
344
	jne	copy_string
201
	jne	copy_string
345
	lods	byte [esi]
202
	lods	byte [esi]
346
	cmp	al,ah
203
	cmp	al,ah
347
	je	copy_string
204
	je	copy_string
348
	dec	esi
205
	dec	esi
349
	dec	edi
206
	dec	edi
350
	mov	eax,edi
207
	mov	eax,edi
351
	sub	eax,ebx
208
	sub	eax,ebx
352
	mov	[ebx-4],eax
209
	mov	[ebx-4],eax
353
	jmp	convert_line_data
210
	jmp	convert_line_data
354
      backslash_character:
211
      backslash_character:
355
	mov	byte [edi],0
212
	mov	byte [edi],0
356
	lods	byte [esi]
213
	lods	byte [esi]
357
	cmp	al,20h
214
	cmp	al,20h
358
	je	concatenate_lines
215
	je	concatenate_lines
359
	cmp	al,9
216
	cmp	al,9
360
	je	concatenate_lines
217
	je	concatenate_lines
361
	cmp	al,1Ah
218
	cmp	al,1Ah
362
	je	unexpected_end_of_file
219
	je	unexpected_end_of_file
363
	cmp	al,0Ah
220
	cmp	al,0Ah
364
	je	concatenate_lf
221
	je	concatenate_lf
365
	cmp	al,0Dh
222
	cmp	al,0Dh
366
	je	concatenate_cr
223
	je	concatenate_cr
367
	cmp	al,3Bh
224
	cmp	al,3Bh
368
	je	find_concatenated_line
225
	je	find_concatenated_line
369
	mov	al,1Ah
226
	mov	al,1Ah
370
	stos	byte [edi]
227
	stos	byte [edi]
371
	mov	ecx,edi
228
	mov	ecx,edi
372
	mov	ax,5C01h
229
	mov	ax,5C01h
373
	stos	word [edi]
230
	stos	word [edi]
374
	dec	esi
231
	dec	esi
375
      group_backslashes:
232
      group_backslashes:
376
	lods	byte [esi]
233
	lods	byte [esi]
377
	cmp	al,5Ch
234
	cmp	al,5Ch
378
	jne	backslashed_symbol
235
	jne	backslashed_symbol
379
	stos	byte [edi]
236
	stos	byte [edi]
380
	inc	byte [ecx]
237
	inc	byte [ecx]
381
	jmp	group_backslashes
238
	jmp	group_backslashes
382
      backslashed_symbol:
239
      backslashed_symbol:
383
	cmp	al,1Ah
240
	cmp	al,1Ah
384
	je	unexpected_end_of_file
241
	je	unexpected_end_of_file
385
	cmp	al,0Ah
242
	cmp	al,0Ah
386
	je	extra_characters_on_line
243
	je	extra_characters_on_line
387
	cmp	al,0Dh
244
	cmp	al,0Dh
388
	je	extra_characters_on_line
245
	je	extra_characters_on_line
389
	cmp	al,20h
246
	cmp	al,20h
390
	je	extra_characters_on_line
247
	je	extra_characters_on_line
391
	cmp	al,9
248
	cmp	al,9
392
	je	extra_characters_on_line
249
	je	extra_characters_on_line
393
	cmp	al,22h
250
	cmp	al,22h
394
	je	extra_characters_on_line
251
	je	extra_characters_on_line
395
	cmp	al,27h
252
	cmp	al,27h
396
	je	extra_characters_on_line
253
	je	extra_characters_on_line
397
	cmp	al,3Bh
254
	cmp	al,3Bh
398
	je	extra_characters_on_line
255
	je	extra_characters_on_line
399
	mov	ah,al
256
	mov	ah,al
400
	mov	ebx,characters
257
	mov	ebx,characters
401
	xlat	byte [ebx]
258
	xlat	byte [ebx]
402
	or	al,al
259
	or	al,al
403
	jz	backslashed_symbol_character
260
	jz	backslashed_symbol_character
404
	mov	al,ah
261
	mov	al,ah
405
      convert_backslashed_symbol:
262
      convert_backslashed_symbol:
406
	stos	byte [edi]
263
	stos	byte [edi]
407
	xlat	byte [ebx]
264
	xlat	byte [ebx]
408
	or	al,al
265
	or	al,al
409
	jz	found_separator
266
	jz	found_separator
410
	inc	byte [ecx]
267
	inc	byte [ecx]
411
	jz	name_too_long
268
	jz	name_too_long
412
	lods	byte [esi]
269
	lods	byte [esi]
413
	jmp	convert_backslashed_symbol
270
	jmp	convert_backslashed_symbol
414
      backslashed_symbol_character:
271
      backslashed_symbol_character:
415
	mov	al,ah
272
	mov	al,ah
416
	stos	byte [edi]
273
	stos	byte [edi]
417
	inc	byte [ecx]
274
	inc	byte [ecx]
418
	jmp	convert_line_data
275
	jmp	convert_line_data
419
      concatenate_lines:
276
      concatenate_lines:
420
	lods	byte [esi]
277
	lods	byte [esi]
421
	cmp	al,20h
278
	cmp	al,20h
422
	je	concatenate_lines
279
	je	concatenate_lines
423
	cmp	al,9
280
	cmp	al,9
424
	je	concatenate_lines
281
	je	concatenate_lines
425
	cmp	al,1Ah
282
	cmp	al,1Ah
426
	je	unexpected_end_of_file
283
	je	unexpected_end_of_file
427
	cmp	al,0Ah
284
	cmp	al,0Ah
428
	je	concatenate_lf
285
	je	concatenate_lf
429
	cmp	al,0Dh
286
	cmp	al,0Dh
430
	je	concatenate_cr
287
	je	concatenate_cr
431
	cmp	al,3Bh
288
	cmp	al,3Bh
432
	jne	extra_characters_on_line
289
	jne	extra_characters_on_line
433
      find_concatenated_line:
290
      find_concatenated_line:
434
	lods	byte [esi]
291
	lods	byte [esi]
435
	cmp	al,0Ah
292
	cmp	al,0Ah
436
	je	concatenate_lf
293
	je	concatenate_lf
437
	cmp	al,0Dh
294
	cmp	al,0Dh
438
	je	concatenate_cr
295
	je	concatenate_cr
439
	or	al,al
296
	or	al,al
440
	jz	concatenate_ok
297
	jz	concatenate_ok
441
	cmp	al,1Ah
298
	cmp	al,1Ah
442
	jne	find_concatenated_line
299
	jne	find_concatenated_line
443
	jmp	unexpected_end_of_file
300
	jmp	unexpected_end_of_file
444
      concatenate_lf:
301
      concatenate_lf:
445
	lods	byte [esi]
302
	lods	byte [esi]
446
	cmp	al,0Dh
303
	cmp	al,0Dh
447
	je	concatenate_ok
304
	je	concatenate_ok
448
	dec	esi
305
	dec	esi
449
	jmp	concatenate_ok
306
	jmp	concatenate_ok
450
      concatenate_cr:
307
      concatenate_cr:
451
	lods	byte [esi]
308
	lods	byte [esi]
452
	cmp	al,0Ah
309
	cmp	al,0Ah
453
	je	concatenate_ok
310
	je	concatenate_ok
454
	dec	esi
311
	dec	esi
455
      concatenate_ok:
312
      concatenate_ok:
456
	inc	dword [esp]
313
	inc	dword [esp]
457
	jmp	convert_line_data
314
	jmp	convert_line_data
458
      ignore_comment:
315
      ignore_comment:
459
	lods	byte [esi]
316
	lods	byte [esi]
460
	cmp	al,0Ah
317
	cmp	al,0Ah
461
	je	lf_character
318
	je	lf_character
462
	cmp	al,0Dh
319
	cmp	al,0Dh
463
	je	cr_character
320
	je	cr_character
464
	or	al,al
321
	or	al,al
465
	jz	line_end
322
	jz	line_end
466
	cmp	al,1Ah
323
	cmp	al,1Ah
467
	jne	ignore_comment
324
	jne	ignore_comment
468
      line_end:
325
      line_end:
469
	xor	al,al
326
	xor	al,al
470
	stos	byte [edi]
327
	stos	byte [edi]
471
	pop	ecx
328
	pop	ecx
472
	ret
329
	ret
473
 
330
 
474
lower_case:
331
lower_case:
475
	mov	edi,converted
332
	mov	edi,converted
476
	mov	ebx,characters
333
	mov	ebx,characters
477
      convert_case:
334
      convert_case:
478
	lods	byte [esi]
335
	lods	byte [esi]
479
	xlat	byte [ebx]
336
	xlat	byte [ebx]
480
	stos	byte [edi]
337
	stos	byte [edi]
481
	loop	convert_case
338
	loop	convert_case
482
      case_ok:
339
      case_ok:
483
	ret
340
	ret
484
 
341
 
485
get_directive:
342
get_directive:
486
	push	edi
343
	push	edi
487
	mov	edx,esi
344
	mov	edx,esi
488
	mov	ebp,ecx
345
	mov	ebp,ecx
489
	call	lower_case
346
	call	lower_case
490
	pop	edi
347
	pop	edi
491
      scan_directives:
348
      scan_directives:
492
	mov	esi,converted
349
	mov	esi,converted
493
	movzx	eax,byte [edi]
350
	movzx	eax,byte [edi]
494
	or	al,al
351
	or	al,al
495
	jz	no_directive
352
	jz	no_directive
496
	mov	ecx,ebp
353
	mov	ecx,ebp
497
	inc	edi
354
	inc	edi
498
	mov	ebx,edi
355
	mov	ebx,edi
499
	add	ebx,eax
356
	add	ebx,eax
500
	mov	ah,[esi]
357
	mov	ah,[esi]
501
	cmp	ah,[edi]
358
	cmp	ah,[edi]
502
	jb	no_directive
359
	jb	no_directive
503
	ja	next_directive
360
	ja	next_directive
504
	cmp	cl,al
361
	cmp	cl,al
505
	jne	next_directive
362
	jne	next_directive
506
	repe	cmps byte [esi],[edi]
363
	repe	cmps byte [esi],[edi]
507
	jb	no_directive
364
	jb	no_directive
508
	je	directive_ok
365
	je	directive_ok
509
      next_directive:
366
      next_directive:
510
	mov	edi,ebx
367
	mov	edi,ebx
511
	add	edi,2
368
	add	edi,2
512
	jmp	scan_directives
369
	jmp	scan_directives
513
      no_directive:
370
      no_directive:
514
	mov	esi,edx
371
	mov	esi,edx
515
	mov	ecx,ebp
372
	mov	ecx,ebp
516
	stc
373
	stc
517
	ret
374
	ret
518
      directive_ok:
375
      directive_ok:
519
	lea	esi,[edx+ebp]
376
	lea	esi,[edx+ebp]
520
	movzx	eax,word [ebx]
377
	movzx	eax,word [ebx]
521
	add	eax,preprocessor
378
	add	eax,preprocessor
522
	clc
379
	clc
523
	ret
380
	ret
524
 
381
 
525
 
382
 
526
preprocess_line:
383
preprocess_line:
527
	mov	eax,esp
384
	mov	eax,esp
528
	sub	eax,100h
385
	sub	eax,100h
529
	jc	stack_overflow
386
	jc	stack_overflow
530
	cmp	eax,[stack_limit]
387
	cmp	eax,[stack_limit]
531
	jb	stack_overflow
388
	jb	stack_overflow
532
	push	ecx esi
389
	push	ecx esi
533
      preprocess_current_line:
390
      preprocess_current_line:
534
	mov	esi,[current_line]
391
	mov	esi,[current_line]
535
	add	esi,16
392
	add	esi,16
536
	cmp	word [esi],3Bh
393
	cmp	word [esi],3Bh
537
	jne	line_start_ok
394
	jne	line_start_ok
538
	add	esi,2
395
	add	esi,2
539
      line_start_ok:
396
      line_start_ok:
540
	test	[macro_status],0F0h
397
	test	[macro_status],0F0h
541
	jnz	macro_preprocessing
398
	jnz	macro_preprocessing
542
	cmp	byte [esi],1Ah
399
	cmp	byte [esi],1Ah
543
	jne	not_fix_constant
400
	jne	not_fix_constant
544
	movzx	edx,byte [esi+1]
401
	movzx	edx,byte [esi+1]
545
	lea	edx,[esi+2+edx]
402
	lea	edx,[esi+2+edx]
546
	cmp	word [edx],031Ah
403
	cmp	word [edx],031Ah
547
	jne	not_fix_constant
404
	jne	not_fix_constant
548
	mov	ebx,characters
405
	mov	ebx,characters
549
	movzx	eax,byte [edx+2]
406
	movzx	eax,byte [edx+2]
550
	xlat	byte [ebx]
407
	xlat	byte [ebx]
551
	ror	eax,8
408
	ror	eax,8
552
	mov	al,[edx+3]
409
	mov	al,[edx+3]
553
	xlat	byte [ebx]
410
	xlat	byte [ebx]
554
	ror	eax,8
411
	ror	eax,8
555
	mov	al,[edx+4]
412
	mov	al,[edx+4]
556
	xlat	byte [ebx]
413
	xlat	byte [ebx]
557
	ror	eax,16
414
	ror	eax,16
558
	cmp	eax,'fix'
415
	cmp	eax,'fix'
559
	je	define_fix_constant
416
	je	define_fix_constant
560
      not_fix_constant:
417
      not_fix_constant:
561
	call	process_fix_constants
418
	call	process_fix_constants
562
	jmp	initial_preprocessing_ok
419
	jmp	initial_preprocessing_ok
563
      macro_preprocessing:
420
      macro_preprocessing:
564
	call	process_macro_operators
421
	call	process_macro_operators
565
      initial_preprocessing_ok:
422
      initial_preprocessing_ok:
566
	mov	esi,[current_line]
423
	mov	esi,[current_line]
567
	add	esi,16
424
	add	esi,16
568
	mov	al,[macro_status]
425
	mov	al,[macro_status]
569
	test	al,2
426
	test	al,2
570
	jnz	skip_macro_block
427
	jnz	skip_macro_block
571
	test	al,1
428
	test	al,1
572
	jnz	find_macro_block
429
	jnz	find_macro_block
573
      preprocess_instruction:
430
      preprocess_instruction:
574
	mov	[current_offset],esi
431
	mov	[current_offset],esi
575
	lods	byte [esi]
432
	lods	byte [esi]
576
	movzx	ecx,byte [esi]
433
	movzx	ecx,byte [esi]
577
	inc	esi
434
	inc	esi
578
	cmp	al,1Ah
435
	cmp	al,1Ah
579
	jne	not_preprocessor_symbol
436
	jne	not_preprocessor_symbol
580
	cmp	cl,3
437
	cmp	cl,3
581
	jb	not_preprocessor_directive
438
	jb	not_preprocessor_directive
582
	push	edi
439
	push	edi
583
	mov	edi,preprocessor_directives
440
	mov	edi,preprocessor_directives
584
	call	get_directive
441
	call	get_directive
585
	pop	edi
442
	pop	edi
586
	jc	not_preprocessor_directive
443
	jc	not_preprocessor_directive
587
	mov	byte [edx-2],3Bh
444
	mov	byte [edx-2],3Bh
588
	jmp	near eax
445
	jmp	near eax
589
      not_preprocessor_directive:
446
      not_preprocessor_directive:
590
	xor	ch,ch
447
	xor	ch,ch
591
	call	get_preprocessor_symbol
448
	call	get_preprocessor_symbol
592
	jc	not_macro
449
	jc	not_macro
593
	mov	byte [ebx-2],3Bh
450
	mov	byte [ebx-2],3Bh
594
	mov	[struc_name],0
451
	mov	[struc_name],0
595
	jmp	use_macro
452
	jmp	use_macro
596
      not_macro:
453
      not_macro:
597
	mov	[struc_name],esi
454
	mov	[struc_name],esi
598
	add	esi,ecx
455
	add	esi,ecx
599
	lods	byte [esi]
456
	lods	byte [esi]
600
	cmp	al,':'
457
	cmp	al,':'
601
	je	preprocess_label
458
	je	preprocess_label
602
	cmp	al,1Ah
459
	cmp	al,1Ah
603
	jne	not_preprocessor_symbol
460
	jne	not_preprocessor_symbol
604
	lods	byte [esi]
461
	lods	byte [esi]
605
	cmp	al,3
462
	cmp	al,3
606
	jne	not_symbolic_constant
463
	jne	not_symbolic_constant
607
	mov	ebx,characters
464
	mov	ebx,characters
608
	movzx	eax,byte [esi]
465
	movzx	eax,byte [esi]
609
	xlat	byte [ebx]
466
	xlat	byte [ebx]
610
	ror	eax,8
467
	ror	eax,8
611
	mov	al,[esi+1]
468
	mov	al,[esi+1]
612
	xlat	byte [ebx]
469
	xlat	byte [ebx]
613
	ror	eax,8
470
	ror	eax,8
614
	mov	al,[esi+2]
471
	mov	al,[esi+2]
615
	xlat	byte [ebx]
472
	xlat	byte [ebx]
616
	ror	eax,16
473
	ror	eax,16
617
	cmp	eax,'equ'
474
	cmp	eax,'equ'
618
	je	define_equ_constant
475
	je	define_equ_constant
619
	mov	al,3
476
	mov	al,3
620
      not_symbolic_constant:
477
      not_symbolic_constant:
621
	mov	ch,1
478
	mov	ch,1
622
	mov	cl,al
479
	mov	cl,al
623
	call	get_preprocessor_symbol
480
	call	get_preprocessor_symbol
624
	jc	not_preprocessor_symbol
481
	jc	not_preprocessor_symbol
625
	push	edx esi
482
	push	edx esi
626
	mov	esi,[struc_name]
483
	mov	esi,[struc_name]
627
	mov	[struc_label],esi
484
	mov	[struc_label],esi
628
	sub	[struc_label],2
485
	sub	[struc_label],2
629
	mov	cl,[esi-1]
486
	mov	cl,[esi-1]
630
	mov	ch,10b
487
	mov	ch,10b
631
	call	get_preprocessor_symbol
488
	call	get_preprocessor_symbol
632
	jc	struc_name_ok
489
	jc	struc_name_ok
633
	mov	ecx,[edx+12]
490
	mov	ecx,[edx+12]
634
	add	ecx,3
491
	add	ecx,3
635
	lea	ebx,[edi+ecx]
492
	lea	ebx,[edi+ecx]
636
	mov	ecx,edi
493
	mov	ecx,edi
637
	sub	ecx,[struc_label]
494
	sub	ecx,[struc_label]
638
	lea	esi,[edi-1]
495
	lea	esi,[edi-1]
639
	lea	edi,[ebx-1]
496
	lea	edi,[ebx-1]
640
	std
497
	std
641
	rep	movs byte [edi],[esi]
498
	rep	movs byte [edi],[esi]
642
	cld
499
	cld
643
	mov	edi,[struc_label]
500
	mov	edi,[struc_label]
644
	mov	esi,[edx+8]
501
	mov	esi,[edx+8]
645
	mov	ecx,[edx+12]
502
	mov	ecx,[edx+12]
646
	add	[struc_name],ecx
503
	add	[struc_name],ecx
647
	add	[struc_name],3
504
	add	[struc_name],3
648
	call	move_data
505
	call	move_data
649
	mov	al,3Ah
506
	mov	al,3Ah
650
	stos	byte [edi]
507
	stos	byte [edi]
651
	mov	ax,3Bh
508
	mov	ax,3Bh
652
	stos	word [edi]
509
	stos	word [edi]
653
	mov	edi,ebx
510
	mov	edi,ebx
654
	pop	esi
511
	pop	esi
655
	add	esi,[edx+12]
512
	add	esi,[edx+12]
656
	add	esi,3
513
	add	esi,3
657
	pop	edx
514
	pop	edx
658
	jmp	use_macro
515
	jmp	use_macro
659
      struc_name_ok:
516
      struc_name_ok:
660
	mov	edx,[struc_name]
517
	mov	edx,[struc_name]
661
	movzx	eax,byte [edx-1]
518
	movzx	eax,byte [edx-1]
662
	add	edx,eax
519
	add	edx,eax
663
	push	edi
520
	push	edi
664
	lea	esi,[edi-1]
521
	lea	esi,[edi-1]
665
	mov	ecx,edi
522
	mov	ecx,edi
666
	sub	ecx,edx
523
	sub	ecx,edx
667
	std
524
	std
668
	rep	movs byte [edi],[esi]
525
	rep	movs byte [edi],[esi]
669
	cld
526
	cld
670
	pop	edi
527
	pop	edi
671
	inc	edi
528
	inc	edi
672
	mov	al,3Ah
529
	mov	al,3Ah
673
	mov	[edx],al
530
	mov	[edx],al
674
	inc	al
531
	inc	al
675
	mov	[edx+1],al
532
	mov	[edx+1],al
676
	pop	esi edx
533
	pop	esi edx
677
	inc	esi
534
	inc	esi
678
	jmp	use_macro
535
	jmp	use_macro
679
      preprocess_label:
536
      preprocess_label:
680
	dec	esi
537
	dec	esi
681
	sub	esi,ecx
538
	sub	esi,ecx
682
	lea	ebp,[esi-2]
539
	lea	ebp,[esi-2]
683
	mov	ch,10b
540
	mov	ch,10b
684
	call	get_preprocessor_symbol
541
	call	get_preprocessor_symbol
685
	jnc	symbolic_constant_in_label
542
	jnc	symbolic_constant_in_label
686
	lea	esi,[esi+ecx+1]
543
	lea	esi,[esi+ecx+1]
687
	jmp	preprocess_instruction
544
	jmp	preprocess_instruction
688
      symbolic_constant_in_label:
545
      symbolic_constant_in_label:
689
	mov	ebx,[edx+8]
546
	mov	ebx,[edx+8]
690
	mov	ecx,[edx+12]
547
	mov	ecx,[edx+12]
691
	add	ecx,ebx
548
	add	ecx,ebx
692
      check_for_broken_label:
549
      check_for_broken_label:
693
	cmp	ebx,ecx
550
	cmp	ebx,ecx
694
	je	label_broken
551
	je	label_broken
695
	cmp	byte [ebx],1Ah
552
	cmp	byte [ebx],1Ah
696
	jne	label_broken
553
	jne	label_broken
697
	movzx	eax,byte [ebx+1]
554
	movzx	eax,byte [ebx+1]
698
	lea	ebx,[ebx+2+eax]
555
	lea	ebx,[ebx+2+eax]
699
	cmp	ebx,ecx
556
	cmp	ebx,ecx
700
	je	label_constant_ok
557
	je	label_constant_ok
701
	cmp	byte [ebx],':'
558
	cmp	byte [ebx],':'
702
	jne	label_broken
559
	jne	label_broken
703
	inc	ebx
560
	inc	ebx
704
	jmp	check_for_broken_label
561
	jmp	check_for_broken_label
705
      label_broken:
562
      label_broken:
706
	push	line_preprocessed
563
	push	line_preprocessed
707
	jmp	replace_symbolic_constant
564
	jmp	replace_symbolic_constant
708
      label_constant_ok:
565
      label_constant_ok:
709
	mov	ecx,edi
566
	mov	ecx,edi
710
	sub	ecx,esi
567
	sub	ecx,esi
711
	mov	edi,[edx+12]
568
	mov	edi,[edx+12]
712
	add	edi,ebp
569
	add	edi,ebp
713
	push	edi
570
	push	edi
714
	lea	eax,[edi+ecx]
571
	lea	eax,[edi+ecx]
715
	push	eax
572
	push	eax
716
	cmp	esi,edi
573
	cmp	esi,edi
717
	je	replace_label
574
	je	replace_label
718
	jb	move_rest_of_line_up
575
	jb	move_rest_of_line_up
719
	rep	movs byte [edi],[esi]
576
	rep	movs byte [edi],[esi]
720
	jmp	replace_label
577
	jmp	replace_label
721
      move_rest_of_line_up:
578
      move_rest_of_line_up:
722
	lea	esi,[esi+ecx-1]
579
	lea	esi,[esi+ecx-1]
723
	lea	edi,[edi+ecx-1]
580
	lea	edi,[edi+ecx-1]
724
	std
581
	std
725
	rep	movs byte [edi],[esi]
582
	rep	movs byte [edi],[esi]
726
	cld
583
	cld
727
      replace_label:
584
      replace_label:
728
	mov	ecx,[edx+12]
585
	mov	ecx,[edx+12]
729
	mov	edi,[esp+4]
586
	mov	edi,[esp+4]
730
	sub	edi,ecx
587
	sub	edi,ecx
731
	mov	esi,[edx+8]
588
	mov	esi,[edx+8]
732
	rep	movs byte [edi],[esi]
589
	rep	movs byte [edi],[esi]
733
	pop	edi esi
590
	pop	edi esi
734
	inc	esi
591
	inc	esi
735
	jmp	preprocess_instruction
592
	jmp	preprocess_instruction
736
      not_preprocessor_symbol:
593
      not_preprocessor_symbol:
737
	mov	esi,[current_offset]
594
	mov	esi,[current_offset]
738
	call	process_equ_constants
595
	call	process_equ_constants
739
      line_preprocessed:
596
      line_preprocessed:
740
	pop	esi ecx
597
	pop	esi ecx
741
	ret
598
	ret
742
 
599
 
743
get_preprocessor_symbol:
600
get_preprocessor_symbol:
744
	push	ebp edi esi
601
	push	ebp edi esi
745
	mov	ebp,ecx
602
	mov	ebp,ecx
746
	shl	ebp,22
603
	shl	ebp,22
747
	movzx	ecx,cl
604
	movzx	ecx,cl
748
	mov	ebx,hash_tree
605
	mov	ebx,hash_tree
749
	mov	edi,10
606
	mov	edi,10
750
      follow_hashes_roots:
607
      follow_hashes_roots:
751
	mov	edx,[ebx]
608
	mov	edx,[ebx]
752
	or	edx,edx
609
	or	edx,edx
753
	jz	preprocessor_symbol_not_found
610
	jz	preprocessor_symbol_not_found
754
	xor	eax,eax
611
	xor	eax,eax
755
	shl	ebp,1
612
	shl	ebp,1
756
	adc	eax,0
613
	adc	eax,0
757
	lea	ebx,[edx+eax*4]
614
	lea	ebx,[edx+eax*4]
758
	dec	edi
615
	dec	edi
759
	jnz	follow_hashes_roots
616
	jnz	follow_hashes_roots
760
	mov	edi,ebx
617
	mov	edi,ebx
761
	call	calculate_hash
618
	call	calculate_hash
762
	mov	ebp,eax
619
	mov	ebp,eax
763
	and	ebp,3FFh
620
	and	ebp,3FFh
764
	shl	ebp,10
621
	shl	ebp,10
765
	xor	ebp,eax
622
	xor	ebp,eax
766
	mov	ebx,edi
623
	mov	ebx,edi
767
	mov	edi,22
624
	mov	edi,22
768
      follow_hashes_tree:
625
      follow_hashes_tree:
769
	mov	edx,[ebx]
626
	mov	edx,[ebx]
770
	or	edx,edx
627
	or	edx,edx
771
	jz	preprocessor_symbol_not_found
628
	jz	preprocessor_symbol_not_found
772
	xor	eax,eax
629
	xor	eax,eax
773
	shl	ebp,1
630
	shl	ebp,1
774
	adc	eax,0
631
	adc	eax,0
775
	lea	ebx,[edx+eax*4]
632
	lea	ebx,[edx+eax*4]
776
	dec	edi
633
	dec	edi
777
	jnz	follow_hashes_tree
634
	jnz	follow_hashes_tree
778
	mov	al,cl
635
	mov	al,cl
779
	mov	edx,[ebx]
636
	mov	edx,[ebx]
780
	or	edx,edx
637
	or	edx,edx
781
	jz	preprocessor_symbol_not_found
638
	jz	preprocessor_symbol_not_found
782
      compare_with_preprocessor_symbol:
639
      compare_with_preprocessor_symbol:
783
	mov	edi,[edx+4]
640
	mov	edi,[edx+4]
784
	cmp	edi,1
641
	cmp	edi,1
785
	jbe	next_equal_hash
642
	jbe	next_equal_hash
786
	repe	cmps byte [esi],[edi]
643
	repe	cmps byte [esi],[edi]
787
	je	preprocessor_symbol_found
644
	je	preprocessor_symbol_found
788
	mov	cl,al
645
	mov	cl,al
789
	mov	esi,[esp]
646
	mov	esi,[esp]
790
      next_equal_hash:
647
      next_equal_hash:
791
	mov	edx,[edx]
648
	mov	edx,[edx]
792
	or	edx,edx
649
	or	edx,edx
793
	jnz	compare_with_preprocessor_symbol
650
	jnz	compare_with_preprocessor_symbol
794
      preprocessor_symbol_not_found:
651
      preprocessor_symbol_not_found:
795
	pop	esi edi ebp
652
	pop	esi edi ebp
796
	stc
653
	stc
797
	ret
654
	ret
798
      preprocessor_symbol_found:
655
      preprocessor_symbol_found:
799
	pop	ebx edi ebp
656
	pop	ebx edi ebp
800
	clc
657
	clc
801
	ret
658
	ret
802
      calculate_hash:
659
      calculate_hash:
803
	xor	ebx,ebx
660
	xor	ebx,ebx
804
	mov	eax,2166136261
661
	mov	eax,2166136261
805
	mov	ebp,16777619
662
	mov	ebp,16777619
806
      fnv1a_hash:
663
      fnv1a_hash:
807
	xor	al,[esi+ebx]
664
	xor	al,[esi+ebx]
808
	mul	ebp
665
	mul	ebp
809
	inc	bl
666
	inc	bl
810
	cmp	bl,cl
667
	cmp	bl,cl
811
	jb	fnv1a_hash
668
	jb	fnv1a_hash
812
	ret
669
	ret
813
add_preprocessor_symbol:
670
add_preprocessor_symbol:
814
	push	edi esi
671
	push	edi esi
815
	cmp	ch,11b
672
	cmp	ch,11b
816
	je	preprocessor_symbol_name_ok
673
	je	preprocessor_symbol_name_ok
817
	push	ecx
674
	push	ecx
818
	movzx	ecx,cl
675
	movzx	ecx,cl
819
	mov	edi,preprocessor_directives
676
	mov	edi,preprocessor_directives
820
	call	get_directive
677
	call	get_directive
821
	jnc	reserved_word_used_as_symbol
678
	jnc	reserved_word_used_as_symbol
822
	pop	ecx
679
	pop	ecx
823
      preprocessor_symbol_name_ok:
680
      preprocessor_symbol_name_ok:
824
	call	calculate_hash
681
	call	calculate_hash
825
	mov	ebp,eax
682
	mov	ebp,eax
826
	and	ebp,3FFh
683
	and	ebp,3FFh
827
	shr	eax,10
684
	shr	eax,10
828
	xor	ebp,eax
685
	xor	ebp,eax
829
	shl	ecx,22
686
	shl	ecx,22
830
	or	ebp,ecx
687
	or	ebp,ecx
831
	mov	ebx,hash_tree
688
	mov	ebx,hash_tree
832
	mov	ecx,32
689
	mov	ecx,32
833
      find_leave_for_symbol:
690
      find_leave_for_symbol:
834
	mov	edx,[ebx]
691
	mov	edx,[ebx]
835
	or	edx,edx
692
	or	edx,edx
836
	jz	extend_hashes_tree
693
	jz	extend_hashes_tree
837
	xor	eax,eax
694
	xor	eax,eax
838
	rol	ebp,1
695
	rol	ebp,1
839
	adc	eax,0
696
	adc	eax,0
840
	lea	ebx,[edx+eax*4]
697
	lea	ebx,[edx+eax*4]
841
	dec	ecx
698
	dec	ecx
842
	jnz	find_leave_for_symbol
699
	jnz	find_leave_for_symbol
843
	mov	edx,[ebx]
700
	mov	edx,[ebx]
844
	or	edx,edx
701
	or	edx,edx
845
	jz	add_symbol_entry
702
	jz	add_symbol_entry
846
	shr	ebp,30
703
	shr	ebp,30
847
	cmp	ebp,11b
704
	cmp	ebp,11b
848
	je	reuse_symbol_entry
705
	je	reuse_symbol_entry
849
	cmp	dword [edx+4],0
706
	cmp	dword [edx+4],0
850
	jne	add_symbol_entry
707
	jne	add_symbol_entry
851
      find_entry_to_reuse:
708
      find_entry_to_reuse:
852
	mov	edi,[edx]
709
	mov	edi,[edx]
853
	or	edi,edi
710
	or	edi,edi
854
	jz	reuse_symbol_entry
711
	jz	reuse_symbol_entry
855
	cmp	dword [edi+4],0
712
	cmp	dword [edi+4],0
856
	jne	reuse_symbol_entry
713
	jne	reuse_symbol_entry
857
	mov	edx,edi
714
	mov	edx,edi
858
	jmp	find_entry_to_reuse
715
	jmp	find_entry_to_reuse
859
      add_symbol_entry:
716
      add_symbol_entry:
860
	mov	eax,edx
717
	mov	eax,edx
861
	mov	edx,[labels_list]
718
	mov	edx,[labels_list]
862
	sub	edx,16
719
	sub	edx,16
863
	cmp	edx,[free_additional_memory]
720
	cmp	edx,[free_additional_memory]
864
	jb	out_of_memory
721
	jb	out_of_memory
865
	mov	[labels_list],edx
722
	mov	[labels_list],edx
866
	mov	[edx],eax
723
	mov	[edx],eax
867
	mov	[ebx],edx
724
	mov	[ebx],edx
868
      reuse_symbol_entry:
725
      reuse_symbol_entry:
869
	pop	esi edi
726
	pop	esi edi
870
	mov	[edx+4],esi
727
	mov	[edx+4],esi
871
	ret
728
	ret
872
      extend_hashes_tree:
729
      extend_hashes_tree:
873
	mov	edx,[labels_list]
730
	mov	edx,[labels_list]
874
	sub	edx,8
731
	sub	edx,8
875
	cmp	edx,[free_additional_memory]
732
	cmp	edx,[free_additional_memory]
876
	jb	out_of_memory
733
	jb	out_of_memory
877
	mov	[labels_list],edx
734
	mov	[labels_list],edx
878
	xor	eax,eax
735
	xor	eax,eax
879
	mov	[edx],eax
736
	mov	[edx],eax
880
	mov	[edx+4],eax
737
	mov	[edx+4],eax
881
	shl	ebp,1
738
	shl	ebp,1
882
	adc	eax,0
739
	adc	eax,0
883
	mov	[ebx],edx
740
	mov	[ebx],edx
884
	lea	ebx,[edx+eax*4]
741
	lea	ebx,[edx+eax*4]
885
	dec	ecx
742
	dec	ecx
886
	jnz	extend_hashes_tree
743
	jnz	extend_hashes_tree
887
	mov	edx,[labels_list]
744
	mov	edx,[labels_list]
888
	sub	edx,16
745
	sub	edx,16
889
	cmp	edx,[free_additional_memory]
746
	cmp	edx,[free_additional_memory]
890
	jb	out_of_memory
747
	jb	out_of_memory
891
	mov	[labels_list],edx
748
	mov	[labels_list],edx
892
	mov	dword [edx],0
749
	mov	dword [edx],0
893
	mov	[ebx],edx
750
	mov	[ebx],edx
894
	pop	esi edi
751
	pop	esi edi
895
	mov	[edx+4],esi
752
	mov	[edx+4],esi
896
	ret
753
	ret
897
 
754
 
898
define_fix_constant:
755
define_fix_constant:
899
	add	edx,5
756
	add	edx,5
900
	add	esi,2
757
	add	esi,2
901
	push	edx esi
758
	push	edx esi
902
	mov	esi,edx
759
	mov	esi,edx
903
	call	skip_parameters
760
	call	skip_parameters
904
	xchg	esi,[esp]
761
	xchg	esi,[esp]
905
	mov	ch,11b
762
	mov	ch,11b
906
	jmp	define_preprocessor_constant
763
	jmp	define_preprocessor_constant
907
define_equ_constant:
764
define_equ_constant:
908
	add	esi,3
765
	add	esi,3
909
	push	esi
766
	push	esi
910
	call	process_equ_constants
767
	call	process_equ_constants
911
	push	esi
768
	push	esi
912
	mov	esi,[struc_name]
769
	mov	esi,[struc_name]
913
	mov	ch,10b
770
	mov	ch,10b
914
      define_preprocessor_constant:
771
      define_preprocessor_constant:
915
	mov	byte [esi-2],3Bh
772
	mov	byte [esi-2],3Bh
916
	mov	cl,[esi-1]
773
	mov	cl,[esi-1]
917
	call	add_preprocessor_symbol
774
	call	add_preprocessor_symbol
918
	pop	esi ebx
775
	pop	esi ebx
919
	mov	ecx,edi
776
	mov	ecx,edi
920
	dec	ecx
777
	dec	ecx
921
	sub	ecx,ebx
778
	sub	ecx,ebx
922
	mov	[edx+8],ebx
779
	mov	[edx+8],ebx
923
	mov	[edx+12],ecx
780
	mov	[edx+12],ecx
924
	jmp	line_preprocessed
781
	jmp	line_preprocessed
925
define_symbolic_constant:
782
define_symbolic_constant:
926
	lods	byte [esi]
783
	lods	byte [esi]
927
	cmp	al,1Ah
784
	cmp	al,1Ah
928
	jne	invalid_name
785
	jne	invalid_name
929
	lods	byte [esi]
786
	lods	byte [esi]
930
	mov	cl,al
787
	mov	cl,al
931
	mov	ch,10b
788
	mov	ch,10b
932
	call	add_preprocessor_symbol
789
	call	add_preprocessor_symbol
933
	movzx	eax,byte [esi-1]
790
	movzx	eax,byte [esi-1]
934
	add	esi,eax
791
	add	esi,eax
935
	push	esi edx
792
	push	esi edx
936
	call	skip_parameters
793
	call	skip_parameters
937
	pop	edx ebx
794
	pop	edx ebx
938
	lea	ecx,[esi-1]
795
	lea	ecx,[esi-1]
939
	sub	ecx,ebx
796
	sub	ecx,ebx
940
	mov	[edx+8],ebx
797
	mov	[edx+8],ebx
941
	mov	[edx+12],ecx
798
	mov	[edx+12],ecx
942
	jmp	line_preprocessed
799
	jmp	line_preprocessed
943
      skip_parameters:
800
      skip_parameters:
944
	lods	byte [esi]
801
	lods	byte [esi]
945
	or	al,al
802
	or	al,al
946
	jz	parameters_skipped
803
	jz	parameters_skipped
947
	cmp	al,'{'
804
	cmp	al,'{'
948
	je	parameters_skipped
805
	je	parameters_skipped
949
	cmp	al,22h
806
	cmp	al,22h
950
	je	skip_quoted_parameter
807
	je	skip_quoted_parameter
951
	cmp	al,1Ah
808
	cmp	al,1Ah
952
	jne	skip_parameters
809
	jne	skip_parameters
953
	lods	byte [esi]
810
	lods	byte [esi]
954
	movzx	eax,al
811
	movzx	eax,al
955
	add	esi,eax
812
	add	esi,eax
956
	jmp	skip_parameters
813
	jmp	skip_parameters
957
      skip_quoted_parameter:
814
      skip_quoted_parameter:
958
	lods	dword [esi]
815
	lods	dword [esi]
959
	add	esi,eax
816
	add	esi,eax
960
	jmp	skip_parameters
817
	jmp	skip_parameters
961
      parameters_skipped:
818
      parameters_skipped:
962
	ret
819
	ret
963
 
820
 
964
define_struc:
821
define_struc:
965
	mov	ch,1
822
	mov	ch,1
966
	jmp	make_macro
823
	jmp	make_macro
967
define_macro:
824
define_macro:
968
	xor	ch,ch
825
	xor	ch,ch
969
      make_macro:
826
      make_macro:
970
	lods	byte [esi]
827
	lods	byte [esi]
971
	cmp	al,1Ah
828
	cmp	al,1Ah
972
	jne	invalid_name
829
	jne	invalid_name
973
	lods	byte [esi]
830
	lods	byte [esi]
974
	mov	cl,al
831
	mov	cl,al
975
	call	add_preprocessor_symbol
832
	call	add_preprocessor_symbol
976
	mov	eax,[current_line]
833
	mov	eax,[current_line]
977
	mov	[edx+12],eax
834
	mov	[edx+12],eax
978
	movzx	eax,byte [esi-1]
835
	movzx	eax,byte [esi-1]
979
	add	esi,eax
836
	add	esi,eax
980
	mov	[edx+8],esi
837
	mov	[edx+8],esi
981
	mov	al,[macro_status]
838
	mov	al,[macro_status]
982
	and	al,0F0h
839
	and	al,0F0h
983
	or	al,1
840
	or	al,1
984
	mov	[macro_status],al
841
	mov	[macro_status],al
985
	mov	eax,[current_line]
842
	mov	eax,[current_line]
986
	mov	[error_line],eax
843
	mov	[error_line],eax
987
	xor	bl,bl
844
	xor	bl,bl
988
	lods	byte [esi]
845
	lods	byte [esi]
989
	or	al,al
846
	or	al,al
990
	jz	line_preprocessed
847
	jz	line_preprocessed
991
	cmp	al,'{'
848
	cmp	al,'{'
992
	je	found_macro_block
849
	je	found_macro_block
993
	dec	esi
850
	dec	esi
994
      skip_macro_arguments:
851
      skip_macro_arguments:
995
	lods	byte [esi]
852
	lods	byte [esi]
996
	cmp	al,1Ah
853
	cmp	al,1Ah
997
	je	skip_macro_argument
854
	je	skip_macro_argument
998
	cmp	al,'['
855
	cmp	al,'['
999
	jne	invalid_macro_arguments
856
	jne	invalid_macro_arguments
1000
	xor	bl,-1
857
	xor	bl,-1
1001
	jz	invalid_macro_arguments
858
	jz	invalid_macro_arguments
1002
	lods	byte [esi]
859
	lods	byte [esi]
1003
	cmp	al,1Ah
860
	cmp	al,1Ah
1004
	jne	invalid_macro_arguments
861
	jne	invalid_macro_arguments
1005
      skip_macro_argument:
862
      skip_macro_argument:
1006
	movzx	eax,byte [esi]
863
	movzx	eax,byte [esi]
1007
	inc	esi
864
	inc	esi
1008
	add	esi,eax
865
	add	esi,eax
1009
	lods	byte [esi]
866
	lods	byte [esi]
1010
	cmp	al,'*'
867
	cmp	al,'*'
1011
	jne	macro_argument_end
868
	jne	macro_argument_end
1012
	lods	byte [esi]
869
	lods	byte [esi]
1013
      macro_argument_end:
870
      macro_argument_end:
1014
	cmp	al,','
871
	cmp	al,','
1015
	je	skip_macro_arguments
872
	je	skip_macro_arguments
1016
	cmp	al,']'
873
	cmp	al,']'
1017
	jne	end_macro_arguments
874
	jne	end_macro_arguments
1018
	lods	byte [esi]
875
	lods	byte [esi]
1019
	not	bl
876
	not	bl
1020
      end_macro_arguments:
877
      end_macro_arguments:
1021
	or	bl,bl
878
	or	bl,bl
1022
	jnz	invalid_macro_arguments
879
	jnz	invalid_macro_arguments
1023
	or	al,al
880
	or	al,al
1024
	jz	line_preprocessed
881
	jz	line_preprocessed
1025
	cmp	al,'{'
882
	cmp	al,'{'
1026
	je	found_macro_block
883
	je	found_macro_block
1027
	jmp	invalid_macro_arguments
884
	jmp	invalid_macro_arguments
1028
      find_macro_block:
885
      find_macro_block:
1029
	add	esi,2
886
	add	esi,2
1030
	lods	byte [esi]
887
	lods	byte [esi]
1031
	or	al,al
888
	or	al,al
1032
	jz	line_preprocessed
889
	jz	line_preprocessed
1033
	cmp	al,'{'
890
	cmp	al,'{'
1034
	jne	unexpected_characters
891
	jne	unexpected_characters
1035
      found_macro_block:
892
      found_macro_block:
1036
	or	[macro_status],2
893
	or	[macro_status],2
1037
      skip_macro_block:
894
      skip_macro_block:
1038
	lods	byte [esi]
895
	lods	byte [esi]
1039
	cmp	al,1Ah
896
	cmp	al,1Ah
1040
	je	skip_macro_symbol
897
	je	skip_macro_symbol
1041
	cmp	al,3Bh
898
	cmp	al,3Bh
1042
	je	skip_macro_symbol
899
	je	skip_macro_symbol
1043
	cmp	al,22h
900
	cmp	al,22h
1044
	je	skip_macro_string
901
	je	skip_macro_string
1045
	or	al,al
902
	or	al,al
1046
	jz	line_preprocessed
903
	jz	line_preprocessed
1047
	cmp	al,'}'
904
	cmp	al,'}'
1048
	jne	skip_macro_block
905
	jne	skip_macro_block
1049
	mov	al,[macro_status]
906
	mov	al,[macro_status]
1050
	and	[macro_status],0F0h
907
	and	[macro_status],0F0h
1051
	test	al,8
908
	test	al,8
1052
	jnz	use_instant_macro
909
	jnz	use_instant_macro
1053
	cmp	byte [esi],0
910
	cmp	byte [esi],0
1054
	je	line_preprocessed
911
	je	line_preprocessed
1055
	mov	ecx,edi
912
	mov	ecx,edi
1056
	sub	ecx,esi
913
	sub	ecx,esi
1057
	mov	edx,esi
914
	mov	edx,esi
1058
	lea	esi,[esi+ecx-1]
915
	lea	esi,[esi+ecx-1]
1059
	lea	edi,[edi+1+16]
916
	lea	edi,[edi+1+16]
1060
	mov	ebx,edi
917
	mov	ebx,edi
1061
	dec	edi
918
	dec	edi
1062
	std
919
	std
1063
	rep	movs byte [edi],[esi]
920
	rep	movs byte [edi],[esi]
1064
	cld
921
	cld
1065
	mov	edi,edx
922
	mov	edi,edx
1066
	xor	al,al
923
	xor	al,al
1067
	stos	byte [edi]
924
	stos	byte [edi]
1068
	mov	esi,[current_line]
925
	mov	esi,[current_line]
1069
	mov	[current_line],edi
926
	mov	[current_line],edi
1070
	mov	ecx,4
927
	mov	ecx,4
1071
	rep	movs dword [edi],[esi]
928
	rep	movs dword [edi],[esi]
1072
	mov	edi,ebx
929
	mov	edi,ebx
1073
	jmp	initial_preprocessing_ok
930
	jmp	initial_preprocessing_ok
1074
      skip_macro_symbol:
931
      skip_macro_symbol:
1075
	movzx	eax,byte [esi]
932
	movzx	eax,byte [esi]
1076
	inc	esi
933
	inc	esi
1077
	add	esi,eax
934
	add	esi,eax
1078
	jmp	skip_macro_block
935
	jmp	skip_macro_block
1079
      skip_macro_string:
936
      skip_macro_string:
1080
	lods	dword [esi]
937
	lods	dword [esi]
1081
	add	esi,eax
938
	add	esi,eax
1082
	jmp	skip_macro_block
939
	jmp	skip_macro_block
1083
rept_directive:
940
rept_directive:
1084
	mov	[base_code],0
941
	mov	[base_code],0
1085
	jmp	define_instant_macro
942
	jmp	define_instant_macro
1086
irp_directive:
943
irp_directive:
1087
	mov	[base_code],1
944
	mov	[base_code],1
1088
	jmp	define_instant_macro
945
	jmp	define_instant_macro
1089
irps_directive:
946
irps_directive:
1090
	mov	[base_code],2
947
	mov	[base_code],2
1091
	jmp	define_instant_macro
948
	jmp	define_instant_macro
1092
match_directive:
949
match_directive:
1093
	mov	[base_code],10h
950
	mov	[base_code],10h
1094
define_instant_macro:
951
define_instant_macro:
1095
	mov	al,[macro_status]
952
	mov	al,[macro_status]
1096
	and	al,0F0h
953
	and	al,0F0h
1097
	or	al,8+1
954
	or	al,8+1
1098
	mov	[macro_status],al
955
	mov	[macro_status],al
1099
	mov	eax,[current_line]
956
	mov	eax,[current_line]
1100
	mov	[error_line],eax
957
	mov	[error_line],eax
1101
	mov	[instant_macro_start],esi
958
	mov	[instant_macro_start],esi
1102
	cmp	[base_code],10h
959
	cmp	[base_code],10h
1103
	je	prepare_match
960
	je	prepare_match
1104
	call	skip_parameters
961
	call	skip_parameters
1105
      instant_macro_parameters_skipped:
962
      instant_macro_parameters_skipped:
1106
	dec	esi
963
	dec	esi
1107
	mov	[parameters_end],esi
964
	mov	[parameters_end],esi
1108
	lods	byte [esi]
965
	lods	byte [esi]
1109
	cmp	al,'{'
966
	cmp	al,'{'
1110
	je	found_macro_block
967
	je	found_macro_block
1111
	or	al,al
968
	or	al,al
1112
	jnz	invalid_macro_arguments
969
	jnz	invalid_macro_arguments
1113
	jmp	line_preprocessed
970
	jmp	line_preprocessed
1114
prepare_match:
971
prepare_match:
1115
	call	skip_pattern
972
	call	skip_pattern
1116
	mov	[value_type],80h+10b
973
	mov	[value_type],80h+10b
1117
	call	process_symbolic_constants
974
	call	process_symbolic_constants
1118
	jmp	instant_macro_parameters_skipped
975
	jmp	instant_macro_parameters_skipped
1119
      skip_pattern:
976
      skip_pattern:
1120
	lods	byte [esi]
977
	lods	byte [esi]
1121
	or	al,al
978
	or	al,al
1122
	jz	invalid_macro_arguments
979
	jz	invalid_macro_arguments
1123
	cmp	al,','
980
	cmp	al,','
1124
	je	pattern_skipped
981
	je	pattern_skipped
1125
	cmp	al,22h
982
	cmp	al,22h
1126
	je	skip_quoted_string_in_pattern
983
	je	skip_quoted_string_in_pattern
1127
	cmp	al,1Ah
984
	cmp	al,1Ah
1128
	je	skip_symbol_in_pattern
985
	je	skip_symbol_in_pattern
1129
	cmp	al,'='
986
	cmp	al,'='
1130
	jne	skip_pattern
987
	jne	skip_pattern
1131
	mov	al,[esi]
988
	mov	al,[esi]
1132
	cmp	al,1Ah
989
	cmp	al,1Ah
1133
	je	skip_pattern
990
	je	skip_pattern
1134
	cmp	al,22h
991
	cmp	al,22h
1135
	je	skip_pattern
992
	je	skip_pattern
1136
	inc	esi
993
	inc	esi
1137
	jmp	skip_pattern
994
	jmp	skip_pattern
1138
      skip_symbol_in_pattern:
995
      skip_symbol_in_pattern:
1139
	lods	byte [esi]
996
	lods	byte [esi]
1140
	movzx	eax,al
997
	movzx	eax,al
1141
	add	esi,eax
998
	add	esi,eax
1142
	jmp	skip_pattern
999
	jmp	skip_pattern
1143
      skip_quoted_string_in_pattern:
1000
      skip_quoted_string_in_pattern:
1144
	lods	dword [esi]
1001
	lods	dword [esi]
1145
	add	esi,eax
1002
	add	esi,eax
1146
	jmp	skip_pattern
1003
	jmp	skip_pattern
1147
      pattern_skipped:
1004
      pattern_skipped:
1148
	ret
1005
	ret
1149
 
1006
 
1150
purge_macro:
1007
purge_macro:
1151
	xor	ch,ch
1008
	xor	ch,ch
1152
	jmp	restore_preprocessor_symbol
1009
	jmp	restore_preprocessor_symbol
1153
purge_struc:
1010
purge_struc:
1154
	mov	ch,1
1011
	mov	ch,1
1155
	jmp	restore_preprocessor_symbol
1012
	jmp	restore_preprocessor_symbol
1156
restore_equ_constant:
1013
restore_equ_constant:
1157
	mov	ch,10b
1014
	mov	ch,10b
1158
      restore_preprocessor_symbol:
1015
      restore_preprocessor_symbol:
1159
	push	ecx
1016
	push	ecx
1160
	lods	byte [esi]
1017
	lods	byte [esi]
1161
	cmp	al,1Ah
1018
	cmp	al,1Ah
1162
	jne	invalid_name
1019
	jne	invalid_name
1163
	lods	byte [esi]
1020
	lods	byte [esi]
1164
	mov	cl,al
1021
	mov	cl,al
1165
	call	get_preprocessor_symbol
1022
	call	get_preprocessor_symbol
1166
	jc	no_symbol_to_restore
1023
	jc	no_symbol_to_restore
1167
	mov	dword [edx+4],0
1024
	mov	dword [edx+4],0
1168
	jmp	symbol_restored
1025
	jmp	symbol_restored
1169
      no_symbol_to_restore:
1026
      no_symbol_to_restore:
1170
	add	esi,ecx
1027
	add	esi,ecx
1171
      symbol_restored:
1028
      symbol_restored:
1172
	pop	ecx
1029
	pop	ecx
1173
	lods	byte [esi]
1030
	lods	byte [esi]
1174
	cmp	al,','
1031
	cmp	al,','
1175
	je	restore_preprocessor_symbol
1032
	je	restore_preprocessor_symbol
1176
	or	al,al
1033
	or	al,al
1177
	jnz	extra_characters_on_line
1034
	jnz	extra_characters_on_line
1178
	jmp	line_preprocessed
1035
	jmp	line_preprocessed
1179
 
1036
 
1180
process_fix_constants:
1037
process_fix_constants:
1181
	mov	[value_type],11b
1038
	mov	[value_type],11b
1182
	jmp	process_symbolic_constants
1039
	jmp	process_symbolic_constants
1183
process_equ_constants:
1040
process_equ_constants:
1184
	mov	[value_type],10b
1041
	mov	[value_type],10b
1185
      process_symbolic_constants:
1042
      process_symbolic_constants:
1186
	mov	ebp,esi
1043
	mov	ebp,esi
1187
	lods	byte [esi]
1044
	lods	byte [esi]
1188
	cmp	al,1Ah
1045
	cmp	al,1Ah
1189
	je	check_symbol
1046
	je	check_symbol
1190
	cmp	al,22h
1047
	cmp	al,22h
1191
	je	ignore_string
1048
	je	ignore_string
1192
	cmp	al,'{'
1049
	cmp	al,'{'
1193
	je	check_brace
1050
	je	check_brace
1194
	or	al,al
1051
	or	al,al
1195
	jnz	process_symbolic_constants
1052
	jnz	process_symbolic_constants
1196
	ret
1053
	ret
1197
      ignore_string:
1054
      ignore_string:
1198
	lods	dword [esi]
1055
	lods	dword [esi]
1199
	add	esi,eax
1056
	add	esi,eax
1200
	jmp	process_symbolic_constants
1057
	jmp	process_symbolic_constants
1201
      check_brace:
1058
      check_brace:
1202
	test	[value_type],80h
1059
	test	[value_type],80h
1203
	jz	process_symbolic_constants
1060
	jz	process_symbolic_constants
1204
	ret
1061
	ret
1205
      no_replacing:
1062
      no_replacing:
1206
	movzx	ecx,byte [esi-1]
1063
	movzx	ecx,byte [esi-1]
1207
	add	esi,ecx
1064
	add	esi,ecx
1208
	jmp	process_symbolic_constants
1065
	jmp	process_symbolic_constants
1209
      check_symbol:
1066
      check_symbol:
1210
	mov	cl,[esi]
1067
	mov	cl,[esi]
1211
	inc	esi
1068
	inc	esi
1212
	mov	ch,[value_type]
1069
	mov	ch,[value_type]
1213
	call	get_preprocessor_symbol
1070
	call	get_preprocessor_symbol
1214
	jc	no_replacing
1071
	jc	no_replacing
1215
	mov	[current_section],edi
1072
	mov	[current_section],edi
1216
      replace_symbolic_constant:
1073
      replace_symbolic_constant:
1217
	mov	ecx,[edx+12]
1074
	mov	ecx,[edx+12]
1218
	mov	edx,[edx+8]
1075
	mov	edx,[edx+8]
1219
	xchg	esi,edx
1076
	xchg	esi,edx
1220
	call	move_data
1077
	call	move_data
1221
	mov	esi,edx
1078
	mov	esi,edx
1222
      process_after_replaced:
1079
      process_after_replaced:
1223
	lods	byte [esi]
1080
	lods	byte [esi]
1224
	cmp	al,1Ah
1081
	cmp	al,1Ah
1225
	je	symbol_after_replaced
1082
	je	symbol_after_replaced
1226
	stos	byte [edi]
1083
	stos	byte [edi]
1227
	cmp	al,22h
1084
	cmp	al,22h
1228
	je	string_after_replaced
1085
	je	string_after_replaced
1229
	cmp	al,'{'
1086
	cmp	al,'{'
1230
	je	brace_after_replaced
1087
	je	brace_after_replaced
1231
	or	al,al
1088
	or	al,al
1232
	jnz	process_after_replaced
1089
	jnz	process_after_replaced
1233
	mov	ecx,edi
1090
	mov	ecx,edi
1234
	sub	ecx,esi
1091
	sub	ecx,esi
1235
	mov	edi,ebp
1092
	mov	edi,ebp
1236
	call	move_data
1093
	call	move_data
1237
	mov	esi,edi
1094
	mov	esi,edi
1238
	ret
1095
	ret
1239
      move_data:
1096
      move_data:
1240
	lea	eax,[edi+ecx]
1097
	lea	eax,[edi+ecx]
1241
	cmp	eax,[memory_end]
1098
	cmp	eax,[memory_end]
1242
	jae	out_of_memory
1099
	jae	out_of_memory
1243
	shr	ecx,1
1100
	shr	ecx,1
1244
	jnc	movsb_ok
1101
	jnc	movsb_ok
1245
	movs	byte [edi],[esi]
1102
	movs	byte [edi],[esi]
1246
      movsb_ok:
1103
      movsb_ok:
1247
	shr	ecx,1
1104
	shr	ecx,1
1248
	jnc	movsw_ok
1105
	jnc	movsw_ok
1249
	movs	word [edi],[esi]
1106
	movs	word [edi],[esi]
1250
      movsw_ok:
1107
      movsw_ok:
1251
	rep	movs dword [edi],[esi]
1108
	rep	movs dword [edi],[esi]
1252
	ret
1109
	ret
1253
      string_after_replaced:
1110
      string_after_replaced:
1254
	lods	dword [esi]
1111
	lods	dword [esi]
1255
	stos	dword [edi]
1112
	stos	dword [edi]
1256
	mov	ecx,eax
1113
	mov	ecx,eax
1257
	call	move_data
1114
	call	move_data
1258
	jmp	process_after_replaced
1115
	jmp	process_after_replaced
1259
      brace_after_replaced:
1116
      brace_after_replaced:
1260
	test	[value_type],80h
1117
	test	[value_type],80h
1261
	jz	process_after_replaced
1118
	jz	process_after_replaced
1262
	mov	edx,edi
1119
	mov	edx,edi
1263
	mov	ecx,[current_section]
1120
	mov	ecx,[current_section]
1264
	sub	edx,ecx
1121
	sub	edx,ecx
1265
	sub	ecx,esi
1122
	sub	ecx,esi
1266
	rep	movs byte [edi],[esi]
1123
	rep	movs byte [edi],[esi]
1267
	mov	ecx,edi
1124
	mov	ecx,edi
1268
	sub	ecx,esi
1125
	sub	ecx,esi
1269
	mov	edi,ebp
1126
	mov	edi,ebp
1270
	call	move_data
1127
	call	move_data
1271
	lea	esi,[ebp+edx]
1128
	lea	esi,[ebp+edx]
1272
	ret
1129
	ret
1273
      symbol_after_replaced:
1130
      symbol_after_replaced:
1274
	mov	cl,[esi]
1131
	mov	cl,[esi]
1275
	inc	esi
1132
	inc	esi
1276
	mov	ch,[value_type]
1133
	mov	ch,[value_type]
1277
	call	get_preprocessor_symbol
1134
	call	get_preprocessor_symbol
1278
	jnc	replace_symbolic_constant
1135
	jnc	replace_symbolic_constant
1279
	movzx	ecx,byte [esi-1]
1136
	movzx	ecx,byte [esi-1]
1280
	mov	al,1Ah
1137
	mov	al,1Ah
1281
	mov	ah,cl
1138
	mov	ah,cl
1282
	stos	word [edi]
1139
	stos	word [edi]
1283
	call	move_data
1140
	call	move_data
1284
	jmp	process_after_replaced
1141
	jmp	process_after_replaced
1285
process_macro_operators:
1142
process_macro_operators:
1286
	xor	dl,dl
1143
	xor	dl,dl
1287
	mov	ebp,edi
1144
	mov	ebp,edi
1288
      before_macro_operators:
1145
      before_macro_operators:
1289
	mov	edi,esi
1146
	mov	edi,esi
1290
	lods	byte [esi]
1147
	lods	byte [esi]
1291
	cmp	al,'`'
1148
	cmp	al,'`'
1292
	je	symbol_conversion
1149
	je	symbol_conversion
1293
	cmp	al,'#'
1150
	cmp	al,'#'
1294
	je	concatenation
1151
	je	concatenation
1295
	cmp	al,1Ah
1152
	cmp	al,1Ah
1296
	je	symbol_before_macro_operators
1153
	je	symbol_before_macro_operators
1297
	cmp	al,3Bh
1154
	cmp	al,3Bh
1298
	je	no_more_macro_operators
1155
	je	no_more_macro_operators
1299
	cmp	al,22h
1156
	cmp	al,22h
1300
	je	string_before_macro_operators
1157
	je	string_before_macro_operators
1301
	xor	dl,dl
1158
	xor	dl,dl
1302
	or	al,al
1159
	or	al,al
1303
	jnz	before_macro_operators
1160
	jnz	before_macro_operators
1304
	mov	edi,esi
1161
	mov	edi,esi
1305
	ret
1162
	ret
1306
      no_more_macro_operators:
1163
      no_more_macro_operators:
1307
	mov	edi,ebp
1164
	mov	edi,ebp
1308
	ret
1165
	ret
1309
      symbol_before_macro_operators:
1166
      symbol_before_macro_operators:
1310
	mov	dl,1Ah
1167
	mov	dl,1Ah
1311
	mov	ebx,esi
1168
	mov	ebx,esi
1312
	lods	byte [esi]
1169
	lods	byte [esi]
1313
	movzx	ecx,al
1170
	movzx	ecx,al
1314
	jecxz	symbol_before_macro_operators_ok
1171
	jecxz	symbol_before_macro_operators_ok
1315
	mov	edi,esi
1172
	mov	edi,esi
1316
	cmp	byte [esi],'\'
1173
	cmp	byte [esi],'\'
1317
	je	escaped_symbol
1174
	je	escaped_symbol
1318
      symbol_before_macro_operators_ok:
1175
      symbol_before_macro_operators_ok:
1319
	add	esi,ecx
1176
	add	esi,ecx
1320
	jmp	before_macro_operators
1177
	jmp	before_macro_operators
1321
      string_before_macro_operators:
1178
      string_before_macro_operators:
1322
	mov	dl,22h
1179
	mov	dl,22h
1323
	mov	ebx,esi
1180
	mov	ebx,esi
1324
	lods	dword [esi]
1181
	lods	dword [esi]
1325
	add	esi,eax
1182
	add	esi,eax
1326
	jmp	before_macro_operators
1183
	jmp	before_macro_operators
1327
      escaped_symbol:
1184
      escaped_symbol:
1328
	dec	byte [edi-1]
1185
	dec	byte [edi-1]
1329
	dec	ecx
1186
	dec	ecx
1330
	inc	esi
1187
	inc	esi
1331
	cmp	ecx,1
1188
	cmp	ecx,1
1332
	rep	movs byte [edi],[esi]
1189
	rep	movs byte [edi],[esi]
1333
	jne	after_macro_operators
1190
	jne	after_macro_operators
1334
	mov	al,[esi-1]
1191
	mov	al,[esi-1]
1335
	mov	ecx,ebx
1192
	mov	ecx,ebx
1336
	mov	ebx,characters
1193
	mov	ebx,characters
1337
	xlat	byte [ebx]
1194
	xlat	byte [ebx]
1338
	mov	ebx,ecx
1195
	mov	ebx,ecx
1339
	or	al,al
1196
	or	al,al
1340
	jnz	after_macro_operators
1197
	jnz	after_macro_operators
1341
	sub	edi,3
1198
	sub	edi,3
1342
	mov	al,[esi-1]
1199
	mov	al,[esi-1]
1343
	stos	byte [edi]
1200
	stos	byte [edi]
1344
	xor	dl,dl
1201
	xor	dl,dl
1345
	jmp	after_macro_operators
1202
	jmp	after_macro_operators
1346
      reduce_symbol_conversion:
1203
      reduce_symbol_conversion:
1347
	inc	esi
1204
	inc	esi
1348
      symbol_conversion:
1205
      symbol_conversion:
1349
	mov	edx,esi
1206
	mov	edx,esi
1350
	mov	al,[esi]
1207
	mov	al,[esi]
1351
	cmp	al,1Ah
1208
	cmp	al,1Ah
1352
	jne	symbol_character_conversion
1209
	jne	symbol_character_conversion
1353
	lods	word [esi]
1210
	lods	word [esi]
1354
	movzx	ecx,ah
1211
	movzx	ecx,ah
1355
	lea	ebx,[edi+3]
1212
	lea	ebx,[edi+3]
1356
	jecxz	convert_to_quoted_string
1213
	jecxz	convert_to_quoted_string
1357
	cmp	byte [esi],'\'
1214
	cmp	byte [esi],'\'
1358
	jne	convert_to_quoted_string
1215
	jne	convert_to_quoted_string
1359
	inc	esi
1216
	inc	esi
1360
	dec	ecx
1217
	dec	ecx
1361
	dec	ebx
1218
	dec	ebx
1362
	jmp	convert_to_quoted_string
1219
	jmp	convert_to_quoted_string
1363
      symbol_character_conversion:
1220
      symbol_character_conversion:
1364
	cmp	al,22h
1221
	cmp	al,22h
1365
	je	after_macro_operators
1222
	je	after_macro_operators
1366
	cmp	al,'`'
1223
	cmp	al,'`'
1367
	je	reduce_symbol_conversion
1224
	je	reduce_symbol_conversion
1368
	lea	ebx,[edi+5]
1225
	lea	ebx,[edi+5]
1369
	xor	ecx,ecx
1226
	xor	ecx,ecx
1370
	or	al,al
1227
	or	al,al
1371
	jz	convert_to_quoted_string
1228
	jz	convert_to_quoted_string
1372
	cmp	al,'#'
1229
	cmp	al,'#'
1373
	je	convert_to_quoted_string
1230
	je	convert_to_quoted_string
1374
	inc	ecx
1231
	inc	ecx
1375
      convert_to_quoted_string:
1232
      convert_to_quoted_string:
1376
	sub	ebx,edx
1233
	sub	ebx,edx
1377
	ja	shift_line_data
1234
	ja	shift_line_data
1378
	mov	al,22h
1235
	mov	al,22h
1379
	mov	dl,al
1236
	mov	dl,al
1380
	stos	byte [edi]
1237
	stos	byte [edi]
1381
	mov	ebx,edi
1238
	mov	ebx,edi
1382
	mov	eax,ecx
1239
	mov	eax,ecx
1383
	stos	dword [edi]
1240
	stos	dword [edi]
1384
	rep	movs byte [edi],[esi]
1241
	rep	movs byte [edi],[esi]
1385
	cmp	edi,esi
1242
	cmp	edi,esi
1386
	je	before_macro_operators
1243
	je	before_macro_operators
1387
	jmp	after_macro_operators
1244
	jmp	after_macro_operators
1388
      shift_line_data:
1245
      shift_line_data:
1389
	push	ecx
1246
	push	ecx
1390
	mov	edx,esi
1247
	mov	edx,esi
1391
	lea	esi,[ebp-1]
1248
	lea	esi,[ebp-1]
1392
	add	ebp,ebx
1249
	add	ebp,ebx
1393
	lea	edi,[ebp-1]
1250
	lea	edi,[ebp-1]
1394
	lea	ecx,[esi+1]
1251
	lea	ecx,[esi+1]
1395
	sub	ecx,edx
1252
	sub	ecx,edx
1396
	std
1253
	std
1397
	rep	movs byte [edi],[esi]
1254
	rep	movs byte [edi],[esi]
1398
	cld
1255
	cld
1399
	pop	eax
1256
	pop	eax
1400
	sub	edi,3
1257
	sub	edi,3
1401
	mov	dl,22h
1258
	mov	dl,22h
1402
	mov	[edi-1],dl
1259
	mov	[edi-1],dl
1403
	mov	ebx,edi
1260
	mov	ebx,edi
1404
	mov	[edi],eax
1261
	mov	[edi],eax
1405
	lea	esi,[edi+4+eax]
1262
	lea	esi,[edi+4+eax]
1406
	jmp	before_macro_operators
1263
	jmp	before_macro_operators
1407
      concatenation:
1264
      concatenation:
1408
	cmp	dl,1Ah
1265
	cmp	dl,1Ah
1409
	je	symbol_concatenation
1266
	je	symbol_concatenation
1410
	cmp	dl,22h
1267
	cmp	dl,22h
1411
	je	string_concatenation
1268
	je	string_concatenation
1412
      no_concatenation:
1269
      no_concatenation:
1413
	cmp	esi,edi
1270
	cmp	esi,edi
1414
	je	before_macro_operators
1271
	je	before_macro_operators
1415
	jmp	after_macro_operators
1272
	jmp	after_macro_operators
1416
      symbol_concatenation:
1273
      symbol_concatenation:
1417
	cmp	byte [esi],1Ah
1274
	cmp	byte [esi],1Ah
1418
	jne	no_concatenation
1275
	jne	no_concatenation
1419
	inc	esi
1276
	inc	esi
1420
	lods	byte [esi]
1277
	lods	byte [esi]
1421
	movzx	ecx,al
1278
	movzx	ecx,al
1422
	jecxz	do_symbol_concatenation
1279
	jecxz	do_symbol_concatenation
1423
	cmp	byte [esi],'\'
1280
	cmp	byte [esi],'\'
1424
	je	concatenate_escaped_symbol
1281
	je	concatenate_escaped_symbol
1425
      do_symbol_concatenation:
1282
      do_symbol_concatenation:
1426
	add	[ebx],cl
1283
	add	[ebx],cl
1427
	jc	name_too_long
1284
	jc	name_too_long
1428
	rep	movs byte [edi],[esi]
1285
	rep	movs byte [edi],[esi]
1429
	jmp	after_macro_operators
1286
	jmp	after_macro_operators
1430
      concatenate_escaped_symbol:
1287
      concatenate_escaped_symbol:
1431
	inc	esi
1288
	inc	esi
1432
	dec	ecx
1289
	dec	ecx
1433
	jz	do_symbol_concatenation
1290
	jz	do_symbol_concatenation
1434
	movzx	eax,byte [esi]
1291
	movzx	eax,byte [esi]
1435
	cmp	byte [characters+eax],0
1292
	cmp	byte [characters+eax],0
1436
	jne	do_symbol_concatenation
1293
	jne	do_symbol_concatenation
1437
	sub	esi,3
1294
	sub	esi,3
1438
	jmp	no_concatenation
1295
	jmp	no_concatenation
1439
      string_concatenation:
1296
      string_concatenation:
1440
	cmp	byte [esi],22h
1297
	cmp	byte [esi],22h
1441
	je	do_string_concatenation
1298
	je	do_string_concatenation
1442
	cmp	byte [esi],'`'
1299
	cmp	byte [esi],'`'
1443
	jne	no_concatenation
1300
	jne	no_concatenation
1444
      concatenate_converted_symbol:
1301
      concatenate_converted_symbol:
1445
	inc	esi
1302
	inc	esi
1446
	mov	al,[esi]
1303
	mov	al,[esi]
1447
	cmp	al,'`'
1304
	cmp	al,'`'
1448
	je	concatenate_converted_symbol
1305
	je	concatenate_converted_symbol
1449
	cmp	al,22h
1306
	cmp	al,22h
1450
	je	do_string_concatenation
1307
	je	do_string_concatenation
1451
	cmp	al,1Ah
1308
	cmp	al,1Ah
1452
	jne	concatenate_converted_symbol_character
1309
	jne	concatenate_converted_symbol_character
1453
	inc	esi
1310
	inc	esi
1454
	lods	byte [esi]
1311
	lods	byte [esi]
1455
	movzx	ecx,al
1312
	movzx	ecx,al
1456
	jecxz	finish_concatenating_converted_symbol
1313
	jecxz	finish_concatenating_converted_symbol
1457
	cmp	byte [esi],'\'
1314
	cmp	byte [esi],'\'
1458
	jne	finish_concatenating_converted_symbol
1315
	jne	finish_concatenating_converted_symbol
1459
	inc	esi
1316
	inc	esi
1460
	dec	ecx
1317
	dec	ecx
1461
      finish_concatenating_converted_symbol:
1318
      finish_concatenating_converted_symbol:
1462
	add	[ebx],ecx
1319
	add	[ebx],ecx
1463
	rep	movs byte [edi],[esi]
1320
	rep	movs byte [edi],[esi]
1464
	jmp	after_macro_operators
1321
	jmp	after_macro_operators
1465
      concatenate_converted_symbol_character:
1322
      concatenate_converted_symbol_character:
1466
	or	al,al
1323
	or	al,al
1467
	jz	after_macro_operators
1324
	jz	after_macro_operators
1468
	cmp	al,'#'
1325
	cmp	al,'#'
1469
	je	after_macro_operators
1326
	je	after_macro_operators
1470
	inc	dword [ebx]
1327
	inc	dword [ebx]
1471
	movs	byte [edi],[esi]
1328
	movs	byte [edi],[esi]
1472
	jmp	after_macro_operators
1329
	jmp	after_macro_operators
1473
      do_string_concatenation:
1330
      do_string_concatenation:
1474
	inc	esi
1331
	inc	esi
1475
	lods	dword [esi]
1332
	lods	dword [esi]
1476
	mov	ecx,eax
1333
	mov	ecx,eax
1477
	add	[ebx],eax
1334
	add	[ebx],eax
1478
	rep	movs byte [edi],[esi]
1335
	rep	movs byte [edi],[esi]
1479
      after_macro_operators:
1336
      after_macro_operators:
1480
	lods	byte [esi]
1337
	lods	byte [esi]
1481
	cmp	al,'`'
1338
	cmp	al,'`'
1482
	je	symbol_conversion
1339
	je	symbol_conversion
1483
	cmp	al,'#'
1340
	cmp	al,'#'
1484
	je	concatenation
1341
	je	concatenation
1485
	stos	byte [edi]
1342
	stos	byte [edi]
1486
	cmp	al,1Ah
1343
	cmp	al,1Ah
1487
	je	symbol_after_macro_operators
1344
	je	symbol_after_macro_operators
1488
	cmp	al,3Bh
1345
	cmp	al,3Bh
1489
	je	no_more_macro_operators
1346
	je	no_more_macro_operators
1490
	cmp	al,22h
1347
	cmp	al,22h
1491
	je	string_after_macro_operators
1348
	je	string_after_macro_operators
1492
	xor	dl,dl
1349
	xor	dl,dl
1493
	or	al,al
1350
	or	al,al
1494
	jnz	after_macro_operators
1351
	jnz	after_macro_operators
1495
	ret
1352
	ret
1496
      symbol_after_macro_operators:
1353
      symbol_after_macro_operators:
1497
	mov	dl,1Ah
1354
	mov	dl,1Ah
1498
	mov	ebx,edi
1355
	mov	ebx,edi
1499
	lods	byte [esi]
1356
	lods	byte [esi]
1500
	stos	byte [edi]
1357
	stos	byte [edi]
1501
	movzx	ecx,al
1358
	movzx	ecx,al
1502
	jecxz	symbol_after_macro_operatorss_ok
1359
	jecxz	symbol_after_macro_operatorss_ok
1503
	cmp	byte [esi],'\'
1360
	cmp	byte [esi],'\'
1504
	je	escaped_symbol
1361
	je	escaped_symbol
1505
      symbol_after_macro_operatorss_ok:
1362
      symbol_after_macro_operatorss_ok:
1506
	rep	movs byte [edi],[esi]
1363
	rep	movs byte [edi],[esi]
1507
	jmp	after_macro_operators
1364
	jmp	after_macro_operators
1508
      string_after_macro_operators:
1365
      string_after_macro_operators:
1509
	mov	dl,22h
1366
	mov	dl,22h
1510
	mov	ebx,edi
1367
	mov	ebx,edi
1511
	lods	dword [esi]
1368
	lods	dword [esi]
1512
	stos	dword [edi]
1369
	stos	dword [edi]
1513
	mov	ecx,eax
1370
	mov	ecx,eax
1514
	rep	movs byte [edi],[esi]
1371
	rep	movs byte [edi],[esi]
1515
	jmp	after_macro_operators
1372
	jmp	after_macro_operators
1516
 
1373
 
1517
use_macro:
1374
use_macro:
1518
	push	[free_additional_memory]
1375
	push	[free_additional_memory]
1519
	push	[macro_symbols]
1376
	push	[macro_symbols]
1520
	mov	[macro_symbols],0
1377
	mov	[macro_symbols],0
1521
	push	[counter_limit]
1378
	push	[counter_limit]
1522
	push	dword [edx+4]
1379
	push	dword [edx+4]
1523
	mov	dword [edx+4],1
1380
	mov	dword [edx+4],1
1524
	push	edx
1381
	push	edx
1525
	mov	ebx,esi
1382
	mov	ebx,esi
1526
	mov	esi,[edx+8]
1383
	mov	esi,[edx+8]
1527
	mov	eax,[edx+12]
1384
	mov	eax,[edx+12]
1528
	mov	[macro_line],eax
1385
	mov	[macro_line],eax
1529
	mov	[counter_limit],0
1386
	mov	[counter_limit],0
1530
      process_macro_arguments:
1387
      process_macro_arguments:
1531
	mov	al,[esi]
1388
	mov	al,[esi]
1532
	or	al,al
1389
	or	al,al
1533
	jz	arguments_end
1390
	jz	arguments_end
1534
	cmp	al,'{'
1391
	cmp	al,'{'
1535
	je	arguments_end
1392
	je	arguments_end
1536
	inc	esi
1393
	inc	esi
1537
	cmp	al,'['
1394
	cmp	al,'['
1538
	jne	get_macro_arguments
1395
	jne	get_macro_arguments
1539
	mov	ebp,esi
1396
	mov	ebp,esi
1540
	inc	esi
1397
	inc	esi
1541
	inc	[counter_limit]
1398
	inc	[counter_limit]
1542
      get_macro_arguments:
1399
      get_macro_arguments:
1543
	call	get_macro_argument
1400
	call	get_macro_argument
1544
	lods	byte [esi]
1401
	lods	byte [esi]
1545
	cmp	al,','
1402
	cmp	al,','
1546
	je	next_argument
1403
	je	next_argument
1547
	cmp	al,']'
1404
	cmp	al,']'
1548
	je	next_arguments_group
1405
	je	next_arguments_group
1549
	dec	esi
1406
	dec	esi
1550
	jmp	arguments_end
1407
	jmp	arguments_end
1551
      next_argument:
1408
      next_argument:
1552
	cmp	byte [ebx],','
1409
	cmp	byte [ebx],','
1553
	jne	process_macro_arguments
1410
	jne	process_macro_arguments
1554
	inc	ebx
1411
	inc	ebx
1555
	jmp	process_macro_arguments
1412
	jmp	process_macro_arguments
1556
      next_arguments_group:
1413
      next_arguments_group:
1557
	cmp	byte [ebx],','
1414
	cmp	byte [ebx],','
1558
	jne	arguments_end
1415
	jne	arguments_end
1559
	inc	ebx
1416
	inc	ebx
1560
	inc	[counter_limit]
1417
	inc	[counter_limit]
1561
	mov	esi,ebp
1418
	mov	esi,ebp
1562
	jmp	process_macro_arguments
1419
	jmp	process_macro_arguments
1563
      get_macro_argument:
1420
      get_macro_argument:
1564
	lods	byte [esi]
1421
	lods	byte [esi]
1565
	movzx	ecx,al
1422
	movzx	ecx,al
1566
	mov	eax,[counter_limit]
1423
	mov	eax,[counter_limit]
1567
	call	add_macro_symbol
1424
	call	add_macro_symbol
1568
	add	esi,ecx
1425
	add	esi,ecx
1569
	xchg	esi,ebx
1426
	xchg	esi,ebx
1570
	mov	[edx+12],esi
1427
	mov	[edx+12],esi
1571
	cmp	byte [esi],'<'
1428
	cmp	byte [esi],'<'
1572
	jne	simple_argument
1429
	jne	simple_argument
1573
	inc	esi
1430
	inc	esi
1574
	mov	[edx+12],esi
1431
	mov	[edx+12],esi
1575
	mov	ecx,1
1432
	mov	ecx,1
1576
      enclosed_argument:
1433
      enclosed_argument:
1577
	lods	byte [esi]
1434
	lods	byte [esi]
1578
	or	al,al
1435
	or	al,al
1579
	jz	invalid_macro_arguments
1436
	jz	invalid_macro_arguments
1580
	cmp	al,1Ah
1437
	cmp	al,1Ah
1581
	je	enclosed_symbol
1438
	je	enclosed_symbol
1582
	cmp	al,22h
1439
	cmp	al,22h
1583
	je	enclosed_string
1440
	je	enclosed_string
1584
	cmp	al,'>'
1441
	cmp	al,'>'
1585
	je	enclosed_argument_end
1442
	je	enclosed_argument_end
1586
	cmp	al,'<'
1443
	cmp	al,'<'
1587
	jne	enclosed_argument
1444
	jne	enclosed_argument
1588
	inc	ecx
1445
	inc	ecx
1589
	jmp	enclosed_argument
1446
	jmp	enclosed_argument
1590
      enclosed_symbol:
1447
      enclosed_symbol:
1591
	movzx	eax,byte [esi]
1448
	movzx	eax,byte [esi]
1592
	inc	esi
1449
	inc	esi
1593
	add	esi,eax
1450
	add	esi,eax
1594
	jmp	enclosed_argument
1451
	jmp	enclosed_argument
1595
      enclosed_string:
1452
      enclosed_string:
1596
	lods	dword [esi]
1453
	lods	dword [esi]
1597
	add	esi,eax
1454
	add	esi,eax
1598
	jmp	enclosed_argument
1455
	jmp	enclosed_argument
1599
      enclosed_argument_end:
1456
      enclosed_argument_end:
1600
	loop	enclosed_argument
1457
	loop	enclosed_argument
1601
	mov	al,[esi]
1458
	mov	al,[esi]
1602
	or	al,al
1459
	or	al,al
1603
	jz	enclosed_argument_ok
1460
	jz	enclosed_argument_ok
1604
	cmp	al,','
1461
	cmp	al,','
1605
	jne	invalid_macro_arguments
1462
	jne	invalid_macro_arguments
1606
      enclosed_argument_ok:
1463
      enclosed_argument_ok:
1607
	mov	eax,esi
1464
	mov	eax,esi
1608
	sub	eax,[edx+12]
1465
	sub	eax,[edx+12]
1609
	dec	eax
1466
	dec	eax
1610
	or	eax,80000000h
1467
	or	eax,80000000h
1611
	mov	[edx+8],eax
1468
	mov	[edx+8],eax
1612
	jmp	argument_value_ok
1469
	jmp	argument_value_ok
1613
      simple_argument:
1470
      simple_argument:
1614
	lods	byte [esi]
1471
	lods	byte [esi]
1615
	or	al,al
1472
	or	al,al
1616
	jz	argument_value_end
1473
	jz	argument_value_end
1617
	cmp	al,','
1474
	cmp	al,','
1618
	je	argument_value_end
1475
	je	argument_value_end
1619
	cmp	al,22h
1476
	cmp	al,22h
1620
	je	argument_string
1477
	je	argument_string
1621
	cmp	al,1Ah
1478
	cmp	al,1Ah
1622
	jne	simple_argument
1479
	jne	simple_argument
1623
	movzx	eax,byte [esi]
1480
	movzx	eax,byte [esi]
1624
	inc	esi
1481
	inc	esi
1625
	add	esi,eax
1482
	add	esi,eax
1626
	jmp	simple_argument
1483
	jmp	simple_argument
1627
      argument_string:
1484
      argument_string:
1628
	lods	dword [esi]
1485
	lods	dword [esi]
1629
	add	esi,eax
1486
	add	esi,eax
1630
	jmp	simple_argument
1487
	jmp	simple_argument
1631
      argument_value_end:
1488
      argument_value_end:
1632
	dec	esi
1489
	dec	esi
1633
	mov	eax,esi
1490
	mov	eax,esi
1634
	sub	eax,[edx+12]
1491
	sub	eax,[edx+12]
1635
	mov	[edx+8],eax
1492
	mov	[edx+8],eax
1636
      argument_value_ok:
1493
      argument_value_ok:
1637
	xchg	esi,ebx
1494
	xchg	esi,ebx
1638
	cmp	byte [esi],'*'
1495
	cmp	byte [esi],'*'
1639
	jne	macro_argument_ok
1496
	jne	macro_argument_ok
1640
	cmp	dword [edx+8],0
1497
	cmp	dword [edx+8],0
1641
	je	invalid_macro_arguments
1498
	je	invalid_macro_arguments
1642
	inc	esi
1499
	inc	esi
1643
      macro_argument_ok:
1500
      macro_argument_ok:
1644
	ret
1501
	ret
1645
      arguments_end:
1502
      arguments_end:
1646
	cmp	byte [ebx],0
1503
	cmp	byte [ebx],0
1647
	jne	invalid_macro_arguments
1504
	jne	invalid_macro_arguments
1648
	mov	eax,[esp+4]
1505
	mov	eax,[esp+4]
1649
	dec	eax
1506
	dec	eax
1650
	call	process_macro
1507
	call	process_macro
1651
	pop	edx
1508
	pop	edx
1652
	pop	dword [edx+4]
1509
	pop	dword [edx+4]
1653
	pop	[counter_limit]
1510
	pop	[counter_limit]
1654
	pop	[macro_symbols]
1511
	pop	[macro_symbols]
1655
	pop	[free_additional_memory]
1512
	pop	[free_additional_memory]
1656
	jmp	line_preprocessed
1513
	jmp	line_preprocessed
1657
use_instant_macro:
1514
use_instant_macro:
1658
	push	edi [current_line] esi
1515
	push	edi [current_line] esi
1659
	mov	eax,[error_line]
1516
	mov	eax,[error_line]
1660
	mov	[current_line],eax
1517
	mov	[current_line],eax
1661
	mov	[macro_line],eax
1518
	mov	[macro_line],eax
1662
	mov	esi,[instant_macro_start]
1519
	mov	esi,[instant_macro_start]
1663
	cmp	[base_code],10h
1520
	cmp	[base_code],10h
1664
	jae	do_match
1521
	jae	do_match
1665
	cmp	[base_code],0
1522
	cmp	[base_code],0
1666
	jne	do_irp
1523
	jne	do_irp
1667
	call	get_number
1524
	call	get_number
1668
	jc	invalid_value
1525
	jc	invalid_value
1669
	or	ebp,ebp
1526
	or	ebp,ebp
1670
	jnz	invalid_value
1527
	jnz	invalid_value
1671
	cmp	dword [edi+4],0
1528
	cmp	dword [edi+4],0
1672
	jne	value_out_of_range
1529
	jne	value_out_of_range
1673
	mov	eax,[edi]
1530
	mov	eax,[edi]
1674
 
1531
	cmp	eax,80000000h
1675
	cmp	eax,80000000h
-
 
1676
	jae	value_out_of_range
1532
	jae	value_out_of_range
1677
	push	[free_additional_memory]
1533
	push	[free_additional_memory]
1678
	push	[macro_symbols]
1534
	push	[macro_symbols]
1679
	mov	[macro_symbols],0
1535
	mov	[macro_symbols],0
1680
	push	[counter_limit]
1536
	push	[counter_limit]
1681
	mov	[struc_name],0
1537
	mov	[struc_name],0
1682
	mov	[counter_limit],eax
1538
	mov	[counter_limit],eax
1683
	lods	byte [esi]
1539
	lods	byte [esi]
1684
	or	al,al
1540
	or	al,al
1685
	jz	rept_counters_ok
1541
	jz	rept_counters_ok
1686
	cmp	al,'{'
1542
	cmp	al,'{'
1687
	je	rept_counters_ok
1543
	je	rept_counters_ok
1688
	cmp	al,1Ah
1544
	cmp	al,1Ah
1689
	jne	invalid_macro_arguments
1545
	jne	invalid_macro_arguments
1690
      add_rept_counter:
1546
      add_rept_counter:
1691
	lods	byte [esi]
1547
	lods	byte [esi]
1692
	movzx	ecx,al
1548
	movzx	ecx,al
1693
	xor	eax,eax
1549
	xor	eax,eax
1694
	call	add_macro_symbol
1550
	call	add_macro_symbol
1695
	add	esi,ecx
1551
	add	esi,ecx
1696
	xor	eax,eax
1552
	xor	eax,eax
1697
	mov	dword [edx+12],eax
1553
	mov	dword [edx+12],eax
1698
	inc	eax
1554
	inc	eax
1699
	mov	dword [edx+8],eax
1555
	mov	dword [edx+8],eax
1700
	lods	byte [esi]
1556
	lods	byte [esi]
1701
	cmp	al,':'
1557
	cmp	al,':'
1702
	jne	rept_counter_added
1558
	jne	rept_counter_added
1703
	push	edx
1559
	push	edx
1704
	call	get_number
1560
	call	get_number
1705
	jc	invalid_value
1561
	jc	invalid_value
1706
	or	ebp,ebp
1562
	or	ebp,ebp
1707
	jnz	invalid_value
1563
	jnz	invalid_value
1708
	cmp	dword [edi+4],0
1564
	cmp	dword [edi+4],0
1709
	jne	value_out_of_range
1565
	jne	value_out_of_range
1710
	mov	eax,[edi]
1566
	mov	eax,[edi]
1711
	mov	edx,eax
1567
	mov	edx,eax
1712
	add	edx,[counter_limit]
1568
	add	edx,[counter_limit]
1713
	jc	value_out_of_range
1569
	jc	value_out_of_range
1714
	pop	edx
1570
	pop	edx
1715
	mov	dword [edx+8],eax
1571
	mov	dword [edx+8],eax
1716
	lods	byte [esi]
1572
	lods	byte [esi]
1717
      rept_counter_added:
1573
      rept_counter_added:
1718
	cmp	al,','
1574
	cmp	al,','
1719
	jne	rept_counters_ok
1575
	jne	rept_counters_ok
1720
	lods	byte [esi]
1576
	lods	byte [esi]
1721
	cmp	al,1Ah
1577
	cmp	al,1Ah
1722
	jne	invalid_macro_arguments
1578
	jne	invalid_macro_arguments
1723
	jmp	add_rept_counter
1579
	jmp	add_rept_counter
1724
      rept_counters_ok:
1580
      rept_counters_ok:
1725
	dec	esi
1581
	dec	esi
1726
	cmp	[counter_limit],0
1582
	cmp	[counter_limit],0
1727
	je	instant_macro_finish
1583
	je	instant_macro_finish
1728
      instant_macro_parameters_ok:
1584
      instant_macro_parameters_ok:
1729
	xor	eax,eax
1585
	xor	eax,eax
1730
	call	process_macro
1586
	call	process_macro
1731
      instant_macro_finish:
1587
      instant_macro_finish:
1732
	pop	[counter_limit]
1588
	pop	[counter_limit]
1733
	pop	[macro_symbols]
1589
	pop	[macro_symbols]
1734
	pop	[free_additional_memory]
1590
	pop	[free_additional_memory]
1735
      instant_macro_done:
1591
      instant_macro_done:
1736
	pop	ebx esi edx
1592
	pop	ebx esi edx
1737
	cmp	byte [ebx],0
1593
	cmp	byte [ebx],0
1738
	je	line_preprocessed
1594
	je	line_preprocessed
1739
	mov	[current_line],edi
1595
	mov	[current_line],edi
1740
	mov	ecx,4
1596
	mov	ecx,4
1741
	rep	movs dword [edi],[esi]
1597
	rep	movs dword [edi],[esi]
1742
	test	[macro_status],0Fh
1598
	test	[macro_status],0Fh
1743
	jz	instant_macro_attached_line
1599
	jz	instant_macro_attached_line
1744
	mov	ax,3Bh
1600
	mov	ax,3Bh
1745
	stos	word [edi]
1601
	stos	word [edi]
1746
      instant_macro_attached_line:
1602
      instant_macro_attached_line:
1747
	mov	esi,ebx
1603
	mov	esi,ebx
1748
	sub	edx,ebx
1604
	sub	edx,ebx
1749
	mov	ecx,edx
1605
	mov	ecx,edx
1750
	call	move_data
1606
	call	move_data
1751
	jmp	initial_preprocessing_ok
1607
	jmp	initial_preprocessing_ok
1752
do_irp:
1608
do_irp:
1753
	cmp	byte [esi],1Ah
1609
	cmp	byte [esi],1Ah
1754
	jne	invalid_macro_arguments
1610
	jne	invalid_macro_arguments
1755
	movzx	eax,byte [esi+1]
1611
	movzx	eax,byte [esi+1]
1756
	lea	esi,[esi+2+eax]
1612
	lea	esi,[esi+2+eax]
1757
	lods	byte [esi]
1613
	lods	byte [esi]
1758
	cmp	[base_code],1
1614
	cmp	[base_code],1
1759
	ja	irps_name_ok
1615
	ja	irps_name_ok
1760
	cmp	al,'*'
1616
	cmp	al,'*'
1761
	jne	irp_name_ok
1617
	jne	irp_name_ok
1762
	lods	byte [esi]
1618
	lods	byte [esi]
1763
      irp_name_ok:
1619
      irp_name_ok:
1764
	cmp	al,','
1620
	cmp	al,','
1765
	jne	invalid_macro_arguments
1621
	jne	invalid_macro_arguments
1766
	jmp	irp_parameters_start
1622
	jmp	irp_parameters_start
1767
      irps_name_ok:
1623
      irps_name_ok:
1768
	cmp	al,','
1624
	cmp	al,','
1769
	jne	invalid_macro_arguments
1625
	jne	invalid_macro_arguments
1770
	mov	al,[esi]
1626
	mov	al,[esi]
1771
	or	al,al
1627
	or	al,al
1772
	jz	instant_macro_done
1628
	jz	instant_macro_done
1773
	cmp	al,'{'
1629
	cmp	al,'{'
1774
	je	instant_macro_done
1630
	je	instant_macro_done
1775
      irp_parameters_start:
1631
      irp_parameters_start:
1776
	xor	eax,eax
1632
	xor	eax,eax
1777
	push	[free_additional_memory]
1633
	push	[free_additional_memory]
1778
	push	[macro_symbols]
1634
	push	[macro_symbols]
1779
	mov	[macro_symbols],eax
1635
	mov	[macro_symbols],eax
1780
	push	[counter_limit]
1636
	push	[counter_limit]
1781
	mov	[counter_limit],eax
1637
	mov	[counter_limit],eax
1782
	mov	[struc_name],eax
1638
	mov	[struc_name],eax
1783
	mov	ebx,esi
1639
	mov	ebx,esi
1784
	cmp	[base_code],1
1640
	cmp	[base_code],1
1785
	ja	get_irps_parameter
1641
	ja	get_irps_parameter
1786
	mov	edx,[parameters_end]
1642
	mov	edx,[parameters_end]
1787
	mov	al,[edx]
1643
	mov	al,[edx]
1788
	push	eax
1644
	push	eax
1789
	mov	byte [edx],0
1645
	mov	byte [edx],0
1790
      get_irp_parameter:
1646
      get_irp_parameter:
1791
	inc	[counter_limit]
1647
	inc	[counter_limit]
1792
	mov	esi,[instant_macro_start]
1648
	mov	esi,[instant_macro_start]
1793
	inc	esi
1649
	inc	esi
1794
	call	get_macro_argument
1650
	call	get_macro_argument
1795
	cmp	byte [ebx],','
1651
	cmp	byte [ebx],','
1796
	jne	irp_parameters_end
1652
	jne	irp_parameters_end
1797
	inc	ebx
1653
	inc	ebx
1798
	jmp	get_irp_parameter
1654
	jmp	get_irp_parameter
1799
      irp_parameters_end:
1655
      irp_parameters_end:
1800
	mov	esi,ebx
1656
	mov	esi,ebx
1801
	pop	eax
1657
	pop	eax
1802
	mov	[esi],al
1658
	mov	[esi],al
1803
	jmp	instant_macro_parameters_ok
1659
	jmp	instant_macro_parameters_ok
1804
      get_irps_parameter:
1660
      get_irps_parameter:
1805
	mov	esi,[instant_macro_start]
1661
	mov	esi,[instant_macro_start]
1806
	inc	esi
1662
	inc	esi
1807
	lods	byte [esi]
1663
	lods	byte [esi]
1808
	movzx	ecx,al
1664
	movzx	ecx,al
1809
	inc	[counter_limit]
1665
	inc	[counter_limit]
1810
	mov	eax,[counter_limit]
1666
	mov	eax,[counter_limit]
1811
	call	add_macro_symbol
1667
	call	add_macro_symbol
1812
	mov	[edx+12],ebx
1668
	mov	[edx+12],ebx
1813
	cmp	byte [ebx],1Ah
1669
	cmp	byte [ebx],1Ah
1814
	je	irps_symbol
1670
	je	irps_symbol
1815
	cmp	byte [ebx],22h
1671
	cmp	byte [ebx],22h
1816
	je	irps_quoted_string
1672
	je	irps_quoted_string
1817
	mov	eax,1
1673
	mov	eax,1
1818
	jmp	irps_parameter_ok
1674
	jmp	irps_parameter_ok
1819
      irps_quoted_string:
1675
      irps_quoted_string:
1820
	mov	eax,[ebx+1]
1676
	mov	eax,[ebx+1]
1821
	add	eax,1+4
1677
	add	eax,1+4
1822
	jmp	irps_parameter_ok
1678
	jmp	irps_parameter_ok
1823
      irps_symbol:
1679
      irps_symbol:
1824
	movzx	eax,byte [ebx+1]
1680
	movzx	eax,byte [ebx+1]
1825
	add	eax,1+1
1681
	add	eax,1+1
1826
      irps_parameter_ok:
1682
      irps_parameter_ok:
1827
	mov	[edx+8],eax
1683
	mov	[edx+8],eax
1828
	add	ebx,eax
1684
	add	ebx,eax
1829
	cmp	byte [ebx],0
1685
	cmp	byte [ebx],0
1830
	je	irps_parameters_end
1686
	je	irps_parameters_end
1831
	cmp	byte [ebx],'{'
1687
	cmp	byte [ebx],'{'
1832
	jne	get_irps_parameter
1688
	jne	get_irps_parameter
1833
      irps_parameters_end:
1689
      irps_parameters_end:
1834
	mov	esi,ebx
1690
	mov	esi,ebx
1835
	jmp	instant_macro_parameters_ok
1691
	jmp	instant_macro_parameters_ok
1836
do_match:
1692
do_match:
1837
	mov	ebx,esi
1693
	mov	ebx,esi
1838
	call	skip_pattern
1694
	call	skip_pattern
1839
	call	exact_match
1695
	call	exact_match
1840
	mov	edx,edi
1696
	mov	edx,edi
1841
	mov	al,[ebx]
1697
	mov	al,[ebx]
1842
	cmp	al,1Ah
1698
	cmp	al,1Ah
1843
	je	free_match
1699
	je	free_match
1844
	cmp	al,','
1700
	cmp	al,','
1845
	jne	instant_macro_done
1701
	jne	instant_macro_done
1846
	cmp	esi,[parameters_end]
1702
	cmp	esi,[parameters_end]
1847
	je	matched_pattern
1703
	je	matched_pattern
1848
	jmp	instant_macro_done
1704
	jmp	instant_macro_done
1849
      free_match:
1705
      free_match:
1850
	add	edx,12
1706
	add	edx,12
1851
	cmp	edx,[memory_end]
1707
	cmp	edx,[memory_end]
1852
	ja	out_of_memory
1708
	ja	out_of_memory
1853
	mov	[edx-12],ebx
1709
	mov	[edx-12],ebx
1854
	mov	[edx-8],esi
1710
	mov	[edx-8],esi
1855
	call	skip_match_element
1711
	call	skip_match_element
1856
	jc	try_different_matching
1712
	jc	try_different_matching
1857
	mov	[edx-4],esi
1713
	mov	[edx-4],esi
1858
	movzx	eax,byte [ebx+1]
1714
	movzx	eax,byte [ebx+1]
1859
	lea	ebx,[ebx+2+eax]
1715
	lea	ebx,[ebx+2+eax]
1860
	cmp	byte [ebx],1Ah
1716
	cmp	byte [ebx],1Ah
1861
	je	free_match
1717
	je	free_match
1862
      find_exact_match:
1718
      find_exact_match:
1863
	call	exact_match
1719
	call	exact_match
1864
	cmp	esi,[parameters_end]
1720
	cmp	esi,[parameters_end]
1865
	je	end_matching
1721
	je	end_matching
1866
	cmp	byte [ebx],1Ah
1722
	cmp	byte [ebx],1Ah
1867
	je	free_match
1723
	je	free_match
1868
	mov	ebx,[edx-12]
1724
	mov	ebx,[edx-12]
1869
	movzx	eax,byte [ebx+1]
1725
	movzx	eax,byte [ebx+1]
1870
	lea	ebx,[ebx+2+eax]
1726
	lea	ebx,[ebx+2+eax]
1871
	mov	esi,[edx-4]
1727
	mov	esi,[edx-4]
1872
	jmp	match_more_elements
1728
	jmp	match_more_elements
1873
      try_different_matching:
1729
      try_different_matching:
1874
	sub	edx,12
1730
	sub	edx,12
1875
	cmp	edx,edi
1731
	cmp	edx,edi
1876
	je	instant_macro_done
1732
	je	instant_macro_done
1877
	mov	ebx,[edx-12]
1733
	mov	ebx,[edx-12]
1878
	movzx	eax,byte [ebx+1]
1734
	movzx	eax,byte [ebx+1]
1879
	lea	ebx,[ebx+2+eax]
1735
	lea	ebx,[ebx+2+eax]
1880
	cmp	byte [ebx],1Ah
1736
	cmp	byte [ebx],1Ah
1881
	je	try_different_matching
1737
	je	try_different_matching
1882
	mov	esi,[edx-4]
1738
	mov	esi,[edx-4]
1883
      match_more_elements:
1739
      match_more_elements:
1884
	call	skip_match_element
1740
	call	skip_match_element
1885
	jc	try_different_matching
1741
	jc	try_different_matching
1886
	mov	[edx-4],esi
1742
	mov	[edx-4],esi
1887
	jmp	find_exact_match
1743
	jmp	find_exact_match
1888
      skip_match_element:
1744
      skip_match_element:
1889
	cmp	esi,[parameters_end]
1745
	cmp	esi,[parameters_end]
1890
	je	cannot_match
1746
	je	cannot_match
1891
	mov	al,[esi]
1747
	mov	al,[esi]
1892
	cmp	al,1Ah
1748
	cmp	al,1Ah
1893
	je	skip_match_symbol
1749
	je	skip_match_symbol
1894
	cmp	al,22h
1750
	cmp	al,22h
1895
	je	skip_match_quoted_string
1751
	je	skip_match_quoted_string
1896
	add	esi,1
1752
	add	esi,1
1897
	ret
1753
	ret
1898
      skip_match_quoted_string:
1754
      skip_match_quoted_string:
1899
	mov	eax,[esi+1]
1755
	mov	eax,[esi+1]
1900
	add	esi,5
1756
	add	esi,5
1901
	jmp	skip_match_ok
1757
	jmp	skip_match_ok
1902
      skip_match_symbol:
1758
      skip_match_symbol:
1903
	movzx	eax,byte [esi+1]
1759
	movzx	eax,byte [esi+1]
1904
	add	esi,2
1760
	add	esi,2
1905
      skip_match_ok:
1761
      skip_match_ok:
1906
	add	esi,eax
1762
	add	esi,eax
1907
	ret
1763
	ret
1908
      cannot_match:
1764
      cannot_match:
1909
	stc
1765
	stc
1910
	ret
1766
	ret
1911
      exact_match:
1767
      exact_match:
1912
	cmp	esi,[parameters_end]
1768
	cmp	esi,[parameters_end]
1913
	je	exact_match_complete
1769
	je	exact_match_complete
1914
	mov	ah,[esi]
1770
	mov	ah,[esi]
1915
	mov	al,[ebx]
1771
	mov	al,[ebx]
1916
	cmp	al,','
1772
	cmp	al,','
1917
	je	exact_match_complete
1773
	je	exact_match_complete
1918
	cmp	al,1Ah
1774
	cmp	al,1Ah
1919
	je	exact_match_complete
1775
	je	exact_match_complete
1920
	cmp	al,'='
1776
	cmp	al,'='
1921
	je	match_verbatim
1777
	je	match_verbatim
1922
	call	match_elements
1778
	call	match_elements
1923
	je	exact_match
1779
	je	exact_match
1924
      exact_match_complete:
1780
      exact_match_complete:
1925
	ret
1781
	ret
1926
      match_verbatim:
1782
      match_verbatim:
1927
	inc	ebx
1783
	inc	ebx
1928
	call	match_elements
1784
	call	match_elements
1929
	je	exact_match
1785
	je	exact_match
1930
	dec	ebx
1786
	dec	ebx
1931
	ret
1787
	ret
1932
      match_elements:
1788
      match_elements:
1933
	mov	al,[ebx]
1789
	mov	al,[ebx]
1934
	cmp	al,1Ah
1790
	cmp	al,1Ah
1935
	je	match_symbols
1791
	je	match_symbols
1936
	cmp	al,22h
1792
	cmp	al,22h
1937
	je	match_quoted_strings
1793
	je	match_quoted_strings
1938
	cmp	al,ah
1794
	cmp	al,ah
1939
	je	symbol_characters_matched
1795
	je	symbol_characters_matched
1940
	ret
1796
	ret
1941
      symbol_characters_matched:
1797
      symbol_characters_matched:
1942
	lea	ebx,[ebx+1]
1798
	lea	ebx,[ebx+1]
1943
	lea	esi,[esi+1]
1799
	lea	esi,[esi+1]
1944
	ret
1800
	ret
1945
      match_quoted_strings:
1801
      match_quoted_strings:
1946
	mov	ecx,[ebx+1]
1802
	mov	ecx,[ebx+1]
1947
	add	ecx,5
1803
	add	ecx,5
1948
	jmp	compare_elements
1804
	jmp	compare_elements
1949
      match_symbols:
1805
      match_symbols:
1950
	movzx	ecx,byte [ebx+1]
1806
	movzx	ecx,byte [ebx+1]
1951
	add	ecx,2
1807
	add	ecx,2
1952
      compare_elements:
1808
      compare_elements:
1953
	mov	eax,esi
1809
	mov	eax,esi
1954
	mov	ebp,edi
1810
	mov	ebp,edi
1955
	mov	edi,ebx
1811
	mov	edi,ebx
1956
	repe	cmps byte [esi],[edi]
1812
	repe	cmps byte [esi],[edi]
1957
	jne	elements_mismatch
1813
	jne	elements_mismatch
1958
	mov	ebx,edi
1814
	mov	ebx,edi
1959
	mov	edi,ebp
1815
	mov	edi,ebp
1960
	ret
1816
	ret
1961
      elements_mismatch:
1817
      elements_mismatch:
1962
	mov	esi,eax
1818
	mov	esi,eax
1963
	mov	edi,ebp
1819
	mov	edi,ebp
1964
	ret
1820
	ret
1965
      end_matching:
1821
      end_matching:
1966
	cmp	byte [ebx],','
1822
	cmp	byte [ebx],','
1967
	jne	instant_macro_done
1823
	jne	instant_macro_done
1968
      matched_pattern:
1824
      matched_pattern:
1969
	xor	eax,eax
1825
	xor	eax,eax
1970
	push	[free_additional_memory]
1826
	push	[free_additional_memory]
1971
	push	[macro_symbols]
1827
	push	[macro_symbols]
1972
	mov	[macro_symbols],eax
1828
	mov	[macro_symbols],eax
1973
	push	[counter_limit]
1829
	push	[counter_limit]
1974
	mov	[counter_limit],eax
1830
	mov	[counter_limit],eax
1975
	mov	[struc_name],eax
1831
	mov	[struc_name],eax
1976
	push	esi edi edx
1832
	push	esi edi edx
1977
      add_matched_symbol:
1833
      add_matched_symbol:
1978
	cmp	edi,[esp]
1834
	cmp	edi,[esp]
1979
	je	matched_symbols_ok
1835
	je	matched_symbols_ok
1980
	mov	esi,[edi]
1836
	mov	esi,[edi]
1981
	inc	esi
1837
	inc	esi
1982
	lods	byte [esi]
1838
	lods	byte [esi]
1983
	movzx	ecx,al
1839
	movzx	ecx,al
1984
	xor	eax,eax
1840
	xor	eax,eax
1985
	call	add_macro_symbol
1841
	call	add_macro_symbol
1986
	mov	eax,[edi+4]
1842
	mov	eax,[edi+4]
1987
	mov	dword [edx+12],eax
1843
	mov	dword [edx+12],eax
1988
	mov	ecx,[edi+8]
1844
	mov	ecx,[edi+8]
1989
	sub	ecx,eax
1845
	sub	ecx,eax
1990
	mov	dword [edx+8],ecx
1846
	mov	dword [edx+8],ecx
1991
	add	edi,12
1847
	add	edi,12
1992
	jmp	add_matched_symbol
1848
	jmp	add_matched_symbol
1993
      matched_symbols_ok:
1849
      matched_symbols_ok:
1994
	pop	edx edi esi
1850
	pop	edx edi esi
1995
	jmp	instant_macro_parameters_ok
1851
	jmp	instant_macro_parameters_ok
1996
 
1852
 
1997
process_macro:
1853
process_macro:
1998
	push	dword [macro_status]
1854
	push	dword [macro_status]
1999
	or	[macro_status],10h
1855
	or	[macro_status],10h
2000
	push	[counter]
1856
	push	[counter]
2001
	push	[macro_block]
1857
	push	[macro_block]
2002
	push	[macro_block_line]
1858
	push	[macro_block_line]
2003
	push	[macro_block_line_number]
1859
	push	[macro_block_line_number]
2004
	push	[struc_label]
1860
	push	[struc_label]
2005
	push	[struc_name]
1861
	push	[struc_name]
2006
	push	eax
1862
	push	eax
2007
	push	[current_line]
1863
	push	[current_line]
2008
	lods	byte [esi]
1864
	lods	byte [esi]
2009
	cmp	al,'{'
1865
	cmp	al,'{'
2010
	je	macro_instructions_start
1866
	je	macro_instructions_start
2011
	or	al,al
1867
	or	al,al
2012
	jnz	unexpected_characters
1868
	jnz	unexpected_characters
2013
      find_macro_instructions:
1869
      find_macro_instructions:
2014
	mov	[macro_line],esi
1870
	mov	[macro_line],esi
2015
	add	esi,16+2
1871
	add	esi,16+2
2016
	lods	byte [esi]
1872
	lods	byte [esi]
2017
	or	al,al
1873
	or	al,al
2018
	jz	find_macro_instructions
1874
	jz	find_macro_instructions
2019
	cmp	al,'{'
1875
	cmp	al,'{'
2020
	je	macro_instructions_start
1876
	je	macro_instructions_start
2021
	cmp	al,3Bh
1877
	cmp	al,3Bh
2022
	jne	unexpected_characters
1878
	jne	unexpected_characters
2023
	call	skip_foreign_symbol
1879
	call	skip_foreign_symbol
2024
	jmp	find_macro_instructions
1880
	jmp	find_macro_instructions
2025
      macro_instructions_start:
1881
      macro_instructions_start:
2026
	mov	ecx,80000000h
1882
	mov	ecx,80000000h
2027
	mov	[macro_block],esi
1883
	mov	[macro_block],esi
2028
	mov	eax,[macro_line]
1884
	mov	eax,[macro_line]
2029
	mov	[macro_block_line],eax
1885
	mov	[macro_block_line],eax
2030
	mov	[macro_block_line_number],ecx
1886
	mov	[macro_block_line_number],ecx
2031
	xor	eax,eax
1887
	xor	eax,eax
2032
	mov	[counter],eax
1888
	mov	[counter],eax
2033
	cmp	[counter_limit],eax
1889
	cmp	[counter_limit],eax
2034
	je	process_macro_line
1890
	je	process_macro_line
2035
	inc	[counter]
1891
	inc	[counter]
2036
      process_macro_line:
1892
      process_macro_line:
2037
	mov	[current_line],edi
1893
	mov	[current_line],edi
2038
	lea	eax,[edi+10h]
1894
	lea	eax,[edi+10h]
2039
	cmp	eax,[memory_end]
1895
	cmp	eax,[memory_end]
2040
	jae	out_of_memory
1896
	jae	out_of_memory
2041
	mov	eax,[esp+4]
1897
	mov	eax,[esp+4]
2042
	or	eax,eax
1898
	or	eax,eax
2043
	jz	instant_macro_line_header
1899
	jz	instant_macro_line_header
2044
	stos	dword [edi]
1900
	stos	dword [edi]
2045
	mov	eax,ecx
1901
	mov	eax,ecx
2046
	stos	dword [edi]
1902
	stos	dword [edi]
2047
	mov	eax,[esp]
1903
	mov	eax,[esp]
2048
	stos	dword [edi]
1904
	stos	dword [edi]
2049
	mov	eax,[macro_line]
1905
	mov	eax,[macro_line]
2050
	stos	dword [edi]
1906
	stos	dword [edi]
2051
	jmp	macro_line_header_ok
1907
	jmp	macro_line_header_ok
2052
      instant_macro_line_header:
1908
      instant_macro_line_header:
2053
	mov	eax,[macro_line]
1909
	mov	eax,[macro_line]
2054
	add	eax,16+1
1910
	add	eax,16+1
2055
	stos	dword [edi]
1911
	stos	dword [edi]
2056
	mov	eax,ecx
1912
	mov	eax,ecx
2057
	stos	dword [edi]
1913
	stos	dword [edi]
2058
	mov	eax,[macro_line]
1914
	mov	eax,[macro_line]
2059
	stos	dword [edi]
1915
	stos	dword [edi]
2060
	stos	dword [edi]
1916
	stos	dword [edi]
2061
      macro_line_header_ok:
1917
      macro_line_header_ok:
2062
	or	[macro_status],20h
1918
	or	[macro_status],20h
2063
	push	ebx ecx
1919
	push	ebx ecx
2064
	test	[macro_status],0Fh
1920
	test	[macro_status],0Fh
2065
	jz	process_macro_line_element
1921
	jz	process_macro_line_element
2066
	mov	ax,3Bh
1922
	mov	ax,3Bh
2067
	stos	word [edi]
1923
	stos	word [edi]
2068
      process_macro_line_element:
1924
      process_macro_line_element:
2069
	lea	eax,[edi+100h]
1925
	lea	eax,[edi+100h]
2070
	cmp	eax,[memory_end]
1926
	cmp	eax,[memory_end]
2071
	jae	out_of_memory
1927
	jae	out_of_memory
2072
	lods	byte [esi]
1928
	lods	byte [esi]
2073
	cmp	al,'}'
1929
	cmp	al,'}'
2074
	je	macro_line_processed
1930
	je	macro_line_processed
2075
	or	al,al
1931
	or	al,al
2076
	jz	macro_line_processed
1932
	jz	macro_line_processed
2077
	cmp	al,1Ah
1933
	cmp	al,1Ah
2078
	je	process_macro_symbol
1934
	je	process_macro_symbol
2079
	cmp	al,3Bh
1935
	cmp	al,3Bh
2080
	je	macro_foreign_line
1936
	je	macro_foreign_line
2081
	and	[macro_status],not 20h
1937
	and	[macro_status],not 20h
2082
	stos	byte [edi]
1938
	stos	byte [edi]
2083
	cmp	al,22h
1939
	cmp	al,22h
2084
	jne	process_macro_line_element
1940
	jne	process_macro_line_element
2085
      copy_macro_string:
1941
      copy_macro_string:
2086
	mov	ecx,[esi]
1942
	mov	ecx,[esi]
2087
	add	ecx,4
1943
	add	ecx,4
2088
	call	move_data
1944
	call	move_data
2089
	jmp	process_macro_line_element
1945
	jmp	process_macro_line_element
2090
      process_macro_symbol:
1946
      process_macro_symbol:
2091
	push	esi edi
1947
	push	esi edi
2092
	test	[macro_status],20h
1948
	test	[macro_status],20h
2093
	jz	not_macro_directive
1949
	jz	not_macro_directive
2094
	movzx	ecx,byte [esi]
1950
	movzx	ecx,byte [esi]
2095
	inc	esi
1951
	inc	esi
2096
	mov	edi,macro_directives
1952
	mov	edi,macro_directives
2097
	call	get_directive
1953
	call	get_directive
2098
	jnc	process_macro_directive
1954
	jnc	process_macro_directive
2099
	dec	esi
1955
	dec	esi
2100
	jmp	not_macro_directive
1956
	jmp	not_macro_directive
2101
      process_macro_directive:
1957
      process_macro_directive:
2102
	mov	edx,eax
1958
	mov	edx,eax
2103
	pop	edi eax
1959
	pop	edi eax
2104
	mov	byte [edi],0
1960
	mov	byte [edi],0
2105
	inc	edi
1961
	inc	edi
2106
	pop	ecx ebx
1962
	pop	ecx ebx
2107
	jmp	near edx
1963
	jmp	near edx
2108
      not_macro_directive:
1964
      not_macro_directive:
2109
	and	[macro_status],not 20h
1965
	and	[macro_status],not 20h
2110
	movzx	ecx,byte [esi]
1966
	movzx	ecx,byte [esi]
2111
	inc	esi
1967
	inc	esi
2112
	mov	eax,[counter]
1968
	mov	eax,[counter]
2113
	call	get_macro_symbol
1969
	call	get_macro_symbol
2114
	jnc	group_macro_symbol
1970
	jnc	group_macro_symbol
2115
	xor	eax,eax
1971
	xor	eax,eax
2116
	cmp	[counter],eax
1972
	cmp	[counter],eax
2117
	je	multiple_macro_symbol_values
1973
	je	multiple_macro_symbol_values
2118
	call	get_macro_symbol
1974
	call	get_macro_symbol
2119
	jc	not_macro_symbol
1975
	jc	not_macro_symbol
2120
      replace_macro_symbol:
1976
      replace_macro_symbol:
2121
	pop	edi eax
1977
	pop	edi eax
2122
	mov	ecx,[edx+8]
1978
	mov	ecx,[edx+8]
2123
	and	ecx,not 80000000h
1979
	and	ecx,not 80000000h
2124
	mov	edx,[edx+12]
1980
	mov	edx,[edx+12]
2125
	or	edx,edx
1981
	or	edx,edx
2126
	jz	replace_macro_counter
1982
	jz	replace_macro_counter
2127
	xchg	esi,edx
1983
	xchg	esi,edx
2128
	call	move_data
1984
	call	move_data
2129
	mov	esi,edx
1985
	mov	esi,edx
2130
	jmp	process_macro_line_element
1986
	jmp	process_macro_line_element
2131
      group_macro_symbol:
1987
      group_macro_symbol:
2132
	xor	eax,eax
1988
	xor	eax,eax
2133
	cmp	[counter],eax
1989
	cmp	[counter],eax
2134
	je	replace_macro_symbol
1990
	je	replace_macro_symbol
2135
	push	esi edx
1991
	push	esi edx
2136
	sub	esi,ecx
1992
	sub	esi,ecx
2137
	call	get_macro_symbol
1993
	call	get_macro_symbol
2138
	mov	ebx,edx
1994
	mov	ebx,edx
2139
	pop	edx esi
1995
	pop	edx esi
2140
	jc	replace_macro_symbol
1996
	jc	replace_macro_symbol
2141
	cmp	edx,ebx
1997
	cmp	edx,ebx
2142
	ja	replace_macro_symbol
1998
	ja	replace_macro_symbol
2143
	mov	edx,ebx
1999
	mov	edx,ebx
2144
	jmp	replace_macro_symbol
2000
	jmp	replace_macro_symbol
2145
      multiple_macro_symbol_values:
2001
      multiple_macro_symbol_values:
2146
	inc	eax
2002
	inc	eax
2147
	push	eax
2003
	push	eax
2148
	call	get_macro_symbol
2004
	call	get_macro_symbol
2149
	pop	eax
2005
	pop	eax
2150
	jc	not_macro_symbol
2006
	jc	not_macro_symbol
2151
	pop	edi
2007
	pop	edi
2152
	push	ecx
2008
	push	ecx
2153
	mov	ecx,[edx+8]
2009
	mov	ecx,[edx+8]
2154
	mov	edx,[edx+12]
2010
	mov	edx,[edx+12]
2155
	xchg	esi,edx
2011
	xchg	esi,edx
2156
	btr	ecx,31
2012
	btr	ecx,31
2157
	jc	enclose_macro_symbol_value
2013
	jc	enclose_macro_symbol_value
2158
	rep	movs byte [edi],[esi]
2014
	rep	movs byte [edi],[esi]
2159
	jmp	macro_symbol_value_ok
2015
	jmp	macro_symbol_value_ok
2160
      enclose_macro_symbol_value:
2016
      enclose_macro_symbol_value:
2161
	mov	byte [edi],'<'
2017
	mov	byte [edi],'<'
2162
	inc	edi
2018
	inc	edi
2163
	rep	movs byte [edi],[esi]
2019
	rep	movs byte [edi],[esi]
2164
	mov	byte [edi],'>'
2020
	mov	byte [edi],'>'
2165
	inc	edi
2021
	inc	edi
2166
      macro_symbol_value_ok:
2022
      macro_symbol_value_ok:
2167
	cmp	eax,[counter_limit]
2023
	cmp	eax,[counter_limit]
2168
	je	multiple_macro_symbol_values_ok
2024
	je	multiple_macro_symbol_values_ok
2169
	mov	byte [edi],','
2025
	mov	byte [edi],','
2170
	inc	edi
2026
	inc	edi
2171
	mov	esi,edx
2027
	mov	esi,edx
2172
	pop	ecx
2028
	pop	ecx
2173
	push	edi
2029
	push	edi
2174
	sub	esi,ecx
2030
	sub	esi,ecx
2175
	jmp	multiple_macro_symbol_values
2031
	jmp	multiple_macro_symbol_values
2176
      multiple_macro_symbol_values_ok:
2032
      multiple_macro_symbol_values_ok:
2177
	pop	ecx eax
2033
	pop	ecx eax
2178
	mov	esi,edx
2034
	mov	esi,edx
2179
	jmp	process_macro_line_element
2035
	jmp	process_macro_line_element
2180
      replace_macro_counter:
2036
      replace_macro_counter:
2181
	mov	eax,[counter]
2037
	mov	eax,[counter]
2182
	and	eax,not 80000000h
2038
	and	eax,not 80000000h
2183
	jz	group_macro_counter
2039
	jz	group_macro_counter
2184
	add	ecx,eax
2040
	add	ecx,eax
2185
	dec	ecx
2041
	dec	ecx
2186
	call	store_number_symbol
2042
	call	store_number_symbol
2187
	jmp	process_macro_line_element
2043
	jmp	process_macro_line_element
2188
      group_macro_counter:
2044
      group_macro_counter:
2189
	mov	edx,ecx
2045
	mov	edx,ecx
2190
	xor	ecx,ecx
2046
	xor	ecx,ecx
2191
      multiple_macro_counter_values:
2047
      multiple_macro_counter_values:
2192
	push	ecx edx
2048
	push	ecx edx
2193
	add	ecx,edx
2049
	add	ecx,edx
2194
	call	store_number_symbol
2050
	call	store_number_symbol
2195
	pop	edx ecx
2051
	pop	edx ecx
2196
	inc	ecx
2052
	inc	ecx
2197
	cmp	ecx,[counter_limit]
2053
	cmp	ecx,[counter_limit]
2198
	je	process_macro_line_element
2054
	je	process_macro_line_element
2199
	mov	byte [edi],','
2055
	mov	byte [edi],','
2200
	inc	edi
2056
	inc	edi
2201
	jmp	multiple_macro_counter_values
2057
	jmp	multiple_macro_counter_values
2202
      store_number_symbol:
2058
      store_number_symbol:
2203
	mov	ax,1Ah
2059
	mov	ax,1Ah
2204
	stos	word [edi]
2060
	stos	word [edi]
2205
	push	edi
2061
	push	edi
2206
	mov	eax,ecx
2062
	mov	eax,ecx
2207
	mov	ecx,1000000000
2063
	mov	ecx,1000000000
2208
	xor	edx,edx
2064
	xor	edx,edx
2209
	xor	bl,bl
2065
	xor	bl,bl
2210
      store_number_digits:
2066
      store_number_digits:
2211
	div	ecx
2067
	div	ecx
2212
	push	edx
2068
	push	edx
2213
	or	bl,bl
2069
	or	bl,bl
2214
	jnz	store_number_digit
2070
	jnz	store_number_digit
2215
	cmp	ecx,1
2071
	cmp	ecx,1
2216
	je	store_number_digit
2072
	je	store_number_digit
2217
	or	al,al
2073
	or	al,al
2218
	jz	number_digit_ok
2074
	jz	number_digit_ok
2219
	not	bl
2075
	not	bl
2220
      store_number_digit:
2076
      store_number_digit:
2221
	add	al,30h
2077
	add	al,30h
2222
	stos	byte [edi]
2078
	stos	byte [edi]
2223
      number_digit_ok:
2079
      number_digit_ok:
2224
	mov	eax,ecx
2080
	mov	eax,ecx
2225
	xor	edx,edx
2081
	xor	edx,edx
2226
	mov	ecx,10
2082
	mov	ecx,10
2227
	div	ecx
2083
	div	ecx
2228
	mov	ecx,eax
2084
	mov	ecx,eax
2229
	pop	eax
2085
	pop	eax
2230
	or	ecx,ecx
2086
	or	ecx,ecx
2231
	jnz	store_number_digits
2087
	jnz	store_number_digits
2232
	pop	ebx
2088
	pop	ebx
2233
	mov	eax,edi
2089
	mov	eax,edi
2234
	sub	eax,ebx
2090
	sub	eax,ebx
2235
	mov	[ebx-1],al
2091
	mov	[ebx-1],al
2236
	ret
2092
	ret
2237
      not_macro_symbol:
2093
      not_macro_symbol:
2238
	pop	edi esi
2094
	pop	edi esi
2239
	mov	al,1Ah
2095
	mov	al,1Ah
2240
	stos	byte [edi]
2096
	stos	byte [edi]
2241
	mov	al,[esi]
2097
	mov	al,[esi]
2242
	inc	esi
2098
	inc	esi
2243
	stos	byte [edi]
2099
	stos	byte [edi]
2244
	cmp	byte [esi],'.'
2100
	cmp	byte [esi],'.'
2245
	jne	copy_raw_symbol
2101
	jne	copy_raw_symbol
2246
	mov	ebx,[esp+8+8]
2102
	mov	ebx,[esp+8+8]
2247
	or	ebx,ebx
2103
	or	ebx,ebx
2248
	jz	copy_raw_symbol
2104
	jz	copy_raw_symbol
2249
	cmp	al,1
2105
	cmp	al,1
2250
	je	copy_struc_name
2106
	je	copy_struc_name
2251
	xchg	esi,ebx
2107
	xchg	esi,ebx
2252
	movzx	ecx,byte [esi-1]
2108
	movzx	ecx,byte [esi-1]
2253
	add	[edi-1],cl
2109
	add	[edi-1],cl
2254
	jc	name_too_long
2110
	jc	name_too_long
2255
	rep	movs byte [edi],[esi]
2111
	rep	movs byte [edi],[esi]
2256
	xchg	esi,ebx
2112
	xchg	esi,ebx
2257
      copy_raw_symbol:
2113
      copy_raw_symbol:
2258
	movzx	ecx,al
2114
	movzx	ecx,al
2259
	rep	movs byte [edi],[esi]
2115
	rep	movs byte [edi],[esi]
2260
	jmp	process_macro_line_element
2116
	jmp	process_macro_line_element
2261
      copy_struc_name:
2117
      copy_struc_name:
2262
	inc	esi
2118
	inc	esi
2263
	xchg	esi,ebx
2119
	xchg	esi,ebx
2264
	movzx	ecx,byte [esi-1]
2120
	movzx	ecx,byte [esi-1]
2265
	mov	[edi-1],cl
2121
	mov	[edi-1],cl
2266
	rep	movs byte [edi],[esi]
2122
	rep	movs byte [edi],[esi]
2267
	xchg	esi,ebx
2123
	xchg	esi,ebx
2268
	mov	eax,[esp+8+12]
2124
	mov	eax,[esp+8+12]
2269
	cmp	byte [eax],3Bh
2125
	cmp	byte [eax],3Bh
2270
	je	process_macro_line_element
2126
	je	process_macro_line_element
2271
	cmp	byte [eax],1Ah
2127
	cmp	byte [eax],1Ah
2272
	jne	disable_replaced_struc_name
2128
	jne	disable_replaced_struc_name
2273
	mov	byte [eax],3Bh
2129
	mov	byte [eax],3Bh
2274
	jmp	process_macro_line_element
2130
	jmp	process_macro_line_element
2275
      disable_replaced_struc_name:
2131
      disable_replaced_struc_name:
2276
	mov	ebx,[esp+8+8]
2132
	mov	ebx,[esp+8+8]
2277
	push	esi edi
2133
	push	esi edi
2278
	lea	edi,[ebx-3]
2134
	lea	edi,[ebx-3]
2279
	lea	esi,[edi-2]
2135
	lea	esi,[edi-2]
2280
	lea	ecx,[esi+1]
2136
	lea	ecx,[esi+1]
2281
	sub	ecx,eax
2137
	sub	ecx,eax
2282
	std
2138
	std
2283
	rep	movs byte [edi],[esi]
2139
	rep	movs byte [edi],[esi]
2284
	cld
2140
	cld
2285
	mov	word [eax],3Bh
2141
	mov	word [eax],3Bh
2286
	pop	edi esi
2142
	pop	edi esi
2287
	jmp	process_macro_line_element
2143
	jmp	process_macro_line_element
2288
      skip_foreign_symbol:
2144
      skip_foreign_symbol:
2289
	lods	byte [esi]
2145
	lods	byte [esi]
2290
	movzx	eax,al
2146
	movzx	eax,al
2291
	add	esi,eax
2147
	add	esi,eax
2292
      skip_foreign_line:
2148
      skip_foreign_line:
2293
	lods	byte [esi]
2149
	lods	byte [esi]
2294
	cmp	al,1Ah
2150
	cmp	al,1Ah
2295
	je	skip_foreign_symbol
2151
	je	skip_foreign_symbol
2296
	cmp	al,3Bh
2152
	cmp	al,3Bh
2297
	je	skip_foreign_symbol
2153
	je	skip_foreign_symbol
2298
	cmp	al,22h
2154
	cmp	al,22h
2299
	je	skip_foreign_string
2155
	je	skip_foreign_string
2300
	or	al,al
2156
	or	al,al
2301
	jnz	skip_foreign_line
2157
	jnz	skip_foreign_line
2302
	ret
2158
	ret
2303
      skip_foreign_string:
2159
      skip_foreign_string:
2304
	lods	dword [esi]
2160
	lods	dword [esi]
2305
	add	esi,eax
2161
	add	esi,eax
2306
	jmp	skip_foreign_line
2162
	jmp	skip_foreign_line
2307
      macro_foreign_line:
2163
      macro_foreign_line:
2308
	call	skip_foreign_symbol
2164
	call	skip_foreign_symbol
2309
      macro_line_processed:
2165
      macro_line_processed:
2310
	mov	byte [edi],0
2166
	mov	byte [edi],0
2311
	inc	edi
2167
	inc	edi
2312
	push	eax
2168
	push	eax
2313
	call	preprocess_line
2169
	call	preprocess_line
2314
	pop	eax
2170
	pop	eax
2315
	pop	ecx ebx
2171
	pop	ecx ebx
2316
	cmp	al,'}'
2172
	cmp	al,'}'
2317
	je	macro_block_processed
2173
	je	macro_block_processed
2318
      process_next_line:
2174
      process_next_line:
2319
	inc	ecx
2175
	inc	ecx
2320
	mov	[macro_line],esi
2176
	mov	[macro_line],esi
2321
	add	esi,16+2
2177
	add	esi,16+2
2322
	jmp	process_macro_line
2178
	jmp	process_macro_line
2323
      macro_block_processed:
2179
      macro_block_processed:
2324
	call	close_macro_block
2180
	call	close_macro_block
2325
	jc	process_macro_line
2181
	jc	process_macro_line
2326
	pop	[current_line]
2182
	pop	[current_line]
2327
	add	esp,12
2183
	add	esp,12
2328
	pop	[macro_block_line_number]
2184
	pop	[macro_block_line_number]
2329
	pop	[macro_block_line]
2185
	pop	[macro_block_line]
2330
	pop	[macro_block]
2186
	pop	[macro_block]
2331
	pop	[counter]
2187
	pop	[counter]
2332
	pop	eax
2188
	pop	eax
2333
	and	al,0F0h
2189
	and	al,0F0h
2334
	and	[macro_status],0Fh
2190
	and	[macro_status],0Fh
2335
	or	[macro_status],al
2191
	or	[macro_status],al
2336
	ret
2192
	ret
2337
 
2193
 
2338
local_symbols:
2194
local_symbols:
2339
	lods	byte [esi]
2195
	lods	byte [esi]
2340
	cmp	al,1Ah
2196
	cmp	al,1Ah
2341
	jne	invalid_argument
2197
	jne	invalid_argument
2342
	mov	byte [edi-1],3Bh
2198
	mov	byte [edi-1],3Bh
2343
	xor	al,al
2199
	xor	al,al
2344
	stos	byte [edi]
2200
	stos	byte [edi]
2345
      make_local_symbol:
2201
      make_local_symbol:
2346
	push	ecx
2202
	push	ecx
2347
	lods	byte [esi]
2203
	lods	byte [esi]
2348
	movzx	ecx,al
2204
	movzx	ecx,al
2349
	mov	eax,[counter]
2205
	mov	eax,[counter]
2350
	call	add_macro_symbol
2206
	call	add_macro_symbol
2351
	mov	[edx+12],edi
2207
	mov	[edx+12],edi
2352
	movzx	eax,[locals_counter]
2208
	movzx	eax,[locals_counter]
2353
	add	eax,ecx
2209
	add	eax,ecx
2354
	inc	eax
2210
	inc	eax
2355
	cmp	eax,100h
2211
	cmp	eax,100h
2356
	jae	name_too_long
2212
	jae	name_too_long
2357
	lea	ebp,[edi+2+eax]
2213
	lea	ebp,[edi+2+eax]
2358
	cmp	ebp,[memory_end]
2214
	cmp	ebp,[memory_end]
2359
	jae	out_of_memory
2215
	jae	out_of_memory
2360
	mov	ah,al
2216
	mov	ah,al
2361
	mov	al,1Ah
2217
	mov	al,1Ah
2362
	stos	word [edi]
2218
	stos	word [edi]
2363
	rep	movs byte [edi],[esi]
2219
	rep	movs byte [edi],[esi]
2364
	mov	al,'?'
2220
	mov	al,'?'
2365
	stos	byte [edi]
2221
	stos	byte [edi]
2366
	push	esi
2222
	push	esi
2367
	mov	esi,locals_counter+1
2223
	mov	esi,locals_counter+1
2368
	movzx	ecx,[locals_counter]
2224
	movzx	ecx,[locals_counter]
2369
	rep	movs byte [edi],[esi]
2225
	rep	movs byte [edi],[esi]
2370
	pop	esi
2226
	pop	esi
2371
	mov	eax,edi
2227
	mov	eax,edi
2372
	sub	eax,[edx+12]
2228
	sub	eax,[edx+12]
2373
	mov	[edx+8],eax
2229
	mov	[edx+8],eax
2374
	xor	al,al
2230
	xor	al,al
2375
	stos	byte [edi]
2231
	stos	byte [edi]
2376
	mov	eax,locals_counter
2232
	mov	eax,locals_counter
2377
	movzx	ecx,byte [eax]
2233
	movzx	ecx,byte [eax]
2378
      counter_loop:
2234
      counter_loop:
2379
	inc	byte [eax+ecx]
2235
	inc	byte [eax+ecx]
2380
	cmp	byte [eax+ecx],'9'+1
2236
	cmp	byte [eax+ecx],'9'+1
2381
	jb	counter_ok
2237
	jb	counter_ok
2382
	jne	letter_digit
2238
	jne	letter_digit
2383
	mov	byte [eax+ecx],'A'
2239
	mov	byte [eax+ecx],'A'
2384
	jmp	counter_ok
2240
	jmp	counter_ok
2385
      letter_digit:
2241
      letter_digit:
2386
	cmp	byte [eax+ecx],'Z'+1
2242
	cmp	byte [eax+ecx],'Z'+1
2387
	jb	counter_ok
2243
	jb	counter_ok
2388
	jne	small_letter_digit
2244
	jne	small_letter_digit
2389
	mov	byte [eax+ecx],'a'
2245
	mov	byte [eax+ecx],'a'
2390
	jmp	counter_ok
2246
	jmp	counter_ok
2391
      small_letter_digit:
2247
      small_letter_digit:
2392
	cmp	byte [eax+ecx],'z'+1
2248
	cmp	byte [eax+ecx],'z'+1
2393
	jb	counter_ok
2249
	jb	counter_ok
2394
	mov	byte [eax+ecx],'0'
2250
	mov	byte [eax+ecx],'0'
2395
	loop	counter_loop
2251
	loop	counter_loop
2396
	inc	byte [eax]
2252
	inc	byte [eax]
2397
	movzx	ecx,byte [eax]
2253
	movzx	ecx,byte [eax]
2398
	mov	byte [eax+ecx],'0'
2254
	mov	byte [eax+ecx],'0'
2399
      counter_ok:
2255
      counter_ok:
2400
	pop	ecx
2256
	pop	ecx
2401
	lods	byte [esi]
2257
	lods	byte [esi]
2402
	cmp	al,'}'
2258
	cmp	al,'}'
2403
	je	macro_block_processed
2259
	je	macro_block_processed
2404
	or	al,al
2260
	or	al,al
2405
	jz	process_next_line
2261
	jz	process_next_line
2406
	cmp	al,','
2262
	cmp	al,','
2407
	jne	extra_characters_on_line
2263
	jne	extra_characters_on_line
2408
	dec	edi
2264
	dec	edi
2409
	lods	byte [esi]
2265
	lods	byte [esi]
2410
	cmp	al,1Ah
2266
	cmp	al,1Ah
2411
	je	make_local_symbol
2267
	je	make_local_symbol
2412
	jmp	invalid_argument
2268
	jmp	invalid_argument
2413
common_block:
2269
common_block:
2414
	call	close_macro_block
2270
	call	close_macro_block
2415
	jc	process_macro_line
2271
	jc	process_macro_line
2416
	mov	[counter],0
2272
	mov	[counter],0
2417
	jmp	new_macro_block
2273
	jmp	new_macro_block
2418
forward_block:
2274
forward_block:
2419
	cmp	[counter_limit],0
2275
	cmp	[counter_limit],0
2420
	je	common_block
2276
	je	common_block
2421
	call	close_macro_block
2277
	call	close_macro_block
2422
	jc	process_macro_line
2278
	jc	process_macro_line
2423
	mov	[counter],1
2279
	mov	[counter],1
2424
	jmp	new_macro_block
2280
	jmp	new_macro_block
2425
reverse_block:
2281
reverse_block:
2426
	cmp	[counter_limit],0
2282
	cmp	[counter_limit],0
2427
	je	common_block
2283
	je	common_block
2428
	call	close_macro_block
2284
	call	close_macro_block
2429
	jc	process_macro_line
2285
	jc	process_macro_line
2430
	mov	eax,[counter_limit]
2286
	mov	eax,[counter_limit]
2431
	or	eax,80000000h
2287
	or	eax,80000000h
2432
	mov	[counter],eax
2288
	mov	[counter],eax
2433
      new_macro_block:
2289
      new_macro_block:
2434
	mov	[macro_block],esi
2290
	mov	[macro_block],esi
2435
	mov	eax,[macro_line]
2291
	mov	eax,[macro_line]
2436
	mov	[macro_block_line],eax
2292
	mov	[macro_block_line],eax
2437
	mov	[macro_block_line_number],ecx
2293
	mov	[macro_block_line_number],ecx
2438
	jmp	process_macro_line
2294
	jmp	process_macro_line
2439
close_macro_block:
2295
close_macro_block:
2440
	cmp	[counter],0
2296
	cmp	[counter],0
2441
	je	block_closed
2297
	je	block_closed
2442
	jl	reverse_counter
2298
	jl	reverse_counter
2443
	mov	eax,[counter]
2299
	mov	eax,[counter]
2444
	cmp	eax,[counter_limit]
2300
	cmp	eax,[counter_limit]
2445
	je	block_closed
2301
	je	block_closed
2446
	inc	[counter]
2302
	inc	[counter]
2447
	jmp	continue_block
2303
	jmp	continue_block
2448
      reverse_counter:
2304
      reverse_counter:
2449
	mov	eax,[counter]
2305
	mov	eax,[counter]
2450
	dec	eax
2306
	dec	eax
2451
	cmp	eax,80000000h
2307
	cmp	eax,80000000h
2452
	je	block_closed
2308
	je	block_closed
2453
	mov	[counter],eax
2309
	mov	[counter],eax
2454
      continue_block:
2310
      continue_block:
2455
	mov	esi,[macro_block]
2311
	mov	esi,[macro_block]
2456
	mov	eax,[macro_block_line]
2312
	mov	eax,[macro_block_line]
2457
	mov	[macro_line],eax
2313
	mov	[macro_line],eax
2458
	mov	ecx,[macro_block_line_number]
2314
	mov	ecx,[macro_block_line_number]
2459
	stc
2315
	stc
2460
	ret
2316
	ret
2461
      block_closed:
2317
      block_closed:
2462
	clc
2318
	clc
2463
	ret
2319
	ret
2464
get_macro_symbol:
2320
get_macro_symbol:
2465
	push	ecx
2321
	push	ecx
2466
	call	find_macro_symbol_leaf
2322
	call	find_macro_symbol_leaf
2467
	jc	macro_symbol_not_found
2323
	jc	macro_symbol_not_found
2468
	mov	edx,[ebx]
2324
	mov	edx,[ebx]
2469
	mov	ebx,esi
2325
	mov	ebx,esi
2470
      try_macro_symbol:
2326
      try_macro_symbol:
2471
	or	edx,edx
2327
	or	edx,edx
2472
	jz	macro_symbol_not_found
2328
	jz	macro_symbol_not_found
2473
	mov	ecx,[esp]
2329
	mov	ecx,[esp]
2474
	mov	edi,[edx+4]
2330
	mov	edi,[edx+4]
2475
	repe	cmps byte [esi],[edi]
2331
	repe	cmps byte [esi],[edi]
2476
	je	macro_symbol_found
2332
	je	macro_symbol_found
2477
	mov	esi,ebx
2333
	mov	esi,ebx
2478
	mov	edx,[edx]
2334
	mov	edx,[edx]
2479
	jmp	try_macro_symbol
2335
	jmp	try_macro_symbol
2480
      macro_symbol_found:
2336
      macro_symbol_found:
2481
	pop	ecx
2337
	pop	ecx
2482
	clc
2338
	clc
2483
	ret
2339
	ret
2484
      macro_symbol_not_found:
2340
      macro_symbol_not_found:
2485
	pop	ecx
2341
	pop	ecx
2486
	stc
2342
	stc
2487
	ret
2343
	ret
2488
      find_macro_symbol_leaf:
2344
      find_macro_symbol_leaf:
2489
	shl	eax,8
2345
	shl	eax,8
2490
	mov	al,cl
2346
	mov	al,cl
2491
	mov	ebp,eax
2347
	mov	ebp,eax
2492
	mov	ebx,macro_symbols
2348
	mov	ebx,macro_symbols
2493
      follow_macro_symbols_tree:
2349
      follow_macro_symbols_tree:
2494
	mov	edx,[ebx]
2350
	mov	edx,[ebx]
2495
	or	edx,edx
2351
	or	edx,edx
2496
	jz	no_such_macro_symbol
2352
	jz	no_such_macro_symbol
2497
	xor	eax,eax
2353
	xor	eax,eax
2498
	shr	ebp,1
2354
	shr	ebp,1
2499
	adc	eax,0
2355
	adc	eax,0
2500
	lea	ebx,[edx+eax*4]
2356
	lea	ebx,[edx+eax*4]
2501
	or	ebp,ebp
2357
	or	ebp,ebp
2502
	jnz	follow_macro_symbols_tree
2358
	jnz	follow_macro_symbols_tree
2503
	add	ebx,8
2359
	add	ebx,8
2504
	clc
2360
	clc
2505
	ret
2361
	ret
2506
      no_such_macro_symbol:
2362
      no_such_macro_symbol:
2507
	stc
2363
	stc
2508
	ret
2364
	ret
2509
add_macro_symbol:
2365
add_macro_symbol:
2510
	push	ebx ebp
2366
	push	ebx ebp
2511
	call	find_macro_symbol_leaf
2367
	call	find_macro_symbol_leaf
2512
	jc	extend_macro_symbol_tree
2368
	jc	extend_macro_symbol_tree
2513
	mov	eax,[ebx]
2369
	mov	eax,[ebx]
2514
      make_macro_symbol:
2370
      make_macro_symbol:
2515
	mov	edx,[free_additional_memory]
2371
	mov	edx,[free_additional_memory]
2516
	add	edx,16
2372
	add	edx,16
2517
	cmp	edx,[labels_list]
2373
	cmp	edx,[labels_list]
2518
	ja	out_of_memory
2374
	ja	out_of_memory
2519
	xchg	edx,[free_additional_memory]
2375
	xchg	edx,[free_additional_memory]
2520
	mov	[ebx],edx
2376
	mov	[ebx],edx
2521
	mov	[edx],eax
2377
	mov	[edx],eax
2522
	mov	[edx+4],esi
2378
	mov	[edx+4],esi
2523
	pop	ebp ebx
2379
	pop	ebp ebx
2524
	ret
2380
	ret
2525
      extend_macro_symbol_tree:
2381
      extend_macro_symbol_tree:
2526
	mov	edx,[free_additional_memory]
2382
	mov	edx,[free_additional_memory]
2527
	add	edx,16
2383
	add	edx,16
2528
	cmp	edx,[labels_list]
2384
	cmp	edx,[labels_list]
2529
	ja	out_of_memory
2385
	ja	out_of_memory
2530
	xchg	edx,[free_additional_memory]
2386
	xchg	edx,[free_additional_memory]
2531
	xor	eax,eax
2387
	xor	eax,eax
2532
	mov	[edx],eax
2388
	mov	[edx],eax
2533
	mov	[edx+4],eax
2389
	mov	[edx+4],eax
2534
	mov	[edx+8],eax
2390
	mov	[edx+8],eax
2535
	mov	[edx+12],eax
2391
	mov	[edx+12],eax
2536
	shr	ebp,1
2392
	shr	ebp,1
2537
	adc	eax,0
2393
	adc	eax,0
2538
	mov	[ebx],edx
2394
	mov	[ebx],edx
2539
	lea	ebx,[edx+eax*4]
2395
	lea	ebx,[edx+eax*4]
2540
	or	ebp,ebp
2396
	or	ebp,ebp
2541
	jnz	extend_macro_symbol_tree
2397
	jnz	extend_macro_symbol_tree
2542
	add	ebx,8
2398
	add	ebx,8
2543
	xor	eax,eax
2399
	xor	eax,eax
2544
	jmp	make_macro_symbol
2400
	jmp	make_macro_symbol
2545
 
2401
 
2546
include_file:
2402
include_file:
2547
	lods	byte [esi]
2403
	lods	byte [esi]
2548
	cmp	al,22h
2404
	cmp	al,22h
2549
	jne	invalid_argument
2405
	jne	invalid_argument
2550
	lods	dword [esi]
2406
	lods	dword [esi]
2551
	cmp	byte [esi+eax],0
2407
	cmp	byte [esi+eax],0
2552
	jne	extra_characters_on_line
2408
	jne	extra_characters_on_line
2553
	push	esi
2409
	push	esi
2554
	push	edi
2410
	push	edi
2555
	mov	ebx,[current_line]
2411
	mov	ebx,[current_line]
2556
      find_current_file_path:
2412
      find_current_file_path:
2557
	mov	esi,[ebx]
2413
	mov	esi,[ebx]
2558
	test	byte [ebx+7],80h
2414
	test	byte [ebx+7],80h
2559
	jz	copy_current_file_path
2415
	jz	copy_current_file_path
2560
	mov	ebx,[ebx+8]
2416
	mov	ebx,[ebx+8]
2561
	jmp	find_current_file_path
2417
	jmp	find_current_file_path
2562
      copy_current_file_path:
2418
      copy_current_file_path:
2563
	lods	byte [esi]
2419
	lods	byte [esi]
2564
	stos	byte [edi]
2420
	stos	byte [edi]
2565
	or	al,al
2421
	or	al,al
2566
	jnz	copy_current_file_path
2422
	jnz	copy_current_file_path
2567
      cut_current_file_name:
2423
      cut_current_file_name:
2568
	cmp	edi,[esp]
2424
	cmp	edi,[esp]
2569
	je	current_file_path_ok
2425
	je	current_file_path_ok
2570
	cmp	byte [edi-1],'\'
2426
	cmp	byte [edi-1],'\'
2571
	je	current_file_path_ok
2427
	je	current_file_path_ok
2572
	cmp	byte [edi-1],'/'
2428
	cmp	byte [edi-1],'/'
2573
	je	current_file_path_ok
2429
	je	current_file_path_ok
2574
	dec	edi
2430
	dec	edi
2575
	jmp	cut_current_file_name
2431
	jmp	cut_current_file_name
2576
      current_file_path_ok:
2432
      current_file_path_ok:
2577
	mov	esi,[esp+4]
2433
	mov	esi,[esp+4]
2578
	call	preprocess_path
2434
	call	preprocess_path
2579
	pop	edx
2435
	pop	edx
2580
	mov	esi,edx
2436
	mov	esi,edx
2581
	call	open
2437
	call	open
2582
	jnc	include_path_ok
2438
	jnc	include_path_ok
2583
	mov	ebp,[include_paths]
2439
	mov	ebp,[include_paths]
2584
      try_include_directories:
2440
      try_include_directories:
2585
	mov	edi,esi
2441
	mov	edi,esi
2586
	mov	esi,ebp
2442
	mov	esi,ebp
2587
	cmp	byte [esi],0
2443
	cmp	byte [esi],0
2588
	je	try_in_current_directory
2444
	je	try_in_current_directory
2589
	push	ebp
2445
	push	ebp
2590
	push	edi
2446
	push	edi
2591
      copy_include_directory:
2447
      copy_include_directory:
2592
	lods	byte [esi]
2448
	lods	byte [esi]
2593
	cmp	al,';'
2449
	cmp	al,';'
2594
	je	include_directory_ok
2450
	je	include_directory_ok
2595
	stos	byte [edi]
2451
	stos	byte [edi]
2596
	or	al,al
2452
	or	al,al
2597
	jnz	copy_include_directory
2453
	jnz	copy_include_directory
2598
	dec	esi
2454
	dec	esi
2599
	dec	edi
2455
	dec	edi
2600
      include_directory_ok:
2456
      include_directory_ok:
2601
	cmp	byte [edi-1],'/'
2457
	cmp	byte [edi-1],'/'
2602
	je	path_separator_ok
2458
	je	path_separator_ok
2603
	cmp	byte [edi-1],'\'
2459
	cmp	byte [edi-1],'\'
2604
	je	path_separator_ok
2460
	je	path_separator_ok
2605
	mov	al,'/'
2461
	mov	al,'/'
2606
	stos	byte [edi]
2462
	stos	byte [edi]
2607
      path_separator_ok:
2463
      path_separator_ok:
2608
	mov	[esp+4],esi
2464
	mov	[esp+4],esi
2609
	mov	esi,[esp+8]
2465
	mov	esi,[esp+8]
2610
	call	preprocess_path
2466
	call	preprocess_path
2611
	pop	edx
2467
	pop	edx
2612
	mov	esi,edx
2468
	mov	esi,edx
2613
	call	open
2469
	call	open
2614
	pop	ebp
2470
	pop	ebp
2615
	jnc	include_path_ok
2471
	jnc	include_path_ok
2616
	jmp	try_include_directories
2472
	jmp	try_include_directories
2617
	mov	edi,esi
2473
	mov	edi,esi
2618
      try_in_current_directory:
2474
      try_in_current_directory:
2619
	mov	esi,[esp]
2475
	mov	esi,[esp]
2620
	push	edi
2476
	push	edi
2621
	call	preprocess_path
2477
	call	preprocess_path
2622
	pop	edx
2478
	pop	edx
2623
	mov	esi,edx
2479
	mov	esi,edx
2624
	call	open
2480
	call	open
2625
	jc	file_not_found
2481
	jc	file_not_found
2626
      include_path_ok:
2482
      include_path_ok:
2627
	mov	edi,[esp]
2483
	mov	edi,[esp]
2628
      copy_preprocessed_path:
2484
      copy_preprocessed_path:
2629
	lods	byte [esi]
2485
	lods	byte [esi]
2630
	stos	byte [edi]
2486
	stos	byte [edi]
2631
	or	al,al
2487
	or	al,al
2632
	jnz	copy_preprocessed_path
2488
	jnz	copy_preprocessed_path
2633
	pop	esi
2489
	pop	esi
2634
	lea	ecx,[edi-1]
2490
	lea	ecx,[edi-1]
2635
	sub	ecx,esi
2491
	sub	ecx,esi
2636
	mov	[esi-4],ecx
2492
	mov	[esi-4],ecx
2637
	push	dword [macro_status]
2493
	push	dword [macro_status]
2638
	and	[macro_status],0Fh
2494
	and	[macro_status],0Fh
2639
	call	preprocess_file
2495
	call	preprocess_file
2640
	pop	eax
2496
	pop	eax
2641
	mov	[macro_status],al
2497
	mov	[macro_status],al
2642
	jmp	line_preprocessed
2498
	jmp	line_preprocessed
2643
      preprocess_path:
2499
      preprocess_path:
2644
	lods	byte [esi]
2500
	lods	byte [esi]
2645
	cmp	al,'%'
2501
	cmp	al,'%'
2646
	je	environment_variable
2502
	je	environment_variable
2647
	stos	byte [edi]
2503
	stos	byte [edi]
2648
	or	al,al
2504
	or	al,al
2649
	jnz	preprocess_path
2505
	jnz	preprocess_path
2650
	cmp	edi,[memory_end]
2506
	cmp	edi,[memory_end]
2651
	ja	out_of_memory
2507
	ja	out_of_memory
2652
	ret
2508
	ret
2653
      environment_variable:
2509
      environment_variable:
2654
	mov	ebx,esi
2510
	mov	ebx,esi
2655
      find_variable_end:
2511
      find_variable_end:
2656
	lods	byte [esi]
2512
	lods	byte [esi]
2657
	or	al,al
2513
	or	al,al
2658
	jz	not_environment_variable
2514
	jz	not_environment_variable
2659
	cmp	al,'%'
2515
	cmp	al,'%'
2660
	jne	find_variable_end
2516
	jne	find_variable_end
2661
	mov	byte [esi-1],0
2517
	mov	byte [esi-1],0
2662
	push	esi
2518
	push	esi
2663
	mov	esi,ebx
2519
	mov	esi,ebx
2664
	call	get_environment_variable
2520
	call	get_environment_variable
2665
	pop	esi
2521
	pop	esi
2666
	mov	byte [esi-1],'%'
2522
	mov	byte [esi-1],'%'
2667
	jmp	preprocess_path
2523
	jmp	preprocess_path
2668
      not_environment_variable:
2524
      not_environment_variable:
2669
	mov	al,'%'
2525
	mov	al,'%'
2670
	stos	byte [edi]
2526
	stos	byte [edi]
2671
	mov	esi,ebx
2527
	mov	esi,ebx
2672
	jmp	preprocess_path
2528
	jmp	preprocess_path
2673
>
2529
>
2674
>
2530
>
2675
>
2531
>