Subversion Repositories Kolibri OS

Rev

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

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