Apps: fixed 3 programs for using a long path in parameters
[kolibrios.git] / programs / debug-fdo.inc
blob3b54a3384edf8337bda8d70a0bfc77b72c2656eb
1 ;\r
2 ; Formatted Debug Output (FDO)\r
3 ; Copyright (c) 2005-2006, mike.dld\r
4 ; Created: 2005-01-29, Changed: 2006-11-10\r
5 ;\r
6 ; For questions and bug reports, mail to mike.dld@gmail.com\r
7 ;\r
8 ; Available format specifiers are: %s, %d, %u, %x (with partial width support)\r
9 ;\r
11 ; to be defined:\r
12 ;   __DEBUG__ equ 1\r
13 ;   __DEBUG_LEVEL__ equ 5\r
15 _esp equ esp\r
17 macro put_board {\r
18         mcall   63\r
19 }\r
21 macro debug_func name {\r
22  if used name\r
23   name@of@func equ name\r
24 }\r
26 macro debug_beginf {\r
27  align 4\r
28  name@of@func:\r
29 }\r
31 debug_endf fix end if\r
33 macro DEBUGS _sign,[_str] {\r
34  common\r
35   local tp\r
36   tp equ 0\r
37   match _arg:_num,_str \{\r
38    DEBUGS_N _sign,_num,_arg\r
39    tp equ 1\r
40   \}\r
41   match =0 _arg,tp _str \{\r
42    DEBUGS_N _sign,,_arg\r
43   \}\r
44 }\r
46 macro DEBUGS_N _sign,_num,[_str] {\r
47  common\r
48         pushf\r
49         pushad\r
50   local ..str,..label,is_str\r
51   is_str = 0\r
52  forward\r
53   if _str eqtype ''\r
54    is_str = 1\r
55   end if\r
56  common\r
57   if is_str = 1\r
58         jmp     ..label\r
59    ..str db _str,0\r
60    ..label:\r
61         mov     edx, ..str\r
62   else\r
63 esp equ esp+4*8+4\r
64         mov     edx, _str\r
65 esp equ _esp\r
66   end if\r
67   if ~_num eq\r
68    if _num eqtype eax\r
69     if _num in <eax,ebx,ecx,edx,edi,ebp,esp>\r
70         mov     esi, _num\r
71     else if ~_num eq esi\r
72         movzx   esi, _num\r
73     end if\r
74    else if _num eqtype 0\r
75         mov     esi, _num\r
76    else\r
77     local tp\r
78     tp equ 0\r
79     match [_arg],_num \{\r
80         mov     esi, dword[_arg]\r
81      tp equ 1\r
82     \}\r
83     match =0 =dword[_arg],tp _num \{\r
84         mov     esi, dword[_arg]\r
85      tp equ 1\r
86     \}\r
87     match =0 =word[_arg],tp _num \{\r
88         movzx   esi, word[_arg]\r
89      tp equ 1\r
90     \}\r
91     match =0 =byte[_arg],tp _num \{\r
92         movzx   esi, byte[_arg]\r
93      tp equ 1\r
94     \}\r
95     match =0,tp \{\r
96      'Error: specified string width is incorrect'\r
97     \}\r
98    end if\r
99   else\r
100         mov     esi, 0x7FFFFFFF\r
101   end if\r
102         call    fdo_debug_outstr\r
103         popad\r
104         popf\r
107 macro DEBUGD _sign,_dec {\r
108  local tp\r
109  tp equ 0\r
110  match _arg:_num,_dec \{\r
111   DEBUGD_N _sign,_num,_arg\r
112   tp equ 1\r
113  \}\r
114  match =0 _arg,tp _dec \{\r
115   DEBUGD_N _sign,,_arg\r
116  \}\r
119 macro DEBUGD_N _sign,_num,_dec {\r
120         pushf\r
121         pushad\r
122  if (~_num eq)\r
123   if (_dec eqtype eax | _dec eqtype 0)\r
124    'Error: precision allowed only for in-memory variables'\r
125   end if\r
126   if (~_num in <1,2,4>)\r
127    if _sign\r
128     'Error: 1, 2 and 4 are only allowed for precision in %d'\r
129    else\r
130     'Error: 1, 2 and 4 are only allowed for precision in %u'\r
131    end if\r
132   end if\r
133  end if\r
134  if _dec eqtype eax\r
135   if _dec in <ebx,ecx,edx,esi,edi,ebp,esp>\r
136         mov     eax, _dec\r
137   else if ~_dec eq eax\r
138    if _sign = 1\r
139         movsx   eax, _dec\r
140    else\r
141         movzx   eax, _dec\r
142    end if\r
143   end if\r
144  else if _dec eqtype 0\r
145         mov     eax, _dec\r
146  else\r
147 ;  add esp,4*8+4\r
148 esp equ esp+4*8+4\r
149   if _num eq\r
150         mov     eax, dword _dec\r
151   else if _num = 1\r
152    if _sign = 1\r
153         movsx   eax, byte _dec\r
154    else\r
155         movzx   eax, byte _dec\r
156    end if\r
157   else if _num = 2\r
158    if _sign = 1\r
159         movsx   eax, word _dec\r
160    else\r
161         movzx   eax, word _dec\r
162    end if\r
163   else\r
164         mov     eax, dword _dec\r
165   end if\r
166 esp equ _esp\r
167 ;  sub esp,4*8+4\r
168  end if\r
169         mov     cl, _sign\r
170         call    fdo_debug_outdec\r
171         popad\r
172         popf\r
175 macro DEBUGH _sign,_hex {\r
176  local tp\r
177  tp equ 0\r
178  match _arg:_num,_hex \{\r
179   DEBUGH_N _sign,_num,_arg\r
180   tp equ 1\r
181  \}\r
182  match =0 _arg,tp _hex \{\r
183   DEBUGH_N _sign,,_arg\r
184  \}\r
187 macro DEBUGH_N _sign,_num,_hex {\r
188         pushf\r
189         pushad\r
190  if (~_num eq) & (~_num in <1,2,3,4,5,6,7,8>)\r
191   'Error: 1..8 are only allowed for precision in %x'\r
192  end if\r
193  if _hex eqtype eax\r
194   if _hex in <eax,ebx,ecx,edx,esi,edi,ebp,esp>\r
195    if ~_hex eq eax\r
196         mov     eax, _hex\r
197    end if\r
198         mov     edx, 8\r
199   else if _hex in <ax,bx,cx,dx,si,di,bp,sp>\r
200    if ~_hex eq ax\r
201         movzx   eax, _hex\r
202    end if\r
203    if (_num eq)\r
204         mov     edx, 4\r
205    end if\r
206   else if _hex in <al,ah,bl,bh,cl,ch,dl,dh>\r
207    if ~_hex eq al\r
208         movzx   eax, _hex\r
209    end if\r
210    if (_num eq)\r
211         mov     edx, 2\r
212    end if\r
213   end if\r
214  else if _hex eqtype 0\r
215         mov     eax, _hex\r
216  else\r
217 ;  add esp,4*8+4\r
218 esp equ esp+4*8+4\r
219         mov     eax, dword _hex\r
220 esp equ _esp\r
221 ;  sub esp,4*8+4\r
222  end if\r
223  if ~_num eq\r
224         mov     edx, _num\r
225  else\r
226   if ~_hex eqtype eax\r
227         mov     edx, 8\r
228   end if\r
229  end if\r
230         call    fdo_debug_outhex\r
231         popad\r
232         popf\r
235 ;-----------------------------------------------------------------------------\r
237 debug_func fdo_debug_outchar\r
238 debug_beginf\r
239         pushad\r
240         movzx   ecx, al\r
241         mov     ebx, 1\r
242         put_board\r
243         popad\r
244         ret\r
245 debug_endf\r
247 debug_func fdo_debug_outstr\r
248 debug_beginf\r
249         mov     ebx, 1\r
250   .l1:\r
251         dec     esi\r
252         js      .l2\r
253         movzx   ecx, byte[edx]\r
254         or      cl, cl\r
255         jz      .l2\r
256         put_board\r
257         inc     edx\r
258         jmp     .l1\r
259   .l2:\r
260         ret\r
261 debug_endf\r
263 debug_func fdo_debug_outdec\r
264 debug_beginf\r
265         or      cl, cl\r
266         jz      @f\r
267         or      eax, eax\r
268         jns     @f\r
269         neg     eax\r
270         push    eax\r
271         mov     al, '-'\r
272         call    fdo_debug_outchar\r
273         pop     eax\r
274     @@:\r
275         movi    ecx, 10\r
276         push    -'0'\r
277   .l1:\r
278         xor     edx, edx\r
279         div     ecx\r
280         push    edx\r
281         test    eax, eax\r
282         jnz     .l1\r
283   .l2:\r
284         pop     eax\r
285         add     al, '0'\r
286         jz      .l3\r
287         call    fdo_debug_outchar\r
288         jmp     .l2\r
289   .l3:\r
290         ret\r
291 debug_endf\r
293 debug_func fdo_debug_outhex\r
294   __fdo_hexdigits db '0123456789ABCDEF'\r
295 debug_beginf\r
296         mov     cl, dl\r
297         neg     cl\r
298         add     cl, 8\r
299         shl     cl, 2\r
300         rol     eax, cl\r
301   .l1:\r
302         rol     eax, 4\r
303         push    eax\r
304         and     eax, 0x0000000F\r
305         mov     al, [__fdo_hexdigits+eax]\r
306         call    fdo_debug_outchar\r
307         pop     eax\r
308         dec     edx\r
309         jnz     .l1\r
310         ret\r
311 debug_endf\r
313 ;-----------------------------------------------------------------------------\r
315 macro DEBUGF _level,_format,[_arg] {\r
316  common\r
317  if __DEBUG__ = 1 & _level >= __DEBUG_LEVEL__\r
318   local ..f1,f2,a1,a2,c1,c2,c3,..lbl\r
319   _debug_str_ equ __debug_str_ # a1\r
320   a1 = 0\r
321   c2 = 0\r
322   c3 = 0\r
323   f2 = 0\r
324   repeat ..lbl-..f1\r
325    virtual at 0\r
326     db _format,0,0\r
327     load c1 word from %-1\r
328    end virtual\r
329    if c1 = '%s'\r
330     virtual at 0\r
331      db _format,0,0\r
332      store word 0 at %-1\r
333      load c1 from f2-c2\r
334     end virtual\r
335     if c1 <> 0\r
336      DEBUGS 0,_debug_str_+f2-c2\r
337     end if\r
338     c2 = c2 + 1\r
339     f2 = %+1\r
340     DEBUGF_HELPER S,a1,0,_arg\r
341    else if c1 = '%x'\r
342     virtual at 0\r
343      db _format,0,0\r
344      store word 0 at %-1\r
345      load c1 from f2-c2\r
346     end virtual\r
347     if c1 <> 0\r
348      DEBUGS 0,_debug_str_+f2-c2\r
349     end if\r
350     c2 = c2 + 1\r
351     f2 = %+1\r
352     DEBUGF_HELPER H,a1,0,_arg\r
353    else if c1 = '%d' | c1 = '%u'\r
354     local c4\r
355     if c1 = '%d'\r
356      c4 = 1\r
357     else\r
358      c4 = 0\r
359     end if\r
360     virtual at 0\r
361      db _format,0,0\r
362      store word 0 at %-1\r
363      load c1 from f2-c2\r
364     end virtual\r
365     if c1 <> 0\r
366      DEBUGS 0,_debug_str_+f2-c2\r
367     end if\r
368     c2 = c2 + 1\r
369     f2 = %+1\r
370     DEBUGF_HELPER D,a1,c4,_arg\r
371    else if c1 = '\n'\r
372     c3 = c3 + 1\r
373    end if\r
374   end repeat\r
375   virtual at 0\r
376    db _format,0,0\r
377    load c1 from f2-c2\r
378   end virtual\r
379   if (c1<>0)&(f2<>..lbl-..f1-1)\r
380    DEBUGS 0,_debug_str_+f2-c2\r
381   end if\r
382   virtual at 0\r
383    ..f1 db _format,0\r
384    ..lbl:\r
385    __debug_strings equ __debug_strings,_debug_str_,<_format>,..lbl-..f1-1-c2-c3\r
386   end virtual\r
387  end if\r
390 macro DEBUGFG _level, _group, _format, [_arg] {\r
391  common\r
392   if _group eqtype\r
393    DEBUGF _level, _format,_arg\r
394   else\r
395    if _level >= _group\r
396     DEBUGF 999, _format,_arg\r
397    end if\r
398   end if\r
401 macro __include_debug_strings dummy,[_id,_fmt,_len] {\r
402  common\r
403   local c1,a1,a2\r
404  forward\r
405   if defined _len & ~_len eq\r
406    _id:\r
407    a1 = 0\r
408    a2 = 0\r
409    repeat _len\r
410     virtual at 0\r
411      db _fmt,0,0\r
412      load c1 word from %+a2-1\r
413     end virtual\r
414     if (c1='%s')|(c1='%x')|(c1='%d')|(c1='%u')\r
415      db 0\r
416      a2 = a2 + 1\r
417     else if (c1='\n')\r
418      dw $0A0D\r
419      a1 = a1 + 1\r
420      a2 = a2 + 1\r
421     else\r
422      db c1 and 0x0FF\r
423     end if\r
424    end repeat\r
425    db 0\r
426   end if\r
429 macro DEBUGF_HELPER _letter,_num,_sign,[_arg] {\r
430  common\r
431   local num\r
432   num = 0\r
433  forward\r
434   if num = _num\r
435    DEBUG#_letter _sign,_arg\r
436   end if\r
437   num = num+1\r
438  common\r
439   _num = _num+1\r
442 macro include_debug_strings {\r
443  if __DEBUG__ = 1\r
444   match dbg_str,__debug_strings \{\r
445    __include_debug_strings dbg_str\r
446   \}\r
447  end if\r