Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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