;
; Пример программы для MenuetOS
; озвучивает код нажатой клавиши ;)
;
; Компилировать FASM'ом
;
; См. также:
; template.asm - пример простейшей программы (новый!)
; rb.asm - контекстное меню рабочего стола
; example2.asm - пример меню и дополнительных окон
; example3.asm - пример меню, реализованного по-другому
;---------------------------------------------------------------------
use32 ; включить 32-битный режим ассемблера
org 0x0 ; адресация с нуля
db 'MENUET01' ; 8-байтный идентификатор MenuetOS
dd 0x01 ; версия заголовка (всегда 1)
dd START ; адрес первой команды
dd I_END ; размер программы
dd 0x1000 ; количество памяти
dd 0x1000 ; адрес вершины стэка
dd 0x0 ; адрес буфера для параметров (не используется)
dd 0x0 ; зарезервировано
include 'lang.inc'
include 'macros.inc' ; макросы облегчают жизнь ассемблерщиков!
;---------------------------------------------------------------------
;--- НАЧАЛО ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
START:
red: ; перерисовать окно
call draw_window ; вызываем процедуру отрисовки окна
;---------------------------------------------------------------------
;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ----------------------------------------
;---------------------------------------------------------------------
still:
mcall 10 ; функция 10 - ждать события
cmp eax,1 ; перерисовать окно ?
je red ; если да - на метку red
cmp eax,2 ; нажата клавиша ?
je key ; если да - на key
cmp eax,3 ; нажата кнопка ?
je button ; если да - на button
jmp still ; если другое событие - в начало цикла
;---------------------------------------------------------------------
key: ; нажата клавиша на клавиатуре
mcall 2 ; функция 2 - считать код символа (в ah)
mov [Music+1], ah ; записать код символа как код ноты
; функция 55-55: системный динамик ("PlayNote")
; esi - адрес мелодии
; mov eax,55
; mov ebx,eax
; mov esi,Music
; int 0x40
; или коротко:
mcall 55, eax, , , Music
jmp still ; вернуться к началу цикла
;---------------------------------------------------------------------
button:
mcall 17 ; 17 - получить идентификатор нажатой кнопки
cmp ah, 1 ; если НЕ нажата кнопка с номером 1,
jne still ; вернуться
.exit:
mcall -1 ; иначе конец программы
;---------------------------------------------------------------------
;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ----------------------------------
;---------------------------------------------------------------------
draw_window:
mcall 12, 1 ; функция 12: сообщить ОС об отрисовке окна
; 1 - начинаем рисовать
; далее: сначала длинный вариант (закомментированный)
; затем короткий аналог с использованием макросов
; СОЗДАЁМ ОКНО
; mov eax,0 ; функция 0 : определить и отрисовать окно
; mov ebx,200*65536+200 ; [x старт] *65536 + [x размер]
; mov ecx,200*65536+100 ; [y старт] *65536 + [y размер]
; mov edx,0x02aabbcc ; цвет рабочей области RRGGBB,8->color gl
; mov esi,0x805080d0 ; цвет полосы заголовка RRGGBB,8->color gl
; mov edi,0x005080d0 ; цвет рамки RRGGBB
; int 0x40
mcall 0, <200,200>, <200,50>, 0x02AABBCC, 0x805080D0, 0x005080D0
; ЗАГОЛОВОК ОКНА
; mov eax,4 ; функция 4 : написать в окне текст
; mov ebx,8*65536+8 ; [x] *65536 + [y]
; mov ecx,0x10ddeeff ; шрифт 1 и цвет ( 0xF0RRGGBB )
; mov edx,header ; адрес строки
; mov esi,header.size ; и её длина
; int 0x40
mcall 4, <8,8>, 0x10DDEEFF, header, header.size
; mov eax,4
; mov ebx,8 shl 16 + 30
; mov ecx,0
; mov edx,message
; mov esi,message.size
; int 0x40
mcall 4, <8, 30>, 0, message, message.size
; КНОПКА ЗАКРЫТИЯ ОКНА
; mov eax,8 ; функция 8 : определить и нарисовать кнопку
; mov ebx,(200-19)*65536+12 ; [x старт] *65536 + [x размер]
; mov ecx,5*65536+12 ; [y старт] *65536 + [y размер]
; mov edx,1 ; идентификатор кнопки - 1
; mov esi,0x6688dd ; цвет кнопки RRGGBB
; int 0x40
mcall 8, <200-19, 12>, <5, 12>, 1, 0x6688DD
mcall 12, 2 ; функция 12: сообщить ОС об отрисовке окна
; 2, закончили рисовать
ret ; выходим из процедуры
;---------------------------------------------------------------------
;--- ДАННЫЕ ПРОГРАММЫ ----------------------------------------------
;---------------------------------------------------------------------
; Вот такая вот короткая "мелодия".
; Второй байт изменяется нажатием клавишы
Music:
db 0x90, 0x30, 0
;---------------------------------------------------------------------
; интерфейс программы многоязычный
; Вы можете задать язык в MACROS.INC (lang fix язык)
lsz message,\
ru,'Нажмите любую клавишу...',\
en,'Press any key...',\
fr,'Pressez une touche...'
lsz header,\
ru,'ПРИМЕР ПРОГРАММЫ',\
en,'EXAMPLE APPLICATION',\
fr,"L'exemplaire programme"
;---------------------------------------------------------------------
I_END: ; метка конца программы