Приветствую Вас, Гость! Регистрация RSS
Среда, 14.11.2018
Главная » 2014 » Февраль » 26 » Создаем свое первое приложение для KolibriOS
11:54
Создаем свое первое приложение для KolibriOS
  Разработка приложений под KolibriOS сильно зависит от сложности реализуемой программы. Для разработки в этой статье я буду использовать FASM (позднее рассмотрим другие языки программирования). Я не буду учить ассемблеру, буду описывать сами инструкции и что они делают, не более. Начнем пожалуй с того, что исполняемые файлы в KOS, отличаются от всех других OS и соответственно имеют свою структуру.
  Заголовок приложений в KOS занимает всего ничего (36 байт). Это один из факторов того, что сама ОС настолько миниатюрная. И так, давайте приступим к написанию нашей первой программы (это довольно просто). Для начала разберемся с тем самым заголовком. Для этого опишем каркас приложения.

; директивы
; заголовок

I_START:
; основной цикл событий
; функции реакции на события
; весь остальной быдлокод
I_END:


ДИРЕКТИВЫ КОМПИЛЯТОРА
use32 - переключает компилятор в 32-битный режим (т.к. 21 век и KOS как ни как 32х разрядная ОС).
org 0x0 - устанавливает адрес, по которому следующий за ней код должен появиться в памяти.
  Именно из-за невозможности некоторых компиляторов (например Delphi) устанавливать адрес в 0х00 и возникают проблемы при их использовании (ну мы то справимся).
ЗАГОЛОВОК ПРИЛОЖЕНИЯ
db 'MENUET01' - идентификатор исполняемого файла (8 байт).
dd 0x01 - версия формата заголовка исполняемого файла.
dd I_START - адрес, на который система передаёт управление после загрузки приложения в память.
dd I_END - размер приложения (fasm сам его вычислит и подставит т.к. I_END: стоит в конце).
dd 0x100000 - объём необходимой приложению памяти ( от 0x0 до этого значения).
dd 0x100000 - вершина стека в диапазоне памяти, указанном выше.
dd 0x0 -указатель на строку с параметрами (если равна 0, то запуск был без параметров).
dd 0x0 -указатель на строку, в которую записан путь, откуда было запущено приложение.

  Ну вот и весь заголовок! Работа с памятью и разбором параметров - темы будующих статей, поэтому сейчас не будем акцентировать своё внимание на этом.
  Идентификатор исполняемого файла сохранился ещё со времен ответвления KolibriOS от Menuet OS (32). Группа разработчиков давно намеревается его изменить, но пока нет дела до такой мелочи, поэтому скоро появится (возможно уже появился) новый текстовый идентификатор, ну а старый будет оставлен для совместимости софта.

ОСНОВНОЙ ЦИКЛ СОБЫТИЙ
call event_draw - вызываем первоначальную отрисовку (тело будет описано ниже).
event:
mov eax, 10 - функция ядра 10 - ждать события (wiki), возвращает номер события в EAX
int 0x40 - инструкция прерывания (вызов функции ядра).
;1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
;2 = нажата клавиша на клавиатуре (поступает, только когда окно активно) или нажата "горячая клавиша"
;3 = нажата кнопка, определённая ранее функцией 8


cmp eax,1 - в EAX у нас номер события (см. полный список событий в самом низу)
je event_draw - если сравнение с 1 верно (jump equal) тогда вызываем функцию отрисовки.
cmp eax,2 - событие о нажатой клавише?
je event_key - если сравнение верно, то переходим на функцию отработки нажатия клавиши.
cmp eax,3 - событие о нажатой кнопке?
je event_button - если сравнение верно, то переходим на функцию отработки нажатия кнопки.
jmp event - если другое событие - в начало цикла
  Три события описанные выше, включенны по умолчанию именно по этому в данном примере только они. В последующем мы научимся включать и выключать требуемые нам события (например события мыши).

ФУНКЦИИ РЕАКЦИИ НА СОБЫТИЯ
event_button
event_button: - метка на начало обработки события нажатия кнопок.
mov eax,17 - записываем в EAX число 17 (функция ядра - получить идентификатор нажатой кнопки)
int 0x40 - инструкция прерывания (вызов функции ядра). Ядро вернет значение в EAX.
cmp ah, 1 - сравниваем часть регистра EAX с 1, кнопка с id=1("закрыть") (крестик)
je button_exit - если событие от нее, то переходим на индивидуальный обработчик.
jmp event - т.к. других кнопок нет (кроме крестика создаваемого ОС), то переходим в начало цикла событий.

button_exit: - метка на начало обработки события кнопки закрыть.
mov eax,-1 - функция ядра (-1) - это закрыть приложение
int 0x40 - вызываем её

event_key
event_key: - метка на начало обработки события нажатия клавиш.
mov eax,2 - считываем код нажатой клавиши (функция ядра 2). Результат в ah.
int 0x40 - вызываем функцию т.к. клавиша должна быть прочитана для очистки системного буфера.
jmp event - т.к. мы никакие клавишы не хотим обрабатывать, то едем на ожидание события.

; event_draw
event_draw:       ; метка на начало обработки события перерисовки.
  mov     eax, 12 ; функция 12: означает, что будет рисоваться окно.
  mov     ebx, 1  ; подфункция 1,начало рисования.
  int     0x40    ; вызываем функцию 12, подфункцию 1.


mov eax,48 ; Функция 48 - стили отображения окон
mov ebx,3 ; Подфункция 3 - получить стандартные цвета окон.
mov ecx,sc ; Указатель на буфер размером edx байт, под структуру
mov edx,sizeof.system_colors ; Размер таблицы цветов (должен быть 40 байт)
int 0x40 ; Прерывание

mov eax,48 ; Функция 48 - стили отображения окон.
mov ebx,4 ; Подфункция 4 - возвращает eax = высота скина.
int 0x40 ; Прерывание
mov ecx,eax ; Запоминаем высоту скина

xor eax,eax ; Очищаем eax (mov eax,0) (Функция 0)
mov ebx,200 shl 16+517 ; [координата по оси x]*65536 + [размер по оси x]
add ecx,200 shl 16+116 ; Высота скина + [координата по y]*65536 + [размер по y]
mov edx,[sc.work] ; Видимо стиль окна по дефолту
or edx,0x34000000 ; Или окно со скином фиксированных размеров
mov edi,title ; Заголовок окна
int 0x40 ; Прерывание

mov eax,4 ; функция 4: написать текст в окне
mov ebx,10*65536 + 50 ; [x начальный] *65536 + [y начальный]
mov ecx,0x40000000 ; цвет текста RRGGBB
mov edx,string_b ; указатель на начало текста
;mov esi,9 ; длина текста в байтах
mov edi,[sc.grab]
int 0x40

mov eax,12 ; функция 12: означает, что будет рисоваться окно
mov ebx,2 ; 1,начало рисования
int 0x40 ; Прерывание
Категория: KolibriOs | Просмотров: 514 | Добавил: Akyltist | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]