Subversion Repositories Kolibri OS

Rev

Rev 3529 | 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 "macros.inc" ; макросы облегчают жизнь ассемблерщиков!
  41.  
  42. ;---------------------------------------------------------------------
  43. ;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
  44. ;---------------------------------------------------------------------
  45.  
  46. START:
  47.  
  48. red:                    ; перерисовать окно
  49.  
  50.     call draw_window    ; вызываем процедуру отрисовки окна
  51.  
  52. ;---------------------------------------------------------------------
  53. ;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
  54. ;---------------------------------------------------------------------
  55.  
  56. still:
  57.     mcall 10            ; функция 10 - ждать события
  58.  
  59.     cmp  eax,1          ; перерисовать окно ?
  60.     je   red            ; если да - на метку red
  61.     cmp  eax,2          ; нажата клавиша ?
  62.     je   key            ; если да - на key
  63.     cmp  eax,3          ; нажата кнопка ?
  64.     je   button         ; если да - на button
  65.  
  66.     jmp  still          ; если другое событие - в начало цикла
  67.  
  68.  
  69. ;---------------------------------------------------------------------
  70.  
  71.  
  72.   key:                  ; нажата клавиша на клавиатуре
  73.     mcall 2             ; функция 2 - считать код символа (в ah)
  74.  
  75.     mov  [Music+1], ah  ; записать код символа как код ноты
  76.  
  77.     ; функция 55-55: системный динамик ("PlayNote")
  78.     ;   esi - адрес мелодии
  79.  
  80.     ;   mov  eax,55
  81.     ;   mov  ebx,eax
  82.     ;   mov  esi,Music
  83.     ;   int  0x40
  84.  
  85.     ; или коротко:
  86.     mcall 55, eax, , , Music
  87.  
  88.     jmp  still          ; вернуться к началу цикла
  89.  
  90. ;---------------------------------------------------------------------
  91.  
  92.   button:
  93.     mcall 17            ; 17 - получить идентификатор нажатой кнопки
  94.  
  95.     cmp   ah, 1         ; если НЕ нажата кнопка с номером 1,
  96.     jne   still         ;  вернуться
  97.  
  98.   .exit:
  99.     mcall -1            ; иначе конец программы
  100.  
  101.  
  102. ;---------------------------------------------------------------------
  103. ;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
  104. ;---------------------------------------------------------------------
  105.  
  106. draw_window:
  107.  
  108.     mcall 12, 1       ; функция 12: сообщить ОС о начале отрисовки
  109.        
  110.     mcall 48, 3, sc,sizeof.system_colors
  111.        
  112.     ; далее: сначала длинный вариант (закомментированный)
  113.     ; затем короткий аналог с использованием макросов
  114.  
  115. ;   mov  eax,0                   ; функция 0: определить окно
  116. ;   mov  ebx,200*65536+300       ; [x старт] *65536 + [x размер]
  117. ;   mov  ecx,200*65536+150       ; [y старт] *65536 + [y размер]
  118. ;   mov  edx, [sc.work]          ; цвет фона
  119. ;   or   edx, 0x33000000         ; и тип окна 3
  120. ;   mov  edi,header              ; ЗАГОЛОВОК ОКНА
  121. ;   int  0x40
  122.  
  123.     mov   edx, [sc.work]         ; цвет фона
  124.     or    edx, 0x33000000        ; и тип окна 3
  125.     mcall 0, <200,300>, <200,150>, , ,title
  126.  
  127.     ; вывод текстовой строки
  128.     mov   ecx, [sc.work_text]    ; цвет фона
  129.     or    ecx, 0x90000000        ; и тип строки
  130.     mcall 4, <10, 20>, 0x90000000, message
  131.  
  132.        
  133.     mcall 12, 2                  ; функция 12.2, закончили рисовать
  134.  
  135.     ret                          ; выходим из процедуры
  136.  
  137.  
  138. ;---------------------------------------------------------------------
  139. ;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
  140. ;---------------------------------------------------------------------
  141.  
  142. ; Вот такая вот короткая "мелодия".
  143. ; Второй байт изменяется нажатием клавишы
  144.  
  145. Music:
  146.   db  0x90, 0x30, 0
  147.  
  148. sc system_colors
  149.  
  150. message db 'Нажмите любую клавишу...',0
  151. title db 'Пример программы',0
  152.  
  153. ;---------------------------------------------------------------------
  154.  
  155. I_END:                           ; метка конца программы
  156.