Rev 2254 | Rev 8271 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2162 | IgorA | 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 |
||
7674 | IgorA | 13 | org 0 |
2162 | IgorA | 14 | db 'MENUET01' |
7674 | IgorA | 15 | dd 1,start,i_end,e_end,e_end,0,sys_path |
2162 | IgorA | 16 | |
17 | include '../../../proc32.inc' |
||
18 | include '../../../macros.inc' |
||
7674 | IgorA | 19 | include '../../../KOSfuncs.inc' |
2162 | IgorA | 20 | include '../../../develop/libraries/box_lib/load_lib.mac' |
21 | include '../../../develop/libraries/box_lib/trunk/box_lib.mac' |
||
7674 | IgorA | 22 | include '../../../develop/info3ds/info_fun_float.inc' |
2162 | IgorA | 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 |
||
7674 | IgorA | 32 | cmp dword[ebp+ll_struc_size-4],0 |
2162 | IgorA | 33 | jz @f |
7674 | IgorA | 34 | mcall SF_TERMINATE_PROCESS |
2162 | IgorA | 35 | @@: |
7674 | IgorA | 36 | mcall SF_SET_EVENTS_MASK,0xC0000027 |
37 | mcall SF_STYLE_SETTINGS,SSF_GET_COLORS, sys_colors, sizeof.system_colors |
||
2162 | IgorA | 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: |
||
7674 | IgorA | 47 | mcall SF_WAIT_EVENT |
2162 | IgorA | 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 | |||
7674 | IgorA | 60 | align 4 |
2162 | IgorA | 61 | key: ; нажата клавиша на клавиатуре |
7674 | IgorA | 62 | mcall SF_GET_KEY |
2162 | IgorA | 63 | ;cmp ah,13 |
7674 | IgorA | 64 | stdcall [edit_box_key], edit1 |
2162 | IgorA | 65 | jmp still ; вернуться к началу цикла |
66 | |||
7674 | IgorA | 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] |
||
2162 | IgorA | 83 | |
7674 | IgorA | 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: |
||
2162 | IgorA | 91 | |
7674 | IgorA | 92 | mov esi,string1 |
93 | mov edi,Data_String |
||
94 | cld |
||
95 | mov ecx,32 |
||
96 | rep movsb |
||
2162 | IgorA | 97 | |
7674 | IgorA | 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 |
||
2162 | IgorA | 108 | |
7674 | IgorA | 109 | align 4 |
110 | mouse: |
||
111 | stdcall [edit_box_mouse], edit1 |
||
112 | stdcall [option_box_mouse], Option_boxes1 |
||
113 | jmp still |
||
2162 | IgorA | 114 | |
7674 | IgorA | 115 | ;------------------------------------------------ |
116 | align 4 |
||
117 | draw_window: |
||
118 | mcall SF_STYLE_SETTINGS,SSF_GET_COLORS, sys_colors, sizeof.system_colors |
||
2162 | IgorA | 119 | |
7674 | IgorA | 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 |
||
2162 | IgorA | 124 | |
7674 | IgorA | 125 | mcall SF_DEFINE_BUTTON, ((300-53) shl 16)+38, (145 shl 16)+15, 5, [sys_colors.work_button] ; кнопка Ok |
2162 | IgorA | 126 | |
7674 | IgorA | 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, |
||
2162 | IgorA | 134 | |
7674 | IgorA | 135 | mov ecx, 0x80000000 |
136 | or ecx, [sys_colors.work_button_text] |
||
137 | mcall , ((300-42) shl 16)+149, , Okstr,3 |
||
2162 | IgorA | 138 | |
7674 | IgorA | 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-ная |
||
2162 | IgorA | 145 | |
7674 | IgorA | 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 | @@: |
||
2162 | IgorA | 156 | |
7674 | IgorA | 157 | mov ecx,dword[Data_Double] |
158 | mcall SF_DRAW_NUMBER, (8 shl 16)+256,,(240 shl 16)+72,[sys_colors.work_text] ; 16-ная |
||
2162 | IgorA | 159 | |
7674 | IgorA | 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 | |||
2162 | IgorA | 182 | ;input: |
183 | ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде |
||
184 | ;output: |
||
185 | ; eax - число |
||
186 | align 4 |
||
7674 | IgorA | 187 | proc conv_str_to_int uses ebx ecx esi, buf:dword |
2162 | IgorA | 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 | ;------------------------------------------------- |
||
7674 | IgorA | 254 | title db 'string to double 20.08.19',0 |
2162 | IgorA | 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 | head_f_i: |
||
7674 | IgorA | 263 | head_f_l db '"Системная ошибка',0 |
264 | err_msg_found_lib_0 db 'Не найдена библиотека ',39,'box_lib.obj',39,'" -tE',0 |
||
265 | err_msg_import_0 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,'" -tW',0 |
||
2162 | IgorA | 266 | else |
267 | numstr db 'Number:',0 |
||
268 | Okstr db 'Ok',0 |
||
269 | head_f_i: |
||
7674 | IgorA | 270 | head_f_l db '"System error',0 |
271 | err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'box_lib.obj',39,'" -tE',0 |
||
272 | err_msg_import_0 db 'Error on load import library ',39,'box_lib',39,'" -tW',0 |
||
2162 | IgorA | 273 | end if |
274 | |||
275 | mouse_dd dd 0 |
||
276 | edit1 edit_box 182, 59, 146, 0xffffff, 0xff, 0x80ff, 0, 0x8000, (string1_end-string1), string1, mouse_dd, 0 |
||
277 | editboxes_end: |
||
278 | |||
279 | ;option_boxes |
||
280 | opt1 option_box option_group1, 15, 90, 8, 12, 0xffffff, 0x80ff, 0, op_text.1, 17 |
||
281 | opt2 option_box option_group1, 15, 106, 8, 12, 0xffffff, 0x80ff, 0, op_text.2, 18 |
||
282 | opt3 option_box option_group1, 15, 122, 8, 12, 0xffffff, 0x80ff, 0, op_text.3, 21 |
||
283 | |||
284 | op_text: ;текст для радио кнопок |
||
285 | .1 db 'str(dec) -> float' |
||
286 | .2 db 'str(dec) -> double' |
||
287 | .3 db 'float(dec,hex) -> str' |
||
288 | ;указатели для option_box |
||
289 | option_group1 dd opt1 |
||
290 | Option_boxes1 dd opt1, opt2, opt3, 0 |
||
291 | |||
292 | system_dir_0 db '/sys/lib/' |
||
293 | lib_name_0 db 'box_lib.obj',0 |
||
294 | |||
7674 | IgorA | 295 | |
2162 | IgorA | 296 | l_libs_start: |
297 | lib_0 l_libs lib_name_0, sys_path, library_path, system_dir_0,\ |
||
298 | err_msg_found_lib_0,head_f_l,import_box_lib,err_msg_import_0,head_f_i |
||
299 | l_libs_end: |
||
300 | |||
301 | align 4 |
||
302 | import_box_lib: |
||
303 | ;dd sz_init1 |
||
304 | edit_box_draw dd sz_edit_box_draw |
||
305 | edit_box_key dd sz_edit_box_key |
||
306 | edit_box_mouse dd sz_edit_box_mouse |
||
307 | ;edit_box_set_text dd sz_edit_box_set_text |
||
308 | option_box_draw dd aOption_box_draw |
||
309 | option_box_mouse dd aOption_box_mouse |
||
310 | ;version_op dd aVersion_op |
||
311 | dd 0,0 |
||
312 | ;sz_init1 db 'lib_init',0 |
||
313 | sz_edit_box_draw db 'edit_box',0 |
||
314 | sz_edit_box_key db 'edit_box_key',0 |
||
315 | sz_edit_box_mouse db 'edit_box_mouse',0 |
||
316 | ;sz_edit_box_set_text db 'edit_box_set_text',0 |
||
317 | aOption_box_draw db 'option_box_draw',0 |
||
318 | aOption_box_mouse db 'option_box_mouse',0 |
||
319 | ;aVersion_op db 'version_op',0 |
||
320 | |||
321 | i_end: |
||
322 | sys_colors system_colors |
||
7674 | IgorA | 323 | align 16 |
2162 | IgorA | 324 | sys_path rb 4096 |
325 | library_path rb 4096 |
||
7674 | IgorA | 326 | rb 0x400 ;stack |
2162 | IgorA | 327 | e_end: ; метка конца программы'a' |