Subversion Repositories Kolibri OS

Rev

Rev 3614 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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