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, как на правую, так и на левую. Скажите что не так, или если не трудно напишите пример.

Заранее спасибо. :D

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..