Page 2 of 3

Re: Рабочая обстановка для написания кода

Posted: Sat Jul 04, 2015 3:03 pm
by art_zh
Pathoswithin wrote:Я смотрю, вывод осуществляется через вызов putpixel... "Это конечно круто".
Это конечно очень коряво.
Много неглупых людей пытались это как-то исправить.
Но пока что без особого успеха.
Потому что так или иначе надо проверять принадлежность каждого пикселя неперекрытому окну.
Ядро это делает через стандартную проверку внутри putpixel.
Разумеется, приложение может вдувать всё во фреймбуфер, но при этом есть риск нагадить в соседние окна.

Re: Рабочая обстановка для написания кода

Posted: Sat Jul 04, 2015 3:23 pm
by Pathoswithin
А в каком случае текст может выводится в неактивное окно?

Re: Рабочая обстановка для написания кода

Posted: Sat Jul 04, 2015 8:12 pm
by art_zh
Pathoswithin
в любом.
Колибри - многозадачная ОС, и любой процесс в принципе может осуществлять вывод в свое окно даже если оно неактивно и частично перекрыто другими окнами.
Ядро следит за GUI-операциями и блокирует putpixel в перекрытые регионы.

Re: Рабочая обстановка для написания кода

Posted: Tue Jul 07, 2015 9:57 pm
by CleverMouse
Pathoswithin wrote:Второй вопрос до сих пор без ответа.
Ты же сам ответил: функция 4 в API ядра, внутре у ей putpixel.
Pathoswithin wrote:Как мне добавить к четвёртой функции параметр "размер шрифта"? В есх есть 3 свободных бита, можно передавать множитель, будет до х8. Хотя это не перспективно, лучше передавать размер в пикселях...
Заведи новую сисфункцию. Всё равно приложения без изменений не поймут нововведений.
Pathoswithin wrote:Я смотрю, вывод осуществляется через вызов putpixel... "Это конечно круто". Есть прямой доступ к видеопамяти или что-то вроде DirectDraw?
Нельзя писать в видеобуфер напрямую. Приложение не одно в системе.

Re: Рабочая обстановка для написания кода

Posted: Tue Jul 07, 2015 10:52 pm
by Pathoswithin
CleverMouse wrote:Заведи новую сисфункцию. Всё равно приложения без изменений не поймут нововведений.
И мне придётся вручную изменения вносить. 4 функция вполне нормальная, использовать 3 бита в есх проще всего, если можно.
CleverMouse wrote:Нельзя писать в видеобуфер напрямую. Приложение не одно в системе.
Но и putpixel использовать не обязательно. Давайте решать, как лучше. Вроде art_zh в своём шрифте вручную сделал проверку углов.

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 12:40 am
by Pathoswithin
Для начала и без проверки ничего ужасного не случится. Я уже начал экспериментировать с новым подходом, но система перезагружается сразу после синего экрана, и похоже я чего-то не знаю. Посмотрите, там всего 60 строк.

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 9:06 am
by hidnplayr
Have you tried running your code in BOCHS or VirtualBox with debugger enabled? :)

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 1:20 pm
by Pathoswithin
hidnplayr No... :) Usually I found errors manually. Especially in 60 lines. If I dont see any, probably I dont know something. In that case, art_zh, Serge or CleverMouse should find the problem easily.

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 2:13 pm
by hidnplayr
Pathoswithin Your laziness in fault seeking disapoints me.
Perhaps this will get you going again:
dtext
edx=80035E8B esi=80035E8B edi=00000001
ebx=000A000A ecx=80FFFFFF
.userarea
Also, be sure to read the documentation of the system function again.

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 3:14 pm
by Pathoswithin
edi=00000001 :?:
kernel.asm, syscall_writetext:

Code: Select all

	mov	eax, edi
	test  ecx, 0x08000000  ; redirect the output to the user area
	jnz	dtext
	xor	edi, edi
	jmp	dtext

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 3:22 pm
by Pathoswithin
Ага

Code: Select all

; edi 1 force or user area for redirect
"1 force" это конечно исчерпывающее описание.

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 3:39 pm
by hidnplayr

Code: Select all

boot_log:
        pushad

        mov     ebx, 10*65536
        mov     bx, word [boot_y]
        add     [boot_y], dword 10
        mov     ecx, 0x80ffffff; ASCIIZ string with white color
        xor     edi, edi
        mov     edx, esi
        inc     edi
        call    dtext

        mov     [novesachecksum], 1000
        call    checkVga_N13

        popad

        ret 

Re: Рабочая обстановка для написания кода

Posted: Wed Jul 08, 2015 4:04 pm
by hidnplayr
This edi=1 stuff looks like the remains of something old that is probably no longer needed.
The first problem with your code is that you test if edi is 0, instead of testing the correct bit in another register, as mentioned in syscalls.txt

edit: Sorry, it seems this binary flag is detected in syscall_writetext and from there on, another interface is used, did not notice...

Re: Рабочая обстановка для написания кода

Posted: Thu Jul 09, 2015 6:13 pm
by Pathoswithin
Сделал проверку углов, теперь надо с курсором разобраться. Как вообще работает программный курсор?

Re: Рабочая обстановка для написания кода

Posted: Thu Jul 09, 2015 9:10 pm
by CleverMouse
Pathoswithin wrote:
CleverMouse wrote:Заведи новую сисфункцию. Всё равно приложения без изменений не поймут нововведений.
И мне придётся вручную изменения вносить. 4 функция вполне нормальная, использовать 3 бита в есх проще всего, если можно.
Так в любом случае придётся.
Pathoswithin wrote:
CleverMouse wrote:Нельзя писать в видеобуфер напрямую. Приложение не одно в системе.
Но и putpixel использовать не обязательно. Давайте решать, как лучше. Вроде art_zh в своём шрифте вручную сделал проверку углов.
Зачем? Ты собираешься выводить на экран миллионы символов в секунду?

Проверка углов будет давать видимые артефакты - при перекрытии окна другим части символов, которые должны быть видимы, исчезнут. А если приложение рассчитывает ещё и на заливку фоном, которую ты так тоже отключишь для области рядом с перекрывающим окном, могут получаться совсем странные эффекты.

Для ускорения проверки перекрытий нужно переходить с буфера win_map на обрамляющие прямоугольники, чтобы не проверять каждый пиксель, а сразу понять, что рисовать можно в таких-то пределах. Но это чрезвычайно трудоёмкая задача, mike.dld в своё время пытался - http://websvn.kolibrios.org/listing.php ... de1b3d298f - но не осилил.