Subversion Repositories Kolibri OS

Rev

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: ; метка конца программы