; ; @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 call exit key: ; key event handler mov al, 2 ; get key code mcall jmp still exit: mcall -1 ;--------------------------------------------------------------------- ;--- ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА ---------------------------------- ;--------------------------------------------------------------------- draw_window: mcall 12, 1 ; функция 12: сообщить ОС об отрисовке окна mcall 14, 4 ;получим ширину экрана 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 , <5, 12> mcall , <4, 11> mcall , <4, 13> mcall , <4, 12>, 0x80EFEFEF ;текст mcall 12, 2 ; конец рисования ret ; выходим из процедуры ;--------------------------------------------------------------------- ;--- ДАННЫЕ ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- I_PARAM rb 256 I_END: ; метка конца программы