Subversion Repositories Kolibri OS

Rev

Rev 1457 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; ьръЁюё фы  ёшёЄхьэющ сшсышюЄхъш box_lib.obj
  2. ; ¤ыхьхэЄ TreeList фы  Kolibri OS
  3. ; Їрщы яюёыхфэшщ Ёрч шчьхэ ыё  15.05.2010 IgorA
  4. ; эр ъюф яЁшьхэхэр GPL2 ышЎхэчш 
  5.  
  6.  
  7. sizeof.TreeList equ 20
  8. ;struct TreeList
  9. ;  type dw ? ;+ 0 Єшя ¤ыхьхэЄр, шыш шэфхъё шъюэъш фы  єчыр
  10. ;  lev db ?  ;+ 2 єЁютхэ№ ¤ыхьхэЄр
  11. ;  clo db ?  ;+ 3 Їыру чръЁ√Єш , шыш юЄъЁ√Єш  (шьххЄ ёь√ёы фы  ЁюфшЄхы№ёъюую єчыр)
  12. ;  perv dd ? ;+ 4 шэфхъё яЁхф√фє∙хую ¤ыхьхэЄр
  13. ;  next dd ? ;+ 8 шэфхъё яюёыхфє■∙хую ¤ыхьхэЄр
  14. ;  tc dd ?   ;+12 тЁхь. ёючфрэш 
  15. ;  td dd ?   ;+16 тЁхь. єфрыхэш 
  16. ;ends
  17.  
  18. macro use_tree_list
  19. {
  20. align 4
  21. tl_data_init: ;т√фхыэшх ярь Єш фы  ёЄЁєъЄєЁ ёяшёър ш юёэютэющ шэЇюЁьрЎшш (ъюэёЄЁєъЄюЁ)
  22.   push ebp
  23.   mov ebp,esp
  24.   push eax ecx edi
  25.     mov edi,dword[ebp+8]
  26.  
  27.     xor ecx,ecx
  28.     mov cx,tl_info_size
  29.     imul ecx,tl_info_max_count
  30.     call mem_Alloc
  31.     mov dword[edi],eax ;ъюяшЁєхь єърчрЄхы№ эр яюыєўхэє■ ярь Є№ т ёЄЁєъЄєЁє
  32.     mov tl_data_img,0  ;юсэєы хь єърчрЄхы№ 'data_img'
  33.     mov tl_data_img_sys,0 ;юсэєы хь єърчрЄхы№ 'data_img_sys'
  34.  
  35.     mov ecx,sizeof.TreeList
  36.     imul ecx,tl_info_max_count
  37.     call mem_Alloc
  38.     mov tl_data_nodes,eax ;ъюяшЁєхь єърчрЄхы№ эр яюыєўхэє■ ярь Є№ т ёЄЁєъЄєЁє
  39.  
  40.     push dword edi
  41.     call tl_info_clear
  42.  
  43.     ;эрёЄЁющъш фюўхЁэхую ёъЁюыышэур
  44.     cmp tl_p_scrol,0
  45.     je @f
  46.       mov eax,tl_p_scrol
  47.       ;*** ЎтхЄют√х эрёЄЁющъш ***
  48.       mov ecx,tl_col_bkg
  49.       mov dword[eax+28],ecx ;+28 .bckg_col
  50.       mov ecx,tl_col_zag
  51.       mov dword[eax+32],ecx ;+32 .frnt_col
  52.       mov ecx,tl_col_txt
  53.       mov dword[eax+36],ecx ;+32 .line_col
  54.       ;*** эрёЄЁющъш ЁрчьхЁют ***
  55.       mov ecx,tl_box_left
  56.       add ecx,tl_box_width
  57.       mov word[eax+2],cx
  58.       mov ecx,tl_box_height
  59.       mov word[eax+4],cx
  60.       mov ecx,tl_box_top
  61.       mov word[eax+6],cx
  62.     @@:
  63.   pop edi ecx eax
  64.   pop ebp
  65.   ret 4
  66.  
  67. align 4
  68. proc tl_data_clear, tlist:dword ;юўшёЄър ярь Єш ¤ыхьхэЄр (фхёЄЁєъЄюЁ)
  69.         push edi
  70.         mov edi,dword[tlist]
  71.         cmp tl_data_img,0
  72.         je @f
  73.                 stdcall mem_Free,tl_data_img ;ўшёЄър ёшёЄхьэ√ї шъюэюъ
  74.         @@:
  75.         cmp tl_data_img_sys,0
  76.         je @f
  77.                 stdcall mem_Free,tl_data_img_sys ;ўшёЄър ёшёЄхьэ√ї шъюэюъ
  78.         @@:
  79.         stdcall mem_Free,dword[edi]
  80.  
  81.         stdcall mem_Free,tl_data_nodes
  82.         pop edi
  83.         ret
  84. endp
  85.  
  86. align 4
  87. tl_info_clear: ;юўшёЄър ёяшёър (шэЇюЁьрЎшш)
  88.   push ebp
  89.   mov ebp,esp
  90.     push eax ecx edi
  91.     mov edi,dword[ebp+8]
  92.     mov tl_ch_tim,0
  93.     mov dword[edi+34],0 ;ls_tim
  94.     mov tl_tim_undo,0
  95.     mov tl_cur_pos,0
  96.     ;xor ecx,ecx
  97.     mov ecx,sizeof.TreeList
  98.     imul ecx,tl_info_max_count
  99.     mov eax,tl_data_nodes
  100.     @@:
  101.       mov byte[eax],0 ;ўшёЄшь єчы√ 0-ьш
  102.       inc eax
  103.       loop @b
  104.     mov eax,tl_data_nodes ;єърчрЄхы№ эр 0-щ єчхы
  105.     mov dword[eax+8],1 ;єърчрЄхы№ next т 0-ь єчых яЁшЁртэштрхь ъ 1
  106.  
  107.     cmp tl_p_scrol,0 ;юсЁрсюЄър ёъЁюыышэур
  108.     je @f
  109.       mov eax,tl_p_scrol
  110.       mov dword[eax+24],0 ;+24 .position
  111.       call tb_scrol_resize
  112.     @@:
  113.     pop edi ecx eax
  114.   pop ebp
  115.   ret 4
  116.  
  117.  
  118. align 4
  119. tl_key: ;ЁхръЎш  эр ъыртшрЄєЁє
  120.   push ebp
  121.   mov ebp,esp
  122.     push ebx ecx edi
  123.     mov edi,dword[ebp+8]
  124.  
  125.     mov ebx,tl_el_focus
  126.     cmp dword[ebx],edi
  127.     jne .no_focus ;¤ыхьхэЄ эх т Їюъєёх
  128.  
  129.     push eax
  130.     mov eax,66
  131.     mov ebx,2
  132.     int 0x40  ;яюыєўшЄ№ Ёхцшь ттюфр ё ъыртшрЄєЁ√
  133.  
  134.     lea ecx,[tl_key_scan]
  135.     cmp eax,1 ;1 = ёърэъюф√
  136.     je @f
  137.       lea ecx,[tl_key_ascii]
  138.     @@:
  139.     pop eax
  140.  
  141.     xor bx,bx
  142.     cmp ah,byte[ecx] ;Enter
  143.     jne @f
  144.       cmp tl_on_press,0
  145.       je @f
  146.         call tl_on_press
  147.     @@:
  148.     cmp ah,byte[ecx+1] ;Space
  149.     jne @f
  150.       push dword edi
  151.       call tl_node_close_open
  152.     @@:
  153.     cmp ah,byte[ecx+2] ;Up
  154.     jne @f
  155.       push dword edi
  156.       call tl_cur_perv
  157.     @@:
  158.     cmp ah,byte[ecx+3] ;Down
  159.     jne @f
  160.       push dword edi
  161.       call tl_cur_next
  162.     @@:
  163.     cmp ah,byte[ecx+7] ;Page Up
  164.     jne @f
  165.       push dword edi
  166.       call tl_cur_page_up
  167.     @@:
  168.     cmp ah,byte[ecx+8] ;Page Down
  169.     jne @f
  170.       push dword edi
  171.       call tl_cur_page_down
  172.     @@:
  173.  
  174.     bt tl_style,0 ;tl_key_no_edit
  175.     jc .no_edit
  176.       cmp ah,byte[ecx+4] ;Left
  177.       jne @f
  178.         push dword edi
  179.         call tl_node_lev_dec
  180.         mov bx,1
  181.       @@:
  182.       cmp ah,byte[ecx+5] ;Right
  183.       jne @f
  184.         push dword edi
  185.         call tl_node_lev_inc
  186.         mov bx,1
  187.       @@:
  188.       cmp ah,byte[ecx+6] ;Delete
  189.       jne @f
  190.         push dword edi
  191.         call tl_node_delete
  192.         mov bx,1
  193.       @@:
  194.     .no_edit:
  195.  
  196.     cmp bx,1
  197.     jne .no_focus
  198.       push dword edi
  199.       call tl_draw
  200.     .no_focus:
  201.  
  202.     pop edi ecx ebx
  203.   pop ebp
  204.   ret 4
  205.  
  206. align 4
  207. tl_mouse: ;ЁхръЎш  эр ь√°№
  208.   push ebp
  209.   mov ebp,esp
  210.     pushad
  211.     mov edi,dword[ebp+8]
  212.  
  213.     mov eax,37
  214.     mov ebx,1
  215.     int 0x40
  216.  
  217.     mov ebx,tl_box_left
  218.     shl ebx,16
  219.     cmp eax,ebx ;ыхтр  уЁрэшЎр юъэр
  220.     jl .no_in_wnd ;.test_scroll
  221.  
  222.     mov ebx,tl_box_left
  223.     add ebx,tl_box_width
  224.     shl ebx,16
  225.     cmp eax,ebx ;яЁртр  уЁрэшЎр юъэр
  226.     jg .test_scroll
  227.  
  228.     mov ebx,tl_box_top
  229.     add ebx,tl_box_height
  230.     cmp ax,bx ;эшцэ   уЁрэшЎр юъэр
  231.     jg .test_scroll
  232.  
  233.     sub ebx,tl_box_height
  234.     add bx,tl_capt_cy
  235.     cmp ax,bx ;тхЁїэ   уЁрэшЎр юъэр + т√ёюЄр яюфяшёш
  236.     jl .test_scroll
  237.  
  238.     push eax ebx
  239.       mov eax,37
  240.       mov ebx,2
  241.       int 0x40
  242.  
  243.       bt eax,0 ;left mouse button press
  244.     pop ebx eax
  245.       jae .no_draw
  246.  
  247.  
  248.     mov esi,tl_el_focus
  249.     mov dword[esi],edi ;set focus
  250.  
  251.     ; if '+' or '-' press
  252.     mov esi,eax
  253.     shr esi,16
  254.     sub esi,tl_box_left ;esi = mouse x coord in element window
  255.  
  256.     and eax,0xffff
  257.     sub ax,bx
  258.     xor edx,edx
  259.     xor ecx,ecx
  260.     mov cx,tl_img_cy
  261.     div ecx
  262.     cmp tl_p_scrol,0 ;єўшЄ√трхь ёъЁюыышэу
  263.     je @f
  264.       mov edx,tl_p_scrol
  265.       add eax,dword[edx+24] ;фюсрты хь ёъЁюыышэу эр тхЁїє
  266.     @@:
  267.  
  268.     mov ecx,eax
  269.     call tl_get_node_count ;eax = node count
  270.     cmp eax,ecx
  271.     jl @f
  272.       mov eax,ecx ;хёыш ъєЁёюЁ эх т√°хы чр яЁхфхы√ єчыют, тюёёЄрэртыштрхь ёЄрЁюх чэрўхэшх eax
  273.     @@:
  274.  
  275.     cmp eax,tl_cur_pos ;хёыш эютюх чэрўхэшх ъєЁёюЁр ёютярыю ё яЁхф√фє∙шь
  276.     je @f ;Єю эх ёЄшЁрхь ъєЁёюЁ
  277.     push esi
  278.       mov esi,tl_box_top
  279.       add esi,tl_box_height ;esi = coord bottom border
  280.       call tl_draw_null_cursor ;ёЄшЁрхь ъєЁёюЁ
  281.     pop esi
  282.     @@:
  283.  
  284.     mov tl_cur_pos,eax
  285.  
  286.     ; if '+' or '-' press
  287.     call tl_get_cur_node_index ;eax = node index
  288.     cmp eax,2
  289.     jl .no_open_close ;ъєЁёюЁ ёЄюшЄ эр яєёЄюь ьхёЄх, схч єчыют
  290.     imul eax,sizeof.TreeList
  291.     add eax,tl_data_nodes
  292.     xor bx,bx
  293.     mov bl,byte[eax+2] ;+2 lev ёюїЁрэ хь єЁютхэ№ Єхъє∙хую єчыр
  294.     inc bx ;+ яюых фы  ъєЁёюЁр
  295.  
  296.     cmp si,tl_img_cx
  297.     jl .no_open_close ;ь√°хщ яюярыш эр ыхтюх яюых фы  ъєЁёюЁр, уфх Єюўэю эхЄ '+' ш '-'
  298.       mov eax,esi
  299.       xor edx,edx
  300.       xor ecx,ecx
  301.       mov cx,tl_img_cx
  302.       div ecx
  303.  
  304.       cmp ax,bx
  305.       jne .no_open_close
  306.  
  307.       push dword edi
  308.       call tl_node_close_open
  309.     .no_open_close:
  310.  
  311.       mov esi,tl_box_top
  312.       add esi,tl_box_height ;esi = coord bottom border
  313.       call tl_draw_cursor ;яхЁхЁшёютър ъєЁёюЁр
  314.       call tl_draw_caption_cur_pos
  315.       jmp .no_draw
  316. ;--- mouse event for children scrollbar ----------------------------------------
  317. .test_scroll:
  318.   mov edx,tl_p_scrol
  319.   cmp edx,0
  320.   je .no_in_wnd ;яюы№чютрЄхы№ эх ёючфры фюўхЁэхую ёъЁюыышэур
  321.     shr ebx,16
  322.     add bx,word[edx] ;+0 .size_x
  323.     shl ebx,16
  324.     cmp eax,ebx ;яЁртр  уЁрэшЎр юъэр
  325.     jg .no_in_wnd
  326.  
  327.     mov eax,dword[edx+16] ;+16 .max_area
  328.     cmp eax,dword[edx+20] ;+20 .cur_area
  329.     jbe .no_in_wnd ;тёх єчы√ яюярфр■Є т юъэю ёъЁюыышэур
  330.       push dword edx
  331.       call scroll_bar_vertical.mouse ;scrollbar_ver_mouse
  332.  
  333.       cmp dword[edx+40],0 ;+40 .redraw
  334.       je  @f
  335.         mov dword[edx+40],0 ;+40 .redraw
  336.         push dword edi
  337.         call tl_draw ;яЁюшчю°ыш шчьхэхэш  ёъЁюыышэур
  338.       @@:
  339.       cmp dword[edx+46],0 ;+46 .delta2
  340.       jne .no_draw ;яюярыш эр ёъЁюыышэу - эх ёэшьрхь Їюъєё ё TreeList
  341. ;-------------------------------------------------------------------------------
  342.     .no_in_wnd:  ;эх яюярыш т юъэю - яюЄхЁ  Їюъєёр (яЁш єёыютшш ўЄю Їюъєё с√ы эр фрээюь ¤хыхьхэЄх)
  343.       mov eax,37 ;яЁютхЁ хь эрцрЄюёЄ№ ы■с√ї ъэюяюъ
  344.       mov ebx,2
  345.       int 0x40
  346.       cmp eax,0  ;эшўх эх эрцрыш eax=0
  347.       je .no_draw
  348.  
  349.       mov ebx,tl_el_focus
  350.       cmp dword[ebx],edi
  351.       jne .no_draw ;¤ыхьхэЄ эх т Їюъєёх
  352.         mov dword[ebx],0 ;reset focus
  353.         mov esi,tl_box_top
  354.         add esi,tl_box_height ;esi = coord bottom border
  355.         call tl_draw_cursor ;Ёшёєхь ъєЁёюЁ ё яюЄхЁ э√ь Їюъєёюь
  356.     .no_draw:
  357.  
  358.     popad
  359.   pop ebp
  360.   ret 4
  361.  
  362. align 4
  363. tl_info_undo: ;юЄьхэр фхщёЄтш 
  364.   push ebp
  365.   mov ebp,esp
  366.   push eax edi
  367.     mov edi,dword[ebp+8]
  368.     mov eax,tl_tim_undo
  369.     cmp tl_ch_tim,eax
  370.     jbe @f
  371.       inc tl_tim_undo
  372.       call tb_scrol_resize ;юсЁрсюЄър ёъЁюыышэур
  373.     @@:
  374.   pop edi eax
  375.   pop ebp
  376.   ret 4
  377.  
  378. align 4
  379. tl_info_redo: ;яютЄюЁ фхщёЄтш 
  380.   push ebp
  381.   mov ebp,esp
  382.   push edi
  383.     mov edi,dword[ebp+8]
  384.     cmp tl_tim_undo,1
  385.     jl @f
  386.       dec tl_tim_undo
  387.       call tb_scrol_resize ;юсЁрсюЄър ёъЁюыышэур
  388.     @@:
  389.   pop edi
  390.   pop ebp
  391.   ret 4
  392.  
  393. align 4
  394. tl_info_set_undo: ;єфрыхэшх юЄьхэхээ√ї фхщёЄтшщ
  395. ;  push ebp
  396. ;  mov ebp,esp
  397. ;  push edi
  398. ;    mov edi,dword[ebp+8]
  399.  
  400. ;  mov [dragk],0 ;чрърэўштрхь т√фхыхэшх юЄ ъыртшрЄєЁ√
  401.   cmp tl_tim_undo,1
  402.   jl .no_work
  403.  
  404.   push eax ebx ecx edx
  405.   mov edx,tl_data_nodes
  406.   mov ecx,edx
  407.   add ecx,sizeof.TreeList
  408.   call tl_move_next ;long i=node[0].next;
  409.   mov eax,tl_tim_undo
  410.   sub tl_ch_tim,eax ;ch_tim-=tim_undo;
  411.   mov eax,tl_ch_tim
  412.   cmp [edi+34],eax ;if(ls_tim>ch_tim)
  413.   jle @f
  414.     mov dword[edi+34],0 ;ls_tim=0
  415.   @@:
  416.     cmp edx,ecx
  417.     jle @f
  418.  
  419.     ;if(node[i].tc>ch_tim){ // хёыш ёючфрэшх ёшьтюыр с√ыю юЄьхэхэю
  420.     cmp dword[edx+12],eax
  421.     jle .no_u1
  422.       mov dword[edx+12],0
  423.       mov dword[edx+16],0
  424.  
  425.       mov ebx, dword[edx+4]
  426.       imul ebx,sizeof.TreeList
  427.       add ebx, tl_data_nodes ;.next
  428.       push dword[edx+8] ;node[node[i].perv].next=node[i].next;
  429.       pop dword[ebx+8]
  430.  
  431.       mov ebx, dword[edx+8]
  432.       imul ebx,sizeof.TreeList
  433.       add ebx, tl_data_nodes ;.perv
  434.       push dword[edx+4] ;node[node[i].next].perv=node[i].perv;
  435.       pop dword[ebx+4]
  436.  
  437.     .no_u1:
  438.  
  439.     ;else if(node[i].td>ch_tim) node[i].td=0; // хёыш єфрыхэшх ёшьтюыр с√ыю юЄьхэхэю
  440.     cmp dword[edx+16],eax
  441.     jle .no_u2
  442.       mov dword[edx+16],0
  443.     .no_u2:
  444.  
  445.     call tl_move_next
  446.     jmp @b
  447.   @@:
  448.   mov tl_tim_undo,0
  449. ;  mov eax,[edi+?] ;co_tim
  450. ;  cmp tl_ch_tim,eax ;ch_tim
  451. ;  jge @f
  452. ;    mov [edi+?],0 ;co_tim
  453. ;  @@:
  454.   pop edx ecx ebx eax
  455.   .no_work:
  456.  
  457. ;  pop edi
  458. ;  pop ebp
  459. ;  ret 4
  460.   ret
  461.  
  462. align 4
  463. tl_draw: ;т√тюф ёяшёър эр ¤ъЁрэ
  464.   push ebp
  465.   mov ebp,esp
  466.     pushad
  467.     ;draw dir_list main rect
  468.     mov edi,dword[ebp+8]
  469.     mov ebx,tl_box_left
  470.     shl ebx,16
  471.     add ebx,tl_box_width
  472.     mov ecx,tl_box_top
  473.     shl ecx,16
  474.     mov cx,tl_capt_cy
  475.     mov edx,tl_col_zag
  476.     mov eax,13
  477.     int 0x40 ;draw window caption
  478.  
  479.     add ecx,tl_box_top
  480.     shl ecx,16
  481.     add ecx,tl_box_height
  482.     sub cx,tl_capt_cy
  483.     mov edx,tl_col_bkg
  484.     int 0x40 ;draw window client rect
  485.  
  486.     cmp tl_capt_cy,9 ;9 - minimum caption height
  487.     jl @f
  488.     mov ebx,edi ;calculate cursor position
  489.     mov eax,tl_cur_pos
  490.     inc eax
  491.     lea edi,[txt_capt_cur]
  492.     add edi,7
  493.     call tl_convert_to_str
  494.  
  495.     mov edi,ebx
  496.     mov eax,tl_tim_undo
  497.     lea edi,[txt_capt_otm]
  498.     add edi,7
  499.     call tl_convert_to_str
  500.     mov edi,ebx ;restore edi
  501.  
  502.     mov eax,4 ;draw text captions
  503.     mov ebx,tl_box_left
  504.     shl ebx,16
  505.     add ebx,5*65536+3
  506.     add ebx,tl_box_top
  507.     mov ecx,tl_col_txt
  508.     or  ecx,0x80000000
  509.     lea edx,[txt_capt_cur]
  510.     int 0x40
  511.  
  512.     mov ebx,tl_box_left
  513.     shl ebx,16
  514.     add ebx,100*65536+3
  515.     add ebx,tl_box_top
  516.     lea edx,[txt_capt_otm]
  517.     int 0x40
  518.     @@:
  519.  
  520.     ;cycle to nodes
  521.     xor eax,eax
  522.     mov edx,tl_data_nodes
  523.     mov ecx,edx
  524.     add ecx,sizeof.TreeList
  525.  
  526.     ;*** яЁюяєёъ єчыют, ъюЄюЁ√х яЁюьюЄрэ√ ёъЁюыышэуюь ***
  527.     cmp tl_p_scrol,0 ;хёыш хёЄ№ єърчрЄхы№ эр ёъЁюыышэу
  528.     je .end_c1
  529.     mov esi,tl_p_scrol
  530.     cmp dword[esi+24],0 ;хёыш ёъЁюыышэу эр тхЁїє, т√їюфшь
  531.     je .end_c1
  532.       @@:
  533.         call tl_iterat_next
  534.         cmp edx,ecx
  535.         jle .end_draw
  536.         inc eax
  537.         cmp eax,dword[esi+24]
  538.         jge .end_c1
  539.         jmp @b
  540.     .end_c1:
  541.  
  542.     xor eax,eax
  543.     mov esi,tl_box_top
  544.     add esi,tl_box_height ;esi = coord bottom border
  545.     @@:
  546.       call tl_iterat_next
  547.       cmp edx,ecx
  548.       jle @f
  549.       call tl_draw_node
  550.       inc eax
  551.       jmp @b
  552.     @@:
  553.  
  554.     call tl_draw_cursor
  555.  
  556.     mov edi,tl_p_scrol ;Ёшёєхь фюўхЁэшщ ёъЁюыышэу
  557.     cmp edi,0          ;фы  Єюую ўЄю-с√ хую эх яЁш°ыюё№ ЁшёютрЄ№ т яюы№чютрЄхы№ёъющ яЁюуЁрььх
  558.     je .end_draw       ;хёыш эхЄ ёъЁюыышэур т√їюфшь
  559.     push dword edi
  560.     call scroll_bar_vertical.draw
  561.  
  562.     .end_draw:
  563.     popad
  564.   pop ebp
  565.   ret 4
  566.  
  567. ;input:
  568. ; ecx = pointer to 1 node struct
  569. ; edx = pointer to some node struct
  570. ; edi = pointer to 'TreeList' struct
  571. ;output:
  572. ; edx = pointer to next node struct
  573. align 4
  574. tl_iterat_next: ;яхЁхїюф эр ёыхфє∙шщ тшфшь√щ єчхы (яЁюяєёър  чръЁ√Є√х)
  575.   push bx
  576.   mov bl,0x7f
  577.   cmp byte[edx+3],1
  578.   jne @f
  579.     mov bl,byte[edx+2]
  580.   @@:
  581.  
  582.   cmp tl_tim_undo,0
  583.   je .else
  584.  
  585.   push eax
  586.   .beg0:
  587.     call tl_move_next
  588.     cmp edx,ecx
  589.     jle @f
  590.     call tl_node_not_vis ;яЁюяєёъ єфрыхээ√ї ш юЄьхэхээ√ї
  591.     cmp al,1
  592.     je .beg0
  593.     cmp bl,byte[edx+2] ;яЁюяєёъ чръЁ√Є√ї
  594.     jl .beg0
  595.   @@:
  596.   pop eax
  597.   pop bx
  598.   ret
  599.  
  600.   .else:
  601.     call tl_move_next
  602.     cmp edx,ecx
  603.     jle .endif
  604.     cmp dword[edx+16],0 ;td = 'time delete' -> яЁюяєёъ єфрыхээ√ї
  605.     jne .else
  606.     cmp bl,byte[edx+2] ;яЁюяєёъ чръЁ√Є√ї
  607.     jl .else
  608.   .endif:
  609.   pop bx
  610.   ret
  611.  
  612. ;input:
  613. ; ecx = pointer to 1 node struct
  614. ; edx = pointer to some node struct
  615. ; edi = pointer to 'TreeList' struct
  616. align 4
  617. tl_iterat_next_all: ;яхЁхїюф эр ёыхфє∙шщ тшфшь√щ єчхы (ш эр чръЁ√Є√х Єюцх)
  618.   cmp tl_tim_undo,0
  619.   je .else
  620.  
  621.   push eax
  622.   @@:
  623.     call tl_move_next
  624.     cmp edx,ecx
  625.     jle @f
  626.     call tl_node_not_vis
  627.     cmp al,1
  628.     je @b
  629.   @@:
  630.   pop eax
  631.   ret
  632.   .else:
  633.     call tl_move_next
  634.     cmp edx,ecx
  635.     jle .endif
  636.     cmp dword[edx+16],0 ;td -> time delete
  637.     jne .else
  638.   .endif:
  639.   ret
  640.  
  641. ;input:
  642. ; ecx = pointer to 1 node struct
  643. ; edx = pointer to some node struct
  644. ; edi = pointer to 'TreeList' struct
  645. align 4
  646. tl_iterat_perv: ;яхЁхїюф эр яЁхф√фє∙шщ тшфшь√щ єчхы (яЁюяєёър  чръЁ√Є√х)
  647.   push eax
  648.   cmp tl_tim_undo,0
  649.   je .beg1
  650.  
  651.   .beg0:
  652.     call tl_move_perv
  653.     cmp edx,ecx
  654.     jle @f
  655.     call tl_node_not_vis ;яЁюяєёъ єфрыхээ√ї ш юЄьхэхээ√ї
  656.     cmp al,1
  657.     je .beg0
  658.  
  659.   .beg1:
  660.     call tl_move_perv
  661.     cmp edx,ecx
  662.     jle @f
  663.     cmp dword[edx+16],0 ;td = 'time delete' -> яЁюяєёъ єфрыхээ√ї
  664.     jne .beg1
  665.  
  666.   @@:
  667.     call tl_move_max_clo_par
  668.   pop eax
  669.   ret
  670.  
  671.  
  672. ;input:
  673. ; edx = pointer to some node struct
  674. ; edi = pointer to 'TreeList' struct
  675. ;output:
  676. ; edx = pointer closed parent node with maximum level
  677. align 4
  678. tl_move_max_clo_par: ;эрїюфшЄ ЁюфшЄхы№ёъшщ чръЁ√Є√щ єчхы ьръёшьры№эюую єЁютэ 
  679.   push eax ebx
  680.   mov eax,edx
  681.   xor ebx,ebx
  682.   .beg:
  683.     call tl_move_par
  684.     cmp byte[edx+3],1 ;ЁюфшЄхы№ёъшщ єчхы чръЁ√Є ?
  685.     jne @f
  686.       mov eax,edx
  687.     @@:
  688.     cmp ebx,edx
  689.     je .end_f
  690.       mov ebx,edx
  691.     jmp .beg
  692.   .end_f:
  693.   mov edx,eax
  694.   pop ebx eax
  695.   ret
  696.  
  697. ;input:
  698. ; edx = pointer to some node struct
  699. ; edi = pointer to 'TreeList' struct
  700. ;output:
  701. ; edx = pointer to next node struct
  702. align 4
  703. tl_move_next:
  704.   mov edx,dword[edx+8]
  705.   imul edx,sizeof.TreeList
  706.   add edx,tl_data_nodes
  707.   ret
  708.  
  709. ;input:
  710. ; edx = pointer to some node struct
  711. ; edi = pointer to 'TreeList' struct
  712. ;output:
  713. ; edx = pointer to perv node struct
  714. align 4
  715. tl_move_perv:
  716.   mov edx,dword[edx+4]
  717.   imul edx,sizeof.TreeList
  718.   add edx,tl_data_nodes
  719.   ret
  720.  
  721. ;input:
  722. ; ecx =
  723. ; edx = pointer to some node struct
  724. ; edi = pointer to 'TreeList' struct
  725. ;output:
  726. ; edx = pointer to parent node struct
  727. align 4
  728. tl_move_par: ;яхЁхфтшурхьё  эр ЁюфшЄхы№ёъшщ єчхы, хёыш Єръюую эхЄ, Єю юёЄрты хь ёЄрЁюх чэрўхэшх єърчрЄхы 
  729.  cmp byte[edx+2],0
  730.  je .end_f ;єчхы 0-ую єЁютэ  эх ьюцхЄ с√Є№ фюўхЁэшь
  731.  push eax ebx esi
  732.  mov esi,edx ;copy node pointer (edx)
  733.  mov bl,byte[edx+2]
  734.  @@:
  735.    call tl_move_perv
  736.    cmp edx,ecx
  737.    jle @f ;тёх т√°х ёЄю ∙шх єчы√ эх ЁюфшЄхы№ёъшх
  738.    call tl_node_not_vis ;яЁюяєёъ єфрыхээ√ї ш юЄьхэхээ√ї
  739.    cmp al,1
  740.    je @b
  741.    cmp byte[edx+2],bl
  742.    jl .end_0 ;єфрўэю эр°ыш ЁюфшЄхы№ёъшщ єчхы
  743.    jmp @b
  744.  @@:
  745.    mov esi,ebx ;restore node pointer
  746.  .end_0:
  747.  pop esi ebx eax
  748.  .end_f:
  749.  ret
  750.  
  751. ;input:
  752. ; edx = pointer to symbol struct
  753. ; edi = pointer to 'TreeList' struct
  754. ;output:
  755. ; al = 1 if sumbol not visible
  756. ; (node[i].td+tim_Undo<=ch_tim && node[i].td) || (node[i].tc>ch_tim-tim_Undo)
  757. align 4
  758. tl_node_not_vis: ;яЁютхЁ хЄ тшфшь√щ ыш єърчрээ√щ єчхы ё єўхЄюь: фюсртыхэшщ, єфрыхэшщ, юЄьхэ фхщёЄтшщ
  759.   cmp dword[edx+16],0
  760.   je @f
  761.   mov eax,dword[edx+16] ;eax=node[i].td
  762.   add eax,tl_tim_undo
  763.   cmp eax,tl_ch_tim
  764.   jg @f
  765.     mov al,1
  766.     ret
  767.   @@:
  768.  
  769.   mov eax,tl_ch_tim
  770.   sub eax,tl_tim_undo
  771.   cmp dword[edx+12],eax ;tc -> time create
  772.   jle @f
  773.     mov al,1
  774.     ret
  775.   @@:
  776.   xor al,al
  777.   ret
  778.  
  779.  
  780. ;input:
  781. ; edi = pointer to TreeInfo struct
  782. ; esi = coord bottom border
  783. align 4
  784. tl_draw_cursor: ;Ёшёєхь ъєЁёюЁ эр ¤ъЁрэх
  785.   push eax ebx ecx edx esi
  786.     call tl_get_display_cur_pos ;eax = cursor pos in screen
  787.     cmp eax,0
  788.     jl .end_f ;ъєЁёюЁ эрїюфшЄё  т√°х юъэр, т юсырёЄш яЁюъЁєўхээющ ёъЁюыышэуюь
  789.  
  790.     cmp tl_data_img_sys,0 ;ёьюЄЁшь хёЄ№ ыш єърчрЄхы№ эр ърЁЄшэъє ёшёЄхьэ√ї шъюэюъ
  791.     jne @f
  792.       mov ebx,tl_box_left
  793.       shl ebx,16
  794.       mov bx,tl_img_cx
  795.       xor ecx,ecx
  796.       mov cx,tl_img_cy
  797.       imul ecx,eax
  798.       add ecx,tl_box_top
  799.       add cx,tl_capt_cy
  800.  
  801.       ;crop image if on the border
  802.       cmp esi,ecx ;хёыш ъєЁёюЁ тэшчє ш хую тююс∙х эх тшфэю
  803.       jl .end_f
  804.  
  805.       sub esi,ecx
  806.       shl ecx,16
  807.       mov cx,tl_img_cy
  808.       cmp si,tl_img_cy
  809.       jge .crop0
  810.         mov cx,si ;хёыш ъєЁёюЁ тшфхэ ўрёЄшўэю (яюяры эр эшцэ■■ уЁрэшЎє)
  811.       .crop0:
  812.  
  813.       mov edx,tl_col_txt
  814.       mov eax,13
  815.       int 0x40 ;Ёшёєхь яЁюёЄющ яЁ ьюєуюы№эшъ, Є.ъ. эхЄ ёшёЄхьэ√ї шъюэюъ
  816.       jmp .end_f
  817.     @@:
  818.       mov ebx,tl_data_img_sys
  819.       imul ax,tl_img_cy
  820.       mov edx,tl_box_left
  821.       shl edx,16
  822.       mov dx,ax
  823.       add edx,tl_box_top
  824.       add dx,tl_capt_cy
  825.  
  826.       mov ecx,tl_el_focus ;яЁютхЁ хь т Їюъєёх ¤ыхьхэЄ шыш эхЄ
  827.       cmp dword[ecx],edi
  828.       je .focus
  829.         xor eax,eax
  830.         xor ecx,ecx
  831.         mov cx,tl_img_cx
  832.         mov ax,tl_img_cy
  833.         imul eax,ecx
  834.         imul eax,4*3 ;4=icon index 3=rgb
  835.         add ebx,eax
  836.       .focus:
  837.  
  838.       mov cx,tl_img_cx
  839.       shl ecx,16
  840.       mov cx,tl_img_cy
  841.  
  842.       ;crop image if on the border
  843.       cmp si,dx ;хёыш ъєЁёюЁ тэшчє ш хую тююс∙х эх тшфэю
  844.       jl .end_f
  845.  
  846.       sub si,dx
  847.       cmp si,tl_img_cy
  848.       jge .crop1
  849.         mov cx,si ;хёыш ъєЁёюЁ тшфхэ ўрёЄшўэю (яюяры эр эшцэ■■ уЁрэшЎє)
  850.       .crop1:
  851.  
  852.       mov eax,7
  853.       int 0x40 ;Ёшёєхь шъюэъє ъєЁёюЁр
  854.     .end_f:
  855.   pop esi edx ecx ebx eax
  856.   ret
  857.  
  858. ;input:
  859. ; edi = pointer to TreeInfo struct
  860. ; esi = coord bottom border
  861. align 4
  862. tl_draw_null_cursor: ;ёЄшЁрхь ъєЁёюЁ эр ¤ъЁрэх
  863.   push eax ebx ecx edx esi
  864.     call tl_get_display_cur_pos ;eax = cursor pos in screen
  865.     cmp eax,0
  866.     jl .end_f ;ъєЁёюЁ эрїюфшЄё  т√°х юъэр, т юсырёЄш яЁюъЁєўхээющ ёъЁюыышэуюь
  867.  
  868.     mov ebx,tl_box_left
  869.     shl ebx,16
  870.     mov bx,tl_img_cx
  871.     xor ecx,ecx
  872.     mov cx,tl_img_cy
  873.     imul ecx,eax
  874.     add ecx,tl_box_top
  875.     add cx,tl_capt_cy
  876.  
  877.     ;crop image if on the border
  878.     cmp esi,ecx ;хёыш ъєЁёюЁ тэшчє ш хую тююс∙х эх тшфэю
  879.     jl .end_f
  880.  
  881.     sub esi,ecx
  882.     shl ecx,16
  883.     mov cx,tl_img_cy
  884.     cmp si,tl_img_cy
  885.     jge @f
  886.       mov cx,si ;хёыш ъєЁёюЁ тшфхэ ўрёЄшўэю (яюяры эр эшцэ■■ уЁрэшЎє)
  887.     @@:
  888.  
  889.     mov edx,tl_col_bkg
  890.     mov eax,13
  891.     int 0x40 ;Ёшёєхь яЁюёЄющ яЁ ьюєуюы№эшъ ё Їюэют√ь ЎтхЄюь
  892.  
  893.     .end_f:
  894.   pop esi edx ecx ebx eax
  895.   ret
  896.  
  897. ;input:
  898. ; edi = pointer to TreeInfo struct
  899. ;output:
  900. ; eax = index
  901. align 4
  902. tl_get_display_cur_pos: ;схЁхЄ яючшЎш■ ъєЁёюЁр, юЄэюёшЄхы№эю ¤ъЁрэр
  903.    mov eax,tl_cur_pos
  904.    cmp tl_p_scrol,0
  905.    je @f
  906.      push ebx
  907.        mov ebx,tl_p_scrol
  908.        mov ebx,dword[ebx+24]
  909.        sub eax,ebx ;юЄэшьрхь яючшЎш■ ёъЁюыышэур
  910.      pop ebx
  911.   @@:
  912.   ret
  913.  
  914. ;input:
  915. ; eax = node position
  916. ; edx = pointer to some node struct
  917. ; edi = pointer to 'TreeList' struct
  918. ; esi = coord of bottom border
  919. align 4
  920. tl_draw_node: ;ЁшёєхЄ єчхы ё: ърЁЄшэъющ, яюфяшё№■, шъюэъющ юЄъЁ√Єш /чръЁ√Єш  ш ышэш ьш ъ ЁюфшЄ. єчыє
  921.   push eax ebx ecx edx esi
  922.  
  923.     mov ebx,1 ;1 - ьхёЄю яюф ъєЁёюЁ ш яюф чэръ +,-
  924.     bt tl_style,2 ;tl_list_box_mode
  925.     jc @f
  926.       inc ebx ;+1 - ьхёЄю яюф чэръ +,-
  927.     @@:
  928.     add bl,byte[edx+2];get level
  929.     imul bx,tl_img_cx
  930.     add ebx,tl_box_left
  931.  
  932.     shl ebx,16
  933.     mov bx,tl_img_cx
  934.     xor ecx,ecx
  935.     mov cx,tl_img_cy
  936.     imul ecx,eax
  937.     add ecx,tl_box_top
  938.     add cx,tl_capt_cy
  939.  
  940.     ;crop image if on the border
  941.     cmp esi,ecx ;хёыш єчхы тэшчє ш хую тююс∙х эх тшфэю
  942.     jl .end_draw
  943.  
  944.     sub esi,ecx
  945.     shl ecx,16
  946.     mov cx,tl_img_cy
  947.     cmp si,tl_img_cy
  948.     jge @f
  949.       mov cx,si ;хёыш єчхы тшфхэ ўрёЄшўэю (яюяры эр эшцэ■■ уЁрэшЎє)
  950.       jmp .crop ;яЁюяєёърхь Ёшёютрэшх эрфяшёш, ъюЄюЁр  ёъюЁхх тёхую Єюцх т√ыхчхЄ чр эшцэ■■ уЁрэшЎє
  951.     @@:
  952.       call tl_draw_node_caption
  953.     .crop:
  954.     mov esi,ecx ;save ecx
  955.  
  956.     cmp tl_data_img,0
  957.     jne .draw_img_n
  958.     push edx
  959.       mov edx,tl_col_txt
  960.       mov eax,13
  961.       int 0x40 ;draw node rect
  962.     pop edx
  963.     jmp @f
  964.     .draw_img_n:
  965.     push ebx edx esi
  966.       xor esi,esi
  967.       mov si,word[edx] ;get icon type
  968.       mov edx,ebx
  969.       ror ecx,16
  970.       mov dx,cx
  971.       mov cx,bx
  972.       ror ecx,16
  973.       mov ebx,3 ;rgb = 3 bytes
  974.       imul bx,tl_img_cx
  975.       imul bx,tl_img_cy
  976.       imul ebx,esi ;esi = icon index
  977.       add ebx,tl_data_img
  978.  
  979.       mov eax,7
  980.       int 0x40 ;draw node icon '-'
  981.     pop esi edx ebx
  982.     @@:
  983.  
  984.     mov al,byte[edx+2] ;draw minus '-'
  985.     mov ecx,tl_data_nodes
  986.     add ecx,sizeof.TreeList
  987.  
  988.     mov ah,10 ;get icon index '+' or '-' ?
  989.     cmp byte[edx+3],1
  990.     jne .close
  991.       dec ah
  992.     .close:
  993.  
  994.     call tl_draw_node_icon_opn_clo ;Ёшёютрэшх шъюэъш юЄъЁ√Єюую шыш чръЁ√Єюую єчыр
  995.     bt tl_style,1
  996.     jae .end_draw
  997.       call tl_draw_node_icon_par_lin ;Ёшёютрэшх ышэшш ъ ЁюфшЄхы№ёъюьє ¤ыхьхэЄє
  998.       call tl_draw_node_icon_par_lin_up ;Ёшёютрэшх тхЁЄшъры№эющ ышэшш ъ ЁюфшЄхы№ёъюьє ¤ыхьхэЄє
  999.     .end_draw:
  1000.   pop esi edx ecx ebx eax
  1001.   ret
  1002.  
  1003. ;input:
  1004. ; ecx = pointer to 1 node struct
  1005. ; edx = pointer to some node struct
  1006. ;...
  1007. align 4
  1008. tl_draw_node_icon_opn_clo: ;ЁшёєхЄ шъюэъш юЄъЁ√Єюую шыш чръЁ√Єюую єчыр (юс√ўэю + шыш -)
  1009.   push eax ebx ecx edx esi
  1010.     inc al
  1011.     call tl_iterat_next_all ;get next visible item
  1012.     cmp edx,ecx
  1013.     jle @f
  1014.       mov ecx,esi ;load ecx
  1015.       cmp al,byte[edx+2]
  1016.       jne @f
  1017.       ror ebx,16
  1018.       sub bx,tl_img_cx
  1019.       ror ebx,16
  1020.       cmp tl_data_img_sys,0
  1021.       jne .draw_img_s
  1022.         mov edx,tl_col_txt
  1023.         mov eax,13
  1024.         int 0x40 ;draw minus rect, if not system icons
  1025.         jmp @f
  1026.       .draw_img_s:
  1027.       mov ecx,esi ;load ecx
  1028.       mov edx,ebx
  1029.       ror ecx,16
  1030.       mov dx,cx
  1031.       mov cx,bx
  1032.       ror ecx,16
  1033.       mov ebx,3 ;rgb = 3 bytes
  1034.       imul bx,tl_img_cx
  1035.       imul bx,tl_img_cy
  1036.       shr eax,8
  1037.       and eax,0xff
  1038.       imul ebx,eax ;eax = icon index
  1039.       add ebx,tl_data_img_sys
  1040.       mov eax,7
  1041.       int 0x40 ;draw minus icon '-'
  1042.     @@:
  1043.   pop esi edx ecx ebx eax
  1044.   ret
  1045.  
  1046. ;input:
  1047. ; al = єЁютхэ№ ¤ыхьхэЄр
  1048. ; ecx = pointer to 1 node struct
  1049. ; edx = pointer to some node struct
  1050. ;...
  1051. align 4
  1052. tl_draw_node_icon_par_lin: ;Ёшёютрэшх ышэшш ъ ЁюфшЄхы№ёъюьє ¤ыхьхэЄє
  1053.   cmp byte[edx+3],1
  1054.   je .close
  1055.   push eax ebx ecx edx esi
  1056.     cmp al,0
  1057.     je @f
  1058. ;    dec al
  1059. ;    call tl_iterat_perv ;get perv visible item
  1060.  
  1061.     call tl_iterat_next_all ;get next visible item
  1062.     cmp edx,ecx
  1063.     jle .line3 ;if end of list
  1064.       cmp al,byte[edx+2]
  1065.       jne .line3 ;jg ???
  1066.       mov eax,3 ;line in middle element
  1067.       jmp .line2
  1068.     .line3:
  1069.       mov eax,6 ;line in end element
  1070.     .line2:
  1071.  
  1072.       mov ecx,esi ;load ecx
  1073.       ror ebx,16
  1074.       sub bx,tl_img_cx
  1075.       ror ebx,16
  1076.       cmp tl_data_img_sys,0
  1077.       jne .draw_img_s
  1078.         mov edx,tl_col_txt
  1079.         mov eax,13
  1080.         int 0x40 ;draw minus rect, if not system icons
  1081.         jmp @f
  1082.       .draw_img_s:
  1083. ;      mov ecx,esi ;load ecx
  1084.       mov edx,ebx
  1085.       ror ecx,16
  1086.       mov dx,cx
  1087.       mov cx,bx
  1088.       ror ecx,16
  1089.       mov ebx,3 ;rgb = 3 bytes
  1090.       imul bx,tl_img_cx
  1091.       imul bx,tl_img_cy
  1092.  
  1093. ;      shr eax,8
  1094. ;      and eax,0xff
  1095.       imul ebx,eax ;eax = icon index
  1096.       add ebx,tl_data_img_sys
  1097.       mov eax,7
  1098.       int 0x40 ;draw line icon
  1099.     @@:
  1100.   pop esi edx ecx ebx eax
  1101.   .close:
  1102.   ret
  1103.  
  1104.  
  1105. ;input:
  1106. ; al = єЁютхэ№ ¤ыхьхэЄр
  1107. ; ecx = pointer to 1 node struct
  1108. ; edx = pointer to some node struct
  1109. ; edi = pointer to 'TreeList' struct
  1110. align 4
  1111. tl_draw_node_icon_par_lin_up:
  1112.   push eax ebx ecx edx
  1113.   push esi
  1114.     cmp tl_data_img_sys,0 ;if not image
  1115.     je @f
  1116.     cmp al,0
  1117.     je @f
  1118.  
  1119.     xor esi,esi ;т si сєфхь эрёўшЄ√трЄ№ ъюы-тю шъюэюъ, эєцэ√ї фы  яЁюЁшёютъш ышэшш
  1120. ;--- Ўшъы фы  т√ўшёыхэш  ъюыышўхёЄтр тхЁЄшъры№э√ї ышэшщ ---
  1121.     .cycle0:
  1122.       call tl_iterat_perv ;get perv visible item
  1123.       cmp edx,ecx
  1124.       jle .cycle1 ;if begin of list
  1125.  
  1126.       cmp byte[edx+2],al
  1127.       jle .cycle0end ;єЁютхэ№ тхЁїэхую ¤ыхьхэЄр эх ЄЁхсєхЄ яЁюЁшёютъш
  1128.       inc si
  1129.       jmp .cycle0
  1130.     .cycle0end:
  1131.       cmp si,0 ;si = ъюы-тю шъюэюъ ышэшш ъюЄюЁ√х эєцэю эрЁшёютрЄ№ ётхЁїє
  1132.       je @f
  1133.       shl esi,16
  1134.  
  1135.       pop ecx ;esi->ecx
  1136.       push ecx ;save esi
  1137.  
  1138.       ror ebx,16
  1139.       sub bx,tl_img_cx
  1140.       ror ebx,16
  1141.  
  1142.       mov edx,ebx
  1143.       ror ecx,16
  1144.       mov dx,cx
  1145.       mov cx,bx
  1146.       ror ecx,16
  1147.       mov cx,tl_img_cy ;restore size y (if crop)
  1148.       mov ebx,3 ;rgb = 3 bytes
  1149.       imul bx,tl_img_cx
  1150.       imul bx,tl_img_cy
  1151.       add ebx,tl_data_img_sys
  1152.  
  1153.       add esi,tl_box_top
  1154.       add si,tl_capt_cy ;si = тхЁїэ   уЁрэшЎр юъэр
  1155.       mov eax,7
  1156. ;--- Ўшъы фы  Ёшёютрэш  тхЁЄшъры№эющ ышэшш ---
  1157.       .cycle1:
  1158.       sub dx,tl_img_cy ;яюфэшьрхь ъююЁфшэрЄє y ттхЁї
  1159.       cmp dx,si
  1160.       jl @f
  1161.         cmp esi,0x10000
  1162.         jl @f
  1163.         int 0x40 ;draw line icon
  1164.         sub esi,0x10000 ;єьхэ№°рхь ёўхЄўшъ шъюэюъ
  1165.       jmp .cycle1
  1166.     @@:
  1167.   pop esi
  1168.   pop edx ecx ebx eax
  1169.   ret
  1170.  
  1171. ;input:
  1172. ; edi = pointer to TreeInfo struct
  1173. ;output:
  1174. ; eax = rows
  1175. align 4
  1176. tl_get_rows_count:
  1177.   push ecx edx
  1178.     mov eax,tl_box_height
  1179.     sub ax,tl_capt_cy
  1180.     xor ecx,ecx
  1181.     mov cx,tl_img_cy
  1182.     xor edx,edx
  1183.     div ecx
  1184.   pop edx ecx
  1185.   ret
  1186.  
  1187. ;input:
  1188. ; eax = node position
  1189. ; ebx = [ъююЁфшэрЄр яю юёш x]*65536 + [img_cx]
  1190. ; ecx = [ъююЁфшэрЄр яю юёш y]*65536 + [img_cy]
  1191. ; edx = pointer to some node struct
  1192. ; edi = pointer to TreeInfo struct
  1193. align 4
  1194. tl_draw_node_caption:
  1195.     push ebx ecx edx esi
  1196.  
  1197.     xor esi,esi
  1198.     mov si,tl_info_size
  1199.     cmp si,tl_info_capt_offs
  1200.     jle @f ;if caption size <= 0
  1201.  
  1202.     push eax
  1203.       call tl_get_node_index ;eax = node index
  1204.       imul esi,eax
  1205.     pop eax
  1206.       add si,tl_info_capt_offs
  1207.       add esi,dword[edi]
  1208.       mov edx,esi
  1209.  
  1210.       shr ebx,16
  1211.       add bx,tl_img_cx ;ёфтшурхь эрфяшё№ яю уюЁшчюэЄрыш --->
  1212.       add bx,3 ;юЄёЄєя
  1213.       ;bx = coord. x
  1214.       call tl_strlen ;eax = strlen
  1215.       call tl_get_draw_text_len
  1216.       mov cx,bx
  1217.       ror ecx,16
  1218.       mov ebx,ecx
  1219.       add bx,tl_img_cy ;т√Ёртэштшэшх яю эшцэхщ уЁрэшЎх шъюэъш
  1220.       sub bx,9 ;юЄэшьрхь т√ёюЄє ЄхъёЄр
  1221.       mov ecx,tl_col_txt
  1222.       and ecx,0xffffff
  1223. ;      or ecx,0x80000000 ;text is ASCIIZ
  1224.       mov eax,4
  1225.       int 0x40
  1226.     @@:
  1227.     pop esi edx ecx ebx
  1228.   ret
  1229.  
  1230. ;input:
  1231. ; eax = strlen
  1232. ; ebx = text coord x
  1233. ;output:
  1234. ; esi = text len
  1235. align 4
  1236. tl_get_draw_text_len:
  1237.   push eax ecx edx
  1238.     mov esi,eax ;схЁхь фышээє ёЄЁюъш
  1239.  
  1240.     mov eax,tl_box_left
  1241.     add eax,tl_box_width
  1242.     cmp eax,ebx
  1243.     jle .text_null ;хёыш яюфяшё№ яюыэюёЄ№■ тё  чр ¤ъЁрэюь
  1244.     sub eax,ebx
  1245.     xor edx,edx
  1246.     mov ecx,6 ;°шЁшэр ёшёЄхьэюую °ЁшЇЄр
  1247.     div ecx ;ёьюЄЁшь ёъюы№ъю ёшьтюыют ьюцхЄ яюьхёЄшЄ№ё  эр ¤ъЁрэх
  1248.  
  1249.     cmp esi,eax
  1250.     jl @f
  1251.       mov esi,eax ;хёыш фышээр ЄхъёЄр ьхэ№°х, ўхь тёх ьхёЄю яюф ёЄЁюъє
  1252.     jmp @f
  1253.     .text_null:
  1254.       xor esi,esi
  1255.     @@:
  1256.   pop edx ecx eax
  1257.   ret
  1258.  
  1259. ;input:
  1260. ; esi = pointer to string
  1261. ;output:
  1262. ; eax = strlen
  1263. align 4
  1264. tl_strlen:
  1265.   mov eax,esi
  1266.   @@:
  1267.     cmp byte[eax],0
  1268.     je @f
  1269.     inc eax
  1270.     jmp @b
  1271.   @@:
  1272.   sub eax,esi
  1273.   ret
  1274.  
  1275. ;input:
  1276. ;dword[ebp+ 8] - pointer to node info
  1277. ;dword[ebp+12] - options
  1278. ;dword[ebp+16] - pointer to 'TreeList' struct
  1279. align 4
  1280. tl_node_add: ;фюсртшЄ№ єчхы
  1281.   push ebp
  1282.   mov ebp,esp
  1283.   push eax ebx ecx edx edi
  1284.     mov edi,dword[ebp+16]
  1285.  
  1286.     call tl_info_set_undo
  1287.  
  1288.     mov ebx,sizeof.TreeList
  1289.     imul ebx,tl_info_max_count
  1290.     add ebx,tl_data_nodes
  1291. ;--
  1292.     call tl_get_cur_node_index ;eax=po_t
  1293.     imul eax,sizeof.TreeList
  1294.     add eax,tl_data_nodes
  1295.     mov edx,eax
  1296.     call tl_move_perv
  1297.     call tl_get_node_index ;eax = index of pointer [edx]
  1298. ;--
  1299.     mov edx,sizeof.TreeList
  1300.     shl edx,1
  1301.     add edx,tl_data_nodes
  1302.     @@: ;for(i=2;i<nodeMax;i++)
  1303.       cmp dword [edx+12],0
  1304.       jne .u0
  1305.       cmp dword [edx+16],0
  1306.       jne .u0
  1307.  
  1308.         inc  tl_ch_tim
  1309.         mov cx,word[ebp+14] ;get type
  1310.         mov word[edx],cx
  1311.  mov cl,byte[ebp+13]
  1312.  mov byte[edx+3],cl  ;node[i].clo
  1313.         mov   byte[edx+2], 0 ;node[i].lev=0
  1314.   bt tl_style,2 ;tl_list_box_mode
  1315.   jc .l_box_m
  1316.     mov cl,byte[ebp+12]
  1317.     mov byte[edx+2],cl  ;node[i].lev
  1318.   .l_box_m:
  1319.         push tl_ch_tim       ;node[i].tc=ch_tim;
  1320.         pop  dword[edx+12]
  1321.         mov  dword[edx+4], eax ;node[i].perv=po_t;
  1322.         ;*** copy node data ***
  1323.         push esi
  1324.         xor ecx,ecx
  1325.         mov cx,tl_info_size
  1326.         mov esi,ecx
  1327.  
  1328.         push eax
  1329.           call tl_get_node_index ;eax = node index
  1330.           imul esi,eax
  1331.         pop eax
  1332.         add esi,dword[edi]
  1333.         mov edi,dword[ebp+8] ;pointer to node data
  1334.         xchg edi,esi
  1335.         rep movsb
  1336.  
  1337.         mov esi,edi
  1338.         mov edi,dword[ebp+16] ;restore edi
  1339.         mov cx,tl_info_capt_offs
  1340.         cmp cx,tl_info_size
  1341.         jge .no_text_data
  1342.  cmp tl_info_capt_len,0 ;яЁютхЁ хь хёЄ№ ыш юуЁрэшўхэшх эр фышээє ёЄЁюъш
  1343.  je .no_len_ogran
  1344.    add cx,tl_info_capt_len
  1345.    and ecx,0xffff
  1346.    add esi,ecx
  1347.    mov cx,tl_info_size
  1348.    sub esi,ecx
  1349.  .no_len_ogran:
  1350.           dec esi
  1351.           mov byte[esi],0
  1352.         .no_text_data:
  1353.         pop esi ;restore esi
  1354.  
  1355.         mov ecx,eax
  1356.         imul ecx,sizeof.TreeList
  1357.         add ecx,tl_data_nodes ; *** ecx = node[po_t] ***
  1358.         add ecx,8   ; *** ecx = node[po_t].next ***
  1359.         push dword [ecx] ;node[i].next=node[po_t].next;
  1360.         pop dword [edx+8]
  1361.  
  1362.         call tl_get_node_index ;*** eax = i ***
  1363.         cmp eax,tl_info_max_count
  1364.         jge .u0
  1365.  
  1366.         mov [ecx],eax ;node[po_t].next=i; // ёё√ыъш яхЁхэряЁрты хь
  1367.         mov ecx,[edx+8] ; *** ecx = node[i].next ***
  1368.         imul ecx,sizeof.TreeList
  1369.         add ecx,tl_data_nodes ; *** ecx = node[node[i].next] ***
  1370.         mov [ecx+4],eax ;node[node[i].next].perv=i;
  1371.  
  1372.         call tb_scrol_resize ;юсЁрсюЄър ёъЁюыышэур
  1373.     jmp @f
  1374.       .u0:
  1375.       add edx,sizeof.TreeList
  1376.       cmp edx,ebx ;enf of node memory ?
  1377.       jle @b
  1378.     @@:
  1379.   pop edi edx ecx ebx eax
  1380.   pop ebp
  1381.   ret 12
  1382.  
  1383. ;input:
  1384. ; edi = pointer to TreeInfo struct
  1385. align 4
  1386. tb_scrol_resize:
  1387.   push eax ecx edx
  1388.   cmp tl_p_scrol,0 ;юсЁрсюЄър ёъЁюыышэур
  1389.   je @f
  1390.     call tl_get_node_count ;eax = node count
  1391.     mov ecx,eax
  1392.     call tl_get_rows_count
  1393.     cmp ecx,eax
  1394.     jg .ye_sb
  1395.       xor ecx,ecx
  1396.     .ye_sb:
  1397.  
  1398.     mov edx,tl_p_scrol
  1399.     mov dword[edx+20],eax ;+20 .cur_area
  1400.     mov dword[edx+16],ecx ;+16 .max_area
  1401.     push dword edx ;pointer to scroll struct
  1402.     call scroll_bar_vertical.draw
  1403.   @@:
  1404.   pop edx ecx eax
  1405. ret
  1406.  
  1407. ;input:
  1408. ;dword[ebp+ 8] - pointer to node info
  1409. ;dword[ebp+12] - pointer to 'TreeList' struct
  1410. align 4
  1411. tl_node_set_data:
  1412.   push ebp
  1413.   mov ebp,esp
  1414.   push eax ecx edx edi esi
  1415.     mov edi,dword[ebp+12]
  1416.     call tl_get_cur_node_index ;eax=po_t
  1417.     cmp eax,2
  1418.     jl @f
  1419.       xor ecx,ecx
  1420.       mov cx,tl_info_size
  1421.       imul eax,ecx
  1422.       add eax,dword[edi]
  1423.       mov edi,eax
  1424.       mov esi,dword[ebp+8] ;pointer to node data
  1425.       rep movsb
  1426.  
  1427.       mov esi,edi
  1428.       mov edi,dword[ebp+12] ;restore edi
  1429.       mov cx,tl_info_capt_offs
  1430.       cmp cx,tl_info_size
  1431.       jge .no_text_data
  1432.         mov ax,tl_info_capt_len ;яЁютхЁ хь хёЄ№ ыш юуЁрэшўхэшх эр фышээє ЄхъёЄр
  1433.         cmp ax,0
  1434.         je .no_limit
  1435.         add cx,ax ;cx = tl_info_capt_offs + tl_info_capt_len
  1436.         and ecx,0xffff
  1437.         xor eax,eax
  1438.         mov ax,tl_info_size
  1439.         cmp eax,ecx
  1440.         jl .no_limit ;яюы№чютрЄхы№ чрфры ёыш°ъюь сюы№°є■ фышээє ЄхъёЄр
  1441.         add esi,ecx
  1442.         sub esi,eax
  1443.         .no_limit:
  1444.           dec esi
  1445.           mov byte[esi],0 ;юсэєы хь яюёыхфэшщ ёшьтюы яюфяшёш, ўЄю-с√ эх уы■ўшыю хёыш яюы№чютрЄхы№ чрфры эхяЁртшы№эє■ ёЄЁєъЄєЁє
  1446.       .no_text_data:
  1447.  
  1448.     @@:
  1449.   pop esi edi edx ecx eax
  1450.   pop ebp
  1451.   ret 8
  1452.  
  1453. ;input:
  1454. ;dword[ebp+ 8] - pointer to 'TreeList' struct
  1455. align 4
  1456. tl_node_get_data: ;тч Є№ єърчрЄхы№ эр фрээ√х єчыр яюф ъєЁёюЁюь
  1457.   push ebp
  1458.   mov ebp,esp
  1459.   push eax ecx edi
  1460.     mov edi,dword[ebp+8]
  1461.     call tl_get_cur_node_index ;eax=po_t
  1462.     mov dword[ebp+8],0 ;if return 0 pointer
  1463.     cmp eax,2
  1464.     jl @f
  1465.       xor ecx,ecx
  1466.       mov cx,tl_info_size
  1467.       imul eax,ecx
  1468.       add eax,dword[edi]
  1469.       mov dword[ebp+8],eax ;return node data pointer
  1470.     @@:
  1471.   pop edi ecx eax
  1472.   pop ebp
  1473.   ret
  1474.  
  1475. ;input:
  1476. ;dword[ebp+ 8] - node index
  1477. ;dword[ebp+12] - pointer to 'TreeList' struct
  1478. align 4
  1479. tl_node_poi_get_info: ;тч Є№ єърчрЄхы№ эр ёЄЁєъЄєЁє єчыр т єърчрээющ яючшЎшш
  1480.   push ebp
  1481.   mov ebp,esp
  1482.   push eax ecx edx edi
  1483.     mov edi,dword[ebp+12]
  1484.     mov eax,dword[ebp+8]
  1485.  
  1486.     ;cycle to nodes
  1487.     mov edx,tl_data_nodes
  1488.     mov ecx,edx
  1489.     add ecx,sizeof.TreeList
  1490.     @@:
  1491.       call tl_iterat_next_all
  1492.       cmp edx,ecx
  1493.       jle @f
  1494.       dec eax
  1495.       cmp eax,0
  1496.       jg @b
  1497.       jmp .find
  1498.     @@:
  1499.       xor edx,edx
  1500.     .find:
  1501.     mov dword[ebp+12],edx
  1502.   pop edi edx ecx eax
  1503.   pop ebp
  1504.   ret 4
  1505.  
  1506. ;input:
  1507. ;dword[ebp+ 8] - node param struct
  1508. ;dword[ebp+12] - pointer to 'TreeList' struct
  1509. align 4
  1510. tl_node_poi_get_next_info: ;тч Є№ єърчрЄхы№ эр ёыхфє∙є■ ёЄЁєъЄєЁє єчыр
  1511.   push ebp
  1512.   mov ebp,esp
  1513.   push ecx edx edi
  1514.     mov edi,dword[ebp+12]
  1515.     mov edx,dword[ebp+8]
  1516.  
  1517.     mov ecx,tl_data_nodes
  1518.     add ecx,sizeof.TreeList
  1519.  
  1520.     call tl_iterat_next_all
  1521.     cmp edx,ecx
  1522.     jg @f
  1523.       xor edx,edx
  1524.     @@:
  1525.  
  1526.     mov dword[ebp+12],edx
  1527.   pop edi edx ecx
  1528.   pop ebp
  1529.   ret 4
  1530.  
  1531. ;input:
  1532. ;dword[ebp+ 8] - node param struct
  1533. ;dword[ebp+12] - pointer to 'TreeList' struct
  1534. align 4
  1535. tl_node_poi_get_data: ;тч Є№ єърчрЄхы№ эр фрээ√х єчыр
  1536.   push ebp
  1537.   mov ebp,esp
  1538.   push eax ecx edi
  1539.     mov edi,dword[ebp+12]
  1540.     mov edx,dword[ebp+8]
  1541.  
  1542.     mov dword[ebp+12],0
  1543.     call tl_get_node_index ;eax = node index
  1544.     cmp eax,2
  1545.     jl @f
  1546.       xor ecx,ecx
  1547.       mov cx,tl_info_size
  1548.       imul eax,ecx
  1549.       add eax,dword[edi]
  1550.       mov dword[ebp+12],eax ;return node data pointer
  1551.     @@:
  1552.   pop edi ecx eax
  1553.   pop ebp
  1554.   ret 4
  1555.  
  1556. ;input:
  1557. ; edi = pointer 'tl' struct
  1558. ;output:
  1559. ; eax = index of current node
  1560. align 4
  1561. tl_get_cur_node_index: ;схЁхЄ яючшЎш■ яюф ъєЁёюЁюь
  1562.   push ecx edx
  1563.     ;cycle to nodes
  1564.     xor eax,eax
  1565.     mov edx,tl_data_nodes
  1566.     mov ecx,edx
  1567.     add ecx,sizeof.TreeList
  1568.     @@:
  1569.       call tl_iterat_next
  1570.       cmp edx,ecx
  1571.       jle @f
  1572.       cmp eax,tl_cur_pos
  1573.       je @f
  1574.       inc eax
  1575.       jmp @b
  1576.     @@:
  1577.   mov eax,edx
  1578.   sub eax,tl_data_nodes
  1579.   xor edx,edx
  1580.   mov ecx,sizeof.TreeList
  1581.   div ecx
  1582.   pop edx ecx
  1583.   ret
  1584.  
  1585. ;input:
  1586. ; edx = pointer node memory
  1587. ; edi = pointer 'tl' struct
  1588. ;output:
  1589. ; eax = struct index of current node
  1590. align 4
  1591. tl_get_node_index: ;схЁхЄ яючшЎш■ єърчрээюую ёшьтюыр
  1592.   push ecx edx
  1593.   mov eax,edx
  1594.   sub eax,tl_data_nodes
  1595.   xor edx,edx
  1596.   mov ecx,sizeof.TreeList
  1597.   div ecx
  1598.   pop edx ecx
  1599.   ret
  1600.  
  1601. align 4
  1602. tl_node_delete: ;єфрышЄ№ єчхы
  1603.   push ebp
  1604.   mov ebp,esp
  1605.   push eax edx edi
  1606.     mov edi,dword[ebp+8]
  1607.     call tl_get_cur_node_index ;eax=po_t
  1608.     cmp eax,2
  1609.     jl @f
  1610.       imul eax,sizeof.TreeList
  1611.       add eax,tl_data_nodes
  1612.       mov edx,eax
  1613.       inc tl_ch_tim
  1614.       mov eax,tl_ch_tim
  1615.       mov dword[edx+16],eax
  1616.       call tb_scrol_resize ;юсЁрсюЄър ёъЁюыышэур
  1617.     @@:
  1618.   pop edi edx eax
  1619.   pop ebp
  1620.   ret 4
  1621.  
  1622. align 4
  1623. tl_cur_beg: ;яюёЄртшЄ№ ъєЁёюЁ эр яхЁт√щ єчхы
  1624.   push ebp
  1625.   mov ebp,esp
  1626.   push edi
  1627.     mov edi,dword[ebp+8]
  1628.     mov tl_cur_pos,0
  1629.     cmp tl_p_scrol,0
  1630.     je @f
  1631.       mov edi,tl_p_scrol
  1632.       mov dword[edi+24],0
  1633.       push dword edi
  1634.       mov edi,dword[ebp+8]
  1635.       call scroll_bar_vertical.draw
  1636.     @@:
  1637.   pop edi
  1638.  
  1639.   pop ebp
  1640.   ret 4
  1641.  
  1642. align 4
  1643. tl_cur_next: ;яхЁхэхёЄш ъєЁёюЁ эр 1 яючшЎш■ эшцх
  1644.   push ebp
  1645.   mov ebp,esp
  1646.   push eax ebx edi esi
  1647.     mov edi,dword[ebp+8]
  1648.     call tl_get_node_count ;eax = node count
  1649.     ;inc eax
  1650.     cmp tl_cur_pos,eax
  1651.     jge .no_redraw
  1652.       mov esi,tl_box_top
  1653.       add esi,tl_box_height ;esi = coord bottom border
  1654.       call tl_draw_null_cursor ;ёЄшЁрхь ъєЁёюЁ
  1655.       inc tl_cur_pos
  1656.  
  1657.     cmp tl_p_scrol,0 ;if not scrol struct
  1658.     je @f
  1659.     call tl_get_rows_count ;eax = rows count
  1660.     mov ebx,tl_p_scrol
  1661.     add eax,dword[ebx+24] ;.position +24
  1662.     cmp tl_cur_pos,eax
  1663.     jl @f
  1664.       inc dword[ebx+24] ;.position +24
  1665.       push dword ebx
  1666.       call scroll_bar_vertical.draw
  1667.  
  1668.       mov edi,dword[ebp+8] ;restore edi
  1669.       push dword edi
  1670.       call tl_draw ;яюыэр  яхЁхЁшёютър юъэр
  1671.       jmp .no_redraw
  1672.     @@:
  1673.       mov edi,dword[ebp+8] ;restore edi
  1674.       call tl_draw_cursor ;яхЁхЁшёютър ъєЁёюЁр
  1675.       call tl_draw_caption_cur_pos
  1676.     .no_redraw:
  1677.   pop esi edi ebx eax
  1678.   pop ebp
  1679.   ret 4
  1680.  
  1681.  
  1682. ;input:
  1683. ; edi = pointer 'tl' struct
  1684. ;output:
  1685. ; eax = struct index of current node
  1686. align 4
  1687. tl_get_node_count: ;схЁхЄ ўшёыю тёхї тшфшь√ї єчыют (эх ёўшЄр  чръЁ√Є√ї фюўхЁэшї)
  1688.   push ecx edx
  1689.     ;cycle to nodes
  1690.     xor eax,eax
  1691.     mov edx,tl_data_nodes
  1692.     mov ecx,edx
  1693.     add ecx,sizeof.TreeList
  1694.     @@:
  1695.       call tl_iterat_next
  1696.       cmp edx,ecx
  1697.       jle @f
  1698.       inc eax
  1699.       jmp @b
  1700.     @@:
  1701.   pop edx ecx
  1702.   ret
  1703.  
  1704. ;input:
  1705. ; edi = pointer 'tl' struct
  1706. ;output:
  1707. ; eax = struct index of current node
  1708. align 4
  1709. tl_get_node_count_all: ;схЁхЄ ўшёыю тёхї тшфшь√ї єчыют (ёўшЄр  чръЁ√Є√х фюўхЁэшх)
  1710.   push ecx edx
  1711.     ;cycle to nodes
  1712.     xor eax,eax
  1713.     mov edx,tl_data_nodes
  1714.     mov ecx,edx
  1715.     add ecx,sizeof.TreeList
  1716.     @@:
  1717.       call tl_iterat_next_all
  1718.       cmp edx,ecx
  1719.       jle @f
  1720.       inc eax
  1721.       jmp @b
  1722.     @@:
  1723.   pop edx ecx
  1724.   ret
  1725.  
  1726. align 4
  1727. tl_cur_perv: ;яхЁхэхёЄш ъєЁёюЁ эр 1 яючшЎш■ т√°х
  1728.   push ebp
  1729.   mov ebp,esp
  1730.   push eax edi esi
  1731.     mov edi,dword[ebp+8]
  1732.     cmp tl_cur_pos,0
  1733.     je .no_redraw
  1734.       mov esi,tl_box_top
  1735.       add esi,tl_box_height ;esi = coord bottom border
  1736.       call tl_draw_null_cursor ;ёЄшЁрхь ъєЁёюЁ
  1737.       dec tl_cur_pos ;фтшурхь ъєЁёюЁ ттхЁї
  1738.  
  1739.     cmp tl_p_scrol,0 ;хёыш хёЄ№ єърчрЄхы№ эр ёъЁюыышэу
  1740.     je @f
  1741.     mov eax,tl_p_scrol
  1742.     cmp dword[eax+24],0 ;хёыш ёъЁюыышэу эр тхЁїє, т√їюфшь
  1743.     je @f
  1744.     mov edi,tl_cur_pos
  1745.     cmp edi,dword[eax+24] ;хёыш ъєЁёюЁ є°хы т√°х ёъЁюыышэур, Єюуфр юяєёърхь ёъЁюыышэу
  1746.     jge @f
  1747.       dec dword[eax+24]
  1748.       push dword eax
  1749.       mov edi,dword[ebp+8]
  1750.       call scroll_bar_vertical.draw
  1751.       mov edi,dword[ebp+8] ;restore edi
  1752.       push dword edi
  1753.       call tl_draw ;яюыэр  яхЁхЁшёютър юъэр
  1754.       jmp .no_redraw
  1755.     @@:
  1756.       mov edi,dword[ebp+8] ;restore edi
  1757.       ;mov esi,tl_box_top
  1758.       ;add esi,tl_box_height ;esi = coord bottom border
  1759.       call tl_draw_cursor ;яхЁхЁшёютър ъєЁёюЁр
  1760.       call tl_draw_caption_cur_pos
  1761.     .no_redraw:
  1762.   pop esi edi eax
  1763.   pop ebp
  1764.   ret 4
  1765.  
  1766. align 4
  1767. tl_cur_page_up: ;яхЁхэхёЄш ъєЁёюЁ эр 1 ёЄЁрэшЎє т√°х
  1768.   push ebp
  1769.   mov ebp,esp
  1770.   push eax edi esi
  1771.     mov edi,dword[ebp+8]
  1772.  
  1773.     cmp tl_p_scrol,0 ;хёыш хёЄ№ єърчрЄхы№ эр ёъЁюыышэу
  1774.     je .no_redraw
  1775.  
  1776.     mov esi,tl_p_scrol
  1777.     call tl_get_rows_count ;eax = rows count
  1778.  
  1779.     cmp tl_cur_pos,0
  1780.     jne @f
  1781.     cmp dword[esi+24],0 ;хёыш ёъЁюыышэу эр тхЁїє, т√їюфшь
  1782.     jne @f
  1783.       jmp .no_redraw
  1784.     @@:
  1785.       cmp tl_cur_pos,eax ;яЁютхЁ хь яючшЎш■ ъєЁёюЁр ш ъюы-тю ёЄюъ эр ёЄЁрэшЎх
  1786.       jl @f ;хёыш ьхэ№°х, Єю яЁшЁртэштрхь ъ 0, ўЄю-с√ эх юЄэ Є№ сюы№°х ўхь эрфю
  1787.         sub tl_cur_pos,eax
  1788.         jmp .cursor
  1789.       @@:
  1790.         mov tl_cur_pos,0
  1791.       .cursor:
  1792.       cmp dword[esi+24],eax
  1793.       jl @f
  1794.         sub dword[esi+24],eax
  1795.         jmp .scroll
  1796.       @@:
  1797.         mov dword[esi+24],0
  1798.       .scroll:
  1799.       ;яхЁхЁшёютъш юъэр ш ёъЁюыышэур
  1800.       push dword edi
  1801.       call tl_draw ;draw window
  1802.       push dword esi
  1803.       call scroll_bar_vertical.draw
  1804.     .no_redraw:
  1805.   pop esi edi eax
  1806.   pop ebp
  1807.   ret 4
  1808.  
  1809. align 4
  1810. tl_cur_page_down: ;яхЁхэхёЄш ъєЁёюЁ эр 1 ёЄЁрэшЎє эшцх
  1811.   push ebp
  1812.   mov ebp,esp
  1813.   push eax ebx ecx edi esi
  1814. ;eax - ъюы-тю ёЄЁюъ эр ёЄЁрэшЎх
  1815. ;ebx - ьръё. яючшЎш  ъєЁёюЁр
  1816. ;ecx - ьръё. яючшЎш  ёъЁюыышэур
  1817.     mov edi,dword[ebp+8]
  1818.  
  1819.     cmp tl_p_scrol,0 ;хёыш хёЄ№ єърчрЄхы№ эр ёъЁюыышэу
  1820.     je .no_redraw
  1821.  
  1822.     mov esi,tl_p_scrol
  1823.     call tl_get_node_count ;eax = node count
  1824.     mov ebx,eax
  1825.     call tl_get_rows_count ;eax = rows count
  1826.  
  1827.     mov ecx,ebx
  1828.     inc ecx ;хёыш эшцэшщ єчхы тшфхэ эр яюыютшэє
  1829.     cmp ecx,eax ;if (ecx>eax) { ecx=ecx-eax } else { ecx=0 }
  1830.     jl @f
  1831.       sub ecx,eax ;єьхэ№°рхь ьръёшьры№эє■ яючшЎш■ ёъЁюыышэур, Єръ ўЄю-с√ с√ыш тшфэ√ яюёыхфэшх єчы√
  1832.       jmp .control
  1833.     @@:
  1834.       xor ecx,ecx ;ecx=0 - тёх єчы√ тырч Є т ¤ъЁрэ, ёъЁюыышэу эх эєцхэ
  1835.     .control:
  1836.  
  1837.     cmp tl_cur_pos,ebx ;ъєЁёюЁ тэшчє ?
  1838.     jl @f
  1839.     cmp dword[esi+24],ecx ;ёъЁюыышэу тэшчє ?
  1840.     jl @f
  1841.       jmp .no_redraw
  1842.     @@:
  1843.  
  1844.       add tl_cur_pos,eax ;яхЁхьх∙рхь ъєЁёюЁ
  1845.       cmp tl_cur_pos,ebx
  1846.       jl @f
  1847.         mov tl_cur_pos,ebx
  1848.       @@:
  1849.  
  1850.       add dword[esi+24],eax ;яхЁхьх∙рхь ёъЁюыышэу
  1851.       cmp dword[esi+24],ecx
  1852.       jl @f
  1853.         mov dword[esi+24],ecx
  1854.       @@:
  1855.  
  1856.       ;яхЁхЁшёютъш юъэр ш ёъЁюыышэур
  1857.       push dword edi
  1858.       call tl_draw ;draw window
  1859.       push dword esi
  1860.       call scroll_bar_vertical.draw
  1861.     .no_redraw:
  1862.   pop esi edi ecx ebx eax
  1863.   pop ebp
  1864.   ret 4
  1865.  
  1866. align 4
  1867. tl_node_close_open: ;юЄъЁ√Є№/чръЁ√Є№ єчхы (ЁрсюЄрхЄ ё єчырьш ъюЄюЁ√х шьх■Є фюўхЁэшх єчы√)
  1868.   push ebp
  1869.   mov ebp,esp
  1870.   push eax edx edi
  1871.     mov edi,dword[ebp+8]
  1872.     call tl_get_cur_node_index ;eax = яючшЎш  єчыр эр ъюЄюЁюь ёЄюшЄ ъєЁёюЁ
  1873.     cmp eax,2 ;ъєЁёюЁ ёЄюшЄ эр єчых ?
  1874.     jl @f
  1875.       imul eax,sizeof.TreeList
  1876.       add eax,tl_data_nodes
  1877.       ;eax = єърчрЄхы№ эр ёЄЁєъЄєЁє єчыр т√сЁрээюую ъєЁёюЁюь
  1878.       push dword edi
  1879.       push dword eax
  1880.       call tl_node_poi_get_next_info
  1881.       pop dword edx ;edx = єърчрЄхы№ эр ёЄЁєъЄєЁє єчыр ъюЄюЁ√щ шфхЄ яюёых єчыр eax
  1882.       cmp edx,0 ;хёЄ№ ыш єчы√ эшцх т√сЁрээюую эрьш ?
  1883.       je @f
  1884.         mov dl,byte[edx+2] ;схЁхь єЁютхэ№ эшцэхую єчыр
  1885.         cmp byte[eax+2],dl ;+2 = .lev
  1886.         jge @f ;хёыш эшцэшх єчы√ ьхэ№°хую єЁютэ , чэрўшЄ юэш эх фюўхЁэшх, ъюэхЎ ЇєэъЎшш
  1887.           xor byte[eax+3],1 ;+3 = .clo *** юЄъЁ√Єшх/чръЁ√Єшх єчыр ***
  1888.           call tb_scrol_resize ;юсЁрсюЄър ёъЁюыышэур
  1889.  
  1890.           push dword edi
  1891.           call tl_draw ;юсэютыхэшх юъэр
  1892.     @@:
  1893.   pop edi edx eax
  1894.   pop ebp
  1895.   ret 4
  1896.  
  1897. align 4
  1898. tl_node_lev_inc: ;єтхышўшЄ№ єЁютхэ№
  1899.   push ebp
  1900.   mov ebp,esp
  1901.   push eax ecx edx edi
  1902.     mov edi,dword[ebp+8]
  1903.     bt tl_style,2 ;tl_list_box_mode
  1904.     jc @f
  1905.     call tl_get_cur_node_index ;eax=po_t
  1906.     cmp eax,2
  1907.     jl @f
  1908.       mov ecx,tl_data_nodes
  1909.       imul eax,sizeof.TreeList
  1910.       add eax,ecx ;eax = pointer to some node struct
  1911.       add ecx,sizeof.TreeList ;ecx = pointer to 1 node struct
  1912.  
  1913.       mov edx,eax
  1914.       call tl_iterat_perv ;яЁютхЁ хь хёЄ№ ыш тхЁїэшщ єчхы
  1915.       cmp edx,ecx
  1916.       jle @f ;хёыш тхЁїэхую єчыр эхЄ Єю Єхъє∙шщ єчхы эх фтшурхь
  1917.       mov cl,byte[edx+2] ;схЁхь єЁютхэ№ ЁюфшЄхы№ёъюую єчыр
  1918.       inc cl ;фюсрты хь 1 ш яюыєўрхь ьръёшьры№эюх чэрўхэшх
  1919.       cmp byte[eax+2],cl
  1920.       jge @f
  1921.         inc byte[eax+2] ;єтхышўштрхь чэрўхэшх єчыр
  1922.     @@:
  1923.   pop edi edx ecx eax
  1924.   pop ebp
  1925.   ret 4
  1926.  
  1927. align 4
  1928. tl_node_lev_dec: ;єьхэ№°шЄ№ єЁютхэ№
  1929.   push ebp
  1930.   mov ebp,esp
  1931.   push eax edi
  1932.     mov edi,dword[ebp+8]
  1933.     call tl_get_cur_node_index ;eax=po_t
  1934.     cmp eax,2
  1935.     jl @f
  1936.       imul eax,sizeof.TreeList
  1937.       add eax,tl_data_nodes
  1938.       cmp byte[eax+2],0
  1939.       je @f
  1940.       dec byte[eax+2]
  1941.     @@:
  1942.   pop edi eax
  1943.   pop ebp
  1944.   ret 4
  1945.  
  1946. align 4
  1947. tl_node_move_up: ;яхЁхьх∙рхь єчхы ттхЁї
  1948.   push ebp
  1949.   mov ebp,esp
  1950.   push eax ebx ecx edx edi esi
  1951.     mov edi,dword[ebp+8]
  1952.     call tl_get_cur_node_index ;eax=po_t
  1953.     cmp eax,2
  1954.     jl @f
  1955.       mov ebx,eax ;copy index of node struct
  1956.       mov edx,tl_data_nodes
  1957.       mov ecx,edx
  1958.       add ecx,sizeof.TreeList
  1959.       imul eax,sizeof.TreeList
  1960.       add eax,edx ;eax = pointer to 2 node struct
  1961.       mov edx,eax ;edx = pointer to 2 node struct
  1962.       mov esi,eax ;esi = pointer to 2 node struct
  1963.       call tl_iterat_perv ;edx = pointer to 1 node struct
  1964.       call tl_get_node_index ;eax = index of 1 node struct
  1965.       cmp edx,ecx
  1966.       jle @f
  1967.         cmp dword[edx+8],ebx ;+8 next
  1968.         jne .po8
  1969.           call tl_node_move_po6 ;єчы√ шфєЄ яюфЁ ф ьхэ хь 6 ёё√ыюъ
  1970.           jmp .cur_mov
  1971.         .po8:
  1972.           call tl_node_move_po8 ;єчы√ шфєЄ эх яюфЁ ф ьхэ хь 8 ёё√ыюъ
  1973.         .cur_mov:
  1974.           push dword edi
  1975.           call tl_cur_perv
  1976.           push dword edi
  1977.           call tl_draw
  1978.     @@:
  1979.   pop esi edi edx ecx ebx eax
  1980.   pop ebp
  1981.   ret 4
  1982.  
  1983. align 4
  1984. tl_node_move_down: ;яхЁхьх∙рхь єчхы тэшч
  1985.   push ebp
  1986.   mov ebp,esp
  1987.   push eax ebx ecx edx edi esi
  1988.     mov edi,dword[ebp+8]
  1989.     call tl_get_cur_node_index ;eax=po_t
  1990.     cmp eax,2
  1991.     jl @f
  1992.       mov ebx,eax ;copy index of node struct
  1993.       mov edx,tl_data_nodes
  1994.       mov ecx,edx
  1995.       add ecx,sizeof.TreeList
  1996.       imul eax,sizeof.TreeList
  1997.       add eax,edx ;eax = pointer to 1 node struct
  1998.       mov edx,eax ;edx = pointer to 1 node struct
  1999.       mov esi,eax ;esi = pointer to 1 node struct
  2000.       call tl_iterat_next ;edx = pointer to 2 node struct
  2001.       call tl_get_node_index ;eax = index of 2 node struct
  2002.       cmp edx,ecx
  2003.       jle @f
  2004.         cmp dword[esi+8],eax ;+8 next
  2005.         jne .po8
  2006.           xchg eax,ebx ;ьхэ х яюЁ фюъ ёыхфютрэш  чрьхэ хь√ї єчыют
  2007.           xchg edx,esi
  2008.           call tl_node_move_po6 ;єчы√ шфєЄ яюфЁ ф ьхэ хь 6 ёё√ыюъ
  2009.           jmp .cur_mov
  2010.         .po8: ;р ЄєЄ яюЁ фюъ ёыхфютрэш  єчыют эх ьхэ хь
  2011.           call tl_node_move_po8 ;єчы√ шфєЄ эх яюфЁ ф ьхэ хь 8 ёё√ыюъ
  2012.         .cur_mov:
  2013.           push dword edi
  2014.           call tl_cur_next
  2015.           push dword edi
  2016.           call tl_draw
  2017.     @@:
  2018.   pop esi edi edx ecx ebx eax
  2019.   pop ebp
  2020.   ret 4
  2021.  
  2022. align 4
  2023. tl_node_move_po6:
  2024.   mov ecx,edx ;save node pointer
  2025.   call tl_move_perv
  2026.   mov dword[edx+8],ebx
  2027.  
  2028.   mov edx,esi
  2029.   call tl_move_next
  2030.   mov dword[edx+4],eax
  2031.   mov edx,ecx ;restore node pointer
  2032.  
  2033.   ;+4 perv
  2034.   mov ecx,dword[edx+4]
  2035.   mov dword[esi+4],ecx
  2036.   ;+8 next
  2037.   mov ecx,dword[esi+8]
  2038.   mov dword[edx+8],ecx
  2039.  
  2040.   mov dword[edx+4],ebx
  2041.   mov dword[esi+8],eax
  2042.   ret
  2043.  
  2044. ;input
  2045. ;eax = index 1 node struct
  2046. ;ebx = index 2 node struct
  2047. ;edx = pointer 1 node struct
  2048. ;esi = pointer 2 node struct
  2049. ;edi = pointer to 'TreeList' struct
  2050. ;output:
  2051. ;eax = ?
  2052. ;ebx = ?
  2053. ;ecx = ?
  2054. align 4
  2055. tl_node_move_po8:
  2056. ;  push ecx
  2057.   mov ecx,edx ;save node pointer
  2058.   call tl_move_perv
  2059.   mov dword[edx+8],ebx
  2060.   mov edx,ecx
  2061.   call tl_move_next
  2062.   mov dword[edx+4],ebx
  2063.   mov edx,esi
  2064.   call tl_move_perv
  2065.   mov dword[edx+8],eax
  2066.   mov edx,esi
  2067.   call tl_move_next
  2068.   mov dword[edx+4],eax
  2069.   mov edx,ecx ;restore node pointer
  2070. ;  pop ecx
  2071.  
  2072.   ;+4 perv
  2073.   mov eax,dword[edx+4]
  2074.   mov ebx,dword[esi+4]
  2075.   xchg eax,ebx
  2076.   mov dword[edx+4],eax
  2077.   mov dword[esi+4],ebx
  2078.   ;+8 next
  2079.   mov eax,dword[edx+8]
  2080.   mov ebx,dword[esi+8]
  2081.   xchg eax,ebx
  2082.   mov dword[edx+8],eax
  2083.   mov dword[esi+8],ebx
  2084.   ret
  2085.  
  2086. ;input:
  2087. ; edi = pointer to 'TreeList' struct
  2088. align 4
  2089. tl_draw_caption_cur_pos:
  2090.   cmp tl_capt_cy,9 ;9 - minimum caption height
  2091.   jl @f
  2092.   push eax ebx ecx edx edi esi
  2093.     mov ebx,edi ;calculate cursor position
  2094.     mov eax,tl_cur_pos
  2095.     inc eax
  2096.     lea edi,[txt_capt_cur]
  2097.     add edi,7
  2098.     call tl_convert_to_str
  2099.     mov edi,ebx
  2100.  
  2101.     mov eax,4 ;draw text captions
  2102.     mov ebx,tl_box_left
  2103.     shl ebx,16
  2104.     add ebx,5*65536+3
  2105.     add ebx,tl_box_top
  2106.     mov ecx,tl_col_txt
  2107.     or  ecx,0xc0000000 ;0x40000000 чръЁр°штрЄ№ Їюэ ЎтхЄюь edi
  2108.     lea edx,[txt_capt_cur]
  2109.     mov edi,tl_col_zag
  2110.     int 0x40
  2111.  
  2112.   pop esi edi edx ecx ebx eax
  2113.   @@:
  2114.   ret
  2115.  
  2116. ;input:
  2117. ;dword[ebp+ 8] - memory size
  2118. ;dword[ebp+12] - pointer to memory
  2119. ;dword[ebp+16] - options: 0 - first element, 1 - add next element
  2120. ;dword[ebp+20] - pointer to 'TreeList' struct
  2121. ;output:
  2122. ;dword[ebp+ 8] - error code
  2123. align 4
  2124. tl_save_mem:
  2125.   push ebp
  2126.   mov ebp,esp
  2127.     push eax ebx ecx edx edi esi
  2128.     mov esi,dword[ebp+12]
  2129.     mov edi,dword[ebp+20]
  2130.  
  2131.     cmp dword[ebp+16],0 ;add mode
  2132.     je @f
  2133.       push dword edi
  2134.       push dword esi
  2135.       call tl_get_mem_size ;схЁхь ЁрчьхЁ Ёрэхх ёюїЁрэ╕ээ√ї фрээ√ї
  2136.       pop ebx
  2137.       add esi,ebx
  2138.     @@:
  2139.  
  2140.     xor ebx,ebx
  2141.     mov bx,tl_info_size
  2142.  
  2143.     call tl_get_node_count_all ;eax = all node count
  2144.  
  2145.     mov ecx,eax  ;т√ўшёы хь ёъюы№ъю ярь Єш фюыцэю с√Є№ чряюыэхэю
  2146.     imul ecx,ebx ;єьэюцрхь эр ЁрчьхЁ ёЄЁєъЄєЁ√ єчыр
  2147.     add ecx,tl_save_load_heder_size+1 ;element header +1 end element sumbol
  2148.     add ecx,esi  ;фюсрты хь єърчрЄхы№ эр эрўрыю ярь Єш (ё єўхЄюь Ёрэхх чряшёрээ√ї ёЄЁєъЄєЁ)
  2149.     sub ecx,dword[ebp+12] ;юЄэшьрхь єърчрЄхы№ эр эрўрыю ярь Єш (схч Ёрэхх чряшёрээ√ї ёЄЁєъЄєЁ)
  2150.     cmp ecx,dword[ebp+8]  ;ecx = element memory size
  2151.     jg .err_mem_size
  2152.  
  2153.     ;save tree params (in header)
  2154.     mov dword[esi],'tree'
  2155.     mov word[esi+4],bx
  2156.     mov dword[esi+6],eax ;element count
  2157.  
  2158.     mov eax,tl_style
  2159.     mov dword[esi+10],eax
  2160.  
  2161.     mov eax,tl_cur_pos
  2162.     mov dword[esi+14],eax
  2163.  
  2164.     mov ax,tl_info_capt_offs
  2165.     mov word[esi+18],ax
  2166.  
  2167.     mov ax,tl_info_capt_len
  2168.     mov word[esi+20],ax
  2169.  
  2170.     ;copy scroll position
  2171.     mov edx,tl_p_scrol
  2172.     mov eax,dword[edx+24] ;+24 .position
  2173.     mov dword[esi+22],eax
  2174.  
  2175.     add esi,tl_save_load_heder_size ;add header size
  2176.  
  2177.     ;cycle to nodes
  2178.     mov edx,tl_data_nodes
  2179.     mov ecx,edx
  2180.     add ecx,sizeof.TreeList
  2181.     @@:
  2182.       call tl_iterat_next_all
  2183.       cmp edx,ecx
  2184.       jle @f
  2185. ;save node params
  2186. call tl_get_node_index ;eax = index of pointer [edx]
  2187. mov dword[esi],eax
  2188.  
  2189. add esi,4
  2190. mov eax,dword[edx] ;eax = (type; lev; clo)
  2191. mov dword[esi],eax
  2192. add esi,4
  2193.  
  2194. push dword edi
  2195. push dword edx
  2196. call tl_node_poi_get_data
  2197. pop dword eax
  2198.  
  2199. ;call tl_node_copy_data
  2200. push ecx edi
  2201.   mov edi,eax
  2202.   mov ecx,ebx
  2203.   xchg esi,edi
  2204.   rep movsb
  2205.   mov esi,edi
  2206. pop edi ecx
  2207. ;add esi,ebx
  2208.       jmp @b
  2209.     @@:
  2210.     mov byte[esi],0 ;end of 'treelist'
  2211.     mov dword[ebp+20],0 ;return error code
  2212.     jmp @f
  2213.       .err_mem_size:
  2214.       or dword[ebp+20],tl_err_save_memory_size
  2215.     @@:
  2216.     pop esi edi edx ecx ebx eax
  2217.   pop ebp
  2218.   ret 12
  2219.  
  2220. ;input:
  2221. ;dword[ebp+ 8] - memory size
  2222. ;dword[ebp+12] - pointer to memory
  2223. ;word[ebp+16] - options: element index
  2224. ;word[ebp+18] - options: 2*(add mode)+(init mode)
  2225. ;dword[ebp+20] - pointer to 'TreeList' struct
  2226. ;output:
  2227. ;dword[ebp+ 8] - error code
  2228. align 4
  2229. tl_load_mem:
  2230.   push ebp
  2231.   mov ebp,esp
  2232.     push eax ebx ecx edx edi esi
  2233.     mov esi,dword[ebp+12]
  2234.     mov edi,dword[ebp+20]
  2235.  
  2236.     mov dword[ebp+20],0 ;return error code
  2237.  
  2238.     xor ecx,ecx
  2239.     mov cx,word[ebp+16]
  2240.     cmp cx,0 ;load in array mode
  2241.     je @f
  2242. ;      push dword edi
  2243. ;      push dword esi
  2244. ;      call tl_get_mem_size ;схЁхь ЁрчьхЁ Ёрэхх ёюїЁрэ╕ээ√ї фрээ√ї
  2245. ;      pop ebx
  2246. ;      add esi,ebx
  2247.       .beg_cycle:
  2248.       cmp dword[esi],'tree'
  2249.       jne .no_tree
  2250.       xor ebx,ebx
  2251.       mov bx,word[esi+4]
  2252.       add bx,8
  2253.       imul ebx,dword[esi+6]
  2254.       add ebx,tl_save_load_heder_size
  2255.       add esi,ebx
  2256.       loop .beg_cycle
  2257.     @@:
  2258.  
  2259.     cmp dword[esi],'tree'
  2260.     jne .no_tree
  2261.       bt word[ebp+18],1 ;load in add mode
  2262.       jc @f
  2263.         push dword edi
  2264.         call tl_info_clear
  2265.       @@:
  2266.  
  2267.       xor ebx,ebx
  2268.       mov bx,word[esi+4] ;info_size
  2269.       cmp bx,tl_info_size
  2270.       je @f
  2271.         or dword[ebp+20],tl_err_load_info_size
  2272.       @@:
  2273.       mov ecx,dword[esi+6] ;count nodes
  2274.       cmp ecx,1
  2275.       jl .end_f
  2276.       mov edx,esi ;save header pointer
  2277.       add esi,tl_save_load_heder_size
  2278.  
  2279.       @@:
  2280. ;load node params
  2281. push dword edi
  2282. mov eax,dword[esi+4]
  2283. ror eax,16
  2284. push dword eax ;options (type; lev; clo)
  2285. add esi,8
  2286. push dword esi
  2287. call tl_node_add
  2288.  
  2289. push dword edi
  2290. call tl_cur_next
  2291. ;...
  2292. add esi,ebx
  2293.         loop @b
  2294.  
  2295.       bt word[ebp+18],1 ;load in add mode
  2296.       jc .no_tree
  2297.         mov eax,dword[edx+14] ;set cursor pos
  2298.         mov tl_cur_pos,eax
  2299.         mov eax,dword[edx+22] ;set scroll pos
  2300.         mov ebx,tl_p_scrol
  2301.         cmp ebx,0
  2302.         je .end_f
  2303.           mov dword[ebx+24],eax ;+24 .position
  2304.           push dword ebx ;pointer to scroll struct
  2305.           call scroll_bar_vertical.draw
  2306.  
  2307.       jmp .end_f
  2308.     .no_tree:
  2309.       mov dword[ebp+20],tl_err_load_caption
  2310.     .end_f:
  2311.     pop esi edi edx ecx ebx eax
  2312.   pop ebp
  2313.   ret 12
  2314.  
  2315. ;input:
  2316. ;dword[ebp+ 8] - pointer to memory
  2317. ;dword[ebp+12] - pointer to 'TreeList' struct
  2318. ;output:
  2319. ;dword[ebp+ 8] - error code
  2320. align 4
  2321. tl_get_mem_size: ;схЁхЄ ЁрчьхЁ ярь Єш чрэ Єющ ЇєэъЎшхщ tl_save_mem яЁш ёюїЁрэхэшш ¤ыхьхэЄют
  2322.   push ebp
  2323.   mov ebp,esp
  2324.     push ebx edi esi
  2325.     mov esi,dword[ebp+ 8]
  2326.     mov edi,dword[ebp+12]
  2327.     @@:
  2328.       cmp dword[esi],'tree'
  2329.       jne @f
  2330.       xor ebx,ebx
  2331.       mov bx,word[esi+4]
  2332.       add bx,8 ;ЁрчьхЁ фюяюыэшЄхы№эющ шэЇюЁьрЎшш юс єчых (шэфхъё чряшёш; шэфхъё шъюэъш, єЁютхэ№, ...)
  2333.       imul ebx,dword[esi+6]
  2334.       add ebx,tl_save_load_heder_size
  2335.       add esi,ebx
  2336.       jmp @b
  2337.     @@:
  2338.     sub esi,dword[ebp+ 8]
  2339.     mov dword[ebp+12],esi ;тючтЁр∙рхь ЁрчьхЁ сыюър ярь Єш
  2340.     pop esi edi edx
  2341.   pop ebp
  2342.   ret 4
  2343.  
  2344.  
  2345. ;ascii scan key
  2346. ;  13    28 Enter
  2347. ;  32    57 Space
  2348. ; 178    72 Up
  2349. ; 177    80 Down
  2350. ; 176    75 Left
  2351. ; 179    77 Right
  2352. ; 182    83 Delete
  2353. ; 184    73 Pg Up
  2354. ; 183    81 Pg Dn
  2355.  
  2356. tl_key_ascii db 13,32,178,177,176,179,182,184,183
  2357. tl_key_scan  db 28,57, 72, 80, 75, 77, 83, 73, 81
  2358.  
  2359. txt_capt_cur db 'Строка      ',0
  2360. txt_capt_otm db 'Отмены      ',0
  2361.  
  2362. ;¤ЄюЄ ъюф эх ьющ, юэ яЁхюсЁрчєхЄ ўшёыю т ёЄЁюъє
  2363. ;input:
  2364. ; eax = value
  2365. ; edi = string buffer
  2366. align 4
  2367. tl_convert_to_str:
  2368.   pushad
  2369.     mov dword[edi+1],0x20202020
  2370.     call .str
  2371.   popad
  2372.   ret
  2373.  
  2374. align 4
  2375. .str:
  2376.   mov ecx,0x0a ;чрфрхЄё  ёшёЄхьр ёўшёыхэш  шчьхэ ■Єё  ЁхушёЄЁ√ ebx,eax,ecx,edx тїюфэ√х ярЁрьхЄЁ√ eax - ўшёыю
  2377.     ;яЁхЁхтюф ўшёыр т ASCII ёЄЁюъє тчюфэ√х фрээ√х ecx=ёшёЄхьр ёўшёыхэ  edi рфЁхё ъєфр чряшё√трЄ№, сєфхь ёЄЁюъє, яЁшўхь ъюэхЎ яхЁхьхээющ
  2378.   cmp eax,ecx  ;ёЁртэшЄ№ хёыш т eax ьхэ№°х ўхь т ecx Єю яхЁхщЄш эр @@-1 Є.х. эр pop eax
  2379.   jb @f
  2380.   xor edx,edx  ;юўшёЄшЄ№ edx
  2381.   div ecx      ;ЁрчфхышЄ№ - юёЄрЄюъ т edx
  2382.   push edx     ;яюыюцшЄ№ т ёЄхъ
  2383.   ;dec edi             ;ёьх∙хэшх эхюсїюфшьюх фы  чряшёш ё ъюэЎр ёЄЁюъш
  2384.   call .str;яхЁхщЄш эр ёрьє ёхс  Є.х. т√чтрЄ№ ёрьє ёхс  ш Єръ фю Єюую ьюьхэЄр яюър т eax эх ёЄрэхЄ ьхэ№°х ўхь т ecx
  2385.   pop eax
  2386.   @@: ;cmp al,10 ;яЁютхЁшЄ№ эх ьхэ№°х ыш чэрўхэшх т al ўхь 10 (фы  ёшёЄхь√ ёўшёыхэ  10 фрээр  ъюьрэфр - ыш°эр ))
  2387.   ;sbb al,$69  ;- ўхёЄэю фрээр  шэёЄЁєъЎш  ьхэ  чрёЄрты хЄ чрфєьрЄ№ё  Є.х.   эх чэр■ ъръ ¤Єю ЁрсюЄрхЄ
  2388.   ;das        ;яюёых фрээющ ъюьрэф√ ъръ с√ яЁюшёїюфшЄ єьхэ№°хэшх al эр 66h  (т ъэшух эряшёрэю фЁєуюх)
  2389.   or al,0x30  ;фрээр  ъюьрэфр ъюЁюўх  ўхь фтх т√°х
  2390.   stosb       ;чряшёрЄ№ ¤ыхьхэЄ шч ЁхушёЄЁр al т  ўхъє ярь Єш es:edi
  2391.   ret         ;тхЁэєЄ№ё  ўхэ№ шэЄхЁхёэ√щ їюф Є.ъ. яюър т ёЄхъх їЁрэшЄ№ё  ъюы-тю т√чютют Єю ёЄюы№ъю Ёрч ь√ ш сєфхь т√ч√трЄ№ё 
  2392. }
  2393.