Subversion Repositories Kolibri OS

Rev

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

  1. ;   Простой пример программы для KolibriOS
  2. ;   озвучивает код нажатой клавиши
  3. ;
  4. ;   Компилировать FASM'ом
  5. ;        Можно открыть example.asm через программу FASM (её ярлык есть
  6. ;        на рабочем столе)
  7. ;        А можно просто нажать F9 в Tinypad'е. Лог компиляции
  8. ;        отображается на доске отладки (программа BOARD)
  9. ;
  10. ;   Что важно знать при программировании под Колибри:
  11. ;        Номер функции помещается в регистр eax.
  12. ;        Вызов системной функции осуществляется командой "int 0x40".
  13. ;        Все регистры, кроме явно указанных в возвращаемом значении,
  14. ;        включая регистр флагов eflags, сохраняются.
  15. ;
  16. ;    Пример:
  17. ;        mov eax, 1    ;Функция 1 - поставить точку в окне
  18. ;                      ;список сисфункций см. в DOCPACK - sysfuncr.txt
  19. ;        mov ebx, 10   ; координата x=10
  20. ;        mov ecx, 20   ; координата y=10
  21. ;        mov edx, 0xFFFfff ;цвет точки
  22. ;        int 0x40      ;вызвать функцию
  23. ;
  24. ;    Тоже самое с использованием макроса:
  25. ;        mcall 1, 10, 20, 0xFFFfff
  26. ;---------------------------------------------------------------------
  27.  
  28.   use32              ; включить 32-битный режим ассемблера
  29.   org    0x0         ; адресация с нуля
  30.  
  31.   db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  32.   dd     0x01        ; версия заголовка (всегда 1)
  33.   dd     START       ; адрес первой команды
  34.   dd     I_END       ; размер программы
  35.   dd     0x1000      ; количество памяти
  36.   dd     0x1000      ; адрес вершины стэка
  37.   dd     0x0         ; адрес буфера для параметров
  38.   dd     0x0         ; зарезервировано
  39.  
  40. include 'lang.inc'
  41. include 'macros.inc' ; макросы облегчают жизнь ассемблерщиков!
  42.  
  43. ;---------------------------------------------------------------------
  44. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  45. ;---------------------------------------------------------------------
  46.  
  47. START:
  48.  
  49. red:                    ; перерисовать окно
  50.  
  51.     call draw_window    ; вызываем процедуру отрисовки окна
  52.  
  53. ;---------------------------------------------------------------------
  54. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  55. ;---------------------------------------------------------------------
  56.  
  57. still:
  58.     mcall 10            ; функция 10 - ждать события
  59.  
  60.     cmp  eax,1          ; перерисовать окно ?
  61.     je   red            ; если да - на метку red
  62.     cmp  eax,2          ; нажата клавиша ?
  63.     je   key            ; если да - на key
  64.     cmp  eax,3          ; нажата кнопка ?
  65.     je   button         ; если да - на button
  66.  
  67.     jmp  still          ; если другое событие - в начало цикла
  68.  
  69.  
  70. ;---------------------------------------------------------------------
  71.  
  72.  
  73.   key:                  ; нажата клавиша на клавиатуре
  74.     mcall 2             ; функция 2 - считать код символа (в ah)
  75.  
  76.     mov  [Music+1], ah  ; записать код символа как код ноты
  77.  
  78.     ; функция 55-55: системный динамик ("PlayNote")
  79.     ;   esi - адрес мелодии
  80.  
  81.     ;   mov  eax,55
  82.     ;   mov  ebx,eax
  83.     ;   mov  esi,Music
  84.     ;   int  0x40
  85.  
  86.     ; или коротко:
  87.     mcall 55, eax, , , Music
  88.  
  89.     jmp  still          ; вернуться к началу цикла
  90.  
  91. ;---------------------------------------------------------------------
  92.  
  93.   button:
  94.     mcall 17            ; 17 - получить идентификатор нажатой кнопки
  95.  
  96.     cmp   ah, 1         ; если НЕ нажата кнопка с номером 1,
  97.     jne   still         ;  вернуться
  98.  
  99.   .exit:
  100.     mcall -1            ; иначе конец программы
  101.  
  102.  
  103.  
  104. ;---------------------------------------------------------------------
  105. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  106. ;---------------------------------------------------------------------
  107.  
  108. draw_window:
  109.  
  110.     mcall 12, 1                    ; функция 12: сообщить ОС об отрисовке окна
  111.                                    ; 1 - начинаем рисовать
  112.  
  113.     ; далее: сначала длинный вариант (закомментированный)
  114.     ;        затем короткий аналог с использованием макросов
  115.  
  116.  
  117.                                    ; СОЗДАЁМ ОКНО
  118. ;   mov  eax,0                     ; функция 0 : определить и отрисовать окно
  119. ;   mov  ebx,200*65536+200         ; [x старт] *65536 + [x размер]
  120. ;   mov  ecx,200*65536+50          ; [y старт] *65536 + [y размер]
  121. ;   mov  edx,0x33aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
  122. ;   mov  edi,header                ; ЗАГОЛОВОК ОКНА
  123. ;   int  0x40
  124.  
  125.     mcall 0, <200,200>, <200,50>, 0x33AABBCC,,title
  126.  
  127.                                    
  128.  
  129. ;   mov  eax,4
  130. ;   mov  ebx,3 shl 16 + 8
  131. ;   mov  ecx,0
  132. ;   mov  edx,message
  133. ;   mov  esi,message.size
  134. ;   int  0x40
  135.  
  136.     mcall 4, <3, 8>, 0, message, message.size
  137.  
  138.     mcall 12, 2                    ; функция 12: сообщить ОС об отрисовке окна
  139.                                    ; 2, закончили рисовать
  140.  
  141.     ret                            ; выходим из процедуры
  142.  
  143.  
  144. ;---------------------------------------------------------------------
  145. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  146. ;---------------------------------------------------------------------
  147.  
  148. ; Вот такая вот короткая "мелодия".
  149. ; Второй байт изменяется нажатием клавишы
  150.  
  151. Music:
  152.   db  0x90, 0x30, 0
  153.  
  154.  
  155. ;---------------------------------------------------------------------
  156.  
  157. ; интерфейс программы многоязычный
  158. ;  Вы можете задать язык в MACROS.INC (lang fix язык)
  159.  
  160. lsz message,\
  161.   ru,'Нажмите любую клавишу...',\
  162.   en,'Press any key...',\
  163.   fr,'Pressez une touche...'
  164.  
  165. lsz title,\
  166.   ru,'ПРИМЕР ПРОГРАММЫ',\
  167.   en,'EXAMPLE APPLICATION',\
  168.   fr,"L'exemplaire programme"
  169.  
  170. ;---------------------------------------------------------------------
  171.  
  172. I_END:                             ; метка конца программы
  173.