From 955ef786b3a04eed1d8d8ac1839111882646dfb7 Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Mon, 1 Jun 2009 18:25:07 +0000 Subject: [PATCH] support system library box_lib.obj git-svn-id: svn://kolibrios.org@1098 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/media/scrshoot/check.inc | 217 --------------- programs/media/scrshoot/file_sys.inc | 41 --- programs/media/scrshoot/label.inc | 48 ++-- programs/media/scrshoot/macros.inc | 399 --------------------------- programs/media/scrshoot/readme.txt | 4 + programs/media/scrshoot/scrsavef.inc | 313 +++++++++++---------- programs/media/scrshoot/scrshoot.asm | 303 ++++++++++++++------ programs/media/scrshoot/scrshoot.mac | 312 +++++++++++++++++++++ programs/media/scrshoot/scrwin.inc | 53 ++-- programs/media/scrshoot/srectwin.inc | 335 +++++++++++++--------- programs/media/scrshoot/txtbut.inc | 120 ++++---- 11 files changed, 1001 insertions(+), 1144 deletions(-) delete mode 100644 programs/media/scrshoot/check.inc delete mode 100644 programs/media/scrshoot/file_sys.inc delete mode 100644 programs/media/scrshoot/macros.inc create mode 100644 programs/media/scrshoot/scrshoot.mac diff --git a/programs/media/scrshoot/check.inc b/programs/media/scrshoot/check.inc deleted file mode 100644 index a98028dba3..0000000000 --- a/programs/media/scrshoot/check.inc +++ /dev/null @@ -1,217 +0,0 @@ -;Эффективное программирование в KOLIBRI -;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32) -;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке -;Оптимизация команд - отказался от сохранения регистров в стеке. -;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются -; - Теплов Алексей www.test-kolibri.narod.ru - -macro use_check_box -{ -ch_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи -ch_size=10 ;размер квадрата чек бокса -ch_left equ [edi] ;координата начала рисования по х -ch_top equ [edi+2] ;координата начала рисования по у -ch_color equ [edi+4] ;цвет внутри checkbox -ch_border_color equ [edi+8] ;цвет рамки checkbox -ch_text_color equ [edi+12] ;цвет текста -ch_text_ptr equ [edi+16] ;указатель на начало текстовой строки -ch_text_length equ [edi+20] ;длина надписи (2^64 такой длины может быть текст) -ch_flags equ [edi+24] ;флаги -check_box: -.draw: -pusha ;сохраним все регистры - mov eax,38 ;рисование линии - mov bx,ch_left ;положение по х - ;mov cx,bx ;сохраним в регистре cx значение bx - push bx ;3 - микрооперации используя стек можно выиграть в размере, используя регистры - в скорости - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - pop bx ;2 - микрооперации на данный момент сформирована [координата начала по оси x]*65536 + [координата начала по оси x] - ;mov bx,cx ;восстановим значение bx - mov cx,ch_top ;загрузим в cx значение y - mov si,cx ;сохраним значение регистра cx в регистр указатель si - ;push cx - shl ecx,16 ; сдвинем на 16 разрядов в лево (умножим на 65536) mov cx,si ;восстановим значение регистра cx - mov cx,si ;восстановим значение регистра cx - ;pop cx ;[координата начала по оси y]*65536 + [координата начала по оси y] - ;push cx - add cx,ch_size ;[координата начала по оси y]*65536 + [координата конца по оси y] - mov edx,ch_border_color ;Цвет линии - int 0x40 ;рисование вертикальной левой линии квадрата (прямоугольника) -; - mov bp,bx ;сохраним регистр bx в регистре указателя базы - ;push bx ;втолкнуть в bx [координата начала по оси х]*65536 + [координата начала по оси x] - add bx,ch_size ;[координата начала + длина стороны по оси х] - ror ebx,16 ;[координата начала + дина стороны по оси х]*65536 - add bx,ch_size ;[координата начала+длина стороны по оси х]*65536 + [координата начала+длина стороны по оси x] - int 0x40 - mov bx,bp ;восстановим значение регистра bx - ;pop bx - mov cx,si ;сохраним значение регистра cx в регистр указатель - ;pop cx - int 0x40 - add cx,ch_size ;добавим размер стороны - mov si,cx ;сохраним значение регистра cx в регистр указатель si - ;push cx - shl ecx,16 - mov cx,si - ;pop cx - int 0x40 ;нарисовали прямоугольник - - mov eax,13 ;закрашиваем его. Функция 13 - нарисовать полосу - mov bx,ch_left ;загрузить в bx, положение по х - add bx,1 ;сдвинем на 1 т.е. прибавим 1 иначе затрется рамка - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,ch_size ;прибавим длину стороны прямоугольника - sub bx,1 ;вычтем 1 т.к. иначе затрется рамка - mov bp,bx ; сохраним регистр bx в регистре указателя базы - ;push bx - mov cx,ch_top ;загрузим координаты по y - add cx,1 ;сдвинем на 1 т.е. прибавим 1 иначе затрется рамка - shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov cx,bp ;восстановим значение регистра cx - ;pop cx - mov edx,ch_color ;загрузим цвет полосы - int 0x40 ;закрасили - bt dword ch_flags,1 ;достать значение бита из переменной и поместить в флаг CF - jnc @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ - call .draw_ch ;нарисовать включенный чек бокс -@@: -;---------------------------- -;расчет куда будет произведен вывод текста -;---------------------------- - mov bx,ch_left ;загрузить значение х для чек бокса - add bx,(ch_size+ch_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,ch_top ;загрузим значение по y - add bx,(ch_size-9+2) ;добавим значение длины стороны -9+2 - mov ecx,ch_text_color ;загрузим цвет надписи - - mov edx,ch_text_ptr ;укажем адрес от куда нужно выводить строку - mov esi,ch_text_length ;Загрузим длину надписи в esi - xor eax,eax ;внесем в eax значение вывода надписи на канву - add eax,4 - int 0x40 ;Вывод -popa ;восстановить значения регистров из стека -ret ;выйдем из процедуры - -.clear_ch: ;очистка чек бокса - mov edx,ch_color ;цвет внутри чек бокса - jmp @f ;безусловный прыжок на нижнюю метку @@ - -.draw_ch: ;нарисовать включенный чек бокс - mov edx,ch_border_color ;загрузить цвет -@@: - mov bx,ch_left ;загрузить координату по х - add bx,(ch_size/3) ;добавить (сторона прямоугольника/3) - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,(ch_size/2) ;загрузить (сторона прямоугольника/2) - mov bp,bx ;сохраним регистр bx в регистре указателя базы - ;push bx - mov cx,ch_top ;загрузить координату по у - add cx,(ch_size/3) ;добавить (сторона прямоугольника/3) - shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov cx,bp ;загрузим значения регистра указателя базы в cx - ;pop cx - mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс - int 0x40 ;вывод -ret ;выйти из процедуры - -.mouse: ;обработка мыши -pusha - mov eax,37 ;будем что то делать если у нас что - нить нажато - xor ebx,ebx ;обнулить регистр ebx (изменяет флаги) - add ebx,2 ;внести в регистр значение 2 - int 0x40 ;проверка не нажал ли пользователь кнопку мышки - test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем - jnz @f ;перейти на нижнюю метку @@ - btr dword ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. - popa ;если ничего не произошло, то восстановим значения регистров из стека - ret ;выход -@@: - bts dword ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено - jc .mouse_end ;если CF=1 то перейти в конец т.е. это выход - mov esi,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 ;получим координаты мышки - xor ebx,ebx ;обнулить регистр - add ebx,1 ;добавить 1 - int 0x40 ;получить координаты курсора относительно окна - - mov bx,ch_top ;загрузить в bx значение координаты у - cmp ax,bx ;сравнить с с координатой курсора - jl .mouse_end ;SF <> OF если меньше - add bx,ch_size ;добавить размер - cmp ax,bx ;сравнить - jg .mouse_end ;ZF = 0 и SF = OF если больше - - shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений - mov bx,ch_left ;произведем аналогичное сравнение - cmp ax,bx ;сравнить регистры - jl .mouse_end ;если меньше - add bx,ch_size ;добавить длину стороны прямоугольника - add bx,si ;Учесть в значении по х еще и длину надписи к чекбоксу - cmp ax,bx ;стравнить регистры - jg .mouse_end ;если больше - - bts dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. - jc @f ;CF=1 то перейти на нижнюю @@ - - call .draw_ch ;отобразить включенный чек бокс - mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 - jmp .mouse_end ;выйти -@@: - btr dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. - call .clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. -.mouse_end: -popa ;восстановить регистры из стека -ret ;выйти -} - -struc check_box left,top,color,border_color,text_color,text,text_length,flags -{ ;структура параметров для чек бокса -.left: dw left ;+0 ;положение по х -.top: dw top ;+2 ;положение по у -.color: dd color ;+4 ;цвет внутри чек бокса -.border_color: dd border_color ;+8 цвет рамки -.text_color: dd text_color ;+12 цвет текста надписи -.text: dd text ;+16 адрес в коде программы где расположен текстр -.text_length: dd text_length ; +20 длина текста -.flags: dd flags+0 ;+24 флаги -} -ch_struc_size=28 ;общая структура 28 байт -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 check_boxes_set_sys_color start,end,color_table -{ - mov edi,start - mov ecx,((end-start)/ch_struc_size) - mov esi,color_table -@@: - push dword [esi+32] - pop dword ch_text_color - push dword [esi+36] - pop dword ch_border_color - add edi,ch_struc_size - loop @b -} \ No newline at end of file diff --git a/programs/media/scrshoot/file_sys.inc b/programs/media/scrshoot/file_sys.inc deleted file mode 100644 index fa166c5e69..0000000000 --- a/programs/media/scrshoot/file_sys.inc +++ /dev/null @@ -1,41 +0,0 @@ -macro file_sys struc_ptr -{ - mov eax,58 - mov ebx,struc_ptr - int 0x40 -} - -struc fs_struc function_number,block_number,size,data_ptr,mem_for_sys_ptr -{ -.function_number: dd function_number+0 ;+0 -.block_number: dd block_number+0 ;+4 -.size: dd size+0 ;+8 -.data_ptr: dd data_ptr+0 ;+12 -.mem_for_sys_ptr: dd mem_for_sys_ptr+0 ;+16 -} -fs_struc_size=20 - -fs_read_file=0 -fs_rewrite_file=1 -fs_delete_file=2 -fs_write_to_file=3 -fs_create_dir=4 -fs_rename_file=5 -fs_lba_read=9 -fs_get_file_size=12 -fs_get_file_atr=13 -fs_get_file_date_time=14 -fs_get_fs_info=15 -fs_run_app=16 - -fse_successful=0 -fse_not_def_base=1 -fse_bad_fs=2 -fse_bad_fs=3 -fse_part_not_def=4 -fse_file_not_found=5 -fse_end_of_file=6 -fse_bad_ptr=7 -fse_disk_filled=8 -fse_bad_fat_table=9 -fse_acces_denied=10 \ No newline at end of file diff --git a/programs/media/scrshoot/label.inc b/programs/media/scrshoot/label.inc index 52a7bb3a80..c482bae42f 100644 --- a/programs/media/scrshoot/label.inc +++ b/programs/media/scrshoot/label.inc @@ -2,19 +2,19 @@ macro use_label { draw_label: pusha - xor esi,esi - mov edx,[edi+8] + xor esi,esi + mov edx,[edi+8] .check_next: - mov ah,[edx+esi] - inc esi - test ah,ah - jz @f - jmp .check_next + mov ah,[edx+esi] + inc esi + test ah,ah + jz @f + jmp .check_next @@: - mov eax,4 - mov ebx,[edi] - mov ecx,[edi+4] - int 0x40 + mov eax,4 + mov ebx,[edi] + mov ecx,[edi+4] + mcall popa ret } @@ -24,28 +24,28 @@ struc label left,top,color,text .top: dw top ; +0 .left: dw left ; +2 .color: dd color; +4 -.text: dd text ; +8 +.text: dd text ; +8 } l_struc_size=12 macro draw_labels start,end { - mov edi,start - mov ecx,((end-start)/l_struc_size) + mov edi,start + mov ecx,((end-start)/l_struc_size) @@: - call draw_label - add edi,l_struc_size - loop @r + call draw_label + add edi,l_struc_size + loop @r } macro labels_set_sys_color start,end,color_table { - mov edi,start - mov ecx,((end-start)/l_struc_size) - mov esi,color_table + mov edi,start + mov ecx,((end-start)/l_struc_size) + mov esi,color_table @@: - push dword [esi+32] - pop dword [edi+4] - add edi,l_struc_size - loop @r + push dword [esi+32] + pop dword [edi+4] + add edi,l_struc_size + loop @r } \ No newline at end of file diff --git a/programs/media/scrshoot/macros.inc b/programs/media/scrshoot/macros.inc deleted file mode 100644 index 5ab3c7d465..0000000000 --- a/programs/media/scrshoot/macros.inc +++ /dev/null @@ -1,399 +0,0 @@ -;--- другие макросы --- -include '..\..\develop\examples\editbox\trunk\editbox.inc' -include 'txtbut.inc' -;include 'gp.inc' -include 'label.inc' -;include '..\..\develop\examples\checkbox\trunk\check.inc' -include 'check.inc' -include 'file_sys.inc' -include 'textwork.inc' -;include 'ini.inc' - -__CPU_type equ p5 -SYSENTER_VAR equ 0 - - -macro movr reg,val -{ -if val < 65536 - push val - pop reg -else - mov reg,val -end if -} - -macro mcall a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls - local ..ret_point - __mov eax,a - __mov ebx,b - __mov ecx,c - __mov edx,d - __mov esi,e - __mov edi,f - - if __CPU_type eq p5 - int 0x40 - else - if __CPU_type eq p6 - push ebp - mov ebp, esp - push ..ret_point ; it may be 2 or 5 byte - sysenter - ..ret_point: - pop edx - pop ecx - - else - if __CPU_type eq k6 - push ecx - syscall - pop ecx - else - display 'ERROR : unknown CPU type' - int 0x40 - end if - 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 meos_header par_buf,cur_dir_buf -{ - use32 - org 0x0 - - db 'MENUET01' - dd 0x01 - dd __app_start - dd __app_end - dd __app_end - dd __app_end -if eq <> - dd 0x0 -else - dd par_buf -end if -if eq <> - dd 0x0 -else - dd cur_dir_buf -end if -} - -;--- определить точку входа --- -macro app_start -{ -__app_start: -} - -;--- определить конец приложения и размер стека --- -macro app_end stack_size -{ -if eq <> - rb 1024 -else - rb stack_size -end if -__app_end: -} - -;--- завершить текущий поток --- -macro app_close -{ - xor eax,eax - dec eax - int 0x40 -} - -;--- получить код нажатой клавиши --- -macro get_key -{ - ;mov eax,2 - push 2 - pop eax - int 0x40 -} - -;--- получить код нажатой кнопки --- -macro get_pressed_button -{ - ;mov eax,17 - push 17 - pop eax - int 0x40 -} - -;--- сообщить системе о начале перерисовки окна --- -macro start_draw_window -{ - ;mov eax,12 - push 12 - pop eax - xor ebx,ebx - inc ebx - int 0x40 -} - -;--- сообщить системе о завершении перерисовки окна --- -macro stop_draw_window -{ - ;mov eax,12 - push 12 - pop eax - ;mov ebx,2 - push 2 - pop ebx - int 0x40 -} - -;--- установить маску ожидаемых событий --- -macro set_events_mask mask -{ - ;mov eax,40 - push 40 - pop eax - ;mov ebx,mask - push mask - pop ebx - int 0x40 -} - -;--- получить информацию о процессе --- -macro get_procinfo proc_inf_buf,slot_num -{ - ;mov eax,9 - push 9 - pop eax - ;mov ebx,proc_inf_buf - push proc_inf_buf - pop ebx -if eq <> - xor ecx,ecx - dec ecx -else - ;mov ecx,slot_num - push slot_num - pop ecx -end if - int 0x40 -} - -macro get_sys_colors col_buf -{ - ;mov eax,48 - push 48 - pop eax - ;mov ebx,3 - push 3 - pop ebx - ;mov ecx,col_buf - push col_buf - pop ecx - ;mov edx,40 - push 40 - pop edx - int 0x40 -} - -macro get_grab_area -{ - movr eax,48 - movr ebx,7 - int 0x40 -} - -macro get_skin_height -{ - movr eax,48 - movr ebx,4 - int 0x40 -} - -macro min_window -{ - movr eax,18 - movr ebx,10 - int 0x40 -} - -macro activ_window slot_n -{ - movr eax,18 - movr ebx,3 -if eq <> -else - movr ecx,slot_n -end if - int 0x40 -} - -macro get_active_window -{ - movr eax,18 - movr ebx,7 - int 0x40 -} - -macro delay time -{ - movr eax,5 -if