kolibrios/programs/develop/libGUI/src/number.inc

384 lines
8.2 KiB
PHP
Raw Normal View History

nm_control_data_size = 22
nm_redraw_all = 10000000b
nm_redraw_off = 01111111b
nm_special_redraw_on = 100b
nm_special_redraw_off = 11111011b
nm_integer_type = 10b
nm_no_show_number = 1b
;****************************************************
;********************craete Number**********************
;****************************************************
;IN
;pointer to parend
;pointer to Number's structure
;OUT
;pointer to initialized Number's structure
align 4
craete_number:
mov ebx,[esp+4]
mov eax,[esp+8]
mov [PointerToStructureForNumber],eax
mov eax,control_header_size+nm_control_data_size
call craete_control
;set all image's parameters in control
mov [eax],dword number
mov ecx,nm_control_data_size
mov esi,[PointerToStructureForNumber]
mov edi,eax
add edi,control_header_size
rep movsb
call get_skin_height
mov ebx,[PointerToStructureForNumber]
mov ecx,[ebx+6] ;x
mov edx,[ebx+10] ;y
add ecx,border_width
add edx,[skin_height]
;copy information to control
mov [eax+24],ecx
mov [eax+28],edx
ret 8
;****************************************************
;********************Draw Number*********************
;****************************************************
;IN
;pointer to control of number
;message
;OUT
;not returned value
align 4
number:
;get message
mov eax,[esp+8]
;get pointer to control of image
mov esi,[esp+4]
mov [PointerForNumber],esi
;copy control to local control
add esi,control_header_size
mov edi,dword Number
mov ecx,nm_control_data_size
rep movsb
cmp [eax],dword 1
jne no_redraw_all_number
xor ebx,ebx
mov bl,[Number.type]
and bl,nm_no_show_number
test bl,bl
jnz no_redraw_all_number
or [Number.type],nm_redraw_all
no_redraw_all_number:
cmp [eax],dword 3
jne no_special_message_for_number
xor ebx,ebx
mov bl,[Number.type]
and bl,nm_special_redraw_on
test bl,bl
jz no_special_message_for_number
or [Number.type],nm_redraw_all
and [Number.type],nm_special_redraw_off
no_special_message_for_number:
cmp [eax],dword -1
jne no_destroy_control_of_number
jmp exit_number
no_destroy_control_of_number:
;load coordinats and size from control
mov eax,[PointerForNumber]
mov ebx,[eax+24] ;x
mov ecx,[eax+28] ;y
;set current coordinats and sizes in zakladka
mov [Number.x],ebx
mov [Number.y],ecx
xor eax,eax
mov al,[Number.type]
and al,nm_redraw_all
test al,al
jz no_redraw_number_
and [Number.type],nm_redraw_off
mov esi,dword Number
mov edi,[PointerForNumber]
add edi,control_header_size
mov ecx,2
rep movsb
;get standart colors table
mov eax,48
mov ebx,3
mov ecx,dword pointer2
mov edx,40
mcall
xor eax,eax
mov al,[Number.type]
and al,nm_integer_type
test al,al
jnz no_integer_number
mov eax,47
mov ebx,[Number.parameters]
mov ecx,[Number.number]
mov edx,[Number.x]
shl edx,16
add edx,[Number.y]
mov esi,[Number.color]
mov edi,[pointer2+8]
mcall
jmp no_redraw_number_
no_integer_number:
;---------------------------------------
mov ebx,[Number.parameters]
mov ecx,ebx
shr ebx,16 ;format for integer
and ecx,0xffff ;format for float
;get integer part of float number
mov eax,1
mov edi,ecx
pow_10__:
;eax=eax*10
lea eax,[eax+eax*4]
shl eax,1
dec edi
jnz pow_10__
mov edx,eax
;check for signum
mov [v2],0
fld [Number.number]
fcom [v2]
fstsw ax
sahf
jae no_signum_float_number
fabs
mov [signum_float_number],byte 1
no_signum_float_number:
fstp [Number.number]
mov [v2],edx ;v2=10^ecx
fild [v2]
fld [Number.number]
fmul st0,st1
fistp [v]
fstp st0
mov esi,edx
mov eax,[v]
cdq
idiv esi
mov [v],eax
and [integer_part],0
and [tochnost1],0
;save v in v2
mov eax,[v]
mov [v2],eax
mov [Number.flag],0
mov esi,ebx
get_next_razryd_of_number_integer:
mov eax,1
mov edi,esi
pow_10_integer:
;eax=eax*10
lea eax,[eax+eax*4]
shl eax,1
dec edi
jnz pow_10_integer
mov edi,eax
mov eax,[v]
cdq
idiv edi
and eax,0xf
test eax,eax
jz no_save_pos_for_integer
cmp [Number.flag],0
jne no_save_pos_for_integer
mov [Number.flag],1b
mov [tochnost1],esi
add [tochnost1],1
no_save_pos_for_integer:
imul eax,edi
sub [v],eax
add [integer_part],eax
dec esi
jnz get_next_razryd_of_number_integer
mov eax,[v]
add [integer_part],eax
cmp [tochnost1],0
jnz all_ok_with_tochnost
mov [tochnost1],1
all_ok_with_tochnost:
;get float part of float number
mov eax,[v2]
mov [v],eax
mov eax,1
mov edi,ecx
pow_10_float__:
;eax=eax*10
lea eax,[eax+eax*4]
shl eax,1
dec edi
jnz pow_10_float__
mov [v2],eax ;v2=10^ecx
fild [v2]
fild [v]
fld [Number.number]
fsub st0,st1
fmul st0,st2
fistp [v]
fstp st0
fstp st0
and [float_part],0
mov esi,ecx
get_next_razryd_of_number_float:
mov eax,1
mov edi,esi
pow_10_float:
;eax=eax*10
lea eax,[eax+eax*4]
shl eax,1
dec edi
jnz pow_10_float
mov edi,eax
mov eax,[v]
cdq
idiv edi
and eax,0xf
imul eax,edi
sub [v],eax
add [float_part],eax
dec esi
jnz get_next_razryd_of_number_float
mov eax,[v]
add [float_part],eax
mov [tochnost2],ecx
cmp [signum_float_number],byte 1
jne no_draw_signum_for_float_number
;draw signum
mov eax,4
mov ebx,[Number.x]
mov ecx,[Number.color]
mov edx,dword signum
mov esi,1
mov edi,[pointer2+8]
shl ebx,16
add ebx,[Number.y]
mcall
add [Number.x],6
mov [signum_float_number],0
no_draw_signum_for_float_number:
;draw integer part of float number
mov eax,47
mov ebx,[tochnost1]
mov ecx,[integer_part]
mov edx,[Number.x]
mov esi,[Number.color]
mov edi,[pointer2+8]
shl edx,16
shl ebx,16
add edx,[Number.y]
mcall
mov edx,[tochnost1]
add edx,1
lea edx,[edx+edx*2]
shl edx,1 ;edx=edx*6
add edx,[Number.x]
mov [x],edx
;draw float part of float number
mov eax,47
mov ebx,[tochnost2]
mov ecx,[float_part]
mov esi,[Number.color]
mov edi,[pointer2+8]
shl edx,16
shl ebx,16
add edx,[Number.y]
mcall
;draw point betwen integer part of number and float part of number
mov eax,4
mov ebx,[x]
mov ecx,[Number.color]
mov edx,dword point
mov esi,1
mov edi,[pointer2+8]
sub ebx,6
shl ebx,16
add ebx,[Number.y]
mcall
no_redraw_number_:
;-----------------------------------------
exit_number:
ret 8