Subversion Repositories Kolibri OS

Rev

Rev 2317 | Blame | Last modification | View Log | Download | RSS feed

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