Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1189 heavyiron 1
 
2
; Copyright (c) 1999-2009, Tomasz Grysztar.
3
; All rights reserved.
4
5
 
6
	push	ebp
7
	call	get_fp_value
8
	jnc	fp_expression
9
	mov	[current_offset],esp
10
      expression_loop:
11
	push	edi
12
	mov	edi,single_operand_operators
13
	call	get_operator
14
	pop	edi
15
	or	al,al
16
	jz	expression_element
17
	push	eax
18
	jmp	expression_loop
19
      expression_element:
20
	mov	al,[esi]
21
	cmp	al,1Ah
22
	je	expression_number
23
	cmp	al,22h
24
	je	expression_number
25
	cmp	al,'('
26
	je	expression_number
27
	mov	al,'!'
28
	stos	byte [edi]
29
	jmp	expression_operator
30
      expression_number:
31
	call	convert_number
32
      expression_operator:
33
	push	edi
34
	mov	edi,operators
35
	call	get_operator
36
	pop	edi
37
	or	al,al
38
	jz	expression_end
39
      operators_loop:
40
	cmp	esp,[current_offset]
41
	je	push_operator
42
	mov	bl,al
43
	and	bl,0F0h
44
	mov	bh,byte [esp]
45
	and	bh,0F0h
46
	cmp	bl,bh
47
	ja	push_operator
48
	pop	ebx
49
	mov	byte [edi],bl
50
	inc	edi
51
	jmp	operators_loop
52
      push_operator:
53
	push	eax
54
	jmp	expression_loop
55
      expression_end:
56
	cmp	esp,[current_offset]
57
	je	expression_converted
58
	pop	eax
59
	stos	byte [edi]
60
	jmp	expression_end
61
      expression_converted:
62
	pop	ebp
63
	ret
64
      fp_expression:
65
	mov	al,'.'
66
	stos	byte [edi]
67
	mov	eax,[fp_value]
68
	stos	dword [edi]
69
	mov	eax,[fp_value+4]
70
	stos	dword [edi]
71
	mov	eax,[fp_value+8]
72
	stos	dword [edi]
73
	pop	ebp
74
	ret
75
76
 
77
	lea	eax,[edi-10h]
78
	cmp	eax,[labels_list]
79
	jae	out_of_memory
80
	cmp	byte [esi],'('
81
	je	expression_value
82
	inc	edi
83
	call	get_number
84
	jc	symbol_value
85
	or	ebp,ebp
86
	jz	valid_number
87
	mov	byte [edi-1],0Fh
88
	ret
89
      valid_number:
90
	cmp	dword [edi+4],0
91
	jne	qword_number
92
	cmp	word [edi+2],0
93
	jne	dword_number
94
	cmp	byte [edi+1],0
95
	jne	word_number
96
      byte_number:
97
	mov	byte [edi-1],1
98
	inc	edi
99
	ret
100
      qword_number:
101
	mov	byte [edi-1],8
102
	add	edi,8
103
	ret
104
      dword_number:
105
	mov	byte [edi-1],4
106
	scas	dword [edi]
107
	ret
108
      word_number:
109
	mov	byte [edi-1],2
110
	scas	word [edi]
111
	ret
112
      expression_value:
113
	mov	eax,esp
114
	sub	eax,100h
115
	jc	stack_overflow
116
	cmp	eax,[stack_limit]
117
	jb	stack_overflow
118
	inc	esi
119
	push	[current_offset]
120
	call	convert_expression
121
	pop	[current_offset]
122
	lods	byte [esi]
123
	cmp	al,')'
124
	jne	invalid_expression
125
	ret
126
      symbol_value:
127
	push	edi
128
	mov	edi,address_registers
129
	call	get_operator
130
	or	al,al
131
	jnz	register_value
132
	mov	edi,directive_operators
133
	call	get_operator
134
	pop	edi
135
	or	al,al
136
	jnz	broken_value
137
	lods	byte [esi]
138
	cmp	al,1Ah
139
	jne	invalid_value
140
	lods	byte [esi]
141
	movzx	ecx,al
142
	call	get_label_id
143
      store_label_value:
144
	mov	byte [edi-1],11h
145
	stos	dword [edi]
146
	ret
147
      broken_value:
148
	mov	eax,0Fh
149
	jmp	store_label_value
150
      register_value:
151
	pop	edi
152
	mov	byte [edi-1],10h
153
	stos	byte [edi]
154
	ret
155
156
 
157
	xor	ebp,ebp
158
	lods	byte [esi]
159
	cmp	al,22h
160
	je	get_text_number
161
	cmp	al,1Ah
162
	jne	not_number
163
	lods	byte [esi]
164
	movzx	ecx,al
165
	mov	[number_start],esi
166
	mov	al,[esi]
167
	cmp	al,'$'
168
	je	number_begin
169
	sub	al,30h
170
	cmp	al,9
171
	ja	invalid_number
172
      number_begin:
173
	mov	ebx,esi
174
	add	esi,ecx
175
	push	esi
176
	dec	esi
177
	mov	dword [edi],0
178
	mov	dword [edi+4],0
179
	cmp	byte [ebx],'$'
180
	je	pascal_hex_number
181
	cmp	word [ebx],'0x'
182
	je	get_hex_number
183
	mov	al,[esi]
184
	dec	esi
185
	cmp	al,'h'
186
	je	get_hex_number
187
	cmp	al,'b'
188
	je	get_bin_number
189
	cmp	al,'d'
190
	je	get_dec_number
191
	cmp	al,'o'
192
	je	get_oct_number
193
	cmp	al,'H'
194
	je	get_hex_number
195
	cmp	al,'B'
196
	je	get_bin_number
197
	cmp	al,'D'
198
	je	get_dec_number
199
	cmp	al,'O'
200
	je	get_oct_number
201
	inc	esi
202
      get_dec_number:
203
	mov	ebx,esi
204
	mov	esi,[number_start]
205
      get_dec_digit:
206
	cmp	esi,ebx
207
	ja	number_ok
208
	cmp	byte [esi],27h
209
	je	next_dec_digit
210
	xor	edx,edx
211
	mov	eax,[edi]
212
	shld	edx,eax,2
213
	shl	eax,2
214
	add	eax,[edi]
215
	adc	edx,0
216
	add	eax,eax
217
	adc	edx,edx
218
	mov	[edi],eax
219
	mov	eax,[edi+4]
220
	add	eax,eax
221
	jc	dec_out_of_range
222
	add	eax,eax
223
	jc	dec_out_of_range
224
	add	eax,[edi+4]
225
	jc	dec_out_of_range
226
	add	eax,eax
227
	jc	dec_out_of_range
228
	add	eax,edx
229
	jc	dec_out_of_range
230
	mov	[edi+4],eax
231
	movzx	eax,byte [esi]
232
	sub	al,30h
233
	cmp	al,9
234
	ja	bad_number
235
	add	[edi],eax
236
	adc	dword [edi+4],0
237
	jc	dec_out_of_range
238
      next_dec_digit:
239
	inc	esi
240
	jmp	get_dec_digit
241
      dec_out_of_range:
242
	or	ebp,-1
243
	inc	esi
244
	jmp	get_dec_digit
245
      bad_number:
246
	pop	eax
247
      invalid_number:
248
	mov	esi,[number_start]
249
	dec	esi
250
      not_number:
251
	dec	esi
252
	stc
253
	ret
254
      get_bin_number:
255
	xor	bl,bl
256
      get_bin_digit:
257
	cmp	esi,[number_start]
258
	jb	number_ok
259
	movzx	eax,byte [esi]
260
	cmp	al,27h
261
	je	bin_digit_skip
262
	sub	al,30h
263
	cmp	al,1
264
	ja	bad_number
265
	xor	edx,edx
266
	mov	cl,bl
267
	dec	esi
268
	cmp	bl,64
269
	je	bin_out_of_range
270
	inc	bl
271
	cmp	cl,32
272
	jae	bin_digit_high
273
	shl	eax,cl
274
	or	dword [edi],eax
275
	jmp	get_bin_digit
276
      bin_digit_high:
277
	sub	cl,32
278
	shl	eax,cl
279
	or	dword [edi+4],eax
280
	jmp	get_bin_digit
281
      bin_out_of_range:
282
	or	al,al
283
	jz	get_bin_digit
284
	or	ebp,-1
285
	jmp	get_bin_digit
286
      bin_digit_skip:
287
	dec	esi
288
	jmp	get_bin_digit
289
      pascal_hex_number:
290
	cmp	cl,1
291
	je	bad_number
292
      get_hex_number:
293
	xor	bl,bl
294
      get_hex_digit:
295
	cmp	esi,[number_start]
296
	jb	number_ok
297
	movzx	eax,byte [esi]
298
	cmp	al,27h
299
	je	hex_digit_skip
300
	cmp	al,'x'
301
	je	hex_number_ok
302
	cmp	al,'$'
303
	je	pascal_hex_ok
304
	sub	al,30h
305
	cmp	al,9
306
	jbe	hex_digit_ok
307
	sub	al,7
308
	cmp	al,15
309
	jbe	hex_letter_digit_ok
310
	sub	al,20h
311
	cmp	al,15
312
	ja	bad_number
313
      hex_letter_digit_ok:
314
	cmp	al,10
315
	jb	bad_number
316
      hex_digit_ok:
317
	xor	edx,edx
318
	mov	cl,bl
319
	dec	esi
320
	cmp	bl,64
321
	je	hex_out_of_range
322
	add	bl,4
323
	cmp	cl,32
324
	jae	hex_digit_high
325
	shl	eax,cl
326
	or	dword [edi],eax
327
	jmp	get_hex_digit
328
      hex_digit_high:
329
	sub	cl,32
330
	shl	eax,cl
331
	or	dword [edi+4],eax
332
	jmp	get_hex_digit
333
      hex_out_of_range:
334
	or	al,al
335
	jz	get_hex_digit
336
	or	ebp,-1
337
	jmp	get_hex_digit
338
      hex_digit_skip:
339
	dec	esi
340
	jmp	get_hex_digit
341
      get_oct_number:
342
	xor	bl,bl
343
      get_oct_digit:
344
	cmp	esi,[number_start]
345
	jb	number_ok
346
	movzx	eax,byte [esi]
347
	cmp	al,27h
348
	je	oct_digit_skip
349
	sub	al,30h
350
	cmp	al,7
351
	ja	bad_number
352
      oct_digit_ok:
353
	xor	edx,edx
354
	mov	cl,bl
355
	dec	esi
356
	cmp	bl,64
357
	jae	oct_out_of_range
358
	add	bl,3
359
	cmp	cl,30
360
	je	oct_digit_wrap
361
	ja	oct_digit_high
362
	shl	eax,cl
363
	or	dword [edi],eax
364
	jmp	get_oct_digit
365
      oct_digit_wrap:
366
	shl	eax,cl
367
	adc	dword [edi+4],0
368
	or	dword [edi],eax
369
	jmp	get_oct_digit
370
      oct_digit_high:
371
	sub	cl,32
372
	shl	eax,cl
373
	or	dword [edi+4],eax
374
	jmp	get_oct_digit
375
      oct_digit_skip:
376
	dec	esi
377
	jmp	get_oct_digit
378
      oct_out_of_range:
379
	or	al,al
380
	jz	get_oct_digit
381
	or	ebp,-1
382
	jmp	get_oct_digit
383
      hex_number_ok:
384
	dec	esi
385
      pascal_hex_ok:
386
	cmp	esi,[number_start]
387
	jne	bad_number
388
      number_ok:
389
	pop	esi
390
      number_done:
391
	clc
392
	ret
393
      get_text_number:
394
	lods	dword [esi]
395
	mov	edx,eax
396
	xor	bl,bl
397
	mov	dword [edi],0
398
	mov	dword [edi+4],0
399
      get_text_character:
400
	sub	edx,1
401
	jc	number_done
402
	movzx	eax,byte [esi]
403
	inc	esi
404
	mov	cl,bl
405
	cmp	bl,64
406
	je	text_out_of_range
407
	add	bl,8
408
	cmp	cl,32
409
	jae	text_character_high
410
	shl	eax,cl
411
	or	dword [edi],eax
412
	jmp	get_text_character
413
      text_character_high:
414
	sub	cl,32
415
	shl	eax,cl
416
	or	dword [edi+4],eax
417
	jmp	get_text_character
418
      text_out_of_range:
419
	or	ebp,-1
420
	jmp	get_text_character
421
422
 
423
	push	edi esi
424
	lods	byte [esi]
425
	cmp	al,1Ah
426
	je	fp_value_start
427
	cmp	al,'-'
428
	je	fp_sign_ok
429
	cmp	al,'+'
430
	jne	not_fp_value
431
      fp_sign_ok:
432
	lods	byte [esi]
433
	cmp	al,1Ah
434
	jne	not_fp_value
435
      fp_value_start:
436
	lods	byte [esi]
437
	movzx	ecx,al
438
	cmp	cl,1
439
	jbe	not_fp_value
440
	lea	edx,[esi+1]
441
	xor	ah,ah
442
      check_fp_value:
443
	lods	byte [esi]
444
	cmp	al,'.'
445
	je	fp_character_dot
446
	cmp	al,'E'
447
	je	fp_character_exp
448
	cmp	al,'e'
449
	je	fp_character_exp
450
	cmp	al,'F'
451
	je	fp_last_character
452
	cmp	al,'f'
453
	je	fp_last_character
454
      digit_expected:
455
	cmp	al,'0'
456
	jb	not_fp_value
457
	cmp	al,'9'
458
	ja	not_fp_value
459
	jmp	fp_character_ok
460
      fp_character_dot:
461
	cmp	esi,edx
462
	je	not_fp_value
463
	or	ah,ah
464
	jnz	not_fp_value
465
	or	ah,1
466
	lods	byte [esi]
467
	loop	digit_expected
468
      not_fp_value:
469
	pop	esi edi
470
	stc
471
	ret
472
      fp_last_character:
473
	cmp	cl,1
474
	jne	not_fp_value
475
	or	ah,4
476
	jmp	fp_character_ok
477
      fp_character_exp:
478
	cmp	esi,edx
479
	je	not_fp_value
480
	cmp	ah,1
481
	ja	not_fp_value
482
	or	ah,2
483
	cmp	ecx,1
484
	jne	fp_character_ok
485
	cmp	byte [esi],'+'
486
	je	fp_exp_sign
487
	cmp	byte [esi],'-'
488
	jne	fp_character_ok
489
      fp_exp_sign:
490
	inc	esi
491
	cmp	byte [esi],1Ah
492
	jne	not_fp_value
493
	inc	esi
494
	lods	byte [esi]
495
	movzx	ecx,al
496
	inc	ecx
497
      fp_character_ok:
498
	dec	ecx
499
	jnz	check_fp_value
500
	or	ah,ah
501
	jz	not_fp_value
502
	pop	esi
503
	lods	byte [esi]
504
	mov	[fp_sign],0
505
	cmp	al,1Ah
506
	je	fp_get
507
	inc	esi
508
	cmp	al,'+'
509
	je	fp_get
510
	mov	[fp_sign],1
511
      fp_get:
512
	lods	byte [esi]
513
	movzx	ecx,al
514
	xor	edx,edx
515
	mov	edi,fp_value
516
	mov	[edi],edx
517
	mov	[edi+4],edx
518
	mov	[edi+12],edx
519
	call	fp_optimize
520
	mov	[fp_format],0
521
	mov	al,[esi]
522
      fp_before_dot:
523
	lods	byte [esi]
524
	cmp	al,'.'
525
	je	fp_dot
526
	cmp	al,'E'
527
	je	fp_exponent
528
	cmp	al,'e'
529
	je	fp_exponent
530
	cmp	al,'F'
531
	je	fp_done
532
	cmp	al,'f'
533
	je	fp_done
534
	sub	al,30h
535
	mov	edi,fp_value+16
536
	xor	edx,edx
537
	mov	dword [edi+12],edx
538
	mov	dword [edi],edx
539
	mov	dword [edi+4],edx
540
	mov	[edi+7],al
541
	mov	dl,7
542
	mov	dword [edi+8],edx
543
	call	fp_optimize
544
	mov	edi,fp_value
545
	push	ecx
546
	mov	ecx,10
547
	call	fp_mul
548
	pop	ecx
549
	mov	ebx,fp_value+16
550
	call	fp_add
551
	loop	fp_before_dot
552
      fp_dot:
553
	mov	edi,fp_value+16
554
	xor	edx,edx
555
	mov	[edi],edx
556
	mov	[edi+4],edx
557
	mov	byte [edi+7],80h
558
	mov	[edi+8],edx
559
	mov	dword [edi+12],edx
560
	dec	ecx
561
	jz	fp_done
562
      fp_after_dot:
563
	lods	byte [esi]
564
	cmp	al,'E'
565
	je	fp_exponent
566
	cmp	al,'e'
567
	je	fp_exponent
568
	cmp	al,'F'
569
	je	fp_done
570
	cmp	al,'f'
571
	je	fp_done
572
	inc	[fp_format]
573
	cmp	[fp_format],80h
574
	jne	fp_counter_ok
575
	mov	[fp_format],7Fh
576
      fp_counter_ok:
577
	dec	esi
578
	mov	edi,fp_value+16
579
	push	ecx
580
	mov	ecx,10
581
	call	fp_div
582
	push	dword [edi]
583
	push	dword [edi+4]
584
	push	dword [edi+8]
585
	push	dword [edi+12]
586
	lods	byte [esi]
587
	sub	al,30h
588
	movzx	ecx,al
589
	call	fp_mul
590
	mov	ebx,edi
591
	mov	edi,fp_value
592
	call	fp_add
593
	mov	edi,fp_value+16
594
	pop	dword [edi+12]
595
	pop	dword [edi+8]
596
	pop	dword [edi+4]
597
	pop	dword [edi]
598
	pop	ecx
599
	dec	ecx
600
	jnz	fp_after_dot
601
	jmp	fp_done
602
      fp_exponent:
603
	or	[fp_format],80h
604
	xor	edx,edx
605
	xor	ebp,ebp
606
	dec	ecx
607
	jnz	get_exponent
608
	cmp	byte [esi],'+'
609
	je	fp_exponent_sign
610
	cmp	byte [esi],'-'
611
	jne	fp_done
612
	not	ebp
613
      fp_exponent_sign:
614
	add	esi,2
615
	lods	byte [esi]
616
	movzx	ecx,al
617
      get_exponent:
618
	movzx	eax,byte [esi]
619
	inc	esi
620
	sub	al,30h
621
	cmp	al,10
622
	jae	exponent_ok
623
	imul	edx,10
624
	cmp	edx,8000h
625
	jae	value_out_of_range
626
	add	edx,eax
627
	loop	get_exponent
628
      exponent_ok:
629
	mov	edi,fp_value
630
	or	edx,edx
631
	jz	fp_done
632
	mov	ecx,edx
633
	or	ebp,ebp
634
	jnz	fp_negative_power
635
      fp_power:
636
	push	ecx
637
	mov	ecx,10
638
	call	fp_mul
639
	pop	ecx
640
	loop	fp_power
641
	jmp	fp_done
642
      fp_negative_power:
643
	push	ecx
644
	mov	ecx,10
645
	call	fp_div
646
	pop	ecx
647
	loop	fp_negative_power
648
      fp_done:
649
	mov	edi,fp_value
650
	mov	al,[fp_format]
651
	mov	[edi+10],al
652
	mov	al,[fp_sign]
653
	mov	[edi+11],al
654
	test	byte [edi+15],80h
655
	jz	fp_ok
656
	add	dword [edi],1
657
	adc	dword [edi+4],0
658
	jnc	fp_ok
659
	mov	eax,[edi+4]
660
	shrd	[edi],eax,1
661
	shr	eax,1
662
	or	eax,80000000h
663
	mov	[edi+4],eax
664
	inc	word [edi+8]
665
      fp_ok:
666
	pop	edi
667
	clc
668
	ret
669
      fp_mul:
670
	or	ecx,ecx
671
	jz	fp_zero
672
	mov	eax,[edi+12]
673
	mul	ecx
674
	mov	[edi+12],eax
675
	mov	ebx,edx
676
	mov	eax,[edi]
677
	mul	ecx
678
	add	eax,ebx
679
	adc	edx,0
680
	mov	[edi],eax
681
	mov	ebx,edx
682
	mov	eax,[edi+4]
683
	mul	ecx
684
	add	eax,ebx
685
	adc	edx,0
686
	mov	[edi+4],eax
687
      .loop:
688
	or	edx,edx
689
	jz	.done
690
	mov	eax,[edi]
691
	shrd	[edi+12],eax,1
692
	mov	eax,[edi+4]
693
	shrd	[edi],eax,1
694
	shrd	eax,edx,1
695
	mov	[edi+4],eax
696
	shr	edx,1
697
	inc	dword [edi+8]
698
	cmp	dword [edi+8],8000h
699
	jge	value_out_of_range
700
	jmp	.loop
701
      .done:
702
	ret
703
      fp_div:
704
	mov	eax,[edi+4]
705
	xor	edx,edx
706
	div	ecx
707
	mov	[edi+4],eax
708
	mov	eax,[edi]
709
	div	ecx
710
	mov	[edi],eax
711
	mov	eax,[edi+12]
712
	div	ecx
713
	mov	[edi+12],eax
714
	mov	ebx,eax
715
	or	ebx,[edi]
716
	or	ebx,[edi+4]
717
	jz	fp_zero
718
      .loop:
719
	test	byte [edi+7],80h
720
	jnz	.exp_ok
721
	mov	eax,[edi]
722
	shld	[edi+4],eax,1
723
	mov	eax,[edi+12]
724
	shld	[edi],eax,1
725
	add	eax,eax
726
	mov	[edi+12],eax
727
	dec	dword [edi+8]
728
	add	edx,edx
729
	jmp	.loop
730
      .exp_ok:
731
	mov	eax,edx
732
	xor	edx,edx
733
	div	ecx
734
	add	[edi+12],eax
735
	adc	dword [edi],0
736
	adc	dword [edi+4],0
737
	jnc	.done
738
	mov	eax,[edi+4]
739
	mov	ebx,[edi]
740
	shrd	[edi],eax,1
741
	shrd	[edi+12],ebx,1
742
	shr	eax,1
743
	or	eax,80000000h
744
	mov	[edi+4],eax
745
	inc	dword [edi+8]
746
      .done:
747
	ret
748
      fp_add:
749
	cmp	dword [ebx+8],8000h
750
	je	.done
751
	cmp	dword [edi+8],8000h
752
	je	.copy
753
	mov	eax,[ebx+8]
754
	cmp	eax,[edi+8]
755
	jge	.exp_ok
756
	mov	eax,[edi+8]
757
      .exp_ok:
758
	call	.change_exp
759
	xchg	ebx,edi
760
	call	.change_exp
761
	xchg	ebx,edi
762
	mov	edx,[ebx+12]
763
	mov	eax,[ebx]
764
	mov	ebx,[ebx+4]
765
	add	[edi+12],edx
766
	adc	[edi],eax
767
	adc	[edi+4],ebx
768
	jnc	.done
769
	mov	eax,[edi]
770
	shrd	[edi+12],eax,1
771
	mov	eax,[edi+4]
772
	shrd	[edi],eax,1
773
	shr	eax,1
774
	or	eax,80000000h
775
	mov	[edi+4],eax
776
	inc	dword [edi+8]
777
      .done:
778
	ret
779
      .copy:
780
	mov	eax,[ebx]
781
	mov	[edi],eax
782
	mov	eax,[ebx+4]
783
	mov	[edi+4],eax
784
	mov	eax,[ebx+8]
785
	mov	[edi+8],eax
786
	mov	eax,[ebx+12]
787
	mov	[edi+12],eax
788
	ret
789
      .change_exp:
790
	push	ecx
791
	mov	ecx,eax
792
	sub	ecx,[ebx+8]
793
	mov	edx,[ebx+4]
794
	jecxz	.exp_done
795
      .exp_loop:
796
	mov	ebp,[ebx]
797
	shrd	[ebx+12],ebp,1
798
	shrd	[ebx],edx,1
799
	shr	edx,1
800
	inc	dword [ebx+8]
801
	loop	.exp_loop
802
      .exp_done:
803
	mov	[ebx+4],edx
804
	pop	ecx
805
	ret
806
      fp_optimize:
807
	mov	eax,[edi]
808
	mov	ebp,[edi+4]
809
	or	ebp,[edi]
810
	or	ebp,[edi+12]
811
	jz	fp_zero
812
      .loop:
813
	test	byte [edi+7],80h
814
	jnz	.done
815
	shld	[edi+4],eax,1
816
	mov	ebp,[edi+12]
817
	shld	eax,ebp,1
818
	mov	[edi],eax
819
	shl	dword [edi+12],1
820
	dec	dword [edi+8]
821
	jmp	.loop
822
      .done:
823
	ret
824
      fp_zero:
825
	mov	dword [edi+8],8000h
826
	ret
827
828
 
829
	mov	[current_offset],edi
830
	mov	[value_undefined],0
831
	cmp	byte [esi],0
832
	je	get_string_value
833
	cmp	byte [esi],'.'
834
	je	convert_fp
835
      calculation_loop:
836
	lods	byte [esi]
837
	cmp	al,1
838
	je	get_byte_number
839
	cmp	al,2
840
	je	get_word_number
841
	cmp	al,4
842
	je	get_dword_number
843
	cmp	al,8
844
	je	get_qword_number
845
	cmp	al,0Fh
846
	je	value_out_of_range
847
	cmp	al,10h
848
	je	get_register
849
	cmp	al,11h
850
	je	get_label
851
	cmp	al,')'
852
	je	expression_calculated
853
	cmp	al,']'
854
	je	expression_calculated
855
	cmp	al,'!'
856
	je	invalid_expression
857
	sub	edi,14h
858
	mov	ebx,edi
859
	sub	ebx,14h
860
	cmp	al,0E0h
861
	je	calculate_rva
862
	cmp	al,0E1h
863
	je	calculate_plt
864
	cmp	al,0D0h
865
	je	calculate_not
866
	cmp	al,083h
867
	je	calculate_neg
868
	mov	dx,[ebx+8]
869
	or	dx,[edi+8]
870
	cmp	al,80h
871
	je	calculate_add
872
	cmp	al,81h
873
	je	calculate_sub
874
	mov	ah,[ebx+12]
875
	or	ah,[edi+12]
876
	jz	absolute_values_calculation
877
	cmp	[error_line],0
878
	jne	absolute_values_calculation
879
	mov	eax,[current_line]
880
	mov	[error_line],eax
881
	mov	[error],invalid_use_of_symbol
882
      absolute_values_calculation:
883
	cmp	al,90h
884
	je	calculate_mul
885
	cmp	al,91h
886
	je	calculate_div
887
	or	dx,dx
888
	jnz	invalid_expression
889
	cmp	al,0A0h
890
	je	calculate_mod
891
	cmp	al,0B0h
892
	je	calculate_and
893
	cmp	al,0B1h
894
	je	calculate_or
895
	cmp	al,0B2h
896
	je	calculate_xor
897
	cmp	al,0C0h
898
	je	calculate_shl
899
	cmp	al,0C1h
900
	je	calculate_shr
901
	jmp	invalid_expression
902
      expression_calculated:
903
	sub	edi,14h
904
	cmp	[value_undefined],0
905
	je	expression_value_ok
906
	xor	eax,eax
907
	mov	[edi],eax
908
	mov	[edi+4],eax
909
	mov	[edi+12],al
910
      expression_value_ok:
911
	ret
912
      get_byte_number:
913
	xor	eax,eax
914
	lods	byte [esi]
915
	stos	dword [edi]
916
	xor	al,al
917
	stos	dword [edi]
918
      got_number:
919
	mov	word [edi-8+8],0
920
	mov	byte [edi-8+12],0
921
	mov	dword [edi-8+16],0
922
	add	edi,0Ch
923
	jmp	calculation_loop
924
      get_word_number:
925
	xor	eax,eax
926
	lods	word [esi]
927
	stos	dword [edi]
928
	xor	ax,ax
929
	stos	dword [edi]
930
	jmp	got_number
931
      get_dword_number:
932
	movs	dword [edi],[esi]
933
	xor	eax,eax
934
	stos	dword [edi]
935
	jmp	got_number
936
      get_qword_number:
937
	movs	dword [edi],[esi]
938
	movs	dword [edi],[esi]
939
	jmp	got_number
940
      get_register:
941
	mov	byte [edi+9],0
942
	mov	byte [edi+12],0
943
	lods	byte [esi]
944
	mov	[edi+8],al
945
	mov	byte [edi+10],1
946
	xor	eax,eax
947
	mov	[edi+16],eax
948
	stos	dword [edi]
949
	stos	dword [edi]
950
	add	edi,0Ch
951
	jmp	calculation_loop
952
      get_label:
953
	xor	eax,eax
954
	mov	[edi+8],eax
955
	mov	[edi+12],al
956
	mov	[edi+20],eax
957
	lods	dword [esi]
958
	cmp	eax,0Fh
959
	jb	predefined_label
960
	je	reserved_word_used_as_symbol
961
	mov	ebx,eax
962
	mov	ax,[current_pass]
963
	mov	[ebx+18],ax
964
	or	byte [ebx+8],8
965
	test	byte [ebx+8],1
966
	jz	label_undefined
967
	cmp	ax,[ebx+16]
968
	je	label_defined
969
	test	byte [ebx+8],4
970
	jnz	label_out_of_scope
971
	test	byte [ebx+9],1
972
	jz	label_defined
973
	mov	eax,[ebx]
974
	sub	eax,dword [adjustment]
975
	stos	dword [edi]
976
	mov	eax,[ebx+4]
977
	sbb	eax,dword [adjustment+4]
978
	stos	dword [edi]
979
	mov	eax,dword [adjustment]
980
	or	eax,dword [adjustment+4]
981
	jz	got_label
982
	or	[next_pass_needed],-1
983
	jmp	got_label
984
      label_defined:
985
	mov	eax,[ebx]
986
	stos	dword [edi]
987
	mov	eax,[ebx+4]
988
	stos	dword [edi]
989
      got_label:
990
	mov	al,[ebx+11]
991
	mov	[edi-8+12],al
992
	mov	eax,[ebx+12]
993
	mov	[edi-8+8],eax
994
	mov	eax,[ebx+20]
995
	mov	[edi-8+16],eax
996
	add	edi,0Ch
997
	mov	al,[ebx+10]
998
	or	al,al
999
	jz	calculation_loop
1000
	cmp	[size_override],-1
1001
	je	calculation_loop
1002
	cmp	[size_override],0
1003
	je	check_size
1004
	cmp	[operand_size],0
1005
	jne	calculation_loop
1006
	mov	[operand_size],al
1007
	jmp	calculation_loop
1008
      check_size:
1009
	xchg	[operand_size],al
1010
	or	al,al
1011
	jz	calculation_loop
1012
	cmp	al,[operand_size]
1013
	jne	operand_sizes_do_not_match
1014
	jmp	calculation_loop
1015
      current_offset_label:
1016
	mov	eax,[current_offset]
1017
      make_current_offset_label:
1018
	xor	edx,edx
1019
	sub	eax,dword [org_origin]
1020
	sbb	edx,dword [org_origin+4]
1021
	stos	dword [edi]
1022
	mov	eax,edx
1023
	stos	dword [edi]
1024
	mov	eax,[org_registers]
1025
	stos	dword [edi]
1026
	mov	al,[labels_type]
1027
	mov	[edi-12+12],al
1028
	mov	eax,[org_symbol]
1029
	mov	[edi-12+16],eax
1030
	add	edi,8
1031
	jmp	calculation_loop
1032
      org_origin_label:
1033
	mov	eax,[org_start]
1034
	jmp	make_current_offset_label
1035
      counter_label:
1036
	mov	eax,[counter]
1037
      make_dword_label_value:
1038
	stos	dword [edi]
1039
	xor	eax,eax
1040
	stos	dword [edi]
1041
	add	edi,0Ch
1042
	jmp	calculation_loop
1043
      timestamp_label:
1044
	call	make_timestamp
1045
	jmp	make_dword_label_value
1046
      predefined_label:
1047
	or	eax,eax
1048
	jz	current_offset_label
1049
	cmp	eax,1
1050
	je	counter_label
1051
	cmp	eax,2
1052
	je	timestamp_label
1053
	cmp	eax,3
1054
	je	org_origin_label
1055
	mov	edx,invalid_value
1056
	jmp	error_undefined
1057
      label_out_of_scope:
1058
	mov	edx,symbol_out_of_scope
1059
	mov	eax,[ebx+24]
1060
	cmp	[error_line],0
1061
	jne	error_undefined
1062
	mov	[error_info],eax
1063
	jmp	error_undefined
1064
      label_undefined:
1065
	mov	edx,undefined_symbol
1066
	cmp	[error_line],0
1067
	jne	error_undefined
1068
	mov	eax,[ebx+24]
1069
	mov	[error_info],eax
1070
      error_undefined:
1071
	cmp	[current_pass],1
1072
	ja	undefined_value
1073
      force_next_pass:
1074
	or	[next_pass_needed],-1
1075
      undefined_value:
1076
	mov	byte [edi+12],0
1077
	or	[value_undefined],-1
1078
	xor	eax,eax
1079
	stos	dword [edi]
1080
	stos	dword [edi]
1081
	add	edi,0Ch
1082
	cmp	[error_line],0
1083
	jne	calculation_loop
1084
	mov	eax,[current_line]
1085
	mov	[error_line],eax
1086
	mov	[error],edx
1087
	jmp	calculation_loop
1088
      calculate_add:
1089
	mov	ecx,[ebx+16]
1090
	cmp	byte [edi+12],0
1091
	je	add_values
1092
	mov	ecx,[edi+16]
1093
	cmp	byte [ebx+12],0
1094
	je	add_values
1095
	cmp	[error_line],0
1096
	jne	add_values
1097
	mov	eax,[current_line]
1098
	mov	[error_line],eax
1099
	mov	[error],invalid_use_of_symbol
1100
      add_values:
1101
	mov	al,[edi+12]
1102
	or	[ebx+12],al
1103
	mov	[ebx+16],ecx
1104
	mov	eax,[edi]
1105
	add	[ebx],eax
1106
	mov	eax,[edi+4]
1107
	adc	[ebx+4],eax
1108
	or	dx,dx
1109
	jz	calculation_loop
1110
	push	esi
1111
	mov	esi,ebx
1112
	lea	ebx,[edi+10]
1113
	mov	cl,[edi+8]
1114
	call	add_register
1115
	lea	ebx,[edi+11]
1116
	mov	cl,[edi+9]
1117
	call	add_register
1118
	pop	esi
1119
	jmp	calculation_loop
1120
      add_register:
1121
	or	cl,cl
1122
	jz	add_register_done
1123
      add_register_start:
1124
	cmp	[esi+8],cl
1125
	jne	add_in_second_slot
1126
	mov	al,[ebx]
1127
	add	[esi+10],al
1128
	jnz	add_register_done
1129
	mov	byte [esi+8],0
1130
	ret
1131
      add_in_second_slot:
1132
	cmp	[esi+9],cl
1133
	jne	create_in_first_slot
1134
	mov	al,[ebx]
1135
	add	[esi+11],al
1136
	jnz	add_register_done
1137
	mov	byte [esi+9],0
1138
	ret
1139
      create_in_first_slot:
1140
	cmp	byte [esi+8],0
1141
	jne	create_in_second_slot
1142
	mov	[esi+8],cl
1143
	mov	al,[ebx]
1144
	mov	[esi+10],al
1145
	ret
1146
      create_in_second_slot:
1147
	cmp	byte [esi+9],0
1148
	jne	invalid_expression
1149
	mov	[esi+9],cl
1150
	mov	al,[ebx]
1151
	mov	[esi+11],al
1152
      add_register_done:
1153
	ret
1154
      calculate_sub:
1155
	xor	ah,ah
1156
	mov	ah,[ebx+12]
1157
	mov	al,[edi+12]
1158
	or	al,al
1159
	jz	sub_values
1160
	cmp	al,ah
1161
	jne	invalid_sub
1162
	xor	ah,ah
1163
	mov	ecx,[edi+16]
1164
	cmp	ecx,[ebx+16]
1165
	jne	invalid_sub
1166
      sub_values:
1167
	mov	[ebx+12],ah
1168
	mov	eax,[edi]
1169
	sub	[ebx],eax
1170
	mov	eax,[edi+4]
1171
	sbb	[ebx+4],eax
1172
	or	dx,dx
1173
	jz	calculation_loop
1174
	push	esi
1175
	mov	esi,ebx
1176
	lea	ebx,[edi+10]
1177
	mov	cl,[edi+8]
1178
	call	sub_register
1179
	lea	ebx,[edi+11]
1180
	mov	cl,[edi+9]
1181
	call	sub_register
1182
	pop	esi
1183
	jmp	calculation_loop
1184
      invalid_sub:
1185
	cmp	[error_line],0
1186
	jne	sub_values
1187
	mov	eax,[current_line]
1188
	mov	[error_line],eax
1189
	mov	[error],invalid_use_of_symbol
1190
	jmp	sub_values
1191
      sub_register:
1192
	or	cl,cl
1193
	jz	add_register_done
1194
	neg	byte [ebx]
1195
	jmp	add_register_start
1196
      calculate_mul:
1197
	or	dx,dx
1198
	jz	mul_start
1199
	cmp	word [ebx+8],0
1200
	jne	mul_start
1201
	mov	eax,[ebx]
1202
	xchg	eax,[edi]
1203
	mov	[ebx],eax
1204
	mov	eax,[ebx+4]
1205
	xchg	eax,[edi+4]
1206
	mov	[ebx+4],eax
1207
	mov	eax,[ebx+8]
1208
	xchg	eax,[edi+8]
1209
	mov	[ebx+8],eax
1210
	mov	eax,[ebx+12]
1211
	xchg	eax,[edi+12]
1212
	mov	[ebx+12],eax
1213
      mul_start:
1214
	push	esi edx
1215
	mov	esi,ebx
1216
	xor	bl,bl
1217
	bt	dword [esi+4],31
1218
	jnc	mul_first_sign_ok
1219
	not	dword [esi]
1220
	not	dword [esi+4]
1221
	add	dword [esi],1
1222
	adc	dword [esi+4],0
1223
	not	bl
1224
      mul_first_sign_ok:
1225
	bt	dword [edi+4],31
1226
	jnc	mul_second_sign_ok
1227
	not	dword [edi]
1228
	not	dword [edi+4]
1229
	add	dword [edi],1
1230
	adc	dword [edi+4],0
1231
	not	bl
1232
      mul_second_sign_ok:
1233
	cmp	dword [esi+4],0
1234
	jz	mul_numbers
1235
	cmp	dword [edi+4],0
1236
	jnz	value_out_of_range
1237
      mul_numbers:
1238
	mov	eax,[esi+4]
1239
	mul	dword [edi]
1240
	or	edx,edx
1241
	jnz	value_out_of_range
1242
	mov	ecx,eax
1243
	mov	eax,[esi]
1244
	mul	dword [edi+4]
1245
	or	edx,edx
1246
	jnz	value_out_of_range
1247
	add	ecx,eax
1248
	jc	value_out_of_range
1249
	mov	eax,[esi]
1250
	mul	dword [edi]
1251
	add	edx,ecx
1252
	jc	value_out_of_range
1253
	test	edx,1 shl 31
1254
	jnz	value_out_of_range
1255
	mov	[esi],eax
1256
	mov	[esi+4],edx
1257
	or	bl,bl
1258
	jz	mul_ok
1259
	not	dword [esi]
1260
	not	dword [esi+4]
1261
	add	dword [esi],1
1262
	adc	dword [esi+4],0
1263
      mul_ok:
1264
	pop	edx
1265
	or	dx,dx
1266
	jz	mul_calculated
1267
	cmp	word [edi+8],0
1268
	jne	invalid_value
1269
	cmp	byte [esi+8],0
1270
	je	mul_first_register_ok
1271
	mov	al,[edi]
1272
	cbw
1273
	cwde
1274
	cdq
1275
	cmp	edx,[edi+4]
1276
	jne	value_out_of_range
1277
	cmp	eax,[edi]
1278
	jne	value_out_of_range
1279
	imul	byte [esi+10]
1280
	mov	dl,ah
1281
	cbw
1282
	cmp	ah,dl
1283
	jne	value_out_of_range
1284
	mov	[esi+10],al
1285
	or	al,al
1286
	jnz	mul_first_register_ok
1287
	mov	[esi+8],al
1288
      mul_first_register_ok:
1289
	cmp	byte [esi+9],0
1290
	je	mul_calculated
1291
	mov	al,[edi]
1292
	cbw
1293
	cwde
1294
	cdq
1295
	cmp	edx,[edi+4]
1296
	jne	value_out_of_range
1297
	cmp	eax,[edi]
1298
	jne	value_out_of_range
1299
	imul	byte [esi+11]
1300
	mov	dl,ah
1301
	cbw
1302
	cmp	ah,dl
1303
	jne	value_out_of_range
1304
	mov	[esi+11],al
1305
	or	al,al
1306
	jnz	mul_calculated
1307
	mov	[esi+9],al
1308
      mul_calculated:
1309
	pop	esi
1310
	jmp	calculation_loop
1311
      calculate_div:
1312
	push	esi edx
1313
	mov	esi,ebx
1314
	call	div_64
1315
	pop	edx
1316
	or	dx,dx
1317
	jz	div_calculated
1318
	cmp	byte [esi+8],0
1319
	je	div_first_register_ok
1320
	mov	al,[edi]
1321
	cbw
1322
	cwde
1323
	cdq
1324
	cmp	edx,[edi+4]
1325
	jne	value_out_of_range
1326
	cmp	eax,[edi]
1327
	jne	value_out_of_range
1328
	or	al,al
1329
	jz	value_out_of_range
1330
	mov	al,[esi+10]
1331
	cbw
1332
	idiv	byte [edi]
1333
	or	ah,ah
1334
	jnz	invalid_use_of_symbol
1335
	mov	[esi+10],al
1336
      div_first_register_ok:
1337
	cmp	byte [esi+9],0
1338
	je	div_calculated
1339
	mov	al,[edi]
1340
	cbw
1341
	cwde
1342
	cdq
1343
	cmp	edx,[edi+4]
1344
	jne	value_out_of_range
1345
	cmp	eax,[edi]
1346
	jne	value_out_of_range
1347
	or	al,al
1348
	jz	value_out_of_range
1349
	mov	al,[esi+11]
1350
	cbw
1351
	idiv	byte [edi]
1352
	or	ah,ah
1353
	jnz	invalid_use_of_symbol
1354
	mov	[esi+11],al
1355
      div_calculated:
1356
	pop	esi
1357
	jmp	calculation_loop
1358
      calculate_mod:
1359
	push	esi
1360
	mov	esi,ebx
1361
	call	div_64
1362
	mov	[esi],eax
1363
	mov	[esi+4],edx
1364
	pop	esi
1365
	jmp	calculation_loop
1366
      calculate_and:
1367
	mov	eax,[edi]
1368
	and	[ebx],eax
1369
	mov	eax,[edi+4]
1370
	and	[ebx+4],eax
1371
	jmp	calculation_loop
1372
      calculate_or:
1373
	mov	eax,[edi]
1374
	or	[ebx],eax
1375
	mov	eax,[edi+4]
1376
	or	[ebx+4],eax
1377
	jmp	calculation_loop
1378
      calculate_xor:
1379
	mov	eax,[edi]
1380
	xor	[ebx],eax
1381
	mov	eax,[edi+4]
1382
	xor	[ebx+4],eax
1383
	jmp	calculation_loop
1384
      shr_negative:
1385
	not	dword [edi]
1386
	not	dword [edi+4]
1387
	add	dword [edi],1
1388
	adc	dword [edi+4],0
1389
      calculate_shl:
1390
	mov	eax,dword [edi+4]
1391
	bt	eax,31
1392
	jc	shl_negative
1393
	or	eax,eax
1394
	jnz	zero_value
1395
	mov	ecx,[edi]
1396
	cmp	ecx,64
1397
	jae	zero_value
1398
	cmp	ecx,32
1399
	jae	shl_high
1400
	mov	edx,[ebx+4]
1401
	mov	eax,[ebx]
1402
	shld	edx,eax,cl
1403
	shl	eax,cl
1404
	mov	[ebx],eax
1405
	mov	[ebx+4],edx
1406
	jmp	calculation_loop
1407
      shl_high:
1408
	sub	cl,32
1409
	mov	eax,[ebx]
1410
	shl	eax,cl
1411
	mov	[ebx+4],eax
1412
	mov	dword [ebx],0
1413
	jmp	calculation_loop
1414
      shl_negative:
1415
	not	dword [edi]
1416
	not	dword [edi+4]
1417
	add	dword [edi],1
1418
	adc	dword [edi+4],0
1419
      calculate_shr:
1420
	mov	eax,dword [edi+4]
1421
	bt	eax,31
1422
	jc	shr_negative
1423
	or	eax,eax
1424
	jnz	zero_value
1425
	mov	ecx,[edi]
1426
	cmp	ecx,64
1427
	jae	zero_value
1428
	cmp	ecx,32
1429
	jae	shr_high
1430
	mov	edx,[ebx+4]
1431
	mov	eax,[ebx]
1432
	shrd	eax,edx,cl
1433
	shr	edx,cl
1434
	mov	[ebx],eax
1435
	mov	[ebx+4],edx
1436
	jmp	calculation_loop
1437
      shr_high:
1438
	sub	cl,32
1439
	mov	eax,[ebx+4]
1440
	shr	eax,cl
1441
	mov	[ebx],eax
1442
	mov	dword [ebx+4],0
1443
	jmp	calculation_loop
1444
      zero_value:
1445
	mov	dword [ebx],0
1446
	mov	dword [ebx+4],0
1447
	jmp	calculation_loop
1448
      calculate_not:
1449
	cmp	word [edi+8],0
1450
	jne	invalid_expression
1451
	cmp	byte [edi+12],0
1452
	je	not_ok
1453
	cmp	[error_line],0
1454
	jne	not_ok
1455
	mov	eax,[current_line]
1456
	mov	[error_line],eax
1457
	mov	[error],invalid_use_of_symbol
1458
      not_ok:
1459
	cmp	[value_size],1
1460
	je	not_byte
1461
	cmp	[value_size],2
1462
	je	not_word
1463
	cmp	[value_size],4
1464
	je	not_dword
1465
	cmp	[value_size],6
1466
	je	not_pword
1467
      not_qword:
1468
	not	dword [edi]
1469
	not	dword [edi+4]
1470
	add	edi,14h
1471
	jmp	calculation_loop
1472
      not_byte:
1473
	cmp	dword [edi+4],0
1474
	jne	not_qword
1475
	cmp	word [edi+2],0
1476
	jne	not_qword
1477
	cmp	byte [edi+1],0
1478
	jne	not_qword
1479
	not	byte [edi]
1480
	add	edi,14h
1481
	jmp	calculation_loop
1482
      not_word:
1483
	cmp	dword [edi+4],0
1484
	jne	not_qword
1485
	cmp	word [edi+2],0
1486
	jne	not_qword
1487
	not	word [edi]
1488
	add	edi,14h
1489
	jmp	calculation_loop
1490
      not_dword:
1491
	cmp	dword [edi+4],0
1492
	jne	not_qword
1493
	not	dword [edi]
1494
	add	edi,14h
1495
	jmp	calculation_loop
1496
      not_pword:
1497
	cmp	word [edi+6],0
1498
	jne	not_qword
1499
	not	dword [edi]
1500
	not	word [edi+4]
1501
	add	edi,14h
1502
	jmp	calculation_loop
1503
      calculate_neg:
1504
	cmp	word [edi+8],0
1505
	jne	invalid_expression
1506
	cmp	byte [edi+12],0
1507
	je	neg_ok
1508
	cmp	[error_line],0
1509
	jne	neg_ok
1510
	mov	eax,[current_line]
1511
	mov	[error_line],eax
1512
	mov	[error],invalid_use_of_symbol
1513
      neg_ok:
1514
	mov	eax,[edi]
1515
	mov	edx,[edi+4]
1516
	mov	dword [edi],0
1517
	mov	dword [edi+4],0
1518
	sub	[edi],eax
1519
	sbb	[edi+4],edx
1520
	add	edi,14h
1521
	jmp	calculation_loop
1522
      calculate_rva:
1523
	cmp	word [edi+8],0
1524
	jne	invalid_expression
1525
	cmp	[output_format],5
1526
	je	calculate_gotoff
1527
	cmp	[output_format],4
1528
	je	calculate_coff_rva
1529
	cmp	[output_format],3
1530
	jne	invalid_expression
1531
	test	[format_flags],8
1532
	jnz	pe64_rva
1533
	mov	al,2
1534
	bt	[resolver_flags],0
1535
	jc	rva_type_ok
1536
	xor	al,al
1537
      rva_type_ok:
1538
	cmp	byte [edi+12],al
1539
	je	rva_ok
1540
	cmp	[error_line],0
1541
	jne	rva_ok
1542
	mov	eax,[current_line]
1543
	mov	[error_line],eax
1544
	mov	[error],invalid_use_of_symbol
1545
      rva_ok:
1546
	mov	byte [edi+12],0
1547
	mov	eax,[code_start]
1548
	mov	eax,[eax+34h]
1549
	cdq
1550
	sub	[edi],eax
1551
	sbb	[edi+4],edx
1552
	add	edi,14h
1553
	jmp	calculation_loop
1554
      pe64_rva:
1555
	mov	al,4
1556
	bt	[resolver_flags],0
1557
	jc	pe64_rva_type_ok
1558
	xor	al,al
1559
      pe64_rva_type_ok:
1560
	cmp	byte [edi+12],al
1561
	je	pe64_rva_ok
1562
	cmp	[error_line],0
1563
	jne	pe64_rva_ok
1564
	mov	eax,[current_line]
1565
	mov	[error_line],eax
1566
	mov	[error],invalid_use_of_symbol
1567
      pe64_rva_ok:
1568
	mov	byte [edi+12],0
1569
	mov	eax,[code_start]
1570
	mov	edx,[eax+34h]
1571
	mov	eax,[eax+30h]
1572
	sub	[edi],eax
1573
	sbb	[edi+4],edx
1574
	add	edi,14h
1575
	jmp	calculation_loop
1576
      calculate_gotoff:
1577
	test	[format_flags],8+1
1578
	jnz	invalid_expression
1579
      calculate_coff_rva:
1580
	mov	dl,5
1581
	cmp	byte [edi+12],2
1582
	je	change_value_type
1583
      incorrect_change_of_value_type:
1584
	cmp	[error_line],0
1585
	jne	change_value_type
1586
	mov	eax,[current_line]
1587
	mov	[error_line],eax
1588
	mov	[error],invalid_use_of_symbol
1589
      change_value_type:
1590
	mov	byte [edi+12],dl
1591
	add	edi,14h
1592
	jmp	calculation_loop
1593
      calculate_plt:
1594
	cmp	word [edi+8],0
1595
	jne	invalid_expression
1596
	cmp	[output_format],5
1597
	jne	invalid_expression
1598
	test	[format_flags],1
1599
	jnz	invalid_expression
1600
	mov	dl,6
1601
	mov	dh,2
1602
	test	[format_flags],8
1603
	jz	check_value_for_plt
1604
	mov	dh,4
1605
      check_value_for_plt:
1606
	mov	eax,[edi]
1607
	or	eax,[edi+4]
1608
	jnz	incorrect_change_of_value_type
1609
	cmp	byte [edi+12],dh
1610
	jne	incorrect_change_of_value_type
1611
	mov	eax,[edi+16]
1612
	cmp	byte [eax],80h
1613
	jne	incorrect_change_of_value_type
1614
	jmp	change_value_type
1615
      div_64:
1616
	xor	ebx,ebx
1617
	cmp	dword [edi],0
1618
	jne	divider_ok
1619
	cmp	dword [edi+4],0
1620
	jne	divider_ok
1621
	cmp	[next_pass_needed],0
1622
	je	value_out_of_range
1623
	jmp	div_done
1624
      divider_ok:
1625
	bt	dword [esi+4],31
1626
	jnc	div_first_sign_ok
1627
	not	dword [esi]
1628
	not	dword [esi+4]
1629
	add	dword [esi],1
1630
	adc	dword [esi+4],0
1631
	not	bx
1632
      div_first_sign_ok:
1633
	bt	dword [edi+4],31
1634
	jnc	div_second_sign_ok
1635
	not	dword [edi]
1636
	not	dword [edi+4]
1637
	add	dword [edi],1
1638
	adc	dword [edi+4],0
1639
	not	bl
1640
      div_second_sign_ok:
1641
	cmp	dword [edi+4],0
1642
	jne	div_high
1643
	mov	ecx,[edi]
1644
	mov	eax,[esi+4]
1645
	xor	edx,edx
1646
	div	ecx
1647
	mov	[esi+4],eax
1648
	mov	eax,[esi]
1649
	div	ecx
1650
	mov	[esi],eax
1651
	mov	eax,edx
1652
	xor	edx,edx
1653
	jmp	div_done
1654
      div_high:
1655
	mov	eax,[esi+4]
1656
	xor	edx,edx
1657
	div	dword [edi+4]
1658
	mov	ebx,[esi]
1659
	mov	[esi],eax
1660
	mov	dword [esi+4],0
1661
	mov	ecx,edx
1662
	mul	dword [edi]
1663
      div_high_loop:
1664
	cmp	ecx,edx
1665
	ja	div_high_done
1666
	jb	div_high_large_correction
1667
	cmp	ebx,eax
1668
	jae	div_high_done
1669
      div_high_correction:
1670
	dec	dword [esi]
1671
	sub	eax,[edi]
1672
	sbb	edx,[edi+4]
1673
	jnc	div_high_loop
1674
      div_high_done:
1675
	sub	ebx,eax
1676
	sbb	ecx,edx
1677
	mov	edx,ecx
1678
	mov	eax,ebx
1679
	ret
1680
      div_high_large_correction:
1681
	push	eax edx
1682
	mov	eax,edx
1683
	sub	eax,ecx
1684
	xor	edx,edx
1685
	div	dword [edi+4]
1686
	shr	eax,1
1687
	jz	div_high_small_correction
1688
	sub	[esi],eax
1689
	push	eax
1690
	mul	dword [edi+4]
1691
	sub	dword [esp+4],eax
1692
	pop	eax
1693
	mul	dword [edi]
1694
	sub	dword [esp+4],eax
1695
	sbb	dword [esp],edx
1696
	pop	edx eax
1697
	jmp	div_high_loop
1698
      div_high_small_correction:
1699
	pop	edx eax
1700
	jmp	div_high_correction
1701
      div_done:
1702
	or	bh,bh
1703
	jz	remainder_ok
1704
	not	eax
1705
	not	edx
1706
	add	eax,1
1707
	adc	edx,0
1708
      remainder_ok:
1709
	or	bl,bl
1710
	jz	div_ok
1711
	not	dword [esi]
1712
	not	dword [esi+4]
1713
	add	dword [esi],1
1714
	adc	dword [esi+4],0
1715
      div_ok:
1716
	ret
1717
      convert_fp:
1718
	inc	esi
1719
	mov	word [edi+8],0
1720
	mov	byte [edi+12],0
1721
	mov	al,[value_size]
1722
	cmp	al,4
1723
	je	convert_fp_dword
1724
	cmp	al,8
1725
	je	convert_fp_qword
1726
	jmp	invalid_value
1727
      convert_fp_dword:
1728
	xor	eax,eax
1729
	cmp	word [esi+8],8000h
1730
	je	fp_dword_store
1731
	mov	bx,[esi+8]
1732
	mov	eax,[esi+4]
1733
	shl	eax,1
1734
	shr	eax,9
1735
	jnc	fp_dword_ok
1736
	inc	eax
1737
	bt	eax,23
1738
	jnc	fp_dword_ok
1739
	and	eax,1 shl 23 - 1
1740
	inc	bx
1741
	shr	eax,1
1742
      fp_dword_ok:
1743
	add	bx,7Fh
1744
	cmp	bx,0FFh
1745
	jge	value_out_of_range
1746
	cmp	bx,0
1747
	jg	fp_dword_exp_ok
1748
	or	eax,1 shl 23
1749
	mov	cx,bx
1750
	neg	cx
1751
	inc	cx
1752
	cmp	cx,23
1753
	ja	value_out_of_range
1754
	xor	bx,bx
1755
	shr	eax,cl
1756
	jnc	fp_dword_exp_ok
1757
	inc	eax
1758
	test	eax,1 shl 23
1759
	jz	fp_dword_exp_ok
1760
	and	eax,1 shl 23 - 1
1761
	inc	bx
1762
      fp_dword_exp_ok:
1763
	shl	ebx,23
1764
	or	eax,ebx
1765
      fp_dword_store:
1766
	mov	bl,[esi+11]
1767
	shl	ebx,31
1768
	or	eax,ebx
1769
	mov	[edi],eax
1770
	xor	eax,eax
1771
	mov	[edi+4],eax
1772
	add	esi,13
1773
	ret
1774
      convert_fp_qword:
1775
	xor	eax,eax
1776
	xor	edx,edx
1777
	cmp	word [esi+8],8000h
1778
	je	fp_qword_store
1779
	mov	bx,[esi+8]
1780
	mov	eax,[esi]
1781
	mov	edx,[esi+4]
1782
	add	eax,eax
1783
	adc	edx,edx
1784
	mov	ecx,edx
1785
	shr	edx,12
1786
	shrd	eax,ecx,12
1787
	jnc	fp_qword_ok
1788
	add	eax,1
1789
	adc	edx,0
1790
	bt	edx,20
1791
	jnc	fp_qword_ok
1792
	and	edx,1 shl 20 - 1
1793
	inc	bx
1794
	shr	edx,1
1795
	rcr	eax,1
1796
      fp_qword_ok:
1797
	add	bx,3FFh
1798
	cmp	bx,7FFh
1799
	jge	value_out_of_range
1800
	cmp	bx,0
1801
	jg	fp_qword_exp_ok
1802
	or	edx,1 shl 20
1803
	mov	cx,bx
1804
	neg	cx
1805
	inc	cx
1806
	cmp	cx,52
1807
	ja	value_out_of_range
1808
	cmp	cx,32
1809
	jbe	fp_qword_small_shift
1810
	sub	cx,32
1811
	mov	eax,edx
1812
	xor	edx,edx
1813
	shr	eax,cl
1814
	jmp	fp_qword_shift_done
1815
      fp_qword_small_shift:
1816
	mov	ebx,edx
1817
	shr	edx,cl
1818
	shrd	eax,ebx,cl
1819
      fp_qword_shift_done:
1820
	mov	bx,0
1821
	jnc	fp_qword_exp_ok
1822
	add	eax,1
1823
	adc	edx,0
1824
	test	edx,1 shl 20
1825
	jz	fp_qword_exp_ok
1826
	and	edx,1 shl 20 - 1
1827
	inc	bx
1828
      fp_qword_exp_ok:
1829
	shl	ebx,20
1830
	or	edx,ebx
1831
      fp_qword_store:
1832
	mov	bl,[esi+11]
1833
	shl	ebx,31
1834
	or	edx,ebx
1835
	mov	[edi],eax
1836
	mov	[edi+4],edx
1837
	add	esi,13
1838
	ret
1839
      get_string_value:
1840
	inc	esi
1841
	lods	dword [esi]
1842
	mov	ecx,eax
1843
	cmp	ecx,8
1844
	ja	value_out_of_range
1845
	mov	edx,edi
1846
	xor	eax,eax
1847
	stos	dword [edi]
1848
	stos	dword [edi]
1849
	mov	edi,edx
1850
	rep	movs byte [edi],[esi]
1851
	mov	edi,edx
1852
	inc	esi
1853
	mov	word [edi+8],0
1854
	mov	byte [edi+12],0
1855
	ret
1856
1857
 
1858
	mov	[value_size],1
1859
	mov	[size_override],-1
1860
	call	calculate_expression
1861
	mov	eax,[edi+16]
1862
	mov	[symbol_identifier],eax
1863
	mov	[value_type],0
1864
	cmp	word [edi+8],0
1865
	jne	invalid_value
1866
	cmp	byte [edi+12],0
1867
	je	check_byte_value
1868
	cmp	[error_line],0
1869
	jne	check_byte_value
1870
	mov	eax,[current_line]
1871
	mov	[error_line],eax
1872
	mov	[error],invalid_use_of_symbol
1873
      check_byte_value:
1874
	mov	eax,[edi]
1875
	mov	edx,[edi+4]
1876
	or	edx,edx
1877
	jz	byte_positive
1878
	cmp	edx,-1
1879
	jne	range_exceeded
1880
	cmp	eax,-80h
1881
	jb	range_exceeded
1882
	ret
1883
      byte_positive:
1884
	cmp	eax,100h
1885
	jae	range_exceeded
1886
      return_byte_value:
1887
	ret
1888
      range_exceeded:
1889
	xor	eax,eax
1890
	xor	edx,edx
1891
	cmp	[error_line],0
1892
	jne	return_byte_value
1893
	mov	ecx,[current_line]
1894
	mov	[error_line],ecx
1895
	mov	[error],value_out_of_range
1896
	ret
1897
get_word_value:
1898
	mov	[value_size],2
1899
	mov	[size_override],-1
1900
	call	calculate_expression
1901
	cmp	word [edi+8],0
1902
	jne	invalid_value
1903
	mov	eax,[edi+16]
1904
	mov	[symbol_identifier],eax
1905
	mov	al,[edi+12]
1906
	mov	[value_type],al
1907
	cmp	al,2
1908
	jb	check_word_value
1909
	cmp	[error_line],0
1910
	jne	check_word_value
1911
	mov	eax,[current_line]
1912
	mov	[error_line],eax
1913
	mov	[error],invalid_use_of_symbol
1914
      check_word_value:
1915
	mov	eax,[edi]
1916
	mov	edx,[edi+4]
1917
	or	edx,edx
1918
	jz	word_positive
1919
	cmp	edx,-1
1920
	jne	range_exceeded
1921
	cmp	eax,-8000h
1922
	jb	range_exceeded
1923
	ret
1924
      word_positive:
1925
	cmp	eax,10000h
1926
	jae	range_exceeded
1927
	ret
1928
get_dword_value:
1929
	mov	[value_size],4
1930
	mov	[size_override],-1
1931
	call	calculate_expression
1932
	cmp	word [edi+8],0
1933
	jne	invalid_value
1934
	mov	eax,[edi+16]
1935
	mov	[symbol_identifier],eax
1936
	mov	al,[edi+12]
1937
	mov	[value_type],al
1938
	cmp	al,4
1939
	jne	check_dword_value
1940
	mov	[value_type],2
1941
	mov	eax,[edi]
1942
	cdq
1943
	cmp	edx,[edi+4]
1944
	jne	range_exceeded
1945
	ret
1946
      check_dword_value:
1947
	mov	eax,[edi]
1948
	mov	edx,[edi+4]
1949
	or	edx,edx
1950
	jz	dword_positive
1951
	cmp	edx,-1
1952
	jne	range_exceeded
1953
	bt	eax,31
1954
	jnc	range_exceeded
1955
      dword_positive:
1956
	ret
1957
get_pword_value:
1958
	mov	[value_size],6
1959
	mov	[size_override],-1
1960
	call	calculate_expression
1961
	mov	eax,[edi+16]
1962
	mov	[symbol_identifier],eax
1963
	cmp	word [edi+8],0
1964
	jne	invalid_value
1965
	mov	al,[edi+12]
1966
	mov	[value_type],al
1967
	cmp	al,4
1968
	jne	check_pword_value
1969
	cmp	[error_line],0
1970
	jne	check_pword_value
1971
	mov	eax,[current_line]
1972
	mov	[error_line],eax
1973
	mov	[error],invalid_use_of_symbol
1974
      check_pword_value:
1975
	mov	eax,[edi]
1976
	mov	edx,[edi+4]
1977
	cmp	edx,10000h
1978
	jge	range_exceeded
1979
	cmp	edx,-8000h
1980
	jl	range_exceeded
1981
	ret
1982
get_qword_value:
1983
	mov	[value_size],8
1984
	mov	[size_override],-1
1985
	call	calculate_expression
1986
	cmp	word [edi+8],0
1987
	jne	invalid_value
1988
	mov	eax,[edi+16]
1989
	mov	[symbol_identifier],eax
1990
	mov	al,[edi+12]
1991
	mov	[value_type],al
1992
      check_qword_value:
1993
	mov	eax,[edi]
1994
	mov	edx,[edi+4]
1995
	ret
1996
get_value:
1997
	mov	[operand_size],0
1998
	lods	byte [esi]
1999
	call	get_size_operator
2000
	cmp	al,'('
2001
	jne	invalid_value
2002
	mov	al,[operand_size]
2003
	cmp	al,1
2004
	je	value_byte
2005
	cmp	al,2
2006
	je	value_word
2007
	cmp	al,4
2008
	je	value_dword
2009
	cmp	al,6
2010
	je	value_pword
2011
	cmp	al,8
2012
	je	value_qword
2013
	or	al,al
2014
	jnz	invalid_value
2015
      value_qword:
2016
	call	get_qword_value
2017
	ret
2018
      value_pword:
2019
	call	get_pword_value
2020
	movzx	edx,dx
2021
	ret
2022
      value_dword:
2023
	call	get_dword_value
2024
	xor	edx,edx
2025
	ret
2026
      value_word:
2027
	call	get_word_value
2028
	xor	edx,edx
2029
	movzx	eax,ax
2030
	ret
2031
      value_byte:
2032
	call	get_byte_value
2033
	xor	edx,edx
2034
	movzx	eax,al
2035
	ret
2036
get_address_word_value:
2037
	mov	[address_size],2
2038
	mov	[value_size],2
2039
	jmp	calculate_address
2040
get_address_dword_value:
2041
	mov	[address_size],4
2042
	mov	[value_size],4
2043
	jmp	calculate_address
2044
get_address_qword_value:
2045
	mov	[address_size],8
2046
	mov	[value_size],8
2047
	jmp	calculate_address
2048
get_address_value:
2049
	mov	[address_size],0
2050
	mov	[value_size],8
2051
      calculate_address:
2052
	cmp	byte [esi],'.'
2053
	je	invalid_address
2054
	call	calculate_expression
2055
	mov	eax,[edi+16]
2056
	mov	[address_symbol],eax
2057
	mov	al,[edi+12]
2058
	mov	[value_type],al
2059
	cmp	al,6
2060
	je	special_address_type_32bit
2061
	cmp	al,5
2062
	je	special_address_type_32bit
2063
	ja	invalid_use_of_symbol
2064
	test	al,1
2065
	jnz	invalid_use_of_symbol
2066
	or	al,al
2067
	jz	address_size_ok
2068
	shl	al,5
2069
	jmp	address_symbol_ok
2070
      special_address_type_32bit:
2071
	mov	al,40h
2072
      address_symbol_ok:
2073
	mov	ah,[address_size]
2074
	or	[address_size],al
2075
	shr	al,4
2076
	or	ah,ah
2077
	jz	address_size_ok
2078
	cmp	al,ah
2079
	je	address_size_ok
2080
	cmp	ax,0804h
2081
	jne	address_sizes_do_not_agree
2082
	cmp	[value_type],2
2083
	ja	value_type_correction_ok
2084
	mov	[value_type],2
2085
      value_type_correction_ok:
2086
	mov	eax,[edi]
2087
	cdq
2088
	cmp	edx,[edi+4]
2089
	je	address_size_ok
2090
	cmp	[error_line],0
2091
	jne	address_size_ok
2092
	mov	ecx,[current_line]
2093
	mov	[error_line],ecx
2094
	mov	[error],value_out_of_range
2095
      address_size_ok:
2096
	xor	ebx,ebx
2097
	xor	ecx,ecx
2098
	mov	cl,[value_type]
2099
	shl	ecx,16
2100
	mov	ch,[address_size]
2101
	cmp	word [edi+8],0
2102
	je	check_immediate_address
2103
	mov	al,[edi+8]
2104
	mov	dl,[edi+10]
2105
	call	get_address_register
2106
	mov	al,[edi+9]
2107
	mov	dl,[edi+11]
2108
	call	get_address_register
2109
	mov	ax,bx
2110
	shr	ah,4
2111
	shr	al,4
2112
	or	bh,bh
2113
	jz	check_address_registers
2114
	or	bl,bl
2115
	jz	check_address_registers
2116
	cmp	al,ah
2117
	jne	invalid_address
2118
      check_address_registers:
2119
	or	al,ah
2120
	mov	ah,[address_size]
2121
	and	ah,0Fh
2122
	jz	address_registers_sizes_ok
2123
	cmp	al,ah
2124
	jne	address_sizes_do_not_match
2125
      address_registers_sizes_ok:
2126
	cmp	al,4
2127
	je	sib_allowed
2128
	cmp	al,8
2129
	je	sib_allowed
2130
	cmp	al,0Fh
2131
	je	check_ip_relative_address
2132
	or	cl,cl
2133
	jz	check_word_value
2134
	cmp	cl,1
2135
	je	check_word_value
2136
	jmp	invalid_address
2137
      address_sizes_do_not_match:
2138
	cmp	al,0Fh
2139
	jne	invalid_address
2140
	mov	al,bh
2141
	and	al,0Fh
2142
	cmp	al,ah
2143
	jne	invalid_address
2144
      check_ip_relative_address:
2145
	cmp	bh,0F4h
2146
	je	check_dword_value
2147
	cmp	bh,0F8h
2148
	jne	invalid_address
2149
	mov	eax,[edi]
2150
	cdq
2151
	cmp	edx,[edi+4]
2152
	jne	range_exceeded
2153
	ret
2154
      get_address_register:
2155
	or	al,al
2156
	jz	address_register_ok
2157
	cmp	dl,1
2158
	jne	scaled_register
2159
	or	bh,bh
2160
	jnz	scaled_register
2161
	mov	bh,al
2162
      address_register_ok:
2163
	ret
2164
      scaled_register:
2165
	or	bl,bl
2166
	jnz	invalid_address
2167
	mov	bl,al
2168
	mov	cl,dl
2169
	jmp	address_register_ok
2170
      sib_allowed:
2171
	or	bh,bh
2172
	jnz	check_index_scale
2173
	cmp	cl,2
2174
	je	special_index_scale
2175
	cmp	cl,3
2176
	je	special_index_scale
2177
	cmp	cl,5
2178
	je	special_index_scale
2179
	cmp	cl,9
2180
	je	special_index_scale
2181
      check_index_scale:
2182
	or	cl,cl
2183
	jz	check_immediate_address
2184
	cmp	cl,1
2185
	je	check_immediate_address
2186
	cmp	cl,2
2187
	je	check_immediate_address
2188
	cmp	cl,4
2189
	je	check_immediate_address
2190
	cmp	cl,8
2191
	je	check_immediate_address
2192
	jmp	invalid_address
2193
      special_index_scale:
2194
	mov	bh,bl
2195
	dec	cl
2196
      check_immediate_address:
2197
	mov	al,[address_size]
2198
	and	al,0Fh
2199
	cmp	al,2
2200
	je	check_word_value
2201
	cmp	al,4
2202
	je	check_dword_value
2203
	cmp	al,8
2204
	je	check_qword_value
2205
	or	al,al
2206
	jnz	invalid_value
2207
	cmp	[code_type],64
2208
	jne	check_dword_value
2209
	jmp	check_qword_value
2210
calculate_relative_offset:
2211
	cmp	[value_undefined],0
2212
	jne	relative_offset_ok
2213
	test	bh,bh
2214
	setne	ch
2215
	cmp	bx,word [org_registers]
2216
	je	origin_registers_ok
2217
	xchg	bh,bl
2218
	xchg	ch,cl
2219
	cmp	bx,word [org_registers]
2220
	jne	invalid_value
2221
      origin_registers_ok:
2222
	cmp	cx,word [org_registers+2]
2223
	jne	invalid_value
2224
	add	eax,dword [org_origin]
2225
	adc	edx,dword [org_origin+4]
2226
	sub	eax,edi
2227
	sbb	edx,0
2228
	mov	bl,[value_type]
2229
	or	bl,bl
2230
	je	relative_offset_ok
2231
	test	bl,1
2232
	jnz	invalid_use_of_symbol
2233
	mov	ecx,[address_symbol]
2234
	mov	[symbol_identifier],ecx
2235
	cmp	bl,6
2236
	je	plt_relative_offset
2237
	cmp	bl,[labels_type]
2238
	jne	invalid_use_of_symbol
2239
	mov	[value_type],0
2240
	cmp	ecx,[org_symbol]
2241
	je	relative_offset_ok
2242
	mov	[value_type],3
2243
      relative_offset_ok:
2244
	ret
2245
      plt_relative_offset:
2246
	mov	[value_type],7
2247
	ret
2248
2249
 
2250
	xor	al,al
2251
  preevaluate_embedded_logical_expression:
2252
	mov	[logical_value_wrapping],al
2253
	push	edi
2254
	call	preevaluate_logical_value
2255
      preevaluation_loop:
2256
	cmp	al,0FFh
2257
	je	invalid_logical_expression
2258
	mov	dl,[esi]
2259
	inc	esi
2260
	cmp	dl,'|'
2261
	je	preevaluate_or
2262
	cmp	dl,'&'
2263
	je	preevaluate_and
2264
	cmp	dl,'}'
2265
	je	preevaluation_done
2266
	or	dl,dl
2267
	jnz	invalid_logical_expression
2268
      preevaluation_done:
2269
	pop	edx
2270
	dec	esi
2271
	ret
2272
      preevaluate_or:
2273
	cmp	al,'1'
2274
	je	quick_true
2275
	cmp	al,'0'
2276
	je	leave_only_following
2277
	push	edi
2278
	mov	al,dl
2279
	stos	byte [edi]
2280
	call	preevaluate_logical_value
2281
	pop	ebx
2282
	cmp	al,'0'
2283
	je	leave_only_preceding
2284
	cmp	al,'1'
2285
	jne	preevaluation_loop
2286
	stos	byte [edi]
2287
	xor	al,al
2288
	jmp	preevaluation_loop
2289
      preevaluate_and:
2290
	cmp	al,'0'
2291
	je	quick_false
2292
	cmp	al,'1'
2293
	je	leave_only_following
2294
	push	edi
2295
	mov	al,dl
2296
	stos	byte [edi]
2297
	call	preevaluate_logical_value
2298
	pop	ebx
2299
	cmp	al,'1'
2300
	je	leave_only_preceding
2301
	cmp	al,'0'
2302
	jne	preevaluation_loop
2303
	stos	byte [edi]
2304
	xor	al,al
2305
	jmp	preevaluation_loop
2306
      leave_only_following:
2307
	mov	edi,[esp]
2308
	call	preevaluate_logical_value
2309
	jmp	preevaluation_loop
2310
      leave_only_preceding:
2311
	mov	edi,ebx
2312
	xor	al,al
2313
	jmp	preevaluation_loop
2314
      quick_true:
2315
	call	skip_logical_value
2316
	jc	invalid_logical_expression
2317
	mov	edi,[esp]
2318
	mov	al,'1'
2319
	jmp	preevaluation_loop
2320
      quick_false:
2321
	call	skip_logical_value
2322
	jc	invalid_logical_expression
2323
	mov	edi,[esp]
2324
	mov	al,'0'
2325
	jmp	preevaluation_loop
2326
      invalid_logical_expression:
2327
	pop	edi
2328
	mov	esi,edi
2329
	mov	al,0FFh
2330
	stos	byte [edi]
2331
	ret
2332
  skip_logical_value:
2333
	cmp	byte [esi],'~'
2334
	jne	negation_skipped
2335
	inc	esi
2336
	jmp	skip_logical_value
2337
      negation_skipped:
2338
	mov	al,[esi]
2339
	cmp	al,'{'
2340
	jne	skip_simple_logical_value
2341
	inc	esi
2342
	xchg	al,[logical_value_wrapping]
2343
	push	eax
2344
      skip_logical_expression:
2345
	call	skip_logical_value
2346
	lods	byte [esi]
2347
	or	al,al
2348
	jz	wrongly_structured_logical_expression
2349
	cmp	al,0Fh
2350
	je	wrongly_structured_logical_expression
2351
	cmp	al,'|'
2352
	je	skip_logical_expression
2353
	cmp	al,'&'
2354
	je	skip_logical_expression
2355
	cmp	al,'}'
2356
	jne	wrongly_structured_logical_expression
2357
	pop	eax
2358
	mov	[logical_value_wrapping],al
2359
      logical_value_skipped:
2360
	clc
2361
	ret
2362
      wrongly_structured_logical_expression:
2363
	pop	eax
2364
	stc
2365
	ret
2366
      skip_simple_logical_value:
2367
	mov	[logical_value_parentheses],0
2368
      find_simple_logical_value_end:
2369
	mov	al,[esi]
2370
	or	al,al
2371
	jz	logical_value_skipped
2372
	cmp	al,0Fh
2373
	je	logical_value_skipped
2374
	cmp	al,'|'
2375
	je	logical_value_skipped
2376
	cmp	al,'&'
2377
	je	logical_value_skipped
2378
	cmp	al,'{'
2379
	je	skip_logical_value_internal_parenthesis
2380
	cmp	al,'}'
2381
	jne	skip_logical_value_symbol
2382
	sub	[logical_value_parentheses],1
2383
	jnc	skip_logical_value_symbol
2384
	cmp	[logical_value_wrapping],'{'
2385
	jne	skip_logical_value_symbol
2386
	jmp	logical_value_skipped
2387
      skip_logical_value_internal_parenthesis:
2388
	inc	[logical_value_parentheses]
2389
      skip_logical_value_symbol:
2390
	call	skip_symbol
2391
	jmp	find_simple_logical_value_end
2392
  preevaluate_logical_value:
2393
	mov	ebp,edi
2394
      preevaluate_negation:
2395
	cmp	byte [esi],'~'
2396
	jne	preevaluate_negation_ok
2397
	movs	byte [edi],[esi]
2398
	jmp	preevaluate_negation
2399
      preevaluate_negation_ok:
2400
	mov	ebx,esi
2401
	cmp	byte [esi],'{'
2402
	jne	preevaluate_simple_logical_value
2403
	lods	byte [esi]
2404
	stos	byte [edi]
2405
	push	ebp
2406
	mov	dl,[logical_value_wrapping]
2407
	push	edx
2408
	call	preevaluate_embedded_logical_expression
2409
	pop	edx
2410
	mov	[logical_value_wrapping],dl
2411
	pop	ebp
2412
	cmp	al,0FFh
2413
	je	invalid_logical_value
2414
	cmp	byte [esi],'}'
2415
	jne	invalid_logical_value
2416
	or	al,al
2417
	jnz	preevaluated_expression_value
2418
	movs	byte [edi],[esi]
2419
	ret
2420
      preevaluated_expression_value:
2421
	inc	esi
2422
	lea	edx,[edi-1]
2423
	sub	edx,ebp
2424
	test	edx,1
2425
	jz	expression_negation_ok
2426
	xor	al,1
2427
      expression_negation_ok:
2428
	mov	edi,ebp
2429
	ret
2430
      invalid_logical_value:
2431
	mov	edi,ebp
2432
	mov	al,0FFh
2433
	ret
2434
      preevaluate_simple_logical_value:
2435
	xor	edx,edx
2436
	mov	[logical_value_parentheses],edx
2437
      find_logical_value_boundaries:
2438
	mov	al,[esi]
2439
	or	al,al
2440
	jz	logical_value_boundaries_found
2441
	cmp	al,'{'
2442
	je	logical_value_internal_parentheses
2443
	cmp	al,'}'
2444
	je	logical_value_boundaries_parenthesis_close
2445
	cmp	al,'|'
2446
	je	logical_value_boundaries_found
2447
	cmp	al,'&'
2448
	je	logical_value_boundaries_found
2449
	or	edx,edx
2450
	jnz	next_symbol_in_logical_value
2451
	cmp	al,0F0h
2452
	je	preevaluable_logical_operator
2453
	cmp	al,0F7h
2454
	je	preevaluable_logical_operator
2455
	cmp	al,0F6h
2456
	jne	next_symbol_in_logical_value
2457
      preevaluable_logical_operator:
2458
	mov	edx,esi
2459
      next_symbol_in_logical_value:
2460
	call	skip_symbol
2461
	jmp	find_logical_value_boundaries
2462
      logical_value_internal_parentheses:
2463
	inc	[logical_value_parentheses]
2464
	jmp	next_symbol_in_logical_value
2465
      logical_value_boundaries_parenthesis_close:
2466
	sub	[logical_value_parentheses],1
2467
	jnc	next_symbol_in_logical_value
2468
	cmp	[logical_value_wrapping],'{'
2469
	jne	next_symbol_in_logical_value
2470
      logical_value_boundaries_found:
2471
	or	edx,edx
2472
	jz	non_preevaluable_logical_value
2473
	mov	al,[edx]
2474
	cmp	al,0F0h
2475
	je	compare_symbols
2476
	cmp	al,0F7h
2477
	je	compare_symbol_types
2478
	cmp	al,0F6h
2479
	je	scan_symbols_list
2480
      non_preevaluable_logical_value:
2481
	mov	ecx,esi
2482
	mov	esi,ebx
2483
	sub	ecx,esi
2484
	jz	invalid_logical_value
2485
	cmp	esi,edi
2486
	je	leave_logical_value_intact
2487
	rep	movs byte [edi],[esi]
2488
	xor	al,al
2489
	ret
2490
      leave_logical_value_intact:
2491
	add	edi,ecx
2492
	add	esi,ecx
2493
	xor	al,al
2494
	ret
2495
      compare_symbols:
2496
	lea	ecx,[esi-1]
2497
	sub	ecx,edx
2498
	mov	eax,edx
2499
	sub	eax,ebx
2500
	cmp	ecx,eax
2501
	jne	preevaluated_false
2502
	push	esi edi
2503
	mov	esi,ebx
2504
	lea	edi,[edx+1]
2505
	repe	cmps byte [esi],[edi]
2506
	pop	edi esi
2507
	je	preevaluated_true
2508
      preevaluated_false:
2509
	mov	eax,edi
2510
	sub	eax,ebp
2511
	test	eax,1
2512
	jnz	store_true
2513
      store_false:
2514
	mov	edi,ebp
2515
	mov	al,'0'
2516
	ret
2517
      preevaluated_true:
2518
	mov	eax,edi
2519
	sub	eax,ebp
2520
	test	eax,1
2521
	jnz	store_false
2522
      store_true:
2523
	mov	edi,ebp
2524
	mov	al,'1'
2525
	ret
2526
      compare_symbol_types:
2527
	push	esi
2528
	lea	esi,[edx+1]
2529
      type_comparison:
2530
	cmp	esi,[esp]
2531
	je	types_compared
2532
	mov	al,[esi]
2533
	cmp	al,[ebx]
2534
	jne	different_type
2535
	cmp	al,'('
2536
	jne	equal_type
2537
	mov	al,[esi+1]
2538
	mov	ah,[ebx+1]
2539
	cmp	al,ah
2540
	je	equal_type
2541
	or	al,al
2542
	jz	different_type
2543
	or	ah,ah
2544
	jz	different_type
2545
	cmp	al,'.'
2546
	je	different_type
2547
	cmp	ah,'.'
2548
	je	different_type
2549
      equal_type:
2550
	call	skip_symbol
2551
	xchg	esi,ebx
2552
	call	skip_symbol
2553
	xchg	esi,ebx
2554
	jmp	type_comparison
2555
      types_compared:
2556
	pop	esi
2557
	cmp	byte [ebx],0F7h
2558
	jne	preevaluated_false
2559
	jmp	preevaluated_true
2560
      different_type:
2561
	pop	esi
2562
	jmp	preevaluated_false
2563
      scan_symbols_list:
2564
	push	edi esi
2565
	lea	esi,[edx+1]
2566
	sub	edx,ebx
2567
	lods	byte [esi]
2568
	cmp	al,'<'
2569
	jne	invalid_symbols_list
2570
      get_next_from_list:
2571
	mov	edi,esi
2572
      get_from_list:
2573
	cmp	byte [esi],','
2574
	je	compare_in_list
2575
	cmp	byte [esi],'>'
2576
	je	compare_in_list
2577
	cmp	esi,[esp]
2578
	jae	invalid_symbols_list
2579
	call	skip_symbol
2580
	jmp	get_from_list
2581
      compare_in_list:
2582
	mov	ecx,esi
2583
	sub	ecx,edi
2584
	cmp	ecx,edx
2585
	jne	not_equal_length_in_list
2586
	mov	esi,ebx
2587
	repe	cmps byte [esi],[edi]
2588
	mov	esi,edi
2589
	jne	not_equal_in_list
2590
      skip_rest_of_list:
2591
	cmp	byte [esi],'>'
2592
	je	check_list_end
2593
	cmp	esi,[esp]
2594
	jae	invalid_symbols_list
2595
	call	skip_symbol
2596
	jmp	skip_rest_of_list
2597
      check_list_end:
2598
	inc	esi
2599
	cmp	esi,[esp]
2600
	jne	invalid_symbols_list
2601
	pop	esi edi
2602
	jmp	preevaluated_true
2603
      not_equal_in_list:
2604
	add	esi,ecx
2605
      not_equal_length_in_list:
2606
	lods	byte [esi]
2607
	cmp	al,','
2608
	je	get_next_from_list
2609
	cmp	esi,[esp]
2610
	jne	invalid_symbols_list
2611
	pop	esi edi
2612
	jmp	preevaluated_false
2613
      invalid_symbols_list:
2614
	pop	esi edi
2615
	jmp	invalid_logical_value
2616
2617
 
2618
	xor	al,al
2619
  calculate_embedded_logical_expression:
2620
	mov	[logical_value_wrapping],al
2621
	call	get_logical_value
2622
      logical_loop:
2623
	cmp	byte [esi],'|'
2624
	je	logical_or
2625
	cmp	byte [esi],'&'
2626
	je	logical_and
2627
	ret
2628
      logical_or:
2629
	inc	esi
2630
	or	al,al
2631
	jnz	logical_value_already_determined
2632
	push	eax
2633
	call	get_logical_value
2634
	pop	ebx
2635
	or	al,bl
2636
	jmp	logical_loop
2637
      logical_and:
2638
	inc	esi
2639
	or	al,al
2640
	jz	logical_value_already_determined
2641
	push	eax
2642
	call	get_logical_value
2643
	pop	ebx
2644
	and	al,bl
2645
	jmp	logical_loop
2646
      logical_value_already_determined:
2647
	push	eax
2648
	call	skip_logical_value
2649
	jc	invalid_expression
2650
	pop	eax
2651
	jmp	logical_loop
2652
  get_logical_value:
2653
	xor	al,al
2654
      check_for_negation:
2655
	cmp	byte [esi],'~'
2656
	jne	negation_ok
2657
	inc	esi
2658
	xor	al,-1
2659
	jmp	check_for_negation
2660
      negation_ok:
2661
	push	eax
2662
	mov	al,[esi]
2663
	cmp	al,'{'
2664
	je	logical_expression
2665
	cmp	al,0FFh
2666
	je	invalid_expression
2667
	cmp	al,88h
2668
	je	check_for_defined
2669
	cmp	al,89h
2670
	je	check_for_used
2671
	cmp	al,'0'
2672
	je	given_false
2673
	cmp	al,'1'
2674
	je	given_true
2675
	call	get_value
2676
	mov	bl,[value_type]
2677
	push	eax edx ebx
2678
	mov	al,[esi]
2679
	or	al,al
2680
	jz	logical_number
2681
	cmp	al,0Fh
2682
	je	logical_number
2683
	cmp	al,'}'
2684
	je	logical_number
2685
	cmp	al,'&'
2686
	je	logical_number
2687
	cmp	al,'|'
2688
	je	logical_number
2689
	inc	esi
2690
	mov	[compare_type],al
2691
	call	get_value
2692
	pop	ebx
2693
	cmp	[next_pass_needed],0
2694
	jne	values_ok
2695
	cmp	bl,[value_type]
2696
	jne	invalid_use_of_symbol
2697
      values_ok:
2698
	pop	ecx ebx
2699
	cmp	[compare_type],'='
2700
	je	check_equal
2701
	cmp	[compare_type],'>'
2702
	je	check_greater
2703
	cmp	[compare_type],'<'
2704
	je	check_less
2705
	cmp	[compare_type],0F1h
2706
	je	check_not_equal
2707
	cmp	[compare_type],0F2h
2708
	je	check_not_less
2709
	cmp	[compare_type],0F3h
2710
	je	check_not_greater
2711
	jmp	invalid_expression
2712
      check_equal:
2713
	cmp	eax,ebx
2714
	jne	return_false
2715
	cmp	edx,ecx
2716
	jne	return_false
2717
	jmp	return_true
2718
      check_greater:
2719
	cmp	edx,ecx
2720
	jl	return_true
2721
	jg	return_false
2722
	cmp	eax,ebx
2723
	jb	return_true
2724
	jae	return_false
2725
      check_less:
2726
	cmp	edx,ecx
2727
	jl	return_false
2728
	jg	return_true
2729
	cmp	eax,ebx
2730
	jbe	return_false
2731
	ja	return_true
2732
      check_not_less:
2733
	cmp	edx,ecx
2734
	jl	return_true
2735
	jg	return_false
2736
	cmp	eax,ebx
2737
	jbe	return_true
2738
	ja	return_false
2739
      check_not_greater:
2740
	cmp	edx,ecx
2741
	jl	return_false
2742
	jg	return_true
2743
	cmp	eax,ebx
2744
	jb	return_false
2745
	jae	return_true
2746
      check_not_equal:
2747
	cmp	eax,ebx
2748
	jne	return_true
2749
	cmp	edx,ecx
2750
	jne	return_true
2751
	jmp	return_false
2752
      logical_number:
2753
	pop	ebx edx eax
2754
	or	bl,bl
2755
	jnz	invalid_expression
2756
	or	eax,edx
2757
	jnz	return_true
2758
	jmp	return_false
2759
      check_for_defined:
2760
	or	bl,-1
2761
	lods	word [esi]
2762
	cmp	ah,'('
2763
	jne	invalid_expression
2764
      check_expression:
2765
	lods	byte [esi]
2766
	or	al,al
2767
	jz	defined_string
2768
	cmp	al,'.'
2769
	je	defined_fp_value
2770
	cmp	al,')'
2771
	je	expression_checked
2772
	cmp	al,'!'
2773
	je	invalid_expression
2774
	cmp	al,0Fh
2775
	je	check_expression
2776
	cmp	al,10h
2777
	je	defined_register
2778
	cmp	al,11h
2779
	je	check_if_symbol_defined
2780
	cmp	al,80h
2781
	jae	check_expression
2782
	movzx	eax,al
2783
	add	esi,eax
2784
	jmp	check_expression
2785
      defined_register:
2786
	inc	esi
2787
	jmp	check_expression
2788
      defined_fp_value:
2789
	add	esi,12
2790
	jmp	expression_checked
2791
      defined_string:
2792
	lods	dword [esi]
2793
	add	esi,eax
2794
	inc	esi
2795
	jmp	expression_checked
2796
      check_if_symbol_defined:
2797
	lods	dword [esi]
2798
	cmp	eax,-1
2799
	je	invalid_expression
2800
	cmp	eax,0Fh
2801
	jb	check_expression
2802
	je	reserved_word_used_as_symbol
2803
	test	byte [eax+8],4
2804
	jnz	no_prediction
2805
	test	byte [eax+8],1
2806
	jz	symbol_predicted_undefined
2807
	mov	cx,[current_pass]
2808
	sub	cx,[eax+16]
2809
	jz	check_expression
2810
	cmp	cx,1
2811
	ja	symbol_predicted_undefined
2812
	or	byte [eax+8],40h+80h
2813
	jmp	check_expression
2814
      no_prediction:
2815
	test	byte [eax+8],1
2816
	jz	symbol_undefined
2817
	mov	cx,[current_pass]
2818
	sub	cx,[eax+16]
2819
	jz	check_expression
2820
	jmp	symbol_undefined
2821
      symbol_predicted_undefined:
2822
	or	byte [eax+8],40h
2823
	and	byte [eax+8],not 80h
2824
      symbol_undefined:
2825
	xor	bl,bl
2826
	jmp	check_expression
2827
      expression_checked:
2828
	mov	al,bl
2829
	jmp	logical_value_ok
2830
      check_for_used:
2831
	lods	word [esi]
2832
	cmp	ah,2
2833
	jne	invalid_expression
2834
	lods	dword [esi]
2835
	cmp	eax,0Fh
2836
	jb	invalid_use_of_symbol
2837
	je	reserved_word_used_as_symbol
2838
	inc	esi
2839
	test	byte [eax+8],8
2840
	jz	not_used
2841
	mov	cx,[current_pass]
2842
	sub	cx,[eax+18]
2843
	jz	return_true
2844
	cmp	cx,1
2845
	ja	not_used
2846
	or	byte [eax+8],10h+20h
2847
	jmp	return_true
2848
      not_used:
2849
	or	byte [eax+8],10h
2850
	and	byte [eax+8],not 20h
2851
	jmp	return_false
2852
      given_false:
2853
	inc	esi
2854
      return_false:
2855
	xor	al,al
2856
	jmp	logical_value_ok
2857
      given_true:
2858
	inc	esi
2859
      return_true:
2860
	or	al,-1
2861
	jmp	logical_value_ok
2862
      logical_expression:
2863
	lods	byte [esi]
2864
	mov	dl,[logical_value_wrapping]
2865
	push	edx
2866
	call	calculate_embedded_logical_expression
2867
	pop	edx
2868
	mov	[logical_value_wrapping],dl
2869
	push	eax
2870
	lods	byte [esi]
2871
	cmp	al,'}'
2872
	jne	invalid_expression
2873
	pop	eax
2874
      logical_value_ok:
2875
	pop	ebx
2876
	xor	al,bl
2877
	ret
2878
>