Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; äã­ªæ¨ ¤«ï ᮧ¤ ­¨ï ᨣ­ «®¢
  3. ;
  4.  
  5. ;color_s0 - ᨣ­ « 0
  6. ;color_s1 - ᨣ­ « 1
  7. ;color_s2 - â®çª  ¡¥§ ¯¥à¥á¥ç¥­¨ï
  8. ;color_s3 - ¢à¥¬¥­­®¥ §­ ç¥­¨¥ ¤«ï á®åà ­¥­¨ï
  9.  
  10. size_sign equ 10
  11. sign_x equ 0
  12. sign_y equ 4
  13. sign_a equ 8
  14. sign_z equ 9
  15.  
  16. sign_data dd 0 ;㪠§ â¥«ì ­  ¬ áᨢ á® áâàãªâãà ¬¨ ᨣ­ «®¢
  17. sign_count dd 0 ;⥪ãé. ª®«. ᨣ­ «®¢
  18. sign_max dd 0 ;¬ ªá. ª®«. ᨣ­ «®¢
  19.  
  20. align 4
  21. proc sign_init uses eax ecx, m_count:dword
  22.         mov ecx,[m_count]
  23.         mov [sign_max],ecx
  24.         imul ecx,size_sign
  25.         stdcall mem.Alloc, ecx
  26.         mov [sign_data],eax
  27.         call sign_clear
  28.         ret
  29. endp
  30.  
  31. ;®ç¨á⪠ ¢á¥å ᨣ­ «®¢
  32. align 4
  33. proc sign_clear uses eax ecx edi
  34.         xor eax,eax
  35.         mov dword[time],eax
  36.         mov dword[sign_count],eax
  37.         mov ecx,[sign_max]
  38.         imul ecx,size_sign
  39.         mov edi,[sign_data]
  40.         cld
  41.         rep stosb
  42.         ret
  43. endp
  44.  
  45. ;®ç¨á⪠ ®¤­®£® ᨣ­ « 
  46. align 4
  47. proc sign_clear_one uses ecx edi esi, p_sign:dword
  48.         mov ecx,size_sign
  49.         mov esi,[sign_count]
  50.         dec esi
  51.         imul esi,ecx
  52.         add esi,[sign_data]
  53.         mov edi,[p_sign]
  54.         cld
  55.         rep movsb
  56.         dec dword[sign_count]
  57.         ret
  58. endp
  59.  
  60. ;®á¢®¡®¦¤¥­¨¥ ¯ ¬ï⨠§ ­ï⮩ ¬ áᨢ ¬¨ ¤«ï ᨣ­ «®¢
  61. align 4
  62. proc sign_delete
  63.         stdcall mem.Free, dword[sign_data]
  64.         ret
  65. endp
  66.  
  67. ;äã­ªæ¨ï ¤«ï ¯¥à¥¬¥é¥­¨ï ᨣ­ «®¢
  68. align 4
  69. proc sign_move
  70.         pushad
  71.         mov ecx,[sign_count]
  72.         cmp ecx,1
  73.         jl .end_f
  74.         mov esi,ecx
  75.         dec esi
  76.         imul esi,size_sign
  77.         add esi,[sign_data]
  78.         ;cld
  79.         .cycle_beg:
  80.                 mov eax,[esi+sign_x]
  81.                 mov ebx,[esi+sign_y]
  82.                 movzx edi,byte[esi+sign_a]
  83.                 movzx edx,byte[esi+sign_z]
  84.                 cmp edx,0
  85.                 je @f
  86.                         or edi,0x100
  87.                 @@:
  88.  
  89.                 ;¯ëâ ¥¬áï ᮧ¤ âì à §¢¥â¢«¥­¨¥ ᨣ­ « 
  90.                 stdcall move_rotate_n90, 0,-1,edi
  91.                 inc edi
  92.                 stdcall sign_creat,eax,ebx,edi
  93.  
  94.                 stdcall move_rotate_n90, -2,0,edi
  95.                 add edi,2
  96.                 stdcall sign_creat,eax,ebx,edi
  97.  
  98.                 mov eax,[esi+sign_x]
  99.                 mov ebx,[esi+sign_y]
  100.                 inc edi
  101.  
  102.                 mov eax,[esi+sign_x]
  103.                 mov ebx,[esi+sign_y]
  104.                 shl edx,2
  105.                 add edx,shem_colors
  106.                 stdcall draw_signal_rect, eax,ebx, dword[edx] ;à¨á㥬 ᨣ­ « ­  ¯®«¥
  107.  
  108.                 .move_1:
  109.                 stdcall move_rotate_x_n90, 1,edi
  110.  
  111.                 mov edi,eax
  112.                 stdcall pole_cell_find, pole, edi,ebx
  113.                 cmp eax,0
  114.                 jne @f
  115.                         stdcall sign_clear_one,esi ;㤠«¥­¨¥ ᨣ­ « , ¥á«¨ ®­ § è¥« ¢ â㯨ª
  116.                         jmp .cycle_next
  117.                 @@:
  118.                 imul eax,sizeof.Cell
  119.                 add eax,dword[cell]
  120.                 movzx edx,byte[esi+sign_z]
  121.  
  122.                 cmp byte[eax+offs_cell_liv],2
  123.                 jne @f
  124.                         ;¥á«¨ á⮨⠯¥à¥á¥ç¥­¨¥ ¯à®¢®¤®¢
  125.                         mov eax,edi
  126.                         movzx edi,byte[esi+sign_a]
  127.                         jmp .move_1
  128.                 @@:
  129.                 cmp byte[eax+offs_cell_liv],dl
  130.                 jne @f
  131.                         stdcall sign_clear_one,esi ;㤠«¥­¨¥ ᨣ­ « , ¥á«¨ ®­ ¯®¯ « ­  ®¡« áâì § ªà è¥­ãî ¤ ­­ë¬ 梥⮬
  132.                         jmp .cycle_next
  133.                 @@:
  134.                 mov byte[eax+offs_cell_liv],dl ;áâ ¢¨¬ ­  ¯®«¥ §­ ª ᨣ­ « 
  135.  
  136.                 mov [esi+sign_x],edi
  137.                 mov [esi+sign_y],ebx
  138.  
  139.                 .cycle_next:
  140.  
  141.                 sub esi,size_sign
  142.                 ;loop .cycle_beg
  143.                 dec ecx
  144.                 jnz .cycle_beg
  145.         ;stdcall [buf2d_draw], buf_0
  146.         .end_f:
  147.         popad
  148.         ret
  149. endp
  150.  
  151. align 4
  152. proc sign_creat uses eax ebx ecx edx edi esi, coord_x:dword, coord_y:dword, opt:dword
  153.         mov edi,[sign_count]
  154.         cmp edi,[sign_max]
  155.         jge .end_f
  156.         mov esi,[coord_x]
  157.         mov ebx,[coord_y]
  158.         .found:
  159.         stdcall pole_cell_find, pole, esi,ebx
  160.         cmp eax,0
  161.         je .end_f
  162.                 mov ecx,[opt]
  163.                 get_cell_offset edx,eax
  164.                 cmp byte[edx+offs_cell_liv],2
  165.                 jne @f
  166.                         mov eax,esi
  167.                         stdcall move_rotate_x_n90,1,ecx
  168.                         mov esi,eax
  169.                         jmp .found
  170.                 @@:
  171.                 cmp ch,byte[edx+offs_cell_liv] ;¯à®¢¥à塞 ­  ¯®«¥ §­ ª ᨣ­ « 
  172.                 je .end_f
  173.                 ;¤®¤¥« âì ãáâ ­®¢ªã ¬¥âª¨ ¢ ¯à®¢®¤, çâ®-¡ë ¨§¡¥¦ âì ¤ã¡«¨à®¢ ­¨ï ᨣ­ «®¢ ­  è¨à®ª¨å ¯à®¢®¤ å
  174.                 imul edi,size_sign
  175.                 add edi,[sign_data]
  176.                 mov [edi+sign_x],esi
  177.                 mov [edi+sign_y],ebx
  178.                 mov [edi+sign_a],cl
  179.                 mov [edi+sign_z],ch
  180.                 inc dword[sign_count]
  181.                 mov [edx+offs_cell_liv],ch ;áâ ¢¨¬ ­  ¯®«¥ §­ ª ᨣ­ « 
  182.                 ;stdcall draw_signal_rect, [coord_x],[coord_y], 0x800080
  183.         .end_f:
  184.         ret
  185. endp
  186.  
  187. ;description:
  188. ; ¯®¤äã­ªæ¨ï ¤«ï à¨á®¢ ­¨ï ᨣ­ «®¢ ­  á奬¥
  189. align 4
  190. proc draw_signal_rect uses eax ebx edi, x0:dword,y0:dword, color:dword
  191.         movzx edi,byte[zoom]
  192.         mov ebx,[y0]
  193.         mov eax,[x0]
  194.  
  195.         add ebx,[Cor_y]
  196.         imul ebx,edi
  197.         add eax,[Cor_x]
  198.         imul eax,edi
  199.  
  200.         stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx,edi,edi, dword[color]
  201.         ret
  202. endp
  203.  
  204. align 4
  205. proc sign_from_elems
  206. locals
  207.         s_inp dd ?
  208.         n_leg dd ?
  209. endl
  210.         pushad
  211.         mov edi,pole
  212.         ;*** ᮧ¤ ­¨¥ ᨣ­ «®¢ ¨§ «®£¨ç¥áª¨å í«¥¬¥­â®¢ ***
  213.         stdcall dword[tl_node_poi_get_info],0,tree1
  214.         pop esi
  215.         @@:
  216.                 cmp esi,0
  217.                 je @f
  218.                 cmp word[esi],el_icon_elems ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
  219.                 jne .end_add_p3
  220.                         stdcall [tl_node_poi_get_data], esi, tree1
  221.                         pop ecx
  222.  
  223.                         ;*** ¯à®¢¥àª  ᨣ­ «®¢ ­  ¢å®¤­ëå ­®£ å
  224.                         mov dword[s_inp],0
  225.                         mov dword[n_leg],0 ;word[n_leg] - ­®¬¥à ¢å®¤­®© ­®£¨
  226.                         mov edx,1
  227.                         .add_p1:
  228.                                 stdcall el_get_leg_coords, ecx,dword[n_leg]
  229.                                 test eax,eax
  230.                                 jnz .get1
  231.                                 test ebx,ebx
  232.                                 jnz .get1
  233.                                         jmp .end_add_p1 ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« 
  234.                                 .get1:
  235.                                 stdcall pole_cell_find, pole, eax,ebx
  236.                                 cmp eax,0
  237.                                 je .get2
  238.                                         imul eax,sizeof.Cell
  239.                                         add eax,pole_data
  240.                                         cmp byte[eax+offs_cell_liv],1
  241.                                         jne .get2
  242.                                         or dword[s_inp],edx
  243.                                 .get2:
  244.                                 inc dword[n_leg]
  245.                                 shl edx,1
  246.                                 jmp .add_p1
  247.                         .end_add_p1:
  248.  
  249.                         ;*** ®¯à¥¤¥«ï¥¬ ¢ë室­ãî ª®¬¡¨­ æ¨î ¡¨â®¢ ­  ®á­®¢¥ § ¤ ­­®© â ¡«¨æë à ¡®âë í«¥¬¥­â 
  250.                         movzx eax,byte[ecx+sp_offs_el_type]
  251.                         imul eax,size_el_opt
  252.                         add eax,el_opt_beg+el_offs_table
  253.                         mov ebx,[eax]
  254.                         add ebx,dword[s_inp]
  255.                         mov ebx,[ebx]
  256.                         mov dword[s_inp],ebx
  257.  
  258.                         ;*** ãáâ ­®¢ª  ᨣ­ «®¢ ­  ¢ë室­ëå ­®£ å
  259.                         mov dword[n_leg],(1 shl 16) ;word[n_leg] - ­®¬¥à ¢ë室­®© ­®£¨
  260.                         .add_p2:
  261.                                 stdcall el_get_leg_coords, ecx,dword[n_leg]
  262.                                 test eax,eax
  263.                                 jnz .get3
  264.                                 test ebx,ebx
  265.                                 jnz .get3
  266.                                         jmp .end_add_p2 ;¥á«¨ ª®®à¤¨­ âë ­¥ ¢§ï«¨áì (eax=0 && ebx=0), ¢ë室 ¨§ 横« 
  267.                                 .get3:
  268.                                 movzx edx,byte[ecx+8] ;dl - ­ ¯à ¢«¥­¨¥ ᨣ­ « 
  269.                                 bt dword[s_inp],0
  270.                                 jnc .set1
  271.                                         or edx,0x100 ;dh - §­ ç¥­¨¥ ᨣ­ «  0 ¨«¨ 1
  272.                                 .set1:
  273.                                 stdcall sign_creat,eax,ebx,edx
  274.                                 inc dword[n_leg]
  275.                                 shr dword[s_inp],1
  276.                                 jmp .add_p2
  277.                         .end_add_p2:
  278.  
  279.                 .end_add_p3:
  280.                 stdcall dword[tl_node_poi_get_next_info],esi,tree1
  281.                 pop esi ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
  282.                 jmp @b
  283.         @@:
  284.         popad
  285.         ret
  286. endp
  287.  
  288. ;ᮧ¤ ­¨¥ ᨣ­ «®¢ ­  ®á­®¢¥ ¯®¤¯¨á¥©
  289. align 4
  290. proc sign_from_captions
  291.         pushad
  292.         ;mov edi,pole
  293.         ;*** ᮧ¤ ­¨¥ ᨣ­ «®¢ ¨§ ¯®¤¯¨á¥© ***
  294.         stdcall dword[tl_node_poi_get_info],0,tree1
  295.         pop esi
  296.         @@:
  297.                 cmp esi,0
  298.                 je @f
  299.                 cmp word[esi],el_icon_captions ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
  300.                 jne .end_add_p3
  301.                         stdcall [tl_node_poi_get_data], esi, tree1
  302.                         pop ecx
  303.  
  304.                         cmp byte[ecx+8],'n'
  305.                         je .end_add_p3 ;¥á«¨ ­ ¤¯¨áì ¨­ä®à¬ æ¨®­­ ï, â® ­¥ ᮧ¤ ¥¬ ᨣ­ « 
  306.  
  307.                         ;xor edx,edx
  308.                         movzx edx,byte[ecx+9] ;¯¥à¢®­ ç «ì­®¥ ­ ¯à¢«¥­¨¥ ¢ë室­®£® ᨣ­ « 
  309.                         ;*** ®¯à¥¤¥«ï¥¬ ¢ë室®© ¡¨â,
  310.                         ;ª®â®àë© ¡ë« ãáâ ­®¢«¥­ ¢ but_set_0 ¨ but_set_1
  311.                         cmp byte[ecx+8],'o'
  312.                         jne .end_add_p1
  313.                                 or edx,0x100
  314.                         .end_add_p1:
  315.                         stdcall sign_creat,dword[ecx],dword[ecx+4],edx
  316.  
  317.                 .end_add_p3:
  318.                 stdcall dword[tl_node_poi_get_next_info],esi,tree1
  319.                 pop esi ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
  320.                 jmp @b
  321.         @@:
  322.         popad
  323.         ret
  324. endp
  325.  
  326. ; ¨§¬¥­ï¥¬ ¯¥à¢®­ ç «ì­®¥ ­ ¯à¢«¥­¨¥ ¢ë室­®£® ᨣ­ « 
  327. ; ¢ëáâ ¢«ïîâáï 2 ­ ¯à ¢«¥­¨ï: á«¥¢  ­  ¯à ¢®, á¯à ¢  ­  «¥¢®
  328. ; ®áâ «ì­ë¥ 2 ¢®§¬®¦­ëå ­ ¯à ¢«¥­¨ï ­¥ ãç¨â뢠îâáï,
  329. ; â. ª. ¯®¢®à®âë ᨣ­ «®¢ ¢®§¬®¦­ë ¨ ¡¥§ ­¨å
  330. align 4
  331. proc sign_set_captions_angles
  332.         pushad
  333.         mov edi,pole
  334.         stdcall dword[tl_node_poi_get_info],0,tree1
  335.         pop esi
  336.         .cycle0:
  337.                 cmp esi,0
  338.                 je .cycle0_end
  339.                 cmp word[esi],el_icon_captions ;¯®«ã祭¨¥ ç¥à¥§ esi ⨯ ¨ª®­ª¨
  340.                 jne .end_p0
  341.                         stdcall [tl_node_poi_get_data], esi, tree1
  342.                         pop ecx
  343.  
  344.                         mov ebx,[ecx] ;ebx = coord x
  345.                         xor edx,edx
  346.                         dec ebx
  347.                         stdcall pole_cell_find, edi, ebx,dword[ecx+4]
  348.                         cmp eax,0
  349.                         je @f
  350.                                 mov edx,2
  351.                                 ;jmp .set_angle
  352.                         @@:
  353.  
  354.                         ;.set_angle:
  355.                         mov byte[ecx+9],dl ;¯¥à¢®­ ç «ì­®¥ ­ ¯à¢«¥­¨¥ ¢ë室­®£® ᨣ­ « 
  356.                 .end_p0:
  357.                 stdcall dword[tl_node_poi_get_next_info],esi,tree1
  358.                 pop esi ;¯¥à¥å®¤¨¬ ª á«¥¤ã饬ã 㧫ã
  359.                 jmp .cycle0
  360.         .cycle0_end:
  361.         popad
  362.         ret
  363. endp
  364.