Files
kolibrios/programs/example/trunk/example.asm
T
Andrey Halyavin (halyavin) 065b8d32b2 programs sources added
git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-01-03 09:43:31 +00:00

178 lines
5.7 KiB
FASM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;
; Пример программы для 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: ; метка конца программы