Rev 4478 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4478 | 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 | convert_expression: |
5 | convert_expression: |
6 | push ebp |
6 | push ebp |
Line 75... | Line 75... | ||
75 | pop ebp |
75 | pop ebp |
76 | ret |
76 | ret |
77 | 77 | ||
Line 78... | Line 78... | ||
78 | convert_number: |
78 | convert_number: |
79 | lea eax,[edi-10h] |
79 | lea eax,[edi+20h] |
80 | mov edx,[memory_end] |
80 | mov edx,[memory_end] |
81 | cmp [source_start],0 |
81 | cmp [source_start],0 |
82 | je check_memory_for_number |
82 | je check_memory_for_number |
83 | mov edx,[labels_list] |
83 | mov edx,[labels_list] |
84 | check_memory_for_number: |
84 | check_memory_for_number: |
Line 127... | Line 127... | ||
127 | call convert_expression |
127 | call convert_expression |
128 | pop [current_offset] |
128 | pop [current_offset] |
129 | lods byte [esi] |
129 | lods byte [esi] |
130 | cmp al,')' |
130 | cmp al,')' |
131 | jne invalid_expression |
131 | je subexpression_closed |
132 | ret |
132 | dec esi |
- | 133 | mov al,'!' |
|
- | 134 | stosb |
|
- | 135 | subexpression_closed: |
|
- | 136 | ret |
|
133 | symbol_value: |
137 | symbol_value: |
134 | cmp [source_start],0 |
138 | cmp [source_start],0 |
135 | je preprocessor_value |
139 | je preprocessor_value |
136 | push edi esi |
140 | push edi esi |
137 | lods word [esi] |
141 | lods word [esi] |
Line 145... | Line 149... | ||
145 | mov al,ah |
149 | mov al,ah |
146 | shr ah,4 |
150 | shr ah,4 |
147 | cmp ah,4 |
151 | cmp ah,4 |
148 | je register_value |
152 | je register_value |
149 | cmp ah,8 |
153 | and ah,not 1 |
- | 154 | cmp ah,8 |
|
150 | je register_value |
155 | je register_value |
151 | cmp ah,0Ch |
156 | cmp ah,0Ch |
152 | je register_value |
157 | jae register_value |
- | 158 | cmp ah,6 |
|
- | 159 | je register_value |
|
153 | cmp ah,0Dh |
160 | cmp al,23h |
154 | je register_value |
- | |
155 | cmp ah,0Fh |
- | |
156 | je register_value |
- | |
157 | cmp ah,2 |
- | |
158 | jne no_address_register |
- | |
159 | cmp al,23h |
- | |
160 | je register_value |
161 | je register_value |
161 | cmp al,25h |
162 | cmp al,25h |
162 | je register_value |
163 | je register_value |
163 | cmp al,26h |
164 | cmp al,26h |
164 | je register_value |
165 | je register_value |
Line 910... | Line 911... | ||
910 | cmp dl,'|' |
911 | cmp dl,'|' |
911 | je preevaluate_or |
912 | je preevaluate_or |
912 | cmp dl,'&' |
913 | cmp dl,'&' |
913 | je preevaluate_and |
914 | je preevaluate_and |
914 | cmp dl,'}' |
915 | cmp dl,92h |
915 | je preevaluation_done |
916 | je preevaluation_done |
916 | or dl,dl |
917 | or dl,dl |
917 | jnz invalid_logical_expression |
918 | jnz invalid_logical_expression |
918 | preevaluation_done: |
919 | preevaluation_done: |
919 | pop edx |
920 | pop edx |
920 | dec esi |
921 | dec esi |
Line 985... | Line 986... | ||
985 | inc esi |
986 | inc esi |
986 | jmp skip_logical_value |
987 | jmp skip_logical_value |
987 | negation_skipped: |
988 | negation_skipped: |
988 | mov al,[esi] |
989 | mov al,[esi] |
989 | cmp al,'{' |
990 | cmp al,91h |
990 | jne skip_simple_logical_value |
991 | jne skip_simple_logical_value |
991 | inc esi |
992 | inc esi |
992 | xchg al,[logical_value_wrapping] |
993 | xchg al,[logical_value_wrapping] |
993 | push eax |
994 | push eax |
994 | skip_logical_expression: |
995 | skip_logical_expression: |
995 | call skip_logical_value |
996 | call skip_logical_value |
Line 1001... | Line 1002... | ||
1001 | cmp al,'|' |
1002 | cmp al,'|' |
1002 | je skip_logical_expression |
1003 | je skip_logical_expression |
1003 | cmp al,'&' |
1004 | cmp al,'&' |
1004 | je skip_logical_expression |
1005 | je skip_logical_expression |
1005 | cmp al,'}' |
1006 | cmp al,92h |
1006 | jne wrongly_structured_logical_expression |
1007 | jne wrongly_structured_logical_expression |
1007 | pop eax |
1008 | pop eax |
1008 | mov [logical_value_wrapping],al |
1009 | mov [logical_value_wrapping],al |
1009 | logical_value_skipped: |
1010 | logical_value_skipped: |
1010 | clc |
1011 | clc |
1011 | ret |
1012 | ret |
Line 1024... | Line 1025... | ||
1024 | cmp al,'|' |
1025 | cmp al,'|' |
1025 | je logical_value_skipped |
1026 | je logical_value_skipped |
1026 | cmp al,'&' |
1027 | cmp al,'&' |
1027 | je logical_value_skipped |
1028 | je logical_value_skipped |
1028 | cmp al,'{' |
1029 | cmp al,91h |
1029 | je skip_logical_value_internal_parenthesis |
1030 | je skip_logical_value_internal_parenthesis |
1030 | cmp al,'}' |
1031 | cmp al,92h |
1031 | jne skip_logical_value_symbol |
1032 | jne skip_logical_value_symbol |
1032 | sub [logical_value_parentheses],1 |
1033 | sub [logical_value_parentheses],1 |
1033 | jnc skip_logical_value_symbol |
1034 | jnc skip_logical_value_symbol |
1034 | cmp [logical_value_wrapping],'{' |
1035 | cmp [logical_value_wrapping],91h |
1035 | jne skip_logical_value_symbol |
1036 | jne skip_logical_value_symbol |
1036 | jmp logical_value_skipped |
1037 | jmp logical_value_skipped |
1037 | skip_logical_value_internal_parenthesis: |
1038 | skip_logical_value_internal_parenthesis: |
1038 | inc [logical_value_parentheses] |
1039 | inc [logical_value_parentheses] |
1039 | skip_logical_value_symbol: |
1040 | skip_logical_value_symbol: |
1040 | call skip_symbol |
1041 | call skip_symbol |
Line 1047... | Line 1048... | ||
1047 | movs byte [edi],[esi] |
1048 | movs byte [edi],[esi] |
1048 | jmp preevaluate_negation |
1049 | jmp preevaluate_negation |
1049 | preevaluate_negation_ok: |
1050 | preevaluate_negation_ok: |
1050 | mov ebx,esi |
1051 | mov ebx,esi |
1051 | cmp byte [esi],'{' |
1052 | cmp byte [esi],91h |
1052 | jne preevaluate_simple_logical_value |
1053 | jne preevaluate_simple_logical_value |
1053 | lods byte [esi] |
1054 | lods byte [esi] |
1054 | stos byte [edi] |
1055 | stos byte [edi] |
1055 | push ebp |
1056 | push ebp |
1056 | mov dl,[logical_value_wrapping] |
1057 | mov dl,[logical_value_wrapping] |
1057 | push edx |
1058 | push edx |
Line 1060... | Line 1061... | ||
1060 | mov [logical_value_wrapping],dl |
1061 | mov [logical_value_wrapping],dl |
1061 | pop ebp |
1062 | pop ebp |
1062 | cmp al,0FFh |
1063 | cmp al,0FFh |
1063 | je invalid_logical_value |
1064 | je invalid_logical_value |
1064 | cmp byte [esi],'}' |
1065 | cmp byte [esi],92h |
1065 | jne invalid_logical_value |
1066 | jne invalid_logical_value |
1066 | or al,al |
1067 | or al,al |
1067 | jnz preevaluated_expression_value |
1068 | jnz preevaluated_expression_value |
1068 | movs byte [edi],[esi] |
1069 | movs byte [edi],[esi] |
1069 | ret |
1070 | ret |
1070 | preevaluated_expression_value: |
1071 | preevaluated_expression_value: |
Line 1087... | Line 1088... | ||
1087 | find_logical_value_boundaries: |
1088 | find_logical_value_boundaries: |
1088 | mov al,[esi] |
1089 | mov al,[esi] |
1089 | or al,al |
1090 | or al,al |
1090 | jz logical_value_boundaries_found |
1091 | jz logical_value_boundaries_found |
1091 | cmp al,'{' |
1092 | cmp al,91h |
1092 | je logical_value_internal_parentheses |
1093 | je logical_value_internal_parentheses |
1093 | cmp al,'}' |
1094 | cmp al,92h |
1094 | je logical_value_boundaries_parenthesis_close |
1095 | je logical_value_boundaries_parenthesis_close |
1095 | cmp al,'|' |
1096 | cmp al,'|' |
1096 | je logical_value_boundaries_found |
1097 | je logical_value_boundaries_found |
1097 | cmp al,'&' |
1098 | cmp al,'&' |
1098 | je logical_value_boundaries_found |
1099 | je logical_value_boundaries_found |
1099 | or edx,edx |
1100 | or edx,edx |
Line 1114... | Line 1115... | ||
1114 | jmp next_symbol_in_logical_value |
1115 | jmp next_symbol_in_logical_value |
1115 | logical_value_boundaries_parenthesis_close: |
1116 | logical_value_boundaries_parenthesis_close: |
1116 | sub [logical_value_parentheses],1 |
1117 | sub [logical_value_parentheses],1 |
1117 | jnc next_symbol_in_logical_value |
1118 | jnc next_symbol_in_logical_value |
1118 | cmp [logical_value_wrapping],'{' |
1119 | cmp [logical_value_wrapping],91h |
1119 | jne next_symbol_in_logical_value |
1120 | jne next_symbol_in_logical_value |
1120 | logical_value_boundaries_found: |
1121 | logical_value_boundaries_found: |
1121 | or edx,edx |
1122 | or edx,edx |
1122 | jz non_preevaluable_logical_value |
1123 | jz non_preevaluable_logical_value |
1123 | mov al,[edx] |
1124 | mov al,[edx] |
1124 | cmp al,0F0h |
1125 | cmp al,0F0h |