Subversion Repositories Kolibri OS

Rev

Rev 109 | Rev 485 | 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+50          ; [y старт] *65536 + [y размер]
  107. ;   mov  edx,0x33aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
  108. ;   mov  edi,header                ; ЗАГОЛОВОК ОКНА
  109. ;   int  0x40
  110.  
  111.     mcall 0, <200,200>, <200,50>, 0x33AABBCC,,header
  112.  
  113.                                    
  114.  
  115. ;   mov  eax,4
  116. ;   mov  ebx,3 shl 16 + 8
  117. ;   mov  ecx,0
  118. ;   mov  edx,message
  119. ;   mov  esi,message.size
  120. ;   int  0x40
  121.  
  122.     mcall 4, <3, 8>, 0, message, message.size
  123.  
  124.     mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
  125.                                    ; 2, закончили рисовать
  126.  
  127.     ret                            ; выходим из процедуры
  128.  
  129.  
  130. ;---------------------------------------------------------------------
  131. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  132. ;---------------------------------------------------------------------
  133.  
  134. ; Вот такая вот короткая "мелодия".
  135. ; Второй байт изменяется нажатием клавишы
  136.  
  137. Music:
  138.   db  0x90, 0x30, 0
  139.  
  140.  
  141. ;---------------------------------------------------------------------
  142.  
  143. ; интерфейс программы многоязычный
  144. ;  Вы можете задать язык в MACROS.INC (lang fix язык)
  145.  
  146. lsz message,\
  147.   ru,'Нажмите любую клавишу...',\
  148.   en,'Press any key...',\
  149.   fr,'Pressez une touche...'
  150.  
  151. lsz header,\
  152.   ru,'ПРИМЕР ПРОГРАММЫ',\
  153.   en,'EXAMPLE APPLICATION',\
  154.   fr,"L'exemplaire programme"
  155.  
  156. ;---------------------------------------------------------------------
  157.  
  158. I_END:                             ; метка конца программы
  159.