diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index df0d188cd7..1a667f6695 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -2198,12 +2198,13 @@ dd 638 * eax = 47 - номер функции * ebx = параметры преобразования числа в текст: * bl = 0 - ecx содержит число - * bl = 1 - ecx содержит указатель на dword-число + * bl = 1 - ecx содержит указатель на dword-число, либо qword-число * bh = 0 - отображать в десятичной системе счисления * bh = 1 - отображать в шестнадцатеричной системе * bh = 2 - отображать в двоичной системе * биты 16-21 = сколько цифр отображать - * биты 22-30 зарезервированы и должны быть установлены в 0 + * биты 22-29 зарезервированы и должны быть установлены в 0 + * бит 30 - установлен в 1, если требуется вывод qword (64-битного) числа * бит 31 - установлен в 1, если требуется вывод числа без пустых нулей в старших разрядах * ecx = число (при bl=0) или указатель (при bl=1) * edx = [координата по оси x]*65536 + [координата по оси y] diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 02d7896078..583c126b24 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -2169,12 +2169,13 @@ Parameters: * eax = 47 - function number * ebx = parameters of conversion number to text: * bl = 0 - ecx contains number - * bl = 1 - ecx contains pointer to dword-number + * bl = 1 - ecx contains pointer to dword-number, or qword-number * bh = 0 - display in decimal number system * bh = 1 - display in hexadecimal system * bh = 2 - display in binary system * bits 16-21 = how many digits to display - * bits 22-30 reserved and must be set to 0 + * bits 22-29 reserved and must be set to 0 + * bit 30 - set in 1, if the output of qword (64-bites) number * bit 31 - set in 1, if the output of number without empty zero in high bits is required * ecx = number (if bl=0) or pointer (if bl=1) * edx = [coordinate on axis x]*65536 + [coordinate on axis y] diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index ca5c1ad3e9..e860416a8c 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1326,35 +1326,38 @@ display_number: ; ebx = number or pointer ; ecx = x shl 16 + y ; edx = color - xor edi, edi + xor edi, edi display_number_force: push eax - and eax,0x7fffffff - cmp eax,0xffff ; length > 0 ? - pop eax + and eax,0x3fffffff + cmp eax,0xffff ; length > 0 ? + pop eax jge cont_displ ret cont_displ: push eax - and eax,0x7fffffff - cmp eax,61*0x10000 ; length <= 60 ? - pop eax + and eax,0x3fffffff + cmp eax,61*0x10000 ; length <= 60 ? + pop eax jb cont_displ2 ret cont_displ2: pushad - cmp al,1 ; ecx is a pointer ? + cmp al,1 ; ecx is a pointer ? jne displnl1 + mov ebp,ebx + add ebp,4 + mov ebp,[ebp+std_application_base_address] mov ebx,[ebx+std_application_base_address] displnl1: sub esp,64 - cmp ah,0 ; DECIMAL + cmp ah,0 ; DECIMAL jne no_display_desnum shr eax,16 - and eax,0x803f + and eax,0xC03f ; and eax,0x3f push eax and eax,0x3f @@ -1365,6 +1368,7 @@ display_number_force: mov ebx,10 d_desnum: xor edx,edx + call division_64_bits div ebx add dl,48 mov [edi],dl @@ -1378,10 +1382,10 @@ display_number_force: ret no_display_desnum: - cmp ah,0x01 ; HEXADECIMAL + cmp ah,0x01 ; HEXADECIMAL jne no_display_hexnum shr eax,16 - and eax,0x803f + and eax,0xC03f ; and eax,0x3f push eax and eax,0x3f @@ -1392,6 +1396,7 @@ display_number_force: mov ebx,16 d_hexnum: xor edx,edx + call division_64_bits div ebx add edx,hexletters mov dl,[edx] @@ -1406,10 +1411,10 @@ display_number_force: ret no_display_hexnum: - cmp ah,0x02 ; BINARY + cmp ah,0x02 ; BINARY jne no_display_binnum shr eax,16 - and eax,0x803f + and eax,0xC03f ; and eax,0x3f push eax and eax,0x3f @@ -1420,6 +1425,7 @@ display_number_force: mov ebx,2 d_binnum: xor edx,edx + call division_64_bits div ebx add dl,48 mov [edi],dl @@ -1453,7 +1459,16 @@ normalize_number: and eax,0x3f ret - +division_64_bits: + test [esp+1+4],byte 0x40 + jz .continue + push eax + mov eax,ebp + div ebx + mov ebp,eax + pop eax +.continue: + ret draw_num_text: