Subversion Repositories Kolibri OS

Rev

Rev 2664 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2664 Rev 2665
Line 33... Line 33...
33
	mov	[undefined_data_end],eax
33
	mov	[undefined_data_end],eax
34
	mov	[file_extension],eax
34
	mov	[file_extension],eax
35
	mov	[next_pass_needed],al
35
	mov	[next_pass_needed],al
36
	mov	[output_format],al
36
	mov	[output_format],al
37
	mov	[labels_type],al
37
	mov	[org_origin_sign],al
-
 
38
	mov	[adjustment_sign],al
-
 
39
	mov	[labels_type],al
38
	mov	[virtual_data],al
40
	mov	[virtual_data],al
39
	mov	[code_type],16
41
	mov	[code_type],16
40
      pass_loop:
42
      pass_loop:
41
	call	assemble_line
43
	call	assemble_line
42
	jnc	pass_loop
44
	jnc	pass_loop
Line 167... Line 169...
167
	mov	[current_line],eax
169
	mov	[current_line],eax
168
	mov	[prefixed_instruction],0
170
	mov	[prefixed_instruction],0
169
	cmp	[symbols_file],0
171
	cmp	[symbols_file],0
170
	je	continue_line
172
	je	continue_line
171
	mov	ebx,[display_buffer]
173
	cmp	[next_pass_needed],0
-
 
174
	jne	continue_line
-
 
175
	mov	ebx,[display_buffer]
172
	mov	dword [ebx-4],1
176
	mov	dword [ebx-4],1
173
	mov	dword [ebx-8],1Ch
177
	mov	dword [ebx-8],1Ch
174
	sub	ebx,8+1Ch
178
	sub	ebx,8+1Ch
175
	cmp	ebx,edi
179
	cmp	ebx,edi
176
	jbe	out_of_memory
180
	jbe	out_of_memory
Line 183... Line 187...
183
	mov	[ebx+8],eax
187
	mov	[ebx+8],eax
184
	mov	[ebx+8+4],edx
188
	mov	[ebx+8+4],edx
185
	mov	[ebx+10h],ecx
189
	mov	[ebx+10h],ecx
186
	mov	edx,[org_symbol]
190
	mov	edx,[org_symbol]
187
	mov	eax,dword [labels_type]
191
;        mov     al,[virtual_data]
-
 
192
;        mov     ah,[org_origin_sign]
-
 
193
;        shl     eax,16
-
 
194
;        mov     al,[labels_type]
-
 
195
;        mov     ah,[code_type]
-
 
196
	mov	eax,dword [labels_type]
188
	mov	[ebx+14h],edx
197
	mov	[ebx+14h],edx
189
	mov	[ebx+18h],eax
198
	mov	[ebx+18h],eax
190
      continue_line:
199
      continue_line:
191
	cmp	byte [esi],0Fh
200
	cmp	byte [esi],0Fh
192
	je	line_assembled
201
	je	line_assembled
Line 197... Line 206...
197
	jb	invalid_use_of_symbol
206
	jb	invalid_use_of_symbol
198
	je	reserved_word_used_as_symbol
207
	je	reserved_word_used_as_symbol
199
	mov	ebx,eax
208
	mov	ebx,eax
200
	lods	byte [esi]
209
	lods	byte [esi]
201
	mov	cl,al
210
	mov	[label_size],al
202
	mov	eax,edi
211
	call	make_label
-
 
212
	jmp	continue_line
-
 
213
      make_label:
-
 
214
	mov	eax,edi
203
	xor	edx,edx
215
	xor	edx,edx
204
	sub	eax,dword [org_origin]
216
	xor	cl,cl
-
 
217
	sub	eax,dword [org_origin]
205
	sbb	edx,dword [org_origin+4]
218
	sbb	edx,dword [org_origin+4]
206
	mov	ch,[labels_type]
219
	sbb	cl,[org_origin_sign]
-
 
220
	jp	label_value_ok
-
 
221
	call	recoverable_overflow
-
 
222
      label_value_ok:
-
 
223
	mov	[address_sign],cl
207
	cmp	[virtual_data],0
224
	cmp	[virtual_data],0
208
	jne	make_virtual_label
225
	jne	make_virtual_label
209
	or	byte [ebx+9],1
226
	or	byte [ebx+9],1
210
	xchg	eax,[ebx]
227
	xchg	eax,[ebx]
211
	xchg	edx,[ebx+4]
228
	xchg	edx,[ebx+4]
212
	sub	eax,[ebx]
229
	mov	ch,[ebx+9]
-
 
230
	shr	ch,1
-
 
231
	and	ch,1
-
 
232
	neg	ch
-
 
233
	sub	eax,[ebx]
213
	sbb	edx,[ebx+4]
234
	sbb	edx,[ebx+4]
214
	mov	dword [adjustment],eax
235
	sbb	ch,cl
-
 
236
	mov	dword [adjustment],eax
215
	mov	dword [adjustment+4],edx
237
	mov	dword [adjustment+4],edx
216
	or	eax,edx
238
	mov	[adjustment_sign],ch
-
 
239
	or	al,ch
-
 
240
	or	eax,edx
217
	setnz	ah
241
	setnz	ah
218
	jmp	finish_label_symbol
242
	jmp	finish_label
219
      make_virtual_label:
243
      make_virtual_label:
220
	and	byte [ebx+9],not 1
244
	and	byte [ebx+9],not 1
221
	cmp	eax,[ebx]
245
	cmp	eax,[ebx]
222
	mov	[ebx],eax
246
	mov	[ebx],eax
223
	setne	ah
247
	setne	ah
224
	cmp	edx,[ebx+4]
248
	cmp	edx,[ebx+4]
225
	mov	[ebx+4],edx
249
	mov	[ebx+4],edx
226
	setne	al
250
	setne	al
227
	or	ah,al
251
	or	ah,al
228
      finish_label_symbol:
252
      finish_label:
-
 
253
	mov	ch,[labels_type]
-
 
254
	mov	cl,[label_size]
-
 
255
	mov	ebp,[org_registers]
-
 
256
	mov	edx,[org_symbol]
-
 
257
      finish_label_symbol:
229
	cmp	cl,[ebx+10]
258
	mov	al,[address_sign]
-
 
259
	xor	al,[ebx+9]
-
 
260
	and	al,10b
-
 
261
	or	ah,al
-
 
262
	xor	[ebx+9],al
-
 
263
	cmp	cl,[ebx+10]
230
	mov	[ebx+10],cl
264
	mov	[ebx+10],cl
231
	setne	al
265
	setne	al
232
	or	ah,al
266
	or	ah,al
233
	cmp	ch,[ebx+11]
267
	cmp	ch,[ebx+11]
234
	mov	[ebx+11],ch
268
	mov	[ebx+11],ch
235
	setne	al
269
	setne	al
236
	or	ah,al
270
	or	ah,al
237
	mov	edx,[org_registers]
271
	cmp	ebp,[ebx+12]
238
	cmp	edx,[ebx+12]
-
 
239
	mov	[ebx+12],edx
272
	mov	[ebx+12],ebp
240
	setne	al
273
	setne	al
241
	or	ah,al
274
	or	ah,al
242
	or	ch,ch
275
	or	ch,ch
243
	jz	label_symbol_ok
276
	jz	label_symbol_ok
244
	mov	edx,[org_symbol]
277
	cmp	edx,[ebx+20]
245
	cmp	edx,[ebx+20]
-
 
246
	mov	[ebx+20],edx
278
	mov	[ebx+20],edx
247
	setne	al
279
	setne	al
248
	or	ah,al
280
	or	ah,al
249
      label_symbol_ok:
281
      label_symbol_ok:
250
	mov	cx,[current_pass]
282
	mov	cx,[current_pass]
Line 259... Line 291...
259
	inc	cx
291
	inc	cx
260
	sub	cx,[ebx+16]
292
	sub	cx,[ebx+16]
261
	setnz	al
293
	setnz	al
262
	or	ah,al
294
	or	ah,al
263
	jz	continue_line
295
	jz	label_made
264
	test	byte [ebx+8],8
296
	test	byte [ebx+8],8
265
	jz	continue_line
297
	jz	label_made
266
	mov	cx,[current_pass]
298
	mov	cx,[current_pass]
267
	cmp	cx,[ebx+18]
299
	cmp	cx,[ebx+18]
268
	jne	continue_line
300
	jne	label_made
269
	or	[next_pass_needed],-1
301
	or	[next_pass_needed],-1
270
	jmp	continue_line
302
      label_made:
271
      new_label:
303
	ret
-
 
304
      new_label:
272
	or	byte [ebx+8],1
305
	or	byte [ebx+8],1
273
	jmp	continue_line
306
	ret
274
      define_constant:
307
      define_constant:
275
	lods	dword [esi]
308
	lods	dword [esi]
276
	inc	esi
309
	inc	esi
277
	cmp	eax,0Fh
310
	cmp	eax,0Fh
278
	jb	invalid_use_of_symbol
311
	jb	invalid_use_of_symbol
279
	je	reserved_word_used_as_symbol
312
	je	reserved_word_used_as_symbol
Line 291... Line 324...
291
      get_constant_value:
324
      get_constant_value:
292
	push	eax
325
	push	eax
293
	mov	al,byte [esi-1]
326
	mov	al,byte [esi-1]
294
	push	eax
327
	push	eax
295
	call	get_value
328
	or	[size_override],-1
-
 
329
	call	get_value
296
	pop	ebx
330
	pop	ebx
297
	mov	ch,bl
331
	mov	ch,bl
298
	pop	ebx
332
	pop	ebx
299
	pop	dword [ebx+8]
333
	pop	dword [ebx+8]
300
	cmp	ebx,0Fh
334
	cmp	ebx,0Fh
Line 312... Line 346...
312
	cmp	edx,[ebx+4]
346
	cmp	edx,[ebx+4]
313
	mov	[ebx+4],edx
347
	mov	[ebx+4],edx
314
	setne	al
348
	setne	al
315
	or	ah,al
349
	or	ah,al
316
	cmp	cl,[ebx+10]
350
	mov	al,[value_sign]
-
 
351
	xor	al,[ebx+9]
-
 
352
	and	al,10b
-
 
353
	or	ah,al
-
 
354
	xor	[ebx+9],al
-
 
355
	cmp	cl,[ebx+10]
317
	mov	[ebx+10],cl
356
	mov	[ebx+10],cl
318
	setne	al
357
	setne	al
319
	or	ah,al
358
	or	ah,al
320
	cmp	ch,[ebx+11]
359
	cmp	ch,[ebx+11]
321
	mov	[ebx+11],ch
360
	mov	[ebx+11],ch
Line 368... Line 407...
368
;        mov     [operand_size],0
407
;        mov     [operand_size],0
369
;        mov     [size_override],0
408
;        mov     [size_override],0
370
;        mov     [operand_prefix],0
409
;        mov     [operand_prefix],0
371
;        mov     [opcode_prefix],0
410
;        mov     [opcode_prefix],0
372
	mov	dword [operand_size],0
411
	and	dword [operand_size],0
373
;        mov     [rex_prefix],0
412
;        mov     [rex_prefix],0
374
;        mov     [vex_required],0
413
;        mov     [vex_required],0
375
;        mov     [vex_register],0
414
;        mov     [vex_register],0
376
;        mov     [immediate_size],0
415
;        mov     [immediate_size],0
377
	mov	dword [rex_prefix],0
416
	and	dword [rex_prefix],0
378
	call	instruction_handler
417
	call	instruction_handler
379
      instruction_handler:
418
      instruction_handler:
380
	movzx	ebx,word [esi]
419
	movzx	ebx,word [esi]
381
	mov	al,[esi+2]
420
	mov	al,[esi+2]
382
	add	esi,3
421
	add	esi,3
383
	add	[esp],ebx
422
	add	[esp],ebx
Line 406... Line 445...
406
	mov	cl,[value_type]
445
	mov	cl,[value_type]
407
	test	cl,1
446
	test	cl,1
408
	jnz	invalid_use_of_symbol
447
	jnz	invalid_use_of_symbol
409
	mov	[labels_type],cl
448
	mov	[labels_type],cl
410
	mov	ecx,edi
449
	mov	dword [org_origin],edi
411
	sub	ecx,eax
450
	xor	ecx,ecx
412
	adc	edx,0
451
	mov	dword [org_origin+4],ecx
-
 
452
	mov	[org_origin_sign],cl
-
 
453
	mov	[org_registers],ecx
413
	neg	edx
454
	mov	cl,[value_sign]
414
	mov	dword [org_origin],ecx
455
	sub	dword [org_origin],eax
415
	mov	dword [org_origin+4],edx
456
	sbb	dword [org_origin+4],edx
416
	mov	[org_registers],0
457
	sbb	[org_origin_sign],cl
417
	mov	[org_start],edi
458
	jp	org_value_ok
-
 
459
	call	recoverable_overflow
-
 
460
      org_value_ok:
-
 
461
	mov	[org_start],edi
418
	mov	edx,[symbol_identifier]
462
	mov	edx,[symbol_identifier]
419
	mov	[org_symbol],edx
463
	mov	[org_symbol],edx
420
	cmp	[output_format],1
464
	cmp	[output_format],1
421
	ja	instruction_assembled
465
	ja	instruction_assembled
422
	cmp	edi,[code_start]
466
	cmp	edi,[code_start]
Line 434... Line 478...
434
	jb	invalid_use_of_symbol
478
	jb	invalid_use_of_symbol
435
	je	reserved_word_used_as_symbol
479
	je	reserved_word_used_as_symbol
436
	inc	esi
480
	inc	esi
437
	mov	ebx,eax
481
	mov	ebx,eax
438
	xor	cl,cl
482
	mov	[label_size],0
439
	lods	byte [esi]
483
	lods	byte [esi]
440
	cmp	al,':'
484
	cmp	al,':'
441
	je	get_label_size
485
	je	get_label_size
442
	dec	esi
486
	dec	esi
443
	cmp	al,11h
487
	cmp	al,11h
444
	jne	label_size_ok
488
	jne	label_size_ok
445
      get_label_size:
489
      get_label_size:
446
	lods	word [esi]
490
	lods	word [esi]
447
	cmp	al,11h
491
	cmp	al,11h
448
	jne	invalid_argument
492
	jne	invalid_argument
449
	mov	cl,ah
493
	mov	[label_size],ah
450
      label_size_ok:
494
      label_size_ok:
451
	mov	eax,edi
495
	cmp	byte [esi],80h
452
	xor	edx,edx
-
 
453
	sub	eax,dword [org_origin]
-
 
454
	sbb	edx,dword [org_origin+4]
-
 
455
	mov	ebp,[org_registers]
-
 
456
	cmp	byte [esi],80h
-
 
457
	je	get_free_label_value
496
	je	get_free_label_value
458
	mov	ch,[labels_type]
497
	call	make_label
459
	push	[org_symbol]
-
 
460
	pop	[address_symbol]
-
 
461
	cmp	[virtual_data],0
-
 
462
	jne	make_free_label
-
 
463
	or	byte [ebx+9],1
498
	jmp	instruction_assembled
464
	xchg	eax,[ebx]
-
 
465
	xchg	edx,[ebx+4]
-
 
466
	sub	eax,[ebx]
-
 
467
	sbb	edx,[ebx+4]
-
 
468
	mov	dword [adjustment],eax
-
 
469
	mov	dword [adjustment+4],edx
-
 
470
	or	eax,edx
-
 
471
	setne	ah
-
 
472
	jmp	finish_label
-
 
473
      get_free_label_value:
499
      get_free_label_value:
474
	inc	esi
500
	inc	esi
475
	lods	byte [esi]
501
	lods	byte [esi]
476
	cmp	al,'('
502
	cmp	al,'('
477
	jne	invalid_argument
503
	jne	invalid_argument
478
	push	dword [ebx+8]
504
	push	dword [ebx+8]
Line 505... Line 531...
505
	cmp	edx,[ebx+4]
531
	cmp	edx,[ebx+4]
506
	mov	[ebx+4],edx
532
	mov	[ebx+4],edx
507
	setne	al
533
	setne	al
508
	or	ah,al
534
	or	ah,al
509
      finish_label:
535
	mov	edx,[address_symbol]
510
	cmp	cl,[ebx+10]
-
 
511
	mov	[ebx+10],cl
-
 
512
	setne	al
-
 
513
	or	ah,al
-
 
514
	cmp	ch,[ebx+11]
-
 
515
	mov	[ebx+11],ch
-
 
516
	setne	al
-
 
517
	or	ah,al
-
 
518
	cmp	ebp,[ebx+12]
-
 
519
	mov	[ebx+12],ebp
-
 
520
	setne	al
-
 
521
	or	ah,al
-
 
522
	or	ch,ch
-
 
523
	jz	free_label_symbol_ok
-
 
524
	mov	edx,[address_symbol]
-
 
525
	cmp	edx,[ebx+20]
536
	mov	cl,[label_size]
526
	mov	[ebx+20],edx
-
 
527
	setne	al
537
	call	finish_label_symbol
528
	or	ah,al
-
 
529
      free_label_symbol_ok:
-
 
530
	mov	cx,[current_pass]
538
	jmp	instruction_assembled
531
	xchg	[ebx+16],cx
-
 
532
	mov	edx,[current_line]
-
 
533
	mov	[ebx+28],edx
-
 
534
	and	byte [ebx+8],not 2
-
 
535
	test	byte [ebx+8],1
-
 
536
	jz	new_free_label
-
 
537
	cmp	cx,[ebx+16]
-
 
538
	je	symbol_already_defined
-
 
539
	inc	cx
-
 
540
	sub	cx,[ebx+16]
-
 
541
	setnz	al
-
 
542
	or	ah,al
-
 
543
	jz	instruction_assembled
-
 
544
	test	byte [ebx+8],8
-
 
545
	jz	instruction_assembled
-
 
546
	mov	cx,[current_pass]
-
 
547
	cmp	cx,[ebx+18]
-
 
548
	jne	instruction_assembled
-
 
549
	or	[next_pass_needed],-1
-
 
550
	jmp	instruction_assembled
-
 
551
      new_free_label:
-
 
552
	or	byte [ebx+8],1
-
 
553
	jmp	instruction_assembled
-
 
554
load_directive:
539
load_directive:
555
	lods	byte [esi]
540
	lods	byte [esi]
556
	cmp	al,2
541
	cmp	al,2
557
	jne	invalid_argument
542
	jne	invalid_argument
558
	lods	dword [esi]
543
	lods	dword [esi]
Line 569... Line 554...
569
      load_size_ok:
554
      load_size_ok:
570
	cmp	al,8
555
	cmp	al,8
571
	ja	invalid_value
556
	ja	invalid_value
572
	mov	[operand_size],al
557
	mov	[operand_size],al
573
	mov	dword [value],0
558
	and	dword [value],0
574
	mov	dword [value+4],0
559
	and	dword [value+4],0
575
	lods	word [esi]
560
	lods	word [esi]
576
	cmp	ax,82h+'(' shl 8
561
	cmp	ax,82h+'(' shl 8
577
	jne	invalid_argument
562
	jne	invalid_argument
578
      load_from_code:
563
      load_from_code:
579
	cmp	byte [esi],'.'
564
	cmp	byte [esi],'.'
580
	je	invalid_value
565
	je	invalid_value
Line 601... Line 586...
601
	ja	bad_load_address
586
	ja	bad_load_address
602
	rep	movs byte [edi],[esi]
587
	rep	movs byte [edi],[esi]
603
	jmp	value_loaded
588
	jmp	value_loaded
604
      bad_load_address:
589
      bad_load_address:
605
	cmp	[error_line],0
590
	call	recoverable_overflow
606
	jne	value_loaded
-
 
607
	mov	eax,[current_line]
-
 
608
	mov	[error_line],eax
-
 
609
	mov	[error],value_out_of_range
-
 
610
      value_loaded:
591
      value_loaded:
611
	pop	edi esi
592
	pop	edi esi
612
	mov	eax,dword [value]
593
	mov	[value_sign],0
-
 
594
	mov	eax,dword [value]
613
	mov	edx,dword [value+4]
595
	mov	edx,dword [value+4]
614
	pop	ebx
596
	pop	ebx
615
	xor	cx,cx
597
	xor	cx,cx
616
	jmp	make_constant
598
	jmp	make_constant
617
store_directive:
599
store_directive:
Line 625... Line 607...
625
	movzx	eax,al
607
	movzx	eax,al
626
	mov	[operand_size],1
608
	mov	[operand_size],1
627
	jmp	store_value_ok
609
	jmp	store_value_ok
628
      sized_store:
610
      sized_store:
629
	call	get_value
611
	or	[size_override],-1
-
 
612
	call	get_value
630
      store_value_ok:
613
      store_value_ok:
631
	cmp	[value_type],0
614
	cmp	[value_type],0
632
	jne	invalid_use_of_symbol
615
	jne	invalid_use_of_symbol
633
	mov	dword [value],eax
616
	mov	dword [value],eax
634
	mov	dword [value+4],edx
617
	mov	dword [value+4],edx
Line 667... Line 650...
667
	mov	[undefined_data_start],eax
650
	mov	[undefined_data_start],eax
668
	jmp	instruction_assembled
651
	jmp	instruction_assembled
669
      bad_store_address:
652
      bad_store_address:
670
	pop	edi esi
653
	pop	edi esi
671
	cmp	[error_line],0
654
	call	recoverable_overflow
672
	jne	instruction_assembled
-
 
673
	mov	eax,[current_line]
-
 
674
	mov	[error_line],eax
-
 
675
	mov	[error],value_out_of_range
-
 
676
	jmp	instruction_assembled
655
	jmp	instruction_assembled
677
 
656
 
Line 678... Line 657...
678
display_directive:
657
display_directive:
679
	lods	byte [esi]
658
	lods	byte [esi]
680
	cmp	al,'('
659
	cmp	al,'('
Line 793... Line 772...
793
	cmp	byte [esi],'.'
772
	cmp	byte [esi],'.'
794
	je	invalid_value
773
	je	invalid_value
795
	call	get_address_value
774
	call	get_address_value
796
	mov	ebp,[address_symbol]
775
	mov	ebp,[address_symbol]
797
	xor	ch,ch
776
	or	bh,bh
798
	or	bh,bh
-
 
799
	jz	set_virtual
777
	setnz	ch
800
	mov	ch,1
-
 
801
	jmp	set_virtual
778
	jmp	set_virtual
802
      virtual_at_current:
779
      virtual_at_current:
803
	dec	esi
780
	dec	esi
804
	mov	al,[labels_type]
781
	mov	al,[labels_type]
805
	mov	[value_type],al
782
	mov	[value_type],al
806
	mov	ebp,[org_symbol]
783
	mov	ebp,[org_symbol]
807
	mov	eax,edi
784
	mov	eax,edi
808
	xor	edx,edx
785
	xor	edx,edx
809
	sub	eax,dword [org_origin]
786
	xor	cl,cl
-
 
787
	sub	eax,dword [org_origin]
810
	sbb	edx,dword [org_origin+4]
788
	sbb	edx,dword [org_origin+4]
811
	mov	bx,word [org_registers]
789
	sbb	cl,[org_origin_sign]
-
 
790
	mov	[address_sign],cl
-
 
791
	mov	bx,word [org_registers]
812
	mov	cx,word [org_registers+2]
792
	mov	cx,word [org_registers+2]
813
	xchg	bh,bl
793
	xchg	bh,bl
814
	xchg	ch,cl
794
	xchg	ch,cl
815
      set_virtual:
795
      set_virtual:
816
	push	[org_registers]
796
	push	[org_registers]
Line 819... Line 799...
819
	mov	byte [org_registers+2],ch
799
	mov	byte [org_registers+2],ch
820
	mov	byte [org_registers+3],cl
800
	mov	byte [org_registers+3],cl
821
	call	allocate_structure_data
801
	call	allocate_structure_data
822
	mov	word [ebx],virtual_directive-instruction_handler
802
	mov	word [ebx],virtual_directive-instruction_handler
823
	not	eax
803
	mov	cl,[address_sign]
-
 
804
	not	eax
824
	not	edx
805
	not	edx
825
	add	eax,1
806
	not	cl
-
 
807
	add	eax,1
826
	adc	edx,0
808
	adc	edx,0
827
	add	eax,edi
809
	adc	cl,0
-
 
810
	add	eax,edi
828
	adc	edx,0
811
	adc	edx,0
829
	xchg	dword [org_origin],eax
812
	adc	cl,0
-
 
813
	xchg	dword [org_origin],eax
830
	xchg	dword [org_origin+4],edx
814
	xchg	dword [org_origin+4],edx
831
	mov	[ebx+10h],eax
815
	xchg	[org_origin_sign],cl
-
 
816
	mov	[ebx+10h],eax
832
	mov	[ebx+14h],edx
817
	mov	[ebx+14h],edx
833
	pop	eax
818
	pop	eax
834
	mov	[ebx+18h],eax
819
	mov	[ebx+18h],eax
835
	mov	al,[virtual_data]
820
	mov	al,[virtual_data]
836
	mov	[ebx+2],al
821
	and	al,0Fh
-
 
822
	shl	cl,4
-
 
823
	or	al,cl
-
 
824
	mov	[ebx+2],al
837
	mov	al,[labels_type]
825
	mov	al,[labels_type]
838
	mov	[ebx+3],al
826
	mov	[ebx+3],al
839
	mov	eax,edi
827
	mov	eax,edi
840
	xchg	eax,[org_start]
828
	xchg	eax,[org_start]
841
	mov	[ebx+0Ch],eax
829
	mov	[ebx+0Ch],eax
Line 874... Line 862...
874
      end_virtual:
862
      end_virtual:
875
	call	find_structure_data
863
	call	find_structure_data
876
	jc	unexpected_instruction
864
	jc	unexpected_instruction
877
	mov	al,[ebx+2]
865
	mov	al,[ebx+2]
878
	mov	[virtual_data],al
866
	mov	ah,al
-
 
867
	shr	ah,4
-
 
868
	and	al,1
-
 
869
	neg	al
-
 
870
	and	ah,1
-
 
871
	neg	ah
-
 
872
	mov	[virtual_data],al
879
	mov	al,[ebx+3]
873
	mov	[org_origin_sign],ah
-
 
874
	mov	al,[ebx+3]
880
	mov	[labels_type],al
875
	mov	[labels_type],al
881
	mov	eax,[ebx+10h]
876
	mov	eax,[ebx+10h]
882
	mov	dword [org_origin],eax
877
	mov	dword [org_origin],eax
883
	mov	eax,[ebx+14h]
878
	mov	eax,[ebx+14h]
884
	mov	dword [org_origin+4],eax
879
	mov	dword [org_origin+4],eax
Line 1337... Line 1332...
1337
	je	get_word
1332
	je	get_word
1338
	cmp	al,'?'
1333
	cmp	al,'?'
1339
	jne	invalid_argument
1334
	jne	invalid_argument
1340
	mov	eax,edi
1335
	mov	eax,edi
1341
	mov	word [edi],0
1336
	and	word [edi],0
1342
	scas	word [edi]
1337
	scas	word [edi]
1343
	jmp	undefined_data
1338
	jmp	undefined_data
1344
	ret
1339
	ret
1345
      get_word:
1340
      get_word:
1346
	cmp	[base_code],0
1341
	cmp	[base_code],0
1347
	je	word_data_value
1342
	je	word_data_value
Line 1375... Line 1370...
1375
	je	get_dword
1370
	je	get_dword
1376
	cmp	al,'?'
1371
	cmp	al,'?'
1377
	jne	invalid_argument
1372
	jne	invalid_argument
1378
	mov	eax,edi
1373
	mov	eax,edi
1379
	mov	dword [edi],0
1374
	and	dword [edi],0
1380
	scas	dword [edi]
1375
	scas	dword [edi]
1381
	jmp	undefined_data
1376
	jmp	undefined_data
1382
      get_dword:
1377
      get_dword:
1383
	push	esi
1378
	push	esi
1384
	call	get_dword_value
1379
	call	get_dword_value
1385
	pop	ebx
1380
	pop	ebx
Line 1418... Line 1413...
1418
	je	get_pword
1413
	je	get_pword
1419
	cmp	al,'?'
1414
	cmp	al,'?'
1420
	jne	invalid_argument
1415
	jne	invalid_argument
1421
	mov	eax,edi
1416
	mov	eax,edi
1422
	mov	dword [edi],0
1417
	and	dword [edi],0
1423
	scas	dword [edi]
1418
	scas	dword [edi]
1424
	mov	word [edi],0
1419
	and	word [edi],0
1425
	scas	word [edi]
1420
	scas	word [edi]
1426
	jmp	undefined_data
1421
	jmp	undefined_data
1427
      get_pword:
1422
      get_pword:
1428
	push	esi
1423
	push	esi
1429
	call	get_pword_value
1424
	call	get_pword_value
1430
	pop	ebx
1425
	pop	ebx
Line 1465... Line 1460...
1465
	je	get_qword
1460
	je	get_qword
1466
	cmp	al,'?'
1461
	cmp	al,'?'
1467
	jne	invalid_argument
1462
	jne	invalid_argument
1468
	mov	eax,edi
1463
	mov	eax,edi
1469
	mov	dword [edi],0
1464
	and	dword [edi],0
1470
	scas	dword [edi]
1465
	scas	dword [edi]
1471
	mov	dword [edi],0
1466
	and	dword [edi],0
1472
	scas	dword [edi]
1467
	scas	dword [edi]
1473
	jmp	undefined_data
1468
	jmp	undefined_data
1474
      get_qword:
1469
      get_qword:
1475
	call	get_qword_value
1470
	call	get_qword_value
1476
	call	mark_relocation
1471
	call	mark_relocation
1477
	stos	dword [edi]
1472
	stos	dword [edi]
Line 1485... Line 1480...
1485
	je	get_tword
1480
	je	get_tword
1486
	cmp	al,'?'
1481
	cmp	al,'?'
1487
	jne	invalid_argument
1482
	jne	invalid_argument
1488
	mov	eax,edi
1483
	mov	eax,edi
1489
	mov	dword [edi],0
1484
	and	dword [edi],0
1490
	scas	dword [edi]
1485
	scas	dword [edi]
1491
	mov	dword [edi],0
1486
	and	dword [edi],0
1492
	scas	dword [edi]
1487
	scas	dword [edi]
1493
	mov	word [edi],0
1488
	and	word [edi],0
1494
	scas	word [edi]
1489
	scas	word [edi]
1495
	jmp	undefined_data
1490
	jmp	undefined_data
1496
      get_tword:
1491
      get_tword:
1497
	cmp	byte [esi],'.'
1492
	cmp	byte [esi],'.'
1498
	jne	complex_tword
1493
	jne	complex_tword
1499
	inc	esi
1494
	inc	esi
Line 1645... Line 1640...
1645
      find_current_source_path: 
1640
      find_current_source_path: 
1646
	mov	esi,[eax] 
1641
	mov	esi,[eax] 
1647
	test	byte [eax+7],80h 
1642
	test	byte [eax+7],80h 
1648
	jz	get_current_path 
1643
	jz	get_current_path 
1649
	mov	eax,[eax+12] 
1644
	mov	eax,[eax+8]
1650
	jmp	find_current_source_path
1645
	jmp	find_current_source_path
1651
      get_current_path:
1646
      get_current_path:
1652
	lodsb
1647
	lodsb
1653
	stosb
1648
	stosb
1654
	or	al,al
1649
	or	al,al
1655
	jnz	get_current_path
1650
	jnz	get_current_path
Line 1663... Line 1658...
1663
	dec	edi
1658
	dec	edi
1664
	jmp	cut_current_path
1659
	jmp	cut_current_path
1665
      current_path_ok:
1660
      current_path_ok:
1666
	mov	esi,[esp+4]
1661
	mov	esi,[esp+4]
1667
	call	preprocess_path
1662
	call	expand_path
1668
	pop	edx
1663
	pop	edx
-
 
1664
	mov	esi,edx
-
 
1665
	call	open
-
 
1666
	jnc	file_opened
-
 
1667
	mov	edx,[include_paths]
-
 
1668
      search_in_include_paths:
-
 
1669
	push	edx esi
-
 
1670
	mov	edi,esi
-
 
1671
	mov	esi,[esp+4]
-
 
1672
	call	get_include_directory
-
 
1673
	mov	[esp+4],esi
-
 
1674
	mov	esi,[esp+8]
-
 
1675
	call	expand_path
-
 
1676
	pop	edx
1669
	mov	esi,edx
1677
	mov	esi,edx
1670
	call	open
1678
	call	open
1671
	jnc	file_opened
1679
	pop	edx
-
 
1680
	jnc	file_opened
1672
	mov	edi,esi
1681
	cmp	byte [edx],0
-
 
1682
	jne	search_in_include_paths
-
 
1683
	mov	edi,esi
1673
	mov	esi,[esp]
1684
	mov	esi,[esp]
1674
	push	edi
1685
	push	edi
1675
	call	preprocess_path
1686
	call	expand_path
1676
	pop	edx
1687
	pop	edx
1677
	mov	esi,edx
1688
	mov	esi,edx
1678
	call	open
1689
	call	open
1679
	jc	file_not_found
1690
	jc	file_not_found
1680
      file_opened:
1691
      file_opened:
1681
	mov	edi,esi
1692
	mov	edi,esi