kolibrios-fun/programs/system/notify/trunk/@notify.asm
Kirill Lipatov (Leency) 5dfb64cfd9 notify: optimizations, manual build
git-svn-id: svn://kolibrios.org@2862 a494cfbc-eb01-0410-851d-a64ba20cac60
2012-07-13 08:13:19 +00:00

145 lines
4.6 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; @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: ; метка конца программы