Page 5 of 8

Posted: Fri Aug 11, 2006 3:36 pm
by diamond
При этом могут быть варианты, каким именно признаком характеризовать то, что на входе ASCIIZ-строка.
1. Использовать старший бит ecx. В этом случае его уже нельзя использовать для других целей. Например, если считать старшую hex-цифру ecx номером шрифта, то вместо потенциально доступных 16 шрифтов останется только 8. Конечно, это ещё долго не будет иметь никакого значения.
2. Завести новую сисфункцию специально для вывода ASCIIZ-строк. В этом случае получаем некоторое дублирование кода в ядре, хотя и небольшое (функция просто в цикле вызывает процедуру вывода символа, которую дублировать не надо, а сам цикл много места не занимает).
Кроме того, если уж расширять 4-ю функцию, имеет смысл подумать о случае вывода текста с одновременным заполнением фона - то, что в текущей реализации приходится делать двумя вызовами - заполняем фон функцией 13 и выводим текст функцией 4.

Posted: Fri Aug 11, 2006 3:49 pm
by Serge
diamond
Если дублировать функцию то стоит ли бесокоится об экономии трех байт на регистре esi. И как быть если я жутко вредный тип и хочу вывести строку так как она есть в первом варианте с 0 в середине и не согласен сам заменять его на пробелы (пусть это сиcтема сделает)?

Posted: Fri Aug 11, 2006 4:37 pm
by diamond
1. Функция дублируется в ядре. Инструкция опускается в приложениях. Количество ядер на два порядка меньше количества приложений :-)
2. Так я про то и говорю, что программист, если ему хочется (или надо) выводить строку с нулями в середине, должен иметь эту возможность. А недавнее исправление функции 4 эту возможность зарубает на корню.

Posted: Tue Aug 15, 2006 11:31 am
by Heavyiron
Ну так на чем остановимся? ИМХО, доводы diamond-a логичны. Главное не тянуть - если менять - значит менять, оставлять - значит оставлять... Фича неплохая, руки так и чешутся заюзать где-нибудь ;)

Posted: Tue Aug 15, 2006 12:13 pm
by <Lrz>
В принципе верно, но рассмотрим еще такой вариант для полноты картины:
Передаем в esi. -1
старший бит в eсх зарезервируем для дальшейшей функциональности вывода шрифтов
в функции 4 проверим на наличее в esi, -1
примерно так:
not esi ; если в esi -1, то после этой команды будет 0
test esi,esi
если не в esi не 0, то перейдем на эту метку dtext.lnew:
Иначе проверяем где в нашей ASCII строке встречается 0, и если находим код символа, то затем вычисляем длинну строки для вывода в итоге получаем обычную строку фиксированной длинны.

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

Posted: Tue Aug 15, 2006 6:22 pm
by Serge
<Lrz>
Тогда лучше inc esi, она установит z-флаг если в esi было 0xFFFFFFFF и test esi, esi уже не нужна

Posted: Wed Aug 16, 2006 11:48 am
by <Lrz>
Вот один вариант

Code: Select all

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

Posted: Wed Aug 16, 2006 12:32 pm
by <Lrz>
Возник еще вопрос - как вы относитесь к тому что бы убрать кроссовер регистров при при передаче управления обработчикам системных функций ?
Т.е. обработчик фукции получал данные в тех же регистрах что и при вызове int 0x40.

Posted: Wed Aug 16, 2006 12:59 pm
by Иван Поддубный
Возник еще вопрос - как вы относитесь к тому что бы убрать кроссовер регистров при при передаче управления обработчикам системных функций ?
Положительно, но это нереально. имхо.

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

Posted: Wed Aug 16, 2006 1:33 pm
by <Lrz>
Иван, никто не делает специальную сис функцию, просто расширяем возможности существоующей - вот и все. Если в esi передается значение -1, то мой код самостоятельно вычисляет длину, т.е. длину можно в этом случае и не передавать в регистре.

Posted: Wed Aug 16, 2006 1:34 pm
by Иван Поддубный
Факт в том, что она не нужна :D

Posted: Wed Aug 16, 2006 1:41 pm
by <Lrz>
Т.е. ты предлагаешь оставить вариант, который был внесен в ревизии ядра 106. Я прав ? Еще мнения будут ?

Posted: Wed Aug 16, 2006 4:40 pm
by vectoroc
Lrz
Лучше сделать... имхо
Мешать же оно не будет, а иной раз очень даже может пригодиться

Posted: Fri Aug 18, 2006 4:38 pm
by diamond
Добавлена документация по новой сисфункции 70.3.
А что происходит на svn-сервере с замечательной русской буквой 'ё'? Почему-то она регулярно меняется (первый шаг: 0xF1 (DOS-код буквы) -> 0xB8 (Win-код той же буквы)) - в финале в дистрибутиве 0.5.8.1 в sysfuncr.txt на её месте оказался символ '+'. Это глюки svn-сервера или какого-то из клиентов?
P.S. В свежезалитой ревизии 131 права буквы 'ё' восстановлены. Интересно, надолго ли это?