; ; Пример программы для 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+50 ; [y старт] *65536 + [y размер] ; mov edx,0x33aabbcc ; цвет рабочей области RRGGBB,8->color gl ; mov edi,header ; ЗАГОЛОВОК ОКНА ; int 0x40 mcall 0, <200,200>, <200,50>, 0x33AABBCC,,header ; mov eax,4 ; mov ebx,3 shl 16 + 8 ; mov ecx,0 ; mov edx,message ; mov esi,message.size ; int 0x40 mcall 4, <3, 8>, 0, message, message.size 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: ; метка конца программы