Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2.  nm_control_data_size          = 22
  3.  nm_redraw_all                 = 10000000b
  4.  nm_redraw_off                 = 01111111b
  5.  nm_special_redraw_on          = 100b
  6.  nm_special_redraw_off         = 11111011b
  7.  nm_integer_type               = 10b
  8.  nm_no_show_number             = 1b
  9.  
  10. ;****************************************************
  11. ;********************craete Number**********************
  12. ;****************************************************
  13. ;IN
  14. ;pointer to parend
  15. ;pointer to Number's structure
  16. ;OUT
  17. ;pointer to initialized Number's structure
  18. align 4
  19.  
  20. craete_number:
  21.  
  22.       mov ebx,[esp+4]
  23.       mov eax,[esp+8]
  24.  
  25.       mov [PointerToStructureForNumber],eax
  26.  
  27.       mov eax,control_header_size+nm_control_data_size
  28.       call craete_control
  29.  
  30.       ;set all image's parameters in control
  31.       mov [eax],dword number
  32.  
  33.       mov ecx,nm_control_data_size
  34.       mov esi,[PointerToStructureForNumber]
  35.       mov edi,eax
  36.       add edi,control_header_size
  37.       rep movsb
  38.  
  39.       call get_skin_height
  40.  
  41.       mov ebx,[PointerToStructureForNumber]
  42.       mov ecx,[ebx+6]   ;x
  43.       mov edx,[ebx+10]  ;y
  44.       add ecx,border_width
  45.       add edx,[skin_height]
  46.       ;copy information to control
  47.       mov [eax+24],ecx
  48.       mov [eax+28],edx
  49.  
  50.       ret 8
  51.  
  52. ;****************************************************
  53. ;********************Draw Number*********************
  54. ;****************************************************
  55. ;IN
  56. ;pointer to control of number
  57. ;message
  58. ;OUT
  59. ;not returned value
  60. align 4
  61.  
  62. number:
  63.  
  64.       ;get message
  65.       mov eax,[esp+8]
  66.  
  67.       ;get pointer to control of image
  68.       mov esi,[esp+4]
  69.       mov [PointerForNumber],esi
  70.       ;copy control to local control
  71.       add esi,control_header_size
  72.       mov edi,dword Number
  73.       mov ecx,nm_control_data_size
  74.       rep movsb
  75.  
  76.  
  77.       cmp [eax],dword 1
  78.       jne no_redraw_all_number
  79.  
  80.       xor ebx,ebx
  81.       mov bl,[Number.type]
  82.       and bl,nm_no_show_number
  83.       test bl,bl
  84.       jnz no_redraw_all_number
  85.  
  86.         or [Number.type],nm_redraw_all
  87.  
  88.       no_redraw_all_number:
  89.  
  90.       cmp [eax],dword 3
  91.       jne no_special_message_for_number
  92.  
  93.       xor ebx,ebx
  94.       mov bl,[Number.type]
  95.       and bl,nm_special_redraw_on
  96.       test bl,bl
  97.       jz no_special_message_for_number
  98.  
  99.         or [Number.type],nm_redraw_all
  100.         and [Number.type],nm_special_redraw_off
  101.  
  102.       no_special_message_for_number:
  103.  
  104.       cmp [eax],dword -1
  105.       jne no_destroy_control_of_number
  106.  
  107.          jmp exit_number
  108.       no_destroy_control_of_number:
  109.  
  110.       ;load coordinats and size from control
  111.       mov eax,[PointerForNumber]
  112.       mov ebx,[eax+24]           ;x
  113.       mov ecx,[eax+28]           ;y
  114.       ;set current coordinats and sizes in zakladka
  115.       mov [Number.x],ebx
  116.       mov [Number.y],ecx
  117.  
  118.       xor eax,eax
  119.       mov al,[Number.type]
  120.       and al,nm_redraw_all
  121.       test al,al
  122.       jz no_redraw_number_
  123.  
  124.        and [Number.type],nm_redraw_off
  125.  
  126.        mov esi,dword Number
  127.        mov edi,[PointerForNumber]
  128.        add edi,control_header_size
  129.        mov ecx,2
  130.        rep movsb
  131.  
  132.        ;get standart colors table
  133.        mov eax,48
  134.        mov ebx,3
  135.        mov ecx,dword pointer2
  136.        mov edx,40
  137.        mcall
  138.  
  139.        xor eax,eax
  140.        mov al,[Number.type]
  141.        and al,nm_integer_type
  142.        test al,al
  143.        jnz no_integer_number
  144.  
  145.          mov eax,47
  146.          mov ebx,[Number.parameters]
  147.          mov ecx,[Number.number]
  148.          mov edx,[Number.x]
  149.          shl edx,16
  150.          add edx,[Number.y]
  151.          mov esi,[Number.color]
  152.          mov edi,[pointer2+8]
  153.          mcall
  154.  
  155.          jmp no_redraw_number_
  156.        no_integer_number:
  157.       ;---------------------------------------
  158.  
  159.       mov ebx,[Number.parameters]
  160.       mov ecx,ebx
  161.       shr ebx,16      ;format for integer
  162.       and ecx,0xffff  ;format for float
  163.  
  164.       ;get integer part of float number
  165.       mov eax,1
  166.       mov edi,ecx
  167.       pow_10__:
  168.  
  169.         ;eax=eax*10
  170.         lea eax,[eax+eax*4]
  171.         shl eax,1
  172.  
  173.       dec edi
  174.       jnz pow_10__
  175.       mov edx,eax
  176.  
  177.       ;check for signum
  178.       mov [v2],0
  179.       fld [Number.number]
  180.       fcom [v2]
  181.       fstsw ax
  182.       sahf
  183.       jae no_signum_float_number
  184.  
  185.          fabs
  186.          mov [signum_float_number],byte 1
  187.  
  188.       no_signum_float_number:
  189.       fstp [Number.number]
  190.  
  191.       mov [v2],edx  ;v2=10^ecx
  192.       fild [v2]
  193.       fld [Number.number]
  194.       fmul st0,st1
  195.       fistp [v]
  196.       fstp st0
  197.  
  198.       mov esi,edx
  199.       mov eax,[v]
  200.       cdq
  201.       idiv esi
  202.       mov [v],eax
  203.  
  204.       and [integer_part],0
  205.       and [tochnost1],0
  206.  
  207.       ;save v in v2
  208.       mov eax,[v]
  209.       mov [v2],eax
  210.  
  211.       mov [Number.flag],0
  212.       mov esi,ebx
  213.       get_next_razryd_of_number_integer:
  214.  
  215.           mov eax,1
  216.  
  217.           mov edi,esi
  218.           pow_10_integer:
  219.  
  220.             ;eax=eax*10
  221.             lea eax,[eax+eax*4]
  222.             shl eax,1
  223.  
  224.           dec edi
  225.           jnz pow_10_integer
  226.  
  227.           mov edi,eax
  228.           mov eax,[v]
  229.           cdq
  230.           idiv edi
  231.           and eax,0xf
  232.  
  233.           test eax,eax
  234.           jz no_save_pos_for_integer
  235.  
  236.            cmp [Number.flag],0
  237.            jne no_save_pos_for_integer
  238.  
  239.               mov [Number.flag],1b
  240.               mov [tochnost1],esi
  241.               add [tochnost1],1
  242.  
  243.           no_save_pos_for_integer:
  244.  
  245.           imul eax,edi
  246.           sub [v],eax
  247.           add [integer_part],eax
  248.  
  249.       dec esi
  250.       jnz get_next_razryd_of_number_integer
  251.       mov eax,[v]
  252.       add [integer_part],eax
  253.  
  254.       cmp [tochnost1],0
  255.       jnz all_ok_with_tochnost
  256.  
  257.           mov [tochnost1],1
  258.       all_ok_with_tochnost:
  259.  
  260.       ;get float part of float number
  261.       mov eax,[v2]
  262.       mov [v],eax
  263.  
  264.       mov eax,1
  265.       mov edi,ecx
  266.       pow_10_float__:
  267.  
  268.         ;eax=eax*10
  269.         lea eax,[eax+eax*4]
  270.         shl eax,1
  271.  
  272.       dec edi
  273.       jnz pow_10_float__
  274.  
  275.       mov [v2],eax  ;v2=10^ecx
  276.  
  277.       fild [v2]
  278.       fild [v]
  279.       fld [Number.number]
  280.       fsub st0,st1
  281.       fmul st0,st2
  282.       fistp [v]
  283.       fstp st0
  284.       fstp st0
  285.  
  286.       and [float_part],0
  287.  
  288.       mov esi,ecx
  289.       get_next_razryd_of_number_float:
  290.  
  291.           mov eax,1
  292.  
  293.           mov edi,esi
  294.           pow_10_float:
  295.  
  296.             ;eax=eax*10
  297.             lea eax,[eax+eax*4]
  298.             shl eax,1
  299.  
  300.           dec edi
  301.           jnz pow_10_float
  302.  
  303.           mov edi,eax
  304.           mov eax,[v]
  305.           cdq
  306.           idiv edi
  307.           and eax,0xf
  308.           imul eax,edi
  309.           sub [v],eax
  310.           add [float_part],eax
  311.  
  312.       dec esi
  313.       jnz get_next_razryd_of_number_float
  314.       mov eax,[v]
  315.       add [float_part],eax
  316.  
  317.       mov [tochnost2],ecx
  318.       cmp [signum_float_number],byte 1
  319.       jne no_draw_signum_for_float_number
  320.  
  321.            ;draw signum
  322.            mov eax,4
  323.            mov ebx,[Number.x]
  324.            mov ecx,[Number.color]
  325.            mov edx,dword signum
  326.            mov esi,1
  327.            mov edi,[pointer2+8]
  328.            shl ebx,16
  329.            add ebx,[Number.y]
  330.            mcall
  331.  
  332.            add [Number.x],6
  333.            mov [signum_float_number],0
  334.       no_draw_signum_for_float_number:
  335.  
  336.       ;draw integer part of float number
  337.       mov eax,47
  338.       mov ebx,[tochnost1]
  339.       mov ecx,[integer_part]
  340.       mov edx,[Number.x]
  341.       mov esi,[Number.color]
  342.       mov edi,[pointer2+8]
  343.       shl edx,16
  344.       shl ebx,16
  345.       add edx,[Number.y]
  346.       mcall
  347.  
  348.       mov edx,[tochnost1]
  349.       add edx,1
  350.       lea edx,[edx+edx*2]
  351.       shl edx,1        ;edx=edx*6
  352.       add edx,[Number.x]
  353.       mov [x],edx
  354.  
  355.       ;draw float part of float number
  356.       mov eax,47
  357.       mov ebx,[tochnost2]
  358.       mov ecx,[float_part]
  359.       mov esi,[Number.color]
  360.       mov edi,[pointer2+8]
  361.       shl edx,16
  362.       shl ebx,16
  363.       add edx,[Number.y]
  364.       mcall
  365.  
  366.       ;draw point betwen integer part of number and float part of number
  367.       mov eax,4
  368.       mov ebx,[x]
  369.       mov ecx,[Number.color]
  370.       mov edx,dword point
  371.       mov esi,1
  372.       mov edi,[pointer2+8]
  373.       sub ebx,6
  374.       shl ebx,16
  375.       add ebx,[Number.y]
  376.       mcall
  377.  
  378.       no_redraw_number_:
  379.       ;-----------------------------------------
  380.  
  381.       exit_number:
  382.  
  383.       ret 8
  384.