;
;   @notify, pop-up windows
;   by Sourcerer, 20.01.2011
;   
;---------------------------------------------------------------------

  use32              ; включить 32-битный режим ассемблера
  org    0x0         ; адресация с нуля

  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  dd     0x01        ; версия заголовка (всегда 1)
  dd     START       ; адрес первой команды
  dd     I_END       ; размер программы
  dd     0x1000      ; количество памяти
  dd     0x1000      ; адрес вершины стэка
  dd     I_PARAM     ; адрес буфера для параметров 
  dd     0x0         ; зарезервировано


include 'macros.inc' ; 

;---------------------------------------------------------------------
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
;---------------------------------------------------------------------

START:

red:                    ; перерисовать окно

    call draw_window    ; вызываем процедуру отрисовки окна

;---------------------------------------------------------------------
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
;---------------------------------------------------------------------



 still:                      ; main cycle
    mcall 23, 500

    cmp eax, 0
    je exit
    cmp eax, 1
    je red
    cmp eax, 2
    je key
    cmp eax, 3
    je button
    
    

 

  button:                         ; button event handler
    mov     al, 17               ;   get button identifier
    mcall

    cmp     ah, 1
    jne     still        ;   return if button id != 1

    or      eax, -1               ;   exit application
    mcall

  key:                              ; key event handler
    mov     al, 2                 ;   get key code
    mcall

    jmp     still

  exit:
    mcall -1

;---------------------------------------------------------------------
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
;---------------------------------------------------------------------

draw_window:

mcall 12, 1                    ; функция 12: сообщить ОС об отрисовке окна
                                   
mov eax,14 ;получим ширину экрана
mov ebx, 4
mcall
shr eax, 16
and eax,0x0000FFFF
sub eax,300 ;отнимем от нее 300
shl eax, 16 ;и превратим в координаты окна по оси X
add eax,300 
mov ebx, eax

mov eax, 0 ;и выведем это окно
mov ecx, 30 ;высотой 25 пикс 
mov edx, 0x41000000 ;черного цвета и без заголовка
mov esi, 0x01000000 
mcall

;вывод сеточки   
mov eax, 1 ;функция вывода точки
mov edx, 0 ;черного цвета
mov ecx, 30 ;высота окна - 30 пкс
mov esi, 0 ;счетчик сдвига сетки

drawx: ;рисование линии
sub ecx, 1 ;уменьшаем счетчик линий
cmp ecx, 0 ;закончились линии?
je fin ;значит, хватит рисовать
mov ebx, 300 ;иначе - у нас ширина сетки 300 пкс
cmp esi,1 ;имелся ли сдвиг сетки в прошлой линии?
je sw;если да, то перейдем к sw
mov esi,1 ;иначе - сдвиг был выключен, включим сдвиг
jmp drawy ;перейдем к рисованию

sw: 
mov esi,0 ;выключаем сдвиг сетки

drawy: ;рисование
sub ebx, 2 ;ставить точки будем через одну
cmp ebx, 0 ;дорисовали ли мы линию?
je drawx ;если да, то переходим к новой
sub ebx, esi ;применяем сдвиг
mcall ;рисуем
add ebx, esi ;возвращаем счетчик на место
jmp drawy ;рисуем новую точку

fin: ;дорисовали

mcall 4, <3, 12>, 0x80000000, I_PARAM, 0 ;тень за текстом
mcall 4, <5, 12>, 0x80000000, I_PARAM, 0 ;
mcall 4, <4, 11>, 0x80000000, I_PARAM, 0 ;
mcall 4, <4, 13>, 0x80000000, I_PARAM, 0 ;
 mcall 4, <4, 12>, 0x80EFEFEF, I_PARAM, 0 ;текст


    mcall 12, 2                    ; конец рисования
                               

    ret                            ; выходим из процедуры


;---------------------------------------------------------------------
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
;---------------------------------------------------------------------

I_PARAM    rb 256

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