Subversion Repositories Kolibri OS

Rev

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

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