Subversion Repositories Kolibri OS

Rev

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:                             ; метка конца программы