Page 8 of 77
Re: Помогите новичку
Posted: Sun Oct 18, 2009 4:40 am
by Rock_maniak_forever
Вчера сделал (для своей макро-библиотеки) вывод 24-ёх и 32-ух битной картинки при помощи 1-ой функции размером 10х10 (зарисовка была не видна), потом попробовал картинку 200х200 и окозалось что картинка (в реальной системе) выводится очень медленно, заметна зарисовка, а в эмуляторе KolInWin вообще тормоза(на полную зарисовку уходит примерно 4 секунды). Собственно поэтому, я решил сделать прямой вывод графики, при помощи 61 функции. Кто нибудь может объяснить, как вывести пиксель при помощи неё. Я непонял как манипулировать селектором gs. Если не трудно дайте примерчик.
Re: Помогите новичку
Posted: Sun Oct 18, 2009 2:38 pm
by Serge
Rock_maniak_forever
Рисование при помощи ф.1 самый тормозной способ.
Для вывода картинок есть функции 7 и 65. ф.65 предпочтительнее потому что работает с 32 bpp. Если тебе надо рисовать попиксельно делай это в ОЗУ а потом сбрасывай на экран.
Re: Помогите новичку
Posted: Sun Oct 25, 2009 2:06 pm
by kogemyaka
Вопрос по 3 функции: как преобразовывать возвращаемое число в нормальный форма времени (ЧЧ : ММ : СС) Может где в примерах есть?
Re: Помогите новичку
Posted: Sun Oct 25, 2009 3:17 pm
by Albom
kogemyaka
посмотри предыдущую страницу этой темы
Помогите новичку
Posted: Wed Nov 11, 2009 5:37 pm
by IgorA
Есть ли способ вывести часть текста (см. рис.) ? Может есть какие режимы наподобие xor (для виндовс константа R2_XORPEN в BitBlt) ? Может какой буфер временный делать в памяти, но тогда в него системной функцией не влезешь ... Просто не хочется откидывать целую строку текста в случае, когда надо вывести часть букв ...
Re: Помогите новичку
Posted: Wed Nov 11, 2009 8:59 pm
by vkos
Ну можно вывести текст, а потом зарисовать ненужную часть.
Re: Помогите новичку
Posted: Wed Nov 11, 2009 9:31 pm
by IgorA
Понял, значит функция 36.
Re: Помогите новичку
Posted: Wed Nov 11, 2009 10:23 pm
by Mario
IgorA
Как вариант можно самому глифы накладывать и выводить 65 функцией, только муторно это.
Re: Помогите новичку
Posted: Sat Nov 21, 2009 5:24 pm
by Albom
Я не совсем новичёк, но всё же нуждаюсь в помощи. Пытаюсь использовать Libck, но ничего не получается.
ld выдаёт ошибку:
main.o(.text+0x7):main.c: undefined reference to `_ksys_exit@0'
GNU ld version 2.13.90 20030111
gcc (GCC) 3.2.3 (mingw special 20030504-1)
Я подозреваю, что это из-за разных форматов объектных файлов (ELF и COFF).
Re: Помогите новичку
Posted: Sun Nov 22, 2009 3:54 pm
by Asper
В твой библиотеке libck.a сборная из эльфов и коффов. Советую пересобрать библиотеку так, чтобы там были только файлы формата MS COFF.
Чтобы посмотреть формат файлов в libck.a разархивируй её например при помощи 7Zip'а в какую-нибудь папку.
kfar'ом например можешь посмотреть содержимое *.o файлов. Эльфы начинаются сигнатурой ELF , а коффы начинаются с буквы L.
Выкинь всех эльфов и перекомпилируй соответствующие *.c файлы.
Компилируй *.c файлы следующей строкой
Code: Select all
gcc -c my_file.c -o my_file.o -O2 -nostdinc -fno-builtin -fno-common -fomit-frame-pointer
Во-вторых в
compile.bat строку
Code: Select all
ld -nostdlib -T kolibri.ld -o my.kex -L C:\Temp\kollibc-mingw-src\my\ -l ck start.o main.o
лучше изменить так
Code: Select all
ld -nostdlib -T kolibri.ld -o my.kex start.o main.o -L C:\Temp\kollibc-mingw-src\my\ -l ck
start.o является заглушкой и он должен подаваться линковщику первым, чтобы после работы
objcopy у тебя получился правильный исполняемый файл Колибри.
Также совет, когда получаешь ошибку линковщика типа
undefined reference to some_function и при этом ты уверен, что реализация
some_function у тебя есть в одном из линкуемых файлов посмотри тем же
kfar'ом объектные файлы где
some_function реализуется и где вызывается, поищи строку
some_function в обоих файлах название функции должно полностью совпадать. Возможно такое, что в одном файле будет например
_some_function, а в другом
_some_function@4 или в одном файле
_some_function а в другом
__some_function, эта ситуация возникает, потому что различные компиляторы могут подставлять различное количество подчеркиваний и указывать или нет объем передаваемых функции аргументов. Соответственно если имена различаются в объектных файлах, то линковщик и выдаёт ошибку
undefined reference to some_function.
Вот и у тебя вызывается функция
_ksys_exit();, которая в
main.o превращается в
__ksys_exit@0 , а в
libck.a у тебя есть
_ksys_exit и
_ksys_exit@0. Если распаковать
libck.a, то в
exit.o находится
_ksys_exit.
Теперь небольшой эксперимент
1. Изменим имя функции
_ksys_exit(); на
ksys_exit(); в файлах
main.c и
kolibrisys.h.
2. Скомпилируем
main.c нашей "волшебной строкой"
Code: Select all
gcc -c main.c -o main.o -O2 -nostdinc -fno-builtin -fno-common -fomit-frame-pointer
3. Скопируем к нам в папку файл
exit.o из
libck.a и соберём исполняемый файл
Code: Select all
ld -nostdlib -T kolibri.ld -o my.kex start.o main.o exit.o
objcopy my.kex -O binary
[/color]
Re: Помогите новичку
Posted: Sun Nov 22, 2009 4:50 pm
by Albom
Asper
спасибо за ответ. попробую скомпилировать с ключём -fno-builtin -fno-common -fomit-frame-pointer...
Re: Помогите новичку
Posted: Sun Feb 07, 2010 12:29 am
by Rock_maniak_forever
Пожалуйста, срочно помогите отловить клавишу ALT, очень надо. Делаю макрос полноценного MENUBAR'а, в нём должна клавиша ALT подсвечивать первую кнопку с надписью на экране. Пробовал код приведённый ниже, но в нём реакция на клавишу ALT происходит только после того, как я нажму какую ни-будь клавишу, а мне надо чтобы сразу. Причём чтобы была реакция при нажатии на любую клавишу ALT, как на правую, так и на левую. Скажите что не так, или если не трудно напишите пример.
Заранее спасибо.
Code: Select all
key:
; Логика кода:
; ------------
; 1. Отловить нажатие клавиш ALT, левой или правой.
; 2. Если была нажата любая из этих клавиш, зарисовать прямоугольник, иначе ничего не рисовать.
mov eax,66d ; ФУНКЦИЯ 66: установить режим ввода с клавиатуры..
mov ebx,1d ; в регистр ebx помещаем номер подфункции.
mov ecx,1d ; включаем режим сканкода.
int 0x40 ; вызываем системное прерывание.
mov al,2d ; считываем код нажатой клавиши. Возвращен в ah.
int 0x40 ; Клавиша должна быть прочитана для очистки системной очереди.
cmp ah,0x38 ; сравниваем значение в регистре со скан кодом клавиши ALT.
jne @f ; если не равно, то пропускаем зарисовку прямоугольника.
pushad ; сохраняем все регистры.
mov eax,13d ; ФУНКЦИЯ 13: зарисовать прямоугольник.
mov ebx,100d ; помещаем в регистр ebx координату по оси x.
shl ebx,16d ; умножаем на 65536.
add ebx,60d ; прибовляем размер по оси x.
mov ecx,80d ; помещаем в регистр ebx координату по оси y.
shl ecx,16d ; умножаем на 65536.
add ecx,40d ; прибовляем размер по оси y.
mov edx,0x00ff0000 ; помещаем в регистр edx цвет прямоугольника (красный цвет).
int 0x40 ; вызываем системное прерывание.
popad ; восстанавливаем все регистры.
@@:
cmp ah,KEY_ESCAPE
je close_program
jmp event_wait ; возврат к event_wait
Если надо, исходник прикреплён.
Re: Помогите новичку
Posted: Sun Feb 07, 2010 1:50 pm
by diamond
Ну дык переводить в режим сканкодов нужно один раз в начале программы или, во всяком случае, до момента отлавливания клавиш. Потому как действия при нажатии на клавишу зависят от режима, в котором в данный момент находится приложение, а не от режима, который установят когда-то в будущем.
Re: Помогите новичку
Posted: Mon Feb 08, 2010 12:29 am
by Rock_maniak_forever
diamond wrote:Ну дык переводить в режим сканкодов нужно один раз в начале программы или, во всяком случае, до момента отлавливания клавиш. Потому как действия при нажатии на клавишу зависят от режима, в котором в данный момент находится приложение, а не от режима, который установят когда-то в будущем.
Спасибо, попробую.
Re: Помогите новичку
Posted: Mon Feb 08, 2010 6:54 pm
by SoUrcerer
Очень нубский вопрос, пожалуй.
Подскажите, пожалуйста

Как мне ввести число, используя консоль?
То есть я в принципе знаю, что нужно ввести строку (или же используя con_getch считывать символы).И даже могу отрубить ненужное - то есть оставить строку, состоящую только из цифр.
Как перевести всё это дело в число?
Интересно и для целых чисел, и особенно для float-point..