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 |