Subversion Repositories Kolibri OS

Rev

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

  1. ; Программа для преобразования чисел из строки
  2. ;   в формат float, double, а также из 10 или 16 ричного
  3. ;   во float.
  4. ; Сделана на основе hex2dec2bin и примеров из файла list2_05.inc
  5. ;   (автор Кулаков Владимир Геннадьевич 24.05.2002),
  6. ;   которые ChE переделал с 16 на 32 бита на ассемблер fasm.
  7. ; Программа позволяет решать такие задачи:
  8. ; 1) число в строковом виде перевести в 4 байта (float) в машинный вид
  9. ; 2) число в строковом виде перевести в 8 байт (double) в машинный вид
  10. ; 3) число в машинном виде (float) перевести в строковый вид (5 знаков после запятой)
  11.  
  12. use32
  13.     org 0
  14.     db  'MENUET01'
  15.     dd  1,start,i_end,e_end,e_end,0,sys_path
  16.  
  17. include '../../../proc32.inc'
  18. include '../../../macros.inc'
  19. include '../../../KOSfuncs.inc'
  20. include '../../../load_lib.mac'
  21. include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
  22. include '../../../develop/info3ds/info_fun_float.inc'
  23. include 'lang.inc'
  24.  
  25. @use_library
  26.  
  27. align 4
  28. start:
  29.         load_libraries l_libs_start,l_libs_end
  30.         ;проверка на сколько удачно загузилась наша библиотека
  31.         mov     ebp,lib_0
  32.         cmp     dword[ebp+ll_struc_size-4],0
  33.         jz      @f
  34.                 mcall SF_TERMINATE_PROCESS
  35.         @@:
  36.         mcall SF_SET_EVENTS_MASK,0xC0000027
  37.         mcall SF_STYLE_SETTINGS,SSF_GET_COLORS, sys_colors, sizeof.system_colors
  38.         edit_boxes_set_sys_color edit1,editboxes_end,sys_colors
  39.         option_boxes_set_sys_color sys_colors,Option_boxes1
  40.  
  41. align 4
  42. red:
  43.     call draw_window
  44.  
  45. align 4
  46. still:
  47.     mcall SF_WAIT_EVENT
  48.  
  49.     cmp  eax,1          ; перерисовать окно ?
  50.     je   red            ; если да - на метку red
  51.     cmp  eax,2          ; нажата клавиша ?
  52.     je   key            ; если да - на key
  53.     cmp  eax,3          ; нажата кнопка ?
  54.     je   button         ; если да - на button
  55.     cmp  eax,6
  56.     je   mouse
  57.  
  58.     jmp  still          ; если другое событие - в начало цикла
  59.  
  60. align 4
  61. key: ; нажата клавиша на клавиатуре
  62.         mcall SF_GET_KEY
  63.         ;cmp ah,13
  64.         stdcall [edit_box_key], edit1
  65.         jmp  still ; вернуться к началу цикла
  66.  
  67. align 4
  68. button:
  69.         mcall SF_GET_BUTTON
  70.         cmp   ah, 1     ; если НЕ нажата кнопка с номером 1,
  71.         jne   @f
  72.                 mcall SF_TERMINATE_PROCESS
  73.         @@:
  74.         cmp ah, 5
  75.         jne @f
  76.                 cmp dword[option_group1],opt3
  77.                 jne .opt_3_end
  78.                         stdcall conv_str_to_int,[edit1.text]
  79.                         mov dword[Data_Double],eax
  80.                         finit
  81.                         fld dword[Data_Double]
  82.                         fstp qword[Data_Double]
  83.  
  84.                         ; Data_Double - преобразуемое число
  85.                         mov word[NumberSymbolsAD],8 ; количество знаков числа после запятой (1-17)
  86.                         call DoubleFloat_to_String
  87.                         call String_crop_0
  88.                         mov dword[Data_Double],eax ;восстанавливаем значение в формате float
  89.                         jmp .opt_all_end
  90.                 .opt_3_end:
  91.  
  92.                 mov esi,string1
  93.                 mov edi,Data_String
  94.                 cld
  95.                 mov ecx,32
  96.                 rep movsb
  97.  
  98.                 call String_to_DoubleFloat
  99.                 cmp dword[option_group1],opt1
  100.                 jne .opt_all_end ;если выбран float, то преобразуем из ранее полученного double
  101.                         finit
  102.                         fld  qword[Data_Double] ;читаем из double
  103.                         fstp dword[Data_Double] ;а возвращаем во float
  104.                 .opt_all_end:
  105.                 jmp red
  106.         @@:
  107.         jmp still
  108.  
  109. align 4
  110. mouse:
  111.         stdcall [edit_box_mouse], edit1
  112.         stdcall [option_box_mouse], Option_boxes1
  113.         jmp still
  114.  
  115. ;------------------------------------------------
  116. align 4
  117. draw_window:
  118.         mcall SF_STYLE_SETTINGS,SSF_GET_COLORS, sys_colors, sizeof.system_colors
  119.  
  120.         mcall SF_REDRAW,SSF_BEGIN_DRAW
  121.         mov edx, 0x14000000
  122.         or  edx, [sys_colors.work]
  123.         mcall SF_CREATE_WINDOW, (200 shl 16)+300, (200 shl 16)+175, ,,title
  124.  
  125.         mcall SF_DEFINE_BUTTON, ((300-53) shl 16)+38, (145 shl 16)+15, 5, [sys_colors.work_button] ; кнопка Ok
  126.  
  127.         mov ecx, 0x80000000
  128.         or  ecx, [sys_colors.work_text]
  129.         mcall SF_DRAW_TEXT, (15 shl 16) +30,, binstr,
  130.         mcall  , (15 shl 16) +58,, decstr,
  131.         mcall  , ((240-56*3) shl 16) +58,, Data_String,
  132.         mcall  , (15 shl 16) +72,, hexstr,
  133.         mcall  , (15 shl 16)+150,, numstr,
  134.  
  135.         mov ecx, 0x80000000
  136.         or  ecx, [sys_colors.work_button_text]
  137.         mcall  , ((300-42) shl 16)+149, , Okstr,3
  138.  
  139.         cmp dword[option_group1],opt1
  140.         je @f ;если выбран float, то старшие 4 байта (из double) не печатаем
  141.         cmp dword[option_group1],opt3
  142.         je @f ;если выбран float, то старшие 4 байта (из double) не печатаем
  143.                 mov ecx, dword[Data_Double+4]
  144.                 mcall  SF_DRAW_NUMBER, (8 shl 16)+256,,(185 shl 16)+72,[sys_colors.work_text]    ; 16-ная
  145.  
  146.                 mov ecx, dword[Data_Double+4]
  147.                 mcall    ,(8 shl 16)+512,,(240 shl 16)+30,        ; 2-ная
  148.                 ror ecx, 8
  149.                 mcall    ,,,((240-56) shl 16)+30,
  150.                 ror ecx, 8
  151.                 mcall    ,,,((240-56*2) shl 16)+30,
  152.                 ror ecx, 8
  153.                 mcall    ,,,((240-56*3) shl 16)+30,
  154.                 ror ecx, 8
  155.         @@:
  156.  
  157.         mov ecx,dword[Data_Double]
  158.         mcall  SF_DRAW_NUMBER, (8 shl 16)+256,,(240 shl 16)+72,[sys_colors.work_text]    ; 16-ная
  159.  
  160.         mov ecx,dword[Data_Double]
  161.         mcall    , (8 shl 16)+512,,(240 shl 16)+44,       ; 2-ная
  162.         ror ecx, 8
  163.         mcall    ,,,((240-56) shl 16)+44,
  164.         ror ecx, 8
  165.         mcall    ,,,((240-56*2) shl 16)+44,
  166.         ror ecx, 8
  167.         mcall    ,,,((240-56*3) shl 16)+44,
  168.         ror ecx, 8
  169.  
  170.         mcall SF_DRAW_LINE, (15 shl 16)+300-15, (137 shl 16)+137, [sys_colors.work_graph]
  171.         stdcall [edit_box_draw], edit1
  172.         stdcall [option_box_draw], Option_boxes1
  173.         mcall SF_REDRAW,SSF_END_DRAW
  174.  
  175. ret
  176.  
  177.  
  178. string1 db 32 dup (0)
  179. string1_end:
  180.  
  181.  
  182. ;input:
  183. ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
  184. ;output:
  185. ; eax - число
  186. align 4
  187. proc conv_str_to_int uses ebx ecx esi, buf:dword
  188.         xor eax,eax
  189.         xor ebx,ebx
  190.         mov esi,[buf]
  191.         ;определение отрицательных чисел
  192.         xor ecx,ecx
  193.         inc ecx
  194.         cmp byte[esi],'-'
  195.         jne @f
  196.                 dec ecx
  197.                 inc esi
  198.         @@:
  199.  
  200.         cmp word[esi],'0x'
  201.         je .load_digit_16
  202.  
  203.         .load_digit_10: ;считывание 10-тичных цифр
  204.                 mov bl,byte[esi]
  205.                 cmp bl,'0'
  206.                 jl @f
  207.                 cmp bl,'9'
  208.                 jg @f
  209.                         sub bl,'0'
  210.                         imul eax,10
  211.                         add eax,ebx
  212.                         inc esi
  213.                         jmp .load_digit_10
  214.         jmp @f
  215.  
  216.         .load_digit_16: ;считывание 16-ричных цифр
  217.                 add esi,2
  218.         .cycle_16:
  219.                 mov bl,byte[esi]
  220.                 cmp bl,'0'
  221.                 jl @f
  222.                 cmp bl,'f'
  223.                 jg @f
  224.                 cmp bl,'9'
  225.                 jle .us1
  226.                         cmp bl,'A'
  227.                         jl @f ;отсеиваем символы >'9' и <'A'
  228.                 .us1: ;составное условие
  229.                 cmp bl,'F'
  230.                 jle .us2
  231.                         cmp bl,'a'
  232.                         jl @f ;отсеиваем символы >'F' и <'a'
  233.                         sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
  234.                 .us2: ;составное условие
  235.                         sub bl,'0'
  236.                         cmp bl,9
  237.                         jle .cor1
  238.                                 sub bl,7 ;convert 'A' to '10'
  239.                         .cor1:
  240.                         shl eax,4
  241.                         add eax,ebx
  242.                         inc esi
  243.                         jmp .cycle_16
  244.         @@:
  245.         cmp ecx,0 ;если число отрицательное
  246.         jne @f
  247.                 sub ecx,eax
  248.                 mov eax,ecx
  249.         @@:
  250.         ret
  251. endp
  252.  
  253. ;-------------------------------------------------
  254. title db 'string to double 20.08.19',0
  255. hexstr db 'hex:',0
  256. decstr db 'dec:',0
  257. binstr db 'bin:',0
  258.  
  259. if lang eq ru
  260.         numstr db 'Число:',0
  261.         Okstr db 'Ввод',0
  262. else
  263.         numstr db 'Number:',0
  264.         Okstr db 'Ok',0
  265. end if
  266.  
  267. mouse_dd dd 0
  268. edit1 edit_box 182, 59, 146, 0xffffff, 0xff, 0x80ff, 0, 0x8000, (string1_end-string1), string1, mouse_dd, 0
  269. editboxes_end:
  270.  
  271. ;option_boxes
  272. opt1 option_box option_group1, 15,  90, 8, 12, 0xffffff, 0x80ff, 0, op_text.1, 17
  273. opt2 option_box option_group1, 15, 106, 8, 12, 0xffffff, 0x80ff, 0, op_text.2, 18
  274. opt3 option_box option_group1, 15, 122, 8, 12, 0xffffff, 0x80ff, 0, op_text.3, 21
  275.  
  276. op_text: ;текст для радио кнопок
  277.   .1 db 'str(dec) -> float'
  278.   .2 db 'str(dec) -> double'
  279.   .3 db 'float(dec,hex) -> str'
  280. ;указатели для option_box
  281. option_group1 dd opt1
  282. Option_boxes1 dd opt1, opt2, opt3, 0
  283.  
  284. system_dir_0 db '/sys/lib/'
  285. lib_name_0 db 'box_lib.obj',0
  286.  
  287.  
  288. l_libs_start:
  289.         lib_0 l_libs lib_name_0, library_path, system_dir_0,import_box_lib
  290. l_libs_end:
  291.  
  292. align 4
  293. import_box_lib:
  294.         ;dd sz_init1
  295.         edit_box_draw dd sz_edit_box_draw
  296.         edit_box_key dd sz_edit_box_key
  297.         edit_box_mouse dd sz_edit_box_mouse
  298.         ;edit_box_set_text dd sz_edit_box_set_text
  299.         option_box_draw dd aOption_box_draw
  300.         option_box_mouse dd aOption_box_mouse
  301.         ;version_op dd aVersion_op
  302. dd 0,0
  303.         ;sz_init1 db 'lib_init',0
  304.         sz_edit_box_draw db 'edit_box',0
  305.         sz_edit_box_key db 'edit_box_key',0
  306.         sz_edit_box_mouse db 'edit_box_mouse',0
  307.         ;sz_edit_box_set_text db 'edit_box_set_text',0
  308.         aOption_box_draw db 'option_box_draw',0
  309.         aOption_box_mouse db 'option_box_mouse',0
  310.         ;aVersion_op db 'version_op',0
  311.  
  312. i_end:
  313.         sys_colors system_colors
  314. align 16       
  315.         sys_path rb 4096
  316.         library_path rb 4096
  317.         rb 0x400 ;stack
  318. e_end: ; метка конца программы
  319.