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