Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Apr 04, 2020 12:33 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 116 posts ]  Go to page Previous 13 4 5 6 7 8 Next
Author Message
 Post subject:
PostPosted: Fri Aug 11, 2006 3:36 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
При этом могут быть варианты, каким именно признаком характеризовать то, что на входе ASCIIZ-строка.
1. Использовать старший бит ecx. В этом случае его уже нельзя использовать для других целей. Например, если считать старшую hex-цифру ecx номером шрифта, то вместо потенциально доступных 16 шрифтов останется только 8. Конечно, это ещё долго не будет иметь никакого значения.
2. Завести новую сисфункцию специально для вывода ASCIIZ-строк. В этом случае получаем некоторое дублирование кода в ядре, хотя и небольшое (функция просто в цикле вызывает процедуру вывода символа, которую дублировать не надо, а сам цикл много места не занимает).
Кроме того, если уж расширять 4-ю функцию, имеет смысл подумать о случае вывода текста с одновременным заполнением фона - то, что в текущей реализации приходится делать двумя вызовами - заполняем фон функцией 13 и выводим текст функцией 4.


Top
   
 Post subject:
PostPosted: Fri Aug 11, 2006 3:49 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
diamond
Если дублировать функцию то стоит ли бесокоится об экономии трех байт на регистре esi. И как быть если я жутко вредный тип и хочу вывести строку так как она есть в первом варианте с 0 в середине и не согласен сам заменять его на пробелы (пусть это сиcтема сделает)?


Top
   
 Post subject:
PostPosted: Fri Aug 11, 2006 4:37 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
1. Функция дублируется в ядре. Инструкция опускается в приложениях. Количество ядер на два порядка меньше количества приложений :-)
2. Так я про то и говорю, что программист, если ему хочется (или надо) выводить строку с нулями в середине, должен иметь эту возможность. А недавнее исправление функции 4 эту возможность зарубает на корню.

_________________
Ушёл к умным, знающим и культурным людям.


Top
   
 Post subject:
PostPosted: Tue Aug 15, 2006 11:31 am 
Offline
User avatar

Joined: Fri Jan 27, 2006 3:06 pm
Posts: 1071
Ну так на чем остановимся? ИМХО, доводы diamond-a логичны. Главное не тянуть - если менять - значит менять, оставлять - значит оставлять... Фича неплохая, руки так и чешутся заюзать где-нибудь ;)


Top
   
 Post subject:
PostPosted: Tue Aug 15, 2006 12:13 pm 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
В принципе верно, но рассмотрим еще такой вариант для полноты картины:
Передаем в esi. -1
старший бит в eсх зарезервируем для дальшейшей функциональности вывода шрифтов
в функции 4 проверим на наличее в esi, -1
примерно так:
not esi ; если в esi -1, то после этой команды будет 0
test esi,esi
если не в esi не 0, то перейдем на эту метку dtext.lnew:
Иначе проверяем где в нашей ASCII строке встречается 0, и если находим код символа, то затем вычисляем длинну строки для вывода в итоге получаем обычную строку фиксированной длинны.


Top
   
 Post subject:
PostPosted: Tue Aug 15, 2006 5:39 pm 
<Lrz>
Сможешь оформить в виде кода?


Top
   
 Post subject:
PostPosted: Tue Aug 15, 2006 6:22 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
<Lrz>
Тогда лучше inc esi, она установит z-флаг если в esi было 0xFFFFFFFF и test esi, esi уже не нужна


Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 11:48 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Вот один вариант
Code:
align 4
dtext:  ; Text String Output (rw by Johnny_B[john@kolibrios.org])
        ; eax x & y
        ; ebx font ( 0xX0000000 ) & color ( 0x00RRGGBB )
        ; ecx start of text
        ; edx length
        ; edi 1 force

        pushad

        mov    esi,edx    ;esi=length
        mov    ebp,ecx    ;ebp=ptr to text
        mov    ecx,ebx    ;ecx=color
        movzx  ebx,ax     ;ebx=y
        shr    eax,16     ;eax=x
       
   ;-------------  <Lrz> 16.08.2006 Получение длины ASCII строки
   inc   esi
   jnz   @f
   dec   esi
   and   esi, 0xFF  ;limit of text = 255 symbols   
   push   eax ecx
   
   xor    eax,eax     ;нахождение символа
   mov   edi,ebp   ;указатель в на строку в edi
   mov   ecx,esi     ;кол-во проходо до 255
   repne   scasb
   test   ecx,ecx
   jz   ASCII_out ;общий выход если ни один символ не был в ASCII строке с кодом 0
   
   mov   esi,ecx
   pop   ecx eax
   jmp dtext.lnew
   ;-------------
@@:
   dec   esi
   and   esi, 0xFF  ;limit of text = 255 symbols
dtext.lnew:
        movzx  edx,byte [ebp] ;edx=ascii code
        test   edx,edx
        jz     dtext.output_end
        test   ecx,0x10000000
        jnz    dtext.letnew2

        align 4
      .letnew:

drawletter:  ;output char of type 1(monotype)
   
;eax - x
;ebx - y
;ecx - color
;edx - ascii code
    pushad
    call  [disable_mouse]
    mov   esi,9
    lea   ebp,[0x3F600+8*edx+edx]
.symloop:
    push  esi
    mov   dl,byte [ebp]
    mov   esi,8
.pixloop:
    test  dl,1
    jz    .nopix
    call  [putpixel]
.nopix:
    shr   dl,1   
    inc   eax
    dec   esi
    jnz   .pixloop
    sub   eax,8
    inc   ebx
    inc   ebp
    pop   esi
    dec   esi
    jnz   .symloop
    popad

        add    eax,6

        inc    ebp  ;ptr to text
        dec    esi  ;length
        jnz    dtext.lnew

        jmp dtext.output_end


      dtext.letnew2:

align 4
drawletter2:       ;output char of type 2(proportional)
;eax - x
;ebx - y
;ecx - color
;edx - symbol
;edi - force?
;result - eax=eax+sym_size
    pushad
    call  [disable_mouse]
    shl   edx,1
    mov   esi,9
    lea   ebp,[0x3EC00+4*edx+edx+1]
.symloop:
    push  esi
    mov   dl,byte [ebp]
    xor   esi,esi
.pixloop:
    test  dl,1
    jz    .nopix
    call  [putpixel]
.nopix:
    shr   dl,1
    inc   esi
    inc   eax
    cmp   esi,8
    jl    .pixloop
    sub   eax,8
    inc   ebx
    pop   esi
    inc   ebp
    dec   esi
    jnz   .symloop
    movzx edx,byte [ebp-10]
    add   [esp+32-4],edx
    popad


        inc    ebp   ;ptr to text
        dec    esi   ;length
        jnz    dtext.lnew


dtext.output_end:
        popad
        ret
ASCII_out:
   pop     ecx eax
   jmp   dtext.output_end


Last edited by <Lrz> on Wed Aug 16, 2006 1:34 pm, edited 2 times in total.

Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 12:32 pm 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Возник еще вопрос - как вы относитесь к тому что бы убрать кроссовер регистров при при передаче управления обработчикам системных функций ?
Т.е. обработчик фукции получал данные в тех же регистрах что и при вызове int 0x40.


Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 12:59 pm 
Offline

Joined: Fri Nov 12, 2004 3:20 pm
Posts: 90
Quote:
Возник еще вопрос - как вы относитесь к тому что бы убрать кроссовер регистров при при передаче управления обработчикам системных функций ?

Положительно, но это нереально. имхо.

По 4ой функции - вернуть всё как было. Нуль-терминированные строки встречаются в системе не часто и _необходимости_ делать для этого специальную сисфунцкию НЕТ.


Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 1:33 pm 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Иван, никто не делает специальную сис функцию, просто расширяем возможности существоующей - вот и все. Если в esi передается значение -1, то мой код самостоятельно вычисляет длину, т.е. длину можно в этом случае и не передавать в регистре.


Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 1:34 pm 
Offline

Joined: Fri Nov 12, 2004 3:20 pm
Posts: 90
Факт в том, что она не нужна :D


Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 1:41 pm 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Т.е. ты предлагаешь оставить вариант, который был внесен в ревизии ядра 106. Я прав ? Еще мнения будут ?


Top
   
 Post subject:
PostPosted: Wed Aug 16, 2006 4:40 pm 
Offline

Joined: Mon May 01, 2006 10:12 pm
Posts: 349
Lrz
Лучше сделать... имхо
Мешать же оно не будет, а иной раз очень даже может пригодиться


Top
   
 Post subject:
PostPosted: Fri Aug 18, 2006 4:38 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
Добавлена документация по новой сисфункции 70.3.
А что происходит на svn-сервере с замечательной русской буквой 'ё'? Почему-то она регулярно меняется (первый шаг: 0xF1 (DOS-код буквы) -> 0xB8 (Win-код той же буквы)) - в финале в дистрибутиве 0.5.8.1 в sysfuncr.txt на её месте оказался символ '+'. Это глюки svn-сервера или какого-то из клиентов?
P.S. В свежезалитой ревизии 131 права буквы 'ё' восстановлены. Интересно, надолго ли это?


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 116 posts ]  Go to page Previous 13 4 5 6 7 8 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited