Subversion Repositories Kolibri OS

Rev

Rev 196 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
 
31 halyavin 2
; Copyright (c) 1999-2006, Tomasz Grysztar.
109 heavyiron 3
; All rights reserved.
31 halyavin 4
5
 
6
	cmp	[output_file],0
157 heavyiron 7
	jne	output_path_ok
8
	push	edi
9
	mov	esi,[input_file]
10
	mov	edi,[free_additional_memory]
11
      copy_output_path:
31 halyavin 12
	lods	byte [esi]
157 heavyiron 13
	cmp	edi,[structures_buffer]
14
	jae	out_of_memory
15
	stos	byte [edi]
16
	or	al,al
17
	jnz	copy_output_path
18
	dec	edi
19
	mov	eax,edi
20
      find_extension:
31 halyavin 21
	dec	eax
157 heavyiron 22
	cmp	eax,[free_additional_memory]
23
	jb	extension_found
24
	cmp	byte [eax],'\'
25
	je	extension_found
26
	cmp	byte [eax],'/'
27
	je	extension_found
28
	cmp	byte [eax],'.'
29
	jne	find_extension
30
	mov	edi,eax
31
      extension_found:
31 halyavin 32
	lea	eax,[edi+9]
157 heavyiron 33
	cmp	eax,[structures_buffer]
34
	jae	out_of_memory
35
	cmp	[output_format],2
36
	je	exe_extension
37
	jb	bin_extension
38
	cmp	[output_format],4
39
	je	obj_extension
40
	cmp	[output_format],5
41
	je	o_extension
42
	cmp	[output_format],3
43
	jne	no_extension
44
	cmp	[subsystem],1
45
	je	sys_extension
46
	bt	[format_flags],8
47
	jnc	exe_extension
48
	mov	eax,'.dll'
49
	jmp	make_extension
50
      sys_extension:
31 halyavin 51
	mov	eax,'.sys'
157 heavyiron 52
	jmp	make_extension
53
      bin_extension:
31 halyavin 54
	mov	eax,'.bin'
157 heavyiron 55
	bt	[format_flags],0
56
	jnc	make_extension
57
	mov	eax,'.com'
58
	jmp	make_extension
59
      obj_extension:
31 halyavin 60
	mov	eax,'.obj'
157 heavyiron 61
	jmp	make_extension
62
      o_extension:
31 halyavin 63
	mov	eax,'.o'
157 heavyiron 64
	bt	[format_flags],0
65
	jnc	make_extension
66
      no_extension:
31 halyavin 67
	xor	eax,eax
157 heavyiron 68
	jmp	make_extension
69
      exe_extension:
31 halyavin 70
	mov	eax,'.exe'
157 heavyiron 71
      make_extension:
31 halyavin 72
	xchg	eax,[edi]
157 heavyiron 73
	scas	dword [edi]
74
	mov	byte [edi],0
75
	scas	byte [edi]
76
	mov	esi,edi
77
	stos	dword [edi]
78
	sub	edi,9
79
	xor	eax,eax
80
	mov	ebx,characters
81
      adapt_case:
31 halyavin 82
	mov	al,[esi]
157 heavyiron 83
	or	al,al
84
	jz	adapt_next
85
	xlat	byte [ebx]
86
	cmp	al,[esi]
87
	je	adapt_ok
88
	sub	byte [edi],20h
89
      adapt_ok:
31 halyavin 90
	inc	esi
157 heavyiron 91
      adapt_next:
31 halyavin 92
	inc	edi
157 heavyiron 93
	cmp	byte [edi],0
94
	jne	adapt_case
95
	mov	esi,edi
96
	lea	ecx,[esi+1]
97
	sub	ecx,[free_additional_memory]
98
	mov	edi,[structures_buffer]
99
	dec	edi
100
	std
101
	rep	movs byte [edi],[esi]
102
	cld
103
	inc	edi
104
	mov	[structures_buffer],edi
105
	mov	[output_file],edi
106
	pop	edi
107
      output_path_ok:
31 halyavin 108
	cmp	[output_format],4
157 heavyiron 109
	je	coff_formatter
110
	cmp	[output_format],5
111
	jne	common_formatter
112
	bt	[format_flags],0
113
	jnc	elf_formatter
114
      common_formatter:
31 halyavin 115
	mov	eax,edi
157 heavyiron 116
	sub	eax,[code_start]
117
	mov	[real_code_size],eax
118
	cmp	edi,[undefined_data_end]
119
	jne	calculate_code_size
120
	mov	edi,[undefined_data_start]
121
      calculate_code_size:
31 halyavin 122
	sub	edi,[code_start]
157 heavyiron 123
	mov	[code_size],edi
124
	mov	[written_size],0
125
	mov	edx,[output_file]
126
	call	create
127
	jc	write_failed
128
	cmp	[output_format],3
129
	jne	stub_written
130
	mov	edx,[code_start]
131
	mov	ecx,[stub_size]
132
	sub	edx,ecx
133
	add	[written_size],ecx
134
	call	write
135
      stub_written:
31 halyavin 136
	cmp	[output_format],2
157 heavyiron 137
	jne	write_output
138
	call	write_mz_header
139
      write_output:
31 halyavin 140
	call	write_code
157 heavyiron 141
      output_written:
31 halyavin 142
	call	close
157 heavyiron 143
	ret
144
      write_code:
31 halyavin 145
	mov	eax,[written_size]
157 heavyiron 146
	mov	[headers_size],eax
147
	mov	edx,[code_start]
148
	mov	ecx,[code_size]
149
	add	[written_size],ecx
150
	call	write
151
	jc	write_failed
152
	ret
153
format_directive:
31 halyavin 154
	cmp	edi,[code_start]
157 heavyiron 155
	jne	unexpected_instruction
156
	cmp	[virtual_data],0
157
	jne	unexpected_instruction
158
	cmp	[output_format],0
159
	jne	unexpected_instruction
160
	lods	byte [esi]
161
	cmp	al,17h
162
	je	format_prefix
163
	cmp	al,18h
164
	jne	invalid_argument
165
	lods	byte [esi]
166
      select_format:
31 halyavin 167
	mov	dl,al
157 heavyiron 168
	shr	al,4
169
	mov	[output_format],al
170
	and	edx,0Fh
171
	or	[format_flags],edx
172
	cmp	al,2
173
	je	format_mz
174
	cmp	al,3
175
	je	format_pe
176
	cmp	al,4
177
	je	format_coff
178
	cmp	al,5
179
	je	format_elf
180
	jmp	instruction_assembled
181
      format_prefix:
31 halyavin 182
	lods	byte [esi]
157 heavyiron 183
	mov	ah,al
184
	lods	byte [esi]
185
	cmp	al,18h
186
	jne	invalid_argument
187
	lods	byte [esi]
188
	mov	edx,eax
189
	shr	dl,4
190
	shr	dh,4
191
	cmp	dl,dh
192
	jne	invalid_argument
193
	or	al,ah
194
	jmp	select_format
195
entry_directive:
31 halyavin 196
	bts	[format_flags],10h
157 heavyiron 197
	jc	setting_already_specified
198
	mov	al,[output_format]
199
	cmp	al,2
200
	je	mz_entry
201
	cmp	al,3
202
	je	pe_entry
203
	cmp	al,5
204
	jne	illegal_instruction
205
	bt	[format_flags],0
206
	jc	elf_entry
207
	jmp	illegal_instruction
208
stack_directive:
31 halyavin 209
	bts	[format_flags],11h
157 heavyiron 210
	jc	setting_already_specified
211
	mov	al,[output_format]
212
	cmp	al,2
213
	je	mz_stack
214
	cmp	al,3
215
	je	pe_stack
216
	jmp	illegal_instruction
217
heap_directive:
31 halyavin 218
	bts	[format_flags],12h
157 heavyiron 219
	jc	setting_already_specified
220
	mov	al,[output_format]
221
	cmp	al,2
222
	je	mz_heap
223
	cmp	al,3
224
	je	pe_heap
225
	jmp	illegal_instruction
226
segment_directive:
109 heavyiron 227
	cmp	[virtual_data],0
157 heavyiron 228
	jne	illegal_instruction
229
	mov	al,[output_format]
230
	cmp	al,2
231
	je	mz_segment
232
	cmp	al,5
233
	je	elf_segment
234
	jmp	illegal_instruction
235
section_directive:
31 halyavin 236
	cmp	[virtual_data],0
157 heavyiron 237
	jne	illegal_instruction
238
	mov	al,[output_format]
239
	cmp	al,3
240
	je	pe_section
241
	cmp	al,4
242
	je	coff_section
243
	cmp	al,5
244
	je	elf_section
245
	jmp	illegal_instruction
246
public_directive:
31 halyavin 247
	mov	al,[output_format]
157 heavyiron 248
	cmp	al,4
249
	je	public_allowed
250
	cmp	al,5
251
	jne	illegal_instruction
252
	bt	[format_flags],0
253
	jc	illegal_instruction
254
      public_allowed:
31 halyavin 255
	lods	byte [esi]
157 heavyiron 256
	cmp	al,2
257
	jne	invalid_argument
258
	lods	dword [esi]
259
	cmp	eax,0Fh
260
	jb	invalid_use_of_symbol
261
	je	reserved_word_used_as_symbol
262
	mov	dx,[current_pass]
263
	mov	[eax+18],dx
264
	or	byte [eax+8],8
265
	inc	esi
266
	mov	ebx,[free_additional_memory]
267
	lea	edx,[ebx+10h]
268
	cmp	edx,[structures_buffer]
269
	jae	out_of_memory
270
	mov	[free_additional_memory],edx
271
	mov	[ebx+8],eax
272
	mov	eax,[current_line]
273
	mov	[ebx+0Ch],eax
274
	lods	byte [esi]
275
	cmp	al,86h
276
	jne	invalid_argument
277
	lods	word [esi]
278
	cmp	ax,'('
279
	jne	invalid_argument
280
	mov	[ebx+4],esi
281
	lods	dword [esi]
282
	lea	esi,[esi+eax+1]
283
	mov	byte [ebx],80h
284
	jmp	instruction_assembled
285
extrn_directive:
31 halyavin 286
	mov	al,[output_format]
157 heavyiron 287
	cmp	al,4
288
	je	extrn_allowed
289
	cmp	al,5
290
	jne	illegal_instruction
291
	bt	[format_flags],0
292
	jc	illegal_instruction
293
      extrn_allowed:
31 halyavin 294
	lods	word [esi]
157 heavyiron 295
	cmp	ax,'('
296
	jne	invalid_argument
297
	mov	ebx,esi
298
	lods	dword [esi]
299
	lea	esi,[esi+eax+1]
300
	mov	edx,[free_additional_memory]
301
	lea	eax,[edx+0Ch]
302
	cmp	eax,[structures_buffer]
303
	jae	out_of_memory
304
	mov	[free_additional_memory],eax
305
	mov	byte [edx],81h
306
	mov	[edx+4],ebx
307
	lods	byte [esi]
308
	cmp	al,86h
309
	jne	invalid_argument
310
	lods	byte [esi]
311
	cmp	al,2
312
	jne	invalid_argument
313
	lods	dword [esi]
314
	cmp	eax,0Fh
315
	jb	invalid_use_of_symbol
316
	je	reserved_word_used_as_symbol
317
	inc	esi
318
	mov	ebx,eax
319
	xor	ah,ah
320
	lods	byte [esi]
321
	cmp	al,':'
322
	je	get_extrn_size
323
	dec	esi
324
	cmp	al,11h
325
	jne	extrn_size_ok
326
      get_extrn_size:
31 halyavin 327
	lods	word [esi]
157 heavyiron 328
	cmp	al,11h
329
	jne	invalid_argument
330
      extrn_size_ok:
31 halyavin 331
	mov	[address_symbol],edx
157 heavyiron 332
	movzx	ecx,ah
333
	mov	[edx+8],ecx
334
	xor	eax,eax
335
	xor	edx,edx
336
	xor	ebp,ebp
337
	mov	ch,2
338
	test	[format_flags],8
339
	jz	make_free_label
340
	mov	ch,4
341
	jmp	make_free_label
342
mark_relocation:
31 halyavin 343
	cmp	[value_type],0
157 heavyiron 344
	je	relocation_ok
345
	cmp	[virtual_data],0
346
	jne	relocation_ok
347
	cmp	[output_format],2
348
	je	mark_mz_relocation
349
	cmp	[output_format],3
350
	je	mark_pe_relocation
351
	cmp	[output_format],4
352
	je	mark_coff_relocation
353
	cmp	[output_format],5
354
	je	mark_elf_relocation
355
      relocation_ok:
31 halyavin 356
	ret
157 heavyiron 357
close_pass:
31 halyavin 358
	mov	al,[output_format]
157 heavyiron 359
	cmp	al,3
360
	je	close_pe
361
	cmp	al,4
362
	je	close_coff
363
	cmp	al,5
364
	je	close_elf
365
	ret
366
31 halyavin 367
 
368
	mov	edx,[additional_memory]
157 heavyiron 369
	push	edi
370
	mov	edi,edx
371
	mov	ecx,1Ch shr 2
372
	xor	eax,eax
373
	rep	stos dword [edi]
374
	mov	[free_additional_memory],edi
375
	pop	edi
376
	mov	word [edx+0Ch],0FFFFh
377
	mov	word [edx+10h],1000h
378
	mov	[code_type],16
379
	jmp	instruction_assembled
380
mark_mz_relocation:
31 halyavin 381
	push	eax ebx
157 heavyiron 382
	inc	[number_of_relocations]
383
	mov	ebx,[free_additional_memory]
384
	mov	eax,edi
385
	sub	eax,[code_start]
386
	mov	[ebx],ax
387
	shr	eax,16
388
	shl	ax,12
389
	mov	[ebx+2],ax
390
	cmp	word [ebx],0FFFFh
391
	jne	mz_relocation_ok
392
	inc	word [ebx+2]
393
	sub	word [ebx],10h
394
      mz_relocation_ok:
31 halyavin 395
	add	ebx,4
157 heavyiron 396
	cmp	ebx,[structures_buffer]
397
	jae	out_of_memory
398
	mov	[free_additional_memory],ebx
399
	pop	ebx eax
400
	ret
401
mz_segment:
109 heavyiron 402
	lods	byte [esi]
157 heavyiron 403
	cmp	al,2
404
	jne	invalid_argument
405
	lods	dword [esi]
406
	cmp	eax,0Fh
407
	jb	invalid_use_of_symbol
408
	je	reserved_word_used_as_symbol
409
	inc	esi
410
	mov	ebx,eax
411
	mov	eax,edi
412
	sub	eax,[code_start]
413
	mov	ecx,0Fh
414
	add	eax,0Fh
415
	and	eax,1111b
416
	sub	ecx,eax
417
	mov	edx,edi
418
	xor	al,al
419
	rep	stos byte [edi]
420
	mov	dword [org_origin],edi
421
	mov	dword [org_origin+4],0
422
	mov	[org_registers],0
423
	mov	[org_start],edi
424
	mov	eax,edx
425
	call	undefined_data
426
	mov	eax,edi
427
	sub	eax,[code_start]
428
	shr	eax,4
429
	cmp	eax,10000h
430
	jae	value_out_of_range
431
	mov	edx,eax
432
	mov	al,16
433
	cmp	byte [esi],13h
434
	jne	segment_type_ok
435
	inc	esi
436
	lods	byte [esi]
437
      segment_type_ok:
31 halyavin 438
	mov	[code_type],al
157 heavyiron 439
	mov	eax,edx
440
	mov	cx,0100h
441
	xor	edx,edx
442
	xor	ebp,ebp
443
	mov	[address_symbol],edx
444
	jmp	make_free_label
445
mz_entry:
31 halyavin 446
	lods	byte [esi]
157 heavyiron 447
	cmp	al,'('
448
	jne	invalid_argument
449
	call	get_word_value
450
	cmp	[value_type],1
451
	je	initial_cs_ok
452
	cmp	[error_line],0
453
	jne	initial_cs_ok
454
	mov	eax,[current_line]
455
	mov	[error_line],eax
456
	mov	[error],invalid_address
457
      initial_cs_ok:
31 halyavin 458
	mov	edx,[additional_memory]
157 heavyiron 459
	mov	[edx+16h],ax
460
	lods	byte [esi]
461
	cmp	al,':'
462
	jne	invalid_argument
463
	lods	byte [esi]
464
	cmp	al,'('
465
	jne	invalid_argument
466
	ja	invalid_address
467
	call	get_word_value
468
	cmp	[value_type],0
469
	jne	invalid_use_of_symbol
470
	mov	edx,[additional_memory]
471
	mov	[edx+14h],ax
472
	jmp	instruction_assembled
473
mz_stack:
31 halyavin 474
	lods	byte [esi]
157 heavyiron 475
	cmp	al,'('
476
	jne	invalid_argument
477
	call	get_word_value
478
	cmp	byte [esi],':'
479
	je	stack_pointer
480
	cmp	ax,10h
481
	jb	invalid_value
482
	cmp	[value_type],0
483
	jne	invalid_use_of_symbol
484
	mov	edx,[additional_memory]
485
	mov	[edx+10h],ax
486
	jmp	instruction_assembled
487
      stack_pointer:
31 halyavin 488
	cmp	[value_type],1
157 heavyiron 489
	je	initial_ss_ok
490
	cmp	[error_line],0
491
	jne	initial_ss_ok
492
	mov	eax,[current_line]
493
	mov	[error_line],eax
494
	mov	[error],invalid_address
495
      initial_ss_ok:
31 halyavin 496
	mov	edx,[additional_memory]
157 heavyiron 497
	mov	[edx+0Eh],ax
498
	lods	byte [esi]
499
	cmp	al,':'
500
	jne	invalid_argument
501
	lods	byte [esi]
502
	cmp	al,'('
503
	jne	invalid_argument
504
	call	get_word_value
505
	cmp	[value_type],0
506
	jne	invalid_use_of_symbol
507
	mov	edx,[additional_memory]
508
	mov	[edx+10h],ax
509
	bts	[format_flags],4
510
	jmp	instruction_assembled
511
mz_heap:
31 halyavin 512
	cmp	[output_format],2
157 heavyiron 513
	jne	illegal_instruction
514
	lods	byte [esi]
515
	call	get_size_operator
516
	cmp	ah,1
517
	je	invalid_value
518
	cmp	ah,2
519
	ja	invalid_value
520
	cmp	al,'('
521
	jne	invalid_argument
522
	call	get_word_value
523
	cmp	[value_type],0
524
	jne	invalid_use_of_symbol
525
	mov	edx,[additional_memory]
526
	mov	[edx+0Ch],ax
527
	jmp	instruction_assembled
528
write_mz_header:
31 halyavin 529
	mov	edx,[additional_memory]
157 heavyiron 530
	bt	[format_flags],4
531
	jc	mz_stack_ok
532
	mov	eax,[real_code_size]
533
	dec	eax
534
	shr	eax,4
535
	inc	eax
536
	mov	[edx+0Eh],ax
537
	shl	eax,4
538
	movzx	ecx,word [edx+10h]
539
	add	eax,ecx
540
	mov	[real_code_size],eax
541
      mz_stack_ok:
31 halyavin 542
	mov	edi,[free_additional_memory]
157 heavyiron 543
	mov	eax,[number_of_relocations]
544
	shl	eax,2
545
	add	eax,1Ch
546
	sub	edi,eax
547
	xchg	edi,[free_additional_memory]
548
	mov	ecx,0Fh
549
	add	eax,0Fh
550
	and	eax,1111b
551
	sub	ecx,eax
552
	xor	al,al
553
	rep	stos byte [edi]
554
	sub	edi,[free_additional_memory]
555
	mov	ecx,edi
556
	shr	edi,4
557
	mov	word [edx],'MZ' 	; signature
558
	mov	[edx+8],di		; header size in paragraphs
559
	mov	eax,[number_of_relocations]
560
	mov	[edx+6],ax		; number of relocation entries
561
	mov	eax,[code_size]
562
	add	eax,ecx
563
	mov	esi,eax
564
	shr	esi,9
565
	and	eax,1FFh
566
	inc	si
567
	or	ax,ax
568
	jnz	mz_size_ok
569
	mov	ax,200h
570
	dec	si
571
      mz_size_ok:
31 halyavin 572
	mov	[edx+2],ax		; number of bytes in last page
157 heavyiron 573
	mov	[edx+4],si		; number of pages
574
	mov	eax,[real_code_size]
575
	dec	eax
576
	shr	eax,4
577
	inc	eax
578
	mov	esi,[code_size]
579
	dec	esi
580
	shr	esi,4
581
	inc	esi
582
	sub	eax,esi
583
	mov	[edx+0Ah],ax		; minimum memory in addition to code
584
	add	[edx+0Ch],ax		; maximum memory in addition to code
585
	salc
586
	mov	ah,al
587
	or	[edx+0Ch],ax
588
	mov	word [edx+18h],1Ch	; offset of relocation table
589
	add	[written_size],ecx
590
	call	write
591
	jc	write_failed
592
	ret
593
31 halyavin 594
 
595
	mov	[stub_file],edx
157 heavyiron 596
	or	edx,edx
597
	jnz	stub_from_file
598
	push	esi
599
	mov	edx,edi
600
	xor	eax,eax
601
	mov	ecx,20h
602
	rep	stos dword [edi]
603
	mov	eax,40h+default_stub_end-default_stub
604
	mov	cx,100h+default_stub_end-default_stub
605
	mov	word [edx],'MZ'
606
	mov	word [edx+4],1
607
	mov	word [edx+2],ax
608
	mov	word [edx+8],4
609
	mov	word [edx+0Ah],10h
610
	mov	word [edx+0Ch],0FFFFh
611
	mov	word [edx+10h],cx
612
	mov	word [edx+3Ch],ax
613
	mov	word [edx+18h],40h
614
	lea	edi,[edx+40h]
615
	mov	esi,default_stub
616
	mov	ecx,default_stub_end-default_stub
617
	rep	movs byte [edi],[esi]
618
	pop	esi
619
	jmp	stub_ok
620
      default_stub:
31 halyavin 621
	use16
157 heavyiron 622
	push	cs
623
	pop	ds
624
	mov	dx,stub_message-default_stub
625
	mov	ah,9
626
	int	21h
627
	mov	ax,4C01h
628
	int	21h
629
      stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h
31 halyavin 630
	rq	1
157 heavyiron 631
      default_stub_end:
31 halyavin 632
	use32
157 heavyiron 633
      stub_from_file:
31 halyavin 634
	push	esi
157 heavyiron 635
	mov	esi,edx
636
	call	open_binary_file
637
	mov	edx,edi
638
	mov	ecx,1Ch
639
	mov	esi,edx
640
	call	read
641
	jc	binary_stub
642
	cmp	word [esi],'MZ'
643
	jne	binary_stub
644
	add	edi,1Ch
645
	movzx	ecx,word [esi+6]
646
	add	ecx,11b
647
	and	ecx,not 11b
648
	add	ecx,(40h-1Ch) shr 2
649
	lea	eax,[edi+ecx*4]
650
	cmp	edi,[display_buffer]
651
	jae	out_of_memory
652
	xor	eax,eax
653
	rep	stos dword [edi]
654
	mov	edx,40h
655
	xchg	dx,[esi+18h]
656
	xor	al,al
657
	call	lseek
658
	movzx	ecx,word [esi+6]
659
	shl	ecx,2
660
	lea	edx,[esi+40h]
661
	call	read
662
	mov	edx,edi
663
	sub	edx,esi
664
	shr	edx,4
665
	xchg	dx,[esi+8]
666
	shl	edx,4
667
	xor	al,al
668
	call	lseek
669
	movzx	ecx,word [esi+4]
670
	dec	ecx
671
	shl	ecx,9
672
	movzx	edx,word [esi+2]
673
	add	ecx,edx
674
	mov	edx,edi
675
	sub	ecx,eax
676
	je	read_stub_code
677
	jb	stub_code_ok
678
	push	ecx
679
	dec	ecx
680
	shr	ecx,3
681
	inc	ecx
682
	shl	ecx,1
683
	lea	eax,[edi+ecx*4]
684
	cmp	eax,[display_buffer]
685
	jae	out_of_memory
686
	xor	eax,eax
687
	rep	stos dword [edi]
688
	pop	ecx
689
     read_stub_code:
31 halyavin 690
	call	read
157 heavyiron 691
     stub_code_ok:
31 halyavin 692
	call	close
157 heavyiron 693
	mov	edx,edi
694
	sub	edx,esi
695
	mov	ax,dx
696
	and	ax,1FFh
697
	mov	[esi+2],ax
698
	dec	edx
699
	shr	edx,9
700
	inc	edx
701
	mov	[esi+4],dx
702
	mov	eax,edi
703
	sub	eax,esi
704
	mov	[esi+3Ch],eax
705
	pop	esi
706
      stub_ok:
31 halyavin 707
	ret
157 heavyiron 708
      binary_stub:
31 halyavin 709
	mov	esi,edi
157 heavyiron 710
	mov	ecx,40h shr 2
711
	xor	eax,eax
712
	rep	stos dword [edi]
713
	mov	al,2
714
	xor	edx,edx
715
	call	lseek
716
	push	eax
717
	xor	al,al
718
	xor	edx,edx
719
	call	lseek
720
	mov	ecx,[esp]
721
	add	ecx,40h+111b
722
	and	ecx,not 111b
723
	mov	ax,cx
724
	and	ax,1FFh
725
	mov	[esi+2],ax
726
	lea	eax,[ecx+1FFh]
727
	shr	eax,9
728
	mov	[esi+4],ax
729
	mov	[esi+3Ch],ecx
730
	sub	ecx,40h
731
	mov	eax,10000h
732
	sub	eax,ecx
733
	jbe	binary_heap_ok
734
	shr	eax,4
735
	mov	[esi+0Ah],ax
736
      binary_heap_ok:
31 halyavin 737
	mov	word [esi],'MZ'
157 heavyiron 738
	mov	word [esi+8],4
739
	mov	ax,0FFFFh
740
	mov	[esi+0Ch],ax
741
	dec	ax
742
	mov	[esi+10h],ax
743
	sub	ax,0Eh
744
	mov	[esi+0Eh],ax
745
	mov	[esi+16h],ax
746
	mov	word [esi+14h],100h
747
	mov	word [esi+18h],40h
748
	mov	eax,[display_buffer]
749
	sub	eax,ecx
750
	cmp	edi,eax
751
	jae	out_of_memory
752
	mov	edx,edi
753
	shr	ecx,2
754
	xor	eax,eax
755
	rep	stos dword [edi]
756
	pop	ecx
757
	call	read
758
	call	close
759
	pop	esi
760
	ret
761
31 halyavin 762
 
763
	xor	edx,edx
157 heavyiron 764
	mov	[machine],14Ch
765
	mov	[subsystem],3
766
	mov	[subsystem_version],3 + 10 shl 16
767
	mov	[image_base],400000h
768
	test	[format_flags],8
769
	jz	pe_settings
770
	mov	[machine],8664h
771
	mov	[subsystem_version],5 + 0 shl 16
772
	mov	[image_base_high],0
773
      pe_settings:
31 halyavin 774
	cmp	byte [esi],84h
157 heavyiron 775
	je	get_stub_name
776
	cmp	byte [esi],80h
777
	je	get_pe_base
778
	cmp	byte [esi],1Bh
779
	jne	pe_settings_ok
780
	lods	byte [esi]
781
	lods	byte [esi]
782
	test	al,80h+40h
783
	jz	subsystem_setting
784
	cmp	al,80h
785
	je	dll_flag
786
	cmp	al,81h
787
	je	wdm_flag
788
	jmp	pe_settings
789
      dll_flag:
31 halyavin 790
	bts	[format_flags],8
157 heavyiron 791
	jc	setting_already_specified
792
	jmp	pe_settings
793
      wdm_flag:
31 halyavin 794
	bts	[format_flags],9
157 heavyiron 795
	jc	setting_already_specified
796
	jmp	pe_settings
797
      subsystem_setting:
31 halyavin 798
	bts	[format_flags],7
157 heavyiron 799
	jc	setting_already_specified
800
	and	ax,3Fh
801
	mov	[subsystem],ax
802
	cmp	byte [esi],'('
803
	jne	pe_settings
804
	inc	esi
805
	cmp	byte [esi],'.'
806
	jne	invalid_value
807
	inc	esi
808
	push	edx
809
	cmp	byte [esi+11],0
810
	jne	invalid_value
811
	cmp	byte [esi+10],2
812
	ja	invalid_value
813
	mov	dx,[esi+8]
814
	cmp	dx,8000h
815
	je	zero_version
816
	mov	eax,[esi+4]
817
	cmp	dx,7
818
	jg	invalid_value
819
	mov	cx,7
820
	sub	cx,dx
821
	mov	eax,[esi+4]
822
	shr	eax,cl
823
	mov	ebx,eax
824
	shr	ebx,24
825
	cmp	bl,100
826
	jae	invalid_value
827
	and	eax,0FFFFFFh
828
	mov	ecx,100
829
	mul	ecx
830
	shrd	eax,edx,24
831
	jnc	version_value_ok
832
	inc	eax
833
      version_value_ok:
31 halyavin 834
	shl	eax,16
157 heavyiron 835
	mov	ax,bx
836
	jmp	subsystem_version_ok
837
      zero_version:
31 halyavin 838
	xor	eax,eax
157 heavyiron 839
      subsystem_version_ok:
31 halyavin 840
	pop	edx
157 heavyiron 841
	add	esi,13
842
	mov	[subsystem_version],eax
843
	jmp	pe_settings
844
      get_pe_base:
31 halyavin 845
	bts	[format_flags],10
157 heavyiron 846
	jc	setting_already_specified
847
	lods	word [esi]
848
	cmp	ah,'('
849
	jne	invalid_argument
850
	cmp	byte [esi],'.'
851
	je	invalid_value
852
	push	edx edi
853
	add	edi,[stub_size]
854
	test	[format_flags],8
855
	jnz	get_pe64_base
856
	call	get_dword_value
857
	mov	[image_base],eax
858
	jmp	pe_base_ok
859
      get_pe64_base:
31 halyavin 860
	call	get_qword_value
157 heavyiron 861
	mov	[image_base],eax
862
	mov	[image_base_high],edx
863
      pe_base_ok:
31 halyavin 864
	pop	edi edx
157 heavyiron 865
	cmp	[value_type],0
866
	jne	invalid_use_of_symbol
867
	cmp	byte [esi],84h
868
	jne	pe_settings_ok
869
      get_stub_name:
31 halyavin 870
	lods	byte [esi]
157 heavyiron 871
	lods	word [esi]
872
	cmp	ax,'('
873
	jne	invalid_argument
874
	lods	dword [esi]
875
	mov	edx,esi
876
	add	esi,eax
877
	inc	esi
878
      pe_settings_ok:
31 halyavin 879
	mov	ebp,[stub_size]
157 heavyiron 880
	or	ebp,ebp
881
	jz	make_pe_stub
882
	cmp	edx,[stub_file]
883
	je	pe_stub_ok
884
	sub	edi,[stub_size]
885
	mov	[code_start],edi
886
      make_pe_stub:
31 halyavin 887
	call	make_stub
157 heavyiron 888
	mov	eax,edi
889
	sub	eax,[code_start]
890
	mov	[stub_size],eax
891
	mov	[code_start],edi
892
	mov	ebp,eax
893
      pe_stub_ok:
31 halyavin 894
	mov	edx,edi
157 heavyiron 895
	mov	ecx,18h+0E0h
896
	test	[format_flags],8
897
	jz	zero_pe_header
898
	add	ecx,10h
899
      zero_pe_header:
31 halyavin 900
	add	ebp,ecx
157 heavyiron 901
	shr	ecx,2
902
	xor	eax,eax
903
	rep	stos dword [edi]
904
	mov	word [edx],'PE' 	; signature
905
	mov	ax,[machine]
906
	mov	word [edx+4],ax
907
	mov	dword [edx+38h],1000h	; section alignment
908
	mov	dword [edx+3Ch],200h	; file alignment
909
	mov	word [edx+40h],1	; OS version
910
	mov	eax,[subsystem_version]
911
	mov	[edx+48h],eax
912
	mov	ax,[subsystem]
913
	mov	[edx+5Ch],ax
914
	cmp	ax,1
915
	jne	pe_alignment_ok
916
	mov	eax,20h
917
	mov	dword [edx+38h],eax
918
	mov	dword [edx+3Ch],eax
919
      pe_alignment_ok:
31 halyavin 920
	mov	word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8
157 heavyiron 921
	test	[format_flags],8
922
	jnz	init_pe64_specific
923
	mov	dword [edx+14h],0E0h	; size of optional header
924
	mov	dword [edx+16h],10B010Eh; flags and magic value
925
	mov	eax,[image_base]
926
	mov	dword [edx+34h],eax
927
	mov	dword [edx+60h],1000h	; stack reserve
928
	mov	dword [edx+64h],1000h	; stack commit
929
	mov	dword [edx+68h],10000h	; heap reserve
930
	mov	dword [edx+6Ch],0	; heap commit
931
	mov	dword [edx+74h],16	; number of directories
932
	jmp	pe_header_ok
933
      init_pe64_specific:
31 halyavin 934
	mov	dword [edx+14h],0F0h	; size of optional header
157 heavyiron 935
	mov	dword [edx+16h],20B002Eh; flags and magic value
936
	mov	eax,[image_base]
937
	mov	dword [edx+30h],eax
938
	mov	eax,[image_base_high]
939
	mov	dword [edx+34h],eax
940
	mov	dword [edx+60h],1000h	; stack reserve
941
	mov	dword [edx+68h],1000h	; stack commit
942
	mov	dword [edx+70h],10000h	; heap reserve
943
	mov	dword [edx+78h],0	; heap commit
944
	mov	dword [edx+84h],16	; number of directories
945
      pe_header_ok:
31 halyavin 946
	bsf	ecx,[edx+3Ch]
157 heavyiron 947
	imul	ebx,[number_of_sections],28h
948
	or	ebx,ebx
949
	jnz	reserve_space_for_section_headers
950
	mov	ebx,28h
951
      reserve_space_for_section_headers:
31 halyavin 952
	add	ebx,ebp
157 heavyiron 953
	dec	ebx
954
	shr	ebx,cl
955
	inc	ebx
956
	shl	ebx,cl
957
	sub	ebx,ebp
958
	mov	ecx,ebx
959
	mov	eax,[display_buffer]
960
	sub	eax,ecx
961
	cmp	edi,eax
962
	jae	out_of_memory
963
	shr	ecx,2
964
	xor	eax,eax
965
	rep	stos dword [edi]
966
	mov	eax,edi
967
	sub	eax,[code_start]
968
	add	eax,[stub_size]
969
	mov	[edx+54h],eax		; size of headers
970
	mov	ecx,[edx+38h]
971
	dec	ecx
972
	add	eax,ecx
973
	not	ecx
974
	and	eax,ecx
975
	bt	[format_flags],8
976
	jc	pe_entry_init_ok
977
	mov	[edx+28h],eax		; entry point rva
978
      pe_entry_init_ok:
31 halyavin 979
	mov	[number_of_sections],0
157 heavyiron 980
	movzx	ebx,word [edx+14h]
981
	lea	ebx,[edx+18h+ebx]
982
	mov	[current_section],ebx
983
	mov	dword [ebx],'.fla'
984
	mov	dword [ebx+4],'t'
985
	mov	[ebx+14h],edi
986
	mov	[ebx+0Ch],eax
987
	mov	dword [ebx+24h],0E0000060h
988
	xor	ecx,ecx
989
	not	eax
990
	not	ecx
991
	add	eax,1
992
	adc	ecx,0
993
	add	eax,edi
994
	adc	ecx,0
995
	test	[format_flags],8
996
	jnz	pe64_org
997
	sub	eax,[edx+34h]
998
	sbb	ecx,0
999
	mov	bl,2
1000
	mov	[code_type],32
1001
	jmp	pe_org_ok
1002
      pe64_org:
31 halyavin 1003
	sub	eax,[edx+30h]
157 heavyiron 1004
	sbb	ecx,[edx+34h]
1005
	mov	bl,4
1006
	mov	[code_type],64
1007
      pe_org_ok:
31 halyavin 1008
	bt	[resolver_flags],0
157 heavyiron 1009
	jc	pe_labels_type_ok
1010
	xor	bl,bl
1011
      pe_labels_type_ok:
109 heavyiron 1012
	mov	[labels_type],bl
157 heavyiron 1013
	mov	dword [org_origin],eax
1014
	mov	dword [org_origin+4],ecx
1015
	mov	[org_registers],0
1016
	mov	[org_start],edi
1017
	bt	[format_flags],8
1018
	jnc	dll_flag_ok
1019
	or	dword [edx+16h],2000h
1020
      dll_flag_ok:
31 halyavin 1021
	bt	[format_flags],9
157 heavyiron 1022
	jnc	wdm_flag_ok
1023
	or	word [edx+5Eh],2000h
1024
      wdm_flag_ok:
31 halyavin 1025
	jmp	instruction_assembled
157 heavyiron 1026
pe_section:
31 halyavin 1027
	call	close_pe_section
157 heavyiron 1028
	bts	[format_flags],5
1029
	lea	ecx,[ebx+28h]
1030
	add	edx,[edx+54h]
1031
	sub	edx,[stub_size]
1032
	cmp	ecx,edx
1033
	jbe	new_section
1034
	lea	ebx,[edx-28h]
1035
	or	[next_pass_needed],-1
1036
	push	edi
1037
	mov	edi,ebx
1038
	mov	ecx,28h shr 4
1039
	xor	eax,eax
1040
	rep	stos dword [edi]
1041
	pop	edi
1042
      new_section:
31 halyavin 1043
	mov	[ebx+0Ch],eax
157 heavyiron 1044
	lods	word [esi]
1045
	cmp	ax,'('
1046
	jne	invalid_argument
1047
	lea	edx,[esi+4]
1048
	mov	ecx,[esi]
1049
	lea	esi,[esi+4+ecx+1]
1050
	cmp	ecx,8
1051
	ja	name_too_long
1052
	xor	eax,eax
1053
	mov	[ebx],eax
1054
	mov	[ebx+4],eax
1055
	push	esi edi
1056
	mov	edi,ebx
1057
	mov	esi,edx
1058
	rep	movs byte [edi],[esi]
1059
	pop	edi esi
1060
	mov	dword [ebx+24h],0
1061
	mov	[ebx+14h],edi
1062
	mov	edx,[code_start]
1063
	mov	eax,edi
1064
	xor	ecx,ecx
1065
	sub	eax,[ebx+0Ch]
1066
	sbb	ecx,0
1067
	test	[format_flags],8
1068
	jnz	pe64_section_org
1069
	sub	eax,[edx+34h]
1070
	sbb	ecx,0
1071
	mov	[labels_type],2
1072
	mov	[code_type],32
1073
	bt	[resolver_flags],0
1074
	jc	pe_section_org_ok
1075
	mov	[labels_type],0
1076
	jmp	pe_section_org_ok
1077
      pe64_section_org:
31 halyavin 1078
	sub	eax,[edx+30h]
157 heavyiron 1079
	sbb	ecx,[edx+34h]
1080
	mov	[labels_type],4
1081
	mov	[code_type],64
1082
	bt	[resolver_flags],0
1083
	jc	pe_section_org_ok
1084
	mov	[labels_type],0
1085
      pe_section_org_ok:
31 halyavin 1086
	mov	dword [org_origin],eax
157 heavyiron 1087
	mov	dword [org_origin+4],ecx
1088
	mov	[org_registers],0
1089
	mov	[org_start],edi
1090
      get_section_flags:
31 halyavin 1091
	lods	byte [esi]
157 heavyiron 1092
	cmp	al,1Ah
1093
	je	set_directory
1094
	cmp	al,19h
1095
	je	section_flag
1096
	dec	esi
1097
	jmp	instruction_assembled
1098
      set_directory:
31 halyavin 1099
	movzx	eax,byte [esi]
157 heavyiron 1100
	inc	esi
1101
	mov	ecx,ebx
1102
	test	[format_flags],8
1103
	jnz	pe64_directory
1104
	xchg	ecx,[edx+78h+eax*8]
1105
	mov	dword [edx+78h+eax*8+4],-1
1106
	jmp	pe_directory_set
1107
      pe64_directory:
31 halyavin 1108
	xchg	ecx,[edx+88h+eax*8]
157 heavyiron 1109
	mov	dword [edx+88h+eax*8+4],-1
1110
      pe_directory_set:
31 halyavin 1111
	or	ecx,ecx
157 heavyiron 1112
	jnz	data_already_defined
1113
	push	ebx edx
1114
	call	generate_pe_data
1115
	pop	edx ebx
1116
	jmp	get_section_flags
1117
      section_flag:
31 halyavin 1118
	lods	byte [esi]
157 heavyiron 1119
	cmp	al,9
1120
	je	invalid_argument
1121
	cmp	al,11
1122
	je	invalid_argument
1123
	mov	cl,al
1124
	mov	eax,1
1125
	shl	eax,cl
1126
	test	dword [ebx+24h],eax
1127
	jnz	setting_already_specified
1128
	or	dword [ebx+24h],eax
1129
	jmp	get_section_flags
1130
      close_pe_section:
31 halyavin 1131
	mov	ebx,[current_section]
157 heavyiron 1132
	mov	edx,[code_start]
1133
	mov	eax,edi
1134
	sub	eax,[ebx+14h]
1135
	jnz	finish_section
1136
	bt	[format_flags],5
1137
	jc	finish_section
1138
	mov	eax,[ebx+0Ch]
1139
	ret
1140
      finish_section:
31 halyavin 1141
	mov	[ebx+8],eax
157 heavyiron 1142
	cmp	edi,[undefined_data_end]
1143
	jne	align_section
1144
	cmp	dword [edx+38h],1000h
1145
	jb	align_section
1146
	mov	edi,[undefined_data_start]
1147
      align_section:
31 halyavin 1148
	mov	[undefined_data_end],0
157 heavyiron 1149
	mov	ebp,edi
1150
	sub	ebp,[ebx+14h]
1151
	mov	ecx,[edx+3Ch]
1152
	dec	ecx
1153
	lea	eax,[ebp+ecx]
1154
	not	ecx
1155
	and	eax,ecx
1156
	mov	[ebx+10h],eax
1157
	sub	eax,ebp
1158
	mov	ecx,eax
1159
	xor	al,al
1160
	rep	stos byte [edi]
1161
	mov	eax,[code_start]
1162
	sub	eax,[stub_size]
1163
	sub	[ebx+14h],eax
1164
	mov	eax,[ebx+8]
1165
	or	eax,eax
1166
	jz	udata_ok
1167
	cmp	dword [ebx+10h],0
1168
	jne	udata_ok
1169
	or	byte [ebx+24h],80h
1170
      udata_ok:
31 halyavin 1171
	mov	ecx,[edx+38h]
157 heavyiron 1172
	dec	ecx
1173
	add	eax,ecx
1174
	not	ecx
1175
	and	eax,ecx
1176
	add	eax,[ebx+0Ch]
1177
	add	ebx,28h
1178
	mov	[current_section],ebx
1179
	inc	word [number_of_sections]
1180
	jz	format_limitations_exceeded
1181
	ret
1182
data_directive:
31 halyavin 1183
	cmp	[output_format],3
157 heavyiron 1184
	jne	illegal_instruction
1185
	lods	byte [esi]
1186
	cmp	al,1Ah
1187
	je	predefined_data_type
1188
	cmp	al,'('
1189
	jne	invalid_argument
1190
	call	get_byte_value
1191
	cmp	al,16
1192
	jb	data_type_ok
1193
	jmp	invalid_value
1194
      predefined_data_type:
31 halyavin 1195
	movzx	eax,byte [esi]
157 heavyiron 1196
	inc	esi
1197
      data_type_ok:
31 halyavin 1198
	mov	ebx,[current_section]
157 heavyiron 1199
	mov	ecx,edi
1200
	sub	ecx,[ebx+14h]
1201
	add	ecx,[ebx+0Ch]
1202
	mov	edx,[code_start]
1203
	test	[format_flags],8
1204
	jnz	pe64_data
1205
	xchg	ecx,[edx+78h+eax*8]
1206
	jmp	init_pe_data
1207
      pe64_data:
31 halyavin 1208
	xchg	ecx,[edx+88h+eax*8]
157 heavyiron 1209
      init_pe_data:
31 halyavin 1210
	or	ecx,ecx
157 heavyiron 1211
	jnz	data_already_defined
1212
	call	allocate_structure_data
1213
	mov	word [ebx],data_directive-assembler
1214
	mov	[ebx+2],al
1215
	mov	edx,[current_line]
1216
	mov	[ebx+4],edx
1217
	call	generate_pe_data
1218
	jmp	instruction_assembled
1219
      end_data:
31 halyavin 1220
	cmp	[output_format],3
157 heavyiron 1221
	jne	illegal_instruction
1222
	call	find_structure_data
1223
	jc	unexpected_instruction
1224
	movzx	eax,byte [ebx+2]
1225
	mov	edx,[current_section]
1226
	mov	ecx,edi
1227
	sub	ecx,[edx+14h]
1228
	add	ecx,[edx+0Ch]
1229
	mov	edx,[code_start]
1230
	test	[format_flags],8
1231
	jnz	end_pe64_data
1232
	sub	ecx,[edx+78h+eax*8]
1233
	mov	[edx+78h+eax*8+4],ecx
1234
	jmp	remove_structure_data
1235
      end_pe64_data:
31 halyavin 1236
	sub	ecx,[edx+88h+eax*8]
157 heavyiron 1237
	mov	[edx+88h+eax*8+4],ecx
1238
	jmp	remove_structure_data
1239
pe_entry:
31 halyavin 1240
	lods	byte [esi]
157 heavyiron 1241
	cmp	al,'('
1242
	jne	invalid_argument
1243
	cmp	byte [esi],'.'
1244
	je	invalid_value
1245
	test	[format_flags],8
1246
	jnz	pe64_entry
1247
	call	get_dword_value
1248
	mov	bl,2
1249
	bt	[resolver_flags],0
1250
	jc	check_pe_entry_label_type
1251
	xor	bl,bl
1252
      check_pe_entry_label_type:
109 heavyiron 1253
	cmp	[value_type],bl
157 heavyiron 1254
	je	pe_entry_ok
1255
	cmp	[error_line],0
1256
	jne	pe_entry_ok
1257
	mov	edx,[current_line]
1258
	mov	[error_line],edx
1259
	mov	[error],invalid_address
1260
      pe_entry_ok:
31 halyavin 1261
	mov	edx,[code_start]
157 heavyiron 1262
	sub	eax,[edx+34h]
1263
	mov	[edx+28h],eax
1264
	jmp	instruction_assembled
1265
      pe64_entry:
31 halyavin 1266
	call	get_qword_value
157 heavyiron 1267
	mov	bl,4
1268
	bt	[resolver_flags],0
1269
	jc	check_pe64_entry_label_type
1270
	xor	bl,bl
1271
      check_pe64_entry_label_type:
109 heavyiron 1272
	cmp	[value_type],bl
157 heavyiron 1273
	je	pe64_entry_type_ok
1274
	cmp	[error_line],0
1275
	jne	pe64_entry_type_ok
1276
	mov	edx,[current_line]
1277
	mov	[error_line],edx
1278
	mov	[error],invalid_address
1279
      pe64_entry_type_ok:
109 heavyiron 1280
	mov	ecx,[code_start]
157 heavyiron 1281
	sub	eax,[ecx+30h]
1282
	sbb	edx,[ecx+34h]
1283
	jz	pe64_entry_range_ok
1284
	mov	edx,[current_line]
1285
	mov	[error_line],edx
1286
	mov	[error],value_out_of_range
1287
      pe64_entry_range_ok:
109 heavyiron 1288
	mov	[ecx+28h],eax
157 heavyiron 1289
	jmp	instruction_assembled
1290
pe_stack:
31 halyavin 1291
	lods	byte [esi]
157 heavyiron 1292
	cmp	al,'('
1293
	jne	invalid_argument
1294
	cmp	byte [esi],'.'
1295
	je	invalid_value
1296
	test	[format_flags],8
1297
	jnz	pe64_stack
1298
	call	get_dword_value
1299
	cmp	[value_type],0
1300
	jne	invalid_use_of_symbol
1301
	mov	edx,[code_start]
1302
	mov	[edx+60h],eax
1303
	cmp	byte [esi],','
1304
	jne	default_stack_commit
1305
	lods	byte [esi]
1306
	lods	byte [esi]
1307
	cmp	al,'('
1308
	jne	invalid_argument
1309
	cmp	byte [esi],'.'
1310
	je	invalid_value
1311
	call	get_dword_value
1312
	cmp	[value_type],0
1313
	jne	invalid_use_of_symbol
1314
	mov	edx,[code_start]
1315
	mov	[edx+64h],eax
1316
	cmp	eax,[edx+60h]
1317
	ja	value_out_of_range
1318
	jmp	instruction_assembled
1319
      default_stack_commit:
31 halyavin 1320
	mov	dword [edx+64h],1000h
157 heavyiron 1321
	mov	eax,[edx+60h]
1322
	cmp	eax,1000h
1323
	ja	instruction_assembled
1324
	mov	dword [edx+64h],eax
1325
	jmp	instruction_assembled
1326
      pe64_stack:
31 halyavin 1327
	call	get_qword_value
157 heavyiron 1328
	cmp	[value_type],0
1329
	jne	invalid_use_of_symbol
1330
	mov	ecx,[code_start]
1331
	mov	[ecx+60h],eax
1332
	mov	[ecx+64h],edx
1333
	cmp	byte [esi],','
1334
	jne	default_pe64_stack_commit
1335
	lods	byte [esi]
1336
	lods	byte [esi]
1337
	cmp	al,'('
1338
	jne	invalid_argument
1339
	cmp	byte [esi],'.'
1340
	je	invalid_value
1341
	call	get_qword_value
1342
	cmp	[value_type],0
1343
	jne	invalid_use_of_symbol
1344
	mov	ecx,[code_start]
1345
	mov	[ecx+68h],eax
1346
	mov	[ecx+6Ch],edx
1347
	cmp	edx,[ecx+64h]
1348
	ja	value_out_of_range
1349
	jb	instruction_assembled
1350
	cmp	eax,[edx+60h]
1351
	ja	value_out_of_range
1352
	jmp	instruction_assembled
1353
      default_pe64_stack_commit:
31 halyavin 1354
	mov	dword [edx+68h],1000h
157 heavyiron 1355
	cmp	dword [edx+64h],0
1356
	jne	instruction_assembled
1357
	mov	eax,[edx+60h]
1358
	cmp	eax,1000h
1359
	ja	instruction_assembled
1360
	mov	dword [edx+68h],eax
1361
	jmp	instruction_assembled
1362
pe_heap:
31 halyavin 1363
	lods	byte [esi]
157 heavyiron 1364
	cmp	al,'('
1365
	jne	invalid_argument
1366
	cmp	byte [esi],'.'
1367
	je	invalid_value
1368
	test	[format_flags],8
1369
	jnz	pe64_heap
1370
	call	get_dword_value
1371
	cmp	[value_type],0
1372
	jne	invalid_use_of_symbol
1373
	mov	edx,[code_start]
1374
	mov	[edx+68h],eax
1375
	cmp	byte [esi],','
1376
	jne	instruction_assembled
1377
	lods	byte [esi]
1378
	lods	byte [esi]
1379
	cmp	al,'('
1380
	jne	invalid_argument
1381
	cmp	byte [esi],'.'
1382
	je	invalid_value
1383
	call	get_dword_value
1384
	cmp	[value_type],0
1385
	jne	invalid_use_of_symbol
1386
	mov	edx,[code_start]
1387
	mov	[edx+6Ch],eax
1388
	cmp	eax,[edx+68h]
1389
	ja	value_out_of_range
1390
	jmp	instruction_assembled
1391
      pe64_heap:
31 halyavin 1392
	call	get_qword_value
157 heavyiron 1393
	cmp	[value_type],0
1394
	jne	invalid_use_of_symbol
1395
	mov	ecx,[code_start]
1396
	mov	[ecx+70h],eax
1397
	mov	[ecx+74h],edx
1398
	cmp	byte [esi],','
1399
	jne	instruction_assembled
1400
	lods	byte [esi]
1401
	lods	byte [esi]
1402
	cmp	al,'('
1403
	jne	invalid_argument
1404
	cmp	byte [esi],'.'
1405
	je	invalid_value
1406
	call	get_qword_value
1407
	cmp	[value_type],0
1408
	jne	invalid_use_of_symbol
1409
	mov	ecx,[code_start]
1410
	mov	[ecx+78h],eax
1411
	mov	[ecx+7Ch],edx
1412
	cmp	edx,[ecx+74h]
1413
	ja	value_out_of_range
1414
	jb	instruction_assembled
1415
	cmp	eax,[edx+70h]
1416
	ja	value_out_of_range
1417
	jmp	instruction_assembled
1418
mark_pe_relocation:
31 halyavin 1419
	push	eax ebx
157 heavyiron 1420
	mov	al,2
1421
	test	[format_flags],8
1422
	jz	check_pe_relocation_type
1423
	mov	al,4
1424
      check_pe_relocation_type:
109 heavyiron 1425
	cmp	[value_type],al
157 heavyiron 1426
	je	pe_relocation_type_ok
1427
	cmp	[error_line],0
1428
	jne	pe_relocation_type_ok
1429
	mov	eax,[current_line]
1430
	mov	[error_line],eax
1431
	mov	[error],invalid_use_of_symbol
1432
      pe_relocation_type_ok:
109 heavyiron 1433
	mov	ebx,[current_section]
157 heavyiron 1434
	mov	eax,edi
1435
	sub	eax,[ebx+14h]
1436
	add	eax,[ebx+0Ch]
1437
	mov	ebx,[free_additional_memory]
1438
	inc	[number_of_relocations]
1439
	jz	invalid_use_of_symbol
1440
	mov	[ebx],eax
1441
	add	ebx,4
1442
	cmp	ebx,[structures_buffer]
1443
	jae	out_of_memory
1444
	mov	[free_additional_memory],ebx
1445
	pop	ebx eax
1446
	ret
1447
generate_pe_data:
31 halyavin 1448
	cmp	al,2
157 heavyiron 1449
	je	make_pe_resource
1450
	cmp	al,5
1451
	je	make_pe_fixups
1452
	ret
1453
make_pe_resource:
31 halyavin 1454
	cmp	byte [esi],82h
157 heavyiron 1455
	jne	resource_done
1456
	inc	esi
1457
	lods	word [esi]
1458
	cmp	ax,'('
1459
	jne	invalid_argument
1460
	lods	dword [esi]
1461
	mov	edx,esi
1462
	lea	esi,[esi+eax+1]
1463
	cmp	[next_pass_needed],0
1464
	je	resource_from_file
1465
	cmp	[current_pass],0
1466
	jne	reserve_space_for_resource
1467
	mov	[resource_size],0
1468
      reserve_space_for_resource:
31 halyavin 1469
	add	edi,[resource_size]
157 heavyiron 1470
	cmp	edi,[display_buffer]
1471
	ja	out_of_memory
1472
	jmp	resource_done
1473
      resource_from_file:
31 halyavin 1474
	push	esi
157 heavyiron 1475
	mov	esi,edx
1476
	call	open_binary_file
1477
	push	ebx
1478
	mov	esi,[free_additional_memory]
1479
	lea	eax,[esi+20h]
1480
	cmp	eax,[structures_buffer]
1481
	ja	out_of_memory
1482
	mov	edx,esi
1483
	mov	ecx,20h
1484
	call	read
1485
	jc	invalid_file_format
1486
	xor	eax,eax
1487
	cmp	[esi],eax
1488
	jne	invalid_file_format
1489
	mov	ax,0FFFFh
1490
	cmp	[esi+8],eax
1491
	jne	invalid_file_format
1492
	cmp	[esi+12],eax
1493
	jne	invalid_file_format
1494
	mov	eax,20h
1495
	cmp	[esi+4],eax
1496
	jne	invalid_file_format
1497
      read_resource_headers:
31 halyavin 1498
	test	eax,11b
157 heavyiron 1499
	jz	resource_file_alignment_ok
1500
	mov	edx,4
1501
	and	eax,11b
1502
	sub	edx,eax
1503
	mov	al,1
1504
	call	lseek
1505
      resource_file_alignment_ok:
31 halyavin 1506
	mov	[esi],eax
157 heavyiron 1507
	lea	edx,[esi+12]
1508
	mov	ecx,8
1509
	call	read
1510
	jc	resource_headers_ok
1511
	mov	ecx,[esi+16]
1512
	add	[esi],ecx
1513
	lea	edx,[esi+20]
1514
	sub	ecx,8
1515
	mov	[esi+16],ecx
1516
	lea	eax,[edx+ecx]
1517
	cmp	eax,[structures_buffer]
1518
	ja	out_of_memory
1519
	call	read
1520
	jc	invalid_file_format
1521
	mov	edx,[esi]
1522
	add	edx,[esi+12]
1523
	mov	eax,[esi+16]
1524
	lea	ecx,[esi+20]
1525
	lea	esi,[ecx+eax]
1526
	add	ecx,2
1527
	cmp	word [ecx-2],0FFFFh
1528
	je	resource_header_type_ok
1529
      check_resource_header_type:
31 halyavin 1530
	cmp	ecx,esi
157 heavyiron 1531
	jae	invalid_file_format
1532
	cmp	word [ecx],0
1533
	je	resource_header_type_ok
1534
	add	ecx,2
1535
	jmp	check_resource_header_type
1536
      resource_header_type_ok:
31 halyavin 1537
	add	ecx,2
157 heavyiron 1538
	cmp	word [ecx],0FFFFh
1539
	je	resource_header_name_ok
1540
      check_resource_header_name:
31 halyavin 1541
	cmp	ecx,esi
157 heavyiron 1542
	jae	invalid_file_format
1543
	cmp	word [ecx],0
1544
	je	resource_header_name_ok
1545
	add	ecx,2
1546
	jmp	check_resource_header_name
1547
      resource_header_name_ok:
31 halyavin 1548
	xor	al,al
157 heavyiron 1549
	call	lseek
1550
	jmp	read_resource_headers
1551
      resource_headers_ok:
31 halyavin 1552
	xor	eax,eax
157 heavyiron 1553
	mov	[esi],eax
1554
	mov	[resource_data],edi
1555
	lea	eax,[edi+16]
1556
	cmp	eax,[display_buffer]
1557
	jae	out_of_memory
1558
	xor	eax,eax
1559
	stos	dword [edi]
1560
	call	make_timestamp
1561
	stos	dword [edi]
1562
	xor	eax,eax
1563
	stos	dword [edi]
1564
	stos	dword [edi]
1565
	xor	ebx,ebx
1566
      make_type_name_directory:
31 halyavin 1567
	mov	esi,[free_additional_memory]
157 heavyiron 1568
	xor	edx,edx
1569
      find_type_name:
31 halyavin 1570
	cmp	dword [esi],0
157 heavyiron 1571
	je	type_name_ok
1572
	add	esi,20
1573
	cmp	word [esi],0FFFFh
1574
	je	check_next_type_name
1575
	or	ebx,ebx
1576
	jz	check_this_type_name
1577
	xor	ecx,ecx
1578
      compare_with_previous_type_name:
31 halyavin 1579
	mov	ax,[esi+ecx]
157 heavyiron 1580
	cmp	ax,[ebx+ecx]
1581
	ja	check_this_type_name
1582
	jb	check_next_type_name
1583
	add	ecx,2
1584
	mov	ax,[esi+ecx]
1585
	or	ax,[ebx+ecx]
1586
	jnz	compare_with_previous_type_name
1587
	jmp	check_next_type_name
1588
      check_this_type_name:
31 halyavin 1589
	or	edx,edx
157 heavyiron 1590
	jz	type_name_found
1591
	xor	ecx,ecx
1592
      compare_with_current_type_name:
31 halyavin 1593
	mov	ax,[esi+ecx]
157 heavyiron 1594
	cmp	ax,[edx+ecx]
1595
	ja	check_next_type_name
1596
	jb	type_name_found
1597
	add	ecx,2
1598
	mov	ax,[esi+ecx]
1599
	or	ax,[edx+ecx]
1600
	jnz	compare_with_current_type_name
1601
	jmp	same_type_name
1602
      type_name_found:
31 halyavin 1603
	mov	edx,esi
157 heavyiron 1604
      same_type_name:
31 halyavin 1605
	mov	[esi-16],edi
157 heavyiron 1606
      check_next_type_name:
31 halyavin 1607
	mov	eax,[esi-4]
157 heavyiron 1608
	add	esi,eax
1609
	jmp	find_type_name
1610
      type_name_ok:
31 halyavin 1611
	or	edx,edx
157 heavyiron 1612
	jz	type_name_directory_done
1613
	mov	ebx,edx
1614
      make_type_name_entry:
31 halyavin 1615
	mov	eax,[resource_data]
157 heavyiron 1616
	inc	word [eax+12]
1617
	lea	eax,[edi+8]
1618
	cmp	eax,[display_buffer]
1619
	jae	out_of_memory
1620
	mov	eax,ebx
1621
	stos	dword [edi]
1622
	xor	eax,eax
1623
	stos	dword [edi]
1624
	jmp	make_type_name_directory
1625
      type_name_directory_done:
31 halyavin 1626
	mov	ebx,-1
157 heavyiron 1627
      make_type_id_directory:
31 halyavin 1628
	mov	esi,[free_additional_memory]
157 heavyiron 1629
	mov	edx,10000h
1630
      find_type_id:
31 halyavin 1631
	cmp	dword [esi],0
157 heavyiron 1632
	je	type_id_ok
1633
	add	esi,20
1634
	cmp	word [esi],0FFFFh
1635
	jne	check_next_type_id
1636
	movzx	eax,word [esi+2]
1637
	cmp	eax,ebx
1638
	jle	check_next_type_id
1639
	cmp	eax,edx
1640
	jg	check_next_type_id
1641
	mov	edx,eax
1642
	mov	[esi-16],edi
1643
      check_next_type_id:
31 halyavin 1644
	mov	eax,[esi-4]
157 heavyiron 1645
	add	esi,eax
1646
	jmp	find_type_id
1647
      type_id_ok:
31 halyavin 1648
	cmp	edx,10000h
157 heavyiron 1649
	je	type_id_directory_done
1650
	mov	ebx,edx
1651
      make_type_id_entry:
31 halyavin 1652
	mov	eax,[resource_data]
157 heavyiron 1653
	inc	word [eax+14]
1654
	lea	eax,[edi+8]
1655
	cmp	eax,[display_buffer]
1656
	jae	out_of_memory
1657
	mov	eax,ebx
1658
	stos	dword [edi]
1659
	xor	eax,eax
1660
	stos	dword [edi]
1661
	jmp	make_type_id_directory
1662
      type_id_directory_done:
31 halyavin 1663
	mov	esi,[resource_data]
157 heavyiron 1664
	add	esi,10h
1665
	mov	ecx,[esi-4]
1666
	or	cx,cx
1667
	jz	resource_directories_ok
1668
      make_resource_directories:
31 halyavin 1669
	push	ecx
157 heavyiron 1670
	push	edi
1671
	mov	edx,edi
1672
	sub	edx,[resource_data]
1673
	bts	edx,31
1674
	mov	[esi+4],edx
1675
	lea	eax,[edi+16]
1676
	cmp	eax,[display_buffer]
1677
	jae	out_of_memory
1678
	xor	eax,eax
1679
	stos	dword [edi]
1680
	call	make_timestamp
1681
	stos	dword [edi]
1682
	xor	eax,eax
1683
	stos	dword [edi]
1684
	stos	dword [edi]
1685
	mov	ebp,esi
1686
	xor	ebx,ebx
1687
      make_resource_name_directory:
31 halyavin 1688
	mov	esi,[free_additional_memory]
157 heavyiron 1689
	xor	edx,edx
1690
      find_resource_name:
31 halyavin 1691
	cmp	dword [esi],0
157 heavyiron 1692
	je	resource_name_ok
1693
	push	esi
1694
	cmp	[esi+4],ebp
1695
	jne	check_next_resource_name
1696
	add	esi,20
1697
	call	skip_resource_name
1698
	cmp	word [esi],0FFFFh
1699
	je	check_next_resource_name
1700
	or	ebx,ebx
1701
	jz	check_this_resource_name
1702
	xor	ecx,ecx
1703
      compare_with_previous_resource_name:
31 halyavin 1704
	mov	ax,[esi+ecx]
157 heavyiron 1705
	cmp	ax,[ebx+ecx]
1706
	ja	check_this_resource_name
1707
	jb	check_next_resource_name
1708
	add	ecx,2
1709
	mov	ax,[esi+ecx]
1710
	or	ax,[ebx+ecx]
1711
	jnz	compare_with_previous_resource_name
1712
	jmp	check_next_resource_name
1713
      skip_resource_name:
31 halyavin 1714
	cmp	word [esi],0FFFFh
157 heavyiron 1715
	jne	skip_unicode_string
1716
	add	esi,4
1717
	ret
1718
      skip_unicode_string:
31 halyavin 1719
	add	esi,2
157 heavyiron 1720
	cmp	word [esi-2],0
1721
	jne	skip_unicode_string
1722
	ret
1723
      check_this_resource_name:
31 halyavin 1724
	or	edx,edx
157 heavyiron 1725
	jz	resource_name_found
1726
	xor	ecx,ecx
1727
      compare_with_current_resource_name:
31 halyavin 1728
	mov	ax,[esi+ecx]
157 heavyiron 1729
	cmp	ax,[edx+ecx]
1730
	ja	check_next_resource_name
1731
	jb	resource_name_found
1732
	add	ecx,2
1733
	mov	ax,[esi+ecx]
1734
	or	ax,[edx+ecx]
1735
	jnz	compare_with_current_resource_name
1736
	jmp	same_resource_name
1737
      resource_name_found:
31 halyavin 1738
	mov	edx,esi
157 heavyiron 1739
      same_resource_name:
31 halyavin 1740
	mov	eax,[esp]
157 heavyiron 1741
	mov	[eax+8],edi
1742
      check_next_resource_name:
31 halyavin 1743
	pop	esi
157 heavyiron 1744
	mov	eax,[esi+16]
1745
	lea	esi,[esi+20+eax]
1746
	jmp	find_resource_name
1747
      resource_name_ok:
31 halyavin 1748
	or	edx,edx
157 heavyiron 1749
	jz	resource_name_directory_done
1750
	mov	ebx,edx
1751
      make_resource_name_entry:
31 halyavin 1752
	mov	eax,[esp]
157 heavyiron 1753
	inc	word [eax+12]
1754
	lea	eax,[edi+8]
1755
	cmp	eax,[display_buffer]
1756
	jae	out_of_memory
1757
	mov	eax,ebx
1758
	stos	dword [edi]
1759
	xor	eax,eax
1760
	stos	dword [edi]
1761
	jmp	make_resource_name_directory
1762
      resource_name_directory_done:
31 halyavin 1763
	mov	ebx,-1
157 heavyiron 1764
      make_resource_id_directory:
31 halyavin 1765
	mov	esi,[free_additional_memory]
157 heavyiron 1766
	mov	edx,10000h
1767
      find_resource_id:
31 halyavin 1768
	cmp	dword [esi],0
157 heavyiron 1769
	je	resource_id_ok
1770
	push	esi
1771
	cmp	[esi+4],ebp
1772
	jne	check_next_resource_id
1773
	add	esi,20
1774
	call	skip_resource_name
1775
	cmp	word [esi],0FFFFh
1776
	jne	check_next_resource_id
1777
	movzx	eax,word [esi+2]
1778
	cmp	eax,ebx
1779
	jle	check_next_resource_id
1780
	cmp	eax,edx
1781
	jg	check_next_resource_id
1782
	mov	edx,eax
1783
	mov	eax,[esp]
1784
	mov	[eax+8],edi
1785
      check_next_resource_id:
31 halyavin 1786
	pop	esi
157 heavyiron 1787
	mov	eax,[esi+16]
1788
	lea	esi,[esi+20+eax]
1789
	jmp	find_resource_id
1790
      resource_id_ok:
31 halyavin 1791
	cmp	edx,10000h
157 heavyiron 1792
	je	resource_id_directory_done
1793
	mov	ebx,edx
1794
      make_resource_id_entry:
31 halyavin 1795
	mov	eax,[esp]
157 heavyiron 1796
	inc	word [eax+14]
1797
	lea	eax,[edi+8]
1798
	cmp	eax,[display_buffer]
1799
	jae	out_of_memory
1800
	mov	eax,ebx
1801
	stos	dword [edi]
1802
	xor	eax,eax
1803
	stos	dword [edi]
1804
	jmp	make_resource_id_directory
1805
      resource_id_directory_done:
31 halyavin 1806
	pop	eax
157 heavyiron 1807
	mov	esi,ebp
1808
	pop	ecx
1809
	add	esi,8
1810
	dec	cx
1811
	jnz	make_resource_directories
1812
      resource_directories_ok:
31 halyavin 1813
	shr	ecx,16
157 heavyiron 1814
	jnz	make_resource_directories
1815
	mov	esi,[resource_data]
1816
	add	esi,10h
1817
	movzx	eax,word [esi-4]
1818
	movzx	edx,word [esi-2]
1819
	add	eax,edx
1820
	lea	esi,[esi+eax*8]
1821
	push	edi			; address of language directories
1822
      update_resource_directories:
31 halyavin 1823
	cmp	esi,[esp]
157 heavyiron 1824
	je	resource_directories_updated
1825
	add	esi,10h
1826
	mov	ecx,[esi-4]
1827
	or	cx,cx
1828
	jz	language_directories_ok
1829
      make_language_directories:
31 halyavin 1830
	push	ecx
157 heavyiron 1831
	push	edi
1832
	mov	edx,edi
1833
	sub	edx,[resource_data]
1834
	bts	edx,31
1835
	mov	[esi+4],edx
1836
	lea	eax,[edi+16]
1837
	cmp	eax,[display_buffer]
1838
	jae	out_of_memory
1839
	xor	eax,eax
1840
	stos	dword [edi]
1841
	call	make_timestamp
1842
	stos	dword [edi]
1843
	xor	eax,eax
1844
	stos	dword [edi]
1845
	stos	dword [edi]
1846
	mov	ebp,esi
1847
	mov	ebx,-1
1848
      make_language_id_directory:
31 halyavin 1849
	mov	esi,[free_additional_memory]
157 heavyiron 1850
	mov	edx,10000h
1851
      find_language_id:
31 halyavin 1852
	cmp	dword [esi],0
157 heavyiron 1853
	je	language_id_ok
1854
	push	esi
1855
	cmp	[esi+8],ebp
1856
	jne	check_next_language_id
1857
	add	esi,20
1858
	mov	eax,esi
1859
	call	skip_resource_name
1860
	call	skip_resource_name
1861
	neg	eax
1862
	add	eax,esi
1863
	and	eax,11b
1864
	add	esi,eax
1865
      get_language_id:
31 halyavin 1866
	movzx	eax,word [esi+6]
157 heavyiron 1867
	cmp	eax,ebx
1868
	jle	check_next_language_id
1869
	cmp	eax,edx
1870
	jge	check_next_language_id
1871
	mov	edx,eax
1872
	mov	eax,[esp]
1873
	mov	[current_offset],eax
1874
      check_next_language_id:
31 halyavin 1875
	pop	esi
157 heavyiron 1876
	mov	eax,[esi+16]
1877
	lea	esi,[esi+20+eax]
1878
	jmp	find_language_id
1879
      language_id_ok:
31 halyavin 1880
	cmp	edx,10000h
157 heavyiron 1881
	je	language_id_directory_done
1882
	mov	ebx,edx
1883
      make_language_id_entry:
31 halyavin 1884
	mov	eax,[esp]
157 heavyiron 1885
	inc	word [eax+14]
1886
	lea	eax,[edi+8]
1887
	cmp	eax,[display_buffer]
1888
	jae	out_of_memory
1889
	mov	eax,ebx
1890
	stos	dword [edi]
1891
	mov	eax,[current_offset]
1892
	stos	dword [edi]
1893
	jmp	make_language_id_directory
1894
      language_id_directory_done:
31 halyavin 1895
	pop	eax
157 heavyiron 1896
	mov	esi,ebp
1897
	pop	ecx
1898
	add	esi,8
1899
	dec	cx
1900
	jnz	make_language_directories
1901
      language_directories_ok:
31 halyavin 1902
	shr	ecx,16
157 heavyiron 1903
	jnz	make_language_directories
1904
	jmp	update_resource_directories
1905
      resource_directories_updated:
31 halyavin 1906
	mov	esi,[resource_data]
157 heavyiron 1907
	push	edi
1908
      make_name_strings:
31 halyavin 1909
	add	esi,10h
157 heavyiron 1910
	movzx	eax,word [esi-2]
1911
	movzx	ecx,word [esi-4]
1912
	add	eax,ecx
1913
	lea	eax,[esi+eax*8]
1914
	push	eax
1915
	or	ecx,ecx
1916
	jz	string_entries_processed
1917
      process_string_entries:
31 halyavin 1918
	push	ecx
157 heavyiron 1919
	mov	edx,edi
1920
	sub	edx,[resource_data]
1921
	bts	edx,31
1922
	xchg	[esi],edx
1923
	mov	ebx,edi
1924
	xor	ax,ax
1925
	stos	word [edi]
1926
      copy_string_data:
31 halyavin 1927
	lea	eax,[edi+2]
157 heavyiron 1928
	cmp	eax,[display_buffer]
1929
	jae	out_of_memory
1930
	mov	ax,[edx]
1931
	or	ax,ax
1932
	jz	string_data_copied
1933
	stos	word [edi]
1934
	inc	word [ebx]
1935
	add	edx,2
1936
	jmp	copy_string_data
1937
      string_data_copied:
31 halyavin 1938
	add	esi,8
157 heavyiron 1939
	pop	ecx
1940
	loop	process_string_entries
1941
      string_entries_processed:
31 halyavin 1942
	pop	esi
157 heavyiron 1943
	cmp	esi,[esp]
1944
	jb	make_name_strings
1945
	mov	eax,edi
1946
	sub	eax,[resource_data]
1947
	test	al,11b
1948
	jz	resource_strings_alignment_ok
1949
	xor	ax,ax
1950
	stos	word [edi]
1951
      resource_strings_alignment_ok:
31 halyavin 1952
	pop	edx
157 heavyiron 1953
	pop	ebx			; address of language directories
1954
	mov	ebp,edi
1955
      update_language_directories:
31 halyavin 1956
	add	ebx,10h
157 heavyiron 1957
	movzx	eax,word [ebx-2]
1958
	movzx	ecx,word [ebx-4]
1959
	add	ecx,eax
1960
      make_data_records:
31 halyavin 1961
	push	ecx
157 heavyiron 1962
	mov	esi,edi
1963
	sub	esi,[resource_data]
1964
	xchg	esi,[ebx+4]
1965
	lea	eax,[edi+16]
1966
	cmp	eax,[display_buffer]
1967
	jae	out_of_memory
1968
	mov	eax,esi
1969
	stos	dword [edi]
1970
	mov	eax,[esi+12]
1971
	stos	dword [edi]
1972
	xor	eax,eax
1973
	stos	dword [edi]
1974
	stos	dword [edi]
1975
	pop	ecx
1976
	add	ebx,8
1977
	loop	make_data_records
1978
	cmp	ebx,edx
1979
	jb	update_language_directories
1980
	pop	ebx			; file handle
1981
	mov	esi,ebp
1982
	mov	ebp,edi
1983
      update_data_records:
31 halyavin 1984
	push	ebp
157 heavyiron 1985
	mov	ecx,edi
1986
	mov	eax,[current_section]
1987
	sub	ecx,[eax+14h]
1988
	add	ecx,[eax+0Ch]
1989
	xchg	ecx,[esi]
1990
	mov	edx,[ecx]
1991
	xor	al,al
1992
	call	lseek
1993
	mov	edx,edi
1994
	mov	ecx,[esi+4]
1995
	add	edi,ecx
1996
	cmp	edi,[display_buffer]
1997
	ja	out_of_memory
1998
	call	read
1999
	mov	eax,edi
2000
	sub	eax,[resource_data]
2001
	and	eax,11b
2002
	jz	resource_data_alignment_ok
2003
	mov	ecx,4
2004
	sub	ecx,eax
2005
	xor	al,al
2006
	rep	stos byte [edi]
2007
      resource_data_alignment_ok:
31 halyavin 2008
	pop	ebp
157 heavyiron 2009
	add	esi,16
2010
	cmp	esi,ebp
2011
	jb	update_data_records
2012
	pop	esi
2013
	call	close
2014
	mov	eax,edi
2015
	sub	eax,[resource_data]
2016
	mov	[resource_size],eax
2017
      resource_done:
31 halyavin 2018
	ret
157 heavyiron 2019
make_pe_fixups:
31 halyavin 2020
	bts	[resolver_flags],0
157 heavyiron 2021
	jc	pe_relocatable_ok
2022
	or	[next_pass_needed],-1
2023
     pe_relocatable_ok:
109 heavyiron 2024
	push	esi
157 heavyiron 2025
	mov	ecx,[number_of_relocations]
2026
	mov	esi,[free_additional_memory]
2027
	mov	eax,ecx
2028
	shl	eax,2
2029
	sub	esi,eax
2030
	mov	[free_additional_memory],esi
2031
	or	[number_of_relocations],-1
2032
	xor	edx,edx
2033
	mov	ebp,edi
2034
      make_fixups:
31 halyavin 2035
	cmp	[esi],edx
157 heavyiron 2036
	jb	store_fixup
2037
	mov	eax,edi
2038
	sub	eax,ebp
2039
	test	eax,11b
2040
	jz	fixups_block
2041
	xor	ax,ax
2042
	stos	word [edi]
2043
	add	dword [ebx],2
2044
      fixups_block:
31 halyavin 2045
	mov	eax,edx
157 heavyiron 2046
	add	edx,1000h
2047
	cmp	[esi],edx
2048
	jae	fixups_block
2049
	stos	dword [edi]
2050
	mov	ebx,edi
2051
	mov	eax,8
2052
	stos	dword [edi]
2053
      store_fixup:
31 halyavin 2054
	jecxz	fixups_done
157 heavyiron 2055
	add	dword [ebx],2
2056
	mov	eax,[esi]
2057
	and	ax,0FFFh
2058
	test	[format_flags],8
2059
	jnz	fixup_64bit
2060
	or	ax,3000h
2061
	jmp	fixup_ok
2062
      fixup_64bit:
31 halyavin 2063
	or	ax,0A000h
157 heavyiron 2064
      fixup_ok:
31 halyavin 2065
	stos	word [edi]
157 heavyiron 2066
	add	esi,4
2067
	loop	make_fixups
2068
      fixups_done:
31 halyavin 2069
	pop	esi
157 heavyiron 2070
	ret
2071
close_pe:
31 halyavin 2072
	call	close_pe_section
157 heavyiron 2073
	mov	edx,[code_start]
2074
	mov	[edx+50h],eax
2075
	call	make_timestamp
2076
	mov	edx,[code_start]
2077
	mov	[edx+8],eax
2078
	mov	eax,[number_of_relocations]
2079
	cmp	eax,-1
2080
	je	pe_relocations_ok
2081
	shl	eax,2
2082
	sub	[free_additional_memory],eax
2083
	btr	[resolver_flags],0
2084
	jnc	pe_relocations_ok
2085
	or	[next_pass_needed],-1
2086
      pe_relocations_ok:
109 heavyiron 2087
	mov	eax,[number_of_sections]
157 heavyiron 2088
	mov	[edx+6],ax
2089
	imul	eax,28h
2090
	movzx	ecx,word [edx+14h]
2091
	lea	eax,[eax+18h+ecx]
2092
	add	eax,[stub_size]
2093
	mov	ecx,[edx+3Ch]
2094
	dec	ecx
2095
	add	eax,ecx
2096
	not	ecx
2097
	and	eax,ecx
2098
	cmp	eax,[edx+54h]
2099
	je	pe_sections_ok
2100
	or	[next_pass_needed],-1
2101
      pe_sections_ok:
31 halyavin 2102
	xor	ecx,ecx
157 heavyiron 2103
	add	edx,78h
2104
	test	[format_flags],8
2105
	jz	process_directories
2106
	add	edx,10h
2107
      process_directories:
31 halyavin 2108
	mov	eax,[edx+ecx*8]
157 heavyiron 2109
	or	eax,eax
2110
	jz	directory_ok
2111
	cmp	dword [edx+ecx*8+4],-1
2112
	jne	directory_ok
2113
      section_data:
31 halyavin 2114
	mov	ebx,[edx+ecx*8]
157 heavyiron 2115
	mov	eax,[ebx+0Ch]
2116
	mov	[edx+ecx*8],eax 	; directory rva
2117
	mov	eax,[ebx+8]
2118
	mov	[edx+ecx*8+4],eax	; directory size
2119
      directory_ok:
31 halyavin 2120
	inc	cl
157 heavyiron 2121
	cmp	cl,10h
2122
	jb	process_directories
2123
	mov	ebx,[code_start]
2124
	sub	ebx,[stub_size]
2125
	mov	ecx,edi
2126
	sub	ecx,ebx
2127
	mov	ebp,ecx
2128
	shr	ecx,1
2129
	xor	eax,eax
2130
	cdq
2131
      calculate_checksum:
31 halyavin 2132
	mov	dx,[ebx]
157 heavyiron 2133
	add	eax,edx
2134
	mov	dx,ax
2135
	shr	eax,16
2136
	add	eax,edx
2137
	add	ebx,2
2138
	loop	calculate_checksum
2139
	add	eax,ebp
2140
	mov	ebx,[code_start]
2141
	mov	[ebx+58h],eax
2142
	ret
2143
31 halyavin 2144
 
2145
	mov	eax,[additional_memory]
157 heavyiron 2146
	mov	[symbols_stream],eax
2147
	mov	ebx,eax
2148
	add	eax,20h
2149
	cmp	eax,[structures_buffer]
2150
	jae	out_of_memory
2151
	mov	[free_additional_memory],eax
2152
	xor	eax,eax
2153
	mov	[ebx],al
2154
	mov	[ebx+4],eax
2155
	mov	[ebx+8],edi
2156
	mov	al,4
2157
	mov	[ebx+10h],eax
2158
	mov	al,60h
2159
	bt	[format_flags],0
2160
	jnc	flat_section_flags_ok
2161
	or	eax,0E0000000h
2162
      flat_section_flags_ok:
31 halyavin 2163
	mov	dword [ebx+14h],eax
157 heavyiron 2164
	mov	[current_section],ebx
2165
	mov	[number_of_sections],0
2166
	mov	dword [org_origin],edi
2167
	mov	dword [org_origin+4],0
2168
	mov	[org_registers],0
2169
	mov	[org_start],edi
2170
	mov	[org_symbol],ebx
2171
	mov	[labels_type],2
2172
	mov	[code_type],32
2173
	test	[format_flags],8
2174
	jz	instruction_assembled
2175
	mov	[labels_type],4
2176
	mov	[code_type],64
2177
	jmp	instruction_assembled
2178
coff_section:
31 halyavin 2179
	call	close_coff_section
157 heavyiron 2180
	mov	ebx,[free_additional_memory]
2181
	lea	eax,[ebx+20h]
2182
	cmp	eax,[structures_buffer]
2183
	jae	out_of_memory
2184
	mov	[free_additional_memory],eax
2185
	mov	[current_section],ebx
2186
	inc	[number_of_sections]
2187
	xor	eax,eax
2188
	mov	[ebx],al
2189
	mov	[ebx+8],edi
2190
	mov	dword [org_origin],edi
2191
	mov	dword [org_origin+4],0
2192
	mov	[org_registers],0
2193
	mov	[org_start],edi
2194
	mov	[org_symbol],ebx
2195
	mov	[labels_type],2
2196
	test	[format_flags],8
2197
	jz	coff_labels_type_ok
2198
	mov	[labels_type],4
2199
      coff_labels_type_ok:
31 halyavin 2200
	mov	[ebx+10h],eax
157 heavyiron 2201
	mov	[ebx+14h],eax
2202
	lods	word [esi]
2203
	cmp	ax,'('
2204
	jne	invalid_argument
2205
	mov	[ebx+4],esi
2206
	mov	ecx,[esi]
2207
	lea	esi,[esi+4+ecx+1]
2208
	cmp	ecx,8
2209
	ja	name_too_long
2210
      coff_section_flags:
31 halyavin 2211
	cmp	byte [esi],1Ch
157 heavyiron 2212
	je	coff_section_alignment
2213
	cmp	byte [esi],19h
2214
	jne	coff_section_settings_ok
2215
	inc	esi
2216
	lods	byte [esi]
2217
	bt	[format_flags],0
2218
	jc	coff_section_flag_ok
2219
	cmp	al,7
2220
	ja	invalid_argument
2221
      coff_section_flag_ok:
31 halyavin 2222
	mov	cl,al
157 heavyiron 2223
	mov	eax,1
2224
	shl	eax,cl
2225
	test	dword [ebx+14h],eax
2226
	jnz	setting_already_specified
2227
	or	dword [ebx+14h],eax
2228
	jmp	coff_section_flags
2229
      coff_section_alignment:
31 halyavin 2230
	bt	[format_flags],0
157 heavyiron 2231
	jnc	invalid_argument
2232
	inc	esi
2233
	lods	byte [esi]
2234
	or	al,al
2235
	jnz	invalid_argument
2236
	lods	byte [esi]
2237
	cmp	al,'('
2238
	jne	invalid_argument
2239
	cmp	byte [esi],'.'
2240
	je	invalid_value
2241
	push	ebx
2242
	call	get_dword_value
2243
	pop	ebx
2244
	cmp	[value_type],0
2245
	jne	invalid_use_of_symbol
2246
	mov	edx,eax
2247
	dec	edx
2248
	test	eax,edx
2249
	jnz	invalid_value
2250
	or	eax,eax
2251
	jz	invalid_value
2252
	cmp	eax,2000h
2253
	ja	invalid_value
2254
	bsf	edx,eax
2255
	inc	edx
2256
	shl	edx,20
2257
	or	[ebx+14h],edx
2258
	xchg	[ebx+10h],eax
2259
	or	eax,eax
2260
	jnz	setting_already_specified
2261
	jmp	coff_section_flags
2262
      coff_section_settings_ok:
31 halyavin 2263
	cmp	dword [ebx+10h],0
157 heavyiron 2264
	jne	instruction_assembled
2265
	mov	dword [ebx+10h],4
2266
	bt	[format_flags],0
2267
	jnc	instruction_assembled
2268
	or	dword [ebx+14h],300000h
2269
	jmp	instruction_assembled
2270
      close_coff_section:
31 halyavin 2271
	mov	ebx,[current_section]
157 heavyiron 2272
	mov	eax,edi
2273
	mov	edx,[ebx+8]
2274
	sub	eax,edx
2275
	mov	[ebx+0Ch],eax
2276
	xor	eax,eax
2277
	xchg	[undefined_data_end],eax
2278
	cmp	eax,edi
2279
	jne	coff_section_ok
2280
	cmp	edx,[undefined_data_start]
2281
	jne	coff_section_ok
2282
	mov	edi,edx
2283
	or	byte [ebx+14h],80h
2284
      coff_section_ok:
31 halyavin 2285
	ret
157 heavyiron 2286
mark_coff_relocation:
31 halyavin 2287
	cmp	[value_type],3
157 heavyiron 2288
	je	coff_relocation_relative
2289
	push	ebx eax
2290
	test	[format_flags],8
2291
	jnz	coff_64bit_relocation
2292
	mov	al,6
2293
	jmp	coff_relocation
2294
      coff_64bit_relocation:
31 halyavin 2295
	mov	al,1
157 heavyiron 2296
	cmp	[value_type],4
2297
	je	coff_relocation
2298
	mov	al,2
2299
	jmp	coff_relocation
2300
      coff_relocation_relative:
31 halyavin 2301
	push	ebx
157 heavyiron 2302
	bt	[format_flags],0
2303
	jnc	relative_ok
2304
	mov	ebx,[current_section]
2305
	mov	ebx,[ebx+8]
2306
	sub	ebx,edi
2307
	sub	eax,ebx
2308
	add	eax,4
2309
      relative_ok:
31 halyavin 2310
	push	eax
157 heavyiron 2311
	mov	al,20
2312
	test	[format_flags],8
2313
	jnz	relative_coff_64bit_relocation
2314
	cmp	[labels_type],2
2315
	jne	invalid_use_of_symbol
2316
	jmp	coff_relocation
2317
      relative_coff_64bit_relocation:
31 halyavin 2318
	mov	al,4
157 heavyiron 2319
	cmp	[labels_type],4
2320
	jne	invalid_use_of_symbol
2321
      coff_relocation:
31 halyavin 2322
	mov	ebx,[free_additional_memory]
157 heavyiron 2323
	add	ebx,0Ch
2324
	cmp	ebx,[structures_buffer]
2325
	jae	out_of_memory
2326
	mov	[free_additional_memory],ebx
2327
	mov	byte [ebx-0Ch],al
2328
	mov	eax,[current_section]
2329
	mov	eax,[eax+8]
2330
	neg	eax
2331
	add	eax,edi
2332
	mov	[ebx-0Ch+4],eax
2333
	mov	eax,[symbol_identifier]
2334
	mov	[ebx-0Ch+8],eax
2335
	pop	eax ebx
2336
	ret
2337
close_coff:
31 halyavin 2338
	call	close_coff_section
157 heavyiron 2339
	cmp	[next_pass_needed],0
2340
	je	coff_closed
2341
	mov	eax,[symbols_stream]
2342
	mov	[free_additional_memory],eax
2343
      coff_closed:
31 halyavin 2344
	ret
157 heavyiron 2345
coff_formatter:
31 halyavin 2346
	sub	edi,[code_start]
157 heavyiron 2347
	mov	[code_size],edi
2348
	call	prepare_default_section
2349
	mov	edi,[free_additional_memory]
2350
	mov	ebx,edi
2351
	mov	ecx,28h shr 2
2352
	imul	ecx,[number_of_sections]
2353
	add	ecx,14h shr 2
2354
	lea	eax,[edi+ecx*4]
2355
	cmp	eax,[structures_buffer]
2356
	jae	out_of_memory
2357
	xor	eax,eax
2358
	rep	stos dword [edi]
2359
	mov	word [ebx],14Ch
2360
	test	[format_flags],8
2361
	jz	coff_magic_ok
2362
	mov	word [ebx],8664h
2363
      coff_magic_ok:
31 halyavin 2364
	mov	word [ebx+12h],104h
157 heavyiron 2365
	bt	[format_flags],0
2366
	jnc	coff_flags_ok
2367
	or	byte [ebx+12h],80h
2368
      coff_flags_ok:
31 halyavin 2369
	push	ebx
157 heavyiron 2370
	call	make_timestamp
2371
	pop	ebx
2372
	mov	[ebx+4],eax
2373
	mov	eax,[number_of_sections]
2374
	mov	[ebx+2],ax
2375
	mov	esi,[symbols_stream]
2376
	xor	eax,eax
2377
	xor	ecx,ecx
2378
      enumerate_symbols:
31 halyavin 2379
	cmp	esi,[free_additional_memory]
157 heavyiron 2380
	je	symbols_enumerated
2381
	mov	dl,[esi]
2382
	or	dl,dl
2383
	jz	enumerate_section
2384
	cmp	dl,80h
2385
	je	enumerate_public
2386
	ja	enumerate_extrn
2387
	add	esi,0Ch
2388
	jmp	enumerate_symbols
2389
      enumerate_section:
31 halyavin 2390
	mov	edx,eax
157 heavyiron 2391
	shl	edx,8
2392
	mov	[esi],edx
2393
	inc	eax
2394
	inc	ecx
2395
	mov	[esi+1Eh],cx
2396
	add	esi,20h
2397
	jmp	enumerate_symbols
2398
      enumerate_public:
31 halyavin 2399
	mov	edx,eax
157 heavyiron 2400
	shl	edx,8
2401
	mov	dl,80h
2402
	mov	[esi],edx
2403
	mov	edx,[esi+8]
2404
	add	esi,10h
2405
	inc	eax
2406
	cmp	byte [edx+11],2
2407
	jne	enumerate_symbols
2408
	mov	edx,[edx+20]
2409
	cmp	byte [edx],81h
2410
	jne	enumerate_symbols
2411
	inc	eax
2412
	jmp	enumerate_symbols
2413
      enumerate_extrn:
31 halyavin 2414
	mov	edx,eax
157 heavyiron 2415
	shl	edx,8
2416
	mov	dl,81h
2417
	mov	[esi],edx
2418
	add	esi,0Ch
2419
	inc	eax
2420
	jmp	enumerate_symbols
2421
      prepare_default_section:
31 halyavin 2422
	mov	ebx,[symbols_stream]
157 heavyiron 2423
	cmp	dword [ebx+0Ch],0
2424
	jne	default_section_ok
2425
	cmp	[number_of_sections],0
2426
	je	default_section_ok
2427
	mov	edx,ebx
2428
      find_references_to_default_section:
31 halyavin 2429
	cmp	ebx,[free_additional_memory]
157 heavyiron 2430
	jne	check_reference
2431
	add	[symbols_stream],20h
2432
	ret
2433
      check_reference:
31 halyavin 2434
	mov	al,[ebx]
157 heavyiron 2435
	or	al,al
2436
	jz	skip_other_section
2437
	cmp	al,80h
2438
	je	check_public_reference
2439
	ja	next_reference
2440
	cmp	edx,[ebx+8]
2441
	je	default_section_ok
2442
      next_reference:
31 halyavin 2443
	add	ebx,0Ch
157 heavyiron 2444
	jmp	find_references_to_default_section
2445
      check_public_reference:
31 halyavin 2446
	mov	eax,[ebx+8]
157 heavyiron 2447
	add	ebx,10h
2448
	test	byte [eax+8],1
2449
	jz	find_references_to_default_section
2450
	mov	cx,[current_pass]
2451
	cmp	cx,[eax+16]
2452
	jne	find_references_to_default_section
2453
	cmp	edx,[eax+20]
2454
	je	default_section_ok
2455
	jmp	find_references_to_default_section
2456
      skip_other_section:
31 halyavin 2457
	add	ebx,20h
157 heavyiron 2458
	jmp	find_references_to_default_section
2459
      default_section_ok:
31 halyavin 2460
	inc	[number_of_sections]
157 heavyiron 2461
	ret
2462
      symbols_enumerated:
31 halyavin 2463
	mov	[ebx+0Ch],eax
157 heavyiron 2464
	mov	ebp,edi
2465
	sub	ebp,ebx
2466
	push	ebp
2467
	lea	edi,[ebx+14h]
2468
	mov	esi,[symbols_stream]
2469
      find_section:
31 halyavin 2470
	cmp	esi,[free_additional_memory]
157 heavyiron 2471
	je	sections_finished
2472
	mov	al,[esi]
2473
	or	al,al
2474
	jz	section_found
2475
	add	esi,0Ch
2476
	cmp	al,80h
2477
	jne	find_section
2478
	add	esi,4
2479
	jmp	find_section
2480
      section_found:
31 halyavin 2481
	push	esi edi
157 heavyiron 2482
	mov	esi,[esi+4]
2483
	or	esi,esi
2484
	jz	default_section
2485
	mov	ecx,[esi]
2486
	add	esi,4
2487
	rep	movs byte [edi],[esi]
2488
	jmp	section_name_ok
2489
      default_section:
31 halyavin 2490
	mov	al,'.'
157 heavyiron 2491
	stos	byte [edi]
2492
	mov	eax,'flat'
2493
	stos	dword [edi]
2494
      section_name_ok:
31 halyavin 2495
	pop	edi esi
157 heavyiron 2496
	mov	eax,[esi+0Ch]
2497
	mov	[edi+10h],eax
2498
	mov	eax,[esi+14h]
2499
	mov	[edi+24h],eax
2500
	test	al,80h
2501
	jnz	section_ptr_ok
2502
	mov	eax,[esi+8]
2503
	sub	eax,[code_start]
2504
	add	eax,ebp
2505
	mov	[edi+14h],eax
2506
      section_ptr_ok:
31 halyavin 2507
	mov	ebx,[code_start]
157 heavyiron 2508
	mov	edx,[code_size]
2509
	add	ebx,edx
2510
	add	edx,ebp
2511
	xor	ecx,ecx
2512
	add	esi,20h
2513
      find_relocations:
31 halyavin 2514
	cmp	esi,[free_additional_memory]
157 heavyiron 2515
	je	section_relocations_done
2516
	mov	al,[esi]
2517
	or	al,al
2518
	jz	section_relocations_done
2519
	cmp	al,80h
2520
	jb	add_relocation
2521
	ja	next_relocation
2522
	add	esi,10h
2523
	jmp	find_relocations
2524
      add_relocation:
31 halyavin 2525
	lea	eax,[ebx+0Ah]
157 heavyiron 2526
	cmp	eax,[display_buffer]
2527
	ja	out_of_memory
2528
	mov	eax,[esi+4]
2529
	mov	[ebx],eax
2530
	mov	eax,[esi+8]
2531
	mov	eax,[eax]
2532
	shr	eax,8
2533
	mov	[ebx+4],eax
2534
	movzx	ax,byte [esi]
2535
	mov	[ebx+8],ax
2536
	add	ebx,0Ah
2537
	inc	ecx
2538
      next_relocation:
31 halyavin 2539
	add	esi,0Ch
157 heavyiron 2540
	jmp	find_relocations
2541
      section_relocations_done:
31 halyavin 2542
	cmp	ecx,10000h
157 heavyiron 2543
	jb	section_relocations_count_16bit
2544
	bt	[format_flags],0
2545
	jnc	format_limitations_exceeded
2546
	mov	word [edi+20h],0FFFFh
2547
	or	dword [edi+24h],1000000h
2548
	mov	[edi+18h],edx
2549
	push	esi edi
2550
	push	ecx
2551
	lea	esi,[ebx-1]
2552
	add	ebx,0Ah
2553
	lea	edi,[ebx-1]
2554
	imul	ecx,0Ah
2555
	std
2556
	rep	movs byte [edi],[esi]
2557
	cld
2558
	pop	ecx
2559
	inc	esi
2560
	inc	ecx
2561
	mov	[esi],ecx
2562
	xor	eax,eax
2563
	mov	[esi+4],eax
2564
	mov	[esi+8],ax
2565
	pop	edi esi
2566
	jmp	section_relocations_ok
2567
      section_relocations_count_16bit:
31 halyavin 2568
	mov	[edi+20h],cx
157 heavyiron 2569
	jcxz	section_relocations_ok
2570
	mov	[edi+18h],edx
2571
      section_relocations_ok:
31 halyavin 2572
	sub	ebx,[code_start]
157 heavyiron 2573
	mov	[code_size],ebx
2574
	add	edi,28h
2575
	jmp	find_section
2576
      sections_finished:
31 halyavin 2577
	mov	edx,[free_additional_memory]
157 heavyiron 2578
	mov	ebx,[code_size]
2579
	add	ebp,ebx
2580
	mov	[edx+8],ebp
2581
	add	ebx,[code_start]
2582
	mov	edi,ebx
2583
	mov	ecx,[edx+0Ch]
2584
	imul	ecx,12h shr 1
2585
	xor	eax,eax
2586
	shr	ecx,1
2587
	jnc	zero_symbols_table
2588
	stos	word [edi]
2589
      zero_symbols_table:
31 halyavin 2590
	rep	stos dword [edi]
157 heavyiron 2591
	mov	edx,edi
2592
	stos	dword [edi]
2593
	mov	esi,[symbols_stream]
2594
      make_symbols_table:
109 heavyiron 2595
	cmp	esi,[free_additional_memory]
157 heavyiron 2596
	je	symbols_table_ok
2597
	mov	al,[esi]
2598
	cmp	al,80h
2599
	je	add_public_symbol
2600
	ja	add_extrn_symbol
2601
	or	al,al
2602
	jz	add_section_symbol
2603
	add	esi,0Ch
2604
	jmp	make_symbols_table
2605
      add_section_symbol:
31 halyavin 2606
	call	store_symbol_name
157 heavyiron 2607
	movzx	eax,word [esi+1Eh]
2608
	mov	[ebx+0Ch],ax
2609
	mov	byte [ebx+10h],3
2610
	add	esi,20h
2611
	add	ebx,12h
2612
	jmp	make_symbols_table
2613
      add_extrn_symbol:
31 halyavin 2614
	call	store_symbol_name
157 heavyiron 2615
	mov	byte [ebx+10h],2
2616
	add	esi,0Ch
2617
	add	ebx,12h
2618
	jmp	make_symbols_table
2619
      add_public_symbol:
31 halyavin 2620
	call	store_symbol_name
157 heavyiron 2621
	mov	eax,[esi+0Ch]
2622
	mov	[current_line],eax
2623
	mov	eax,[esi+8]
2624
	test	byte [eax+8],1
2625
	jz	undefined_symbol
2626
	mov	cx,[current_pass]
2627
	cmp	cx,[eax+16]
2628
	jne	undefined_symbol
2629
	mov	cl,[eax+11]
2630
	or	cl,cl
2631
	jz	public_constant
2632
	test	[format_flags],8
2633
	jnz	check_64bit_public_symbol
2634
	cmp	cl,2
2635
	je	public_symbol_type_ok
2636
	jmp	invalid_use_of_symbol
2637
      check_64bit_public_symbol:
31 halyavin 2638
	cmp	cl,4
157 heavyiron 2639
	jne	invalid_use_of_symbol
2640
      public_symbol_type_ok:
31 halyavin 2641
	mov	ecx,[eax+20]
157 heavyiron 2642
	cmp	byte [ecx],81h
2643
	je	alias_symbol
2644
	cmp	byte [ecx],0
2645
	jne	invalid_use_of_symbol
2646
	mov	cx,[ecx+1Eh]
2647
	mov	[ebx+0Ch],cx
2648
      public_symbol_section_ok:
31 halyavin 2649
	cmp	dword [eax+4],0
157 heavyiron 2650
	je	store_public_symbol
2651
	cmp	dword [eax+4],-1
2652
	jne	value_out_of_range
2653
	bt	dword [eax],31
2654
	jnc	value_out_of_range
2655
      store_public_symbol:
31 halyavin 2656
	mov	eax,[eax]
157 heavyiron 2657
	mov	[ebx+8],eax
2658
	mov	byte [ebx+10h],2
2659
	add	esi,10h
2660
	add	ebx,12h
2661
	jmp	make_symbols_table
2662
      alias_symbol:
31 halyavin 2663
	bt	[format_flags],0
157 heavyiron 2664
	jnc	invalid_use_of_symbol
2665
	mov	ecx,[eax]
2666
	or	ecx,[eax+4]
2667
	jnz	invalid_use_of_symbol
2668
	mov	byte [ebx+10h],69h
2669
	mov	byte [ebx+11h],1
2670
	add	ebx,12h
2671
	mov	ecx,[eax+20]
2672
	mov	ecx,[ecx]
2673
	shr	ecx,8
2674
	mov	[ebx],ecx
2675
	mov	byte [ebx+4],3
2676
	add	esi,10h
2677
	add	ebx,12h
2678
	jmp	make_symbols_table
2679
      public_constant:
31 halyavin 2680
	mov	word [ebx+0Ch],0FFFFh
157 heavyiron 2681
	jmp	public_symbol_section_ok
2682
      symbols_table_ok:
31 halyavin 2683
	mov	eax,edi
157 heavyiron 2684
	sub	eax,edx
2685
	mov	[edx],eax
2686
	sub	edi,[code_start]
2687
	mov	[code_size],edi
2688
	mov	[written_size],0
2689
	mov	edx,[output_file]
2690
	call	create
2691
	jc	write_failed
2692
	mov	edx,[free_additional_memory]
2693
	pop	ecx
2694
	add	[written_size],ecx
2695
	call	write
2696
	jc	write_failed
2697
	jmp	write_output
2698
      store_symbol_name:
31 halyavin 2699
	push	esi
157 heavyiron 2700
	mov	esi,[esi+4]
2701
	or	esi,esi
2702
	jz	default_name
2703
	lods	dword [esi]
2704
	mov	ecx,eax
2705
	cmp	ecx,8
2706
	ja	add_string
2707
	push	edi
2708
	mov	edi,ebx
2709
	rep	movs byte [edi],[esi]
2710
	pop	edi esi
2711
	ret
2712
      default_name:
31 halyavin 2713
	mov	dword [ebx],'.fla'
157 heavyiron 2714
	mov	dword [ebx+4],'t'
2715
	pop	esi
2716
	ret
2717
      add_string:
31 halyavin 2718
	mov	eax,edi
157 heavyiron 2719
	sub	eax,edx
2720
	mov	[ebx+4],eax
2721
	inc	ecx
2722
	rep	movs byte [edi],[esi]
2723
	pop	esi
2724
	ret
2725
31 halyavin 2726
 
2727
	test	[format_flags],8
157 heavyiron 2728
	jnz	format_elf64
2729
	mov	edx,edi
2730
	mov	ecx,34h shr 2
2731
	lea	eax,[edi+ecx*4]
2732
	cmp	eax,[display_buffer]
2733
	jae	out_of_memory
2734
	xor	eax,eax
2735
	rep	stos dword [edi]
2736
	mov	dword [edx],7Fh + 'ELF' shl 8
2737
	mov	al,1
2738
	mov	[edx+4],al
2739
	mov	[edx+5],al
2740
	mov	[edx+6],al
2741
	mov	[edx+14h],al
2742
	mov	byte [edx+12h],3
2743
	mov	byte [edx+28h],34h
2744
	mov	byte [edx+2Eh],28h
2745
	mov	[code_type],32
2746
	cmp	word [esi],1D19h
2747
	je	format_elf_exe
2748
	mov	[labels_type],2
2749
      elf_header_ok:
31 halyavin 2750
	mov	byte [edx+10h],1
157 heavyiron 2751
	mov	eax,[additional_memory]
2752
	mov	[symbols_stream],eax
2753
	mov	ebx,eax
2754
	add	eax,20h
2755
	cmp	eax,[structures_buffer]
2756
	jae	out_of_memory
2757
	mov	[free_additional_memory],eax
2758
	xor	eax,eax
2759
	mov	[current_section],ebx
2760
	mov	[number_of_sections],eax
2761
	mov	dword [org_origin],edi
2762
	mov	dword [org_origin+4],eax
2763
	mov	[org_registers],eax
2764
	mov	[org_start],edi
2765
	mov	[org_symbol],ebx
2766
	mov	[ebx],al
2767
	mov	[ebx+4],eax
2768
	mov	[ebx+8],edi
2769
	mov	al,111b
2770
	mov	[ebx+14h],eax
2771
	mov	al,4
2772
	mov	[ebx+10h],eax
2773
	test	[format_flags],8
2774
	jz	instruction_assembled
2775
	mov	byte [ebx+10h],8
2776
	jmp	instruction_assembled
2777
      format_elf64:
31 halyavin 2778
	mov	edx,edi
157 heavyiron 2779
	mov	ecx,40h shr 2
2780
	lea	eax,[edi+ecx*4]
2781
	cmp	eax,[display_buffer]
2782
	jae	out_of_memory
2783
	xor	eax,eax
2784
	rep	stos dword [edi]
2785
	mov	dword [edx],7Fh + 'ELF' shl 8
2786
	mov	al,1
2787
	mov	[edx+5],al
2788
	mov	[edx+6],al
2789
	mov	[edx+14h],al
2790
	mov	byte [edx+4],2
2791
	mov	byte [edx+12h],62
2792
	mov	byte [edx+34h],40h
2793
	mov	byte [edx+3Ah],40h
2794
	mov	[code_type],64
2795
	cmp	word [esi],1D19h
2796
	je	format_elf64_exe
2797
	mov	[labels_type],4
2798
	jmp	elf_header_ok
2799
elf_section:
31 halyavin 2800
	bt	[format_flags],0
157 heavyiron 2801
	jc	illegal_instruction
2802
	call	close_coff_section
2803
	mov	ebx,[free_additional_memory]
2804
	lea	eax,[ebx+20h]
2805
	cmp	eax,[structures_buffer]
2806
	jae	out_of_memory
2807
	mov	[free_additional_memory],eax
2808
	mov	[current_section],ebx
2809
	inc	word [number_of_sections]
2810
	jz	format_limitations_exceeded
2811
	xor	eax,eax
2812
	mov	[ebx],al
2813
	mov	[ebx+8],edi
2814
	mov	dword [org_origin],edi
2815
	mov	dword [org_origin+4],0
2816
	mov	[org_registers],0
2817
	mov	[org_start],edi
2818
	mov	[org_symbol],ebx
2819
	test	[format_flags],8
2820
	jnz	elf64_labels_type
2821
	mov	[labels_type],2
2822
	jmp	elf_labels_type_ok
2823
      elf64_labels_type:
31 halyavin 2824
	mov	[labels_type],4
157 heavyiron 2825
      elf_labels_type_ok:
31 halyavin 2826
	mov	[ebx+10h],eax
157 heavyiron 2827
	mov	al,10b
2828
	mov	[ebx+14h],eax
2829
	lods	word [esi]
2830
	cmp	ax,'('
2831
	jne	invalid_argument
2832
	mov	[ebx+4],esi
2833
	mov	ecx,[esi]
2834
	lea	esi,[esi+4+ecx+1]
2835
      elf_section_flags:
31 halyavin 2836
	cmp	byte [esi],1Ch
157 heavyiron 2837
	je	elf_section_alignment
2838
	cmp	byte [esi],19h
2839
	jne	elf_section_settings_ok
2840
	inc	esi
2841
	lods	byte [esi]
2842
	sub	al,28
2843
	xor	al,11b
2844
	test	al,not 10b
2845
	jnz	invalid_argument
2846
	mov	cl,al
2847
	mov	al,1
2848
	shl	al,cl
2849
	test	byte [ebx+14h],al
2850
	jnz	setting_already_specified
2851
	or	byte [ebx+14h],al
2852
	jmp	elf_section_flags
2853
      elf_section_alignment:
31 halyavin 2854
	inc	esi
157 heavyiron 2855
	lods	byte [esi]
2856
	or	al,al
2857
	jnz	invalid_argument
2858
	lods	byte [esi]
2859
	cmp	al,'('
2860
	jne	invalid_argument
2861
	cmp	byte [esi],'.'
2862
	je	invalid_value
2863
	push	ebx
2864
	call	get_dword_value
2865
	pop	ebx
2866
	cmp	[value_type],0
2867
	jne	invalid_use_of_symbol
2868
	mov	edx,eax
2869
	dec	edx
2870
	test	eax,edx
2871
	jnz	invalid_value
2872
	or	eax,eax
2873
	jz	invalid_value
2874
	xchg	[ebx+10h],eax
2875
	or	eax,eax
2876
	jnz	setting_already_specified
2877
	jmp	elf_section_flags
2878
      elf_section_settings_ok:
31 halyavin 2879
	cmp	dword [ebx+10h],0
157 heavyiron 2880
	jne	instruction_assembled
2881
	mov	dword [ebx+10h],4
2882
	test	[format_flags],8
2883
	jz	instruction_assembled
2884
	mov	byte [ebx+10h],8
2885
	jmp	instruction_assembled
2886
mark_elf_relocation:
31 halyavin 2887
	cmp	[value_type],3
157 heavyiron 2888
	je	elf_relocation_relative
2889
	cmp	[value_type],7
174 heavyiron 2890
	je	elf_relocation_relative
2891
	push	ebx eax
157 heavyiron 2892
	cmp	[value_type],5
174 heavyiron 2893
	je	elf_gotoff_relocation
157 heavyiron 2894
	ja	invalid_use_of_symbol
174 heavyiron 2895
	mov	al,1			; R_386_32 / R_AMD64_64
2896
	test	[format_flags],8
157 heavyiron 2897
	jz	coff_relocation
2898
	cmp	[value_type],4
2899
	je	coff_relocation
2900
	mov	al,11			; R_AMD64_32S
174 heavyiron 2901
	jmp	coff_relocation
157 heavyiron 2902
      elf_gotoff_relocation:
109 heavyiron 2903
	test	[format_flags],8
174 heavyiron 2904
	jnz	invalid_use_of_symbol
2905
	mov	al,9			; R_386_GOTOFF
2906
	jmp	coff_relocation
157 heavyiron 2907
      elf_relocation_relative:
31 halyavin 2908
	cmp	[labels_type],0
157 heavyiron 2909
	je	invalid_use_of_symbol
2910
	push	ebx
2911
	mov	ebx,[current_section]
2912
	mov	ebx,[ebx+8]
2913
	sub	ebx,edi
2914
	sub	eax,ebx
2915
	push	eax
2916
	mov	al,2			; R_386_PC32 / R_AMD64_PC32
174 heavyiron 2917
	cmp	[value_type],3
2918
	je	coff_relocation
2919
	mov	al,4			; R_386_PLT32 / R_AMD64_PLT32
2920
	jmp	coff_relocation
157 heavyiron 2921
close_elf:
31 halyavin 2922
	bt	[format_flags],0
157 heavyiron 2923
	jc	close_elf_exe
2924
	call	close_coff_section
2925
	cmp	[next_pass_needed],0
2926
	je	elf_closed
2927
	mov	eax,[symbols_stream]
2928
	mov	[free_additional_memory],eax
2929
      elf_closed:
31 halyavin 2930
	ret
157 heavyiron 2931
elf_formatter:
31 halyavin 2932
	push	edi
157 heavyiron 2933
	call	prepare_default_section
2934
	mov	esi,[symbols_stream]
2935
	mov	edi,[free_additional_memory]
2936
	xor	eax,eax
2937
	mov	ecx,4
2938
	rep	stos dword [edi]
2939
	test	[format_flags],8
2940
	jz	find_first_section
2941
	mov	ecx,2
2942
	rep	stos dword [edi]
2943
      find_first_section:
31 halyavin 2944
	mov	al,[esi]
157 heavyiron 2945
	or	al,al
2946
	jz	first_section_found
2947
	cmp	al,80h
2948
	jne	skip_other_symbol
2949
	add	esi,4
2950
      skip_other_symbol:
31 halyavin 2951
	add	esi,0Ch
157 heavyiron 2952
	jmp	find_first_section
2953
      first_section_found:
31 halyavin 2954
	mov	ebx,esi
157 heavyiron 2955
	mov	ebp,esi
2956
	add	esi,20h
2957
	xor	ecx,ecx
2958
	xor	edx,edx
2959
      find_next_section:
31 halyavin 2960
	cmp	esi,[free_additional_memory]
157 heavyiron 2961
	je	make_section_symbol
2962
	mov	al,[esi]
2963
	or	al,al
2964
	jz	make_section_symbol
2965
	cmp	al,80h
2966
	je	skip_public
2967
	ja	skip_extrn
2968
	or	byte [ebx+14h],40h
2969
      skip_extrn:
31 halyavin 2970
	add	esi,0Ch
157 heavyiron 2971
	jmp	find_next_section
2972
      skip_public:
31 halyavin 2973
	add	esi,10h
157 heavyiron 2974
	jmp	find_next_section
2975
      make_section_symbol:
31 halyavin 2976
	mov	eax,edi
157 heavyiron 2977
	xchg	eax,[ebx+4]
2978
	stos	dword [edi]
2979
	test	[format_flags],8
2980
	jnz	elf64_section_symbol
2981
	xor	eax,eax
2982
	stos	dword [edi]
2983
	stos	dword [edi]
2984
	call	store_section_index
2985
	jmp	section_symbol_ok
2986
      store_section_index:
31 halyavin 2987
	inc	ecx
157 heavyiron 2988
	mov	eax,ecx
2989
	shl	eax,8
2990
	mov	[ebx],eax
2991
	inc	dx
2992
	jz	format_limitations_exceeded
2993
	mov	eax,edx
2994
	shl	eax,16
2995
	mov	al,3
2996
	test	byte [ebx+14h],40h
2997
	jz	section_index_ok
2998
	or	ah,-1
2999
	inc	dx
3000
	jz	format_limitations_exceeded
3001
      section_index_ok:
31 halyavin 3002
	stos	dword [edi]
157 heavyiron 3003
	ret
3004
      elf64_section_symbol:
31 halyavin 3005
	call	store_section_index
157 heavyiron 3006
	xor	eax,eax
3007
	stos	dword [edi]
3008
	stos	dword [edi]
3009
	stos	dword [edi]
3010
	stos	dword [edi]
3011
      section_symbol_ok:
31 halyavin 3012
	mov	ebx,esi
157 heavyiron 3013
	add	esi,20h
3014
	cmp	ebx,[free_additional_memory]
3015
	jne	find_next_section
3016
	inc	dx
3017
	jz	format_limitations_exceeded
3018
	mov	[current_section],edx
3019
	mov	esi,[symbols_stream]
3020
      find_other_symbols:
31 halyavin 3021
	cmp	esi,[free_additional_memory]
157 heavyiron 3022
	je	elf_symbol_table_ok
3023
	mov	al,[esi]
3024
	or	al,al
3025
	jz	skip_section
3026
	cmp	al,80h
3027
	je	make_public_symbol
3028
	ja	make_extrn_symbol
3029
	add	esi,0Ch
3030
	jmp	find_other_symbols
3031
      skip_section:
31 halyavin 3032
	add	esi,20h
157 heavyiron 3033
	jmp	find_other_symbols
3034
      make_public_symbol:
31 halyavin 3035
	mov	eax,[esi+0Ch]
157 heavyiron 3036
	mov	[current_line],eax
3037
	mov	ebx,[esi+8]
3038
	test	byte [ebx+8],1
3039
	jz	undefined_symbol
3040
	mov	ax,[current_pass]
3041
	cmp	ax,[ebx+16]
3042
	jne	undefined_symbol
3043
	mov	dl,[ebx+11]
3044
	or	dl,dl
3045
	jz	public_absolute
3046
	mov	eax,[ebx+20]
3047
	cmp	byte [eax],0
3048
	jne	invalid_use_of_symbol
3049
	mov	eax,[eax+4]
3050
	test	[format_flags],8
3051
	jnz	elf64_public
3052
	cmp	dl,2
3053
	jne	invalid_use_of_symbol
3054
	mov	dx,[eax+0Eh]
3055
	jmp	section_for_public_ok
3056
      elf64_public:
31 halyavin 3057
	cmp	dl,4
157 heavyiron 3058
	jne	invalid_use_of_symbol
3059
	mov	dx,[eax+6]
3060
	jmp	section_for_public_ok
3061
      public_absolute:
31 halyavin 3062
	mov	dx,0FFF1h
157 heavyiron 3063
      section_for_public_ok:
31 halyavin 3064
	mov	eax,[esi+4]
157 heavyiron 3065
	stos	dword [edi]
3066
	test	[format_flags],8
3067
	jnz	elf64_public_symbol
3068
	call	get_public_value
3069
	stos	dword [edi]
3070
	xor	eax,eax
3071
	mov	al,[ebx+10]
3072
	stos	dword [edi]
3073
	mov	eax,edx
3074
	shl	eax,16
3075
	mov	al,10h
3076
	cmp	byte [ebx+10],0
3077
	je	elf_public_function
3078
	or	al,1
3079
	jmp	store_elf_public_info
3080
      elf_public_function:
109 heavyiron 3081
	or	al,2
157 heavyiron 3082
      store_elf_public_info:
109 heavyiron 3083
	stos	dword [edi]
157 heavyiron 3084
	jmp	public_symbol_ok
3085
      elf64_public_symbol:
31 halyavin 3086
	mov	eax,edx
157 heavyiron 3087
	shl	eax,16
3088
	mov	al,10h
3089
	cmp	byte [ebx+10],0
3090
	je	elf64_public_function
3091
	or	al,1
3092
	jmp	store_elf64_public_info
3093
      elf64_public_function:
109 heavyiron 3094
	or	al,2
157 heavyiron 3095
      store_elf64_public_info:
109 heavyiron 3096
	stos	dword [edi]
157 heavyiron 3097
	call	get_public_value
3098
	stos	dword [edi]
3099
	xor	eax,eax
3100
	stos	dword [edi]
3101
	mov	al,[ebx+10]
3102
	stos	dword [edi]
3103
	xor	al,al
3104
	stos	dword [edi]
3105
      public_symbol_ok:
31 halyavin 3106
	inc	ecx
157 heavyiron 3107
	mov	eax,ecx
3108
	shl	eax,8
3109
	mov	al,80h
3110
	mov	[esi],eax
3111
	add	esi,10h
3112
	jmp	find_other_symbols
3113
      get_public_value:
31 halyavin 3114
	mov	eax,[ebx]
157 heavyiron 3115
	cmp	dword [ebx+4],0
3116
	je	public_value_ok
3117
	cmp	dword [ebx+4],-1
3118
	jne	value_out_of_range
3119
	bt	eax,31
3120
	jnc	value_out_of_range
3121
      public_value_ok:
31 halyavin 3122
	ret
157 heavyiron 3123
      make_extrn_symbol:
31 halyavin 3124
	mov	eax,[esi+4]
157 heavyiron 3125
	stos	dword [edi]
3126
	test	[format_flags],8
3127
	jnz	elf64_extrn_symbol
3128
	xor	eax,eax
3129
	stos	dword [edi]
3130
	mov	eax,[esi+8]
3131
	stos	dword [edi]
3132
	mov	eax,10h
3133
	stos	dword [edi]
3134
	jmp	extrn_symbol_ok
3135
      elf64_extrn_symbol:
31 halyavin 3136
	mov	eax,10h
157 heavyiron 3137
	stos	dword [edi]
3138
	xor	al,al
3139
	stos	dword [edi]
3140
	stos	dword [edi]
3141
	mov	eax,[esi+8]
3142
	stos	dword [edi]
3143
	xor	eax,eax
3144
	stos	dword [edi]
3145
      extrn_symbol_ok:
31 halyavin 3146
	inc	ecx
157 heavyiron 3147
	mov	eax,ecx
3148
	shl	eax,8
3149
	mov	al,81h
3150
	mov	[esi],eax
3151
	add	esi,0Ch
3152
	jmp	find_other_symbols
3153
      elf_symbol_table_ok:
31 halyavin 3154
	mov	edx,edi
157 heavyiron 3155
	mov	ebx,[free_additional_memory]
3156
	xor	al,al
3157
	stos	byte [edi]
3158
	add	edi,16
3159
	mov	[edx+1],edx
3160
	add	ebx,10h
3161
	test	[format_flags],8
3162
	jz	make_string_table
3163
	add	ebx,8
3164
      make_string_table:
31 halyavin 3165
	cmp	ebx,edx
157 heavyiron 3166
	je	elf_string_table_ok
3167
	test	[format_flags],8
3168
	jnz	make_elf64_string
3169
	cmp	byte [ebx+0Dh],0
3170
	je	rel_prefix_ok
3171
	mov	byte [ebx+0Dh],0
3172
	mov	eax,'.rel'
3173
	stos	dword [edi]
3174
      rel_prefix_ok:
31 halyavin 3175
	mov	esi,edi
157 heavyiron 3176
	sub	esi,edx
3177
	xchg	esi,[ebx]
3178
	add	ebx,10h
3179
      make_elf_string:
31 halyavin 3180
	or	esi,esi
157 heavyiron 3181
	jz	default_string
3182
	lods	dword [esi]
3183
	mov	ecx,eax
3184
	rep	movs byte [edi],[esi]
3185
	xor	al,al
3186
	stos	byte [edi]
3187
	jmp	make_string_table
3188
      make_elf64_string:
31 halyavin 3189
	cmp	byte [ebx+5],0
157 heavyiron 3190
	je	elf64_rel_prefix_ok
3191
	mov	byte [ebx+5],0
3192
	mov	eax,'.rel'
3193
	stos	dword [edi]
3194
	mov	al,'a'
3195
	stos	byte [edi]
3196
      elf64_rel_prefix_ok:
31 halyavin 3197
	mov	esi,edi
157 heavyiron 3198
	sub	esi,edx
3199
	xchg	esi,[ebx]
3200
	add	ebx,18h
3201
	jmp	make_elf_string
3202
      default_string:
31 halyavin 3203
	mov	eax,'.fla'
157 heavyiron 3204
	stos	dword [edi]
3205
	mov	ax,'t'
3206
	stos	word [edi]
3207
	jmp	make_string_table
3208
      elf_string_table_ok:
31 halyavin 3209
	mov	[edx+1+8],edi
157 heavyiron 3210
	mov	ebx,[code_start]
3211
	mov	eax,edi
3212
	sub	eax,[free_additional_memory]
3213
	test	[format_flags],8
3214
	jnz	finish_elf64_header
3215
	mov	[ebx+20h],eax
3216
	mov	eax,[current_section]
3217
	inc	ax
3218
	jz	format_limitations_exceeded
3219
	mov	[ebx+32h],ax
3220
	inc	ax
3221
	jz	format_limitations_exceeded
3222
	mov	[ebx+30h],ax
3223
	jmp	elf_header_finished
3224
      finish_elf64_header:
31 halyavin 3225
	mov	[ebx+28h],eax
157 heavyiron 3226
	mov	eax,[current_section]
3227
	inc	ax
3228
	jz	format_limitations_exceeded
3229
	mov	[ebx+3Eh],ax
3230
	inc	ax
3231
	jz	format_limitations_exceeded
3232
	mov	[ebx+3Ch],ax
3233
      elf_header_finished:
31 halyavin 3234
	xor	eax,eax
157 heavyiron 3235
	mov	ecx,10
3236
	rep	stos dword [edi]
3237
	test	[format_flags],8
3238
	jz	elf_null_section_ok
3239
	mov	ecx,6
3240
	rep	stos dword [edi]
3241
      elf_null_section_ok:
31 halyavin 3242
	mov	esi,ebp
157 heavyiron 3243
	xor	ecx,ecx
3244
      make_section_entry:
31 halyavin 3245
	mov	ebx,edi
157 heavyiron 3246
	mov	eax,[esi+4]
3247
	mov	eax,[eax]
3248
	stos	dword [edi]
3249
	mov	eax,1
3250
	cmp	dword [esi+0Ch],0
3251
	je	bss_section
3252
	test	byte [esi+14h],80h
3253
	jz	section_type_ok
3254
      bss_section:
31 halyavin 3255
	mov	al,8
157 heavyiron 3256
      section_type_ok:
31 halyavin 3257
	stos	dword [edi]
157 heavyiron 3258
	mov	eax,[esi+14h]
3259
	and	al,3Fh
3260
	call	store_elf_machine_word
3261
	xor	eax,eax
3262
	call	store_elf_machine_word
3263
	mov	eax,[esi+8]
3264
	mov	[image_base],eax
3265
	sub	eax,[code_start]
3266
	call	store_elf_machine_word
3267
	mov	eax,[esi+0Ch]
3268
	call	store_elf_machine_word
3269
	xor	eax,eax
3270
	stos	dword [edi]
3271
	stos	dword [edi]
3272
	mov	eax,[esi+10h]
3273
	call	store_elf_machine_word
3274
	xor	eax,eax
3275
	call	store_elf_machine_word
3276
	inc	ecx
3277
	add	esi,20h
3278
	xchg	edi,[esp]
3279
	mov	ebp,edi
3280
      convert_relocations:
31 halyavin 3281
	cmp	esi,[free_additional_memory]
157 heavyiron 3282
	je	relocations_converted
3283
	mov	al,[esi]
3284
	or	al,al
3285
	jz	relocations_converted
3286
	cmp	al,80h
3287
	jb	make_relocation_entry
3288
	ja	relocation_entry_ok
3289
	add	esi,10h
3290
	jmp	convert_relocations
3291
      make_relocation_entry:
31 halyavin 3292
	test	[format_flags],8
157 heavyiron 3293
	jnz	make_elf64_relocation_entry
3294
	mov	eax,[esi+4]
3295
	stos	dword [edi]
3296
	mov	eax,[esi+8]
3297
	mov	eax,[eax]
3298
	mov	al,[esi]
3299
	stos	dword [edi]
3300
	jmp	relocation_entry_ok
3301
      make_elf64_relocation_entry:
31 halyavin 3302
	mov	eax,[esi+4]
157 heavyiron 3303
	stos	dword [edi]
3304
	xor	eax,eax
3305
	stos	dword [edi]
3306
	movzx	eax,byte [esi]
3307
	stos	dword [edi]
3308
	mov	eax,[esi+8]
3309
	mov	eax,[eax]
3310
	shr	eax,8
3311
	stos	dword [edi]
3312
	xor	eax,eax
3313
	stos	dword [edi]
3314
	stos	dword [edi]
3315
      relocation_entry_ok:
31 halyavin 3316
	add	esi,0Ch
157 heavyiron 3317
	jmp	convert_relocations
3318
      store_elf_machine_word:
31 halyavin 3319
	stos	dword [edi]
157 heavyiron 3320
	test	[format_flags],8
3321
	jz	elf_machine_word_ok
3322
	mov	dword [edi],0
3323
	add	edi,4
3324
      elf_machine_word_ok:
31 halyavin 3325
	ret
157 heavyiron 3326
      relocations_converted:
31 halyavin 3327
	cmp	edi,ebp
157 heavyiron 3328
	xchg	edi,[esp]
3329
	je	rel_section_ok
3330
	mov	eax,[ebx]
3331
	sub	eax,4
3332
	test	[format_flags],8
3333
	jz	store_relocations_name_offset
3334
	dec	eax
3335
      store_relocations_name_offset:
31 halyavin 3336
	stos	dword [edi]
157 heavyiron 3337
	test	[format_flags],8
3338
	jnz	rela_section
3339
	mov	eax,9
3340
	jmp	store_relocations_type
3341
      rela_section:
31 halyavin 3342
	mov	eax,4
157 heavyiron 3343
      store_relocations_type:
31 halyavin 3344
	stos	dword [edi]
157 heavyiron 3345
	xor	al,al
3346
	call	store_elf_machine_word
3347
	call	store_elf_machine_word
3348
	mov	eax,ebp
3349
	sub	eax,[code_start]
3350
	call	store_elf_machine_word
3351
	mov	eax,[esp]
3352
	sub	eax,ebp
3353
	call	store_elf_machine_word
3354
	mov	eax,[current_section]
3355
	stos	dword [edi]
3356
	mov	eax,ecx
3357
	stos	dword [edi]
3358
	inc	ecx
3359
	test	[format_flags],8
3360
	jnz	finish_elf64_rela_section
3361
	mov	eax,4
3362
	stos	dword [edi]
3363
	mov	al,8
3364
	stos	dword [edi]
3365
	jmp	rel_section_ok
3366
      finish_elf64_rela_section:
31 halyavin 3367
	mov	eax,8
157 heavyiron 3368
	stos	dword [edi]
3369
	xor	al,al
3370
	stos	dword [edi]
3371
	mov	al,24
3372
	stos	dword [edi]
3373
	xor	al,al
3374
	stos	dword [edi]
3375
      rel_section_ok:
31 halyavin 3376
	cmp	esi,[free_additional_memory]
157 heavyiron 3377
	jne	make_section_entry
3378
	pop	eax
3379
	mov	ebx,[code_start]
3380
	sub	eax,ebx
3381
	mov	[code_size],eax
3382
	mov	ecx,20h
3383
	test	[format_flags],8
3384
	jz	adjust_elf_section_headers_offset
3385
	mov	ecx,28h
3386
      adjust_elf_section_headers_offset:
31 halyavin 3387
	add	[ebx+ecx],eax
157 heavyiron 3388
	mov	eax,1
3389
	stos	dword [edi]
3390
	mov	al,2
3391
	stos	dword [edi]
3392
	xor	al,al
3393
	call	store_elf_machine_word
3394
	call	store_elf_machine_word
3395
	mov	eax,[code_size]
3396
	call	store_elf_machine_word
3397
	mov	eax,[edx+1]
3398
	sub	eax,[free_additional_memory]
3399
	call	store_elf_machine_word
3400
	mov	eax,[current_section]
3401
	inc	eax
3402
	stos	dword [edi]
3403
	mov	eax,[number_of_sections]
3404
	inc	eax
3405
	stos	dword [edi]
3406
	test	[format_flags],8
3407
	jnz	finish_elf64_sym_section
3408
	mov	eax,4
3409
	stos	dword [edi]
3410
	mov	al,10h
3411
	stos	dword [edi]
3412
	jmp	sym_section_ok
3413
      finish_elf64_sym_section:
31 halyavin 3414
	mov	eax,8
157 heavyiron 3415
	stos	dword [edi]
3416
	xor	al,al
3417
	stos	dword [edi]
3418
	mov	al,18h
3419
	stos	dword [edi]
3420
	xor	al,al
3421
	stos	dword [edi]
3422
      sym_section_ok:
31 halyavin 3423
	mov	al,1+8
157 heavyiron 3424
	stos	dword [edi]
3425
	mov	al,3
3426
	stos	dword [edi]
3427
	xor	al,al
3428
	call	store_elf_machine_word
3429
	call	store_elf_machine_word
3430
	mov	eax,[edx+1]
3431
	sub	eax,[free_additional_memory]
3432
	add	eax,[code_size]
3433
	call	store_elf_machine_word
3434
	mov	eax,[edx+1+8]
3435
	sub	eax,[edx+1]
3436
	call	store_elf_machine_word
3437
	xor	eax,eax
3438
	stos	dword [edi]
3439
	stos	dword [edi]
3440
	mov	al,1
3441
	call	store_elf_machine_word
3442
	xor	eax,eax
3443
	call	store_elf_machine_word
3444
	mov	eax,'tab'
3445
	mov	dword [edx+1],'.sym'
3446
	mov	[edx+1+4],eax
3447
	mov	dword [edx+1+8],'.str'
3448
	mov	[edx+1+8+4],eax
3449
	mov	[written_size],0
3450
	mov	edx,[output_file]
3451
	call	create
3452
	jc	write_failed
3453
	call	write_code
3454
	mov	ecx,edi
3455
	mov	edx,[free_additional_memory]
3456
	sub	ecx,edx
3457
	add	[written_size],ecx
3458
	call	write
3459
	jc	write_failed
3460
	jmp	output_written
3461
31 halyavin 3462
 
3463
	add	esi,2
157 heavyiron 3464
	or	[format_flags],1
3465
	mov	[image_base],8048000h
3466
	cmp	byte [esi],80h
3467
	jne	elf_exe_base_ok
3468
	lods	word [esi]
3469
	cmp	ah,'('
3470
	jne	invalid_argument
3471
	cmp	byte [esi],'.'
3472
	je	invalid_value
3473
	push	edx
3474
	call	get_dword_value
3475
	cmp	[value_type],0
3476
	jne	invalid_use_of_symbol
3477
	mov	[image_base],eax
3478
	pop	edx
3479
      elf_exe_base_ok:
31 halyavin 3480
	mov	byte [edx+10h],2
157 heavyiron 3481
	mov	byte [edx+2Ah],20h
3482
	mov	ebx,edi
3483
	mov	ecx,20h shr 2
3484
	cmp	[current_pass],0
3485
	je	init_elf_segments
3486
	imul	ecx,[number_of_sections]
3487
      init_elf_segments:
109 heavyiron 3488
	xor	eax,eax
157 heavyiron 3489
	rep	stos dword [edi]
3490
	mov	[number_of_sections],0
3491
	mov	byte [ebx],1
3492
	mov	word [ebx+1Ch],1000h
3493
	mov	byte [ebx+18h],111b
3494
	mov	eax,edi
3495
	sub	eax,[code_start]
3496
	mov	[ebx+4],eax
3497
	add	eax,[image_base]
3498
	mov	[ebx+8],eax
3499
	mov	[ebx+0Ch],eax
3500
	mov	[edx+18h],eax
3501
	xor	edx,edx
3502
	not	eax
3503
	not	edx
3504
	add	eax,1
3505
	adc	edx,0
3506
	add	eax,edi
3507
	adc	edx,0
3508
	mov	dword [org_origin],eax
3509
	mov	dword [org_origin+4],edx
3510
	mov	[org_registers],0
3511
	mov	[org_start],edi
3512
	mov	[symbols_stream],edi
3513
	jmp	instruction_assembled
3514
      format_elf64_exe:
31 halyavin 3515
	add	esi,2
157 heavyiron 3516
	or	[format_flags],1
3517
	mov	[image_base],400000h
3518
	mov	[image_base_high],0
3519
	cmp	byte [esi],80h
3520
	jne	elf64_exe_base_ok
3521
	lods	word [esi]
3522
	cmp	ah,'('
3523
	jne	invalid_argument
3524
	cmp	byte [esi],'.'
3525
	je	invalid_value
3526
	push	edx
3527
	call	get_qword_value
3528
	cmp	[value_type],0
3529
	jne	invalid_use_of_symbol
3530
	mov	[image_base],eax
3531
	mov	[image_base_high],edx
3532
	pop	edx
3533
      elf64_exe_base_ok:
31 halyavin 3534
	mov	byte [edx+10h],2
157 heavyiron 3535
	mov	byte [edx+36h],38h
3536
	mov	ebx,edi
3537
	mov	ecx,38h shr 2
3538
	cmp	[current_pass],0
3539
	je	init_elf64_segments
3540
	imul	ecx,[number_of_sections]
3541
      init_elf64_segments:
109 heavyiron 3542
	xor	eax,eax
157 heavyiron 3543
	rep	stos dword [edi]
3544
	mov	[number_of_sections],0
3545
	mov	byte [ebx],1
3546
	mov	word [ebx+30h],1000h
3547
	mov	byte [ebx+4],111b
3548
	push	edx
3549
	mov	eax,edi
3550
	sub	eax,[code_start]
3551
	mov	[ebx+8],eax
3552
	xor	edx,edx
3553
	add	eax,[image_base]
3554
	adc	edx,[image_base_high]
3555
	mov	[ebx+10h],eax
3556
	mov	[ebx+10h+4],edx
3557
	mov	[ebx+18h],eax
3558
	mov	[ebx+18h+4],edx
3559
	pop	ebx
3560
	mov	[ebx+18h],eax
3561
	mov	[ebx+18h+4],edx
3562
	not	eax
3563
	not	edx
3564
	add	eax,1
3565
	adc	edx,0
3566
	add	eax,edi
3567
	adc	edx,0
3568
	mov	dword [org_origin],eax
3569
	mov	dword [org_origin+4],edx
3570
	mov	[org_registers],0
3571
	mov	[org_start],edi
3572
	mov	[symbols_stream],edi
3573
	jmp	instruction_assembled
3574
elf_entry:
31 halyavin 3575
	lods	byte [esi]
157 heavyiron 3576
	cmp	al,'('
3577
	jne	invalid_argument
3578
	cmp	byte [esi],'.'
3579
	je	invalid_value
3580
	test	[format_flags],8
3581
	jnz	elf64_entry
3582
	call	get_dword_value
3583
	cmp	[value_type],0
3584
	jne	invalid_use_of_symbol
3585
	mov	edx,[code_start]
3586
	mov	[edx+18h],eax
3587
	jmp	instruction_assembled
3588
      elf64_entry:
31 halyavin 3589
	call	get_qword_value
157 heavyiron 3590
	cmp	[value_type],0
3591
	jne	invalid_use_of_symbol
3592
	mov	ebx,[code_start]
3593
	mov	[ebx+18h],eax
3594
	mov	[ebx+1Ch],edx
3595
	jmp	instruction_assembled
3596
elf_segment:
109 heavyiron 3597
	bt	[format_flags],0
157 heavyiron 3598
	jnc	illegal_instruction
3599
	test	[format_flags],8
3600
	jnz	elf64_segment
3601
	call	close_elf_segment
3602
	push	eax
3603
	mov	ebx,[number_of_sections]
3604
	shl	ebx,5
3605
	add	ebx,[code_start]
3606
	add	ebx,34h
3607
	cmp	ebx,[symbols_stream]
3608
	jb	new_elf_segment
3609
	mov	ebx,[symbols_stream]
3610
	sub	ebx,20h
3611
	push	edi
3612
	mov	edi,ebx
3613
	mov	ecx,20h shr 2
3614
	xor	eax,eax
3615
	rep	stos dword [edi]
3616
	pop	edi
3617
	or	[next_pass_needed],-1
3618
      new_elf_segment:
109 heavyiron 3619
	mov	byte [ebx],1
157 heavyiron 3620
	mov	word [ebx+1Ch],1000h
3621
      elf_segment_flags:
109 heavyiron 3622
	cmp	byte [esi],19h
157 heavyiron 3623
	jne	elf_segment_flags_ok
3624
	lods	word [esi]
3625
	sub	ah,28
3626
	jbe	invalid_argument
3627
	cmp	ah,1
3628
	je	mark_elf_segment_flag
3629
	cmp	ah,3
3630
	ja	invalid_argument
3631
	xor	ah,1
3632
	cmp	ah,2
3633
	je	mark_elf_segment_flag
3634
	inc	ah
3635
      mark_elf_segment_flag:
109 heavyiron 3636
	test	[ebx+18h],ah
157 heavyiron 3637
	jnz	setting_already_specified
3638
	or	[ebx+18h],ah
3639
	jmp	elf_segment_flags
3640
      elf_segment_flags_ok:
109 heavyiron 3641
	mov	eax,edi
157 heavyiron 3642
	sub	eax,[code_start]
3643
	mov	[ebx+4],eax
3644
	pop	edx
3645
	and	eax,0FFFh
3646
	add	edx,eax
3647
	mov	[ebx+8],edx
3648
	mov	[ebx+0Ch],edx
3649
	mov	eax,edx
3650
	xor	edx,edx
3651
	not	eax
3652
	not	edx
3653
	add	eax,1
3654
	adc	edx,0
3655
	add	eax,edi
3656
	adc	edx,0
3657
	mov	dword [org_origin],eax
3658
	mov	dword [org_origin+4],edx
3659
	mov	[org_registers],0
3660
	mov	[org_start],edi
3661
	inc	[number_of_sections]
3662
	jmp	instruction_assembled
3663
      close_elf_segment:
109 heavyiron 3664
	cmp	[number_of_sections],0
157 heavyiron 3665
	jne	finish_elf_segment
3666
	cmp	edi,[symbols_stream]
3667
	jne	first_elf_segment_ok
3668
	push	edi
3669
	mov	edi,[code_start]
3670
	add	edi,34h
3671
	mov	ecx,20h shr 2
3672
	xor	eax,eax
3673
	rep	stos dword [edi]
3674
	pop	edi
3675
	mov	eax,[image_base]
3676
	ret
3677
      first_elf_segment_ok:
109 heavyiron 3678
	inc	[number_of_sections]
157 heavyiron 3679
      finish_elf_segment:
109 heavyiron 3680
	mov	ebx,[number_of_sections]
157 heavyiron 3681
	dec	ebx
3682
	shl	ebx,5
3683
	add	ebx,[code_start]
3684
	add	ebx,34h
3685
	mov	eax,edi
3686
	sub	eax,[code_start]
3687
	sub	eax,[ebx+4]
3688
	mov	edx,edi
3689
	cmp	edi,[undefined_data_end]
3690
	jne	elf_segment_size_ok
3691
	mov	edi,[undefined_data_start]
3692
      elf_segment_size_ok:
109 heavyiron 3693
	mov	[ebx+14h],eax
157 heavyiron 3694
	add	eax,edi
3695
	sub	eax,edx
3696
	mov	[ebx+10h],eax
3697
	mov	eax,[ebx+8]
3698
	add	eax,[ebx+14h]
3699
	add	eax,0FFFh
3700
	and	eax,not 0FFFh
3701
	ret
3702
      elf64_segment:
109 heavyiron 3703
	call	close_elf64_segment
157 heavyiron 3704
	push	eax edx
3705
	mov	ebx,[number_of_sections]
3706
	imul	ebx,38h
3707
	add	ebx,[code_start]
3708
	add	ebx,40h
3709
	cmp	ebx,[symbols_stream]
3710
	jb	new_elf64_segment
3711
	mov	ebx,[symbols_stream]
3712
	sub	ebx,38h
3713
	push	edi
3714
	mov	edi,ebx
3715
	mov	ecx,38h shr 2
3716
	xor	eax,eax
3717
	rep	stos dword [edi]
3718
	pop	edi
3719
	or	[next_pass_needed],-1
3720
      new_elf64_segment:
109 heavyiron 3721
	mov	byte [ebx],1
157 heavyiron 3722
	mov	word [ebx+30h],1000h
3723
      elf64_segment_flags:
109 heavyiron 3724
	cmp	byte [esi],19h
157 heavyiron 3725
	jne	elf64_segment_flags_ok
3726
	lods	word [esi]
3727
	sub	ah,28
3728
	jbe	invalid_argument
3729
	cmp	ah,1
3730
	je	mark_elf64_segment_flag
3731
	cmp	ah,3
3732
	ja	invalid_argument
3733
	xor	ah,1
3734
	cmp	ah,2
3735
	je	mark_elf64_segment_flag
3736
	inc	ah
3737
      mark_elf64_segment_flag:
109 heavyiron 3738
	test	[ebx+4],ah
157 heavyiron 3739
	jnz	setting_already_specified
3740
	or	[ebx+4],ah
3741
	jmp	elf64_segment_flags
3742
      elf64_segment_flags_ok:
109 heavyiron 3743
	mov	ecx,edi
157 heavyiron 3744
	sub	ecx,[code_start]
3745
	mov	[ebx+8],ecx
3746
	pop	edx eax
3747
	and	ecx,0FFFh
3748
	add	eax,ecx
3749
	adc	edx,0
3750
	mov	[ebx+10h],eax
3751
	mov	[ebx+10h+4],edx
3752
	mov	[ebx+18h],eax
3753
	mov	[ebx+18h+4],edx
3754
	not	eax
3755
	not	edx
3756
	add	eax,1
3757
	adc	edx,0
3758
	add	eax,edi
3759
	adc	edx,0
3760
	mov	dword [org_origin],eax
3761
	mov	dword [org_origin+4],edx
3762
	mov	[org_registers],0
3763
	mov	[org_start],edi
3764
	inc	[number_of_sections]
3765
	jmp	instruction_assembled
3766
      close_elf64_segment:
109 heavyiron 3767
	cmp	[number_of_sections],0
157 heavyiron 3768
	jne	finish_elf64_segment
3769
	cmp	edi,[symbols_stream]
3770
	jne	first_elf64_segment_ok
3771
	push	edi
3772
	mov	edi,[code_start]
3773
	add	edi,40h
3774
	mov	ecx,38h shr 2
3775
	xor	eax,eax
3776
	rep	stos dword [edi]
3777
	pop	edi
3778
	mov	eax,[image_base]
3779
	mov	edx,[image_base_high]
3780
	ret
3781
      first_elf64_segment_ok:
109 heavyiron 3782
	inc	[number_of_sections]
157 heavyiron 3783
      finish_elf64_segment:
109 heavyiron 3784
	mov	ebx,[number_of_sections]
157 heavyiron 3785
	dec	ebx
3786
	imul	ebx,38h
3787
	add	ebx,[code_start]
3788
	add	ebx,40h
3789
	mov	eax,edi
3790
	sub	eax,[code_start]
3791
	sub	eax,[ebx+8]
3792
	mov	edx,edi
3793
	cmp	edi,[undefined_data_end]
3794
	jne	elf64_segment_size_ok
3795
	mov	edi,[undefined_data_start]
3796
      elf64_segment_size_ok:
109 heavyiron 3797
	mov	[ebx+28h],eax
157 heavyiron 3798
	add	eax,edi
3799
	sub	eax,edx
3800
	mov	[ebx+20h],eax
3801
	mov	eax,[ebx+10h]
3802
	mov	edx,[ebx+10h+4]
3803
	add	eax,[ebx+28h]
3804
	adc	edx,0
3805
	sub	eax,1
3806
	sbb	edx,0
3807
	shrd	eax,edx,12
3808
	shr	edx,12
3809
	add	eax,1
3810
	adc	edx,0
3811
	shld	edx,eax,12
3812
	shl	eax,12
3813
	ret
3814
close_elf_exe:
31 halyavin 3815
	test	[format_flags],8
157 heavyiron 3816
	jnz	close_elf64_exe
3817
	call	close_elf_segment
3818
	mov	edx,[code_start]
3819
	mov	eax,[number_of_sections]
3820
	mov	byte [edx+1Ch],34h
3821
	mov	[edx+2Ch],ax
3822
	shl	eax,5
3823
	add	eax,edx
3824
	add	eax,34h
3825
	cmp	eax,[symbols_stream]
3826
	je	elf_exe_ok
3827
	or	[next_pass_needed],-1
3828
      elf_exe_ok:
31 halyavin 3829
	ret
157 heavyiron 3830
      close_elf64_exe:
31 halyavin 3831
	call	close_elf64_segment
157 heavyiron 3832
	mov	edx,[code_start]
3833
	mov	eax,[number_of_sections]
3834
	mov	byte [edx+20h],40h
3835
	mov	[edx+38h],ax
3836
	imul	eax,38h
3837
	add	eax,edx
3838
	add	eax,40h
3839
	cmp	eax,[symbols_stream]
3840
	je	elf64_exe_ok
3841
	or	[next_pass_needed],-1
3842
      elf64_exe_ok:
31 halyavin 3843
	ret
157 heavyiron 3844