Subversion Repositories Kolibri OS

Rev

Rev 7836 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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