initial commit: a mess of assembly code
[fmap.git] / x86_64_sse2_x87 / fasm / source / calm.inc
blob0436a24f3e51315fd3c8ac4345ac2177efe1fd92
1 \r
2 struct CompiledMacroHeader\r
3         shared_namespace dd ?\r
4         literals_offset dd ?\r
5         label_argument_leaf dd ?\r
6 ends\r
7 \r
8 struct CompiledMacroArgument\r
9         symbol_leaf dd ?\r
10         default_value_length dd ?\r
11         default_value_offset dd ?\r
12 ends\r
14 struct UnresolvedJump\r
15         offset dd ?\r
16         entry_length dd ?\r
17       ; source_context SourceContext\r
18 ends\r
20 struct MatchedExcerpt\r
21         data_start dd ?\r
22         data_end dd ?\r
23         recognition_context dd ?\r
24         symbol_leaf dd ?\r
25 ends\r
27 BOOL_NEG = -1\r
28 BOOL_AND = -2\r
29 BOOL_OR = -3\r
31 define_calm_instruction:\r
32         mov     dl,DBLOCK_CALMINSTRUCTION\r
33         mov     ecx,sizeof.MacroData\r
34         call    add_directive_block\r
35         mov     edx,[ebx+SymbolTree_Leaf.branch]\r
36         call    get_symbol_namespace\r
37         mov     [alm_namespace],ebx\r
38         or      [assembly_mode],AMODE_CALM_DEFINITION\r
39         mov     [calm_definition_active],0\r
40         test    [assembly_mode],AMODE_SKIP\r
41         jnz     assembly_line\r
42         test    [assembly_mode],AMODE_DEFINITION\r
43         jnz     add_line_to_macro\r
44         mov     eax,[calm_code_buffer.memory_start]\r
45         mov     [calm_code_cursor],eax\r
46         mov     eax,[calm_literals_buffer.memory_start]\r
47         mov     [calm_literals_cursor],eax\r
48         mov     eax,[calm_auxiliary_buffer.memory_start]\r
49         mov     [calm_auxiliary_cursor],eax\r
50         call    move_to_next_symbol\r
51         jc      missing_argument\r
52         cmp     al,'('\r
53         je      calm_labeled_instruction\r
54         and     [argument_start],0\r
55         mov     dl,SYMCLASS_INSTRUCTION\r
56     get_calm_instruction_identifier:\r
57         call    get_macro_definition_symbol\r
58         jc      invalid_identifier\r
59         push    esi\r
60         mov     eax,ebx\r
61         mov     ecx,[alm_namespace]\r
62         call    get_local_anchor\r
63         call    get_symbol_namespace\r
64         or      [ebx+SymbolTree_Root.flags],NAMESPACE_CALM\r
65         mov     [new_local_namespace],ebx\r
66         pop     esi\r
67         mov     edi,[calm_code_buffer.memory_start]\r
68         mov     [edi+CompiledMacroHeader.shared_namespace],ebx\r
69         or      [symbol_definition],1\r
70         mov     ebx,[argument_start]\r
71         test    ebx,ebx\r
72         jz      calm_instruction_label_argument_ok\r
73         push    esi edi\r
74         mov     esi,ebx\r
75         mov     dl,SYMCLASS_EXPRESSION\r
76         mov     ebx,[new_local_namespace]\r
77         call    identify_symbol_in_namespace\r
78         mov     eax,esi\r
79         pop     edi esi\r
80         jc      invalid_argument\r
81         test    ebx,ebx\r
82         jz      invalid_argument\r
83         cmp     byte [eax],')'\r
84         jne     invalid_argument\r
85         call    update_value_definition\r
86         push    esi edi\r
87         mov     [value_type],VALTYPE_RESERVED\r
88         xor     ecx,ecx\r
89         call    assign_value\r
90         pop     edi esi\r
91     calm_instruction_label_argument_ok:\r
92         mov     [edi+CompiledMacroHeader.label_argument_leaf],ebx\r
93         add     edi,sizeof.CompiledMacroHeader\r
94     calm_instruction_argument_declaration:\r
95         call    move_to_next_symbol\r
96         jc      calm_instruction_arguments_declared\r
97         mov     dl,SYMCLASS_EXPRESSION\r
98         push    edi\r
99         mov     ebx,[new_local_namespace]\r
100         call    identify_symbol_in_namespace\r
101         pop     edi\r
102         jc      invalid_argument\r
103         test    ebx,ebx\r
104         jz      invalid_argument\r
105         mov     edx,calm_code_buffer\r
106         mov     ecx,sizeof.CompiledMacroArgument+4\r
107         call    reserve_workspace\r
108         mov     [edi+CompiledMacroArgument.symbol_leaf],ebx\r
109         call    update_value_definition\r
110         push    esi edi\r
111         mov     [value_type],VALTYPE_RESERVED\r
112         xor     ecx,ecx\r
113         call    assign_value\r
114         pop     edi esi\r
115         xor     edx,edx\r
116         call    move_to_next_symbol\r
117         jc      calm_instruction_argument_ready\r
118         cmp     al,':'\r
119         je      calm_instruction_argument_default_value\r
120         cmp     al,'='\r
121         je      calm_instruction_argument_default_value\r
122         cmp     al,'*'\r
123         jne     calm_instruction_argument_ready\r
124         dec     edx\r
125         inc     esi\r
126     calm_instruction_argument_ready:\r
127         mov     [edi+CompiledMacroArgument.default_value_length],edx\r
128         add     edi,sizeof.CompiledMacroArgument\r
129         call    move_to_next_symbol\r
130         jc      calm_instruction_arguments_declared\r
131         inc     esi\r
132         cmp     al,'&'\r
133         je      calm_instruction_greedy_argument\r
134         cmp     al,','\r
135         jne     invalid_argument\r
136         call    move_to_next_symbol\r
137         jc      invalid_argument\r
138         jmp     calm_instruction_argument_declaration\r
139     calm_instruction_argument_default_value:\r
140         inc     esi\r
141         mov     [calm_code_cursor],edi\r
142         mov     edx,calm_literals_buffer\r
143         mov     edi,[calm_literals_cursor]\r
144         mov     ecx,[line_end]\r
145         sub     ecx,esi\r
146         add     ecx,1+sizeof.RecognitionContext\r
147         call    reserve_workspace\r
148         mov     [calm_literals_cursor],edi\r
149         call    move_to_next_symbol\r
150         jc      calm_plain_default_value\r
151         cmp     al,'<'\r
152         je      calm_enclosed_default_value\r
153     calm_plain_default_value:\r
154         mov     dl,','\r
155         xor     dh,dh\r
156         mov     [breakpoint_token],'&'\r
157         call    extract_piece_of_line\r
158         jmp     calm_default_value_ready\r
159     calm_enclosed_default_value:\r
160         inc     esi\r
161         mov     dl,'>'\r
162         mov     dh,'<'\r
163         mov     [breakpoint_token],0\r
164         call    extract_piece_of_line\r
165         cmp     al,'>'\r
166         jne     invalid_argument\r
167         inc     esi\r
168     calm_default_value_ready:\r
169         mov     edx,edi\r
170         xchg    edi,[calm_literals_cursor]\r
171         mov     eax,edi\r
172         sub     edx,edi\r
173         sub     eax,[calm_literals_buffer.memory_start]\r
174         mov     edi,[calm_code_cursor]\r
175         mov     [edi+CompiledMacroArgument.default_value_offset],eax\r
176         jmp     calm_instruction_argument_ready\r
177     calm_instruction_greedy_argument:\r
178         or      eax,-1\r
179         stosd\r
180         jmp     call_instruction_begin_code\r
181     calm_labeled_instruction:\r
182         inc     esi\r
183         call    move_to_next_symbol\r
184         jc      missing_argument\r
185         mov     [argument_start],esi\r
186         mov     edi,[expression_workspace.memory_start]\r
187         mov     dl,')'\r
188         xor     dh,dh\r
189         mov     [breakpoint_token],dh\r
190         call    cut_piece_of_line\r
191         cmp     al,')'\r
192         jne     invalid_argument\r
193         inc     esi\r
194         mov     dl,SYMCLASS_STRUCTURE\r
195         jmp     get_calm_instruction_identifier\r
196     calm_instruction_arguments_declared:\r
197         xor     eax,eax\r
198         stosd\r
199     call_instruction_begin_code:\r
200         mov     [calm_code_cursor],edi\r
201         mov     eax,[new_local_namespace]\r
202         mov     [current_context.base_namespace],eax\r
203         and     [calm_line_number],0\r
204         mov     [calm_definition_active],1\r
205         jmp     instruction_assembled\r
207 assemble_alm_instruction:\r
208         or      [alm_statement],1\r
209         mov     ebx,[source_context]\r
210         mov     eax,[ebx+SourceContext.number_of_entries]\r
211         dec     eax\r
212         imul    eax,sizeof.SourceEntry\r
213         test    [ebx+sizeof.SourceContext+eax+SourceEntry.flags],SRCF_ALM_STATEMENT\r
214         jnz     identify_alm_instruction\r
215         inc     [calm_line_number]\r
216     identify_alm_instruction:\r
217         call    move_to_next_symbol\r
218         jc      empty_line\r
219         call    get_alm_identifier\r
220         jc      unrecognized_alm_instruction\r
221         mov     dl,SYMCLASS_INSTRUCTION\r
222         call    identify_alm_symbol\r
223         jc      alm_label\r
224         call    get_available_value\r
225         jc      alm_label\r
226         test    [edx+ValueDefinition.flags],VAL_UNCONDITIONAL\r
227         jnz     execute_alm_instruction\r
228         test    [assembly_mode],AMODE_SKIP\r
229         jnz     assembly_line\r
230         test    [assembly_mode],AMODE_DEFINITION\r
231         jnz     add_line_to_macro\r
232     execute_alm_instruction:\r
233         cmp     [edx+ValueDefinition.type],VALTYPE_CALM\r
234         je      launch_calm\r
235         cmp     [edx+ValueDefinition.type],VALTYPE_SYMBOLIC\r
236         je      use_macro\r
237         cmp     [edx+ValueDefinition.type],VALTYPE_NATIVE_COMMAND\r
238         jne     unrecognized_alm_instruction\r
239         jmp     [edx+ValueDefinition.value]\r
240     alm_label:\r
241         call    move_to_next_symbol\r
242         jc      unrecognized_alm_instruction\r
243         cmp     al,':'\r
244         jne     unrecognized_alm_instruction\r
245         inc     esi\r
246         test    [assembly_mode],AMODE_SKIP\r
247         jnz     identify_alm_instruction\r
248         test    [assembly_mode],AMODE_DEFINITION\r
249         jnz     add_label_to_macro\r
250         call    identify_calm_location\r
251         jc      unrecognized_alm_instruction\r
252         call    create_constant_value_definition\r
253         test    edx,edx\r
254         jz      assembly_line\r
255         mov     [edx+ValueDefinition.type],VALTYPE_PLAIN\r
256         mov     eax,[calm_code_cursor]\r
257         sub     eax,[calm_code_buffer.memory_start]\r
258         mov     [edx+ValueDefinition.value],eax\r
259         mov     eax,[current_pass]\r
260         mov     [edx+ValueDefinition.pass],eax\r
261         jmp     identify_alm_instruction\r
262     unrecognized_alm_instruction:\r
263         test    [assembly_mode],AMODE_SKIP\r
264         jnz     assembly_line\r
265         test    [assembly_mode],AMODE_DEFINITION\r
266         jnz     add_line_to_macro\r
267         mov     edx,_unexpected_instruction\r
268         call    register_error\r
269         jmp     assembly_line\r
270     get_alm_identifier:\r
271         xor     ecx,ecx\r
272         call    move_to_next_symbol\r
273         jc      malformed_alm_identifier\r
274         cmp     al,1Ah\r
275         je      alm_plain_name\r
276         cmp     al,30h\r
277         je      alm_numeric_name\r
278         cmp     al,'#'\r
279         jne     malformed_alm_identifier\r
280         call    check_concatenation\r
281         jnc     get_alm_identifier\r
282       malformed_alm_identifier:\r
283         stc\r
284         retn\r
285       alm_plain_name:\r
286         inc     esi\r
287         lodsd\r
288         mov     ebx,eax\r
289         mov     ecx,[ebx]\r
290         mov     eax,[ebx+4+ecx]\r
291         mov     [case_sensitive_hash],eax\r
292         mov     eax,[ebx+4+ecx+4]\r
293         mov     [case_insensitive_hash],eax\r
294       alm_check_for_concatenation:\r
295         xor     ecx,ecx\r
296         call    move_to_next_symbol\r
297         jc      alm_identifier_ok\r
298         cmp     al,'#'\r
299         jne     alm_identifier_ok\r
300         call    check_concatenation\r
301         jc      alm_identifier_ok\r
302         call    move_to_next_symbol\r
303         jc      alm_identifier_ok\r
304         cmp     al,1Ah\r
305         je      alm_concatenation\r
306         cmp     al,30h\r
307         je      alm_concatenation\r
308       alm_identifier_ok:\r
309         mov     [symbol_data],ebx\r
310         cmp     ebx,[assembly_workspace.memory_start]\r
311         je      alm_identifier_volatile\r
312         mov     [name_volatile],0\r
313         clc\r
314         retn\r
315       alm_identifier_volatile:\r
316         sub     edi,ebx\r
317         sub     edi,4\r
318         mov     [ebx],edi\r
319         mov     [name_volatile],1\r
320         clc\r
321         retn\r
322       alm_concatenation:\r
323         mov     edx,assembly_workspace\r
324         cmp     ebx,[edx+Workspace.memory_start]\r
325         je      alm_name_segment\r
326         mov     edi,[edx+Workspace.memory_start]\r
327         add     edi,4\r
328         mov     ecx,[ebx]\r
329         call    reserve_workspace\r
330         xchg    ebx,esi\r
331         lodsd\r
332         mov     ecx,eax\r
333         rep     movsb\r
334         mov     esi,ebx\r
335         mov     ebx,[edx+Workspace.memory_start]\r
336       alm_name_segment:\r
337         lodsb\r
338         cmp     al,30h\r
339         je      alm_attach_numeric_segment\r
340         lodsd\r
341         push    ebx esi\r
342       alm_append_name:\r
343         mov     esi,eax\r
344         mov     ecx,[esi]\r
345         mov     edx,assembly_workspace\r
346         call    reserve_workspace\r
347         lodsd\r
348         lea     ebx,[esi+eax]\r
349         mov     ecx,[case_sensitive_hash]\r
350         mov     edx,[case_insensitive_hash]\r
351         xor     eax,eax\r
352       alm_name_hash:\r
353         lodsb\r
354         xor     cl,al\r
355         xor     dl,[characters+eax]\r
356         imul    ecx,FNV_PRIME\r
357         imul    edx,FNV_PRIME\r
358         stosb\r
359         cmp     esi,ebx\r
360         jne     alm_name_hash\r
361         mov     [case_sensitive_hash],ecx\r
362         mov     [case_insensitive_hash],edx\r
363         pop     esi ebx\r
364         jmp     alm_check_for_concatenation\r
365       alm_numeric_name:\r
366         inc     esi\r
367         mov     ebx,[assembly_workspace.memory_start]\r
368         lea     edi,[ebx+4]\r
369         mov     eax,FNV_OFFSET\r
370         mov     [case_sensitive_hash],eax\r
371         mov     [case_insensitive_hash],eax\r
372       alm_attach_numeric_segment:\r
373         mov     edx,esi\r
374         mov     ecx,[edx]\r
375         lea     esi,[esi+4+ecx]\r
376         push    ebx esi\r
377         push    edi\r
378         call    convert_number_back\r
379         pop     edi\r
380         mov     eax,edx\r
381         jmp     alm_append_name\r
382     identify_alm_symbol:\r
383         mov     [symbol_class],dl\r
384         push    esi\r
385         mov     esi,[symbol_data]\r
386         lodsd\r
387         mov     ecx,eax\r
388         mov     edx,[case_insensitive_hash]\r
389         mov     ebx,[alm_namespace]\r
390         mov     [name_kind],NAME_CASEINSENSITIVE\r
391         and     [name_token],0\r
392         and     [symbol_required],0\r
393         and     [symbol_expected],0\r
394         call    scan_namespace\r
395         pop     esi\r
396         retn\r
397     identify_calm_location:\r
398         mov     [symbol_class],SYMCLASS_CALM_LOCATION\r
399         push    esi\r
400         mov     esi,[symbol_data]\r
401         lodsd\r
402         mov     ecx,eax\r
403         mov     edx,[case_sensitive_hash]\r
404         mov     ebx,[current_context.base_namespace]\r
405         and     [name_kind],0\r
406         and     [name_token],0\r
407         or      [symbol_required],1\r
408         or      [symbol_expected],1\r
409         call    scan_namespace\r
410         pop     esi\r
411         retn\r
413 alm_jyes:\r
414         mov     [value],calm_jyes\r
415         jmp     assemble_alm_jump\r
416 alm_jno:\r
417         mov     [value],calm_jno\r
418         jmp     assemble_alm_jump\r
419 alm_jump:\r
420         mov     [value],calm_jump\r
421     assemble_alm_jump:\r
422         test    [assembly_mode],AMODE_CALM_DEFINITION\r
423         jz      unexpected_instruction\r
424         call    move_to_next_symbol\r
425         jc      missing_argument\r
426         call    get_alm_identifier\r
427         jc      invalid_argument\r
428         call    identify_calm_location\r
429         jc      invalid_argument\r
430         mov     edx,[ebx+SymbolTree_Leaf.definition]\r
431         test    edx,edx\r
432         jz      alm_unresolved_jump\r
433         mov     eax,[edx+ValueDefinition.pass]\r
434         cmp     eax,[current_pass]\r
435         jne     alm_unresolved_jump\r
436         mov     ebx,[edx+ValueDefinition.value]\r
437     emit_calm_jump:\r
438         mov     edi,[calm_code_cursor]\r
439         mov     edx,calm_code_buffer\r
440         mov     ecx,8+4\r
441         call    reserve_workspace\r
442         mov     eax,[calm_line_number]\r
443         stosd\r
444         mov     eax,[value]\r
445         stosd\r
446         mov     eax,ebx\r
447         stosd\r
448         mov     [calm_code_cursor],edi\r
449         jmp     instruction_assembled\r
450     alm_unresolved_jump:\r
451         push    esi\r
452         mov     edx,calm_auxiliary_buffer\r
453         mov     edi,[calm_auxiliary_cursor]\r
454         mov     esi,[source_context]\r
455         mov     ecx,[esi+SourceContext.number_of_entries]\r
456         imul    ecx,sizeof.SourceEntry\r
457         add     ecx,sizeof.SourceContext\r
458         add     ecx,sizeof.UnresolvedJump\r
459         call    reserve_workspace\r
460         mov     [calm_auxiliary_cursor],edi\r
461         mov     eax,[calm_code_cursor]\r
462         add     eax,8\r
463         sub     eax,[calm_code_buffer.memory_start]\r
464         mov     [edi+UnresolvedJump.offset],eax\r
465         add     edi,sizeof.UnresolvedJump\r
466         call    clone_source_context\r
467         mov     ecx,edi\r
468         xchg    edi,[calm_auxiliary_cursor]\r
469         sub     ecx,edi\r
470         mov     [edi+UnresolvedJump.entry_length],ecx\r
471         pop     esi\r
472         jmp     emit_calm_jump\r
474 alm_end:\r
475         test    [assembly_mode],AMODE_CALM_DEFINITION\r
476         jz      unexpected_unconditional_alm_instruction\r
477         call    move_to_next_symbol\r
478         jc      finish_calm_definition\r
479         call    get_alm_identifier\r
480         jc      invalid_argument\r
481         mov     dl,SYMCLASS_STRUCTURE\r
482         call    identify_alm_symbol\r
483         jc      invalid_argument\r
484         mov     edx,[ebx+SymbolTree_Leaf.definition]\r
485         cmp     [edx+ValueDefinition.type],VALTYPE_NATIVE_COMMAND\r
486         jne     invalid_argument\r
487         cmp     [edx+ValueDefinition.value],alm_end\r
488         jne     invalid_argument\r
489     finish_calm_definition:\r
490         mov     dl,DBLOCK_CALMINSTRUCTION\r
491         call    find_directive_block\r
492         jc      unexpected_unconditional_alm_instruction\r
493         call    close_directive_block\r
494         and     [assembly_mode],not AMODE_CALM_DEFINITION\r
495         test    [assembly_mode],AMODE_DEFINITION\r
496         jnz     add_line_to_macro\r
497         cmp     [calm_definition_active],0\r
498         je      instruction_assembled\r
499         push    esi\r
500         mov     esi,[calm_auxiliary_buffer.memory_start]\r
501     resolve_calm_jumps:\r
502         cmp     esi,[calm_auxiliary_cursor]\r
503         je      calm_jumps_resolved\r
504         mov     eax,[esi+UnresolvedJump.offset]\r
505         add     eax,[calm_code_buffer.memory_start]\r
506         mov     ebx,[eax]\r
507         mov     edx,[ebx+SymbolTree_Leaf.definition]\r
508         test    edx,edx\r
509         jz      unresolvable_calm_jump\r
510         mov     ecx,[edx+ValueDefinition.pass]\r
511         cmp     ecx,[current_pass]\r
512         jne     unresolvable_calm_jump\r
513         mov     ebx,[edx+ValueDefinition.value]\r
514         mov     [eax],ebx\r
515     resolve_next_calm_jump:\r
516         add     esi,[esi+UnresolvedJump.entry_length]\r
517         jmp     resolve_calm_jumps\r
518     unresolvable_calm_jump:\r
519         mov     edx,[calm_code_cursor]\r
520         sub     edx,[calm_code_buffer.memory_start]\r
521         mov     [eax],edx\r
522         add     esi,sizeof.UnresolvedJump\r
523         mov     edx,_undefined_jump_target\r
524         call    register_delayed_error\r
525         sub     esi,sizeof.UnresolvedJump\r
526         jmp     resolve_next_calm_jump\r
527     calm_jumps_resolved:\r
528         mov     ebx,[current_context.base_namespace]\r
529         mov     edx,[ebx+SymbolTree_Root.parent_branch]\r
530         mov     eax,[edx+SymbolTree_Foliage.root]\r
531         mov     [current_context.base_namespace],eax\r
532         mov     edi,[calm_code_cursor]\r
533         mov     edx,calm_code_buffer\r
534         mov     ecx,[calm_literals_cursor]\r
535         mov     esi,[calm_literals_buffer.memory_start]\r
536         sub     ecx,esi\r
537         add     ecx,8\r
538         call    reserve_workspace\r
539         mov     eax,[calm_line_number]\r
540         stosd\r
541         mov     eax,calm_end\r
542         stosd\r
543         mov     ebx,[calm_code_buffer.memory_start]\r
544         mov     eax,edi\r
545         sub     eax,ebx\r
546         mov     [ebx+CompiledMacroHeader.literals_offset],eax\r
547         mov     ecx,[calm_literals_cursor]\r
548         sub     ecx,esi\r
549         rep     movsb\r
550         mov     ebx,[macro_leaf]\r
551         test    ebx,ebx\r
552         jz      calm_definition_done\r
553         call    create_value_definition\r
554         test    edx,edx\r
555         jz      calm_definition_done\r
556         mov     esi,[calm_code_buffer.memory_start]\r
557         mov     ecx,edi\r
558         sub     ecx,esi\r
559         mov     [value_type],VALTYPE_CALM\r
560         call    assign_value\r
561         mov     al,[macro_flags]\r
562         or      [edx+ValueDefinition.flags],al\r
563     calm_definition_done:\r
564         pop     esi\r
565         jmp     instruction_assembled\r
566     unexpected_unconditional_alm_instruction:\r
567         test    [assembly_mode],AMODE_SKIP\r
568         jnz     assembly_line\r
569         test    [assembly_mode],AMODE_DEFINITION\r
570         jnz     add_line_to_macro\r
571         jmp     unexpected_instruction\r
573 alm_local:\r
574         test    [assembly_mode],AMODE_CALM_DEFINITION\r
575         jz      unexpected_instruction\r
576         call    move_to_next_symbol\r
577         jc      missing_argument\r
578         or      [symbol_definition],1\r
579         mov     dl,SYMCLASS_EXPRESSION\r
580         mov     ebx,[current_context.base_namespace]\r
581         call    identify_symbol_in_namespace\r
582         jc      invalid_argument\r
583         test    ebx,ebx\r
584         jz      invalid_argument\r
585         call    update_value_definition\r
586         test    edx,edx\r
587         jz      alm_next_local\r
588         push    esi\r
589         mov     [value_type],VALTYPE_RESERVED\r
590         xor     ecx,ecx\r
591         call    assign_value\r
592         pop     esi\r
593     alm_next_local:\r
594         call    move_to_next_symbol\r
595         jc      instruction_assembled\r
596         cmp     al,','\r
597         jne     invalid_argument\r
598         inc     esi\r
599         jmp     alm_local\r
601 alm_assemble:\r
602         mov     [value],calm_assemble\r
603         jmp     assemble_alm_operation_on_variable\r
604 alm_stringify:\r
605         mov     [value],calm_stringify\r
606     assemble_alm_operation_on_variable:\r
607         test    [assembly_mode],AMODE_CALM_DEFINITION\r
608         jz      unexpected_instruction\r
609         and     [symbol_definition],0\r
610         mov     dl,SYMCLASS_EXPRESSION\r
611         call    identify_symbol\r
612         jc      invalid_identifier\r
613         test    ebx,ebx\r
614         jz      invalid_identifier\r
615         mov     edi,[calm_code_cursor]\r
616         mov     edx,calm_code_buffer\r
617         mov     ecx,8+4\r
618         call    reserve_workspace\r
619         mov     eax,[calm_line_number]\r
620         stosd\r
621         mov     eax,[value]\r
622         stosd\r
623         mov     eax,ebx\r
624         stosd\r
625         mov     [calm_code_cursor],edi\r
626         jmp     instruction_assembled\r
628 alm_arrange:\r
629         test    [assembly_mode],AMODE_CALM_DEFINITION\r
630         jz      unexpected_instruction\r
631         and     [symbol_definition],0\r
632         mov     dl,SYMCLASS_EXPRESSION\r
633         call    identify_symbol\r
634         jc      invalid_identifier\r
635         test    ebx,ebx\r
636         jz      invalid_identifier\r
637         call    move_to_next_symbol\r
638         jc      missing_argument\r
639         cmp     al,','\r
640         jne     instruction_assembled\r
641         inc     esi\r
642         call    move_to_next_symbol\r
643         mov     edi,[calm_code_cursor]\r
644         mov     edx,calm_code_buffer\r
645         mov     ecx,8+12\r
646         call    reserve_workspace\r
647         mov     eax,[calm_line_number]\r
648         stosd\r
649         mov     eax,calm_arrange\r
650         stosd\r
651         mov     eax,ebx\r
652         stosd\r
653         mov     edx,calm_literals_buffer\r
654         mov     ebx,[calm_literals_cursor]\r
655         mov     eax,ebx\r
656         sub     eax,[edx+Workspace.memory_start]\r
657         stosd\r
658         mov     [calm_code_cursor],edi\r
659         mov     edi,ebx\r
660         mov     ecx,[line_end]\r
661         sub     ecx,esi\r
662         shl     ecx,1\r
663         call    reserve_workspace\r
664         mov     [breakpoint_token],0\r
665         call    parse_pattern\r
666         mov     [calm_literals_cursor],edi\r
667         mov     eax,edi\r
668         mov     edi,[calm_code_cursor]\r
669         sub     eax,[calm_literals_buffer.memory_start]\r
670         stosd\r
671         mov     [calm_code_cursor],edi\r
672         jmp     instruction_assembled\r
673     parse_pattern:\r
674     ; in:\r
675     ;  esi - first token of the pattern in the preprocessed line\r
676     ;  edi - buffer with enough space to hold twice the length of the preprocessed text left in line\r
677     ;  [breakpoint_token] = initial byte of symbol that should end the pattern\r
678     ; out:\r
679     ;  esi - after the processed portion of line (might be at [line_end])\r
680     ;  edi - in the buffer after the stored pattern\r
681         cmp     esi,[line_end]\r
682         je      pattern_parsed\r
683         lodsb\r
684         cmp     al,[breakpoint_token]\r
685         je      pattern_breakpoint\r
686     token_in_pattern:\r
687         cmp     al,'='\r
688         je      parse_pattern_literal\r
689         cmp     al,1Ah\r
690         je      parse_reference_in_pattern\r
691         cmp     al,40h\r
692         je      ignore_context_in_pattern\r
693         cmp     al,20h\r
694         je      whitespace_in_pattern\r
695         stosb\r
696     literal_token_in_pattern:\r
697         cmp     al,22h\r
698         je      copy_pattern_data\r
699         cmp     al,27h\r
700         je      copy_pattern_data\r
701         cmp     al,30h\r
702         jne     parse_pattern\r
703         lodsd\r
704         mov     ecx,eax\r
705         stosd\r
706         rep     movsb\r
707         jmp     parse_pattern\r
708     whitespace_in_pattern:\r
709         cmp     esi,[line_end]\r
710         je      pattern_parsed\r
711         lodsb\r
712         cmp     al,20h\r
713         je      whitespace_in_pattern\r
714         cmp     al,[breakpoint_token]\r
715         je      pattern_breakpoint\r
716         cmp     al,40h\r
717         jne     store_whitespace_in_pattern\r
718         call    pass_context\r
719         jmp     whitespace_in_pattern\r
720     store_whitespace_in_pattern:\r
721         mov     byte [edi],20h\r
722         inc     edi\r
723         jmp     token_in_pattern\r
724     pattern_breakpoint:\r
725         dec     esi\r
726     pattern_parsed:\r
727         retn\r
728     pass_context:\r
729         mov     eax,esi\r
730         add     esi,sizeof.RecognitionContext\r
731         cmp     dword [eax],0\r
732         je      zero_context\r
733         mov     [embedded_context],eax\r
734         retn\r
735     zero_context:\r
736         and     [embedded_context],0\r
737         retn\r
738     copy_pattern_data:\r
739         movsd\r
740         jmp     parse_pattern\r
741     ignore_context_in_pattern:\r
742         call    pass_context\r
743         jmp     parse_pattern\r
744     ignore_context_in_pattern_literal:\r
745         call    pass_context\r
746     parse_pattern_literal:\r
747         cmp     esi,[line_end]\r
748         je      error_in_parsed_pattern\r
749         lodsb\r
750         cmp     al,40h\r
751         je      ignore_context_in_pattern_literal\r
752         cmp     al,20h\r
753         je      parse_hard_space_in_pattern\r
754         stosb\r
755         cmp     al,1Ah\r
756         je      copy_pattern_data\r
757         jmp     literal_token_in_pattern\r
758     parse_hard_space_in_pattern:\r
759         mov     al,0A0h\r
760         stosb\r
761         jmp     parse_pattern\r
762     parse_reference_in_pattern:\r
763         dec     esi\r
764         call    detect_numeric_symbol\r
765         jc      numeric_name_in_pattern\r
766         inc     esi\r
767         mov     [name_token],esi\r
768         lodsd\r
769         mov     dx,SYMCLASS_EXPRESSION\r
770         mov     [name_volatile],0\r
771         push    esi edi\r
772         mov     esi,eax\r
773         lodsd\r
774         mov     ecx,eax\r
775         xor     ebx,ebx\r
776         mov     eax,[embedded_context]\r
777         test    eax,eax\r
778         jz      use_current_namespace_in_pattern\r
779         mov     eax,[eax+RecognitionContext.base_namespace]\r
780         jmp     namespace_in_pattern_ok\r
781       use_current_namespace_in_pattern:\r
782         mov     eax,[current_context.base_namespace]\r
783       namespace_in_pattern_ok:\r
784         mov     [recognition_context.base_namespace],eax\r
785         call    recognize_symbol\r
786         pop     edi esi\r
787         mov     al,1Bh\r
788         stosb\r
789         mov     eax,[name_token]\r
790         mov     eax,[eax]\r
791         stosd\r
792         mov     eax,ebx\r
793         stosd\r
794         jmp     parse_pattern\r
795     numeric_name_in_pattern:\r
796         movsb\r
797         movsd\r
798         jmp     parse_pattern\r
799     error_in_parsed_pattern:\r
800         mov     edx,_invalid_argument\r
801         call    register_error\r
802         jmp     parse_pattern\r
804 alm_match:\r
805         test    [assembly_mode],AMODE_CALM_DEFINITION\r
806         jz      unexpected_instruction\r
807         call    move_to_next_symbol\r
808         jc      missing_argument\r
809         mov     edx,calm_literals_buffer\r
810         mov     edi,[calm_literals_cursor]\r
811         mov     ecx,[line_end]\r
812         sub     ecx,esi\r
813         shl     ecx,1\r
814         call    reserve_workspace\r
815         mov     [calm_literals_cursor],edi\r
816         mov     [breakpoint_token],','\r
817         call    parse_pattern\r
818         xchg    edi,[calm_literals_cursor]\r
819         mov     [pattern_start],edi\r
820         cmp     esi,[line_end]\r
821         je      missing_argument\r
822         lodsb\r
823         cmp     al,','\r
824         jne     invalid_argument\r
825         and     [symbol_definition],0\r
826         mov     dl,SYMCLASS_EXPRESSION\r
827         call    identify_symbol\r
828         jc      invalid_identifier\r
829         test    ebx,ebx\r
830         jz      invalid_identifier\r
831         and     [brackets],0\r
832         call    move_to_next_symbol\r
833         jc      no_brackets\r
834         cmp     al,','\r
835         jne     no_brackets\r
836         inc     esi\r
837         call    move_to_next_symbol\r
838         jc      invalid_argument\r
839         mov     dl,al\r
840         lea     edi,[esi+1]\r
841         call    skip_token\r
842         cmp     esi,edi\r
843         jne     invalid_argument\r
844         call    move_to_next_symbol\r
845         jc      invalid_argument\r
846         mov     dh,al\r
847         lea     edi,[esi+1]\r
848         call    skip_token\r
849         cmp     esi,edi\r
850         jne     invalid_argument\r
851         mov     esi,[pattern_start]\r
852     ensure_no_brackets_in_pattern:\r
853         cmp     esi,[calm_literals_cursor]\r
854         je      brackets_ok\r
855         mov     al,[esi]\r
856         cmp     al,dl\r
857         je      invalid_argument\r
858         cmp     al,dh\r
859         je      invalid_argument\r
860         cmp     al,1Bh\r
861         je      skip_reference_in_pattern\r
862         call    skip_token\r
863         jmp     ensure_no_brackets_in_pattern\r
864       skip_reference_in_pattern:\r
865         add     esi,1+8\r
866         jmp     ensure_no_brackets_in_pattern\r
867     brackets_ok:\r
868         mov     esi,edi\r
869         mov     word [brackets],dx\r
870     no_brackets:\r
871         mov     edi,[calm_code_cursor]\r
872         mov     edx,calm_code_buffer\r
873         mov     ecx,8+16\r
874         call    reserve_workspace\r
875         mov     eax,[calm_line_number]\r
876         stosd\r
877         mov     eax,calm_match\r
878         stosd\r
879         mov     eax,ebx\r
880         stosd\r
881         mov     ebx,[calm_literals_buffer.memory_start]\r
882         mov     eax,[pattern_start]\r
883         sub     eax,ebx\r
884         stosd\r
885         mov     eax,[calm_literals_cursor]\r
886         sub     eax,ebx\r
887         stosd\r
888         mov     eax,[brackets]\r
889         stosd\r
890         mov     [calm_code_cursor],edi\r
891         jmp     instruction_assembled\r
893 alm_compute:\r
894         test    [assembly_mode],AMODE_CALM_DEFINITION\r
895         jz      unexpected_instruction\r
896         and     [symbol_definition],0\r
897         mov     dl,SYMCLASS_EXPRESSION\r
898         call    identify_symbol\r
899         jc      invalid_identifier\r
900         test    ebx,ebx\r
901         jz      invalid_identifier\r
902         call    move_to_next_symbol\r
903         jc      missing_argument\r
904         cmp     al,','\r
905         jne     instruction_assembled\r
906         inc     esi\r
907         call    move_to_next_symbol\r
908         mov     edi,[calm_code_cursor]\r
909         mov     edx,calm_code_buffer\r
910         mov     ecx,8+8\r
911         call    reserve_workspace\r
912         mov     eax,[calm_line_number]\r
913         stosd\r
914         mov     eax,calm_compute\r
915         stosd\r
916         mov     eax,ebx\r
917         stosd\r
918         xor     eax,eax\r
919         stosd\r
920         mov     [calm_code_cursor],edi\r
921         mov     edi,[expression_workspace.memory_start]\r
922         and     [leave_opening_parentheses],0\r
923         or      [use_raw_values],1\r
924         call    parse_expression\r
925         and     [use_raw_values],0\r
926         push    esi\r
927         mov     esi,[expression_workspace.memory_start]\r
928         mov     ecx,edi\r
929         sub     ecx,esi\r
930         mov     edi,[calm_code_cursor]\r
931         mov     edx,calm_code_buffer\r
932         call    reserve_workspace\r
933         mov     [calm_code_cursor],edi\r
934         call    convert_parsed_expression\r
935         pop     esi\r
936         jc      no_computable_expression\r
937         mov     ecx,edi\r
938         xchg    edi,[calm_code_cursor]\r
939         sub     ecx,edi\r
940         mov     [edi-4],ecx\r
941         jmp     instruction_assembled\r
942     no_computable_expression:\r
943         sub     [calm_code_cursor],8+8\r
944         jmp     assembly_line\r
945     convert_parsed_expression:\r
946         lodsd\r
947         test    eax,eax\r
948         jz      parsed_expression_converted\r
949         cmp     al,EXPR_SYMBOL_VALUE\r
950         je      copy_parsed_symbol\r
951         cmp     al,EXPR_OPERATOR\r
952         je      copy_parsed_operator\r
953         cmp     al,EXPR_NUMBER\r
954         je      copy_parsed_value\r
955         cmp     al,EXPR_STRING\r
956         je      copy_parsed_value\r
957         cmp     al,EXPR_FLOAT\r
958         je      copy_parsed_value\r
959         cmp     al,EXPR_MISSING_PARENTHESIS\r
960         je      expression_missing_parenthesis\r
961         jmp     invalid_expression\r
962       copy_parsed_value:\r
963         or      eax,EXPRF_CALM_LITERAL\r
964         mov     ebx,[esi]\r
965         add     esi,4\r
966         test    eax,EXPRF_VALUE_IN_WORKSPACE\r
967         jnz     parsed_value_in_workspace\r
968         test    ebx,ebx\r
969         jnz     parsed_value_pointer_ok\r
970         jmp     invalid_expression\r
971       parsed_value_in_workspace:\r
972         add     ebx,[value_workspace.memory_start]\r
973         and     eax,not EXPRF_VALUE_IN_WORKSPACE\r
974       parsed_value_pointer_ok:\r
975         cmp     al,EXPR_FLOAT\r
976         je      parsed_float_to_copy\r
977         mov     ecx,[ebx]\r
978         add     ecx,4\r
979         jmp     parsed_value_length_ok\r
980       parsed_float_to_copy:\r
981         mov     ecx,sizeof.FloatData\r
982       parsed_value_length_ok:\r
983         stosd\r
984         mov     edx,[calm_literals_cursor]\r
985         mov     eax,edx\r
986         sub     eax,[calm_literals_buffer.memory_start]\r
987         stosd\r
988         push    edi\r
989         push    ecx\r
990         mov     edi,edx\r
991         mov     edx,calm_literals_buffer\r
992         call    reserve_workspace\r
993         pop     ecx\r
994         xchg    esi,ebx\r
995         rep     movsb\r
996         mov     [calm_literals_cursor],edi\r
997         mov     esi,ebx\r
998         pop     edi\r
999         jmp     convert_parsed_expression\r
1000     copy_parsed_symbol:\r
1001         mov     al,EXPR_SYMBOL\r
1002         stosd\r
1003         lodsd\r
1004         test    eax,eax\r
1005         jz      invalid_expression\r
1006         stosd\r
1007         add     esi,4\r
1008         jmp     convert_parsed_expression\r
1009     copy_parsed_operator:\r
1010         stosd\r
1011         movsd\r
1012         jmp     convert_parsed_expression\r
1013     parsed_expression_converted:\r
1014         stosd\r
1015         clc\r
1016         retn\r
1018 alm_check:\r
1019         test    [assembly_mode],AMODE_CALM_DEFINITION\r
1020         jz      unexpected_instruction\r
1021         mov     edi,[calm_code_cursor]\r
1022         mov     edx,calm_code_buffer\r
1023         mov     eax,edi\r
1024         sub     eax,[edx+Workspace.memory_start]\r
1025         mov     [calm_rollback_offset],eax\r
1026         mov     ecx,8\r
1027         call    reserve_workspace\r
1028         mov     eax,[calm_line_number]\r
1029         stosd\r
1030         mov     eax,calm_check\r
1031         stosd\r
1032         mov     [calm_code_cursor],edi\r
1033         or      [use_raw_values],1\r
1034         mov     ebx,[condition_stack_base]\r
1035         and     dword [ebx],0\r
1036         add     ebx,4\r
1037         mov     [condition_stack],ebx\r
1038     parse_alm_condition:\r
1039         call    peek_at_constituent_value\r
1040         jc      calm_condition_parsed\r
1041         cmp     al,'~'\r
1042         jne     parse_alm_logical_value\r
1043         and     [current_constituent],0\r
1044         mov     ecx,BOOL_NEG\r
1045         call    push_to_condition_stack\r
1046         jmp     parse_alm_condition\r
1047     alm_logical_value_empty:\r
1048         test    ecx,ecx\r
1049         jz      calm_condition_parsed\r
1050         call    push_to_condition_stack\r
1051         jmp     parse_alm_condition\r
1052     parse_alm_logical_value:\r
1053         call    parse_logical_value\r
1054         jc      alm_logical_value_empty\r
1055         jecxz   convert_logical_value\r
1056         call    push_to_condition_stack\r
1057     convert_logical_value:\r
1058         mov     [calm_source_pointer],esi\r
1059         mov     esi,[expression_workspace.memory_start]\r
1060         mov     ecx,edi\r
1061         sub     ecx,esi\r
1062         add     ecx,8\r
1063         add     ecx,[condition_stack]\r
1064         sub     ecx,[condition_stack_base]\r
1065         mov     edi,[calm_code_cursor]\r
1066         mov     edx,calm_code_buffer\r
1067         call    reserve_workspace\r
1068         xor     eax,eax\r
1069         stosd\r
1070         mov     [calm_code_cursor],edi\r
1071         mov     eax,[comparator]\r
1072         stosd\r
1073       convert_argument_sequences:\r
1074         call    convert_parsed_expression\r
1075         jc      condition_malformed\r
1076         cmp     esi,[expression_end]\r
1077         jb      convert_argument_sequences\r
1078         mov     ecx,edi\r
1079         xchg    edi,[calm_code_cursor]\r
1080         sub     ecx,edi\r
1081         mov     [edi-4],ecx\r
1082         mov     esi,[calm_source_pointer]\r
1083     parse_alm_logical_operator:\r
1084         call    get_constituent_value\r
1085         jc      calm_condition_parsed\r
1086         cmp     al,')'\r
1087         je      close_subconditions\r
1088         cmp     al,'|'\r
1089         je      parse_or\r
1090         cmp     al,'&'\r
1091         jne     condition_malformed\r
1092     parse_and:\r
1093         mov     ecx,BOOL_AND\r
1094         jmp     prepare_stack_for_logical_operator\r
1095     parse_or:\r
1096         mov     ecx,BOOL_OR\r
1097       prepare_stack_for_logical_operator:\r
1098         mov     ebx,[condition_stack]\r
1099         sub     ebx,4\r
1100         cmp     dword [ebx],0\r
1101         jge     push_logical_operator\r
1102         mov     [condition_stack],ebx\r
1103         mov     edi,[calm_code_cursor]\r
1104         mov     eax,[ebx]\r
1105         stosd\r
1106         mov     [calm_code_cursor],edi\r
1107         jmp     prepare_stack_for_logical_operator\r
1108       push_logical_operator:\r
1109         call    push_to_condition_stack\r
1110         jmp     parse_alm_condition\r
1111     close_subconditions:\r
1112         mov     ebx,[condition_stack]\r
1113         sub     ebx,4\r
1114         cmp     dword [ebx],0\r
1115         jl      store_logical_operator\r
1116         je      condition_malformed\r
1117         dec     dword [ebx]\r
1118         jnz     parse_alm_logical_operator\r
1119         mov     [condition_stack],ebx\r
1120         jmp     parse_alm_logical_operator\r
1121       store_logical_operator:\r
1122         mov     edi,[calm_code_cursor]\r
1123         mov     eax,[ebx]\r
1124         mov     [condition_stack],ebx\r
1125         stosd\r
1126         mov     [calm_code_cursor],edi\r
1127         jmp     close_subconditions\r
1128     push_to_condition_stack:\r
1129         mov     ebx,[condition_stack]\r
1130         mov     [ebx],ecx\r
1131         add     ebx,4\r
1132         cmp     [condition_stack_end],ebx\r
1133         je      grow_condition_stack\r
1134         mov     [condition_stack],ebx\r
1135         retn\r
1136       grow_condition_stack:\r
1137         mov     eax,[condition_stack_base]\r
1138         sub     ebx,eax\r
1139         lea     ecx,[ebx+4]\r
1140         call    grow_stack\r
1141         mov     [condition_stack_base],eax\r
1142         add     ebx,eax\r
1143         mov     [condition_stack],ebx\r
1144         add     ecx,eax\r
1145         mov     [condition_stack_end],ecx\r
1146         retn\r
1147     calm_condition_parsed:\r
1148         mov     edi,[calm_code_cursor]\r
1149         mov     ebx,[condition_stack]\r
1150         mov     ecx,ebx\r
1151         sub     ecx,[condition_stack_base]\r
1152         mov     edx,calm_code_buffer\r
1153         call    reserve_workspace\r
1154     finish_calm_condition:\r
1155         sub     ebx,4\r
1156         mov     eax,[ebx]\r
1157         cmp     eax,0\r
1158         jg      condition_malformed\r
1159         stosd\r
1160         jne     finish_calm_condition\r
1161         mov     [calm_code_cursor],edi\r
1162         and     [use_raw_values],0\r
1163         jmp     instruction_assembled\r
1164     condition_malformed:\r
1165         and     [use_raw_values],0\r
1166         mov     edi,[calm_rollback_offset]\r
1167         add     edi,[calm_code_buffer.memory_start]\r
1168         mov     [calm_code_cursor],edi\r
1169         mov     edx,_invalid_expression\r
1170         call    register_error\r
1171         jmp     assembly_line\r
1173 alm_publish:\r
1174         test    [assembly_mode],AMODE_CALM_DEFINITION\r
1175         jz      unexpected_instruction\r
1176         mov     [value],calm_publish_variable\r
1177         call    move_to_next_symbol\r
1178         jc      missing_argument\r
1179         cmp     al,':'\r
1180         jne     get_identifier_variable\r
1181         inc     esi\r
1182         mov     [value],calm_publish_stack\r
1183     get_identifier_variable:\r
1184         and     [symbol_definition],0\r
1185         mov     dl,SYMCLASS_EXPRESSION\r
1186         call    identify_symbol\r
1187         jc      invalid_identifier\r
1188         test    ebx,ebx\r
1189         jz      invalid_identifier\r
1190         mov     [label_leaf],ebx\r
1191         call    move_to_next_symbol\r
1192         jc      missing_argument\r
1193         cmp     al,':'\r
1194         jne     get_value_variable\r
1195         mov     eax,calm_publish_constant\r
1196         xchg    [value],eax\r
1197         cmp     eax,calm_publish_variable\r
1198         jne     invalid_argument\r
1199         inc     esi\r
1200         call    move_to_next_symbol\r
1201         jc      missing_argument\r
1202     get_value_variable:\r
1203         cmp     al,','\r
1204         jne     missing_argument\r
1205         inc     esi\r
1206         mov     dl,SYMCLASS_EXPRESSION\r
1207         call    identify_symbol\r
1208         jc      invalid_identifier\r
1209         test    ebx,ebx\r
1210         jz      invalid_identifier\r
1211         mov     edi,[calm_code_cursor]\r
1212         mov     edx,calm_code_buffer\r
1213         mov     ecx,8+8\r
1214         call    reserve_workspace\r
1215         mov     eax,[calm_line_number]\r
1216         stosd\r
1217         mov     eax,[value]\r
1218         stosd\r
1219         mov     eax,[label_leaf]\r
1220         stosd\r
1221         mov     eax,ebx\r
1222         stosd\r
1223         mov     [calm_code_cursor],edi\r
1224         jmp     instruction_assembled\r
1226 alm_transform:\r
1227         test    [assembly_mode],AMODE_CALM_DEFINITION\r
1228         jz      unexpected_instruction\r
1229         call    move_to_next_symbol\r
1230         jc      missing_argument\r
1231         and     [symbol_definition],0\r
1232         mov     dl,SYMCLASS_EXPRESSION\r
1233         call    identify_symbol\r
1234         jc      invalid_identifier\r
1235         test    ebx,ebx\r
1236         jz      invalid_identifier\r
1237         mov     [label_leaf],ebx\r
1238         xor     ebx,ebx\r
1239         call    move_to_next_symbol\r
1240         jc      alm_transform_arguments_ready\r
1241         cmp     al,','\r
1242         jne     alm_transform_arguments_ready\r
1243         inc     esi\r
1244         mov     dl,SYMCLASS_EXPRESSION\r
1245         call    identify_symbol\r
1246         jc      invalid_identifier\r
1247         test    edx,edx\r
1248         jz      invalid_identifier\r
1249         call    get_symbol_namespace\r
1250     alm_transform_arguments_ready:\r
1251         mov     edi,[calm_code_cursor]\r
1252         mov     edx,calm_code_buffer\r
1253         mov     ecx,8+8\r
1254         call    reserve_workspace\r
1255         mov     eax,[calm_line_number]\r
1256         stosd\r
1257         mov     eax,calm_transform\r
1258         stosd\r
1259         mov     eax,[label_leaf]\r
1260         stosd\r
1261         mov     eax,ebx\r
1262         stosd\r
1263         mov     [calm_code_cursor],edi\r
1264         jmp     instruction_assembled\r
1266 alm_take:\r
1267         test    [assembly_mode],AMODE_CALM_DEFINITION\r
1268         jz      unexpected_instruction\r
1269         call    move_to_next_symbol\r
1270         jc      missing_argument\r
1271         xor     ebx,ebx\r
1272         and     [symbol_definition],0\r
1273         cmp     al,','\r
1274         je      alm_take_destination_ready\r
1275         mov     dl,SYMCLASS_EXPRESSION\r
1276         call    identify_symbol\r
1277         jc      invalid_identifier\r
1278         test    ebx,ebx\r
1279         jz      invalid_identifier\r
1280         call    move_to_next_symbol\r
1281         jc      missing_argument\r
1282         cmp     al,','\r
1283         jne     missing_argument\r
1284     alm_take_destination_ready:\r
1285         mov     [label_leaf],ebx\r
1286         inc     esi\r
1287         mov     dl,SYMCLASS_EXPRESSION\r
1288         call    identify_symbol\r
1289         jc      invalid_identifier\r
1290         test    ebx,ebx\r
1291         jz      invalid_identifier\r
1292         mov     edi,[calm_code_cursor]\r
1293         mov     edx,calm_code_buffer\r
1294         mov     ecx,8+8\r
1295         call    reserve_workspace\r
1296         mov     eax,[calm_line_number]\r
1297         stosd\r
1298         mov     eax,calm_take\r
1299         stosd\r
1300         mov     eax,[label_leaf]\r
1301         stosd\r
1302         mov     eax,ebx\r
1303         stosd\r
1304         mov     [calm_code_cursor],edi\r
1305         jmp     instruction_assembled\r
1307 alm_call:\r
1308         test    [assembly_mode],AMODE_CALM_DEFINITION\r
1309         jz      unexpected_instruction\r
1310         and     [symbol_definition],0\r
1311         mov     ebx,[current_context.base_namespace]\r
1312         mov     edx,[ebx+SymbolTree_Root.parent_branch]\r
1313         test    edx,edx\r
1314         jz      alm_call_context_ready\r
1315         mov     eax,[edx+SymbolTree_Foliage.root]\r
1316         mov     [current_context.base_namespace],eax\r
1317       alm_call_context_ready:\r
1318         mov     dl,SYMCLASS_INSTRUCTION\r
1319         push    ebx\r
1320         call    identify_symbol\r
1321         pop     [current_context.base_namespace]\r
1322         jc      invalid_identifier\r
1323         test    ebx,ebx\r
1324         jz      invalid_identifier\r
1325         cmp     [ebx+SymbolTree_Leaf.class],SYMCLASS_INSTRUCTION\r
1326         je      alm_call_instruction_ok\r
1327         mov     edx,[ebx+SymbolTree_Leaf.branch]\r
1328         mov     eax,[edx+SymbolTree_Foliage.root]\r
1329         test    [eax+SymbolTree_Root.flags],NAMESPACE_CALM\r
1330         jz      alm_call_predicted_instruction\r
1331         mov     ebx,[ebx+SymbolTree_Leaf.fallback_parent]\r
1332         test    ebx,ebx\r
1333         jz      invalid_identifier\r
1334      alm_call_predicted_instruction:\r
1335         mov     ebx,edx\r
1336         mov     [symbol_class],SYMCLASS_INSTRUCTION\r
1337         or      [symbol_required],1\r
1338         or      [symbol_expected],1\r
1339         call    scan_symbol_branch\r
1340         jc      invalid_identifier\r
1341         mov     edi,ebx\r
1342      mark_instruction_fallbacks:\r
1343         mov     edx,[edi+SymbolTree_Leaf.fallback_neighbour]\r
1344         test    edx,edx\r
1345         jz      instruction_fallback_neighbour_ok\r
1346         or      [edx+SymbolTree_Leaf.extra_flags],SYMX_INSTRUCTION_PREDICTED\r
1347        instruction_fallback_neighbour_ok:\r
1348         mov     edi,[edi+SymbolTree_Leaf.fallback_parent]\r
1349         test    edi,edi\r
1350         jz      alm_call_instruction_ok\r
1351         or      [edi+SymbolTree_Leaf.extra_flags],SYMX_INSTRUCTION_PREDICTED\r
1352         jmp     mark_instruction_fallbacks\r
1353      alm_call_instruction_ok:\r
1354         mov     edi,[calm_code_cursor]\r
1355         mov     edx,calm_code_buffer\r
1356         mov     ecx,8+8\r
1357         call    reserve_workspace\r
1358         mov     eax,[calm_line_number]\r
1359         stosd\r
1360         mov     eax,calm_call\r
1361         stosd\r
1362         mov     eax,ebx\r
1363         stosd\r
1364      alm_call_argument:\r
1365         call    move_to_next_symbol\r
1366         jc      alm_call_arguments_ready\r
1367         cmp     al,','\r
1368         jne     alm_call_invalid_argument\r
1369         inc     esi\r
1370         mov     edx,calm_code_buffer\r
1371         mov     ecx,8\r
1372         call    reserve_workspace\r
1373         call    move_to_next_symbol\r
1374         jc      alm_call_empty_argument\r
1375         cmp     al,','\r
1376         je      alm_call_empty_argument\r
1377         push    edi\r
1378         mov     dl,SYMCLASS_EXPRESSION\r
1379         call    identify_symbol\r
1380         pop     edi\r
1381         jc      alm_call_invalid_argument\r
1382         test    ebx,ebx\r
1383         jz      alm_call_invalid_argument\r
1384         mov     eax,ebx\r
1385         stosd\r
1386         jmp     alm_call_argument\r
1387       alm_call_empty_argument:\r
1388         or      eax,-1\r
1389         stosd\r
1390         jmp     alm_call_argument\r
1391      alm_call_invalid_argument:\r
1392         mov     edx,_invalid_argument\r
1393         call    register_error\r
1394      alm_call_arguments_ready:\r
1395         xor     eax,eax\r
1396         stosd\r
1397         mov     [calm_code_cursor],edi\r
1398         jmp     instruction_assembled\r
1400 alm_exit:\r
1401         test    [assembly_mode],AMODE_CALM_DEFINITION\r
1402         jz      unexpected_instruction\r
1403         mov     edi,[calm_code_cursor]\r
1404         mov     edx,calm_code_buffer\r
1405         mov     ecx,8\r
1406         call    reserve_workspace\r
1407         mov     eax,[calm_line_number]\r
1408         stosd\r
1409         mov     eax,calm_end\r
1410         stosd\r
1411         mov     [calm_code_cursor],edi\r
1412         jmp     instruction_assembled\r
1414 launch_calm:\r
1415         mov     eax,[current_pass]\r
1416         mov     [ebx+SymbolTree_Leaf.last_use_pass],eax\r
1417         mov     eax,[ebx+SymbolTree_Leaf.branch]\r
1418         mov     [instruction_branch],eax\r
1419         mov     [calm_value],edx\r
1420         mov     [calm_source_pointer],esi\r
1421         mov     esi,[edx+ValueDefinition.value]\r
1422         mov     eax,[esi+CompiledMacroHeader.literals_offset]\r
1423         add     eax,esi\r
1424         mov     [calm_literals],eax\r
1425         mov     [breakpoint_token],0\r
1426         mov     ebx,[esi+CompiledMacroHeader.label_argument_leaf]\r
1427         test    ebx,ebx\r
1428         jz      calm_label_argument_ok\r
1429         call    update_value_definition\r
1430         test    edx,edx\r
1431         jz      calm_label_argument_ok\r
1432         push    esi\r
1433         push    edx\r
1434         push    [line_end]\r
1435         push    [embedded_context]\r
1436         mov     eax,[line_context]\r
1437         mov     [embedded_context],eax\r
1438         mov     esi,[line_start]\r
1439         mov     ecx,[label_instruction_start]\r
1440         mov     [line_end],ecx\r
1441         sub     ecx,esi\r
1442         add     ecx,1+sizeof.RecognitionContext\r
1443         mov     edx,assembly_workspace\r
1444         mov     edi,[edx+Workspace.memory_start]\r
1445         call    reserve_workspace\r
1446         xor     edx,edx\r
1447         mov     [breakpoint_token],dl\r
1448         call    extract_piece_of_line\r
1449         pop     [embedded_context]\r
1450         pop     [line_end]\r
1451         pop     edx\r
1452         mov     [value_type],VALTYPE_SYMBOLIC\r
1453         mov     esi,[assembly_workspace.memory_start]\r
1454         mov     ecx,edi\r
1455         sub     ecx,esi\r
1456         call    assign_value\r
1457         pop     esi\r
1458     calm_label_argument_ok:\r
1459         add     esi,sizeof.CompiledMacroHeader\r
1460         mov     eax,[esi]\r
1461         inc     eax\r
1462         cmp     eax,1\r
1463         jbe     calm_arguments_defined\r
1464     get_calm_argument:\r
1465         mov     edx,assembly_workspace\r
1466         mov     edi,[edx+Workspace.memory_start]\r
1467         mov     ecx,[line_end]\r
1468         sub     ecx,[calm_source_pointer]\r
1469         add     ecx,1+sizeof.RecognitionContext\r
1470         call    reserve_workspace\r
1471         mov     eax,[esi+sizeof.CompiledMacroArgument]\r
1472         xchg    esi,[calm_source_pointer]\r
1473         inc     eax\r
1474         jz      get_calm_greedy_argument\r
1475         call    extract_argument_value\r
1476         jmp     calm_argument_value_cut\r
1477     get_calm_greedy_argument:\r
1478         xor     edx,edx\r
1479         call    extract_piece_of_line\r
1480     calm_argument_value_cut:\r
1481         xchg    esi,[calm_source_pointer]\r
1482         mov     ebx,[esi+CompiledMacroArgument.symbol_leaf]\r
1483         call    update_value_definition\r
1484         test    edx,edx\r
1485         jz      calm_argument_ok\r
1486         mov     ecx,edi\r
1487         sub     ecx,[assembly_workspace.memory_start]\r
1488         test    ecx,ecx\r
1489         jnz     calm_argument_value_ready\r
1490         or      ecx,[esi+CompiledMacroArgument.default_value_length]\r
1491         jz      calm_argument_value_ready\r
1492         cmp     ecx,-1\r
1493         je      missing_argument\r
1494         push    esi\r
1495         mov     esi,[esi+CompiledMacroArgument.default_value_offset]\r
1496         add     esi,[calm_literals]\r
1497         jmp     calm_assign_argument_value\r
1498     calm_argument_value_ready:\r
1499         push    esi\r
1500         mov     esi,[assembly_workspace.memory_start]\r
1501     calm_assign_argument_value:\r
1502         mov     [value_type],VALTYPE_SYMBOLIC\r
1503         call    assign_value\r
1504         pop     esi\r
1505     calm_argument_ok:\r
1506         add     esi,sizeof.CompiledMacroArgument\r
1507         mov     eax,[esi]\r
1508         inc     eax\r
1509         cmp     eax,1\r
1510         jbe     calm_arguments_defined\r
1511         xchg    esi,[calm_source_pointer]\r
1512         call    move_to_next_symbol\r
1513         jc      calm_next_argument\r
1514         cmp     al,','\r
1515         jne     invalid_argument\r
1516         inc     esi\r
1517     calm_next_argument:\r
1518         xchg    esi,[calm_source_pointer]\r
1519         jmp     get_calm_argument\r
1520     calm_arguments_defined:\r
1521         add     esi,4\r
1522         and     [calm_instruction_number],0\r
1523         call    create_source_entry\r
1524         jc      calm_exceeded_stack_limit\r
1525         mov     edx,[calm_value]\r
1526         mov     [ebx+SourceEntry.type],SOURCE_CALM\r
1527         mov     [ebx+SourceEntry.text],edx\r
1528         sub     esi,[edx+ValueDefinition.value]\r
1529         mov     [ebx+SourceEntry.offset],esi\r
1530         or      [edx+ValueDefinition.flags],VAL_IN_USE\r
1531         inc     [edx+ValueDefinition.reference_count]\r
1532         mov     eax,[parameter_namespace]\r
1533         mov     [ebx+SourceEntry.local_namespace],eax\r
1534         mov     esi,[calm_source_pointer]\r
1535         mov     ecx,[instruction_branch]\r
1536         test    ecx,ecx\r
1537         jz      instruction_assembled\r
1538         mov     [ebx+SourceEntry.name],ecx\r
1539         or      [ebx+SourceEntry.name_length],-1\r
1540         jmp     instruction_assembled\r
1541     calm_exceeded_stack_limit:\r
1542         mov     edx,_stack_limit_exceeded\r
1543         call    register_error\r
1544         jmp     assembly_line\r
1546 calm_virtual_machine:\r
1547         mov     al,[ebx+SourceEntry.saved_result]\r
1548         mov     [calm_result],al\r
1549         mov     edx,[ebx+SourceEntry.text]\r
1550         mov     [calm_value],edx\r
1551         mov     esi,[edx+ValueDefinition.value]\r
1552         mov     eax,[esi+CompiledMacroHeader.literals_offset]\r
1553         add     eax,esi\r
1554         mov     [calm_literals],eax\r
1555         add     esi,[ebx+SourceEntry.offset]\r
1556     calm_execution_unit:\r
1557         lodsd\r
1558         mov     [calm_instruction_number],eax\r
1559         lodsd\r
1560         jmp     eax\r
1562 calm_end:\r
1563         mov     ebx,[source_context]\r
1564         mov     ecx,[ebx+SourceContext.number_of_entries]\r
1565         dec     ecx\r
1566        ; jz      internal_error\r
1567         mov     [ebx+SourceContext.number_of_entries],ecx\r
1568         imul    ecx,sizeof.SourceEntry\r
1569         mov     edx,[ebx+sizeof.SourceContext+ecx+SourceEntry.text]\r
1570         and     [edx+ValueDefinition.flags],not VAL_IN_USE\r
1571         dec     [edx+ValueDefinition.reference_count]\r
1572         jmp     assembly_line\r
1574 calm_arrange:\r
1575         lodsd\r
1576         mov     [label_leaf],eax\r
1577         lodsd\r
1578         mov     ecx,eax\r
1579         lodsd\r
1580         push    esi\r
1581         mov     esi,[calm_literals]\r
1582         add     eax,esi\r
1583         add     esi,ecx\r
1584         mov     [pattern_end],eax\r
1585         mov     edi,[assembly_workspace.memory_start]\r
1586     arrange_by_pattern:\r
1587         mov     edx,assembly_workspace\r
1588         mov     ecx,[pattern_end]\r
1589         sub     ecx,esi\r
1590         call    reserve_workspace\r
1591     arrange_token:\r
1592         cmp     esi,[pattern_end]\r
1593         je      assign_arranged_value\r
1594         lodsb\r
1595         cmp     al,1Bh\r
1596         je      arrange_by_reference\r
1597         cmp     al,0A0h\r
1598         je      downgrade_hard_space\r
1599         stosb\r
1600         cmp     al,1Ah\r
1601         je      copy_arranged_token_data\r
1602         cmp     al,22h\r
1603         je      copy_arranged_token_data\r
1604         cmp     al,27h\r
1605         je      copy_arranged_token_data\r
1606         cmp     al,30h\r
1607         jne     arrange_token\r
1608         lodsd\r
1609         stosd\r
1610         mov     ecx,eax\r
1611         rep     movsb\r
1612         jmp     arrange_token\r
1613     copy_arranged_token_data:\r
1614         movsd\r
1615         jmp     arrange_token\r
1616     downgrade_hard_space:\r
1617         mov     al,20h\r
1618         stosb\r
1619         jmp     arrange_token\r
1620     arrange_by_reference:\r
1621         mov     ebx,[esi+4]\r
1622         call    use_available_value\r
1623         jc      arrange_missing_value\r
1624         mov     al,[edx+ValueDefinition.type]\r
1625         cmp     al,VALTYPE_NUMERIC\r
1626         je      arrange_numeric_value\r
1627         cmp     al,VALTYPE_SYMBOLIC\r
1628         jne     arrange_unsupported_value\r
1629         mov     ecx,[edx+ValueDefinition.value_length]\r
1630         jecxz   arrange_empty_value\r
1631         add     ecx,1+sizeof.RecognitionContext\r
1632         mov     ebx,edx\r
1633         mov     edx,assembly_workspace\r
1634         call    reserve_workspace\r
1635         mov     edx,ebx\r
1636         mov     ebx,esi\r
1637         mov     esi,[edx+ValueDefinition.value]\r
1638         mov     ecx,[edx+ValueDefinition.value_length]\r
1639         rep     movsb\r
1640         lea     esi,[ebx+8]\r
1641         cmp     esi,[pattern_end]\r
1642         je      assign_arranged_value\r
1643         mov     al,40h\r
1644         stosb\r
1645         xor     eax,eax\r
1646         assert  sizeof.RecognitionContext and 11b = 0\r
1647         mov     ecx,sizeof.RecognitionContext shr 2\r
1648         rep     stosd\r
1649         jmp     arrange_by_pattern\r
1650     arrange_numeric_value:\r
1651         mov     eax,[edx+ValueDefinition.value]\r
1652         mov     ecx,[eax]\r
1653         cmp     dword [eax+4+ecx],0\r
1654         jne     arrange_unsupported_value\r
1655         test    byte [eax+4+ecx-1],80h\r
1656         jnz     arrange_unsupported_value\r
1657         mov     ebx,esi\r
1658         mov     esi,eax\r
1659         mov     edx,assembly_workspace\r
1660         add     ecx,1+4\r
1661         call    reserve_workspace\r
1662         mov     al,30h\r
1663         stosb\r
1664         lodsd\r
1665         stosd\r
1666         mov     ecx,eax\r
1667         rep     movsb\r
1668         lea     esi,[ebx+8]\r
1669         jmp     arrange_by_pattern\r
1670     arrange_empty_value:\r
1671         add     esi,8\r
1672         jmp     arrange_token\r
1673     arrange_unsupported_value:\r
1674         mov     edx,_invalid_symbol_value\r
1675         jmp     arrange_failed_reference\r
1676     arrange_missing_value:\r
1677         mov     edx,_undefined_symbol\r
1678     arrange_failed_reference:\r
1679         call    register_error\r
1680         mov     al,1Ah\r
1681         stosb\r
1682         movsd\r
1683         lodsd\r
1684         mov     eax,[eax+SymbolTree_Leaf.branch]\r
1685         cmp     [eax+SymbolTree_Foliage.name_kind],NAME_CASEINSENSITIVE\r
1686         jne     arrange_token\r
1687         mov     al,'?'\r
1688         stosb\r
1689         jmp     arrange_token\r
1690     assign_arranged_value:\r
1691         mov     ebx,[label_leaf]\r
1692         call    update_value_definition\r
1693         test    edx,edx\r
1694         jz      arranged_value_assigned\r
1695         mov     [value_type],VALTYPE_SYMBOLIC\r
1696         mov     ecx,edi\r
1697         mov     esi,[assembly_workspace.memory_start]\r
1698         sub     ecx,esi\r
1699         call    assign_value\r
1700     arranged_value_assigned:\r
1701         pop     esi\r
1702         jmp     calm_execution_unit\r
1704 calm_match:\r
1705         and     [calm_result],0\r
1706         lodsd\r
1707         mov     ebx,eax\r
1708         lodsd\r
1709         mov     ecx,eax\r
1710         lodsd\r
1711         mov     edi,[calm_literals]\r
1712         add     eax,edi\r
1713         add     edi,ecx\r
1714         mov     [pattern_end],eax\r
1715         lodsd\r
1716         mov     [brackets],eax\r
1717         call    use_available_value\r
1718         jc      calm_undefined_symbol\r
1719         mov     al,[edx+ValueDefinition.type]\r
1720         cmp     al,VALTYPE_RESERVED\r
1721         je      calm_undefined_symbol\r
1722         cmp     al,VALTYPE_SYMBOLIC\r
1723         jne     calm_invalid_value\r
1724         push    esi\r
1725         mov     [value],edx\r
1726         inc     [edx+ValueDefinition.reference_count]\r
1727         mov     esi,[edx+ValueDefinition.value]\r
1728         mov     ecx,[edx+ValueDefinition.value_length]\r
1729         add     ecx,esi\r
1730         mov     [line_end],ecx\r
1731         mov     ebx,[expression_workspace.memory_start]\r
1732         and     [matched_context],0\r
1733         and     [stored_position],0\r
1734     calm_match_with_pattern:\r
1735         cmp     edi,[pattern_end]\r
1736         je      calm_end_of_pattern\r
1737         mov     ah,[edi]\r
1738         cmp     ah,1Bh\r
1739         jne     calm_exact_match\r
1740     calm_wildcard_match:\r
1741         and     [stored_position],0\r
1742         add     edi,1+8\r
1743         cmp     edi,[pattern_end]\r
1744         je      calm_required_wildcard_match\r
1745         cmp     byte [edi],'?'\r
1746         je      calm_optional_wildcard_match\r
1747     calm_required_wildcard_match:\r
1748         cmp     esi,[line_end]\r
1749         je      calm_match_done\r
1750         call    calm_consume_whitespace\r
1751         jz      calm_match_done\r
1752         xchg    edi,ebx\r
1753         mov     edx,expression_workspace\r
1754         mov     ecx,sizeof.MatchedExcerpt\r
1755         call    reserve_workspace\r
1756         xchg    edi,ebx\r
1757         mov     eax,[edi-4]\r
1758         mov     ecx,[matched_context]\r
1759         mov     [ebx+MatchedExcerpt.symbol_leaf],eax\r
1760         mov     [ebx+MatchedExcerpt.recognition_context],ecx\r
1761         mov     [ebx+MatchedExcerpt.data_start],esi\r
1762         mov     al,[esi]\r
1763         call    calm_consume_token\r
1764         jc      calm_match_done\r
1765         mov     [ebx+MatchedExcerpt.data_end],esi\r
1766         add     ebx,sizeof.MatchedExcerpt\r
1767         jmp     calm_match_with_pattern\r
1768     calm_optional_wildcard_match:\r
1769         xchg    edi,ebx\r
1770         mov     edx,expression_workspace\r
1771         mov     ecx,sizeof.MatchedExcerpt\r
1772         call    reserve_workspace\r
1773         xchg    edi,ebx\r
1774         mov     eax,[edi-4]\r
1775         inc     edi\r
1776         mov     ecx,[matched_context]\r
1777         mov     [ebx+MatchedExcerpt.symbol_leaf],eax\r
1778         mov     [ebx+MatchedExcerpt.recognition_context],ecx\r
1779         mov     [ebx+MatchedExcerpt.data_start],esi\r
1780         mov     [ebx+MatchedExcerpt.data_end],esi\r
1781         add     ebx,sizeof.MatchedExcerpt\r
1782         jmp     calm_match_with_pattern\r
1783     calm_exact_match:\r
1784         cmp     esi,[line_end]\r
1785         je      calm_end_of_text\r
1786         mov     al,[esi]\r
1787         cmp     al,40h\r
1788         jne     found_token_to_match\r
1789         inc     esi\r
1790         mov     [matched_context],esi\r
1791         add     esi,sizeof.RecognitionContext\r
1792         jmp     calm_exact_match\r
1793       found_token_to_match:\r
1794         cmp     [stored_position],0\r
1795         jne     calm_match_position_stored\r
1796         mov     [stored_position],esi\r
1797         mov     ecx,[matched_context]\r
1798         mov     [stored_context],ecx\r
1799         mov     [stored_pattern],edi\r
1800       calm_match_position_stored:\r
1801         cmp     al,20h\r
1802         je      calm_match_whitespace\r
1803         cmp     ah,20h\r
1804         je      calm_skip_pattern_whitespace\r
1805         cmpsb\r
1806         jne     calm_token_mismatch\r
1807         cmp     ah,1Ah\r
1808         je      calm_match_name_tokens\r
1809         cmp     ah,22h\r
1810         je      calm_match_string_tokens\r
1811         cmp     ah,27h\r
1812         je      calm_match_string_tokens\r
1813         cmp     ah,30h\r
1814         jne     calm_match_with_pattern\r
1815         mov     ecx,esi\r
1816         mov     edx,edi\r
1817         lodsd\r
1818         add     esi,eax\r
1819         mov     eax,[edi]\r
1820         lea     edi,[edi+4+eax]\r
1821         cmp     byte [edi],'?'\r
1822         jne     calm_compare_token_contents\r
1823         inc     edi\r
1824         jmp     calm_compare_token_contents\r
1825       calm_match_string_tokens:\r
1826         lodsd\r
1827         mov     ecx,eax\r
1828         mov     edx,[edi]\r
1829         add     edi,4\r
1830       calm_compare_token_contents:\r
1831         cmp     ecx,edx\r
1832         je      calm_match_with_pattern\r
1833         push    esi edi\r
1834         mov     esi,ecx\r
1835         mov     edi,edx\r
1836         mov     ecx,[esi]\r
1837         add     ecx,4\r
1838         repe    cmpsb\r
1839         pop     edi esi\r
1840         jne     calm_retract_match\r
1841         jmp     calm_match_with_pattern\r
1842       calm_match_name_tokens:\r
1843         lodsd\r
1844         mov     ecx,eax\r
1845         mov     edx,[edi]\r
1846         add     edi,4\r
1847         cmp     byte [edi],'?'\r
1848         je      calm_case_insensitive_match\r
1849         cmp     ecx,edx\r
1850         je      calm_match_with_pattern\r
1851         push    esi edi\r
1852         mov     esi,ecx\r
1853         mov     edi,edx\r
1854         lodsd\r
1855         scasd\r
1856         jne     calm_name_mismatch\r
1857         mov     ecx,eax\r
1858         mov     eax,[esi+ecx]\r
1859         cmp     eax,[edi+ecx]\r
1860         jne     calm_name_mismatch\r
1861         repe    cmpsb\r
1862         jne     calm_name_mismatch\r
1863         pop     edi esi\r
1864         jmp     calm_match_with_pattern\r
1865       calm_name_mismatch:\r
1866         pop     edi esi\r
1867         jmp     calm_retract_match\r
1868       calm_case_insensitive_match:\r
1869         inc     edi\r
1870         cmp     ecx,edx\r
1871         je      calm_match_with_pattern\r
1872         push    esi edi\r
1873         mov     esi,ecx\r
1874         mov     edi,edx\r
1875         lodsd\r
1876         scasd\r
1877         jne     calm_name_mismatch\r
1878         mov     ecx,eax\r
1879         mov     eax,[esi+ecx+4]\r
1880         cmp     eax,[edi+ecx+4]\r
1881         jne     calm_name_mismatch\r
1882         xor     eax,eax\r
1883       calm_compare_case_insensitively:\r
1884         lodsb\r
1885         mov     dl,[characters+eax]\r
1886         mov     al,[edi]\r
1887         inc     edi\r
1888         cmp     dl,[characters+eax]\r
1889         jne     name_mismatch\r
1890         loop    calm_compare_case_insensitively\r
1891         pop     edi esi\r
1892         jmp     calm_match_with_pattern\r
1893       calm_match_converted_number:\r
1894         call    convert_number_to_match\r
1895         jmp     calm_compare_token_contents\r
1896       calm_match_with_converted_number:\r
1897         xchg    esi,edi\r
1898         call    convert_number_to_match\r
1899         xchg    esi,edi\r
1900         jmp     calm_compare_token_contents\r
1901       calm_match_whitespace:\r
1902         cmp     ah,20h\r
1903         je      calm_optional_whitespace\r
1904         cmp     ah,0A0h\r
1905         je      calm_required_whitespace\r
1906         cmp     [stored_pattern],edi\r
1907         jne     calm_retract_match\r
1908         call    calm_consume_whitespace\r
1909         jz      calm_match_done\r
1910         and     [stored_position],0\r
1911         jmp     calm_match_with_pattern\r
1912       calm_optional_whitespace:\r
1913         inc     edi\r
1914         cmp     edi,[pattern_end]\r
1915         je      calm_whitespace_matched\r
1916         cmp     byte [edi],0A0h\r
1917         jne     calm_whitespace_matched\r
1918       calm_required_whitespace:\r
1919         inc     edi\r
1920         cmp     edi,[pattern_end]\r
1921         je      calm_whitespace_matched\r
1922         cmp     byte [edi],20h\r
1923         jne     calm_whitespace_matched\r
1924         inc     edi\r
1925       calm_whitespace_matched:\r
1926         call    calm_consume_whitespace\r
1927         jz      calm_end_of_text\r
1928         jmp     calm_match_with_pattern\r
1929       calm_skip_pattern_whitespace:\r
1930         inc     edi\r
1931         jmp     calm_match_with_pattern\r
1932       calm_token_mismatch:\r
1933         cmp     ax,1A30h\r
1934         je      calm_match_converted_number\r
1935         cmp     ax,301Ah\r
1936         je      calm_match_with_converted_number\r
1937     calm_retract_match:\r
1938         xor     esi,esi\r
1939         xchg    esi,[stored_position]\r
1940         mov     ecx,[stored_context]\r
1941         mov     [matched_context],ecx\r
1942         mov     edi,[stored_pattern]\r
1943         call    calm_consume_whitespace\r
1944         jz      calm_match_done\r
1945     calm_expand_wildcard_match:\r
1946         cmp     ebx,[expression_workspace.memory_start]\r
1947         je      calm_match_done\r
1948         call    calm_consume_token\r
1949         jc      calm_match_done\r
1950         mov     [ebx-sizeof.MatchedExcerpt+MatchedExcerpt.data_end],esi\r
1951         jmp     calm_match_with_pattern\r
1952     calm_consume_whitespace:\r
1953         mov     al,[esi]\r
1954         cmp     al,40h\r
1955         je      calm_consume_context_token\r
1956         cmp     al,20h\r
1957         jne     calm_whitespace_consumed\r
1958         inc     esi\r
1959         cmp     esi,[line_end]\r
1960         jne     calm_consume_whitespace\r
1961       calm_whitespace_consumed:\r
1962         retn\r
1963       calm_consume_context_token:\r
1964         inc     esi\r
1965         mov     [matched_context],esi\r
1966         add     esi,sizeof.RecognitionContext\r
1967         cmp     esi,[line_end]\r
1968         jne     calm_consume_whitespace\r
1969         retn\r
1970     calm_consume_token:\r
1971         xor     ecx,ecx\r
1972         mov     edx,[brackets]\r
1973         inc     esi\r
1974       consume_token_content:\r
1975         cmp     al,dh\r
1976         je      consume_closing\r
1977         cmp     al,dl\r
1978         je      consume_opening\r
1979         cmp     al,1Ah\r
1980         je      consume_token_with_data\r
1981         cmp     al,22h\r
1982         je      consume_token_with_data\r
1983         cmp     al,27h\r
1984         je      consume_token_with_data\r
1985         cmp     al,30h\r
1986         je      consume_internal_token\r
1987         cmp     al,40h\r
1988         je      consume_context_token\r
1989         test    ecx,ecx\r
1990         jnz     consume_more\r
1991         retn\r
1992       consume_token_with_data:\r
1993         add     esi,4\r
1994         test    ecx,ecx\r
1995         jnz     consume_more\r
1996         retn\r
1997       consume_internal_token:\r
1998         lodsd\r
1999         add     esi,eax\r
2000         test    ecx,ecx\r
2001         jnz     consume_more\r
2002         retn\r
2003       consume_context_token:\r
2004         add     esi,sizeof.RecognitionContext\r
2005         test    ecx,ecx\r
2006         jnz     consume_more\r
2007         retn\r
2008       consume_closing:\r
2009         sub     ecx,1\r
2010         jg      consume_more\r
2011         retn\r
2012       consume_opening:\r
2013         inc     ecx\r
2014       consume_more:\r
2015         cmp     esi,[line_end]\r
2016         je      consume_unsatisfied\r
2017         lodsb\r
2018         jmp     consume_token_content\r
2019       consume_unsatisfied:\r
2020         stc\r
2021         retn\r
2022     calm_end_of_pattern:\r
2023         cmp     esi,[line_end]\r
2024         je      calm_match_found\r
2025         lodsb\r
2026         cmp     al,20h\r
2027         je      calm_end_of_pattern\r
2028         cmp     al,40h\r
2029         jne     calm_another_token_to_match\r
2030         add     esi,sizeof.RecognitionContext\r
2031         jmp     calm_end_of_pattern\r
2032       calm_another_token_to_match:\r
2033         dec     esi\r
2034         cmp     [stored_position],0\r
2035         je      calm_expand_wildcard_match\r
2036         jmp     calm_retract_match\r
2037     calm_end_of_text:\r
2038         cmp     edi,[pattern_end]\r
2039         je      calm_match_found\r
2040         mov     ah,[edi]\r
2041         cmp     ah,1Bh\r
2042         je      calm_wildcard_match\r
2043         cmp     ah,20h\r
2044         jne     calm_match_done\r
2045         inc     edi\r
2046         jmp     calm_end_of_text\r
2047     calm_match_found:\r
2048         or      [calm_result],1\r
2049         mov     esi,ebx\r
2050         mov     [value_type],VALTYPE_SYMBOLIC\r
2051       calm_assign_matched_values:\r
2052         cmp     esi,[expression_workspace.memory_start]\r
2053         je      calm_match_done\r
2054         sub     esi,sizeof.MatchedExcerpt\r
2055         mov     ebx,[esi+MatchedExcerpt.symbol_leaf]\r
2056         call    update_value_definition\r
2057         test    edx,edx\r
2058         jz      calm_assign_matched_values\r
2059         push    esi\r
2060         mov     eax,[esi+MatchedExcerpt.recognition_context]\r
2061         mov     ecx,[esi+MatchedExcerpt.data_end]\r
2062         mov     esi,[esi+MatchedExcerpt.data_start]\r
2063         sub     ecx,esi\r
2064         jz      calm_matched_value_ready\r
2065         test    eax,eax\r
2066         jz      calm_matched_value_ready\r
2067         cmp     dword [eax],0\r
2068         je      calm_matched_value_ready\r
2069         push    esi ecx edx\r
2070         mov     esi,eax\r
2071         mov     edx,assembly_workspace\r
2072         mov     edi,[edx+Workspace.memory_start]\r
2073         add     ecx,1+sizeof.RecognitionContext\r
2074         call    reserve_workspace\r
2075         mov     al,40h\r
2076         stosb\r
2077         assert  sizeof.RecognitionContext and 11b = 0\r
2078         mov     ecx,sizeof.RecognitionContext shr 2\r
2079         rep     movsd\r
2080         pop     edx ecx esi\r
2081         rep     movsb\r
2082         mov     ecx,edi\r
2083         mov     esi,[assembly_workspace.memory_start]\r
2084         sub     ecx,esi\r
2085       calm_matched_value_ready:\r
2086         call    assign_value\r
2087         pop     esi\r
2088         jmp     calm_assign_matched_values\r
2089     calm_match_done:\r
2090         mov     edx,[value]\r
2091         dec     [edx+ValueDefinition.reference_count]\r
2092         pop     esi\r
2093         jmp     calm_execution_unit\r
2095 calm_compute:\r
2096         lodsd\r
2097         mov     [label_leaf],eax\r
2098         lodsd\r
2099         add     eax,esi\r
2100         push    eax\r
2101         mov     edi,[calculation_workspace.memory_start]\r
2102         and     [value_position],0\r
2103         call    calculate_parsed_expression\r
2104         call    pop_terms\r
2105         jc      calm_compute_done\r
2106         mov     al,byte [edi+ExpressionTerm.attributes]\r
2107         cmp     al,EXPR_STRING\r
2108         je      calm_computed_string\r
2109         cmp     al,EXPR_FLOAT\r
2110         je      calm_computed_float\r
2111         call    convert_terms_to_numeric_value\r
2112         mov     [value_type],VALTYPE_NUMERIC\r
2113     calm_computed_value_ready:\r
2114         mov     edi,ecx\r
2115         mov     ebx,[label_leaf]\r
2116         call    update_value_definition\r
2117         test    edx,edx\r
2118         jz      calm_compute_done\r
2119         mov     ecx,edi\r
2120         call    assign_value\r
2121     calm_compute_done:\r
2122         pop     esi\r
2123         jmp     calm_execution_unit\r
2124     calm_computed_string:\r
2125         call    get_term_value\r
2126         mov     esi,edx\r
2127         mov     ecx,[esi]\r
2128         add     ecx,4\r
2129         mov     [value_type],VALTYPE_STRING\r
2130         jmp     calm_computed_value_ready\r
2131     calm_computed_float:\r
2132         call    get_term_value\r
2133         mov     esi,edx\r
2134         mov     ecx,sizeof.FloatData\r
2135         mov     [value_type],VALTYPE_FLOAT\r
2136         jmp     calm_computed_value_ready\r
2138 calm_check:\r
2139         lodsd\r
2140         test    eax,eax\r
2141         jz      calm_execution_unit\r
2142         js      calm_check\r
2143     calm_evaluate_logical_value:\r
2144         call    evaluate_stored_logical_value\r
2145         mov     [calm_result],al\r
2146         add     esi,[esi-4]\r
2147     find_next_logical_value:\r
2148         lodsd\r
2149         test    eax,eax\r
2150         jz      calm_execution_unit\r
2151         jns     next_logical_value_found\r
2152         cmp     eax,BOOL_NEG\r
2153         jne     find_next_logical_value\r
2154         xor     [calm_result],1\r
2155         jmp     find_next_logical_value\r
2156     next_logical_value_found:\r
2157         mov     ebx,esi\r
2158         xor     ecx,ecx\r
2159     skip_next_logical_value:\r
2160         inc     ecx\r
2161         add     esi,eax\r
2162     skip_logical_operator:\r
2163         lodsd\r
2164         assert  BOOL_NEG = -1\r
2165         cmp     eax,BOOL_NEG\r
2166         jg      skip_next_logical_value\r
2167         je      skip_logical_operator\r
2168         dec     ecx\r
2169         jnz     skip_logical_operator\r
2170         cmp     eax,BOOL_AND\r
2171         je      calm_and\r
2172     calm_or:\r
2173         cmp     [calm_result],0\r
2174         jne     find_next_logical_value\r
2175         mov     esi,ebx\r
2176         jmp     calm_evaluate_logical_value\r
2177     calm_and:\r
2178         cmp     [calm_result],0\r
2179         je      find_next_logical_value\r
2180         mov     esi,ebx\r
2181         jmp     calm_evaluate_logical_value\r
2183 calm_jyes:\r
2184         cmp     [calm_result],0\r
2185         jne     calm_jump\r
2186         add     esi,4\r
2187         jmp     calm_execution_unit\r
2188 calm_jno:\r
2189         cmp     [calm_result],0\r
2190         je      calm_jump\r
2191         add     esi,4\r
2192         jmp     calm_execution_unit\r
2193 calm_jump:\r
2194         lodsd\r
2195         mov     edx,[calm_value]\r
2196         add     eax,[edx+ValueDefinition.value]\r
2197         mov     esi,eax\r
2198         jmp     calm_execution_unit\r
2200 calm_assemble:\r
2201         lodsd\r
2202         mov     ebx,eax\r
2203         mov     eax,[current_pass]\r
2204         mov     [ebx+SymbolTree_Leaf.last_use_pass],eax\r
2205         mov     eax,[ebx+SymbolTree_Leaf.branch]\r
2206         mov     [instruction_branch],eax\r
2207         call    use_available_value\r
2208         jc      calm_undefined_symbol\r
2209         mov     al,[edx+ValueDefinition.type]\r
2210         cmp     al,VALTYPE_SYMBOLIC\r
2211         jne     calm_invalid_value\r
2212         call    create_source_entry\r
2213         jc      calm_assemble_exceeded_stack_limit\r
2214         mov     [ebx+SourceEntry.type],SOURCE_MACRO\r
2215         or      [ebx+SourceEntry.flags],SRCF_PREPROCESSED\r
2216         mov     [ebx+SourceEntry.text],edx\r
2217         or      [edx+ValueDefinition.flags],VAL_IN_USE\r
2218         inc     [edx+ValueDefinition.reference_count]\r
2219         mov     eax,[calm_instruction_number]\r
2220         mov     [ebx-sizeof.SourceEntry+SourceEntry.line_number],eax\r
2221         mov     edx,[ebx-sizeof.SourceEntry+SourceEntry.text]\r
2222         mov     ecx,[edx+ValueDefinition.value]\r
2223         sub     esi,ecx\r
2224         mov     [ebx-sizeof.SourceEntry+SourceEntry.offset],esi\r
2225         mov     eax,[ebx-sizeof.SourceEntry+SourceEntry.local_namespace]\r
2226         mov     [ebx+SourceEntry.local_namespace],eax\r
2227         mov     al,[calm_result]\r
2228         mov     [ebx-sizeof.SourceEntry+SourceEntry.saved_result],al\r
2229         mov     ecx,[instruction_branch]\r
2230         test    ecx,ecx\r
2231         jz      assembly_line\r
2232         mov     [ebx+SourceEntry.name],ecx\r
2233         or      [ebx+SourceEntry.name_length],-1\r
2234         jmp     assembly_line\r
2235     calm_undefined_symbol:\r
2236         mov     edx,_undefined_symbol\r
2237         jmp     calm_execution_error\r
2238     calm_invalid_value:\r
2239         mov     edx,_invalid_symbol_value\r
2240         jmp     calm_execution_error\r
2241     calm_assemble_exceeded_stack_limit:\r
2242         mov     edx,_stack_limit_exceeded\r
2243     calm_execution_error:\r
2244         call    register_error\r
2245         jmp     calm_execution_unit\r
2247 calm_transform:\r
2248         mov     [calm_result],0\r
2249         lodsd\r
2250         mov     [label_leaf],eax\r
2251         mov     ebx,eax\r
2252         lodsd\r
2253         mov     [transforming_namespace],eax\r
2254         call    get_available_value\r
2255         jc      calm_undefined_symbol\r
2256         cmp     [edx+ValueDefinition.type],VALTYPE_SYMBOLIC\r
2257         jne     calm_invalid_value\r
2258         push    esi\r
2259         call    clear_line_embeddings\r
2260         mov     esi,[edx+ValueDefinition.value]\r
2261         mov     [line_start],esi\r
2262         xor     eax,eax\r
2263         mov     [embedded_context],eax\r
2264         mov     [line_context],eax\r
2265         mov     ecx,[edx+ValueDefinition.value_length]\r
2266         add     ecx,esi\r
2267         mov     [line_end],ecx\r
2268         mov     edi,[assembly_workspace.memory_start]\r
2269         mov     [hidden_context],0\r
2270     transform_symbolic_value:\r
2271         and     [symbol_definition],0\r
2272         mov     dl,SYMCLASS_EXPRESSION\r
2273         push    edi\r
2274         mov     eax,[embedded_context]\r
2275         mov     [line_context],eax\r
2276         mov     ebx,[transforming_namespace]\r
2277         test    ebx,ebx\r
2278         jz      transform_identify\r
2279         call    identify_symbol_in_namespace\r
2280         jmp     transform_identification_done\r
2281     transform_identify:\r
2282         call    identify_symbol\r
2283     transform_identification_done:\r
2284         jc      symbolic_value_transformed\r
2285         test    edi,edi\r
2286         jnz     ready_to_transform\r
2287         call    skip_literal\r
2288         xor     ebx,ebx\r
2289     ready_to_transform:\r
2290         pop     edi\r
2291         test    ebx,ebx\r
2292         jz      untransformed_literal\r
2293         mov     [further_whitespace],ecx\r
2294         call    get_available_value\r
2295         jc      untransformed_literal\r
2296         cmp     [edx+ValueDefinition.type],VALTYPE_SYMBOLIC\r
2297         jne     untransformed_literal\r
2298         mov     eax,[current_pass]\r
2299         mov     [ebx+SymbolTree_Leaf.last_use_pass],eax\r
2300         mov     [calm_result],1\r
2301         mov     [line_start],esi\r
2302         mov     esi,[edx+ValueDefinition.value]\r
2303         mov     ecx,[edx+ValueDefinition.value_length]\r
2304         mov     ebx,ecx\r
2305         add     ecx,[further_whitespace]\r
2306         add     ecx,1+sizeof.RecognitionContext\r
2307         mov     edx,assembly_workspace\r
2308         call    reserve_workspace\r
2309         test    ebx,ebx\r
2310         jz      symbol_transformed\r
2311         mov     al,1\r
2312         xchg    al,[hidden_context]\r
2313         test    al,al\r
2314         jnz     reset_hidden_context\r
2315         cmp     [line_context],0\r
2316         je      copy_transformed_value\r
2317     reset_hidden_context:\r
2318         xor     edx,edx\r
2319         call    reset_transformed_context\r
2320     copy_transformed_value:\r
2321         mov     ecx,ebx\r
2322         rep     movsb\r
2323     symbol_transformed:\r
2324         mov     ecx,[further_whitespace]\r
2325         mov     al,20h\r
2326         rep     stosb\r
2327         mov     esi,[line_start]\r
2328         jmp     transform_symbolic_value\r
2329     untransformed_literal:\r
2330         mov     ecx,esi\r
2331         xchg    esi,[line_start]\r
2332         sub     ecx,esi\r
2333         mov     ebx,ecx\r
2334         add     ecx,1+sizeof.RecognitionContext\r
2335         mov     edx,assembly_workspace\r
2336         call    reserve_workspace\r
2337         xor     al,al\r
2338         xchg    al,[hidden_context]\r
2339         test    al,al\r
2340         jz      copy_untransformed_literal\r
2341         mov     edx,[line_context]\r
2342         call    reset_transformed_context\r
2343     copy_untransformed_literal:\r
2344         mov     ecx,ebx\r
2345         rep     movsb\r
2346         jmp     transform_symbolic_value\r
2347     reset_transformed_context:\r
2348         mov     al,40h\r
2349         cmp     [esi],al\r
2350         je      transformed_context_ok\r
2351         stosb\r
2352         assert  sizeof.RecognitionContext and 11b = 0\r
2353         mov     ecx,sizeof.RecognitionContext shr 2\r
2354         test    edx,edx\r
2355         jz      clear_transformed_context\r
2356         xchg    esi,edx\r
2357         rep     movsd\r
2358         mov     esi,edx\r
2359       transformed_context_ok:\r
2360         retn\r
2361       clear_transformed_context:\r
2362         xor     eax,eax\r
2363         rep     stosd\r
2364         retn\r
2365     symbolic_value_transformed:\r
2366         pop     edi\r
2367         cmp     [calm_result],0\r
2368         je      calm_transform_done\r
2369         mov     ebx,[label_leaf]\r
2370         call    update_value_definition\r
2371         test    edx,edx\r
2372         jz      calm_transform_done\r
2373         mov     esi,[assembly_workspace.memory_start]\r
2374         mov     ecx,edi\r
2375         sub     ecx,esi\r
2376         mov     [value_type],VALTYPE_SYMBOLIC\r
2377         call    assign_value\r
2378     calm_transform_done:\r
2379         pop     esi\r
2380         jmp     calm_execution_unit\r
2382 calm_stringify:\r
2383         lodsd\r
2384         mov     [label_leaf],eax\r
2385         mov     ebx,eax\r
2386         call    get_available_value\r
2387         jc      calm_undefined_symbol\r
2388         mov     al,[edx+ValueDefinition.type]\r
2389         cmp     al,VALTYPE_SYMBOLIC\r
2390         jne     calm_invalid_value\r
2391         mov     eax,[edx+ValueDefinition.value]\r
2392         mov     [symbol_value_start],eax\r
2393         mov     ecx,[edx+ValueDefinition.value_length]\r
2394         add     ecx,eax\r
2395         mov     [symbol_value_end],ecx\r
2396         push    esi\r
2397         call    convert_symbolic_value_to_string\r
2398         mov     edi,ecx\r
2399         mov     ebx,[label_leaf]\r
2400         call    update_value_definition\r
2401         test    edx,edx\r
2402         jz      calm_stringify_done\r
2403         mov     ecx,edi\r
2404         mov     [value_type],VALTYPE_STRING\r
2405         call    assign_value\r
2406     calm_stringify_done:\r
2407         pop     esi\r
2408         jmp     calm_execution_unit\r
2410 calm_publish_constant:\r
2411         mov     edi,create_constant_value_definition\r
2412         jmp     calm_publish\r
2413 calm_publish_stack:\r
2414         mov     edi,create_value_definition\r
2415         jmp     calm_publish\r
2416 calm_publish_variable:\r
2417         mov     edi,update_value_definition\r
2418     calm_publish:\r
2419         lodsd\r
2420         mov     ebx,eax\r
2421         lodsd\r
2422         mov     [label_leaf],eax\r
2423         call    use_available_value\r
2424         jc      calm_undefined_symbol\r
2425         mov     al,[edx+ValueDefinition.type]\r
2426         cmp     al,VALTYPE_SYMBOLIC\r
2427         jne     calm_invalid_value\r
2428         push    esi edi\r
2429         call    clear_line_embeddings\r
2430         mov     esi,[edx+ValueDefinition.value]\r
2431         mov     [line_start],esi\r
2432         mov     ecx,[edx+ValueDefinition.value_length]\r
2433         add     ecx,esi\r
2434         mov     [line_end],ecx\r
2435         and     [symbol_definition],0\r
2436         mov     dl,SYMCLASS_EXPRESSION\r
2437         call    identify_symbol\r
2438         mov     eax,esi\r
2439         pop     edi esi\r
2440         jc      calm_invalid_identifier\r
2441         test    ebx,ebx\r
2442         jz      calm_invalid_identifier\r
2443         cmp     eax,[line_end]\r
2444         jne     calm_invalid_identifier\r
2445         xchg    ebx,[label_leaf]\r
2446         call    use_available_value\r
2447         jc      calm_undefined_symbol\r
2448         mov     al,[edx+ValueDefinition.type]\r
2449         cmp     al,VALTYPE_SYMBOLIC\r
2450         jb      calm_invalid_value\r
2451         cmp     al,VALTYPE_AREA\r
2452         ja      calm_invalid_value\r
2453         mov     [value_type],al\r
2454         mov     [value],edx\r
2455         mov     ebx,[label_leaf]\r
2456         call    edi\r
2457         test    edx,edx\r
2458         jz      calm_execution_unit\r
2459         push    esi\r
2460         mov     eax,[value]\r
2461         mov     esi,[eax+ValueDefinition.value]\r
2462         mov     ecx,[eax+ValueDefinition.value_length]\r
2463         call    assign_value\r
2464         pop     esi\r
2465         jmp     calm_execution_unit\r
2466     calm_invalid_identifier:\r
2467         mov     edx,_invalid_identifier\r
2468         call    register_error\r
2469         jmp     calm_execution_unit\r
2471 calm_take:\r
2472         lodsd\r
2473         mov     edi,eax\r
2474         lodsd\r
2475         mov     ebx,eax\r
2476         xor     edx,edx\r
2477         call    remove_value_definition\r
2478         setnc   [calm_result]\r
2479         jmp     calm_execution_unit\r
2481 calm_call:\r
2482         lodsd\r
2483         mov     ebx,eax\r
2484         mov     eax,[current_pass]\r
2485         mov     [ebx+SymbolTree_Leaf.last_use_pass],eax\r
2486         mov     eax,[ebx+SymbolTree_Leaf.branch]\r
2487         mov     [instruction_branch],eax\r
2488         call    use_available_value\r
2489         jc      calm_call_undefined\r
2490         mov     al,[edx+ValueDefinition.type]\r
2491         cmp     al,VALTYPE_CALM\r
2492         jne     calm_call_invalid\r
2493         call    create_source_entry\r
2494         jc      calm_call_exceeded_stack_limit\r
2495         mov     eax,[parameter_namespace]\r
2496         mov     [ebx+SourceEntry.local_namespace],eax\r
2497         mov     ecx,[instruction_branch]\r
2498         test    ecx,ecx\r
2499         jz      called_name_ok\r
2500         mov     [ebx+SourceEntry.name],ecx\r
2501         or      [ebx+SourceEntry.name_length],-1\r
2502      called_name_ok:\r
2503         mov     [ebx+SourceEntry.type],SOURCE_CALM\r
2504         mov     [ebx+SourceEntry.text],edx\r
2505         or      [edx+ValueDefinition.flags],VAL_IN_USE\r
2506         inc     [edx+ValueDefinition.reference_count]\r
2507         mov     edi,esi\r
2508         mov     esi,[edx+ValueDefinition.value]\r
2509         mov     eax,[esi+CompiledMacroHeader.literals_offset]\r
2510         add     eax,esi\r
2511         mov     [calm_value],edx\r
2512         mov     [calm_literals],eax\r
2513         add     esi,sizeof.CompiledMacroHeader\r
2514         push    ebx\r
2515      process_call_arguments:\r
2516         mov     eax,[esi]\r
2517         inc     eax\r
2518         cmp     eax,1\r
2519         jbe     call_arguments_ready\r
2520         mov     ebx,[edi]\r
2521         test    ebx,ebx\r
2522         jz      omitted_call_argument\r
2523         add     edi,4\r
2524         cmp     ebx,-1\r
2525         je      omitted_call_argument\r
2526         call    use_available_value\r
2527         jc      missing_argument_value\r
2528         push    edx\r
2529         mov     ebx,[esi+CompiledMacroArgument.symbol_leaf]\r
2530         call    update_value_definition\r
2531         pop     eax\r
2532         push    esi edi\r
2533         mov     esi,[eax+ValueDefinition.value]\r
2534         mov     ecx,[eax+ValueDefinition.value_length]\r
2535         mov     al,[eax+ValueDefinition.type]\r
2536       assign_call_argument:\r
2537         test    edx,edx\r
2538         jz      call_argument_assigned\r
2539         mov     [value_type],al\r
2540         call    assign_value\r
2541       call_argument_assigned:\r
2542         pop     edi esi\r
2543       next_call_argument:\r
2544         add     esi,sizeof.CompiledMacroArgument\r
2545         jmp     process_call_arguments\r
2546       missing_argument_value:\r
2547         mov     edx,_undefined_symbol\r
2548         call    register_error\r
2549         jmp     next_call_argument\r
2550       omitted_call_argument:\r
2551         mov     ebx,[esi+CompiledMacroArgument.symbol_leaf]\r
2552         call    update_value_definition\r
2553         push    esi edi\r
2554         mov     ecx,[esi+CompiledMacroArgument.default_value_length]\r
2555         mov     esi,[esi+CompiledMacroArgument.default_value_offset]\r
2556         add     esi,[calm_literals]\r
2557         mov     al,VALTYPE_SYMBOLIC\r
2558         cmp     ecx,-1\r
2559         jne     assign_call_argument\r
2560         inc     ecx\r
2561         push    edx\r
2562         mov     edx,_invalid_argument\r
2563         call    register_error\r
2564         pop     edx\r
2565         jmp     assign_call_argument\r
2566      call_arguments_ready:\r
2567         add     esi,4\r
2568         mov     eax,[edi]\r
2569         add     edi,4\r
2570         test    eax,eax\r
2571         jz      call_arguments_ok\r
2572         mov     edx,_invalid_argument\r
2573         call    register_error\r
2574        skip_excess_arguments:\r
2575         mov     eax,[edi]\r
2576         add     edi,4\r
2577         test    eax,eax\r
2578         jnz     skip_excess_arguments\r
2579      call_arguments_ok:\r
2580         pop     ebx\r
2581         mov     eax,[calm_instruction_number]\r
2582         mov     [ebx-sizeof.SourceEntry+SourceEntry.line_number],eax\r
2583         mov     eax,[ebx-sizeof.SourceEntry+SourceEntry.text]\r
2584         mov     ecx,[eax+ValueDefinition.value]\r
2585         sub     edi,ecx\r
2586         mov     [ebx-sizeof.SourceEntry+SourceEntry.offset],edi\r
2587         mov     al,[calm_result]\r
2588         mov     [ebx-sizeof.SourceEntry+SourceEntry.saved_result],al\r
2589         jmp     calm_execution_unit\r
2590      calm_call_undefined:\r
2591         mov     edx,_undefined_symbol\r
2592         jmp     calm_call_error\r
2593      calm_call_invalid:\r
2594         mov     edx,_invalid_symbol_value\r
2595         jmp     calm_call_error\r
2596      calm_call_exceeded_stack_limit:\r
2597         mov     edx,_stack_limit_exceeded\r
2598      calm_call_error:\r
2599         call    register_error\r
2600        skip_call_arguments:\r
2601         lodsd\r
2602         test    eax,eax\r
2603         jnz     skip_call_arguments\r
2604         jmp     calm_execution_unit