Subversion Repositories Kolibri OS

Rev

Rev 3528 | 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-битный режим ассемблера
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      ; адрес вершины стэка
37
  dd     0x0         ; адрес буфера для параметров
38
  dd     0x0         ; зарезервировано
39
 
40
include 'lang.inc'
41
include 'macros.inc' ; макросы облегчают жизнь ассемблерщиков!
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 размер]
120
;   mov  ecx,200*65536+50          ; [y старт] *65536 + [y размер]
121
;   mov  edx,0x33aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
122
;   mov  edi,header                ; ЗАГОЛОВОК ОКНА
123
;   int  0x40
124
 
125
    mcall 0, <200,200>, <200,50>, 0x33AABBCC,,title
126
 
127
 
128
 
129
;   mov  eax,4
130
;   mov  ebx,3 shl 16 + 8
131
;   mov  ecx,0
132
;   mov  edx,message
133
;   mov  esi,message.size
134
;   int  0x40
135
 
136
    mcall 4, <3, 8>, 0, message, message.size
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
 
165
lsz title,\
166
  ru,'ПРИМЕР ПРОГРАММЫ',\
167
  en,'EXAMPLE APPLICATION',\
168
  fr,"L'exemplaire programme"
169
 
170
;---------------------------------------------------------------------
171
 
172
I_END:                             ; метка конца программы