Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2.  
  3. BUF_STRUCT_SIZE equ 21
  4. buf2d_data equ dword[edi] ;¤ ­­ë¥ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  5. buf2d_w equ dword[edi+8] ;è¨à¨­  ¡ãä¥à 
  6. buf2d_h equ dword[edi+12] ;¢ëá®â  ¡ãä¥à 
  7. buf2d_l equ word[edi+4]
  8. buf2d_t equ word[edi+6] ;®âáâ㯠ᢥàåã
  9. buf2d_size_lt equ dword[edi+4] ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
  10. buf2d_color equ dword[edi+16] ;梥â ä®­  ¡ãä¥à 
  11. buf2d_bits equ byte[edi+20] ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
  12.  
  13. vox_offs_tree_table equ 4
  14. vox_offs_data equ 12
  15.  
  16. ;output:
  17. ; eax - (event shl 30) + position
  18. align 4
  19. proc get_mouse_ev_scale uses ebx ecx edx, h_br:dword, coord_x:dword, coord_y:dword, scale_obj:dword, scale_img:dword
  20.         mov ecx,[scale_obj]
  21.         stdcall [buf2d_vox_obj_get_img_h_3g], [h_br],ecx
  22.         cmp eax,[coord_y]
  23.         jle .test_x
  24.         stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
  25.         cmp eax,[coord_x]
  26.         jle .test_z
  27.  
  28.         .no_change:
  29.         xor eax,eax
  30.         jmp .end_f
  31.  
  32.         .test_x:
  33.         mov ebx,[h_br]
  34.         movzx ebx,byte[ebx+1]
  35.         add eax,ebx
  36.         cmp eax,[coord_y]
  37.         jl .no_change
  38.         stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
  39.         cmp eax,[coord_x]
  40.         jl .no_change
  41.         mov ebx,eax
  42.         mov ecx,[scale_img]
  43.         inc ecx
  44.         shr ebx,cl
  45.         xor edx,edx
  46.         mov eax,[coord_x]
  47.         div ebx
  48.         dec ecx
  49.         xor ebx,ebx
  50.         inc ebx
  51.         shl ebx,cl
  52.         cmp eax,ebx
  53.         jge @f
  54.                 or eax,1 shl 30
  55.                 jmp .end_f
  56.         @@:
  57.         sub eax,ebx
  58.         or eax,2 shl 30
  59.         jmp .end_f
  60.  
  61.         .test_z:
  62.         mov ebx,[h_br]
  63.         movzx ebx,byte[ebx]
  64.         add eax,ebx
  65.         cmp eax,[coord_x]
  66.         jl .no_change
  67.         mov ebx,[h_br]
  68.         movzx ebx,byte[ebx+1]
  69.         mov ecx,[scale_obj]
  70.         shl ebx,cl
  71.         mov ecx,[scale_img]
  72.         shr ebx,cl
  73.         mov eax,[coord_y]
  74.         xor edx,edx
  75.         div ebx
  76.         ;¨­¢¥àá¨ï ª®®à¤¨­ âë y
  77.         xor edx,edx
  78.         inc edx
  79.         shl edx,cl
  80.         dec edx
  81.         sub edx,eax
  82.         mov eax,edx
  83.         or eax,3 shl 30
  84.  
  85.         .end_f:
  86.         ret
  87. endp
  88.  
  89. ;
  90. ;x0y0 - x1y0
  91. ;x1y0 - x1y1
  92. ;x0y1 - x0y0
  93. ;x1y1 - x0y1
  94. align 4
  95. proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword
  96.         mov ebx,[v_obj]
  97.         add ebx,vox_offs_tree_table
  98.         mov ecx,2
  99.         cld
  100.         @@:
  101.                 mov eax,dword[ebx]
  102.                 mov byte[ebx+1],al
  103.                 mov byte[ebx+3],ah
  104.                 shr eax,16
  105.                 mov byte[ebx],al
  106.                 mov byte[ebx+2],ah
  107.                 add ebx,4
  108.                 loop @b
  109.         ret
  110. endp
  111.  
  112. ;
  113. ;y0z0 - y0z1
  114. ;y0z1 - y1z1
  115. ;y1z1 - y1z0
  116. ;y1z0 - y0z0
  117. align 4
  118. proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword
  119.         mov ebx,[v_obj]
  120.         add ebx,vox_offs_tree_table
  121.         mov eax,dword[ebx]
  122.         mov ecx,dword[ebx+4]
  123.  
  124.         mov byte[ebx+4],al
  125.         mov byte[ebx+5],ah
  126.         shr eax,16
  127.         mov byte[ebx+0],al
  128.         mov byte[ebx+1],ah
  129.  
  130.         mov byte[ebx+6],cl
  131.         mov byte[ebx+7],ch
  132.         shr ecx,16
  133.         mov byte[ebx+2],cl
  134.         mov byte[ebx+3],ch
  135.  
  136.         ret
  137. endp
  138.  
  139. ;
  140. ;output:
  141. ; eax - ç¨á«® 㧫®¢ ¢ ®¡ê¥ªâ¥ v_obj
  142. align 4
  143. proc vox_obj_get_nodes uses edi, v_obj:dword
  144.         mov edi,[v_obj]
  145.         add edi,vox_offs_data
  146.         xor eax,eax
  147.         stdcall vox_obj_rec0
  148.         ret
  149. endp
  150.  
  151. ;???
  152. ;input:
  153. ; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  154. ;output:
  155. ; eax - eax + ç¨á«® 㧫®¢ ¢ ¤ ­­ëå ¢®ªá. ®¡ê¥ªâ 
  156. ; edi - 㪠§ â¥«ì ­  ᬥ饭­ë¥ ¤ ­­ë¥ ¢®ªá. ®¡ê¥ªâ 
  157. align 4
  158. proc vox_obj_rec0
  159.         inc eax
  160.         cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
  161.         je .sub_trees
  162.  
  163.                 ;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
  164.                 push ebx ecx
  165.                 mov bh,byte[edi+3]
  166.                 add edi,4
  167.                 mov bl,8
  168.                 .cycle:
  169.                         bt bx,8 ;â¥áâ¨à㥬 ⮫쪮 bh
  170.                         jnc .c_next
  171.                                 stdcall vox_obj_rec0
  172.                         .c_next:
  173.                         shr bh,1
  174.                         dec bl
  175.                         jnz .cycle
  176.                 pop ecx ebx
  177.  
  178.                 jmp .end_f
  179.         .sub_trees:
  180.                 add edi,4
  181.         .end_f:
  182.         ret
  183. endp
  184.  
  185. ;
  186. ;output:
  187. ; eax - à §¬¥à ¢ ¡ ©â å § ­¨¬ ¥¬ë© ®¡ê¥ªâ®¬ v_obj
  188. align 4
  189. proc buf2d_vox_obj_get_size, v_obj:dword
  190.         stdcall vox_obj_get_nodes,[v_obj]
  191.         shl eax,2
  192.         add eax,vox_offs_data
  193.         ret
  194. endp
  195.  
  196. ; ᮧ¤ ­¨¥ ¢®ªá¥«ï ¢ 3 íâ ¯ :
  197. ; 1) ¨é¥¬ ¬¥áâ® ¢ áâàãªâãॠ¤¥à¥¢ , ªã¤  ­ ¤® ¢áâ ¢¨âì (¥á«¨ ¢¥â¢ì áãé¥áâ¢ã¥â, 2-© íâ ¯ ¯à®¯ã᪠¥¬)
  198. ; 2) ¢áâ ¢«ï¥¬ ­®¢ãî ¢¥â¢ì á ¢®ªá¥«¥¬ (3-© íâ ¯ 㦥 ­¥ ¤¥« ¥¬)
  199. ; 3) ¬¥­ï¥¬ 梥⠢®ªá¥«ï
  200. align 4
  201. proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
  202. coord_z:dword,k_scale:dword,color:dword
  203. pushad
  204. locals
  205.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  206. endl
  207.  
  208.         mov edi,[v_obj]
  209.         add edi,vox_offs_data
  210.         mov esi,[k_scale]
  211.         cmp esi,1
  212.         jl .change
  213.         ; *** (1) ***
  214.         .found:
  215.         stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
  216.         movzx bx,byte[edi+3]
  217.         mov [p_node],edi
  218.         add edi,4
  219.  
  220.         cmp eax,0
  221.         je .end_1
  222.         mov ecx,eax
  223.         cld
  224.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  225.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  226.                 jnc .end_0
  227.                         xor eax,eax
  228.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  229.                 .end_0:
  230.                 shr bx,1
  231.                 loop @b
  232.         .end_1:
  233.         bt bx,0
  234.         jnc .creat ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â, ¯¥à¥å®¤¨¬ ª ᮧ¤ ­¨î
  235.         dec esi
  236.         cmp esi,0
  237.         jg .found
  238.         jmp .change
  239.  
  240.         ; *** (2) ***
  241.         .creat:
  242.         mov edx,[color] ;¬¥­ï¥¬ 梥â
  243.         and edx,0xffffff ;¤«ï ¯à®ä¨« ªâ¨ª¨
  244.         mov ecx,esi
  245.         stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;à áè¨à塞 ¬¥áâ® § ­¨¬ ¥¬®¥ ®¡ê¥ªâ®¬, ¤«ï ¤®¡ ¢«¥­¨ï ­®¢ëå 㧫®¢
  246.         mov ebx,[p_node]
  247.         cld
  248.         @@:
  249.                 mov dword[edi],edx
  250.                 stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
  251.                 or byte[ebx+3],al
  252.  
  253.                 mov ebx,edi
  254.                 add edi,4
  255.                 dec esi
  256.                 loop @b
  257.         jmp .end_2
  258.  
  259.         ; *** (3) ***
  260.         .change:
  261.         mov eax,[color] ;¬¥­ï¥¬ 梥â
  262.         mov word[edi],ax
  263.         shr eax,16
  264.         mov byte[edi+2],al
  265.  
  266.         .end_2:
  267. popad
  268.         ret
  269. endp
  270.  
  271. ; 㤠«¥­¨¥ ¢®ªá¥«ï ¢ 2 íâ ¯ :
  272. ; 1) ¨é¥¬ ¬¥áâ® ¢ áâàãªâãॠ¤¥à¥¢ , £¤¥ ¥áâì 㤠«ï¥¬ë© 㧥« (¥á«¨ ¢¥â¢ì ­¥ áãé¥áâ¢ã¥â, ¢ë室¨¬ ¨§ ä㭪樨)
  273. ; 2) 㤠«ï¥¬ ¢¥â¢ì á ¢®ªá¥«¥¬
  274. align 4
  275. proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\
  276. coord_z:dword,k_scale:dword
  277. pushad
  278. locals
  279.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  280. endl
  281.         mov edi,[v_obj]
  282.         add edi,vox_offs_data
  283.         mov esi,[k_scale]
  284.         cmp esi,1
  285.         jl .end_2
  286.         ; *** (1) ***
  287.         .found:
  288.         stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
  289.         movzx bx,byte[edi+3]
  290.         mov [p_node],edi
  291.         add edi,4
  292.         cmp eax,0
  293.         je .end_1
  294.         mov ecx,eax
  295.         cld
  296.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  297.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  298.                 jnc .end_0
  299.                         xor eax,eax
  300.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  301.                 .end_0:
  302.                 shr bx,1
  303.                 loop @b
  304.         .end_1:
  305.         bt bx,0
  306.         jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
  307.         dec esi
  308.         cmp esi,0
  309.         jg .found
  310.  
  311.         ; *** (2) ***
  312.         ;delete
  313.         stdcall vox_obj_del_nodes_mem, [v_obj],edi ;á㦠¥¬ ¬¥áâ® § ­¨¬ ¥¬®¥ ®¡ê¥ªâ®¬, ¯à¨ 㤠«¥­¨¨ 㧫 
  314.         mov ebx,[p_node]
  315.  
  316.         stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
  317.         xor byte[ebx+3],al
  318.  
  319.         .end_2:
  320. popad
  321.         ret
  322. endp
  323.  
  324. ; ¢§ïâì 梥⠢®ªá¥«ï ¢ 2 íâ ¯ :
  325. ; 1) ¨é¥¬ ¬¥áâ® ¢ áâàãªâãॠ¤¥à¥¢ , £¤¥ ¥áâì 㧥« (¥á«¨ ¢¥â¢ì ­¥ áãé¥áâ¢ã¥â, ¢ë室¨¬ ¨§ ä㭪樨)
  326. ; 2) ¡¥à¥¬ 梥⠢®ªá¥«ï
  327. ;output:
  328. ; eax - 梥⠢®ªá¥«ï
  329. align 4
  330. proc buf2d_vox_obj_node_get_color, v_obj:dword,coord_x:dword,coord_y:dword,\
  331. coord_z:dword,k_scale:dword
  332. push ebx ecx edi esi
  333. locals
  334.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  335. endl
  336.         mov edi,[v_obj]
  337.         add edi,vox_offs_data
  338.         mov esi,[k_scale]
  339.         cmp esi,1
  340.         jl .end_2
  341.         ; *** (1) ***
  342.         .found:
  343.         stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
  344.         movzx bx,byte[edi+3]
  345.         mov [p_node],edi
  346.         add edi,4
  347.         cmp eax,0
  348.         je .end_1
  349.         mov ecx,eax
  350.         cld
  351.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  352.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  353.                 jnc .end_0
  354.                         xor eax,eax
  355.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  356.                 .end_0:
  357.                 shr bx,1
  358.                 loop @b
  359.         .end_1:
  360.         bt bx,0
  361.         jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
  362.         dec esi
  363.         cmp esi,0
  364.         jg .found
  365.  
  366.         ; *** (2) ***
  367.         ;get
  368.                 mov eax,dword[edi]
  369.                 and eax,0xffffff
  370.                 jmp .end_3
  371.         .end_2:
  372.                 mov eax,1 shl 31
  373.         .end_3:
  374. pop esi edi ecx ebx
  375.         ret
  376. endp
  377.  
  378. ; ᤢ¨£ ¥â ã§«ë ¤«ï ¤®¡ ¢«¥­¨ï ­®¢ëå 㧫®¢
  379. ;input:
  380. ; p_insert - ¯®§¨æ¨ï ¤«ï ¢áâ ¢ª¨
  381. ; count - ª®««¨ç¥á⢮ ¢áâ ¢«ï¥¬ëå 㧫®¢
  382. align 4
  383. proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
  384.         stdcall buf2d_vox_obj_get_size,[v_obj]
  385.         mov esi,[v_obj]
  386.         add esi,eax ;esi - 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
  387.         mov edi,[count]
  388.         shl edi,2
  389.         add edi,esi ;edi - 㪠§ â¥«ì ­  ¡ã¤ã騩 ª®­¥æ ä ©« 
  390.         mov ecx,esi
  391.         sub ecx,[p_insert]
  392.         shr ecx,2 ;ecx - ç¨á«® 横«®¢ ¤«ï ª®¯¨à®¢ ­¨ï
  393.         sub esi,4 ;esi - 㪠§ â¥«ì ­  ¯®á«¥¤­¨© 㧥«
  394.         sub edi,4 ;edi - 㪠§ â¥«ì ­  ¡ã¤ã騩 ¯®á«¥¤­¨© 㧥«
  395.         std
  396.         rep movsd ;ᤢ¨£ ¥¬ ¯ ¬ïâì
  397.         ret
  398. endp
  399.  
  400. ;input:
  401. ; p_insert - ¯®§¨æ¨ï ¤«ï ...
  402. align 4
  403. proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword
  404.         stdcall buf2d_vox_obj_get_size,[v_obj]
  405.         mov ecx,eax
  406.         mov edi,[p_insert]
  407.         add ecx,[v_obj]
  408.         sub ecx,edi
  409.         xor eax,eax
  410.         stdcall vox_obj_rec0
  411.         shr ecx,2
  412.         sub ecx,eax ;ecx - ç¨á«® 横«®¢ ¤«ï ª®¯¨à®¢ ­¨ï
  413.         shl eax,2
  414.         add eax,[p_insert]
  415.         mov esi,eax
  416.         mov edi,[p_insert]
  417.         cld
  418.         rep movsd ;ᤢ¨£ ¥¬ ¯ ¬ïâì
  419.         ret
  420. endp
  421.  
  422. ;???
  423. ; ®¯à¥¤¥«¥­¨¥ ¯®§¨æ¨¨ 㧫  ¢ ¤¥à¥¢¥ (®â 0 ¤® 7)
  424. align 4
  425. proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
  426. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  427.         mov ecx,[k_scale]
  428.         dec ecx
  429.         mov eax,[coord_x]
  430.         mov ebx,[coord_y]
  431.         mov edi,[coord_z]
  432.         cmp ecx,1
  433.         jl .end_0
  434.                 shr eax,cl
  435.                 shr ebx,cl
  436.                 shr edi,cl
  437.         .end_0:
  438.         and eax,1
  439.         bt ebx,0
  440.         jnc @f
  441.                 bts eax,1
  442.         @@:
  443.         bt edi,0
  444.         jnc @f
  445.                 bts eax,2
  446.         @@:
  447.  
  448.         mov edi,[v_obj]
  449.         add edi,vox_offs_tree_table
  450.         @@:
  451.                 cmp al,byte[edi]
  452.                 je @f
  453.                 inc edi
  454.                 jmp @b
  455.         @@:
  456.         sub edi,[v_obj]
  457.         sub edi,vox_offs_tree_table
  458.         mov eax,edi
  459.        
  460.         ret
  461. endp
  462.  
  463. ;output:
  464. ; eax - 1,2,4,8,16, ... ,128
  465. align 4
  466. proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
  467. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  468.         mov ecx,[k_scale]
  469.         dec ecx
  470.         mov eax,[coord_x]
  471.         mov ebx,[coord_y]
  472.         mov edi,[coord_z]
  473.         cmp ecx,1
  474.         jl .end_0
  475.                 shr eax,cl
  476.                 shr ebx,cl
  477.                 shr edi,cl
  478.         .end_0:
  479.         and eax,1
  480.         bt ebx,0
  481.         jnc @f
  482.                 bts eax,1
  483.         @@:
  484.         bt edi,0
  485.         jnc @f
  486.                 bts eax,2
  487.         @@:
  488.  
  489.         mov ecx,[v_obj]
  490.         add ecx,vox_offs_tree_table
  491.         @@:
  492.                 cmp al,byte[ecx]
  493.                 je @f
  494.                 inc ecx
  495.                 jmp @b
  496.         @@:
  497.         mov eax,1 ;ãáâ ­ ¢«¨¢ ¥¬ ¯¥à¢®­ ç «ì­®¥ §­ ç¥­¨¥ ¡¨â 
  498.         sub ecx,[v_obj]
  499.         sub ecx,vox_offs_tree_table
  500.         jz @f
  501.                 shl eax,cl ;ᤢ¨£ ¥¬ ¡¨â
  502.         @@:
  503.        
  504.         ret
  505. endp
  506.  
  507. ;äã­ªæ¨ï ¤«ï à¨á®¢ ­¨ï ¯ «¨âàë
  508. align 4
  509. proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\
  510. cell_w:dword, cell_h:dword, colors_w:dword, colors:dword
  511. pushad
  512.         mov ebx,[coord_x]
  513.         mov edx,[coord_y]
  514.         mov ecx,[colors]
  515.         xor edi,edi
  516.         mov esi,[cell_h]
  517.         cld
  518.         .cycle_0:
  519.                 stdcall get_palete_color, ecx,3
  520.                 stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax
  521.                 inc edi
  522.                 cmp edi,[colors_w]
  523.                 jl @f
  524.                         mov ebx,[coord_x]
  525.                         sub ebx,[cell_w]
  526.                         dec ebx
  527.                         add edx,esi ;¢ëá®â  ï祩ª¨
  528.                         inc edx ;®âáâ㯠¬¥¦¤ã ï祩ª ¬¨
  529.                         xor edi,edi
  530.                 @@:
  531.                 add ebx,[cell_w]
  532.                 inc ebx
  533.                 loop .cycle_0
  534. popad
  535.         ret
  536. endp
  537.  
  538. ;input:
  539. ; ¥á«¨ r = 1 â® äã­ªæ¨ï ¢®§¢à é ¥â 8 梥⮢, 2 - 64, 3 - 512
  540. ;output:
  541. ; eax - color
  542. align 4
  543. proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword
  544.         mov ecx,[r]
  545.         xor edi,edi
  546.         inc edi
  547.  
  548.         mov ebx,[ind]
  549.         ;b = b xor (b shr 1)
  550.         ;¯à¥®¡à §ã¥¬ ¨­¤¥ªá ¢ ª®¤¨à®¢ªã ƒà¥ï ¤«ï ¯®«ã祭¨ï ¡®«¥¥ ¯« ¢­ëå 梥⮢ëå ¯¥à¥å®¤®¢
  551.         mov eax,ebx
  552.         shr eax,1
  553.         xor ebx,eax
  554.  
  555.         mov edx,ebx
  556.         shr edx,cl
  557.         mov eax,edx
  558.         shr eax,cl
  559.  
  560.         mov ch,8
  561.         sub ch,cl
  562.         shr ecx,8
  563.         shl ebx,cl
  564.         shl edx,cl
  565.         shl eax,cl
  566.  
  567.         shl edi,cl
  568.         dec edi ;edi - 1...1b
  569.  
  570.         or ebx,edi
  571.         or edx,edi
  572.         or eax,edi
  573.  
  574.         shl eax,8
  575.         mov al,dl
  576.         shl eax,8
  577.         mov al,bl
  578.         and eax,0xffffff
  579.         ret
  580. endp
  581.  
  582.