Subversion Repositories Kolibri OS

Rev

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

Rev 2665 Rev 4039
Line 1... Line 1...
1
; flat assembler core
1
; flat assembler core
2
; Copyright (c) 1999-2012, Tomasz Grysztar.
2
; Copyright (c) 1999-2013, Tomasz Grysztar.
3
; All rights reserved.
3
; All rights reserved.
Line 4... Line 4...
4
 
4
 
5
parser:
5
parser:
6
	mov	eax,[memory_end]
6
	mov	eax,[memory_end]
Line 62... Line 62...
62
	jmp	parse_next_line
62
	jmp	parse_next_line
63
      simple_label:
63
      simple_label:
64
	pop	edi
64
	pop	edi
65
	call	identify_label
65
	call	identify_label
66
	mov	byte [edi],2
66
	cmp	byte [esi+1],':'
-
 
67
	je	block_label
-
 
68
	mov	byte [edi],2
67
	inc	edi
69
	inc	edi
68
	stos	dword [edi]
70
	stos	dword [edi]
69
	inc	esi
71
	inc	esi
70
	xor	al,al
72
	xor	al,al
71
	stos	byte [edi]
73
	stos	byte [edi]
72
	jmp	parse_line
74
	jmp	parse_line
73
      constant_label:
75
      block_label:
-
 
76
	mov	byte [edi],4
-
 
77
	inc	edi
-
 
78
	stos	dword [edi]
-
 
79
	add	esi,2
-
 
80
	jmp	parse_line
-
 
81
      constant_label:
74
	pop	edi
82
	pop	edi
75
	call	get_label_id
83
	call	get_label_id
76
	mov	byte [edi],3
84
	mov	byte [edi],3
77
	inc	edi
85
	inc	edi
78
	stos	dword [edi]
86
	stos	dword [edi]
Line 125... Line 133...
125
	jz	parse_next_line
133
	jz	parse_next_line
126
	cmp	al,':'
134
	cmp	al,':'
127
	je	invalid_name
135
	je	invalid_name
128
	dec	esi
136
	dec	esi
129
	cmp	al,3Bh
137
	mov	[parenthesis_stack],0
130
	je	skip_rest_of_line
-
 
131
	mov	[parenthesis_stack],0
-
 
132
	call	parse_argument
138
	call	parse_argument
133
	jmp	parse_next_line
139
	jmp	parse_next_line
134
      empty_line:
140
      empty_line:
135
	add	esi,16
141
	add	esi,16
136
      skip_rest_of_line:
142
      skip_rest_of_line:
Line 528... Line 534...
528
	cmp	al,'#'
534
	cmp	al,'#'
529
	je	unallowed_character
535
	je	unallowed_character
530
	cmp	al,'`'
536
	cmp	al,'`'
531
	je	unallowed_character
537
	je	unallowed_character
532
	dec	esi
538
	cmp	al,3Bh
-
 
539
	je	foreign_argument
-
 
540
	dec	esi
533
	cmp	al,1Ah
541
	cmp	al,1Ah
534
	jne	expression_argument
542
	jne	expression_argument
535
	push	edi
543
	push	edi
536
	mov	edi,directive_operators
544
	mov	edi,directive_operators
537
	call	get_operator
545
	call	get_operator
Line 548... Line 556...
548
	jne	check_argument
556
	jne	check_argument
549
	pop	edi
557
	pop	edi
550
	movs	byte [edi],[esi]
558
	movs	byte [edi],[esi]
551
	jmp	argument_parsed
559
	jmp	argument_parsed
552
      symbol_argument:
560
      foreign_argument:
-
 
561
	dec	esi
-
 
562
	call	skip_foreign_line
-
 
563
	jmp	contents_parsed
-
 
564
      symbol_argument:
553
	pop	edi
565
	pop	edi
554
	stos	word [edi]
566
	stos	word [edi]
555
	jmp	argument_parsed
567
	jmp	argument_parsed
556
      operator_argument:
568
      operator_argument:
557
	pop	edi
569
	pop	edi
558
	cmp	al,85h
570
	cmp	al,85h
559
	je	ptr_argument
571
	je	ptr_argument
560
	stos	byte [edi]
572
	stos	byte [edi]
561
	cmp	al,80h
573
	cmp	al,80h
562
	je	forced_expression
574
	je	forced_multipart_expression
563
	cmp	al,8Ch
575
	cmp	al,8Ch
564
	je	forced_expression
576
	je	forced_expression
565
	cmp	al,81h
577
	cmp	al,81h
566
	je	forced_parenthesis
578
	je	forced_parenthesis
567
	cmp	al,82h
579
	cmp	al,82h
568
	je	parse_from_operator
580
	je	parse_from_operator
Line 723... Line 735...
723
	stos	byte [edi]
735
	stos	byte [edi]
724
	jmp	argument_parsed
736
	jmp	argument_parsed
725
      parse_from_operator:
737
      parse_from_operator:
726
	cmp	byte [esi],22h
738
	cmp	byte [esi],22h
727
	jne	forced_expression
739
	jne	forced_multipart_expression
728
	jmp	argument_parsed
740
	jmp	argument_parsed
729
      parse_quoted_extrn:
741
      parse_quoted_extrn:
730
	inc	esi
742
	inc	esi
731
	mov	ax,'('
743
	mov	ax,'('
732
	stos	word [edi]
744
	stos	word [edi]
733
	lods	dword [esi]
745
	lods	dword [esi]
Line 769... Line 781...
769
	jne	not_string
781
	jne	not_string
770
	mov	eax,[esi+1]
782
	mov	eax,[esi+1]
771
	lea	ebx,[esi+5+eax]
783
	lea	ebx,[esi+5+eax]
772
	push	ebx ecx esi edi
784
	push	ebx ecx esi edi
773
	mov	al,'('
785
	call	parse_expression
774
	stos	byte [edi]
-
 
775
	call	convert_expression
-
 
776
	mov	al,')'
786
	pop	eax edx ecx ebx
777
	stos	byte [edi]
-
 
778
	pop	eax edx ecx ebx
-
 
779
	cmp	esi,ebx
787
	cmp	esi,ebx
780
	jne	expression_parsed
788
	jne	expression_argument_parsed
781
	mov	edi,eax
789
	mov	edi,eax
782
	mov	esi,edx
790
	mov	esi,edx
783
      string_argument:
791
      string_argument:
784
	inc	esi
792
	inc	esi
785
	mov	ax,'('
793
	mov	ax,'('
786
	stos	word [edi]
794
	stos	word [edi]
Line 797... Line 805...
797
      string_movsw_ok:
805
      string_movsw_ok:
798
	rep	movs dword [edi],[esi]
806
	rep	movs dword [edi],[esi]
799
	xor	al,al
807
	xor	al,al
800
	stos	byte [edi]
808
	stos	byte [edi]
801
	jmp	expression_parsed
809
	jmp	expression_argument_parsed
802
      not_string:
810
      parse_expression:
-
 
811
	mov	al,'('
-
 
812
	stos	byte [edi]
-
 
813
	call	convert_expression
-
 
814
	mov	al,')'
-
 
815
	stos	byte [edi]
-
 
816
	ret
-
 
817
      not_string:
803
	cmp	byte [esi],'('
818
	cmp	byte [esi],'('
804
	jne	expression
819
	jne	expression
805
	mov	eax,esp
820
	mov	eax,esp
806
	sub	eax,100h
821
	sub	eax,100h
807
	jc	stack_overflow
822
	jc	stack_overflow
Line 836... Line 851...
836
	inc	esi
851
	inc	esi
837
	mov	al,0F1h
852
	mov	al,0F1h
838
	jmp	expression_comparator
853
	jmp	expression_comparator
839
      expression:
854
      expression:
840
	mov	al,'('
855
	call	parse_expression
841
	stos	byte [edi]
-
 
842
	call	convert_expression
-
 
843
	mov	al,')'
856
	jmp	expression_argument_parsed
844
	stos	byte [edi]
-
 
845
	jmp	expression_parsed
-
 
846
      forced_expression:
857
      forced_expression:
847
	xor	al,al
858
	xor	al,al
848
	xchg	al,[formatter_symbols_allowed]
859
	xchg	al,[formatter_symbols_allowed]
849
	push	eax
860
	push	eax
850
	mov	al,'('
861
	call	parse_expression
851
	stos	byte [edi]
-
 
852
	call	convert_expression
-
 
853
	mov	al,')'
862
      forced_expression_parsed:
854
	stos	byte [edi]
-
 
855
	pop	eax
863
	pop	eax
856
	mov	[formatter_symbols_allowed],al
864
	mov	[formatter_symbols_allowed],al
857
	jmp	argument_parsed
865
	jmp	argument_parsed
858
      address_argument:
866
      forced_multipart_expression:
-
 
867
	xor	al,al
-
 
868
	xchg	al,[formatter_symbols_allowed]
-
 
869
	push	eax
-
 
870
	call	parse_expression
-
 
871
	cmp	byte [esi],':'
-
 
872
	jne	forced_expression_parsed
-
 
873
	movs	byte [edi],[esi]
-
 
874
	call	parse_expression
-
 
875
	jmp	forced_expression_parsed
-
 
876
      address_argument:
859
	call	parse_address
877
	call	parse_address
860
	lods	byte [esi]
878
	lods	byte [esi]
861
	cmp	al,']'
879
	cmp	al,']'
862
	je	address_parsed
880
	je	address_parsed
863
	dec	esi
881
	dec	esi
Line 923... Line 941...
923
	je	parse_argument
941
	je	parse_argument
924
	dec	[parenthesis_stack]
942
	dec	[parenthesis_stack]
925
	add	esp,8
943
	add	esp,8
926
	jmp	argument_parsed
944
	jmp	argument_parsed
927
      expression_parsed:
945
      expression_argument_parsed:
928
	cmp	[parenthesis_stack],0
946
	cmp	[parenthesis_stack],0
929
	je	parse_argument
947
	je	parse_argument
930
	cmp	byte [esi],')'
948
	cmp	byte [esi],')'
931
	jne	argument_parsed
949
	jne	argument_parsed
932
	dec	[parenthesis_stack]
950
	dec	[parenthesis_stack]
933
	pop	edi esi
951
	pop	edi esi