Документация

Everything you can't fit into other forums
  • diamond
    Если дублировать функцию то стоит ли бесокоится об экономии трех байт на регистре esi. И как быть если я жутко вредный тип и хочу вывести строку так как она есть в первом варианте с 0 в середине и не согласен сам заменять его на пробелы (пусть это сиcтема сделает)?
  • 1. Функция дублируется в ядре. Инструкция опускается в приложениях. Количество ядер на два порядка меньше количества приложений :-)
    2. Так я про то и говорю, что программист, если ему хочется (или надо) выводить строку с нулями в середине, должен иметь эту возможность. А недавнее исправление функции 4 эту возможность зарубает на корню.
    Ушёл к умным, знающим и культурным людям.
  • Ну так на чем остановимся? ИМХО, доводы diamond-a логичны. Главное не тянуть - если менять - значит менять, оставлять - значит оставлять... Фича неплохая, руки так и чешутся заюзать где-нибудь ;)
  • В принципе верно, но рассмотрим еще такой вариант для полноты картины:
    Передаем в esi. -1
    старший бит в eсх зарезервируем для дальшейшей функциональности вывода шрифтов
    в функции 4 проверим на наличее в esi, -1
    примерно так:
    not esi ; если в esi -1, то после этой команды будет 0
    test esi,esi
    если не в esi не 0, то перейдем на эту метку dtext.lnew:
    Иначе проверяем где в нашей ASCII строке встречается 0, и если находим код символа, то затем вычисляем длинну строки для вывода в итоге получаем обычную строку фиксированной длинны.
  • <Lrz>
    Сможешь оформить в виде кода?
  • <Lrz>
    Тогда лучше inc esi, она установит z-флаг если в esi было 0xFFFFFFFF и test esi, esi уже не нужна
  • Вот один вариант

    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
    
    Last edited by <Lrz> on Wed Aug 16, 2006 1:34 pm, edited 2 times in total.
  • Возник еще вопрос - как вы относитесь к тому что бы убрать кроссовер регистров при при передаче управления обработчикам системных функций ?
    Т.е. обработчик фукции получал данные в тех же регистрах что и при вызове int 0x40.
  • Возник еще вопрос - как вы относитесь к тому что бы убрать кроссовер регистров при при передаче управления обработчикам системных функций ?
    Положительно, но это нереально. имхо.

    По 4ой функции - вернуть всё как было. Нуль-терминированные строки встречаются в системе не часто и _необходимости_ делать для этого специальную сисфунцкию НЕТ.
  • Иван, никто не делает специальную сис функцию, просто расширяем возможности существоующей - вот и все. Если в esi передается значение -1, то мой код самостоятельно вычисляет длину, т.е. длину можно в этом случае и не передавать в регистре.
  • Факт в том, что она не нужна :D
  • Т.е. ты предлагаешь оставить вариант, который был внесен в ревизии ядра 106. Я прав ? Еще мнения будут ?
  • Lrz
    Лучше сделать... имхо
    Мешать же оно не будет, а иной раз очень даже может пригодиться
  • Добавлена документация по новой сисфункции 70.3.
    А что происходит на svn-сервере с замечательной русской буквой 'ё'? Почему-то она регулярно меняется (первый шаг: 0xF1 (DOS-код буквы) -> 0xB8 (Win-код той же буквы)) - в финале в дистрибутиве 0.5.8.1 в sysfuncr.txt на её месте оказался символ '+'. Это глюки svn-сервера или какого-то из клиентов?
    P.S. В свежезалитой ревизии 131 права буквы 'ё' восстановлены. Интересно, надолго ли это?
  • Who is online

    Users browsing this forum: No registered users and 5 guests