;
;   Пример программы для 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+50          ; [y старт] *65536 + [y размер]
;   mov  edx,0x33aabbcc            ; цвет рабочей области  RRGGBB,8->color gl
;   mov  edi,header                ; ЗАГОЛОВОК ОКНА
;   int  0x40

    mcall 0, <200,200>, <200,50>, 0x33AABBCC,,title

                                   

;   mov  eax,4
;   mov  ebx,3 shl 16 + 8
;   mov  ecx,0
;   mov  edx,message
;   mov  esi,message.size
;   int  0x40

    mcall 4, <3, 8>, 0, message, message.size

    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 title,\
  ru,'ПРИМЕР ПРОГРАММЫ',\
  en,'EXAMPLE APPLICATION',\
  fr,"L'exemplaire programme"

;---------------------------------------------------------------------

I_END:                             ; метка конца программы
