removed old optionbox, very small fixes in radiobutton, checkbox, modified template

git-svn-id: svn://kolibrios.org@383 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
heavyiron committed 2007-03-01 22:32:12 +00:00
1 parent 743dc85bed
commit c47aceb21f
13 files changed
+279 -825

No files matched your search

+202 -202
View File
@@ -1,204 +1,204 @@
;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32)
;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке
;Оптимизация команд - отказался от сохранения регистров в стеке.
;21.02.2007 добавил код от Heavyiron, дописал макросы для использования системных цветов
;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox
;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются
;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а.
;<Lrz> - Теплов Алексей www.lrz.land.ru
macro version_ch ;для совместимости со старыми версиями checkbox все цвета задаются ручками
{
ch_struc_size=24
ch_left equ [edi] ;координата начала рисования по х
ch_top equ [edi+2] ;координата начала рисования по у
ch_color equ [edi+4]
ch_border_color equ [edi+8] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно
ch_text_color equ [edi+12];[edi+4] ;цвет текста
ch_text_ptr equ [edi+16] ;указатель на начало текстовой строки
ch_text_length equ [edi+20] ;длина надписи (2^64 такой длины может быть текст)
ch_flags equ [edi+22] ;флаги
}
macro version_ch1 ;продвинутая версия, использует цвета скина.
{
ch_struc_size=12
ch_left equ [edi] ;координата начала рисования по х
ch_top equ [edi+2] ;координата начала рисования по у
ch_color equ [sc.work] ;
ch_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно
ch_text_color equ [sc.work_text];[edi+4] ;цвет текста
ch_text_ptr equ [edi+4] ;указатель на начало текстовой строки
ch_text_length equ [edi+8] ;длина надписи (2^64 такой длины может быть текст)
ch_flags equ [edi+10] ;флаги
}
macro use_check_box
{
ch_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи
ch_size=12 ;размер квадрата чек бокса
check_box:
.draw:
pusha ;сохраним все регистры
mov eax,13
mov ebx,ch_left
shl ebx,16
add ebx,ch_size
mov ecx,ch_top
shl ecx,16
add ecx,ch_size
mov edx,ch_border_color
int 0x40 ;рисуем рамку
mov edx,ch_color
add ebx,1 shl 16 - 2
add ecx,1 shl 16 - 2
int 0x40 ;закрашиваем внутренности чекбокса
test word ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF
jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@
call .draw_ch ;нарисовать включенный чек бокс
@@:
;----------------------------
;расчет куда будет произведен вывод текста
;----------------------------
movzx ebx,word ch_left ;загрузить значение х для чек бокса
add ebx,(ch_size+ch_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov bx,ch_top ;загрузим значение по y
add ebx,(ch_size-9+2) ;добавим значение длины стороны -9+2
mov ecx,ch_text_color ;загрузим цвет надписи
mov edx,ch_text_ptr ;укажем адрес от куда нужно выводить строку
movzx esi,word ch_text_length ;Загрузим длину надписи в esi
;внесем в eax значение вывода надписи на канву
mov eax,4
int 0x40 ;Вывод
popa ;восстановить значения регистров из стека
ret ;выйдем из процедуры
.clear_ch: ;очистка чек бокса
mov edx,ch_color ;цвет внутри чек бокса
jmp @f ;безусловный прыжок на нижнюю метку @@
.draw_ch: ;нарисовать включенный чек бокс
mov edx,ch_border_color ;загрузить цвет
@@:
movzx ebx,word ch_left ;загрузить координату по х
add ebx,(ch_size/4) ;добавить (сторона прямоугольника/3)
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov bx,(ch_size/2) ;загрузить (сторона прямоугольника/2)
mov bp,bx ;сохраним регистр bx в регистре указателя базы
;push bx
movzx ecx,word ch_top ;загрузить координату по у
mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
add ecx,(ch_size/4) ;добавить (сторона прямоугольника/3)
shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov cx,bp ;загрузим значения регистра указателя базы в cx
;pop cx
int 0x40 ;вывод
ret ;выйти из процедуры
.mouse: ;обработка мыши
pusha
mov eax,37 ;будем что то делать если у нас что - нить нажато
mov ebx,2 ;внести в регистр значение 2
int 0x40 ;проверка не нажал ли пользователь кнопку мышки
test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем
jnz @f ;перейти на нижнюю метку @@
btr word ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
popa ;если ничего не произошло, то восстановим значения регистров из стека
ret ;выход
@@:
bts word ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено
jc .mouse_end ;если CF=1 то перейти в конец т.е. это выход
movzx esi,word ch_text_length ;загрузить кол-во символов в текстовой строке
;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
;lea esi,[eax*2+eax]
;shl eax,1
imul esi,6 ; или можно и так умножить на 6
add esi,ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи
mov eax,37 ;получим координаты мышки
mov ebx,1 ;добавить 1
int 0x40 ;получить координаты курсора относительно окна
movzx ebx,word ch_top ;загрузить в bx значение координаты у
cmp ax,bx ;сравнить с с координатой курсора
jl .mouse_end ;SF <> OF если меньше
add ebx,ch_size ;добавить размер
cmp ax,bx ;сравнить
jg .mouse_end ;ZF = 0 и SF = OF если больше
shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений
movzx ebx,word ch_left ;произведем аналогичное сравнение
cmp ax,bx ;сравнить регистры
jl .mouse_end ;если меньше
add ebx,ch_size ;добавить длину стороны прямоугольника
add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу
cmp ax,bx ;стравнить регистры
jg .mouse_end ;если больше
bts word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1.
jc @f ;CF=1 то перейти на нижнюю @@
call .draw_ch ;отобразить включенный чек бокс
mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0
jmp .mouse_end ;выйти
@@:
btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
call .clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
.mouse_end:
popa ;восстановить регистры из стека
ret ;выйти
}
struc check_box1 left,top,text,text_length,flags
{ ;структура параметров для чек бокса
.left: dw left ;+0 положение по х
.top: dw top ;+2 положение по у
.text: dd text ;+16 адрес в коде программы где расположен текстр
.text_length: dw text_length ;+20 длина текста
.flags: dw flags+0 ;+22 флаги
}
struc check_box left,top,color,border_color,text_color,text,text_length,flags
{ ;структура параметров для чек бокса
.left: dw left ;+0 ;положение по х
.top: dw top ;положение по у
.color: dd color ;цвет внутри чекбокса
.border_color: dd border_color ;цвет рамки
.text_color: dd text_color ;цвет надписи
.text: dd text ;адрес в коде программы где расположен текст
.text_length: dw text_length ;длина текста
;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32)
;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке
;Оптимизация команд - отказался от сохранения регистров в стеке.
;21.02.2007 добавил код от Heavyiron, дописал макросы для использования системных цветов
;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox
;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются
;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а.
;<Lrz> - Теплов Алексей www.lrz.land.ru
macro version_ch ;для совместимости со старыми версиями checkbox все цвета задаются ручками
{
ch_struc_size=24
ch_left equ [edi] ;координата начала рисования по х
ch_top equ [edi+2] ;координата начала рисования по у
ch_color equ [edi+4]
ch_border_color equ [edi+8] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно
ch_text_color equ [edi+12];[edi+4] ;цвет текста
ch_text_ptr equ [edi+16] ;указатель на начало текстовой строки
ch_text_length equ [edi+20] ;длина надписи (2^64 такой длины может быть текст)
ch_flags equ [edi+22] ;флаги
}
macro version_ch1 ;продвинутая версия, использует цвета скина.
{
ch_struc_size=12
ch_left equ [edi] ;координата начала рисования по х
ch_top equ [edi+2] ;координата начала рисования по у
ch_color equ [sc.work] ;
ch_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно
ch_text_color equ [sc.work_text];[edi+4] ;цвет текста
ch_text_ptr equ [edi+4] ;указатель на начало текстовой строки
ch_text_length equ [edi+8] ;длина надписи (2^64 такой длины может быть текст)
ch_flags equ [edi+10] ;флаги
}
macro use_check_box
{
ch_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи
ch_size=11 ;размер квадрата чек бокса
check_box:
.draw:
pusha ;сохраним все регистры
mov eax,13
mov ebx,ch_left
shl ebx,16
add ebx,ch_size
mov ecx,ch_top
shl ecx,16
add ecx,ch_size
mov edx,ch_border_color
int 0x40 ;рисуем рамку
mov edx,ch_color
add ebx,1 shl 16 - 2
add ecx,1 shl 16 - 2
int 0x40 ;закрашиваем внутренности чекбокса
test word ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF
jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@
call .draw_ch ;нарисовать включенный чек бокс
@@:
;----------------------------
;расчет куда будет произведен вывод текста
;----------------------------
movzx ebx,word ch_left ;загрузить значение х для чек бокса
add ebx,(ch_size+ch_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov bx,ch_top ;загрузим значение по y
add ebx,(ch_size-9+1) ;добавим значение длины стороны -9+1
mov ecx,ch_text_color ;загрузим цвет надписи
mov edx,ch_text_ptr ;укажем адрес от куда нужно выводить строку
movzx esi,word ch_text_length ;Загрузим длину надписи в esi
;внесем в eax значение вывода надписи на канву
mov eax,4
int 0x40 ;Вывод
popa ;восстановить значения регистров из стека
ret ;выйдем из процедуры
.clear_ch: ;очистка чек бокса
mov edx,ch_color ;цвет внутри чек бокса
jmp @f ;безусловный прыжок на нижнюю метку @@
.draw_ch: ;нарисовать включенный чек бокс
mov edx,ch_border_color ;загрузить цвет
@@:
movzx ebx,word ch_left ;загрузить координату по х
add ebx,(ch_size/3) ;добавить (сторона прямоугольника/3)
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov bx,(ch_size/2) ;загрузить (сторона прямоугольника/2)
mov bp,bx ;сохраним регистр bx в регистре указателя базы
;push bx
movzx ecx,word ch_top ;загрузить координату по у
mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
add ecx,(ch_size/3) ;добавить (сторона прямоугольника/3)
shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov cx,bp ;загрузим значения регистра указателя базы в cx
;pop cx
int 0x40 ;вывод
ret ;выйти из процедуры
.mouse: ;обработка мыши
pusha
mov eax,37 ;будем что то делать если у нас что - нить нажато
mov ebx,2 ;внести в регистр значение 2
int 0x40 ;проверка не нажал ли пользователь кнопку мышки
test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем
jnz @f ;перейти на нижнюю метку @@
btr word ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
popa ;если ничего не произошло, то восстановим значения регистров из стека
ret ;выход
@@:
bts word ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено
jc .mouse_end ;если CF=1 то перейти в конец т.е. это выход
movzx esi,word ch_text_length ;загрузить кол-во символов в текстовой строке
;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
;lea esi,[eax*2+eax]
;shl eax,1
imul esi,6 ; или можно и так умножить на 6
add esi,ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи
mov eax,37 ;получим координаты мышки
mov ebx,1 ;добавить 1
int 0x40 ;получить координаты курсора относительно окна
movzx ebx,word ch_top ;загрузить в bx значение координаты у
cmp ax,bx ;сравнить с с координатой курсора
jl .mouse_end ;SF <> OF если меньше
add ebx,ch_size ;добавить размер
cmp ax,bx ;сравнить
jg .mouse_end ;ZF = 0 и SF = OF если больше
shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений
movzx ebx,word ch_left ;произведем аналогичное сравнение
cmp ax,bx ;сравнить регистры
jl .mouse_end ;если меньше
add ebx,ch_size ;добавить длину стороны прямоугольника
add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу
cmp ax,bx ;стравнить регистры
jg .mouse_end ;если больше
bts word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1.
jc @f ;CF=1 то перейти на нижнюю @@
call .draw_ch ;отобразить включенный чек бокс
mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0
jmp .mouse_end ;выйти
@@:
btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
call .clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
.mouse_end:
popa ;восстановить регистры из стека
ret ;выйти
}
struc check_box1 left,top,text,text_length,flags
{ ;структура параметров для чек бокса
.left: dw left ;+0 положение по х
.top: dw top ;+2 положение по у
.text: dd text ;+16 адрес в коде программы где расположен текстр
.text_length: dw text_length ;+20 длина текста
.flags: dw flags+0 ;+22 флаги
}
struc check_box left,top,color,border_color,text_color,text,text_length,flags
{ ;структура параметров для чек бокса
.left: dw left ;+0 ;положение по х
.top: dw top ;положение по у
.color: dd color ;цвет внутри чекбокса
.border_color: dd border_color ;цвет рамки
.text_color: dd text_color ;цвет надписи
.text: dd text ;адрес в коде программы где расположен текст
.text_length: dw text_length ;длина текста
.flags: dw flags+0 ;+22
}
ch_flag_en=10b
macro draw_check_boxes start,end ;рисовать чек боксы
{
mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов
@@:
call check_box.draw ;Отобразить чек бокс
add edi,ch_struc_size ;Указатель на последующие чек боксы т.е. +28
loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@
}
macro mouse_check_boxes start,end ;установка чек боксов, в зависимости от события
{
mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов
@@:
call check_box.mouse ;проверка мышки и обработка событий
add edi,ch_struc_size ;Указатель на последующие чек боксы
loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@
}
;Если нужно отобразить один чекер
macro draw_check_box start ;рисовать чек боксы
{
mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
call check_box.draw ;Отобразить чек бокс
}
macro mouse_check_box start ;установка чек боксов, в зависимости от события
{
mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
call check_box.mouse ;проверка мышки и обработка событий
}
ch_flag_en=10b
macro draw_check_boxes start,end ;рисовать чек боксы
{
mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов
@@:
call check_box.draw ;Отобразить чек бокс
add edi,ch_struc_size ;Указатель на последующие чек боксы т.е. +28
loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@
}
macro mouse_check_boxes start,end ;установка чек боксов, в зависимости от события
{
mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов
@@:
call check_box.mouse ;проверка мышки и обработка событий
add edi,ch_struc_size ;Указатель на последующие чек боксы
loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@
}
;Если нужно отобразить один чекер
macro draw_check_box start ;рисовать чек боксы
{
mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
call check_box.draw ;Отобразить чек бокс
}
macro mouse_check_box start ;установка чек боксов, в зависимости от события
{
mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
call check_box.mouse ;проверка мышки и обработка событий
}
@@ -1,2 +0,0 @@
@fasm optxampl.asm optxample
@pause
@@ -1,269 +0,0 @@
; new application structure
macro meos_app_start
{
use32
org 0x0
db 'MENUET01'
dd 0x01
dd __start
dd __end
dd __memory
dd __stack
if used __params & ~defined __params
dd __params
else
dd 0x0
end if
dd 0x0
}
MEOS_APP_START fix meos_app_start
macro code
{
__start:
}
CODE fix code
macro data
{
__data:
}
DATA fix data
macro udata
{
if used __params & ~defined __params
__params:
db 0
__end:
rb 255
else
__end:
end if
__udata:
}
UDATA fix udata
macro meos_app_end
{
align 32
rb 2048
__stack:
__memory:
}
MEOS_APP_END fix meos_app_end
; macro for defining multiline text data
struc mstr [sstring]
{
forward
local ssize
virtual at 0
db sstring
ssize = $
end virtual
dd ssize
db sstring
common
dd -1
}
; strings
macro sz name,[data] { ; from MFAR [mike.dld]
common
if used name
label name
end if
forward
if used name
db data
end if
common
if used name
.size = $-name
end if
}
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
common
if used name
label name
end if
forward
if (used name)&(lang eq lng)
db data
end if
common
if used name
.size = $-name
end if
}
; easy system call macro
macro mpack dest, hsrc, lsrc
{
if (hsrc eqtype 0) & (lsrc eqtype 0)
mov dest, (hsrc) shl 16 + lsrc
else
if (hsrc eqtype 0) & (~lsrc eqtype 0)
mov dest, (hsrc) shl 16
add dest, lsrc
else
mov dest, hsrc
shl dest, 16
add dest, lsrc
end if
end if
}
macro __mov reg,a,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b eq)
mov reg,a
end if
}
macro mcall a,b,c,d,e,f { ; mike.dld
__mov eax,a
__mov ebx,b
__mov ecx,c
__mov edx,d
__mov esi,e
__mov edi,f
int 0x40
}
; optimize the code for size
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
macro add arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
inc arg1
else
add arg1,arg2
end if
else
add arg1,arg2
end if
}
macro sub arg1,arg2
{
if (arg2 eqtype 0)
if (arg2) = 1
dec arg1
else
sub arg1,arg2
end if
else
sub arg1,arg2
end if
}
macro mov arg1,arg2
{
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
if (arg2) = 0
xor arg1,arg1
else if (arg2) = 1
xor arg1,arg1
inc arg1
else if (arg2) = -1
or arg1,-1
else if (arg2) > -128 & (arg2) < 128
push arg2
pop arg1
else
mov arg1,arg2
end if
else
mov arg1,arg2
end if
}
macro struct name
{
virtual at 0
name name
sizeof.#name = $ - name
end virtual
}
; structures used in MeOS
struc process_information
{
.cpu_usage dd ? ; +0
.window_stack_position dw ? ; +4
.window_stack_value dw ? ; +6
.not_used1 dw ? ; +8
.process_name rb 12 ; +10
.memory_start dd ? ; +22
.used_memory dd ? ; +26
.PID dd ? ; +30
.x_start dd ? ; +34
.y_start dd ? ; +38
.x_size dd ? ; +42
.y_size dd ? ; +46
.slot_state dw ? ; +50
dw ? ; +52 - reserved
.client_left dd ? ; +54
.client_top dd ? ; +58
.client_width dd ? ; +62
.client_height dd ? ; +66
.wnd_state db ? ; +70
rb (1024-71)
}
struct process_information
struc system_colors
{
.frame dd ?
.grab dd ?
.grab_button dd ?
.grab_button_text dd ?
.grab_text dd ?
.work dd ?
.work_button dd ?
.work_button_text dd ?
.work_text dd ?
.work_graph dd ?
}
struct system_colors
; constants
; events
EV_IDLE = 0
EV_TIMER = 0
EV_REDRAW = 1
EV_KEY = 2
EV_BUTTON = 3
EV_EXIT = 4
EV_BACKGROUND = 5
EV_MOUSE = 6
EV_IPC = 7
EV_STACK = 8
; event mask bits for function 40
EVM_REDRAW = 1b
EVM_KEY = 10b
EVM_BUTTON = 100b
EVM_EXIT = 1000b
EVM_BACKGROUND = 10000b
EVM_MOUSE = 100000b
EVM_IPC = 1000000b
EVM_STACK = 10000000b
@@ -1,112 +0,0 @@
;
;OptionBox for MenuetOS
;
;by Harald Weber
;kitemaster@gmx.at
;
;16.02.07 Heavyiorn - optimizations for kolibri system functions
;
;######### USAGE ############
;include "optionbox.inc"
;
;//in end of draw_window procedure
;draw_optionboxes:
; mov eax, [pos_x] shl 16 + [pos_y]
; mov cl, buttonid
; mov edx, Text ;pointer to text beginning
;call optionbox
;
;
;Text db 'Optionbox Text',0
;
;//for more info see optxampl.asm
;##########################
optionbox:
mov [optionbox_pos_y],ax
shr eax,16
mov [optionbox_pos_x],ax
mov [optionbox_text],edx
mov [optionbox_id],cl
;######### Draw Checkbox ########
optionbox_draw:
mov eax, 13
mov bx, [optionbox_pos_x]
shl ebx, 16
add bx, 11
mov cx, [optionbox_pos_y]
shl ecx, 16
add cx, 11
mov edx,[sc.work_text]
int 0x40
mov edx,[sc.work]
add ebx, 1 shl 16 - 2
add ecx, 1 shl 16 -2
int 0x40
;######### Draw Hidden Button ######
optionbox_hid_button:
mov eax,8
mov bx,[optionbox_pos_x]
sub bx,1
shl ebx,16
mov bx,13
mov cx,[optionbox_pos_y]
sub cx,1
shl ecx,16
mov cx,13
mov dl,[optionbox_id] ;buttonid
or edx,0x60000000 ;button in invisible without frame
int 0x40
;######### Draw X #######
optionbox_x_draw:
mov al,[optionbox_id]
cmp [optionbox_checked],al
jne optionbox_dis
mov eax, 13
mov bx, [optionbox_pos_x]
add bx, 3
shl ebx, 16
add bx, 5
mov cx, [optionbox_pos_y]
add cx, 3
shl ecx, 16
add cx, 5
mov edx,[sc.work_text]
int 0x40
optionbox_dis:
;######### Checkbox Text #####
optionbox_draw_text:
mov eax,4 ; function 4 : write text to window
mov bx,[optionbox_pos_x]
add bx, 14
shl ebx,16
mov bx,[optionbox_pos_y]
add bx, 2 ; [x start] *65536 + [y start]
mov ecx,[sc.work_text] ; color of text RRGGBB
or ecx,0x80000000
mov edx,[optionbox_text] ; pointer to text beginning
int 0x40
ret
;######### Set OptionBox #####
set_optionbox:
mov [optionbox_checked],ah
call draw_optionboxes
ret
;########## Data Area ########
optionbox_pos_x dw ?
optionbox_pos_y dw ?
optionbox_text dd ?
optionbox_checked db ?
optionbox_id db ?
@@ -1,165 +0,0 @@
;
; EXAMPLE APPLICATION
;
; Compile with FASM for Menuet
;
include 'macros.inc'
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x1000 ; memory for app
dd 0x1000 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
START: ; start of execution
red:
call draw_window
still:
push 10 ; wait here for event
pop eax
int 0x40
dec eax ; redraw request ?
jz red
dec eax ; key in buffer ?
jz key
button: ; button
mov al,17 ; get id
int 0x40
cmp ah,2
je button2
cmp ah,3
je button3
cmp ah,4
je button4
cmp ah,5
je button5
cmp ah,1 ; button id=1 ?
jne noclose
or eax,-1 ; close this program
int 0x40
noclose:
jmp still
button2: ;option 1
call set_optionbox
jmp still
button3: ;option 2
call set_optionbox
jmp still
button4: ;option 3
call set_optionbox
jmp still
button5:
mov eax,4 ; function 4 : write text to window
mov ebx,170*65536+35 ; [x start] *65536 + [y start]
mov ecx,[sc.work_button_text] ; font 1 & color ( 0xF0RRGGBB )
mov edx,options-1
add dl, [optionbox_checked] ; pointer to text beginning
mov esi,1 ; text length
int 0x40
jmp still
key: ; key
mov al,2 ; just read it and ignore
int 0x40
jmp still
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,48
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
int 0x40
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
; DRAW WINDOW
xor eax,eax ; function 0 : define and draw window
mov ebx,100*65536+300 ; [x start] *65536 + [x size]
mov ecx,100*65536+120 ; [y start] *65536 + [y size]
mov edx,[sc.work] ; color of work area RRGGBB,8->color gl
or edx,0x33000000
mov edi,header ; WINDOW LABEL
int 0x40
mov eax,8 ; function 8 : define and draw button
mov ebx,165*65536+15 ; [x start] *65536 + [x size]
mov ecx,30*65536+15 ; [y start] *65536 + [y size]
mov edx,5 ; button id
mov esi,[sc.work_button] ; button color RRGGBB
int 0x40
draw_optionboxes:
;draw optionbox1
mov eax, 45 shl 16 + 20 ; [x start] shl 16 + [y start]
mov cl, 2 ; button id
mov edx, optiontext1 ; pointer to text beginning
call optionbox
;draw optionbox2
mov eax, 45 shl 16 + 40 ; [x start] shl 16 + [y start]
mov cl, 3 ; button id
mov edx, optiontext2 ; pointer to text beginning
call optionbox
;draw optionbox3
mov eax, 45 shl 16 + 60 ; [x start] shl 16 + [y start]
mov cl, 4 ; button id
mov edx, optiontext3 ; pointer to text beginning
call optionbox
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
include "optbox.inc"
; DATA AREA
optiontext1: db 'OptionBox1',0
optiontext2: db 'OptionBox2',0
optiontext3: db 'OptionBox3',0
options: db '0123'
header db 'OptionBox example',0
I_END:
sc system_colors
@@ -17,16 +17,16 @@ use32 ;
dd (i_end+0x100) and not 3 ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
dd (i_end+0x100) and not 3 ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
dd 0x0,0x0 ; указатель на строку с параметрами.
; если после запуска неравно нулю, приложение было
; если после запуска не равно нулю, приложение было
; запущено с параметрами из командной строки
; указатель на строку, в которую записан путь,
; указатель на строку, в которую записан путь,
; откуда запущено приложение
;------------------
include 'macros.inc'
include 'optionbox.inc' ;включить файл opeck.inc
version_op ;вариант, при котором используются цвета, которые задает пользователь
version_op ;вариант, при котором используются цвета, которые задает пользователь
; version_op1 ;цвета берутся из системы
use_option_box ;используя макросы,внести процедуры для рисования optionbox
align 16
@@ -39,12 +39,12 @@ start: ;
int 0x40
mov eax,40 ;установить маску для ожидаемых событий
mov ebx,0x25 ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
int 0x40
mov ebx,0x25 ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
int 0x40
red_win:
call draw_window ;первоначально необходимо нарисовать окно
still: ;основной обработчик
mov eax,10 ;Ожидать события
mov eax,10 ;Ожидать события
int 0x40 ;ожидать событие в течение 2 миллисекунд
cmp al,0x1 ;если изменилось положение окна
@@ -52,7 +52,7 @@ still: ;
cmp al,0x3 ;если нажата кнопка то перейти
jz button
mouse_option_boxes option_boxes,option_boxes_end ;проверка чек бокса
jmp still ;если ничего из перечисленного то снова в цикл
jmp still ;если ничего из перечисленного то снова в цикл
button:
; mov eax,17 ;получить идентификатор нажатой клавиши
; int 0x40
@@ -74,7 +74,8 @@ draw_window: ;
or edx,0xb3000000
mov edi,hed
int 0x40 ;нарисовать окно приложения
draw_option_boxes option_boxes,option_boxes_end ;рисование чекбоксов
draw_option_boxes option_boxes,option_boxes_end ;рисование чекбоксов
mov eax,12 ;Функция 12 - начать/закончить перерисовку окна.
mov ebx,2 ;Подфункция 2 - закончить перерисовку окна.
@@ -121,7 +122,7 @@ op_text: ;
.3 db 'Option_Box #3'
.e3:
option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится
option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится
option_group2 dd op11 ;приложение
hed db 'Optionbox [21.02.2007]',0 ;заголовок приложения
@@ -1,3 +1,4 @@
@fasm.exe optionbox.asm optionbox
@kpack.exe optionbox
REM @klbrinwin.exe optionbox
REM @klbrinwin.exe optionbox
@pause
@@ -39,7 +39,7 @@ option_box:
.draw:
pusha ;сохраним все регистры
op_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи
op_size=12 ;размер квадрата чек бокса
op_size=11 ;размер квадрата чек бокса
mov eax,13
mov ebx,op_left
shl ebx,16
@@ -67,7 +67,7 @@ op_size=12 ;ࠧ
add ebx,(op_size+op_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov bx,op_top ;загрузим значение по y
add ebx,(op_size-9+2) ;добавим значение длины стороны -9+2
add ebx,(op_size-9+1) ;добавим значение длины стороны -9+1
mov ecx,op_text_color ;загрузим цвет надписи
mov edx,op_text_ptr ;укажем адрес от куда нужно выводить строку
@@ -87,14 +87,14 @@ ret ;
mov edx,op_border_color ;загрузить цвет
@@:
movzx ebx,word op_left ;загрузить координату по х
add ebx,(op_size/4) ;добавить (сторона прямоугольника/3)
add ebx,(op_size/3) ;добавить (сторона прямоугольника/3)
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov bx,(op_size/2) ;загрузить (сторона прямоугольника/2)
mov bp,bx ;сохраним регистр bx в регистре указателя базы
;push bx
movzx ecx,word op_top ;загрузить координату по у
mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
add ecx,(op_size/4) ;добавить (сторона прямоугольника/3)
add ecx,(op_size/3) ;добавить (сторона прямоугольника/3)
shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
mov cx,bp ;загрузим значения регистра указателя базы в cx
int 0x40 ;вывод
@@ -1,4 +1,5 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm template.asm template
@erase lang.inc
@pause
@@ -0,0 +1,5 @@
@erase lang.inc
@echo lang fix fr >lang.inc
@fasm template.asm template
@erase lang.inc
@pause
@@ -1,4 +1,5 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm template.asm template
@erase lang.inc
@pause
@@ -123,8 +123,10 @@ macro mpack dest, hsrc, lsrc
end if
}
macro __mov reg,a { ; mike.dld
if ~a eq
macro __mov reg,a,b { ; mike.dld
if (~a eq)&(~b eq)
mpack reg,a,b
else if (~a eq)&(b eq)
mov reg,a
end if
}
@@ -141,11 +143,6 @@ macro mcall a,b,c,d,e,f { ; mike.dld
; language for programs
lang fix ru ; ru en fr ge fi
; optimize the code for size
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
@@ -177,7 +174,7 @@ macro sub arg1,arg2
macro mov arg1,arg2
{
if (arg1 in __regs) & (arg2 eqtype 0)
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
if (arg2) = 0
xor arg1,arg1
else if (arg2) = 1
@@ -221,7 +218,13 @@ struc process_information
.x_size dd ? ; +42
.y_size dd ? ; +46
.slot_state dw ? ; +50
rb (1024-52)
dw ? ; +52 - reserved
.client_left dd ? ; +54
.client_top dd ? ; +58
.client_width dd ? ; +62
.client_height dd ? ; +66
.wnd_state db ? ; +70
rb (1024-71)
}
struct process_information
@@ -1,11 +1,11 @@
; <--- description --->
; compiler: FASM 1.50
; name: Basic window example for MenuetOS
; version: 1.01
; last update: 25/08/2004
; compiler: FASM 1.67
; name: Basic window example for KolibriOS
; version: 1.02
; last update: 1/03/2007
; written by: Ivan Poddubny
; e-mail: ivan-yar@bk.ru
;modified by: Heavyiron
; <--- include all MeOS stuff --->
include "lang.inc"
@@ -18,64 +18,54 @@ MEOS_APP_START
; <--- start of code --->
CODE
call draw_window ; at first create and draw the window
mov eax,48 ; get system colors
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
int 0x40
redraw: ; redraw event handler
call draw_window ; at first create and draw the window
wait_event: ; main cycle
mov eax, 10
int 0x40
cmp eax, 1 ; if event == 1
je redraw ; jump to redraw handler
cmp eax, 2 ; else if event == 2
je key ; jump to key handler
cmp eax, 3 ; else if event == 3
je button ; jump to button handler
jmp wait_event ; else return to the start of main cycle
dec eax ; if event = 1
jz redraw ; jump to redraw handler
dec eax ; else if event = 2
jz key ; jump to key handler
redraw: ; redraw event handler
call draw_window
jmp wait_event
key: ; key event handler
mov eax, 2 ; get key code
int 0x40
jmp wait_event
button: ; button event handler
mov eax, 17 ; get button identifier
button: ; button event handler
mov al, 17 ; get button identifier
int 0x40
cmp ah, 1
jne wait_event ; return if button id != 1
jne wait_event ; return if button id != 1
or eax, -1 ; exit application
or eax, -1 ; exit application
int 0x40
key: ; key event handler
mov al, 2 ; get key code
int 0x40
jmp wait_event
draw_window:
mov eax, 12 ; start drawing
mov ebx, 1
int 0x40
mov eax, 0 ; create and draw the window
mov ebx, 100*65536+300 ; (window_cx)*65536+(window_sx)
mov ecx, 100*65536+200 ; (window_cy)*65536+(window_sy)
mov edx, 0x03ffffff ; work area color & window type 3
; mov esi, 0 ; grab color (not used)
; mov edi, 0 ; frame color (not used)
int 0x40
mov eax, 4 ; window header
mov ebx, 8*65536+8 ; coordinates
mov ecx, 0x10ffffff ; color & font N1
mov edx, header ; address of text
mov esi, header.size ; length of text
int 0x40
xor eax, eax ; create and draw the window
mov ebx, 100*65536+200 ; (window_cx)*65536+(window_sx)
mov ecx, 100*65536+100 ; (window_cy)*65536+(window_sy)
mov edx, [sc.work] ; work area color
or edx, 0x33000000 ; & window type 3
mov edi, header ; window header
int 0x40
mov eax, 12 ; finish drawing
mov ebx, 2
@@ -83,20 +73,20 @@ CODE
ret
; <--- initialised data --->
DATA
lsz header,\
ru, "Шаблон программы",\
en, "Template program",\
fr, "La programme poncive"
if lang eq ru
header db 'Шаблон программы',0
else if lang eq fr
header db 'La programme poncive',0
else
header db 'Template program',0
end if
; <--- uninitialised data --->
UDATA
sc system_colors
MEOS_APP_END
; <--- end of MenuetOS application --->