Rev 6258 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3529 | mario79 | 1 | ; Простой пример программы для KolibriOS |
2 | ; озвучивает код нажатой клавиши |
||
3528 | mario79 | 3 | ; |
3529 | mario79 | 4 | ; Компилировать FASM'ом |
5 | ; Можно открыть example.asm через программу FASM (её ярлык есть |
||
6 | ; на рабочем столе) |
||
7 | ; А можно просто нажать F9 в Tinypad'е. Лог компиляции |
||
8 | ; отображается на доске отладки (программа BOARD) |
||
3528 | mario79 | 9 | ; |
3529 | mario79 | 10 | ; Что важно знать при программировании под Колибри: |
11 | ; Номер функции помещается в регистр eax. |
||
12 | ; Вызов системной функции осуществляется командой "int 0x40". |
||
13 | ; Все регистры, кроме явно указанных в возвращаемом значении, |
||
14 | ; включая регистр флагов eflags, сохраняются. |
||
3528 | mario79 | 15 | ; |
3529 | mario79 | 16 | ; Пример: |
17 | ; mov eax, 1 ;Функция 1 - поставить точку в окне |
||
18 | ; ;список сисфункций см. в DOCPACK - sysfuncr.txt |
||
19 | ; mov ebx, 10 ; координата x=10 |
||
20 | ; mov ecx, 20 ; координата y=10 |
||
21 | ; mov edx, 0xFFFfff ;цвет точки |
||
22 | ; int 0x40 ;вызвать функцию |
||
3528 | mario79 | 23 | ; |
3529 | mario79 | 24 | ; Тоже самое с использованием макроса: |
25 | ; mcall 1, 10, 20, 0xFFFfff |
||
26 | ;--------------------------------------------------------------------- |
||
27 | |||
28 | use32 ; включить 32-битный режим ассемблера |
||
6890 | IgorA | 29 | org 0 ; адресация с нуля |
3529 | mario79 | 30 | |
31 | db 'MENUET01' ; 8-байтный идентификатор MenuetOS |
||
6890 | IgorA | 32 | dd 1 ; версия заголовка (всегда 1) |
3529 | mario79 | 33 | dd START ; адрес первой команды |
34 | dd I_END ; размер программы |
||
6890 | IgorA | 35 | dd MEM ; количество памяти |
36 | dd STACKTOP ; адрес вершины стэка |
||
37 | dd 0 ; адрес буфера для параметров |
||
38 | dd 0 ; зарезервировано |
||
3529 | mario79 | 39 | |
6258 | leency | 40 | include "macros.inc" ; макросы облегчают жизнь ассемблерщиков! |
3529 | mario79 | 41 | |
42 | ;--------------------------------------------------------------------- |
||
43 | ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- |
||
44 | ;--------------------------------------------------------------------- |
||
45 | |||
46 | START: |
||
47 | |||
48 | red: ; перерисовать окно |
||
49 | |||
50 | call draw_window ; вызываем процедуру отрисовки окна |
||
51 | |||
52 | ;--------------------------------------------------------------------- |
||
53 | ;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- |
||
54 | ;--------------------------------------------------------------------- |
||
55 | |||
56 | still: |
||
57 | mcall 10 ; функция 10 - ждать события |
||
58 | |||
59 | cmp eax,1 ; перерисовать окно ? |
||
60 | je red ; если да - на метку red |
||
61 | cmp eax,2 ; нажата клавиша ? |
||
62 | je key ; если да - на key |
||
63 | cmp eax,3 ; нажата кнопка ? |
||
64 | je button ; если да - на button |
||
65 | |||
66 | jmp still ; если другое событие - в начало цикла |
||
67 | |||
68 | |||
69 | ;--------------------------------------------------------------------- |
||
70 | |||
71 | |||
72 | key: ; нажата клавиша на клавиатуре |
||
73 | mcall 2 ; функция 2 - считать код символа (в ah) |
||
74 | |||
75 | mov [Music+1], ah ; записать код символа как код ноты |
||
76 | |||
77 | ; функция 55-55: системный динамик ("PlayNote") |
||
78 | ; esi - адрес мелодии |
||
79 | |||
80 | ; mov eax,55 |
||
81 | ; mov ebx,eax |
||
82 | ; mov esi,Music |
||
83 | ; int 0x40 |
||
84 | |||
85 | ; или коротко: |
||
86 | mcall 55, eax, , , Music |
||
87 | |||
88 | jmp still ; вернуться к началу цикла |
||
89 | |||
90 | ;--------------------------------------------------------------------- |
||
91 | |||
92 | button: |
||
93 | mcall 17 ; 17 - получить идентификатор нажатой кнопки |
||
94 | |||
95 | cmp ah, 1 ; если НЕ нажата кнопка с номером 1, |
||
96 | jne still ; вернуться |
||
97 | |||
98 | .exit: |
||
99 | mcall -1 ; иначе конец программы |
||
100 | |||
101 | |||
102 | ;--------------------------------------------------------------------- |
||
103 | ;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- |
||
104 | ;--------------------------------------------------------------------- |
||
105 | |||
106 | draw_window: |
||
107 | |||
6258 | leency | 108 | mcall 12, 1 ; функция 12: сообщить ОС о начале отрисовки |
109 | |||
110 | mcall 48, 3, sc,sizeof.system_colors |
||
111 | |||
3529 | mario79 | 112 | ; далее: сначала длинный вариант (закомментированный) |
6258 | leency | 113 | ; затем короткий аналог с использованием макросов |
3529 | mario79 | 114 | |
6258 | leency | 115 | ; mov eax,0 ; функция 0: определить окно |
116 | ; mov ebx,200*65536+300 ; [x старт] *65536 + [x размер] |
||
117 | ; mov ecx,200*65536+150 ; [y старт] *65536 + [y размер] |
||
118 | ; mov edx, [sc.work] ; цвет фона |
||
119 | ; or edx, 0x33000000 ; и тип окна 3 |
||
120 | ; mov edi,header ; ЗАГОЛОВОК ОКНА |
||
3529 | mario79 | 121 | ; int 0x40 |
122 | |||
6258 | leency | 123 | mov edx, [sc.work] ; цвет фона |
124 | or edx, 0x33000000 ; и тип окна 3 |
||
125 | mcall 0, <200,300>, <200,150>, , ,title |
||
3529 | mario79 | 126 | |
6258 | leency | 127 | ; вывод текстовой строки |
128 | mov ecx, [sc.work_text] ; цвет фона |
||
129 | or ecx, 0x90000000 ; и тип строки |
||
6890 | IgorA | 130 | mcall 4, <10, 20>, , message |
3529 | mario79 | 131 | |
6890 | IgorA | 132 | |
6258 | leency | 133 | mcall 12, 2 ; функция 12.2, закончили рисовать |
3529 | mario79 | 134 | |
6258 | leency | 135 | ret ; выходим из процедуры |
3529 | mario79 | 136 | |
137 | |||
138 | ;--------------------------------------------------------------------- |
||
139 | ;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- |
||
140 | ;--------------------------------------------------------------------- |
||
141 | |||
142 | ; Вот такая вот короткая "мелодия". |
||
143 | ; Второй байт изменяется нажатием клавишы |
||
144 | |||
145 | Music: |
||
146 | db 0x90, 0x30, 0 |
||
147 | |||
6258 | leency | 148 | sc system_colors |
3529 | mario79 | 149 | |
6258 | leency | 150 | message db 'Нажмите любую клавишу...',0 |
151 | title db 'Пример программы',0 |
||
3529 | mario79 | 152 | |
153 | ;--------------------------------------------------------------------- |
||
154 | |||
6890 | IgorA | 155 | I_END: ; метка конца программы |
156 | rb 4096 ; память для стека |
||
157 | align 16 |
||
158 | STACKTOP: ; метка вершины стека (при заполнении стек |
||
159 | ; растет в сторону уменьшения адресов, потому |
||
160 | ; память для него в коде программы встречается |
||
161 | ; раньше чем его вершина) |
||
162 | MEM: ; метка указывающая на конец программы плюс |
||
163 | ; размер используемой ею оперативной памяти |
||
164 | ; Адрес метки MEM всегда должен быть больше чем адрес метки I_END. |
||
165 | ; Метка STACKTOP должна располагается после метки I_END и перед меткой |
||
166 | ; MEM. STACKTOP может находится и перед I_END, но это не правильно. |
||
167 | ; Имена меток могут быть с любыми названиями, главное соблюдать |
||
168 | ; правильный порядок их расположения.10,>200,150>200,300> |