Subversion Repositories Kolibri OS

Rev

Rev 109 | Rev 485 | Go to most recent revision | Details | Compare with Previous | 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 размер]
317 heavyiron 106
;   mov  ecx,200*65536+50          ; [y старт] *65536 + [y размер]
107
;   mov  edx,0x33aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
108
;   mov  edi,header                ; ЗАГОЛОВОК ОКНА
31 halyavin 109
;   int  0x40
110
 
317 heavyiron 111
    mcall 0, <200,200>, <200,50>, 0x33AABBCC,,header
31 halyavin 112
 
317 heavyiron 113
 
31 halyavin 114
 
115
;   mov  eax,4
317 heavyiron 116
;   mov  ebx,3 shl 16 + 8
31 halyavin 117
;   mov  ecx,0
118
;   mov  edx,message
119
;   mov  esi,message.size
120
;   int  0x40
121
 
317 heavyiron 122
    mcall 4, <3, 8>, 0, message, message.size
31 halyavin 123
 
124
    mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
125
                                   ; 2, закончили рисовать
126
 
127
    ret                            ; выходим из процедуры
128
 
129
 
130
;---------------------------------------------------------------------
131
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
132
;---------------------------------------------------------------------
133
 
134
; Вот такая вот короткая "мелодия".
135
; Второй байт изменяется нажатием клавишы
136
 
137
Music:
138
  db  0x90, 0x30, 0
139
 
140
 
141
;---------------------------------------------------------------------
142
 
143
; интерфейс программы многоязычный
144
;  Вы можете задать язык в MACROS.INC (lang fix язык)
145
 
146
lsz message,\
147
  ru,'Нажмите любую клавишу...',\
148
  en,'Press any key...',\
149
  fr,'Pressez une touche...'
150
 
151
lsz header,\
152
  ru,'ПРИМЕР ПРОГРАММЫ',\
153
  en,'EXAMPLE APPLICATION',\
154
  fr,"L'exemplaire programme"
155
 
156
;---------------------------------------------------------------------
157
 
158
I_END:                             ; метка конца программы