Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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