Subversion Repositories Kolibri OS

Rev

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

Rev 4039 Rev 6467
Line 1... Line 1...
1
; flat assembler core
1
; flat assembler core
2
; Copyright (c) 1999-2013, Tomasz Grysztar.
2
; Copyright (c) 1999-2016, 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 32... Line 32...
32
	inc	[parsed_lines]
32
	inc	[parsed_lines]
33
	add	esi,16
33
	add	esi,16
34
      parse_line:
34
      parse_line:
35
	mov	[formatter_symbols_allowed],0
35
	mov	[formatter_symbols_allowed],0
36
	cmp	byte [esi],1Ah
36
	mov	[decorator_symbols_allowed],0
-
 
37
	cmp	byte [esi],1Ah
37
	jne	empty_instruction
38
	jne	empty_instruction
38
	push	edi
39
	push	edi
39
	add	esi,2
40
	add	esi,2
40
	movzx	ecx,byte [esi-1]
41
	movzx	ecx,byte [esi-1]
41
	cmp	byte [esi+ecx],':'
42
	cmp	byte [esi+ecx],':'
Line 527... Line 528...
527
	je	address_argument
528
	je	address_argument
528
	cmp	al,']'
529
	cmp	al,']'
529
	je	separator
530
	je	separator
530
	cmp	al,'{'
531
	cmp	al,'{'
531
	je	unallowed_character
532
	je	open_decorator
532
	cmp	al,'}'
533
	cmp	al,'}'
533
	je	unallowed_character
534
	je	close_decorator
534
	cmp	al,'#'
535
	cmp	al,'#'
535
	je	unallowed_character
536
	je	unallowed_character
536
	cmp	al,'`'
537
	cmp	al,'`'
537
	je	unallowed_character
538
	je	unallowed_character
538
	cmp	al,3Bh
539
	cmp	al,3Bh
539
	je	foreign_argument
540
	je	foreign_argument
540
	dec	esi
541
	cmp	[decorator_symbols_allowed],0
-
 
542
	je	not_a_separator
-
 
543
	cmp	al,'-'
-
 
544
	je	separator
-
 
545
      not_a_separator:
-
 
546
	dec	esi
541
	cmp	al,1Ah
547
	cmp	al,1Ah
542
	jne	expression_argument
548
	jne	expression_argument
543
	push	edi
549
	push	edi
544
	mov	edi,directive_operators
550
	mov	edi,directive_operators
545
	call	get_operator
551
	call	get_operator
Line 823... Line 829...
823
	cmp	eax,[stack_limit]
829
	cmp	eax,[stack_limit]
824
	jb	stack_overflow
830
	jb	stack_overflow
825
	push	esi edi
831
	push	esi edi
826
	inc	esi
832
	inc	esi
827
	mov	al,'{'
833
	mov	al,91h
828
	stos	byte [edi]
834
	stos	byte [edi]
829
	inc	[parenthesis_stack]
835
	inc	[parenthesis_stack]
830
	jmp	parse_argument
836
	jmp	parse_argument
831
      expression_comparator:
837
      expression_comparator:
832
	stos	byte [edi]
838
	stos	byte [edi]
833
	jmp	forced_expression
839
	jmp	forced_expression
Line 877... Line 883...
877
	call	parse_address
883
	call	parse_address
878
	lods	byte [esi]
884
	lods	byte [esi]
879
	cmp	al,']'
885
	cmp	al,']'
880
	je	address_parsed
886
	je	address_parsed
881
	dec	esi
887
	cmp	al,','
-
 
888
	je	divided_address
-
 
889
	dec	esi
882
	mov	al,')'
890
	mov	al,')'
883
	stos	byte [edi]
891
	stos	byte [edi]
884
	jmp	argument_parsed
892
	jmp	argument_parsed
885
      address_parsed:
893
      divided_address:
-
 
894
	mov	ax,'),'
-
 
895
	stos	word [edi]
-
 
896
	jmp	expression
-
 
897
      address_parsed:
886
	mov	al,']'
898
	mov	al,']'
887
	stos	byte [edi]
899
	stos	byte [edi]
888
	jmp	argument_parsed
900
	jmp	argument_parsed
889
      parse_address:
901
      parse_address:
890
	mov	al,'['
902
	mov	al,'['
Line 906... Line 918...
906
	cmp	al,10h
918
	cmp	al,10h
907
	jne	unknown_segment_prefix
919
	jne	unknown_segment_prefix
908
	mov	al,ah
920
	mov	al,ah
909
	and	ah,11110000b
921
	and	ah,11110000b
910
	cmp	ah,60h
922
	cmp	ah,30h
911
	jne	unknown_segment_prefix
923
	jne	unknown_segment_prefix
912
	stos	byte [edi]
924
	add	al,30h
-
 
925
	stos	byte [edi]
913
	jmp	convert_address
926
	jmp	convert_address
914
      unknown_segment_prefix:
927
      unknown_segment_prefix:
915
	sub	esi,5
928
	sub	esi,5
916
      convert_address:
929
      convert_address:
917
	push	edi
930
	push	edi
Line 926... Line 939...
926
      forced_parenthesis:
939
      forced_parenthesis:
927
	cmp	byte [esi],'('
940
	cmp	byte [esi],'('
928
	jne	argument_parsed
941
	jne	argument_parsed
929
	inc	esi
942
	inc	esi
930
	mov	al,'{'
943
	mov	al,91h
931
	jmp	separator
944
	jmp	separator
932
      unallowed_character:
945
      unallowed_character:
933
	mov	al,0FFh
946
	mov	al,0FFh
934
	jmp	separator
947
	jmp	separator
935
      close_parenthesis:
948
      open_decorator:
-
 
949
	inc	[decorator_symbols_allowed]
-
 
950
	jmp	separator
-
 
951
      close_decorator:
-
 
952
	dec	[decorator_symbols_allowed]
-
 
953
	jmp	separator
-
 
954
      close_parenthesis:
936
	mov	al,'}'
955
	mov	al,92h
937
      separator:
956
      separator:
938
	stos	byte [edi]
957
	stos	byte [edi]
939
      argument_parsed:
958
      argument_parsed:
940
	cmp	[parenthesis_stack],0
959
	cmp	[parenthesis_stack],0
941
	je	parse_argument
960
	je	parse_argument
942
	dec	[parenthesis_stack]
961
	dec	[parenthesis_stack]
Line 1047... Line 1066...
1047
	call	lower_case
1066
	call	lower_case
1048
	mov	ecx,ebp
1067
	mov	ecx,ebp
1049
	cmp	cl,11
1068
	cmp	cl,11
1050
	ja	no_symbol
1069
	ja	no_symbol
1051
	sub	cl,2
1070
	sub	cl,1
1052
	jc	no_symbol
1071
	jc	no_symbol
1053
	movzx	ebx,word [symbols+ecx*4]
1072
	movzx	ebx,word [symbols+ecx*4]
1054
	add	ebx,symbols
1073
	add	ebx,symbols
1055
	movzx	edx,word [symbols+ecx*4+2]
1074
	movzx	edx,word [symbols+ecx*4+2]
1056
      scan_symbols:
1075
      scan_symbols:
1057
	or	edx,edx
1076
	or	edx,edx
Line 1068... Line 1087...
1068
	jb	symbols_down
1087
	jb	symbols_down
1069
	mov	ax,[edi]
1088
	mov	ax,[edi]
1070
	cmp	al,18h
1089
	cmp	al,18h
1071
	jb	symbol_ok
1090
	jb	symbol_ok
1072
	cmp	[formatter_symbols_allowed],0
1091
	cmp	al,1Fh
-
 
1092
	je	decorator_symbol
-
 
1093
	cmp	[formatter_symbols_allowed],0
1073
	je	no_symbol
1094
	je	no_symbol
1074
      symbol_ok:
1095
      symbol_ok:
1075
	pop	esi
1096
	pop	esi
1076
	add	esi,ebp
1097
	add	esi,ebp
1077
	clc
1098
	clc
1078
	ret
1099
	ret
1079
      no_symbol:
1100
      decorator_symbol:
-
 
1101
	cmp	[decorator_symbols_allowed],0
-
 
1102
	jne	symbol_ok
-
 
1103
      no_symbol:
1080
	pop	esi
1104
	pop	esi
1081
	mov	ecx,ebp
1105
	mov	ecx,ebp
1082
	stc
1106
	stc
1083
	ret
1107
	ret
1084
      symbols_down:
1108
      symbols_down:
Line 1256... Line 1280...
1256
	jb	get_current_offset_id
1280
	jb	get_current_offset_id
1257
	inc	esi
1281
	inc	esi
1258
	cmp	byte [esi-1],'$'
1282
	cmp	byte [esi-1],'$'
1259
	je	get_org_origin_id
1283
	je	get_org_origin_id
1260
	sub	esi,ecx
1284
	sub	esi,2
1261
	jmp	find_label
1285
	jmp	find_label
1262
      get_current_offset_id:
1286
      get_current_offset_id:
1263
	xor	eax,eax
1287
	xor	eax,eax
1264
	ret
1288
	ret
1265
      get_counter_id:
1289
      get_counter_id:
1266
	mov	eax,1
1290
	mov	eax,1
Line 1361... Line 1385...
1361
	mov	al,[esi]
1385
	mov	al,[esi]
1362
	cmp	al,30h
1386
	cmp	al,30h
1363
	jb	name_first_char_ok
1387
	jb	name_first_char_ok
1364
	cmp	al,39h
1388
	cmp	al,39h
1365
	jbe	invalid_name
1389
	jbe	numeric_name
1366
      name_first_char_ok:
1390
      name_first_char_ok:
1367
	cmp	al,'$'
1391
	cmp	al,'$'
1368
	jne	check_for_reserved_word
1392
	jne	check_for_reserved_word
1369
	cmp	ecx,1
1393
      numeric_name:
1370
	jne	invalid_name
1394
	add	esi,ecx
1371
      reserved_word:
1395
      reserved_word:
1372
	mov	eax,0Fh
1396
	mov	eax,0Fh
1373
	pop	edi
1397
	pop	edi
1374
	ret
1398
	ret
1375
      check_for_reserved_word:
1399
      check_for_reserved_word:
1376
	call	get_instruction
1400
	call	get_instruction