git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
178 lines
5.7 KiB
FASM
178 lines
5.7 KiB
FASM
;
|
||
; Пример программы для 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: ; метка конца программы
|