initial commit: a mess of assembly code
[fmap.git] / x86_64_sse2_x87 / fasm / source / console.inc
blobeb1ebeab030d5526a90780e41d475fce4790581b
1 \r
2 show_display_data:\r
3         test    [trace_mode],TRACE_DISPLAY\r
4         jnz     display_line_feed\r
5         mov     ecx,[display_data_length]\r
6         jecxz   display_data_shown\r
7         mov     esi,[display_buffer]\r
8         call    display_string\r
9       display_line_feed:\r
10         mov     esi,_new_line\r
11         xor     ecx,ecx\r
12         call    display_string\r
13       display_data_shown:\r
14         retn\r
16 show_errors:\r
17         mov     esi,[first_error]\r
18     display_error:\r
19         test    esi,esi\r
20         jz      display_data_shown\r
21         push    esi\r
22         mov     eax,[esi+sizeof.Error+SourceContext.number_of_entries]\r
23         test    eax,eax\r
24         jz      show_error_message\r
25         lea     ebx,[esi+sizeof.Error+sizeof.SourceContext]\r
26         dec     eax\r
27         imul    eax,sizeof.SourceEntry\r
28         lea     eax,[ebx+eax]\r
29         mov     [last_source_entry],eax\r
30         test    [trace_mode],TRACE_ERROR_STACK\r
31         jnz     show_source_context\r
32         and     [last_file_source_entry],0\r
33     find_last_file_entry:\r
34         cmp     [eax+SourceEntry.type],SOURCE_FILE\r
35         je      last_file_entry_found\r
36         cmp     eax,ebx\r
37         je      show_source_context\r
38         sub     eax,sizeof.SourceEntry\r
39         jmp     find_last_file_entry\r
40     last_file_entry_found:\r
41         mov     [last_file_source_entry],eax\r
42     show_source_context:\r
43         push    ebx\r
44         cmp     [ebx+SourceEntry.type],SOURCE_MEMORY\r
45         je      display_memory_source\r
46         cmp     [ebx+SourceEntry.type],SOURCE_MACRO\r
47         jne     display_source_name\r
48         mov     esi,_macro_source\r
49         test    [ebx+SourceEntry.flags],SRCF_PREPROCESSED\r
50         jz      display_source_type\r
51         mov     esi,_preprocessed_source\r
52       display_source_type:\r
53         xor     ecx,ecx\r
54         call    display_error_string\r
55       display_source_name:\r
56         mov     esi,[ebx+SourceEntry.name]\r
57         test    esi,esi\r
58         jz      unnamed_source\r
59         mov     ecx,[ebx+SourceEntry.name_length]\r
60         cmp     ecx,-1\r
61         je      display_source_symbol\r
62         call    display_error_string\r
63         jmp     display_line_number\r
64       display_source_symbol:\r
65         xchg    ebx,esi\r
66         call    show_symbol_name\r
67         mov     ebx,esi\r
68         jmp     display_line_number\r
69       unnamed_source:\r
70         mov     esi,_unnamed_source\r
71         xor     ecx,ecx\r
72         call    display_error_string\r
73         jmp     display_line_number\r
74       display_memory_source:\r
75         mov     esi,_memory_source\r
76         xor     ecx,ecx\r
77         call    display_error_string\r
78       display_line_number:\r
79         mov     esi,_line_number_prefix\r
80         xor     ecx,ecx\r
81         call    display_error_string\r
82         mov     eax,[ebx+SourceEntry.line_number]\r
83         xor     edx,edx\r
84         call    itoa\r
85         call    display_error_string\r
86         mov     esi,_line_number_suffix\r
87         xor     ecx,ecx\r
88         call    display_error_string\r
89         pop     ebx\r
90         mov     esi,[esp]\r
91         push    ebx\r
92         cmp     [ebx+SourceEntry.line_number],0\r
93         je      skip_line_content\r
94         test    [trace_mode],TRACE_ERROR_STACK\r
95         jnz     show_source_line\r
96         cmp     ebx,[last_source_entry]\r
97         je      last_source_entry_line_content\r
98         cmp     ebx,[last_file_source_entry]\r
99         je      show_source_line\r
100       skip_line_content:\r
101         mov     esi,_space\r
102       next_source_entry:\r
103         pop     ebx\r
104       find_next_source_entry:\r
105         cmp     ebx,[last_source_entry]\r
106         je      source_context_shown\r
107         add     ebx,sizeof.SourceEntry\r
108         test    [trace_mode],TRACE_ERROR_STACK\r
109         jnz     show_source_entry\r
110         test    [ebx+SourceEntry.flags],SRCF_PREPROCESSED\r
111         jnz     find_next_source_entry\r
112       show_source_entry:\r
113         xor     ecx,ecx\r
114         call    display_error_string\r
115         jmp     show_source_context\r
116       last_source_entry_line_content:\r
117         test    [esi+Error.flags],ERR_CUSTOM\r
118         jnz     skip_line_content\r
119       show_source_line:\r
120         cmp     [ebx+SourceEntry.type],SOURCE_CALM\r
121         je      show_calm_source\r
122         mov     esi,_line_content_prefix\r
123         xor     ecx,ecx\r
124         call    display_error_string\r
125         call    show_line_content\r
126         mov     esi,_new_line\r
127         jmp     next_source_entry\r
128       show_calm_source:\r
129         mov     esi,_calm_source\r
130         xor     ecx,ecx\r
131         call    display_error_string\r
132         mov     esi,_new_line\r
133         jmp     next_source_entry\r
134       source_context_shown:\r
135         mov     esi,_new_line\r
136         xor     ecx,ecx\r
137         call    display_error_string\r
138         mov     ebx,[esp]\r
139         test    [ebx+Error.flags],ERR_CUSTOM\r
140         jnz     show_error_message\r
141         cmp     [ebx+Error.preprocessed_length],0\r
142         je      show_error_message\r
143         mov     esi,_preprocessed_text_prefix\r
144         xor     ecx,ecx\r
145         call    display_error_string\r
146         mov     esi,[ebx+Error.preprocessed_data]\r
147         mov     ecx,[ebx+Error.preprocessed_length]\r
148         call    show_preprocessed_line\r
149         mov     esi,_new_line\r
150         xor     ecx,ecx\r
151         call    display_error_string\r
152     show_error_message:\r
153         pop     ebx\r
154         mov     esi,_error_prefix\r
155         test    [ebx+Error.flags],ERR_CUSTOM\r
156         jz      display_error_prefix\r
157         mov     esi,_custom_error_prefix\r
158       display_error_prefix:\r
159         xor     ecx,ecx\r
160         call    display_error_string\r
161         mov     esi,[ebx+Error.message]\r
162         test    [ebx+Error.flags],ERR_CUSTOM\r
163         jz      format_error_message\r
164         xor     ecx,ecx\r
165         call    display_error_string\r
166       finish_error_message:\r
167         mov     esi,_message_suffix\r
168         xor     ecx,ecx\r
169         call    display_error_string\r
170         mov     esi,ebx\r
171     next_error:\r
172         mov     esi,[esi+Error.next]\r
173         jmp     display_error\r
174     format_error_message:\r
175         mov     edx,esi\r
176       cut_error_message:\r
177         lodsb\r
178         test    al,al\r
179         jz      show_error_message_segment\r
180         cmp     al,'%'\r
181         jne     cut_error_message\r
182       show_error_message_segment:\r
183         dec     esi\r
184         push    esi\r
185         xchg    ecx,esi\r
186         sub     ecx,edx\r
187         mov     esi,edx\r
188         call    display_error_string\r
189         pop     esi\r
190         lodsb\r
191         test    al,al\r
192         jz      finish_error_message\r
193         lodsb\r
194         cmp     al,'s'\r
195         je      insert_string_into_error_message\r
196         cmp     al,'i'\r
197         jne     format_error_message\r
198         push    ebx\r
199         mov     ebx,[ebx+Error.symbol]\r
200         mov     ebx,[ebx+SymbolTree_Leaf.branch]\r
201         call    show_symbol_name\r
202         pop     ebx\r
203         jmp     format_error_message\r
204       insert_string_into_error_message:\r
205         push    esi\r
206         mov     esi,[ebx+Error.symbol]\r
207         xor     ecx,ecx\r
208         call    display_error_string\r
209         pop     esi\r
210         jmp     format_error_message\r
212 show_symbol_name:\r
213 ; in:\r
214 ;  ebx - SymbolTree_Foliage, may be null\r
215 ; preserves: esi\r
216         test    ebx,ebx\r
217         jz      symbol_name_shown\r
218         mov     edi,[identifier_workspace.memory_start]\r
219         cmp     [ebx+SymbolTree_Foliage.name_kind],NAME_NUMERIC\r
220         je      next_name_segment\r
221       compose_symbol_name:\r
222         mov     ecx,[ebx+SymbolTree_Foliage.name_length]\r
223         mov     edx,identifier_workspace\r
224         mov     al,[ebx+SymbolTree_Foliage.name_kind]\r
225         cmp     al,NAME_CASESENSITIVE\r
226         je      name_segment_to_copy\r
227         cmp     al,NAME_ABSTRACT\r
228         je      name_segment_copied\r
229         cmp     al,NAME_NUMERIC\r
230         je      dot_label_name\r
231         mov     al,'?'\r
232         stosb\r
233       name_segment_to_copy:\r
234         push    ecx\r
235         add     ecx,2\r
236         call    reserve_workspace\r
237         pop     ecx\r
238         mov     edx,[ebx+SymbolTree_Foliage.name_data]\r
239       copy_name_segment:\r
240         jecxz   name_segment_copied\r
241         dec     ecx\r
242         mov     al,[edx+ecx]\r
243         stosb\r
244         jmp     copy_name_segment\r
245       dot_label_name:\r
246         push    esi\r
247         mov     esi,[ebx+SymbolTree_Foliage.name_data]\r
248         xor     eax,eax\r
249       read_dot_count:\r
250         jecxz   dot_count_read\r
251         dec     ecx\r
252         shl     eax,8\r
253         mov     al,[esi+ecx]\r
254         jmp     read_dot_count\r
255       dot_count_read:\r
256         pop     esi\r
257         push    eax\r
258         lea     ecx,[eax+2]\r
259         call    reserve_workspace\r
260         pop     ecx\r
261         mov     al,'.'\r
262         rep     stosb\r
263       name_segment_copied:\r
264         mov     edx,[ebx+SymbolTree_Foliage.root]\r
265         mov     ebx,[edx+SymbolTree_Root.parent_branch]\r
266         test    [edx+SymbolTree_Root.flags],NAMESPACE_LOCAL or NAMESPACE_CALM\r
267         jnz     mark_local_symbol_name\r
268         test    ebx,ebx\r
269         jz      symbol_name_ready\r
270       next_name_segment:\r
271         mov     al,'.'\r
272         stosb\r
273         jmp     compose_symbol_name\r
274       mark_local_symbol_name:\r
275         mov     al,':'\r
276         stosb\r
277         test    [edx+SymbolTree_Root.flags],NAMESPACE_CALM\r
278         jz      symbol_name_ready\r
279         mov     eax,[ebx+SymbolTree_Foliage.name_data]\r
280         mov     ebx,[eax+SymbolTree_Leaf.branch]\r
281         test    ebx,ebx\r
282         jnz     compose_symbol_name\r
283       symbol_name_ready:\r
284         mov     ebx,[identifier_workspace.memory_start]\r
285         mov     ecx,edi\r
286         sub     ecx,ebx\r
287         jz      symbol_name_shown\r
288         push    esi\r
289         mov     esi,ebx\r
290       reverse_composed_name:\r
291         dec     edi\r
292         cmp     ebx,edi\r
293         jae     show_composed_name\r
294         mov     al,[ebx]\r
295         xchg    al,[edi]\r
296         mov     [ebx],al\r
297         inc     ebx\r
298         jmp     reverse_composed_name\r
299       show_composed_name:\r
300         call    display_error_string\r
301         pop     esi\r
302       symbol_name_shown:\r
303         retn\r
305 show_line_content:\r
306 ; in:\r
307 ;  ebx - SourceEntry\r
308         cmp     [ebx+SourceEntry.type],SOURCE_MACRO\r
309         je      show_line_from_macro\r
310         mov     esi,[ebx+SourceEntry.text]\r
311         add     esi,[ebx+SourceEntry.line_offset]\r
312         mov     ecx,[ebx+SourceEntry.number_of_attached_lines]\r
313         inc     ecx\r
314         mov     [number_of_lines],ecx\r
315     show_token:\r
316         mov     al,[esi]\r
317         test    al,al\r
318         jz      line_content_shown\r
319         cmp     al,0Ah\r
320         je      line_content_shown\r
321         cmp     al,1Ah\r
322         je      show_name_token\r
323         cmp     al,22h\r
324         je      show_string_token\r
325         cmp     al,27h\r
326         je      show_string_token\r
327         cmp     al,'\'\r
328         jne     show_basic_token\r
329         cmp     byte [esi+1],0Ah\r
330         jne     show_basic_token\r
331         dec     [number_of_lines]\r
332         jnz     show_attached_line\r
333     show_basic_token:\r
334         mov     ecx,1\r
335         call    display_error_string\r
336         inc     esi\r
337         jmp     show_token\r
338     show_name_token:\r
339         add     esi,1+4\r
340         mov     ecx,[esi-4]\r
341         call    display_error_string\r
342         add     esi,[esi-4]\r
343         add     esi,12\r
344         jmp     show_token\r
345     show_string_token:\r
346         mov     ebx,esi\r
347         inc     esi\r
348         call    show_string_token_content\r
349         lea     esi,[ebx+1]\r
350         lodsd\r
351         add     esi,eax\r
352         jmp     show_token\r
353     show_string_token_content:\r
354         lea     edi,[esi+4]\r
355         mov     ecx,[esi]\r
356     show_string_segment:\r
357         push    ecx edi\r
358         mov     esi,_single_quote\r
359         mov     ecx,1\r
360         call    display_error_string\r
361         pop     edi ecx\r
362         jecxz   show_end_quote\r
363         mov     edx,ecx\r
364         mov     al,27h\r
365         repne   scasb\r
366         sub     edx,ecx\r
367         mov     esi,edi\r
368         sub     esi,edx\r
369         push    ecx edi\r
370         mov     ecx,edx\r
371         call    display_error_string\r
372         pop     edi ecx\r
373         test    ecx,ecx\r
374         jnz     show_string_segment\r
375     show_end_quote:\r
376         cmp     byte [ebx],27h\r
377         je      string_token_shown\r
378         mov     esi,_single_quote\r
379         mov     ecx,1\r
380         call    display_error_string\r
381     string_token_shown:\r
382         retn\r
383     show_attached_line:\r
384         mov     ecx,1\r
385         call    display_error_string\r
386         lea     ebx,[esi+2]\r
387         mov     esi,_line_segment_prefix\r
388         xor     ecx,ecx\r
389         call    display_error_string\r
390         mov     esi,ebx\r
391         jmp     show_token\r
392     show_line_from_macro:\r
393         mov     edx,[ebx+SourceEntry.text]\r
394         mov     esi,[edx+ValueDefinition.value]\r
395         mov     ecx,[edx+ValueDefinition.value_length]\r
396         mov     eax,[ebx+SourceEntry.line_offset]\r
397         add     esi,eax\r
398         sub     ecx,eax\r
399         jbe     line_content_shown\r
400         call    show_preprocessed_line\r
401     line_content_shown:\r
402         retn\r
404 show_preprocessed_line:\r
405 ; in:\r
406 ;  esi - preprocessed tokens\r
407 ;  ecx = total length of preprocessed tokens\r
408         lea     eax,[esi+ecx]\r
409         mov     [preprocessed_text_end],eax\r
410     show_preprocessed_token:\r
411         cmp     esi,[preprocessed_text_end]\r
412         jae     preprocessed_line_shown\r
413         mov     al,[esi]\r
414         test    al,al\r
415         jz      preprocessed_line_shown\r
416         cmp     al,1Ah\r
417         je      show_preprocessed_name_token\r
418         cmp     al,22h\r
419         je      show_preprocessed_string_token\r
420         cmp     al,27h\r
421         je      show_preprocessed_string_token\r
422         cmp     al,30h\r
423         je      show_internal_number\r
424         cmp     al,40h\r
425         je      show_context_token\r
426         mov     ecx,1\r
427         call    display_error_string\r
428         inc     esi\r
429         jmp     show_preprocessed_token\r
430     show_preprocessed_name_token:\r
431         inc     esi\r
432         lodsd\r
433         mov     ebx,esi\r
434         mov     esi,eax\r
435         lodsd\r
436         mov     ecx,eax\r
437         call    display_error_string\r
438         mov     esi,ebx\r
439         jmp     show_preprocessed_token\r
440     show_preprocessed_string_token:\r
441         mov     ebx,esi\r
442         mov     esi,[esi+1]\r
443         call    show_string_token_content\r
444         lea     esi,[ebx+1+4]\r
445         jmp     show_preprocessed_token\r
446     show_internal_number:\r
447         inc     esi\r
448         mov     edx,esi\r
449         push    esi\r
450         call    convert_number_back\r
451         lea     esi,[edx+4]\r
452         mov     ecx,[edx]\r
453         call    display_error_string\r
454         pop     esi\r
455         add     esi,[esi]\r
456         add     esi,4\r
457         jmp     show_preprocessed_token\r
458     show_context_token:\r
459         add     esi,1+sizeof.RecognitionContext\r
460         jmp     show_preprocessed_token\r
461     preprocessed_line_shown:\r
462         retn\r
464 itoa:\r
465 ; in:\r
466 ;  edx:eax = unsigned number\r
467 ; out:\r
468 ;  esi - temporary buffer containing decimal digits\r
469 ;  ecx = length of string (number of digits)\r
470         mov     edi,temporary_value+4\r
471         stosd\r
472         mov     eax,edx\r
473         stosd\r
474         mov     edx,temporary_value\r
475         mov     dword [edx],8\r
476         call    convert_number_back\r
477         lea     esi,[edx+4]\r
478         mov     ecx,[edx]\r
479         retn\r