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 - но не осилил.