From 5b18f6aea90389d5de77d955ecf8b17d0b416cb1 Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Fri, 13 Feb 2009 09:04:33 +0000 Subject: [PATCH] bugfix Num,Caps,Scroll Lock & remove in dir libraries git-svn-id: svn://kolibrios.org@1032 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/box_lib/C--/lib/RANDOM.H-- | 52 + .../libraries/box_lib/C--/lib/kolibri.h-- | 558 +++++++ .../libraries/box_lib/C--/lib/load_bmp.h-- | 67 + .../libraries/box_lib/C--/lib/memory.h-- | 36 + .../libraries/box_lib/C--/trunk/EditBox2.c-- | 96 ++ .../libraries/box_lib/C--/trunk/EditBox2.lst | 952 +++++++++++ .../libraries/box_lib/C--/trunk/compile.bat | 5 + .../box_lib/C--/trunk/use_library.h-- | 112 ++ .../libraries/box_lib/C--/trunk/warning.txt | 50 + .../libraries/box_lib/trunk/box_lib.asm | 67 + .../libraries/box_lib/trunk/checkbox.mac | 148 ++ .../libraries/box_lib/trunk/config.inc | 1 + .../libraries/box_lib/trunk/editbox.mac | 1397 +++++++++++++++++ .../libraries/box_lib/trunk/editbox_ex.asm | 245 +++ .../libraries/box_lib/trunk/editbox_ex.kex | Bin 0 -> 1504 bytes .../libraries/box_lib/trunk/editbox_ex.mac | 77 + .../libraries/box_lib/trunk/macros.inc | 502 ++++++ .../libraries/box_lib/trunk/optionbox.mac | 201 +++ .../libraries/box_lib/trunk/proc32.inc | 270 ++++ .../libraries/box_lib/trunk/readme.txt | 14 + .../develop/libraries/box_lib/trunk/run.bat | 4 + .../libraries/box_lib/trunk/struct.inc | 180 +++ 22 files changed, 5034 insertions(+) create mode 100644 programs/develop/libraries/box_lib/C--/lib/RANDOM.H-- create mode 100644 programs/develop/libraries/box_lib/C--/lib/kolibri.h-- create mode 100644 programs/develop/libraries/box_lib/C--/lib/load_bmp.h-- create mode 100644 programs/develop/libraries/box_lib/C--/lib/memory.h-- create mode 100644 programs/develop/libraries/box_lib/C--/trunk/EditBox2.c-- create mode 100644 programs/develop/libraries/box_lib/C--/trunk/EditBox2.lst create mode 100644 programs/develop/libraries/box_lib/C--/trunk/compile.bat create mode 100644 programs/develop/libraries/box_lib/C--/trunk/use_library.h-- create mode 100644 programs/develop/libraries/box_lib/C--/trunk/warning.txt create mode 100644 programs/develop/libraries/box_lib/trunk/box_lib.asm create mode 100644 programs/develop/libraries/box_lib/trunk/checkbox.mac create mode 100644 programs/develop/libraries/box_lib/trunk/config.inc create mode 100644 programs/develop/libraries/box_lib/trunk/editbox.mac create mode 100644 programs/develop/libraries/box_lib/trunk/editbox_ex.asm create mode 100644 programs/develop/libraries/box_lib/trunk/editbox_ex.kex create mode 100644 programs/develop/libraries/box_lib/trunk/editbox_ex.mac create mode 100644 programs/develop/libraries/box_lib/trunk/macros.inc create mode 100644 programs/develop/libraries/box_lib/trunk/optionbox.mac create mode 100644 programs/develop/libraries/box_lib/trunk/proc32.inc create mode 100644 programs/develop/libraries/box_lib/trunk/readme.txt create mode 100644 programs/develop/libraries/box_lib/trunk/run.bat create mode 100644 programs/develop/libraries/box_lib/trunk/struct.inc diff --git a/programs/develop/libraries/box_lib/C--/lib/RANDOM.H-- b/programs/develop/libraries/box_lib/C--/lib/RANDOM.H-- new file mode 100644 index 0000000000..11b60c117f --- /dev/null +++ b/programs/develop/libraries/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/libraries/box_lib/C--/lib/kolibri.h-- b/programs/develop/libraries/box_lib/C--/lib/kolibri.h-- new file mode 100644 index 0000000000..30900b9146 --- /dev/null +++ b/programs/develop/libraries/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/libraries/box_lib/C--/lib/load_bmp.h-- b/programs/develop/libraries/box_lib/C--/lib/load_bmp.h-- new file mode 100644 index 0000000000..3df7e80d8e --- /dev/null +++ b/programs/develop/libraries/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;i0) DefineButton(x,y,width,height,id+BT_HIDE,0xEFEBEF); //юяЁхфхы хь ъэюяъє +00000289 837D1000 cmp dword ptr [ebp+10h],0 +0000028D 741F je 2AEh +0000028F FF7520 push dword ptr [ebp+20h] +00000292 FF751C push dword ptr [ebp+1Ch] +00000295 FF7518 push dword ptr [ebp+18h] +00000298 FF7514 push dword ptr [ebp+14h] +0000029B 8B4510 mov eax,[ebp+10h] +0000029E 0500000040 add eax,40000000h +000002A3 50 push eax +000002A4 68EFEBEF00 push 0EFEBEFh +000002A9 E852FEFFFF call 100h + +..\lib\kolibri.h-- 435: WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,0,text,strlen(text)); +000002AE 8B7D08 mov edi,[ebp+8] +000002B1 E887040000 call 73Dh +000002B6 F7D8 neg eax +000002B8 B906000000 mov ecx,6 +000002BD F7E1 mul ecx +000002BF 034518 add eax,[ebp+18h] +000002C2 83D200 adc edx,0 +000002C5 0FACD001 shrd eax,edx,1 +000002C9 034520 add eax,[ebp+20h] +000002CC 40 inc eax +000002CD 50 push eax +000002CE 8B4514 mov eax,[ebp+14h] +000002D1 D1E8 shr eax,1 +000002D3 83E803 sub eax,3 +000002D6 03451C add eax,[ebp+1Ch] +000002D9 50 push eax +000002DA 6880000000 push 80h +000002DF 6A00 push 0 +000002E1 FF7508 push dword ptr [ebp+8] +000002E4 8B7D08 mov edi,[ebp+8] +000002E7 E851040000 call 73Dh +000002EC 50 push eax +000002ED E838FEFFFF call 12Ah +000002F2 5D pop ebp +000002F3 C21C00 ret 1Ch + +..\lib\kolibri.h-- 439: void PutImage(dword buf,w,h,x,y) +000002F6 C8100000 enter 10h,0 + +..\lib\kolibri.h-- 442: EDI=buf; +000002FA 8B7D18 mov edi,[ebp+18h] + +..\lib\kolibri.h-- 443: EAX = 7; +000002FD 6A07 push 7 +000002FF 58 pop eax + +..\lib\kolibri.h-- 444: EBX = buf; +00000300 89FB mov ebx,edi + +..\lib\kolibri.h-- 445: ECX = w<<16+h; +00000302 8B4D14 mov ecx,[ebp+14h] +00000305 C1E110 shl ecx,10h +00000308 034D10 add ecx,[ebp+10h] + +..\lib\kolibri.h-- 446: EDX = x<<16+y+skin_width; +0000030B 8B550C mov edx,[ebp+0Ch] +0000030E C1E210 shl edx,10h +00000311 035508 add edx,[ebp+8] +00000314 031584070000 add edx,[784h] + +..\lib\kolibri.h-- 447: $int 0x40 +0000031A CD40 int 40h +0000031C C9 leave +0000031D C21400 ret 14h + +..\lib\kolibri.h-- 451: void copystr(dword s,d) +00000320 55 push ebp +00000321 89E5 mov ebp,esp + +..\lib\kolibri.h-- 453: $mov esi,s +00000323 8B750C mov esi,[ebp+0Ch] + +..\lib\kolibri.h-- 454: $mov edi,d +00000326 8B7D08 mov edi,[ebp+8] + +..\lib\kolibri.h-- 455: $cld +00000329 FC cld + +..\lib\kolibri.h-- 457: $lodsb +0000032A AC lodsb + +..\lib\kolibri.h-- 458: $stosb +0000032B AA stosb + +..\lib\kolibri.h-- 459: $test al,al +0000032C 84C0 test al,al + +..\lib\kolibri.h-- 460: $jnz l1 +0000032E 75FA jne 32Ah +00000330 5D pop ebp +00000331 C20800 ret 8 + +..\lib\kolibri.h-- 464: int pos,razr,backup,j=0,chislo; +00000334 00000000 dd 0 + +..\lib\kolibri.h-- 465: char buffer[11]=""; +00000338 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 + +use_library.h-- 2: dword edit_box_draw = #aEdit_box_draw; +00000344 5C030000 dd 35Ch + +use_library.h-- 3: dword edit_box_key = #aEdit_box_key; +00000348 66030000 dd 366h + +use_library.h-- 4: dword edit_box_mouse = #aEdit_box_mouse; +0000034C 74030000 dd 374h + +use_library.h-- 5: dword version_ed = #aVersion_ed; +00000350 84030000 dd 384h + +use_library.h-- 28: dword am__ = 0x0; +00000354 00000000 dd 0 + +use_library.h-- 29: dword bm__ = 0x0; +00000358 00000000 dd 0 + +use_library.h-- 31: char aEdit_box_draw[9] = "edit_box\0"; +0000035C 656469745F626F780000 db 'edit_box',0,0 + +use_library.h-- 32: char aEdit_box_key[13] = "edit_box_key\0"; +00000366 656469745F626F785F6B6579 db 'edit_box_key' +00000372 0000 db 0,0 + +use_library.h-- 33: char aEdit_box_mouse[15] = "edit_box_mouse\0"; +00000374 656469745F626F785F6D6F75 db 'edit_box_mou' +00000380 73650000 db 'se',0,0 + +use_library.h-- 34: char aVersion_ed[11] = "version_ed\0"; +00000384 76657273696F6E5F65640000 db 'version_ed',0,0 + +use_library.h-- 36: char aCheck_box_draw [15] = "check_box_draw\0"; +00000390 636865636B5F626F785F6472 db 'check_box_dr' +0000039C 61770000 db 'aw',0,0 + +use_library.h-- 37: char aCheck_box_mouse [16] = "check_box_mouse\0"; +000003A0 636865636B5F626F785F6D6F db 'check_box_mo' +000003AC 7573650000 db 'use',0,0 + +use_library.h-- 38: char aVersion_ch [11] = "version_ch\0"; +000003B1 76657273696F6E5F63680000 db 'version_ch',0,0 + +use_library.h-- 40: char aOption_box_draw [16] = "option_box_draw\0"; +000003BD 6F7074696F6E5F626F785F64 db 'option_box_d' +000003C9 7261770000 db 'raw',0,0 + +use_library.h-- 41: char aOption_box_mouse[17] = "option_box_mouse\0"; +000003CE 6F7074696F6E5F626F785F6D db 'option_box_m' +000003DA 6F7573650000 db 'ouse',0,0 + +use_library.h-- 42: char aVersion_op [11] = "version_op\0" ; +000003E0 76657273696F6E5F6F700000 db 'version_op',0,0 + +use_library.h-- 65: $mov eax,40 +000003EC B828000000 mov eax,28h + +use_library.h-- 66: $mov ebx,0x27 +000003F1 BB27000000 mov ebx,27h + +use_library.h-- 67: $int 0x40 +000003F6 CD40 int 40h + +use_library.h-- 69: $mov eax, 68 +000003F8 B844000000 mov eax,44h + +use_library.h-- 70: $mov ebx, 19 +000003FD BB13000000 mov ebx,13h + +use_library.h-- 71: ECX=#way_of_ini; +00000402 B946040000 mov ecx,446h + +use_library.h-- 72: $int 0x40 +00000407 CD40 int 40h + +use_library.h-- 73: $test eax, eax +00000409 85C0 test eax,eax + +use_library.h-- 74: $jz exit +0000040B 7435 je 442h + +use_library.h-- 77: $mov edx,eax +0000040D 89C2 mov edx,eax + +use_library.h-- 78: ESI=#edit_box_draw; +0000040F BE44030000 mov esi,344h + +use_library.h-- 80: $lodsd +00000414 AD lodsd + +use_library.h-- 81: $test eax,eax +00000415 85C0 test eax,eax + +use_library.h-- 82: $jz import_done +00000417 7426 je 43Fh + +use_library.h-- 83: $push edx +00000419 52 push edx + +use_library.h-- 85: $mov ebx,DSDWORD[EDX] +0000041A 8B1A mov ebx,[edx] + +use_library.h-- 86: $test ebx, ebx +0000041C 85DB test ebx,ebx + +use_library.h-- 87: $jz exit +0000041E 7422 je 442h + +use_library.h-- 88: $push eax +00000420 50 push eax + +use_library.h-- 90: $mov cl,DSBYTE[EAX]; +00000421 8A08 mov cl,[eax] + +use_library.h-- 91: $cmp cl,DSBYTE[EBX]; +00000423 3A0B cmp cl,[ebx] + +use_library.h-- 92: $jnz import_find_next +00000425 7508 jne 42Fh + +use_library.h-- 93: $test cl,cl +00000427 84C9 test cl,cl + +use_library.h-- 94: $jz import_found +00000429 740A je 435h + +use_library.h-- 95: $inc eax +0000042B 40 inc eax + +use_library.h-- 96: $inc ebx +0000042C 43 inc ebx + +use_library.h-- 97: $jmp nex1 +0000042D EBF2 jmp short 421h + +use_library.h-- 99: $pop eax +0000042F 58 pop eax + +use_library.h-- 100: $add edx, 8 +00000430 83C208 add edx,8 + +use_library.h-- 101: $jmp import_find +00000433 EBE5 jmp short 41Ah + +use_library.h-- 103: $pop eax +00000435 58 pop eax + +use_library.h-- 104: $mov eax,DSDWORD[edx+4] +00000436 8B4204 mov eax,[edx+4] + +use_library.h-- 105: $mov DSDWORD[esi-4],eax +00000439 8946FC mov [esi-4],eax + +use_library.h-- 106: $pop edx +0000043C 5A pop edx + +use_library.h-- 107: $jmp import_loop +0000043D EBD5 jmp short 414h + +use_library.h-- 109: return 0; +0000043F 31C0 xor eax,eax +00000441 C3 ret + +use_library.h-- 111: return -1; +00000442 83C8FF or eax,0FFFFFFFFh +00000445 C3 ret + +EditBox2.c-- 13: char way_of_ini[250] = "/sys/lib/box_lib.obj",NULL; //содержимое EditBox'a +00000446 2F7379732F6C69622F626F78 db '/sys/lib/box' +00000452 5F6C69622E6F626A00000000 db '_lib.obj',0,0,0,0 +0000045E 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +0000046A 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +00000476 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +00000482 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +0000048E 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +0000049A 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004A6 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004B2 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004BE 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004CA 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004D6 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004E2 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004EE 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +000004FA 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +00000506 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +00000512 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +0000051E 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +0000052A 000000000000000000000000 db 0,0,0,0,0,0,0,0,0,0,0,0 +00000536 00000000000000000000 db 0,0,0,0,0,0,0,0,0,0 + +EditBox2.c-- 15: edit_box edit1= {250,14,35,0xffffff,0x6f9480,0,0xAABBCC,0,248,#way_of_ini,2,20,20}; +00000540 FA0000000E00000023000000 dd 0FAh,0Eh,23h +0000054C FFFFFF0080946F0000000000 dd 0FFFFFFh,6F9480h,0 +00000558 CCBBAA0000000000F8000000 dd 0AABBCCh,0,0F8h +00000564 460400000200000014000000 dd 446h,2,14h +00000570 140000000000000000000000 dd 14h,0,0 +0000057C 000000000000000000000000 dd 0,0,0 + +EditBox2.c-- 39: void main() +00000588 C8040000 enter 4,0 + +EditBox2.c-- 42: load_dll(); +0000058C E85BFEFFFF call 3ECh + +EditBox2.c-- 44: draw_window(); +00000591 E868000000 call 5FEh + +EditBox2.c-- 47: switch(WaitEvent()) +00000596 E8B5010000 call 750h +0000059B 83F801 cmp eax,1 +0000059E 0F8441000000 jz 5E5h +000005A4 83F802 cmp eax,2 +000005A7 0F8423000000 jz 5D0h +000005AD 83F803 cmp eax,3 +000005B0 0F8534000000 jnz 5EAh + +EditBox2.c-- 51: id=GetButtonID(); +000005B6 E8B0010000 call 76Bh +000005BB 8845FC mov [ebp-4],al + +EditBox2.c-- 52: IF (id==1) || (id==2) ExitProcess(); +000005BE 3C01 cmp al,1 +000005C0 7404 je 5C6h +000005C2 3C02 cmp al,2 +000005C4 7505 jne 5CBh +000005C6 E88B010000 call 756h + +EditBox2.c-- 53: break; +000005CB E91A000000 jmp 5EAh + +EditBox2.c-- 56: GetKey(); +000005D0 E887010000 call 75Ch + +EditBox2.c-- 57: edit_box_key stdcall (#edit1); +000005D5 6840050000 push 540h +000005DA FF1548030000 call dword ptr [348h] + +EditBox2.c-- 58: break; +000005E0 E905000000 jmp 5EAh + +EditBox2.c-- 60: case evReDraw: draw_window(); break; +000005E5 E814000000 call 5FEh + +EditBox2.c-- 65: edit_box_mouse stdcall (#edit1); +000005EA 6840050000 push 540h +000005EF FF154C030000 call dword ptr [34Ch] +000005F5 EB9F jmp short 596h + +EditBox2.c-- 69: ExitProcess(); +000005F7 E85A010000 call 756h +000005FC C9 leave +000005FD C3 ret + +EditBox2.c-- 74: WindowRedrawStatus(1); +000005FE 6A01 push 1 +00000600 E89CFAFFFF call 0A1h + +EditBox2.c-- 75: skin_width = GetSkinWidth(); +00000605 E858010000 call 762h +0000060A A384070000 mov [784h],eax + +EditBox2.c-- 76: DefineAndDrawWindow(400,200,280,200,0x04,0x00E4DFE1,0,0,0); DrawTitle("Extended EditBox in C--"); +0000060F 6890010000 push 190h +00000614 68C8000000 push 0C8h +00000619 6818010000 push 118h +0000061E 68C8000000 push 0C8h +00000623 6A04 push 4 +00000625 68E1DFE400 push 0E4DFE1h +0000062A 6A00 push 0 +0000062C 6A00 push 0 +0000062E 6A00 push 0 +00000630 E87BFAFFFF call 0B0h +00000635 B9BA060000 mov ecx,6BAh +0000063A E83B010000 call 77Ah + +EditBox2.c-- 77: Form.getme(); +0000063F 68E6090000 push 9E6h +00000644 E846FAFFFF call 8Fh + +EditBox2.c-- 79: WriteText(30,40,0x80,0,"Наипростейший пример EditBox'a на С--",0); +00000649 6A1E push 1Eh +0000064B 6A28 push 28h +0000064D 6880000000 push 80h +00000652 6A00 push 0 +00000654 68D2060000 push 6D2h +00000659 6A00 push 0 +0000065B E8CAFAFFFF call 12Ah + +EditBox2.c-- 80: WriteText(30,50,0x80,0,"Но его можно немного усложнить с целью",0); +00000660 6A1E push 1Eh +00000662 6A32 push 32h +00000664 6880000000 push 80h +00000669 6A00 push 0 +0000066B 68F8060000 push 6F8h +00000670 6A00 push 0 +00000672 E8B3FAFFFF call 12Ah + +EditBox2.c-- 81: WriteText(30,60,0x80,0,"уменьшения перерисовки.",0); +00000677 6A1E push 1Eh +00000679 6A3C push 3Ch +0000067B 6880000000 push 80h +00000680 6A00 push 0 +00000682 681F070000 push 71Fh +00000687 6A00 push 0 +00000689 E89CFAFFFF call 12Ah + +EditBox2.c-- 83: DrawFlatButton(100,105,70,22,2,0xD7D7D7,"Close"); +0000068E 6A64 push 64h +00000690 6A69 push 69h +00000692 6A46 push 46h +00000694 6A16 push 16h +00000696 6A02 push 2 +00000698 68D7D7D700 push 0D7D7D7h +0000069D 6837070000 push 737h +000006A2 E832FBFFFF call 1D9h + +EditBox2.c-- 88: edit_box_draw stdcall (#edit1); +000006A7 6840050000 push 540h +000006AC FF1544030000 call dword ptr [344h] + +EditBox2.c-- 92: WindowRedrawStatus(2); +000006B2 6A02 push 2 +000006B4 E8E8F9FFFF call 0A1h +000006B9 C3 ret + +000006BA 457874656E64656420456469 db 'Extended Edi' +000006C6 74426F7820696E20432D2D00 db 'tBox in C--',0 +000006D2 8DA0A8AFE0AEE1E2A5A9E8A8 db 'Наипростейши' +000006DE A920AFE0A8ACA5E020456469 db 'й пример Edi' +000006EA 74426F78276120ADA020912D db 'tBox'a на С-' +000006F6 2D008DAE20A5A3AE20ACAEA6 db '-',0,'Но его мож' +00000702 ADAE20ADA5ACADAEA3AE20E3 db 'но немного у' +0000070E E1ABAEA6ADA8E2EC20E120E6 db 'сложнить с ц' +0000071A A5ABECEE00E3ACA5ADECE8A5 db 'елью',0,'уменьше' +00000726 ADA8EF20AFA5E0A5E0A8E1AE db 'ния перерисо' +00000732 A2AAA82E00436C6F736500 db 'вки.',0,'Close',0 + +..\lib\kolibri.h-- 287: ECX=0; +0000073D 31C9 xor ecx,ecx + +..\lib\kolibri.h-- 288: EAX=0; +0000073F 89C8 mov eax,ecx + +..\lib\kolibri.h-- 289: ECX--; +00000741 49 dec ecx + +..\lib\kolibri.h-- 290: $REPNE $SCASB +00000742 F2AE repne scasb + +..\lib\kolibri.h-- 291: EAX=EAX-2-ECX; +00000744 83E802 sub eax,2 +00000747 29C8 sub eax,ecx +00000749 C3 ret + +..\lib\kolibri.h-- 215: EAX = 13; +0000074A 6A0D push 0Dh +0000074C 58 pop eax + +..\lib\kolibri.h-- 216: $int 0x40 +0000074D CD40 int 40h + +..\lib\kolibri.h-- 217: #codesize +0000074F C3 ret + +..\lib\kolibri.h-- 156: EAX = 10; // wait here for event +00000750 6A0A push 0Ah +00000752 58 pop eax + +..\lib\kolibri.h-- 157: $int 0x40 +00000753 CD40 int 40h +00000755 C3 ret + +..\lib\kolibri.h-- 161: EAX = -1; // close this program +00000756 83C8FF or eax,0FFFFFFFFh + +..\lib\kolibri.h-- 162: $int 0x40 +00000759 CD40 int 40h +0000075B C3 ret + +..\lib\kolibri.h-- 172: EAX = 2; // just read this key from buffer +0000075C 6A02 push 2 +0000075E 58 pop eax + +..\lib\kolibri.h-- 173: $int 0x40 +0000075F CD40 int 40h +00000761 C3 ret + +..\lib\kolibri.h-- 249: EAX = 48; +00000762 6A30 push 30h +00000764 58 pop eax + +..\lib\kolibri.h-- 250: EBX = 4; +00000765 6A04 push 4 +00000767 5B pop ebx + +..\lib\kolibri.h-- 251: $int 0x40 +00000768 CD40 int 40h +0000076A C3 ret + +..\lib\kolibri.h-- 184: EAX = 17; // Get ID +0000076B 6A11 push 11h +0000076D 58 pop eax + +..\lib\kolibri.h-- 185: $int 0x40 +0000076E CD40 int 40h + +..\lib\kolibri.h-- 186: EAX = EAX >> 8; +00000770 C1E808 shr eax,8 +00000773 C3 ret + +..\lib\kolibri.h-- 151: EAX = 8; +00000774 6A08 push 8 +00000776 58 pop eax + +..\lib\kolibri.h-- 152: $int 0x40 +00000777 CD40 int 40h +00000779 C3 ret + +..\lib\kolibri.h-- 242: EAX = 71; +0000077A 6A47 push 47h +0000077C 58 pop eax + +..\lib\kolibri.h-- 243: EBX = 1; +0000077D 31DB xor ebx,ebx +0000077F 43 inc ebx + +..\lib\kolibri.h-- 244: $int 0x40; +00000780 CD40 int 40h +00000782 C3 ret diff --git a/programs/develop/libraries/box_lib/C--/trunk/compile.bat b/programs/develop/libraries/box_lib/C--/trunk/compile.bat new file mode 100644 index 0000000000..8bf61605e2 --- /dev/null +++ b/programs/develop/libraries/box_lib/C--/trunk/compile.bat @@ -0,0 +1,5 @@ +C-- EditBox2.c-- +del EditBox2.kex +rename EditBox2 EditBox2.kex +rename EditBox2.com EditBox2.kex +pause \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/C--/trunk/use_library.h-- b/programs/develop/libraries/box_lib/C--/trunk/use_library.h-- new file mode 100644 index 0000000000..979668626a --- /dev/null +++ b/programs/develop/libraries/box_lib/C--/trunk/use_library.h-- @@ -0,0 +1,112 @@ +//BOX_LIB +dword edit_box_draw = #aEdit_box_draw; +dword edit_box_key = #aEdit_box_key; +dword edit_box_mouse = #aEdit_box_mouse; +dword version_ed = #aVersion_ed; + +//dword +//dword +//dword + +//dword +//dword +//dword + +//$edit_box_draw dword aEdit_box_draw +//$edit_box_key dword aEdit_box_key +//$edit_box_mouse dword aEdit_box_mouse +//$version_ed dword aVersion_ed + +//$check_box_draw dword aCheck_box_draw +//$check_box_mouse dword aCheck_box_mouse +//$version_ch dword aVersion_ch + +//$option_box_draw dword aOption_box_draw +//$option_box_mouse dword aOption_box_mouse +//$version_op dword aVersion_op + +dword am__ = 0x0; +dword bm__ = 0x0; + +char aEdit_box_draw[9] = "edit_box\0"; +char aEdit_box_key[13] = "edit_box_key\0"; +char aEdit_box_mouse[15] = "edit_box_mouse\0"; +char aVersion_ed[11] = "version_ed\0"; + +char aCheck_box_draw [15] = "check_box_draw\0"; +char aCheck_box_mouse [16] = "check_box_mouse\0"; +char aVersion_ch [11] = "version_ch\0"; + +char aOption_box_draw [16] = "option_box_draw\0"; +char aOption_box_mouse[17] = "option_box_mouse\0"; +char aVersion_op [11] = "version_op\0" ; + + +struct edit_box{ +dword width, left, top, color, shift_color, focus_border_color, blur_border_color, +text_color, max, text, flags, size, pos, offset, cl_curs_x, cl_curs_y, shift, shift_old; +}; + +//void Edit_box_draw(dword edit_b) +//{ + +// $ PUSH dword edit_b +// $ CALL dword [edit_box_draw] +//} + +//struct load_dll{ +// dword way_of_ini, myimport; +// void get(); +//}; + +int load_dll(EAX) +{ +//set mask + $mov eax,40 + $mov ebx,0x27 + $int 0x40 +// load DLL + $mov eax, 68 + $mov ebx, 19 + ECX=#way_of_ini; + $int 0x40 + $test eax, eax + $jz exit + +// initialize import + $mov edx,eax + ESI=#edit_box_draw; +import_loop: + $lodsd + $test eax,eax + $jz import_done + $push edx +import_find: + $mov ebx,DSDWORD[EDX] + $test ebx, ebx + $jz exit + $push eax +nex1: + $mov cl,DSBYTE[EAX]; + $cmp cl,DSBYTE[EBX]; + $jnz import_find_next + $test cl,cl + $jz import_found + $inc eax + $inc ebx + $jmp nex1 +import_find_next: + $pop eax + $add edx, 8 + $jmp import_find +import_found: + $pop eax + $mov eax,DSDWORD[edx+4] + $mov DSDWORD[esi-4],eax + $pop edx + $jmp import_loop +import_done: + return 0; +exit: + return -1; +} \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/C--/trunk/warning.txt b/programs/develop/libraries/box_lib/C--/trunk/warning.txt new file mode 100644 index 0000000000..535f44a426 --- /dev/null +++ b/programs/develop/libraries/box_lib/C--/trunk/warning.txt @@ -0,0 +1,50 @@ +..\lib\kolibri.h--(43)> Warning! ECX has been used by compiler. +..\lib\kolibri.h--(63)> Warning! ESI has been used by compiler. +..\lib\kolibri.h--(64)> Warning! Register ESI already initialized. +..\lib\kolibri.h--(72)> Warning! ESI has been used by compiler. +..\lib\kolibri.h--(73)> Warning! Register ESI already initialized. +..\lib\kolibri.h--(126)> Warning! EBX has been used by compiler. +..\lib\kolibri.h--(435)> Warning! Expansion variable. +..\lib\kolibri.h--(435)> Warning! ECX has been used by compiler. +..\lib\kolibri.h--(444)> Warning! Register EBX same as EDI. +..\lib\kolibri.h--(439)> Warning! Local variable 'i' possible not used. +..\lib\kolibri.h--(439)> Warning! Local variable 'r' possible not used. +..\lib\kolibri.h--(439)> Warning! Local variable 'g' possible not used. +..\lib\kolibri.h--(439)> Warning! Local variable 'b' possible not used. +EditBox2.c--(42)> Warning! Missing parameter in function . +EditBox2.c--(52)> Warning! Register AL already initialized. +EditBox2.c--(52)> Warning! Register AL already initialized. +EditBox2.c--(55)> Warning! Short operator 'CASE' may be used. +EditBox2.c--(60)> Warning! Short operator 'CASE' may be used. +EditBox2.c--(47)> Warning! Short operator 'SWITCH' may be used. +EditBox2.c--(53)> Warning! Short operator 'BREAK' may be used. +EditBox2.c--(58)> Warning! Short operator 'BREAK' may be used. +..\lib\kolibri.h--(288)> Warning! Register EAX same as ECX. +..\lib\kolibri.h--(4)> Warning! Variable 'os_name' possible not used. +..\lib\kolibri.h--(5)> Warning! Variable 'os_version' possible not used. +..\lib\kolibri.h--(6)> Warning! Variable 'start_addr' possible not used. +..\lib\kolibri.h--(9)> Warning! Variable 'x86esp_reg' possible not used. +use_library.h--(5)> Warning! Variable 'version_ed' possible not used. +..\lib\kolibri.h--(464)> Warning! Variable 'pos' possible not used. +..\lib\kolibri.h--(464)> Warning! Variable 'razr' possible not used. +..\lib\kolibri.h--(7)> Warning! Variable 'final_addr' possible not used. +..\lib\kolibri.h--(464)> Warning! Variable 'j' possible not used. +..\lib\kolibri.h--(8)> Warning! Variable 'alloc_mem' possible not used. +..\lib\kolibri.h--(451)> Warning! Function 'copystr' possible not used. +..\lib\kolibri.h--(464)> Warning! Variable 'backup' possible not used. +..\lib\kolibri.h--(464)> Warning! Variable 'chislo' possible not used. +..\lib\kolibri.h--(465)> Warning! Variable 'buffer' possible not used. +use_library.h--(29)> Warning! Variable 'bm__' possible not used. +use_library.h--(28)> Warning! Variable 'am__' possible not used. +use_library.h--(42)> Warning! Variable 'aVersion_op' possible not used. +use_library.h--(38)> Warning! Variable 'aVersion_ch' possible not used. +use_library.h--(40)> Warning! Variable 'aOption_box_draw' possible not used. +use_library.h--(41)> Warning! Variable 'aOption_box_mouse' possible not used. +use_library.h--(36)> Warning! Variable 'aCheck_box_draw' possible not used. +use_library.h--(37)> Warning! Variable 'aCheck_box_mouse' possible not used. +..\lib\kolibri.h--(10)> Warning! Variable 'I_Param' possible not used. +..\lib\kolibri.h--(439)> Warning! Function 'PutImage' possible not used. +EditBox2.c--(13)> Warning! Variable 'NULL' possible not used. +..\lib\kolibri.h--(11)> Warning! Variable 'I_Icon' possible not used. +..\lib\kolibri.h--(510)> Warning! Structure 'CopyFile_f' possible not used. +..\lib\kolibri.h--(511)> Warning! Structure 'CopyFile_atr' possible not used. diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/trunk/box_lib.asm new file mode 100644 index 0000000000..dddbb69fa1 --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/box_lib.asm @@ -0,0 +1,67 @@ +;Libray from Editbox +; SEE YOU File FAQ.txt and HISTORY. Good Like! +;Last Change 13/02/2009 +;;;;;;;;;;;;;;;;;; + +format MS COFF + +public EXPORTS + +section '.flat' code readable align 16 +include 'macros.inc' +include 'editbox.mac' ;макрос который должен облегчить жизнь :) специально для editbox +include 'checkbox.mac' ;макрос содержит реализацию checkbox +include 'optionbox.mac' ;макрос содержит реализацию optionbox +;---------------------------------------------------- +;EditBox +;---------------------------------------------------- + +use_editbox_draw ;макрос расскрывает функцию отображения бокса. +use_editbox_key ;макрос расскрывает функцию обработки клавишь. +use_editbox_mouse ;макрос расскрывает функцию обработки мыши. + +;---------------------------------------------------- +;CheckBox +;---------------------------------------------------- +use_checkbox_draw ;макрос расскрывает функцию отображения бокса. +use_checkbox_mouse ;макрос расскрывает функцию обработки мыши. + + +;-------------------------------------------------- +;radiobutton Group +;-------------------------------------------------- +use_optionbox_driver ;макросы которые управляют работой бокса ) +use_optionbox_draw ;макрос расскрывает функцию отображения бокса. +use_optionbox_mouse ;макрос расскрывает функцию обработки мыши. + +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 diff --git a/programs/develop/libraries/box_lib/trunk/checkbox.mac b/programs/develop/libraries/box_lib/trunk/checkbox.mac new file mode 100644 index 0000000000..cde35b453b --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/checkbox.mac @@ -0,0 +1,148 @@ +;Їрщы ёючфрэ 13.02.2009 ═р ъюф яЁшьхэхэр GPL2 ышЎхэчш  +;╠ръЁюё фы  ёшёЄхьэющ сшсышюЄхъш box_lib.obj +;Checkbox + +macro use_checkbox_draw +{ +check_box_draw: +;ch_struc_size=24 +ch_left equ [edi] ;ъююЁфшэрЄр эрўрыр Ёшёютрэш  яю ї +ch_top equ [edi+2] ;ъююЁфшэрЄр эрўрыр Ёшёютрэш  яю є +ch_text_margin equ [edi+4] ;=4 ЁрёёЄю эшх юЄ яЁ ьюєуюы№эшър ўхъ сюъёр фю эрфяшёш +ch_size equ [edi+8] ;12 ЁрчьхЁ ътрфЁрЄр ўхъ сюъёр +ch_color equ [edi+12] +ch_border_color equ [edi+16] ; or [edi+4] ;ЎтхЄ Ёрьъш checkbox хх ьюцэю чрфрЄ№ ёрьюёЄю Єхы№эю +ch_text_color equ [edi+20];[edi+4] ;ЎтхЄ ЄхъёЄр +ch_text_ptr equ [edi+24] ;єърчрЄхы№ эр эрўрыю ЄхъёЄютющ ёЄЁюъш +ch_text_length equ [edi+28] +ch_flags equ [edi+32] ;Їыруш + + pusha ;ёюїЁрэшь тёх ЁхушёЄЁ√ + mov edi,dword [esp+36] + mov eax,13 + movzx ebx,word ch_left + shl ebx,16 + add ebx,ch_size + mov ecx,ch_top + shl ecx,16 + add ecx,dword ch_size + mov edx,dword ch_border_color + mcall ;Ёшёєхь Ёрьъє + + mov edx,dword ch_color + add ebx,1 shl 16 - 2 + add ecx,1 shl 16 - 2 + mcall ;чръЁр°штрхь тэєЄЁхээюёЄш ўхъсюъёр + + test dword ch_flags,2 ;фюёЄрЄ№ чэрўхэшх сшЄр шч яхЁхьхээющ ш яюьхёЄшЄ№ т Їыру CF + jz @f ;т хёыш CF=1, Єю т√яюыэшь ёыхфє■∙є■ яЁюЎхфєЁє шэрўх яхЁхщЄш эр эшцэ■■ @@ + call check_box_draw_ch ;эрЁшёютрЄ№ тъы■ўхээ√щ ўхъ сюъё +@@: +;---------------------------- +;ЁрёўхЄ ъєфр сєфхЄ яЁюшчтхфхэ т√тюф ЄхъёЄр +;---------------------------- + movzx ebx,word ch_left ;чруЁєчшЄ№ чэрўхэшх ї фы  ўхъ сюъёр + add ebx,dword ch_size + add ebx,dword ch_text_margin;фюсртшЄ№ ЁрчьхЁ ёЄюЁюэ√ ш ЁрёёЄю эшх эр ъюЄюЁюь эрўэхЄё  т√тюф ЄхъёЄр + shl ebx,16 ;ёфтшэхь эр 16 ЁрчЁ фют т ыхтю (єьэюцшь эр 65536) + mov bx,word ch_top ;чруЁєчшь чэрўхэшх яю y + add ebx,ch_size + mov ecx,dword ch_text_color ;чруЁєчшь ЎтхЄ эрфяшёш + flags + sub ebx,7 ;фюсртшь чэрўхэшх фышэ√ ёЄюЁюэ√ -9+2 + + mov edx,dword ch_text_ptr ;єърцхь рфЁхё юЄ ъєфр эєцэю т√тюфшЄ№ ёЄЁюъє + mov esi,dword ch_text_length + ;тэхёхь т eax чэрўхэшх т√тюфр эрфяшёш эр ърэтє + mov eax,4 + mcall ;┬√тюф +popa ;тюёёЄрэютшЄ№ чэрўхэш  ЁхушёЄЁют шч ёЄхър +ret 4 ;т√щфхь шч яЁюЎхфєЁ√ + +check_box_clear_ch: ;юўшёЄър ўхъ сюъёр + mov edx,dword ch_color ;ЎтхЄ тэєЄЁш ўхъ сюъёр + jmp @f ;схчєёыютэ√щ яЁ√цюъ эр эшцэ■■ ьхЄъє @@ +check_box_draw_ch: ;эрЁшёютрЄ№ тъы■ўхээ√щ ўхъ сюъё + mov edx,dword ch_border_color ;чруЁєчшЄ№ ЎтхЄ +@@: + movzx ebx,word ch_left ;чруЁєчшЄ№ ъююЁфшэрЄє яю ї + mov eax,dword ch_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 ch_top ;чруЁєчшЄ№ ъююЁфшэрЄє яю є + mov eax,dword ch_size + shr eax,2 + add ecx,eax ;фюсртшЄ№ (ёЄюЁюэр яЁ ьюєуюы№эшър/4) + shl ecx,16 ;ёфтшэхь эр 16 ЁрчЁ фют т ыхтю (єьэюцшь эр 65536) + mov cx,bp ;чруЁєчшь чэрўхэш  ЁхушёЄЁр єърчрЄхы  срч√ т cx + mov eax,13 ;т eax - чэрўхэш  ЇєэъЎшш фы  т√тюфр яюыюё√ Є.х. яю ёєЄш яЁ ьюєуюы№эшър, ъюЄюЁ√щ юЄюсЁрцрхЄ тъы■ўхээ√щ ъюьяюэхэЄ ўхъ сюъё + mcall ;т√тюф +ret ;т√щЄш шч яЁюЎхфєЁ√ +} + + +macro use_checkbox_mouse +{ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;╬сЁрсюЄўшъ mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +check_box_mouse: ;юсЁрсюЄър ь√°ш +pusha + mov edi,dword [esp+36] + mov eax,37 ;сєфхь ўЄю Єю фхырЄ№ хёыш є эрё ўЄю - эшЄ№ эрцрЄю + mov ebx,2 ;тэхёЄш т ЁхушёЄЁ чэрўхэшх 2 + mcall ;яЁютхЁър эх эрцры ыш яюы№чютрЄхы№ ъэюяъє ь√°ъш + test eax,eax ;яЁютхЁър хёыш є эрё т eax=0, Єю єёЄрэютшь Їыру ш т√щфхь + jnz @f ;яхЁхщЄш эр эшцэ■■ ьхЄъє @@ + btr dword ch_flags,2 ;шчтыхўхэшх чэрўхэш  чрфрээюую сшЄр т Їыру cf ш шчьхэхэшх хую чэрўхэш  эр эєыхтюх. + jmp check_box_mouse_end + +@@: + bts dword ch_flags,2 ;яЁютхЁър Їырур Є.х. яхЁхэюё т cf чэрўхэшх сшЄр ш єёЄрэютър сшЄр т ёюёЄю эшх тъы■ўхэю + jc check_box_mouse_end ;хёыш CF=1 Єю яхЁхщЄш т ъюэхЎ Є.х. ¤Єю т√їюф + mov esi,dword ch_text_length ;чруЁєчшЄ№ ъюы-тю ёшьтюыют т ЄхъёЄютющ ёЄЁюъх + ;╙ьэюцхэшх эр 6 ┴√ёЄЁюх єьэюцхэшх ьюцэю тюёяюы№чютрЄ№ё  ы■с√ь ьч ьхЄюфют, эю эр ёЄрЁ√ї ╧ЁюЎхёёюЁрї (386,486,P1)с√ёЄЁхх сєфхЄ ё шэёЄЁєъЎшхщ Lea + ;lea esi,[eax*2+eax] + ;shl eax,1 + imul esi,6 ; шыш ьюцэю ш Єръ єьэюцшЄ№ эр 6 + add esi,dword ch_text_margin ;фюсртшЄ№ 3 - ЁрёёЄю эшх юЄ ўхъ сюъёр фю эрфяшёш + + mov eax,37 ;яюыєўшь ъююЁфшэрЄ√ ь√°ъш + mov ebx,1 ;фюсртшЄ№ 1 + mcall ;яюыєўшЄ№ ъююЁфшэрЄ√ ъєЁёюЁр юЄэюёшЄхы№эю юъэр + + movzx ebx,word ch_top ;чруЁєчшЄ№ т bx чэрўхэшх ъююЁфшэрЄ√ є + cmp ax,bx ;ёЁртэшЄ№ ё ё ъююЁфшэрЄющ ъєЁёюЁр + jl check_box_mouse_end ;SF <> 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 ;т√щЄш +} \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/config.inc b/programs/develop/libraries/box_lib/trunk/config.inc new file mode 100644 index 0000000000..dc70bf9760 --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/config.inc @@ -0,0 +1 @@ +__CPU_type fix p5 diff --git a/programs/develop/libraries/box_lib/trunk/editbox.mac b/programs/develop/libraries/box_lib/trunk/editbox.mac new file mode 100644 index 0000000000..774cb778a7 --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/editbox.mac @@ -0,0 +1,1397 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Basic macros for use editbox ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +macro use_editbox_draw +{ +edit_box: +ed_width equ [edi] ;ширина компонента +ed_left equ [edi+4] ;положение по оси х +ed_top equ [edi+8] ;положение по оси у +ed_color equ [edi+12] ;цвет фона компонента +shift_color equ [edi+16] ;=0x6a9480 для примера возьем желеный цвет бокса +ed_focus_border_color equ [edi+20] ;цвет рамки компонента +ed_blur_border_color equ [edi+24] ;цвет не активного компонента +ed_text_color equ [edi+28] ;цвет текста +ed_max equ [edi+32] ;кол-во символов которые можно максимально ввести +ed_text equ [edi+36] ;указатель на буфер +ed_flags equ [edi+40] ;флаги +ed_size equ [edi+44] ;кол-во символов +ed_pos equ [edi+48] ;позиция курсора +ed_offset equ [edi+52] ;смещение +cl_curs_x equ [edi+56] ;предыдущее координата курсора по х +cl_curs_y equ [edi+60] ;предыдущее координата курсора по у +ed_shift_pos equ [edi+64] ;положение курсора +ed_shift_pos_old equ [edi+68] ;старое положение курсора + +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 ; высота + + +.draw: + pushad +;--- рисуем рамку --- + mov edi,dword [esp+36] + call .draw_border ; Функция стабильна +.draw_bg_cursor_text: +;--- изменяем смещение, если надо --- + call .check_offset ;вычисление позиции курсора стабильна +;--- рисуем внутреннюю область --- + call .draw_bg ;нарисовать прямоугольник рабочей области +;---- рисуем выделение, по shift если есть + call .draw_shift +.draw_cursor_text: +;--- рисуем курсор --- + ;--- может его не надо рисовать ---- + test word ed_flags,ed_focus + je @f + call .draw_cursor +@@: + call .draw_text +; ret +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Общий выход из editbox для всех функций и пост обработчиков;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.editbox_exit: + popad + ret 4 +} + + +macro use_editbox_key +{ +;========================================================== +;=== обработка клавиатуры ================================= +;========================================================== +edit_box_key: +pushad + mov edi,dword [esp+36] + test word ed_flags,ed_focus ; если не в фокусе, выходим + je edit_box.editbox_exit + test word ed_flags,ed_mouse_on + jne edit_box.editbox_exit + +;Проверка нажат shift ? + call edit_box_key.check_shift +;---------------------------------------------------------- +;--- проверяем, что нажато -------------------------------- +;---------------------------------------------------------- +use_key_process backspase,delete,left,right,home,end,insert +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll +;--- нажата другая клавиша --- +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_figures_only +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;проверка на shift был ли нажат +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +are_key_shift_press +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; проверяем, находится ли курсор в конце + дальнейшая обработка +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +are_key_cur_end +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработка клавиш insert,delete.backspase,home,end,left,right +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_work_key +} + +macro use_editbox_mouse +{ +;========================================================== +;=== обработка мыши ======================================= +;========================================================== +;save for stdcall ebx,esi,edi,ebp +edit_box_mouse: +pushad + mov edi,dword [esp+36] +;debug +;---------------------------------------------------------- +;--- получаем состояние кнопок мыши ----------------------- +;---------------------------------------------------------- + mcall 37,2 +;---------------------------------------------------------- +;--- проверяем состояние ---------------------------------- +;---------------------------------------------------------- + test eax,1 + jnz edit_box_mouse.mouse_left_button + and word ed_flags,ed_mouse_on_off + xor ebx,ebx + mov dword [mouse_flag],ebx + jmp edit_box.editbox_exit +.mouse_left_button: +;---------------------------------------------------------- +;--- блокировка от фокусировки в других боксах при попадании на них курсора +;---------------------------------------------------------- + mov eax,dword [mouse_flag] + test eax,eax + jz @f + cmp eax,edi + je @f + jmp edit_box_mouse._blur +;---------------------------------------------------------- +;--- получаем координаты мыши относительно 0 т.е всей области экрана +;---------------------------------------------------------- +@@: mcall 37,1 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функция обработки мышки получение координат и проверка их + выделения +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_work_mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Общие функции обработки +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_general_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с key +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_mouse_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +} + + + + + + + + + + + + + + + + + + + + + + + +;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;ниже расположены функции которыми реализуется весь алгоритм +;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;Макрос для вывода основных функций которые испльзуются боксом +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: +pushad + 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,enter,tab,numl,capsl,scrolll +{ +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 +if enter eq +else + cmp ah,13 ;ENTER - клавиша )) + jz edit_box.editbox_exit +end if +if tab eq +else + cmp ah,9 ;TAB - клавиша )) + jz edit_box.editbox_exit +end if + +if numl eq +else + cmp ah,4 ;Num Lock - клавиша )) + jz edit_box.editbox_exit +end if + +if capsl eq +else + cmp ah,2 ;Caps Lock - клавиша )) + jz edit_box.editbox_exit +end if + +if scrolll eq +else + cmp ah,1 ;Scroll Lock - клавиша )) + 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 +;;;;;;;;;;;;;;;;;; + test ax,0x8000 + jnz edit_box_mouse.mleft + + mov ebx,ed_left + 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 +;---------------------------------------------------------- +;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? +;---------------------------------------------------------- +{ + test word ed_flags,ed_mouse_on + jne edit_box_mouse.mouse_wigwag +;---------------------------------------------------------- +;--- проверяем, попадает ли курсор в edit box ------------- +;---------------------------------------------------------- + mov ebx,ed_top + 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,ed_left + 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: + xor edx,edx + sub eax,ed_left + + 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 +{ +popad +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/libraries/box_lib/trunk/editbox_ex.asm b/programs/develop/libraries/box_lib/trunk/editbox_ex.asm new file mode 100644 index 0000000000..13ffc4394a --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/editbox_ex.asm @@ -0,0 +1,245 @@ +;заголовок приложения +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 + call [edit_box_mouse] + + push dword edit2 + 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/libraries/box_lib/trunk/editbox_ex.kex b/programs/develop/libraries/box_lib/trunk/editbox_ex.kex new file mode 100644 index 0000000000000000000000000000000000000000..4aa38c87be2f1efca392afe3734a54ec918c3eae GIT binary patch literal 1504 zcmd^8OK1~O6unJr39%ZaWT6Wgtk5bnKZT+c329miR#U9Sp#?*lj3(31l+099SAir- z?WPNt;!cF9MQ~#*q@jYgXoON+m4XEq%HYDf5lo5a&E#tXb?<}o-o0neJNLesd6#-G z5BFZRI~s`SB;YXthjkz&PczXno6^)oNY>`Zkp@MkErWn2QRk6_-hPW(ZuIm{mRdNWw>AQgx(v7 z3YJeW4Yf9w!??z7GxkX(9KulwmhX%WltXnl;DlO(yCj z{3p}`;Elyf-90=&gg=p3!zSvkt4Tp)E^fGv)8ktcC@K^R6nh|PPvEJoXYrhU2jkTb#>kTbw}~?e* '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/libraries/box_lib/trunk/optionbox.mac b/programs/develop/libraries/box_lib/trunk/optionbox.mac new file mode 100644 index 0000000000..fd12336d0b --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/optionbox.mac @@ -0,0 +1,201 @@ +;Їрщы ёючфрэ 13.02.2009 ═р ъюф яЁшьхэхэр GPL2 ышЎхэчш  +;╠ръЁюё фы  ёшёЄхьэющ сшсышюЄхъш box_lib.obj +;Optionbox + +macro use_optionbox_driver ;ьръЁюё√ ъюЄюЁ√х єяЁрты ■Є ЁрсюЄющ сюъёр ) +{ +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 + +} +macro use_optionbox_draw +{ +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 ;т√щЄш шч яЁюЎхфєЁ√ + +} + + +macro use_optionbox_mouse +{ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;╬сЁрсюЄўшъ 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 ;т√щЄш + +} \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/proc32.inc b/programs/develop/libraries/box_lib/trunk/proc32.inc new file mode 100644 index 0000000000..aa3ffc9702 --- /dev/null +++ b/programs/develop/libraries/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/libraries/box_lib/trunk/readme.txt b/programs/develop/libraries/box_lib/trunk/readme.txt new file mode 100644 index 0000000000..e72dee135d --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/readme.txt @@ -0,0 +1,14 @@ + ╥хяыют └ыхъёхщ, ╫хы сшэёъ. +╧ЁшьхЁ яЁюёЄюую шёяы№чютрэш  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 эр яєЄ№ ъ сшсышюЄхъх +. ╧ЁшьхЁ ёрь т√ўшёы хЄ яєЄ№ ъ сшсышюЄхъх, эх чртшёшью юЄ ётюхую ьхёЄюЁрёяюыюцхэш  +13.09.2009 - юсЁрсюЄър ъыртш°№ NUM, Caps,Scroll Lock. ╧Ёш эрцрЄшш эр эшї, эх яЁюшёїюфшЄ юЄюсЁрцхэшх ёшьтюыр. +24.09.2007 - ёфхыры яюффЁхцъє checkbox. ─юсртшы ю°шсъш, яЁюуЁрььр уы■ўшЄ юўхэ№ ёхЁ№хчэю :( \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/run.bat b/programs/develop/libraries/box_lib/trunk/run.bat new file mode 100644 index 0000000000..a15e0eaed5 --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/run.bat @@ -0,0 +1,4 @@ +@fasm.exe -m 16384 box_lib.asm +@fasm.exe -m 16384 editbox_ex.asm editbox_ex.kex +REM ..\FASM\kpack.exe editbox_ex +@klbrinwin.exe editbox_ex.kex \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/struct.inc b/programs/develop/libraries/box_lib/trunk/struct.inc new file mode 100644 index 0000000000..947a84e89a --- /dev/null +++ b/programs/develop/libraries/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 \} }