Subversion Repositories Kolibri OS

Rev

Rev 31 | Rev 317 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 размер]
  106. ;   mov  ecx,200*65536+100         ; [y старт] *65536 + [y размер]
  107. ;   mov  edx,0x02aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
  108. ;   mov  esi,0x805080d0            ; цвет полосы заголовка RRGGBB,8->color gl
  109. ;   mov  edi,0x005080d0            ; цвет рамки            RRGGBB
  110. ;   int  0x40
  111.  
  112.     mcall 0, <200,200>, <200,50>, 0x02AABBCC, 0x805080D0, 0x005080D0
  113.  
  114.                                    ; ЗАГОЛОВОК ОКНА
  115. ;   mov  eax,4                     ; функция 4 : написать в окне текст
  116. ;   mov  ebx,8*65536+8             ; [x] *65536 + [y]
  117. ;   mov  ecx,0x10ddeeff            ; шрифт 1 и цвет ( 0xF0RRGGBB )
  118. ;   mov  edx,header                ; адрес строки
  119. ;   mov  esi,header.size           ; и её длина
  120. ;   int  0x40
  121.  
  122.     mcall 4, <8,8>, 0x10DDEEFF, header, header.size
  123.  
  124. ;   mov  eax,4
  125. ;   mov  ebx,8 shl 16 + 30
  126. ;   mov  ecx,0
  127. ;   mov  edx,message
  128. ;   mov  esi,message.size
  129. ;   int  0x40
  130.  
  131.     mcall 4, <8, 30>, 0, message, message.size
  132.  
  133.                                    ; КНОПКА ЗАКРЫТИЯ ОКНА
  134. ;   mov  eax,8                     ; функция 8 : определить и нарисовать кнопку
  135. ;   mov  ebx,(200-19)*65536+12     ; [x старт] *65536 + [x размер]
  136. ;   mov  ecx,5*65536+12            ; [y старт] *65536 + [y размер]
  137. ;   mov  edx,1                     ; идентификатор кнопки - 1
  138. ;   mov  esi,0x6688dd              ; цвет кнопки RRGGBB
  139. ;   int  0x40
  140.  
  141.     mcall 8, <200-19, 12>, <5, 12>, 1, 0x6688DD
  142.  
  143.     mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
  144.                                    ; 2, закончили рисовать
  145.  
  146.     ret                            ; выходим из процедуры
  147.  
  148.  
  149. ;---------------------------------------------------------------------
  150. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  151. ;---------------------------------------------------------------------
  152.  
  153. ; Вот такая вот короткая "мелодия".
  154. ; Второй байт изменяется нажатием клавишы
  155.  
  156. Music:
  157.   db  0x90, 0x30, 0
  158.  
  159.  
  160. ;---------------------------------------------------------------------
  161.  
  162. ; интерфейс программы многоязычный
  163. ;  Вы можете задать язык в MACROS.INC (lang fix язык)
  164.  
  165. lsz message,\
  166.   ru,'Нажмите любую клавишу...',\
  167.   en,'Press any key...',\
  168.   fr,'Pressez une touche...'
  169.  
  170. lsz header,\
  171.   ru,'ПРИМЕР ПРОГРАММЫ',\
  172.   en,'EXAMPLE APPLICATION',\
  173.   fr,"L'exemplaire programme"
  174.  
  175. ;---------------------------------------------------------------------
  176.  
  177. I_END:                             ; метка конца программы
  178.