diff --git a/programs/develop/examples/checkbox/trunk/check.inc b/programs/develop/examples/checkbox/trunk/check.inc index 15e9e13ac5..e60ee11294 100644 --- a/programs/develop/examples/checkbox/trunk/check.inc +++ b/programs/develop/examples/checkbox/trunk/check.inc @@ -1,204 +1,204 @@ -;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32) -;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке -;Оптимизация команд - отказался от сохранения регистров в стеке. -;21.02.2007 добавил код от Heavyiron, дописал макросы для использования системных цветов -;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox -;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются -;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а. -; - Теплов Алексей 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'а. +; - Теплов Алексей 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 ;проверка мышки и обработка событий } \ No newline at end of file diff --git a/programs/develop/examples/optionbox/trunk/build.bat b/programs/develop/examples/optionbox/trunk/build.bat deleted file mode 100644 index 48d6648889..0000000000 --- a/programs/develop/examples/optionbox/trunk/build.bat +++ /dev/null @@ -1,2 +0,0 @@ -@fasm optxampl.asm optxample -@pause \ No newline at end of file diff --git a/programs/develop/examples/optionbox/trunk/macros.inc b/programs/develop/examples/optionbox/trunk/macros.inc deleted file mode 100644 index 14185dbfce..0000000000 --- a/programs/develop/examples/optionbox/trunk/macros.inc +++ /dev/null @@ -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 - -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 \ No newline at end of file diff --git a/programs/develop/examples/optionbox/trunk/optbox.inc b/programs/develop/examples/optionbox/trunk/optbox.inc deleted file mode 100644 index 9837aec8e6..0000000000 --- a/programs/develop/examples/optionbox/trunk/optbox.inc +++ /dev/null @@ -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 ? \ No newline at end of file diff --git a/programs/develop/examples/optionbox/trunk/optxampl.asm b/programs/develop/examples/optionbox/trunk/optxampl.asm deleted file mode 100644 index e1fa052e90..0000000000 --- a/programs/develop/examples/optionbox/trunk/optxampl.asm +++ /dev/null @@ -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 - diff --git a/programs/develop/examples/radiobutton/trunk/optionbox.asm b/programs/develop/examples/radiobutton/trunk/optionbox.asm index c6557c2b77..508fc9480f 100644 --- a/programs/develop/examples/radiobutton/trunk/optionbox.asm +++ b/programs/develop/examples/radiobutton/trunk/optionbox.asm @@ -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 ;заголовок приложения diff --git a/programs/develop/examples/radiobutton/trunk/optionbox.bat b/programs/develop/examples/radiobutton/trunk/optionbox.bat index d3f11b7ca2..54008df1db 100644 --- a/programs/develop/examples/radiobutton/trunk/optionbox.bat +++ b/programs/develop/examples/radiobutton/trunk/optionbox.bat @@ -1,3 +1,4 @@ @fasm.exe optionbox.asm optionbox @kpack.exe optionbox -REM @klbrinwin.exe optionbox \ No newline at end of file +REM @klbrinwin.exe optionbox +@pause \ No newline at end of file diff --git a/programs/develop/examples/radiobutton/trunk/optionbox.inc b/programs/develop/examples/radiobutton/trunk/optionbox.inc index d334612980..0d1028718e 100644 --- a/programs/develop/examples/radiobutton/trunk/optionbox.inc +++ b/programs/develop/examples/radiobutton/trunk/optionbox.inc @@ -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 ;вывод diff --git a/programs/develop/examples/template/trunk/build_en.bat b/programs/develop/examples/template/trunk/build_en.bat index 5fde7e08b2..74c122fa48 100644 --- a/programs/develop/examples/template/trunk/build_en.bat +++ b/programs/develop/examples/template/trunk/build_en.bat @@ -1,4 +1,5 @@ @erase lang.inc @echo lang fix en >lang.inc @fasm template.asm template +@erase lang.inc @pause \ No newline at end of file diff --git a/programs/develop/examples/template/trunk/build_fr.bat b/programs/develop/examples/template/trunk/build_fr.bat new file mode 100644 index 0000000000..38f0b598a5 --- /dev/null +++ b/programs/develop/examples/template/trunk/build_fr.bat @@ -0,0 +1,5 @@ +@erase lang.inc +@echo lang fix fr >lang.inc +@fasm template.asm template +@erase lang.inc +@pause \ No newline at end of file diff --git a/programs/develop/examples/template/trunk/build_ru.bat b/programs/develop/examples/template/trunk/build_ru.bat index f357008683..4f03c8ac4d 100644 --- a/programs/develop/examples/template/trunk/build_ru.bat +++ b/programs/develop/examples/template/trunk/build_ru.bat @@ -1,4 +1,5 @@ @erase lang.inc @echo lang fix ru >lang.inc @fasm template.asm template +@erase lang.inc @pause \ No newline at end of file diff --git a/programs/develop/examples/template/trunk/macros.inc b/programs/develop/examples/template/trunk/macros.inc index 5527ff55c1..0ddc650b65 100644 --- a/programs/develop/examples/template/trunk/macros.inc +++ b/programs/develop/examples/template/trunk/macros.inc @@ -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 @@ -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 diff --git a/programs/develop/examples/template/trunk/template.asm b/programs/develop/examples/template/trunk/template.asm index 8e8f9e4ba0..819691396c 100644 --- a/programs/develop/examples/template/trunk/template.asm +++ b/programs/develop/examples/template/trunk/template.asm @@ -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 ---> \ No newline at end of file