diff --git a/programs/develop/box_lib/C--/lib/RANDOM.H-- b/programs/develop/box_lib/C--/lib/RANDOM.H-- new file mode 100644 index 0000000000..11b60c117f --- /dev/null +++ b/programs/develop/box_lib/C--/lib/RANDOM.H-- @@ -0,0 +1,52 @@ +/******************************************************************************* + + MenuetOS MineSweeper + Copyright (C) 2003 Ivan Poddubny + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************************************/ + +dword generator; // random number generator - фы  ухэхЁрЎшш ёыєўрщэ√ї ўшёхы + +:int random(int max) +// get pseudo-random number - яюыєўшЄ№ яёхтфюёыєўрщэюх ўшёыю +{ + $rdtsc // eax & edx + $xor eax,edx + $not eax + + EBX = generator; + $ror ebx,3 + $xor ebx,0xdeadbeef + EBX += EAX; + generator = EBX; + + EAX += EBX; + EAX = EAX % max; + return EAX; +} + +:randomize() +// initialize random number generator - шэшЎшрышчшЁютрЄ№ ухэхЁрЄюЁ ёыєўрщэ√ї ўшёхы +{ + asm + { + mov eax,3 + int 0x40 + ror eax,16 + } + generator = EAX; +} \ No newline at end of file diff --git a/programs/develop/box_lib/C--/lib/kolibri.h-- b/programs/develop/box_lib/C--/lib/kolibri.h-- new file mode 100644 index 0000000000..30900b9146 --- /dev/null +++ b/programs/develop/box_lib/C--/lib/kolibri.h-- @@ -0,0 +1,558 @@ +#startaddress 0 +#code32 TRUE + +char os_name[8] = {'M','E','N','U','E','T','0','1'}; +dword os_version = 0x00000001; +dword start_addr = #main; +dword final_addr = #stop+32; +dword alloc_mem = #stop+0x100; +dword x86esp_reg = #stop+0x100; +dword I_Param = 0x0; +dword I_Icon = 0x0; +dword skin_width; + +//Events +#define evMouse 6 +#define evButton 3 +#define evKey 2 +#define evReDraw 1 +#define evNet 8 + +//Button options +#define BT_DEL 0x80000000 +#define BT_HIDE 0x40000000 +#define BT_NOFRAME 0x20000000 + +#define OLD -1 +#define true 1 +#define false 0 + +struct FileInfo{ + dword read, firstBlock, qnBlockRead, retPtr, Work; + byte filedir; +}; +//------------------------------------------------------------------------- +struct system_colors{ + dword frame,grab,grab_button,grab_button_text,grab_text,work,work_button,work_button_text,work_text,work_graph; + void get(); +}; +void system_colors::get() +{ + EAX = 48; + EBX = 3; + ECX = #frame; + EDX = 40; + $int 0x40 +} + + +int vert; +struct mouse{ + dword x,y,lkm,pkm; + void get(); +}; + +void mouse::get() +{ + EAX = 37; + EBX = 1; + $int 0x40 + $mov ebx, eax + $shr eax, 16 + $and ebx,0x0000FFFF + x = EAX; + y = EBX; + EAX = 37; + EBX = 2; + $int 0x40 + $mov ebx, eax + $and eax, 0x00000001 + $shr ebx, 1 + $and ebx, 0x00000001 + lkm = EAX; + pkm = EBX; + EAX = 37; //колёсико + EBX = 7; + $int 0x40 + $mov ebx, eax + $shr eax, 16 + $and ebx,0x0000FFFF + //hor = EAX; + vert = EBX; +} + + +//--------------------------------------------------------------------------- +struct f70{ + dword func; + dword param1; + dword param2; + dword param3; + dword param4; + char rezerv; + dword name; +}; +//--------------------------------------------------------------------------- +struct BDVK{ + dword attr; + byte type_name; + byte rez1, rez2, rez3; + dword timecreate; + dword datecreate; + dword timelastaccess; + dword datelastaccess; + dword timelastedit; + dword datelastedit; + dword sizelo; + dword sizehi; + char name[518]; +}; +//--------------------------------------------------------------------------- +struct proc_info{ + dword use_cpu; + word pos_in_stack,num_slot,rezerv1; + char name[11]; + char rezerv2; + dword adress,use_memory,ID,left,top,width,height; + word status_slot,rezerv3; + dword work_left,work_top,work_width,work_height; + char status_window; + void getme(); +}; + +void proc_info::getme() +{ + EAX = 9; + EBX = #use_cpu; + ECX = -1; + $int 0x40 +} +//------------------------------------------------------------------------------- + +/* + Отрисовка окна + {x_start|y_start}, {x_size|y_size}, color_back, color_title, color_frames + + DrawWindow( + EBX = [x_start][x_size] + ECX = [y_start][y_size] + EDX, ESI, EDI = [00RRGGBB] + ) +*/ + +inline fastcall void DrawWindow(dword EBX, ECX, EDX, ESI, EDI){ +#speed + EAX = 0; // function 0 : define and draw window + $int 0x40 +#codesize +} + +inline fastcall void DrawButton(dword EBX, ECX, EDX, ESI){ + EAX = 8; + $int 0x40 +} + +inline fastcall dword WaitEvent(){ + EAX = 10; // wait here for event + $int 0x40 +} + +inline fastcall void ExitProcess(){ + EAX = -1; // close this program + $int 0x40 +} + +/* +02 = GET KEY + + ret: al 0 successful -> ah = key + al 1 no key in buffer +*/ +inline fastcall word GetKey(){ + EAX = 2; // just read this key from buffer + $int 0x40 +// EAX = EAX >> 8; +} + +/* +17 = GET PRESSED BUTTON ID + + ret: al 0 successful -> ah = id number + al 1 no key in buffer +*/ +inline fastcall word GetButtonID(){ + EAX = 17; // Get ID + $int 0x40 + EAX = EAX >> 8; +} + +/* +04 = WRITE TEXT TO WINDOW + + ebx [x start]*65536 + [y start] + ecx text color 0x00RRGGBB + edx pointer to text beginning + esi text length + ret: nothing changed +*/ +inline fastcall void WriteTextXY(dword EBX, ECX, EDX, ESI){ +#speed + EAX = 4; + $int 0x40; +#codesize +} + +/* +13 = DRAW BAR + + ebx [x start]*65536 + [x size] + ecx [y start]*65536 + [y size] + edx color 0x00RRGGBB + ret: nothing changed +*/ +inline fastcall void kos_DrawBar(dword EBX, ECX, EDX){ +#speed + EAX = 13; + $int 0x40 +#codesize +} + +/* function EBX=5 (GetBackgroun) ECX[]->EDX[], length ESI +inline fastcall void GetBackground(dword ECX, EDX, ESI){ +#speed + EAX = 39; + EBX = 5; + $int 0x40 +#codesize +}*/ + +//CODED by Veliant +/*eax = 38 - эюьхЁ ЇєэъЎшш +ebx = [ъююЁфшэрЄр эрўрыр яю юёш x]*65536 + [ъююЁфшэрЄр ъюэЎр яю юёш x] +ecx = [ъююЁфшэрЄр эрўрыр яю юёш y]*65536 + [ъююЁфшэрЄр ъюэЎр яю юёш y] +edx = 0x00RRGGBB - ЎтхЄ +edx = 0x01xxxxxx - ЁшёютрЄ№ шэтхЁёэvщ юЄЁхчюъ (ьырф°шх 24 сшЄр шуэюЁшЁє│Єё ) */ +inline fastcall void DrawLine(dword EBX, ECX, EDX){ + EAX = 38; + $int 0x40 +} + +inline fastcall void DrawTitle(dword ECX) +{ + EAX = 71; + EBX = 1; + $int 0x40; +} + +inline fastcall dword GetSkinWidth() +{ + EAX = 48; + EBX = 4; + $int 0x40 +} + +inline fastcall void ChangeSkin(){ + EAX = 48; + EBX = 8; + ECX = #file_path; + $int 0x40 +} + +inline fastcall dword GetScreenWidth() +{ + EAX = 14; + EBX = 4; + $int 0x40 + $shr eax, 16 + $and eax,0x0000FFFF +} + +inline fastcall void DeleteButton(dword EDX) +{ + EAX = 8; + EDX = EDX + BT_DEL; + $int 0x40; +} + +inline fastcall dword LoadLibrary(dword ECX) +{ + $mov eax, 68 + $mov ebx, 19 + $int 0x40 +} + +inline fastcall dword strlen(dword EDI) +{ +#speed + ECX=0; + EAX=0; + ECX--; + $REPNE $SCASB + EAX=EAX-2-ECX; +#codesize +} + +//-1 - не равны +// 0 - не равны +inline fastcall dword strcmp(dword ESI,EDI) +{ + dword strcmp_i,ret=-1,len1,len2,sovpadenij=0,str1,str2; + str1=ESI; + str2=EDI; + len1=strlen(str1); + len2=strlen(str2); + IF (len1==len2) + { + FOR (strcmp_i=0;strcmp_i=97) && (EDX<=122) ESBYTE[str+i] = DL - 32; //a-z + IF (EDX>=160) && (EDX<=175) ESBYTE[str+i] = DL - 32; //р-я + IF (EDX>=224) && (EDX<=239) ESBYTE[str+i] = DL - 80; //Ё-  + IF (EDX == 241) ESBYTE[EAX] = 240; //┐ + } + EAX = str; + //EAX = ESDWORD[EAX]; + //if (EAX != 0x5249443C) $int 3; +} + +inline fastcall dword lowcase(dword ESI) +{ + dword str=ESI, i; + FOR (i=0;i=65) && (EDX<=90) ESBYTE[str+i] = DL + 32; //a-z + IF (EDX>=128) && (EDX<=143) ESBYTE[str+i] = DL + 32; //р-я + IF (EDX>=144) && (EDX<=159) ESBYTE[str+i] = DL + 80; //Ё-  + IF (EDX == 240) ESBYTE[EAX] = 241; //┐ + } + EAX = str; + //EAX = ESDWORD[EAX]; + //if (EAX != 0x5249443C) $int 3; +} + +inline fastcall void dostowin (dword ESI) +{ + dword stroka,dlina; + stroka = ESI; + while (BL=ESBYTE[ESI]) + { + IF (BL>128) + IF (BL>=240) ESBYTE[ESI] = BL - 16; + ELSE ESBYTE[ESI] = BL - 64; + ESI++; + } +} + +void WindowRedrawStatus(dword i) +{ + EAX = 12; // function 12:tell os about windowdraw + EBX = i; // 1, start of draw + $int 0x40 +} + +void DefineAndDrawWindow(dword x,y,sizeX,sizeY,byte mainAreaType,dword mainAreaColour,byte headerType,dword headerColour,borderColour) +{ + dword arg1, arg2, arg3, arg4; + // + arg1 = x << 16 + sizeX; + arg2 = y << 16 + sizeY; + arg3 = mainAreaType << 24 | mainAreaColour; + arg4 = headerType << 24 | headerColour; + // + $mov eax, 0 + $mov ebx, arg1 + $mov ecx, arg2 + $mov edx, arg3 + $mov esi, arg4 + $mov edi, borderColour + $int 0x40 +} + +void DefineButton(dword x,y,w,h,id,color) +{ + DrawButton(x<<16+w, skin_width+y<<16+h, id, color); +} + +void WriteText(dword x,y,byte fontType, dword color, text, len) +{ + EBX = x<<16+skin_width+y; + ECX = fontType<<24+color; + EDX = text; + ESI = len; + EAX = 4; + $int 0x40; +} + +inline fastcall void PutPixel(dword EBX,ECX,EDX) //Coded by Leency :D +{ + EAX=1; + $int 0x40 +} + +void DrawBar(dword x,y,w,h,color) +{ + kos_DrawBar(x<<16+w,skin_width+y<<16+h,color); +} + +void DrawRegion(dword x,y,width,height,color1) +{ + DrawBar(x,y,width,1,color1); //яюыюёр уюЁ ётхЁїє + DrawBar(x,y+height,width,1,color1); //яюыюёр уюЁ ёэшчє + DrawBar(x,y,1,height,color1); //яюыюёр тхЁЄ ёыхтр + DrawBar(x+width,y,1,height+1,color1); //яюыюёр тхЁЄ ёяЁртр +} + +void DrawFlatButton(dword x,y,width,height,id,color,text) +{ + DrawRegion(x,y,width,height,0x94AECE); + DrawBar(x+1,y+1,width-1,1,0xFFFFFF); //яюыюёр уюЁ схыр  + DrawBar(x+1,y+height-1,width-2,1,0xC7C7C7); //Єхэ№ тхЁЄ + DrawBar(x+1,y+1,1,height-1,0xFFFFFF); //яюыюёр тхЁЄ схыр  + DrawBar(x+width-1,y+2,1,height-2,0xC7C7C7); //Єхэ№ тхЁЄ + DrawBar(x+2,y+2,width-3,height-3,color); //чрыштър + IF (id<>0) DefineButton(x,y,width,height,id+BT_HIDE,0xEFEBEF); //юяЁхфхы хь ъэюяъє + WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,0,text,strlen(text)); +} + + +void PutImage(dword buf,w,h,x,y) +{ + int i,r,g,b; + EDI=buf; + EAX = 7; + EBX = buf; + ECX = w<<16+h; + EDX = x<<16+y+skin_width; + $int 0x40 +} + + +void copystr(dword s,d) +{ + $mov esi,s + $mov edi,d + $cld +l1: + $lodsb + $stosb + $test al,al + $jnz l1 +} + + +int pos,razr,backup,j=0,chislo; +char buffer[11]=""; +inline fastcall dword IntToStr(dword ESI) +{ + chislo=ESI; + ECX=12; + $push edi + $mov edi,#buffer + $xor al,al + $cld + $rep $stosb + pos=razr=backup=j=0; + if (chislo<0) + { + buffer[pos]='-'; + chislo=-1*chislo; + pos++; + } + backup=chislo; + do + { + backup=backup/10; + razr++; + } + while (backup!=0); + razr--; + FOR (j=razr+pos;j>pos-1;j--) + { + backup=chislo/10; + backup=backup*10; + buffer[j]=chislo-backup+48; + chislo=chislo/10; + } + //return #buffer; + $pop edi; + EAX = #buffer; +} + + +inline fastcall dword MoveSize(dword EBX,ECX,EDX,ESI) +{ + EAX = 67; + $int 0x40 +} + + +f70 CopyFile_f; +BDVK CopyFile_atr; +inline fastcall dword CopyFile(dword EBX,ECX) +{ + dword s, d, bufer=0; + s = EBX; + d = ECX; + + CopyFile_f.func = 5; + CopyFile_f.param1 = 0; + CopyFile_f.param2 = 0; + CopyFile_f.param3 = 0; + CopyFile_f.param4 = #CopyFile_atr; + CopyFile_f.rezerv = 0; + CopyFile_f.name = s; + $mov eax, 70 + $mov ebx, #CopyFile_f + $int 0x40 + + if (EAX == 0) + { + bufer = malloc(CopyFile_atr.sizelo); + CopyFile_f.func = 0; + CopyFile_f.param1 = 0; + CopyFile_f.param2 = 0; + CopyFile_f.param3 = CopyFile_atr.sizelo; + CopyFile_f.param4 = bufer; + CopyFile_f.rezerv = 0; + CopyFile_f.name = s; + $mov eax, 70 + $mov ebx, #CopyFile_f + $int 0x40 + + IF (EAX == 0) + { + CopyFile_f.func = 2; + CopyFile_f.param1 = 0; + CopyFile_f.param2 = 0; + CopyFile_f.param3 = CopyFile_atr.sizelo; + CopyFile_f.param4 = bufer; + CopyFile_f.rezerv = 0; + CopyFile_f.name = d; + $mov eax, 70 + $mov ebx, #CopyFile_f + $int 0x40 + } + } + +} diff --git a/programs/develop/box_lib/C--/lib/load_bmp.h-- b/programs/develop/box_lib/C--/lib/load_bmp.h-- new file mode 100644 index 0000000000..3df7e80d8e --- /dev/null +++ b/programs/develop/box_lib/C--/lib/load_bmp.h-- @@ -0,0 +1,67 @@ +//Load BMP by Veliant + +struct readimage{ + dword func, param1, param2, size, buffer; + byte z; + dword name; +}; + +void Put_Image(dword x,y,w,h,name) +{ + int i, j, size, off, off2; + byte r, g, b; + readimage image; + dword buf; + size=w*h*3+100; + buf=malloc(size); + image.func = 0; + image.param1 = 0; + image.param2 = 0; + image.size = size; + image.buffer = buf; + image.z = 0; + image.name = #path; + EAX = 70; + EBX = #image; + $int 0x40; + + for(i=0;i OF если меньше + add ebx,dword ch_size ;добавить размер + cmp ax,bx ;сравнить + jg check_box_mouse_end ;ZF = 0 и SF = OF если больше + + shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений + movzx ebx,word ch_left ;произведем аналогичное сравнение + cmp ax,bx ;сравнить регистры + jl check_box_mouse_end ;если меньше + add ebx,dword ch_size ;добавить длину стороны прямоугольника + add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу + cmp ax,bx ;стравнить регистры + jg check_box_mouse_end ;если больше + + bts dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. + jc @f ;CF=1 то перейти на нижнюю @@ + + call check_box_draw_ch ;отобразить включенный чек бокс +; mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 + jmp check_box_mouse_end ;выйти +@@: + btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. + call check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. +check_box_mouse_end: +popa ;восстановить регистры из стека +ret 4 ;выйти + +;-------------------------------------------------- +;radiobutton Group +;-------------------------------------------------- +option_box_draw_box: +option_group equ [edi] +op_left equ [edi+4] ;координата начала рисования по х +op_top equ [edi+6] ;координата начала рисования по у +op_text_margin equ [edi+8] ;=4 расстояние от прямоугольника чек бокса до надписи +op_size equ [edi+12] ;12 размер квадрата чек бокса +op_color equ [edi+16] +op_border_color equ [edi+20] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно +op_text_color equ [edi+24];[edi+4] ;цвет текста +op_text_ptr equ [edi+28] ;указатель на начало текстовой строки +op_text_length equ [edi+32] +op_flags equ [edi+36] ;флаги + + pusha ;сохраним все регистры + + movzx ebx,word op_left + shl ebx,16 + add ebx,dword op_size + movzx ecx,word op_top + shl ecx,16 + add ecx,dword op_size + mov edx,dword op_border_color + mov eax,13 + mcall ;рисуем рамку + + mov edx,dword op_color + add ebx,1 shl 16 - 2 + add ecx,1 shl 16 - 2 + mcall ;закрашиваем внутренности чекбокса + +; mov eax,dword option_group +; mov dword eax,[eax] +; cmp eax,edi +; jne @f +; call option_box_draw_op ;нарисовать включенный чек бокс + + +;---------------------------- +;расчет куда будет произведен вывод текста +;---------------------------- +@@: movzx ebx,word op_left ;загрузить значение х для чек бокса + add ebx,dword op_size + add ebx,dword op_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov bx,word op_top ;загрузим значение по y + add ebx,op_size + mov ecx,dword op_text_color ;загрузим цвет надписи + flags + sub ebx,7 ;добавим значение длины стороны -9+2 + + mov edx,dword op_text_ptr ;укажем адрес от куда нужно выводить строку + mov esi,dword op_text_length + ;внесем в eax значение вывода надписи на канву + mov eax,4 + mcall ;Вывод +popa ;восстановить значения регистров из стека +ret ;выйдем из процедуры + +option_box_clear_op: ;очистка чек бокса + mov edx,dword op_color ;цвет внутри чек бокса + jmp @f ;безусловный прыжок на нижнюю метку @@ + + +option_box_draw_op: ;нарисовать включенный чек бокс + mov edx,dword op_border_color ;загрузить цвет +@@: + movzx ebx,word op_left ;загрузить координату по х + mov eax,dword op_size + push ax + shr eax,2 + add ebx,eax ;добавить (сторона прямоугольника/3) + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + pop bx + shr bx,1 ;загрузить (сторона прямоугольника/2) + mov bp,bx ;сохраним регистр bx в регистре указателя базы + + movzx ecx,word op_top ;загрузить координату по у + mov eax,dword op_size + shr eax,2 + add ecx,eax ;добавить (сторона прямоугольника/4) + shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov cx,bp ;загрузим значения регистра указателя базы в cx + mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс + mcall ;вывод +ret ;выйти из процедуры +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработчик mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +option_box_mouse_op: ;обработка мыши +pusha + mov eax,37 ;будем что то делать если у нас что - нить нажато + mov ebx,2 ;внести в регистр значение 2 + mcall ;проверка не нажал ли пользователь кнопку мышки + test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем + jnz @f ;перейти на нижнюю метку @@ + + jmp option_box_mouse_end + ;если ничего не произошло, то восстановим значения регистров из стека + ;выход +@@: + mov esi,dword op_text_length ;загрузить кол-во символов в текстовой строке + ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea + ;lea esi,[eax*2+eax] + ;shl eax,1 + imul esi,6 ; или можно и так умножить на 6 + xor ebx,ebx + add esi,dword op_text_margin ;добавить 3 - расстояние от чек бокса до надписи + + mov eax,37 ;получим координаты мышки + inc ebx ;добавить 1 + mcall ;получить координаты курсора относительно окна + + movzx ebx,word op_top ;загрузить в bx значение координаты у + cmp ax,bx ;сравнить с с координатой курсора + jl option_box_mouse_end ;SF <> OF если меньше + add ebx,dword op_size ;добавить размер + cmp ax,bx ;сравнить + jg option_box_mouse_end ;ZF = 0 и SF = OF если больше + + shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений + movzx ebx,word op_left ;произведем аналогичное сравнение + cmp ax,bx ;сравнить регистры + jl option_box_mouse_end ;если меньше + add ebx,dword op_size ;добавить длину стороны прямоугольника + add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу + cmp ax,bx ;стравнить регистры + jg option_box_mouse_end ;если больше + mov eax,dword option_group + mov [eax],edi + +option_box_mouse_end: +popa ;восстановить регистры из стека +ret ;выйти + +option_box_draw: + pusha + + mov eax,dword [esp+36] +@@: mov edi,dword [eax] + test edi,edi + je option_check + call option_box_draw_box + add eax,4 + jmp @b + +option_check: + mov eax,dword [esp+36] +@@: mov edi,dword [eax] + test edi,edi + je @f + + mov ebx,dword [edi] + mov ebx,dword [ebx] + cmp edi,ebx + jne .clear_op + + pusha + call option_box_draw_op + popa + add eax,4 + jmp @b + +.clear_op: + pusha + call option_box_clear_op + popa + add eax,4 + jmp @b + + +@@: popa + ret 4 + ; exit вообще :) + + +option_box_mouse: + pusha + + mov eax,dword [esp+36] +@@: mov edi,dword [eax] + test edi,edi + je option_check + call option_box_mouse_op + add eax,4 + jmp @b + + +align 16 +EXPORTS: + + dd sz_edit_box, edit_box + dd sz_edit_box_key, edit_box_key + dd sz_edit_box_mouse, edit_box_mouse + dd szVersion_ed, 0x00000001 + dd sz_check_box_draw, check_box_draw + dd sz_check_box_mouse, check_box_mouse + dd szVersion_ch, 0x00000001 + dd sz_option_box_draw, option_box_draw + dd sz_option_box_mouse, option_box_mouse + dd szVersion_op, 0x00000001 + dd 0,0 + +sz_edit_box db 'edit_box',0 +sz_edit_box_key db 'edit_box_key',0 +sz_edit_box_mouse db 'edit_box_mouse',0 +szVersion_ed db 'version_ed',0 +sz_check_box_draw db 'check_box_draw',0 +sz_check_box_mouse db 'check_box_mouse',0 +szVersion_ch db 'version_ch',0 +sz_option_box_draw db 'option_box_draw',0 +sz_option_box_mouse db 'option_box_mouse',0 +szVersion_op db 'version_op',0 + +;;;;;;;;;;; +;;Data +;;;;;;;;;;; +align 16 +mouse_flag dd 0x0 +procinfo process_information \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/box_lib.obj b/programs/develop/box_lib/trunk/box_lib.obj new file mode 100644 index 0000000000..f7b1b343dd Binary files /dev/null and b/programs/develop/box_lib/trunk/box_lib.obj differ diff --git a/programs/develop/box_lib/trunk/config.inc b/programs/develop/box_lib/trunk/config.inc new file mode 100644 index 0000000000..dc70bf9760 --- /dev/null +++ b/programs/develop/box_lib/trunk/config.inc @@ -0,0 +1 @@ +__CPU_type fix p5 diff --git a/programs/develop/box_lib/trunk/editbox.mac b/programs/develop/box_lib/trunk/editbox.mac new file mode 100644 index 0000000000..94171cda34 --- /dev/null +++ b/programs/develop/box_lib/trunk/editbox.mac @@ -0,0 +1,1174 @@ +;Макрос для вывода основных функций которые испльзуются боксом +macro use_general_func +{ +;debug_func +;---------------------------------------------------------- +;--- процедура прорисовки выделеной части ----------------- +;---------------------------------------------------------- +edit_box.draw_shift: + test word ed_flags,ed_shift_bac ;установка флага, выделенной области + jz @f + mov ebp,shift_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ +@@: ret +;---------------------------------------------------------- +;--- процедура прорисовки текста -------------------------- +;---------------------------------------------------------- +edit_box.draw_text: +;--- вычисляем, сколько помещается символов --- +;--- чтобы мусор не рисовать --- + call edit_box.get_n + mov esi,ed_size + mov ebx,ed_offset + sub esi,ebx + cmp eax,esi + jae @F + mov esi,eax ;чтобы не выходить за пределы экрана +;--- рисуем текст --- +@@: mov eax,4 + mov ebx,ed_left + mov edx,ed_offset + add ebx,2 + shl ebx,16 + add ebx,ed_top + mov ecx,ed_text_color + add ebx,4 + add edx,ed_text + mcall +ret +;---------------------------------------------------------- +;--- процедура прорисовки фона ---------------------------- +;входные данные +;eax +;edx - color +;---------------------------------------------------------- +;вход только цвет edx +edit_box.draw_bg: + mov ebx,ed_left + add ebx,1 + mov edx,ed_color + shl ebx,16 + add ebx,ed_width + sub ebx,1 +edit_box.draw_bg_eax: + mov ecx,ed_top + mov eax,13 + add ecx,1 + shl ecx,16 + add ecx,ed_height + dec ecx + mcall +ret +;---------------------------------------------------------- +;--- процедура получения количества символов в текущей щирине компонента +;---------------------------------------------------------- +edit_box.get_n: + mov eax,ed_width ;получем ширину компонента + xor edx,edx ;результат распологается в паре edx:eax в eax - остаток + sub eax,4 ;вычтим 4 + mov ebx,6 ;загрузми делитель + div ebx ;размделим на 6 +ret +;---------------------------------------------------------- +;--- процедура рисования курсора -------------------------- +;---------------------------------------------------------- +;входные ebp- цвет +edit_box.clear_cursor: + mov edx,ebp + mov ebx,cl_curs_x + mov ecx,cl_curs_y + jmp edit_box.draw_curs +edit_box.draw_cursor: + mov edx,ed_text_color + mov ebx,ed_pos + mov ecx,ed_offset + sub ebx,ecx + + lea ebx,[ebx*2+ebx] + shl ebx,1 + ;imul ebx,6 + add ebx,ed_left + mov ecx,ed_top + inc ebx + add ecx,2 + mov ebp,ebx + shl ebx,16 + mov bx,bp + mov ebp,ecx + + shl ecx,16 + mov cx,bp + add ecx,ed_height-4 + + mov cl_curs_x,ebx + mov cl_curs_y,ecx +edit_box.draw_curs: + mcall 38 +ret +;---------------------------------------------------------- +;--- процедура рисования рамки ---------------------------- +;---------------------------------------------------------- +edit_box.draw_border: +;--- цвет рамки --- + test word ed_flags,ed_focus + mov edx,ed_focus_border_color + jne @f + mov edx,ed_blur_border_color +@@: +;--- сверху --- + mov eax,38 + mov ebx,ed_left + mov ecx,ebx + shl ebx,16 + mov bx,cx + add ebx,ed_width + mov ecx,ed_top + mov esi,ecx + shl ecx,16 + mov cx,si + mcall +;--- снизу --- + mov esi,ecx + add ecx,ed_height + mov ebp,ecx + shl ecx,16 + mov cx,bp + mcall +;--- слева --- + mov cx,si + mov ebp,ebx + sub ebx,ed_width + mcall +;--- справа --- + mov ebx,ebp + shl ebx,16 + mov bx,bp + mcall +ret +;---------------------------------------------------------- +;--- проверка, зашел ли курсор за границы и, если надо, --- +;--- изменяем смещение ------------------------------------ +;--- если смещение было установка флага ed_offset_cl иначе +; если ничего не изменилось то выставление ed_offset_fl +; в общей битовой маррице состояния компонентов word ed_flags +;---------------------------------------------------------- +edit_box.check_offset: +pusha + mov ecx,ed_pos + mov ebx,ed_offset + cmp ebx,ecx + ja edit_box.sub_8 + + push ebx + call edit_box.get_n ;получим кол-во символов в паре регистров edx:eax + pop ebx + mov edx,ebx + add edx,eax ;ed_offset+width editbox + inc edx ;необходимо для номального положения курсора в крайней левой позиции + cmp edx,ecx + ja @f + + mov edx,ed_size + cmp edx,ecx + je edit_box.add_end + + sub edx,ecx + cmp edx,8 + jbe edit_box.add_8 + add ebx,8 + jmp edit_box.chk_d + +edit_box.sub_8: cmp ecx,0 + je edit_box.sub_min + cmp ebx,8 + jbe edit_box.sub_min + sub ebx,8 ;ebx=ed_offset + jmp edit_box.chk_d +edit_box.sub_min: + xor ebx,ebx + jmp edit_box.chk_d + +edit_box.add_end:sub edx,eax + mov ebx,edx + jmp edit_box.chk_d +edit_box.add_8: add ebx,edx +edit_box.chk_d: mov ed_offset,ebx + call edit_box.draw_bg + and word ed_flags,ed_offset_cl +edit_ex +@@: + or word ed_flags,ed_offset_fl +edit_ex +} + +macro use_key_func +{ +;Обработка Shift для снятия выделения неизвестной области +edit_box_key.shift: ;;;;;;;SHIFT + test word ed_flags,ed_shift + je edit_box_key.f_exit + +@@: mov ebp,shift_color + or word ed_flags,ed_shift_bac ;установка флага, выделенной области + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ + jmp edit_box.draw_cursor_text +;;;;;;;;;;;;;;;;;;;;; +edit_box_key.f_exit: call edit_box.check_offset + and word ed_flags,ed_shift_cl + call edit_box_key.enable_null + jmp edit_box.draw_cursor_text +edit_box_key.sh_cl_: +;;;;;;SHIFT end +;обработка очистки, при левом - правом движении выделения +;для обработки снятия выделения +;входные параметры ebp=color ebx=ed_shift_pos + mov eax,dword ed_pos + cmp eax,ebx + + jae edit_box_key.sh_n + push eax ;меньшее в eax + push ebx ;большее + jmp edit_box_key.sh_n1 + ;если иначе +edit_box_key.sh_n: push ebx + push eax +edit_box_key.sh_n1: + call edit_box.check_offset + call edit_box.get_n + mov edx,eax ;size of ed_box + mov ecx,ed_offset + add eax,ecx ;eax = w_off= ed_offset+width + mov edx,eax ;save + pop ebx ;большее + pop eax ;меньшее + + cmp eax,ecx ;сравнение с меньшего с offset. + jae edit_box_key.f_f ;если больше + xor eax,eax + cmp edx,ebx ;cравним размер w_off с большим + jb @f + sub ebx,ecx + jmp edit_box_key.nxt_f +@@: mov ebx,edx + sub ebx,ecx + jmp edit_box_key.nxt_f +edit_box_key.f_f: + sub eax,ecx + cmp edx,ebx ;cравним размер w_off с большим + jle @f + sub ebx,ecx + sub ebx,eax + jmp edit_box_key.nxt_f +@@: + mov ebx,edx + sub ebx,ecx + sub ebx,eax +edit_box_key.nxt_f: + mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + inc ebx + mov edx,ebp;shift_color + + call edit_box.draw_bg_eax +@@: call edit_box_key.enable_null + ret +;;;;;;;;;;;;;;;;;;;;; +;Установка- снятие выделения в один символ +;;;;;;;;;;;;;;;;;;;;; +edit_box_key.drw_sim: + mov eax,dword ed_pos + call edit_box_key.draw_rectangle ;нарисовать прямоугольник с заданным цветом + jmp @b +;;;;;;;;;;;;;;;;;;;;; +;Фукция установки выделения при движения влево и вправо и нажатии shift +;Логика: +;;;;;;;;;; +edit_box_key.draw_wigwag: +;функция установки переменных + mov ebp,shift_color + call edit_box.clear_cursor + + or word ed_flags,ed_shift_bac ;установка флага, выделенной области + mov ebp,shift_color + mov eax,dword ed_pos + test word ed_flags,ed_left_fl + jz edit_box_key.low + jmp @f +;;;;;;;;;; +;Фукция удаления выделения при движения влево и вправо и нажатии shift +;Логика: +;;;;;;;;;; +edit_box_key.draw_wigwag_cl: +;функция установки переменных + mov ebp,ed_color + call edit_box.clear_cursor + + mov ebp,ed_color + mov eax,dword ed_pos + test word ed_flags,ed_left_fl + jz edit_box_key.low +@@: call edit_box_key.draw_rectangle ;нарисовать прямоугольник закрашиваемой области + ret +edit_box_key.low: dec eax + jmp @b +;входной параметр ebx - ed_pos +edit_box_key.sh_first_sh: + test word ed_flags,ed_shift + je @f + mov dword ed_shift_pos_old,ebx + test word ed_flags,ed_shift_on + jne @f + mov dword ed_shift_pos,ebx + or word ed_flags,ed_shift_on +@@: ret +;Обработка крайних положений в editbox при нажатом shift +;производит снятие выделение, если нет shift +;иначе вообще выходит +edit_box_key.sh_st_of: + test word ed_flags,ed_shift + jne @f + test word ed_flags,ed_shift_bac + je @f + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ ;очистка выделеного фрагмента + and word ed_flags,ed_shift_cl ; очистка от того что убрали выделение + jmp edit_box.draw_cursor_text +@@: + and word ed_flags,ed_shift_off +edit_ex +;проверка состояния shift был ли он нажат раньше? +edit_box_key.sh_enable: + test word ed_flags,ed_shift + jne edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник + + test word ed_flags,ed_shift_bac + je @f + call edit_box.check_offset + + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ ;очистка выделеного фрагмента + call edit_box_key.draw_wigwag_cl + and word ed_flags,ed_shift_cl ; 1вар не нужно + ret + +@@: mov ebp,ed_color + call edit_box.clear_cursor + call edit_box.check_offset + ret +edit_box_key.sh_ext_en: + call edit_box.check_offset + test word ed_flags,ed_offset_fl + je @f +;Рисование закрашеных прямоугольников и очистка их + mov eax,dword ed_shift_pos + mov ebx,dword ed_pos + mov ecx,dword ed_shift_pos_old +;проверка и рисование закрашеных областей + cmp eax,ecx + je edit_box_key.1_shem + jb edit_box_key.smaller + cmp ecx,ebx + ja edit_box_key.1_shem + call edit_box_key.draw_wigwag_cl ;clear + jmp edit_box_key.sh_e_end +edit_box_key.smaller: + cmp ecx,ebx + jb edit_box_key.1_shem + call edit_box_key.draw_wigwag_cl ;clear + jmp edit_box_key.sh_e_end +;alike = +edit_box_key.1_shem: call edit_box_key.draw_wigwag +edit_box_key.sh_e_end: and word ed_flags,ed_shift_off + ret +@@: mov ebp,shift_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ + jmp edit_box_key.sh_e_end +;функция для обработки shift при нажатии home and end +edit_box_key.sh_home_end: + mov ebp,ed_color + call edit_box.clear_cursor + test word ed_flags,ed_shift_bac + je @f + mov ebp,ed_color + mov ebx,dword ed_shift_pos_old + call edit_box_key.sh_cl_ + +@@: test word ed_flags,ed_shift + je edit_box_key.sh_exit_ ;выйти + mov ebp,shift_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ + or word ed_flags,ed_shift_bac ;установка флага, выделенной области + jmp edit_box_key.sh_e_end +edit_box_key.sh_exit_: call edit_box.check_offset + ret +;функция внесения 0 по адресу ed_size+1 +edit_box_key.enable_null: + pusha + mov eax,ed_size + mov ebx,ed_text + test eax,eax + add eax,ebx + jne @f + inc eax +@@: xor ebx,ebx + mov [eax],bl +edit_ex +;- удаление символа +;Входные данные edx=ed_size;ecx=ed_pos +edit_box_key.del_char: + mov esi,ed_text + test word ed_flags,ed_shift_on + je @f + mov eax,dword ed_shift_pos + mov ebx,esi + cmp eax,ecx + jae edit_box_key.dh_n + + mov ed_pos,eax ;что бы не было убегания курсора + mov ebp,ecx + sub ebp,eax + add ebx,eax ;eax меньше + sub edx,ecx + add esi,ecx + + mov dword ed_shift_pos,ebp + jmp edit_box_key.del_ch_sh + ;если иначе +edit_box_key.dh_n: + mov ebp,eax + sub ebp,ecx + add ebx,ecx + sub edx,eax + add esi,eax + mov dword ed_shift_pos,ebp + jmp edit_box_key.del_ch_sh + +@@: add esi,ecx ;указатель + смещение к реальному буфферу + mov ebx,esi + inc esi + cld + + sub edx,ecx +edit_box_key.del_ch_sh: + + push edi + mov edi,ebx +@@: + lodsb + stosb + dec edx + jns @b + + pop edi + ret +;вычислить закрашиваемую область +;соглашение в ebp - передается ed_size +edit_box_key.clear_bg: + call edit_box.get_n ;получить размер в символах ширины компонента + push eax + mov ebx,ed_offset + add eax,ebx ;eax = w_off= ed_offset+width + mov ebx,ebp ;ed_size + + cmp eax,ebx + jb @f + mov eax,ed_pos + sub ebx,eax + mov ecx,ed_offset + sub eax,ecx + jmp edit_box_key.nxt +@@: mov ebx,ed_pos + push ebx + sub eax,ebx + mov ebx,eax ;It is don't optimal + + pop eax ;ed_pos + mov ecx,ed_offset + sub eax,ecx +edit_box_key.nxt: + mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины + add ebp,ebx + pop edx + cmp ebp,edx + je @f + inc ebx + +@@: mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + mov edx,ed_color + call edit_box.draw_bg_eax + ret +;;;;;;;;;;;;;;;;;;; +;;; Обработка примитивов +;;;;;;;;;;;;;;;;;;;; +;Нарисовать прямоугольник, цвет передается в ebp +;входные параметры: +;eax=dword ed_pos +;ebp=-цвет ed_color or shift_color +edit_box_key.draw_rectangle: + mov ecx,dword ed_offset + sub eax,ecx + lea ebx,[eax*2+eax] + shl ebx,1 + inc ebx + add ebx,ed_left + shl ebx,16 + add ebx,6 + mov edx,ebp + call edit_box.draw_bg_eax + ret +;;;;;;;;;;;;;;;;;; +;;Проверка нажат ли shift +;;;;;;;;;;;;;;;;;; +edit_box_key.check_shift: +pusha ;сохраним все регистры + mcall 66,3,1 + test al,0x03 + je @f + or word ed_flags,ed_shift ;установим флаг +@@:edit_ex +} +;макрос клавиш на которые происходит реакция +macro use_key_process backspase,delete,left,right,home,end,insert +{ +if backspase eq +else + cmp ah,8 + jz edit_box_key.backspace +end if +if delete eq +else + cmp ah,0xb6 + jz edit_box_key.delete +end if +if left eq +else + cmp ah,176 + jz edit_box_key.left +end if +if right eq +else + cmp ah,179 + jz edit_box_key.right +end if +if home eq +else + cmp ah,180 + jz edit_box_key.home +end if +if home eq +else + cmp ah,181 + jz edit_box_key.end +end if +if insert eq +else + cmp ah,185 ;insert + jz edit_box_key.insert +end if +} +macro use_key_no_process up,down,esc +{ +if up eq +else + cmp ah,177 + jz edit_box.editbox_exit +end if +if down eq +else + cmp ah,178 + jz edit_box.editbox_exit +end if +if esc eq +else + cmp ah,27 ;ESC - клавиша )) + jz edit_box.editbox_exit +end if +} + +macro use_key_figures_only +{ + test word ed_flags,ed_figure_only ; только цифры ? + jz @f + cmp ah,'0' + jb edit_box.editbox_exit + cmp ah,'9' + ja edit_box.editbox_exit +@@: +} +macro are_key_shift_press +{ + test word ed_flags,ed_shift_on + je @f + ;Входные данные edx=ed_size;ecx=ed_pos + push eax + mov edx,ed_size + mov ecx, ed_pos + pusha +;;;;;;;;;;;;;;;;;;;;; +;clear input arrea + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ + mov ebp,ed_size + call edit_box_key.clear_bg +;;;;;;;;;;;;;;;;;;;;; + popa + call edit_box_key.del_char +;;;; + mov eax,dword ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + pop eax +@@: +} +macro are_key_cur_end +{ + mov ecx,ed_size + mov edx, ed_max + test word ed_flags,ed_insert + jne @f + cmp ecx,edx + jae edit_box.editbox_exit +@@: mov ebx, ed_pos + cmp ebx,edx + jl @f ; если меньше или равно + jmp edit_box.editbox_exit + +@@: ; сдвигаем символы после курсора вправо + mov ecx,ed_size + push edi eax + mov ebp,edi + mov esi,ed_text ; Указатель на буфер + ;Будем работать со строкой + add esi,ecx ;add ed_size добавим max size + mov edi,esi + + cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце + je edit_box_key.In_k + + test word [ebp+40],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp + jne edit_box_key.ins_v +;clear +pusha + mov edi,ebp + mov ebp,ed_size + call edit_box_key.clear_bg +popa + sub ecx,ebx ;Найдем кол-во символов для передвижения. + inc edi ;Сместим наши символы в право + std + inc ecx + @@: + ;-------- + lodsb + stosb + ;-------- + loop @b +edit_box_key.In_k: cld + pop eax + mov al,ah + stosb + pop edi +; вставляем код клавиши туда, где курсор + ; увеличиваем значение размера и позиции + inc dword ed_size + inc dword ed_pos + call edit_box_key.draw_all2 + jmp edit_box_key.shift +} +macro use_work_key +{ +edit_box_key.insert: test word ed_flags,ed_insert ;not word ed_insert + je @f + and word ed_flags,ed_insert_cl + + jmp edit_box.editbox_exit +@@: + or word ed_flags,ed_insert + jmp edit_box.editbox_exit +edit_box_key.ins_v: + dec dword [ebp+42];ed_size ;processing is insert + sub esi,ecx + add esi,ebx + mov edi,esi +;clear +pusha + mov edi,ebp + mov ebp,ed_pos + call edit_box_key.clear_bg +popa + jmp edit_box_key.In_k +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +edit_box_key.delete: + mov edx,ed_size + mov ecx,ed_pos + cmp edx,ecx + jg edit_box_key.bac_del + test word ed_flags,ed_shift_on + jne edit_box_key.del_bac +edit_ex +edit_box_key.bac_del: + call edit_box_key.del_char + jmp edit_box_key.draw_all +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;--- нажата клавиша backspace --- +edit_box_key.backspace: + ; проверяем, курсор у левого края ? + mov ecx,ed_pos + test ecx,ecx + jnz edit_box_key.del_bac + test word ed_flags,ed_shift_on + jne edit_box_key.bac_del + +edit_ex +edit_box_key.del_bac: + mov edx,ed_size + cmp edx,ecx ;if ed_pos=ed_size + je @f + dec ecx + call edit_box_key.del_char +@@: test word ed_flags,ed_shift_on + jne edit_box_key.bac_del + dec dword ed_pos +edit_box_key.draw_all: + push edit_box_key.shift;.draw_cursor_text;eax + + test word ed_flags,ed_shift_on + je @f + mov eax,dword ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + + mov ebp,ed_color + call edit_box.clear_cursor + call edit_box.check_offset + call edit_box.draw_bg + ret +@@: dec dword ed_size + +edit_box_key.draw_all2: + and word ed_flags,ed_shift_cl + mov ebp,ed_color + call edit_box.clear_cursor + call edit_box.check_offset + mov ebp,ed_size + call edit_box_key.clear_bg + ret +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;--- нажата клавиша left --- +edit_box_key.left: mov ebx,ed_pos + test ebx,ebx + jz edit_box_key.sh_st_of + or word ed_flags,ed_left_fl + call edit_box_key.sh_first_sh + dec dword ed_pos + call edit_box_key.sh_enable + jmp edit_box.draw_cursor_text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;--- нажата клавиша right --- +edit_box_key.right: mov ebx,ed_pos + cmp ebx,ed_size + je edit_box_key.sh_st_of + and word ed_flags,ed_right_fl + call edit_box_key.sh_first_sh + inc dword ed_pos + call edit_box_key.sh_enable + jmp edit_box.draw_cursor_text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +edit_box_key.home: + mov ebx,ed_pos + test ebx,ebx + jz edit_box_key.sh_st_of + call edit_box_key.sh_first_sh + xor eax,eax + mov ed_pos,eax + call edit_box_key.sh_home_end + jmp edit_box.draw_cursor_text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +edit_box_key.end: + mov ebx,ed_pos + cmp ebx,dword ed_size + je edit_box_key.sh_st_of + call edit_box_key.sh_first_sh + mov eax,ed_size + mov ed_pos,eax + call edit_box_key.sh_home_end + jmp edit_box.draw_cursor_text +} + +macro use_mouse_func +{ +;---------------------------------------------------------- +;--- Обработка .mouse_wigwag +;---------------------------------------------------------- +edit_box_mouse.mouse_wigwag: + shr eax,16 + or word ed_flags,ed_shift_bac+ed_shift_on+ed_shift +;;;;;;;;;;;;;;;;;; +;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox +;;;;;;;;;;;;;;;;;; + mov ebx,[procinfo.box.left] + add ebx,ed_left + + add ebx,dword [esp+20];scr_w + + cmp eax,ebx + jb edit_box_mouse.mleft + + add ebx,ed_width + cmp eax,ebx + ja edit_box_mouse.mright + + sub ebx,ed_width + + xor edx,edx + sub eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х + mov ebx,6 + div ebx +;;;;;;;;;;;;;;;;;; +;;процедура обработки положения выделенного текста, в пределах области editbox +;;;;;;;;;;;;;;;;;; +;Получили координаты в eax мышки, т.е. куда она переместилась +;Рисование закрашеных прямоугольников и очистка их + add eax,ed_offset ;добавим смещение + cmp eax,dword ed_size ;если вышли за пределы, то ничего не делать + ja edit_box_mouse.mwigvag +edit_box_mouse.mdraw: + mov dword ed_pos,eax ;сохраним новое значение +;Рисование закрашеных прямоугольников и очистка их + mov ecx,dword ed_shift_pos + mov ebx,dword ed_shift_pos_old + mov dword ed_shift_pos_old,eax ;внесем новое значение старой позиции курсора +;проверка и рисование закрашеных областей + cmp ecx,ebx ;выясняем куда было движение на один шаг назад + je edit_box_mouse.m1_shem ;движения не было ранее + jb edit_box_mouse.msmaller ;движение было -> + cmp ebx,eax ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит + ja edit_box_mouse.m1_shem ;если было движение <- то нужно закрасить область + je edit_box_mouse.mwigvag ;если изменения не было, то ничего не делать + mov ebp,ed_color ;тут нужно очистить область c ed_pos ed_shift_pos_old +;входные параметры ebp=color ebx=ed_shift_pos + call edit_box_key.sh_cl_ + jmp edit_box_mouse.mwigvag +edit_box_mouse.msmaller: + cmp ebx,eax + jb edit_box_mouse.m1_shem + mov ebp,ed_color +;входные параметры ebp=color ebx=ed_shift_pos + call edit_box_key.sh_cl_ + jmp edit_box_mouse.mwigvag +;alike = +edit_box_mouse.m1_shem: + mov ebp,shift_color +;входные параметры ebp=color ebx=ed_shift_pos + mov ebx,ecx + call edit_box_key.sh_cl_ + jmp edit_box_mouse.mwigvag +edit_box_mouse.mwigvag: + and word ed_flags,ed_shift_mcl + jmp edit_box.draw_cursor_text +; popa +; ret +edit_box_mouse.mleft: + mov eax,ed_pos + cmp eax,0 + jbe edit_box_mouse.mwigvag + dec eax + call edit_box.check_offset + push eax + mov ebx,ed_shift_pos + mov ebp,shift_color + call edit_box_key.sh_cl_ + pop eax + jmp edit_box_mouse.mdraw +edit_box_mouse.mright: + mov eax,ed_pos + mov ebx,ed_size + cmp eax,ebx + jae edit_box_mouse.mwigvag + inc eax + call edit_box.check_offset + mov ebx,ed_shift_pos + mov ebp,shift_color + push eax + call edit_box_key.sh_cl_ + pop eax + jmp edit_box_mouse.mdraw +} + +macro use_work_mouse +; pop edx ;scr_h +; pop ebp ;scr_w +;---------------------------------------------------------- +;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? +;---------------------------------------------------------- +{ + test word ed_flags,ed_mouse_on + jne edit_box_mouse.mouse_wigwag +;---------------------------------------------------------- +;--- проверяем, попадает ли курсор в edit box ------------- +;---------------------------------------------------------- + mov ebx,[procinfo.box.top] + add ebx,ed_top + add ebx,dword [esp+24] ;ecx scr_h + cmp ax,bx + jl edit_box_mouse._blur;.mouse_end_no_focus + + add ebx,ed_height + cmp ax,bx + jg edit_box_mouse._blur;.mouse_end_no_focus + + shr eax,16 + + mov ebx,[procinfo.box.left] + add ebx,ed_left + add ebx,dword [esp+20] ;edx scr_w + + cmp ax,bx + jl edit_box_mouse._blur;.mouse_end_no_focus + + add ebx,ed_width + cmp ax,bx + jg edit_box_mouse._blur;.mouse_end_no_focus +;--- изменяем позицию курсора --- + push eax + mov ebp,ed_color + call edit_box.clear_cursor + pop eax +edit_box_mouse._mvpos: + mov ebx,dword [procinfo.box.left] + xor edx,edx + sub eax,ed_left + sub eax,ebx +; + add ebx,dword [esp+20] ; scr_w + sub eax,2 +; + mov ebx,6 + div bx + add eax,ed_offset + cmp eax,ed_size + jna edit_box_mouse._mshift + mov eax,ed_size +edit_box_mouse._mshift: +;;;;;;; +;;Секция обработки shift и выделения по shift +;;;;;;; + test word ed_flags,ed_shift_bac + je @f + mov ebp,dword ed_color + mov ebx,dword ed_shift_pos + push eax + call edit_box_key.sh_cl_ + and word ed_flags,ed_shift_bac_cl + pop eax +@@: + test word ed_flags,ed_mouse_on + jne @f + + mov dword ed_shift_pos,eax + or word ed_flags,ed_mouse_on + mov dword ed_pos,eax + mov dword [mouse_flag],edi ;установим идентификатор + bts word ed_flags,1 ;установка фокуса + jmp edit_box_mouse.m_sh +@@: + cmp eax,dword ed_shift_pos ;если позиции не изменились + je edit_box.editbox_exit + mov ed_pos,eax + mov ebp,dword shift_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ + or word ed_flags,ed_mous_adn_b ;установим бит что мы выделили +shift_on + +edit_box_mouse.m_sh: call edit_box.draw_text + call edit_box.draw_cursor +;---------------------------------------------------------- +;--- процедура установки фокуса --------------------------- +;---------------------------------------------------------- + jmp edit_box_mouse.drc +edit_box_mouse._blur: + test word ed_flags,ed_always_focus + jne edit_box.editbox_exit + btr word ed_flags,1 ; если не в фокусе, выходим + jnc edit_box.editbox_exit + + mov ebp,ed_color + call edit_box.clear_cursor +edit_box_mouse.drc: call edit_box.draw_border + jmp edit_box.editbox_exit +} + + +; Макрос выхода +macro edit_ex +{ +popa +ret +} +macro debug +{ + ;----------- отладка + pushad +; mov dword [ed_buffer.2],0 +; mov eax,edi + mov eax,dword [ed_buffer.2] + mov edi,ed_buffer.3 + call .str + ;рисование фона + mov eax,13 + mov ebx,178*65536+70 + mov ecx,28*65536+10 + xor edx,edx + int 0x40 + ;вывод значения на экран + mov eax,4 + mov ebx,180*65536+30 + mov ecx,0x10DDBBCC + mov edx,ed_buffer.3 + mov esi,8 + int 0x40 + popad + ;----------- отладка +} +macro debug_func +{ +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + ;dec edi ;смещение необходимое для записи с конца строки + call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает + ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + + ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться +} + +;;;;;;;;;;;;;;; +;For LibGui +;;;;;;;;;;;;;;; +macro srt_ed_libgui +{ +ed_width equ [EditBox.ed_width] ;ширина компонента +ed_left equ [EditBox.ed_left] ;положение по оси х +ed_top equ [EditBox.ed_top] ;положение по оси у +ed_color equ [EditBox.ed_color] ;цвет фона компонента +shift_color equ [EditBox.shift_color] ;=0x6a9480 +ed_focus_border_color equ [EditBox.ed_focus_border_color] ;цвет рамки компонента +ed_blur_border_color equ [EditBox.ed_blur_border_color] ;цвет не активного компонента +ed_text_color equ [EditBox.ed_text_color] ;цвет текста +ed_max equ [EditBox.ed_max] ;кол-во символов которые можно максимально ввести +ed_text equ [EditBox.ed_text] ;указатель на буфер +ed_flags equ [EditBox.ed_flags] ;флаги +ed_size equ [EditBox.ed_size] ;кол-во символов +ed_pos equ [EditBox.ed_poz] ;позиция курсора +ed_offset equ [EditBox.ed_offset] ;смещение +cl_curs_x equ [EditBox.cl_curs_x] ;предыдущее координата курсора по х +cl_curs_y equ [EditBox.cl_curs_y] ;предыдущее координата курсора по у +ed_shift_pos equ [EditBox.ed_shift_pos] ;положение курсора +ed_shift_pos_old equ [EditBox.ed_shift_pos_old] ;старое положение курсора +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=24 ; высота +} + +ed_struc_size=72 +struc edit_box width,left,top,color,shift_color,focus_border_color,\ + blur_border_color,text_color,max,text,flags,size,pos +{ +.width dd width +.left dd left +.top dd top +.color dd color +.shift_color dd shift_color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.flags dd flags+0 +.size dd size+0 +.pos dd pos+0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +.shift_old dd 0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота + +} diff --git a/programs/develop/box_lib/trunk/editbox_ex.asm b/programs/develop/box_lib/trunk/editbox_ex.asm new file mode 100644 index 0000000000..53e2145d4f --- /dev/null +++ b/programs/develop/box_lib/trunk/editbox_ex.asm @@ -0,0 +1,249 @@ +;заголовок приложения +use32 ; транслятор, использующий 32 разрядных команды + org 0x0 ; базовый адрес кода, всегда 0x0 + db 'MENUET01' ; идентификатор исполняемого файла (8 байт) + dd 0x1 ; версия формата заголовка исполняемого файла + dd start ; адрес, на который система передаёт управление + ; после загрузки приложения в память + dd i_end ; размер приложения + dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd 0x0 ; указатель на строку с параметрами. + dd way_of_ini +include 'macros.inc' +include 'editbox_ex.mac' +start: +;Get way for ini file. + mov edi,way_of_ini + mov ecx,1024 + xor eax,eax + cld + repne scasb + test ecx,ecx + jz @f + + mov esi,1024 + sub esi,ecx + mov ecx,esi + std + mov al,'/' + repne scasb + test ecx,ecx + jz next_way + add edi,2 +@@: + mov esi,ini_file + cld + +@@: lodsb + test al,al + jz @f + stosb + jmp @b + +@@: xor eax,eax + stosb + +; load DLL + mov ecx,way_of_ini + mov eax, 68 + mov ebx, 19 + mcall + test eax, eax + jz next_way + jmp import_init_ +next_way: + mov ecx,ini_file + mov eax, 68 + mov ebx, 19 + mcall + test eax, eax + jz exit + + + +import_init_: +; initialize import + mov edx, eax + mov esi,myimport +import_loop: + lodsd + test eax, eax + jz import_done + push edx +import_find: + mov ebx, [edx] + test ebx, ebx + jz exit;import_not_found + push eax +@@: + mov cl, [eax] + cmp cl, [ebx] + jnz import_find_next + test cl, cl + jz import_found + inc eax + inc ebx + jmp @b +import_find_next: + pop eax + add edx, 8 + jmp import_find +import_found: + pop eax + mov eax, [edx+4] + mov [esi-4], eax + pop edx + jmp import_loop +import_done: + + mcall 40,0x27 ;установить маску для ожидаемых событий +red_win: + call draw_window ;первоначально необходимо нарисовать окно +align 4 +still: ;основной обработчик + mcall 10 ;Ожидать события + dec eax + jz red_win + dec eax + jz key + dec eax + jz button + + push dword edit1 + push 22 + push 5 + call [edit_box_mouse] + + push dword edit2 + push 22 + push 5 + call [edit_box_mouse] + + push dword check1 + call [check_box_mouse] + + push dword check2 + call [check_box_mouse] + + push dword Option_boxs + call [option_box_mouse] + + push dword Option_boxs2 + call [option_box_mouse] + + jmp still ;если ничего из перечисленного то снова в цикл +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +button: + mcall 17 ;получить идентификатор нажатой клавиши + test ah,ah ;если в ah 0, то перейти на обработчик событий still + jz still +exit: mcall -1 +key: + mcall 2 ;загрузим значение 2 в регистор eax и получим код нажатой клавиши + + push dword edit1 + call [edit_box_key] + + push dword edit2 + call [edit_box_key] + + jmp still + +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +align 4 +draw_window: ;рисование окна приложения + mcall 12,1 + mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed + + push dword edit1 + call [edit_box_draw] + + push dword edit2 + call [edit_box_draw] + + push dword check1 + call [check_box_draw] + + push dword check2 + call [check_box_draw] + + push dword Option_boxs + call [option_box_draw] + + push dword Option_boxs2 + call [option_box_draw] + + mcall 12,2 + ret +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +;DATA данные +ini_file db '/sys/lib/box_lib.obj',0 +myimport: + +edit_box_draw dd aEdit_box_draw +edit_box_key dd aEdit_box_key +edit_box_mouse dd aEdit_box_mouse +version_ed dd aVersion_ed + +check_box_draw dd aCheck_box_draw +check_box_mouse dd aCheck_box_mouse +version_ch dd aVersion_ch + +option_box_draw dd aOption_box_draw +option_box_mouse dd aOption_box_mouse +version_op dd aVersion_op + + dd 0 + dd 0 + +aEdit_box_draw db 'edit_box',0 +aEdit_box_key db 'edit_box_key',0 +aEdit_box_mouse db 'edit_box_mouse',0 +aVersion_ed db 'version_ed',0 + +aCheck_box_draw db 'check_box_draw',0 +aCheck_box_mouse db 'check_box_mouse',0 +aVersion_ch db 'version_ch',0 + +aOption_box_draw db 'option_box_draw',0 +aOption_box_mouse db 'option_box_mouse',0 +aVersion_op db 'version_op',0 + + + + +check1 check_box 10,45,6,12,0x80AABBCC,0,0,check_text,14,ch_flag_en +check2 check_box 10,60,6,12,0x80AABBCC,0,0,check_text2,15 + +edit1 edit_box 350,3,5,0xffffff,0x6f9480,0,0xAABBCC,0,308,hed,ed_focus,hed_end-hed-1,hed_end-hed-1 +edit2 edit_box 350,3,25,0xffffff,0x6a9480,0,0,0,99,ed_buffer,ed_figure_only + +op1 option_box option_group1,10,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 +op2 option_box option_group1,10,105,6,12,0xFFFFFF,0,0,op_text.2,op_text.e2-op_text.2 +op3 option_box option_group1,10,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 +op11 option_box option_group2,120,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 +op12 option_box option_group2,120,105,6,12,0xffffff,0,0,op_text.2,op_text.e2-op_text.2 +op13 option_box option_group2,120,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 + +option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится +option_group2 dd op12 ;приложение +Option_boxs dd op1,op2,op3,0 +Option_boxs2 dd op11,op12,op13,0 +hed db 'BOXs load from lib date 27.09.2007',0 +hed_end: +rb 256 +check_text db 'First checkbox' +check_text2 db 'Second checkbox' +op_text: ; Сопровождающий текст для чек боксов +.1 db 'Option_Box #1' +.e1: +.2 db 'Option_Box #2' +.e2: +.3 db 'Option_Box #3' +.e3: +ed_buffer rb 100 +way_of_ini rb 1024 +i_end: +rb 1024 +mem: \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/editbox_ex.kex b/programs/develop/box_lib/trunk/editbox_ex.kex new file mode 100644 index 0000000000..1fa2f6afed Binary files /dev/null and b/programs/develop/box_lib/trunk/editbox_ex.kex differ diff --git a/programs/develop/box_lib/trunk/editbox_ex.mac b/programs/develop/box_lib/trunk/editbox_ex.mac new file mode 100644 index 0000000000..e9200b74bc --- /dev/null +++ b/programs/develop/box_lib/trunk/editbox_ex.mac @@ -0,0 +1,77 @@ +ed_struc_size=72 +struc edit_box width,left,top,color,shift_color,focus_border_color,\ + blur_border_color,text_color,max,text,flags,size,pos +{ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота + +.width dd width +.left dd left +.top dd top +.color dd color +.shift_color dd shift_color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.flags dd flags+0 +.size dd size+0 +.pos dd pos+0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +.shift_old dd 0 +} +struc check_box left,top,ch_text_margin,ch_size,color,border_color,text_color,text,ch_text_length,flags +{ ;структура параметров для чек бокса +ch_flag_en=10b +.left: dw left ;+0 ;положение по х +.top: dw top ;положение по у +.ch_text_margin: dd ch_text_margin ;расстояние от прямоугольника чек бокса до надписи +.ch_size: dd ch_size ;размер квадрата чек бокса, для примера 12 +.color: dd color ;цвет внутри чекбокса +.border_color: dd border_color ;цвет рамки +.text_color: dd text_color ;цвет надписи +.text: dd text ;адрес в коде программы где расположен текст +.ch_text_length: dd ch_text_length ;длинна строки с символами +.flags: dd flags+0 ; флаги +} +struc option_box point_gr,left,top,op_text_margin,op_size,color,border_color,text_color,text,op_text_length,flags +{ ;структура параметров для чек бокса +op_flag_en=10b +.option_group: dd point_gr +.left: dw left ;+0 ;положение по х +.top: dw top ;положение по у +.ch_text_margin: dd op_text_margin ;расстояние от прямоугольника чек бокса до надписи +.ch_size: dd op_size ;размер квадрата чек бокса, для примера 12 +.color: dd color ;цвет внутри чекбокса +.border_color: dd border_color ;цвет рамки +.text_color: dd text_color ;цвет надписи +.text: dd text ;адрес в коде программы где расположен текст +.ch_text_length: dd op_text_length ;длинна строки с символами +.flags: dd flags+0 ; флаги +} diff --git a/programs/develop/box_lib/trunk/macros.inc b/programs/develop/box_lib/trunk/macros.inc new file mode 100644 index 0000000000..e5de532755 --- /dev/null +++ b/programs/develop/box_lib/trunk/macros.inc @@ -0,0 +1,502 @@ +@^ fix macro comment { +^@ fix } + + +macro m2m dest,src { + push src + pop dest +} + + +macro iglobal { + IGlobals equ IGlobals, + macro __IGlobalBlock { } + +macro uglobal { + UGlobals equ UGlobals, + macro __UGlobalBlock { } + +endg fix } ; Use endg for ending iglobal and uglobal blocks. + + +macro IncludeIGlobals{ + macro IGlobals dummy,[n] \{ __IGlobalBlock + purge __IGlobalBlock \} + match I, IGlobals \{ I \} } + +macro IncludeUGlobals{ + macro UGlobals dummy,[n] \{ + \common + \local begin, size + begin = $ + virtual at $ + \forward + __UGlobalBlock + purge __UGlobalBlock + \common + size = $ - begin + end virtual + rb size + \} + match U, UGlobals \{ U \} } + +uglobal +endg + +iglobal +endg + + +; 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: + IncludeIGlobals + } +DATA fix data + +macro udata + { + if used __params & ~defined __params + __params: + db 0 + __end: + rb 255 + else + __end: + end if + __udata: + IncludeUGlobals + } +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 + } + +; macro for defining multiline text data +struc mls [sstring] + { + forward + local ssize + virtual at 0 + db sstring ; mod + ssize = $ + end virtual + db ssize + db sstring + common + db -1 ; mod + } + + + +; strings +macro sz name,[data] { ; from MFAR [mike.dld] + common + if used name + name db data + .size = $-name + end if +} + +macro lsz name,[lng,data] { ; from MFAR [mike.dld] + common + if used name + label name + forward + if lang eq lng + db data + end if + common + .size = $-name + end if +} + +macro szc name,elsz,[data] { ; from MFAR [mike.dld] + common + local s,m + m = 0 + if used name + label name + forward + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + common + .size = $-name + .maxl = m + end if +} + +macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld] + common + local s,m,c + m = 0 + c = 0 + if used name + label name + forward + if lang eq lng + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + c = c+1 + end if + common + .size = $-name + .maxl = m + .count = c + 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 +} + + +include 'config.inc' +;__CPU_type equ p5 +SYSENTER_VAR equ 0 + +macro mcall a,b,c,d,e,f,i { ; 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 + __mov ebp,i + + 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 header a,[b] { + common + use32 + org 0 + db 'MENUET',a + forward + if b eq + dd 0 + else + dd b + end if } +macro section name { align 16 + label name } +macro func name { + if ~used name + display 'FUNC NOT USED: ',`name,13,10 + else + align 4 + name: + ;diff16 `name,0,name +;pushad +;pushfd +;dps `name +;newline +;mcall 5,1 +;popfd +;popad +} +macro endf { end if } + +macro diff16 title,l1,l2 + { + local s,d + s = l2-l1 + display title,': 0x' + repeat 8 + d = '0' + s shr ((8-%) shl 2) and $0F + if d > '9' + d = d + 'A'-'9'-1 + end if + display d + end repeat + display 13,10 + } + +macro diff10 title,l1,l2 + { + local s,d,z,m + s = l2-l1 + z = 0 + m = 1000000000 + display title,': ' + repeat 10 + d = '0' + s / m + s = s - (s/m)*m + m = m / 10 + if d <> '0' + z = 1 + end if + if z <> 0 + display d + end if + end repeat + display 13,10 + } + +; 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 RGB [a] { + common + match (r=,g=,b),a \{ + \dd ((r) shl 16) or ((g) shl 8) or (b) + \} +} + + +struc POINT _t,_dx,_dy { + .x _t _dx + .y _t _dy +} + +; structure definition helper +include 'struct.inc' + +struct RECT + left dd ? + top dd ? + right dd ? + bottom dd ? +ends + +struct BOX + left dd ? + top dd ? + width dd ? + height dd ? +ends + +; structures used in MeOS +struct process_information + cpu_usage dd ? ; +0 + window_stack_position dw ? ; +4 + window_stack_value dw ? ; +6 + dw ? ; +8 + process_name rb 12 ; +10 + memory_start dd ? ; +22 + used_memory dd ? ; +26 + PID dd ? ; +30 + box BOX ; +34 + slot_state dw ? ; +50 + dw ? ; +52 + client_box BOX ; +54 + wnd_state db ? ; +70 + rb (1024-71) +ends + +struct 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 ? +ends + +struct FILEDATE + Second db ? + Minute db ? + Hour db ? + db ? + Day db ? + Month db ? + Year dw ? +ends + +struct FILEINFO + Attributes dd ? + IsUnicode db ? + db 3 dup(?) + DateCreate FILEDATE + DateAccess FILEDATE + DateModify FILEDATE + Size dq ? +ends + +; 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/box_lib/trunk/proc32.inc b/programs/develop/box_lib/trunk/proc32.inc new file mode 100644 index 0000000000..aa3ffc9702 --- /dev/null +++ b/programs/develop/box_lib/trunk/proc32.inc @@ -0,0 +1,270 @@ + +; Macroinstructions for defining and calling procedures + +macro stdcall proc,[arg] ; directly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call proc } + +macro invoke proc,[arg] ; indirectly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call [proc] } + +macro ccall proc,[arg] ; directly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call proc + if size@ccall + add esp,size@ccall + end if } + +macro cinvoke proc,[arg] ; indirectly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call [proc] + if size@ccall + add esp,size@ccall + end if } + +macro proc [args] ; define procedure + { common + match name params, args> + \{ define@proc name, \{ prologue name,flag,parmbytes,localbytes,reglist \} + macro locals + \{ virtual at ebp-localbytes+current + macro label def \\{ match . type,def> \\\{ deflocal@proc .,label, + \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \} + macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2 + end if \} } + +macro defargs@proc [arg] + { common + if ~ arg eq + forward + local ..arg,current@arg + match argname:type, arg + \{ current@arg equ argname + label ..arg type + argname equ ..arg + if dqword eq type + dd ?,?,?,? + else if tbyte eq type + dd ?,?,? + else if qword eq type | pword eq type + dd ?,? + else + dd ? + end if \} + match =current@arg,current@arg + \{ current@arg equ arg + arg equ ..arg + ..arg dd ? \} + common + args@proc equ current@arg + forward + restore current@arg + common + end if } + +macro deflocal@proc name,def,[val] + { common + match vars, all@vars \{ all@vars equ all@vars, \} + all@vars equ all@vars name + forward + local ..var,..tmp + match =label,def \{ ..tmp equ \} + match tmp,..tmp \{ ..var def val \} + match ,..tmp \{ label ..var val \} + match =?, val \{ ..tmp equ \} + match any =dup (=?), val \{ ..tmp equ \} + match tmp : value, ..tmp : val + \{ tmp: end virtual + initlocal@proc ..var,def value + virtual at tmp\} + common + match first rest, ..var, \{ name equ first \} } + +macro initlocal@proc name,def + { virtual at name + def + size@initlocal = $ - name + end virtual + position@initlocal = 0 + while size@initlocal > position@initlocal + virtual at name + def + if size@initlocal - position@initlocal < 2 + current@initlocal = 1 + load byte@initlocal byte from name+position@initlocal + else if size@initlocal - position@initlocal < 4 + current@initlocal = 2 + load word@initlocal word from name+position@initlocal + else + current@initlocal = 4 + load dword@initlocal dword from name+position@initlocal + end if + end virtual + if current@initlocal = 1 + mov byte [name+position@initlocal],byte@initlocal + else if current@initlocal = 2 + mov word [name+position@initlocal],word@initlocal + else + mov dword [name+position@initlocal],dword@initlocal + end if + position@initlocal = position@initlocal + current@initlocal + end while } + +macro endp + { purge ret,locals,endl + finish@proc + purge finish@proc + restore regs@proc + match all,args@proc \{ restore all \} + restore args@proc + match all,all@vars \{ restore all \} } + +macro local [var] + { common + locals + forward done@local equ + match varname[count]:vartype, var + \{ match =BYTE, vartype \\{ varname rb count + restore done@local \\} + match =WORD, vartype \\{ varname rw count + restore done@local \\} + match =DWORD, vartype \\{ varname rd count + restore done@local \\} + match =PWORD, vartype \\{ varname rp count + restore done@local \\} + match =QWORD, vartype \\{ varname rq count + restore done@local \\} + match =TBYTE, vartype \\{ varname rt count + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + rq count+count + restore done@local \\} + match , done@local \\{ virtual + varname vartype + end virtual + rb count*sizeof.\#vartype + restore done@local \\} \} + match :varname:vartype, done@local:var + \{ match =BYTE, vartype \\{ varname db ? + restore done@local \\} + match =WORD, vartype \\{ varname dw ? + restore done@local \\} + match =DWORD, vartype \\{ varname dd ? + restore done@local \\} + match =PWORD, vartype \\{ varname dp ? + restore done@local \\} + match =QWORD, vartype \\{ varname dq ? + restore done@local \\} + match =TBYTE, vartype \\{ varname dt ? + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + dq ?,? + restore done@local \\} + match , done@local \\{ varname vartype + restore done@local \\} \} + match ,done@local + \{ var + restore done@local \} + common + endl } diff --git a/programs/develop/box_lib/trunk/readme.txt b/programs/develop/box_lib/trunk/readme.txt new file mode 100644 index 0000000000..c418269c74 --- /dev/null +++ b/programs/develop/box_lib/trunk/readme.txt @@ -0,0 +1,13 @@ + ╥хяыют └ыхъёхщ, ╫хы сшэёъ. +╧ЁшьхЁ яЁюёЄюую шёяы№чютрэш  editbox т сшсышюЄхъх, +EditBox яхЁхяшёрэ фы  ЁрсюЄ√ т сшсышюЄхъх. +─рЄр 25.06.2008 +ёфхырэр яюффхЁцър чряєёър рёёхьсыхЁэюую яЁшьхЁр яЁш Ёрёяюыюцхэшш Єхъє∙хщ сшсышюЄхъш яю 2-ь ьхёЄрь +1. /sys/lib/box_lib.obj ш ъюуфр сшсышюЄхър эрїюфшЄ№ё  т яряъх ё яЁюуЁрььющ. + +─рЄр 21.09.2007 +╤фхырэ єяюЁ эр яюффЁхцъє ╤ ш яхЁхфрўш ярЁрьхЄЁют т ёЄхъх stdcall. +═р фрээ√щ ьюьхэЄ, эюёшЄ ¤ъёяхЁхьхэЄры№э√щ, ЄхёЄют√щ їрЁръЄхЁ. +┴шсышюЄхъє box_lib.obj эєцэю яюьхёЄшЄ№ т яряъє ё т√яюыэ ■∙хщё  яЁюуЁрььющ editbox_ex, шыш яю рфЁхёє /sys/lib/? эю Єюуфр эєцэю яюфьхэшЄ№ яєЄ№ т Їрщых ini_file эр яєЄ№ ъ сшсышюЄхъх +. ╧ЁшьхЁ ёрь т√ўшёы хЄ яєЄ№ ъ сшсышюЄхъх, эх чртшёшью юЄ ётюхую ьхёЄюЁрёяюыюцхэш  +24.09.2007 - ёфхыры яюффЁхцъє checkbox. ─юсртшы ю°шсъш, яЁюуЁрььр уы■ўшЄ юўхэ№ ёхЁ№хчэю :( \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/run.bat b/programs/develop/box_lib/trunk/run.bat new file mode 100644 index 0000000000..6340cc7cb6 --- /dev/null +++ b/programs/develop/box_lib/trunk/run.bat @@ -0,0 +1,4 @@ +..\FASM\fasm.exe box_lib.asm +..\FASM\fasm.exe editbox_ex.asm editbox_ex.kex +REM ..\FASM\kpack.exe editbox_ex +..\emul\klbrinwin.exe editbox_ex.kex \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/struct.inc b/programs/develop/box_lib/trunk/struct.inc new file mode 100644 index 0000000000..947a84e89a --- /dev/null +++ b/programs/develop/box_lib/trunk/struct.inc @@ -0,0 +1,180 @@ + +; Macroinstructions for defining data structures + +macro struct name + { fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common fields@struct equ fields@struct,.,db, \} + struc dw [val] \{ \common fields@struct equ fields@struct,.,dw, \} + struc du [val] \{ \common fields@struct equ fields@struct,.,du, \} + struc dd [val] \{ \common fields@struct equ fields@struct,.,dd, \} + struc dp [val] \{ \common fields@struct equ fields@struct,.,dp, \} + struc dq [val] \{ \common fields@struct equ fields@struct,.,dq, \} + struc dt [val] \{ \common fields@struct equ fields@struct,.,dt, \} + struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \} + struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \} + struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \} + struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \} + struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \} + struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \} + macro db [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,db, \} + macro dw [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dw, \} + macro du [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,du, \} + macro dd [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dd, \} + macro dp [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dp, \} + macro dq [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dq, \} + macro dt [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dt, \} + macro rb count \{ \local anonymous + fields@struct equ fields@struct,anonymous,db,count dup (?) \} + macro rw count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dw,count dup (?) \} + macro rd count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dd,count dup (?) \} + macro rp count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dp,count dup (?) \} + macro rq count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dq,count dup (?) \} + macro rt count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dt,count dup (?) \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} + virtual at 0 } + +macro ends + { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt + restruc rb,rw,rd,rp,rq,rt + purge db,dw,du,dd,dp,dq,dt + purge rb,rw,rd,rp,rq,rt + purge union,struct + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + fields@\\#name equ fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + if $ + display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah + err + end if + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label . + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common \\\} \\} \} } + +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,name,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + virtual at 0 + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ + rb sizeof.#parent#field - $ + end if + else if sizeof.#type > $ + rb sizeof.#type - $ + end if + common + sizeof.#name = $ + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + rb sizeof.#type + end if + local value + common + sizeof.#name = $ + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} }