From 3e4779ce2094b136d99fd18d781fa95a17381e57 Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Wed, 25 Jun 2008 12:01:00 +0000 Subject: [PATCH] add files :) git-svn-id: svn://kolibrios.org@806 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/box_lib/C--/lib/RANDOM.H-- | 52 + programs/develop/box_lib/C--/lib/kolibri.h-- | 558 ++++++++ programs/develop/box_lib/C--/lib/load_bmp.h-- | 67 + programs/develop/box_lib/C--/lib/memory.h-- | 36 + .../develop/box_lib/C--/trunk/EditBox2.c-- | 96 ++ .../develop/box_lib/C--/trunk/EditBox2.kex | Bin 0 -> 1927 bytes .../develop/box_lib/C--/trunk/compile.bat | 5 + .../develop/box_lib/C--/trunk/use_library.h-- | 112 ++ programs/develop/box_lib/trunk/box_lib.asm | 551 ++++++++ programs/develop/box_lib/trunk/box_lib.obj | Bin 0 -> 1978 bytes programs/develop/box_lib/trunk/config.inc | 1 + programs/develop/box_lib/trunk/editbox.mac | 1174 +++++++++++++++++ programs/develop/box_lib/trunk/editbox_ex.asm | 249 ++++ programs/develop/box_lib/trunk/editbox_ex.kex | Bin 0 -> 623 bytes programs/develop/box_lib/trunk/editbox_ex.mac | 77 ++ programs/develop/box_lib/trunk/macros.inc | 502 +++++++ programs/develop/box_lib/trunk/proc32.inc | 270 ++++ programs/develop/box_lib/trunk/readme.txt | 13 + programs/develop/box_lib/trunk/run.bat | 4 + programs/develop/box_lib/trunk/struct.inc | 180 +++ 20 files changed, 3947 insertions(+) create mode 100644 programs/develop/box_lib/C--/lib/RANDOM.H-- create mode 100644 programs/develop/box_lib/C--/lib/kolibri.h-- create mode 100644 programs/develop/box_lib/C--/lib/load_bmp.h-- create mode 100644 programs/develop/box_lib/C--/lib/memory.h-- create mode 100644 programs/develop/box_lib/C--/trunk/EditBox2.c-- create mode 100644 programs/develop/box_lib/C--/trunk/EditBox2.kex create mode 100644 programs/develop/box_lib/C--/trunk/compile.bat create mode 100644 programs/develop/box_lib/C--/trunk/use_library.h-- create mode 100644 programs/develop/box_lib/trunk/box_lib.asm create mode 100644 programs/develop/box_lib/trunk/box_lib.obj create mode 100644 programs/develop/box_lib/trunk/config.inc create mode 100644 programs/develop/box_lib/trunk/editbox.mac create mode 100644 programs/develop/box_lib/trunk/editbox_ex.asm create mode 100644 programs/develop/box_lib/trunk/editbox_ex.kex create mode 100644 programs/develop/box_lib/trunk/editbox_ex.mac create mode 100644 programs/develop/box_lib/trunk/macros.inc create mode 100644 programs/develop/box_lib/trunk/proc32.inc create mode 100644 programs/develop/box_lib/trunk/readme.txt create mode 100644 programs/develop/box_lib/trunk/run.bat create mode 100644 programs/develop/box_lib/trunk/struct.inc diff --git a/programs/develop/box_lib/C--/lib/RANDOM.H-- b/programs/develop/box_lib/C--/lib/RANDOM.H-- new file mode 100644 index 0000000000..11b60c117f --- /dev/null +++ b/programs/develop/box_lib/C--/lib/RANDOM.H-- @@ -0,0 +1,52 @@ +/******************************************************************************* + + MenuetOS MineSweeper + Copyright (C) 2003 Ivan Poddubny + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*******************************************************************************/ + +dword generator; // random number generator - фы  ухэхЁрЎшш ёыєўрщэ√ї ўшёхы + +:int random(int max) +// get pseudo-random number - яюыєўшЄ№ яёхтфюёыєўрщэюх ўшёыю +{ + $rdtsc // eax & edx + $xor eax,edx + $not eax + + EBX = generator; + $ror ebx,3 + $xor ebx,0xdeadbeef + EBX += EAX; + generator = EBX; + + EAX += EBX; + EAX = EAX % max; + return EAX; +} + +:randomize() +// initialize random number generator - шэшЎшрышчшЁютрЄ№ ухэхЁрЄюЁ ёыєўрщэ√ї ўшёхы +{ + asm + { + mov eax,3 + int 0x40 + ror eax,16 + } + generator = EAX; +} \ No newline at end of file diff --git a/programs/develop/box_lib/C--/lib/kolibri.h-- b/programs/develop/box_lib/C--/lib/kolibri.h-- new file mode 100644 index 0000000000..30900b9146 --- /dev/null +++ b/programs/develop/box_lib/C--/lib/kolibri.h-- @@ -0,0 +1,558 @@ +#startaddress 0 +#code32 TRUE + +char os_name[8] = {'M','E','N','U','E','T','0','1'}; +dword os_version = 0x00000001; +dword start_addr = #main; +dword final_addr = #stop+32; +dword alloc_mem = #stop+0x100; +dword x86esp_reg = #stop+0x100; +dword I_Param = 0x0; +dword I_Icon = 0x0; +dword skin_width; + +//Events +#define evMouse 6 +#define evButton 3 +#define evKey 2 +#define evReDraw 1 +#define evNet 8 + +//Button options +#define BT_DEL 0x80000000 +#define BT_HIDE 0x40000000 +#define BT_NOFRAME 0x20000000 + +#define OLD -1 +#define true 1 +#define false 0 + +struct FileInfo{ + dword read, firstBlock, qnBlockRead, retPtr, Work; + byte filedir; +}; +//------------------------------------------------------------------------- +struct system_colors{ + dword frame,grab,grab_button,grab_button_text,grab_text,work,work_button,work_button_text,work_text,work_graph; + void get(); +}; +void system_colors::get() +{ + EAX = 48; + EBX = 3; + ECX = #frame; + EDX = 40; + $int 0x40 +} + + +int vert; +struct mouse{ + dword x,y,lkm,pkm; + void get(); +}; + +void mouse::get() +{ + EAX = 37; + EBX = 1; + $int 0x40 + $mov ebx, eax + $shr eax, 16 + $and ebx,0x0000FFFF + x = EAX; + y = EBX; + EAX = 37; + EBX = 2; + $int 0x40 + $mov ebx, eax + $and eax, 0x00000001 + $shr ebx, 1 + $and ebx, 0x00000001 + lkm = EAX; + pkm = EBX; + EAX = 37; //колёсико + EBX = 7; + $int 0x40 + $mov ebx, eax + $shr eax, 16 + $and ebx,0x0000FFFF + //hor = EAX; + vert = EBX; +} + + +//--------------------------------------------------------------------------- +struct f70{ + dword func; + dword param1; + dword param2; + dword param3; + dword param4; + char rezerv; + dword name; +}; +//--------------------------------------------------------------------------- +struct BDVK{ + dword attr; + byte type_name; + byte rez1, rez2, rez3; + dword timecreate; + dword datecreate; + dword timelastaccess; + dword datelastaccess; + dword timelastedit; + dword datelastedit; + dword sizelo; + dword sizehi; + char name[518]; +}; +//--------------------------------------------------------------------------- +struct proc_info{ + dword use_cpu; + word pos_in_stack,num_slot,rezerv1; + char name[11]; + char rezerv2; + dword adress,use_memory,ID,left,top,width,height; + word status_slot,rezerv3; + dword work_left,work_top,work_width,work_height; + char status_window; + void getme(); +}; + +void proc_info::getme() +{ + EAX = 9; + EBX = #use_cpu; + ECX = -1; + $int 0x40 +} +//------------------------------------------------------------------------------- + +/* + Отрисовка окна + {x_start|y_start}, {x_size|y_size}, color_back, color_title, color_frames + + DrawWindow( + EBX = [x_start][x_size] + ECX = [y_start][y_size] + EDX, ESI, EDI = [00RRGGBB] + ) +*/ + +inline fastcall void DrawWindow(dword EBX, ECX, EDX, ESI, EDI){ +#speed + EAX = 0; // function 0 : define and draw window + $int 0x40 +#codesize +} + +inline fastcall void DrawButton(dword EBX, ECX, EDX, ESI){ + EAX = 8; + $int 0x40 +} + +inline fastcall dword WaitEvent(){ + EAX = 10; // wait here for event + $int 0x40 +} + +inline fastcall void ExitProcess(){ + EAX = -1; // close this program + $int 0x40 +} + +/* +02 = GET KEY + + ret: al 0 successful -> ah = key + al 1 no key in buffer +*/ +inline fastcall word GetKey(){ + EAX = 2; // just read this key from buffer + $int 0x40 +// EAX = EAX >> 8; +} + +/* +17 = GET PRESSED BUTTON ID + + ret: al 0 successful -> ah = id number + al 1 no key in buffer +*/ +inline fastcall word GetButtonID(){ + EAX = 17; // Get ID + $int 0x40 + EAX = EAX >> 8; +} + +/* +04 = WRITE TEXT TO WINDOW + + ebx [x start]*65536 + [y start] + ecx text color 0x00RRGGBB + edx pointer to text beginning + esi text length + ret: nothing changed +*/ +inline fastcall void WriteTextXY(dword EBX, ECX, EDX, ESI){ +#speed + EAX = 4; + $int 0x40; +#codesize +} + +/* +13 = DRAW BAR + + ebx [x start]*65536 + [x size] + ecx [y start]*65536 + [y size] + edx color 0x00RRGGBB + ret: nothing changed +*/ +inline fastcall void kos_DrawBar(dword EBX, ECX, EDX){ +#speed + EAX = 13; + $int 0x40 +#codesize +} + +/* function EBX=5 (GetBackgroun) ECX[]->EDX[], length ESI +inline fastcall void GetBackground(dword ECX, EDX, ESI){ +#speed + EAX = 39; + EBX = 5; + $int 0x40 +#codesize +}*/ + +//CODED by Veliant +/*eax = 38 - эюьхЁ ЇєэъЎшш +ebx = [ъююЁфшэрЄр эрўрыр яю юёш x]*65536 + [ъююЁфшэрЄр ъюэЎр яю юёш x] +ecx = [ъююЁфшэрЄр эрўрыр яю юёш y]*65536 + [ъююЁфшэрЄр ъюэЎр яю юёш y] +edx = 0x00RRGGBB - ЎтхЄ +edx = 0x01xxxxxx - ЁшёютрЄ№ шэтхЁёэvщ юЄЁхчюъ (ьырф°шх 24 сшЄр шуэюЁшЁє│Єё ) */ +inline fastcall void DrawLine(dword EBX, ECX, EDX){ + EAX = 38; + $int 0x40 +} + +inline fastcall void DrawTitle(dword ECX) +{ + EAX = 71; + EBX = 1; + $int 0x40; +} + +inline fastcall dword GetSkinWidth() +{ + EAX = 48; + EBX = 4; + $int 0x40 +} + +inline fastcall void ChangeSkin(){ + EAX = 48; + EBX = 8; + ECX = #file_path; + $int 0x40 +} + +inline fastcall dword GetScreenWidth() +{ + EAX = 14; + EBX = 4; + $int 0x40 + $shr eax, 16 + $and eax,0x0000FFFF +} + +inline fastcall void DeleteButton(dword EDX) +{ + EAX = 8; + EDX = EDX + BT_DEL; + $int 0x40; +} + +inline fastcall dword LoadLibrary(dword ECX) +{ + $mov eax, 68 + $mov ebx, 19 + $int 0x40 +} + +inline fastcall dword strlen(dword EDI) +{ +#speed + ECX=0; + EAX=0; + ECX--; + $REPNE $SCASB + EAX=EAX-2-ECX; +#codesize +} + +//-1 - не равны +// 0 - не равны +inline fastcall dword strcmp(dword ESI,EDI) +{ + dword strcmp_i,ret=-1,len1,len2,sovpadenij=0,str1,str2; + str1=ESI; + str2=EDI; + len1=strlen(str1); + len2=strlen(str2); + IF (len1==len2) + { + FOR (strcmp_i=0;strcmp_i=97) && (EDX<=122) ESBYTE[str+i] = DL - 32; //a-z + IF (EDX>=160) && (EDX<=175) ESBYTE[str+i] = DL - 32; //р-я + IF (EDX>=224) && (EDX<=239) ESBYTE[str+i] = DL - 80; //Ё-  + IF (EDX == 241) ESBYTE[EAX] = 240; //┐ + } + EAX = str; + //EAX = ESDWORD[EAX]; + //if (EAX != 0x5249443C) $int 3; +} + +inline fastcall dword lowcase(dword ESI) +{ + dword str=ESI, i; + FOR (i=0;i=65) && (EDX<=90) ESBYTE[str+i] = DL + 32; //a-z + IF (EDX>=128) && (EDX<=143) ESBYTE[str+i] = DL + 32; //р-я + IF (EDX>=144) && (EDX<=159) ESBYTE[str+i] = DL + 80; //Ё-  + IF (EDX == 240) ESBYTE[EAX] = 241; //┐ + } + EAX = str; + //EAX = ESDWORD[EAX]; + //if (EAX != 0x5249443C) $int 3; +} + +inline fastcall void dostowin (dword ESI) +{ + dword stroka,dlina; + stroka = ESI; + while (BL=ESBYTE[ESI]) + { + IF (BL>128) + IF (BL>=240) ESBYTE[ESI] = BL - 16; + ELSE ESBYTE[ESI] = BL - 64; + ESI++; + } +} + +void WindowRedrawStatus(dword i) +{ + EAX = 12; // function 12:tell os about windowdraw + EBX = i; // 1, start of draw + $int 0x40 +} + +void DefineAndDrawWindow(dword x,y,sizeX,sizeY,byte mainAreaType,dword mainAreaColour,byte headerType,dword headerColour,borderColour) +{ + dword arg1, arg2, arg3, arg4; + // + arg1 = x << 16 + sizeX; + arg2 = y << 16 + sizeY; + arg3 = mainAreaType << 24 | mainAreaColour; + arg4 = headerType << 24 | headerColour; + // + $mov eax, 0 + $mov ebx, arg1 + $mov ecx, arg2 + $mov edx, arg3 + $mov esi, arg4 + $mov edi, borderColour + $int 0x40 +} + +void DefineButton(dword x,y,w,h,id,color) +{ + DrawButton(x<<16+w, skin_width+y<<16+h, id, color); +} + +void WriteText(dword x,y,byte fontType, dword color, text, len) +{ + EBX = x<<16+skin_width+y; + ECX = fontType<<24+color; + EDX = text; + ESI = len; + EAX = 4; + $int 0x40; +} + +inline fastcall void PutPixel(dword EBX,ECX,EDX) //Coded by Leency :D +{ + EAX=1; + $int 0x40 +} + +void DrawBar(dword x,y,w,h,color) +{ + kos_DrawBar(x<<16+w,skin_width+y<<16+h,color); +} + +void DrawRegion(dword x,y,width,height,color1) +{ + DrawBar(x,y,width,1,color1); //яюыюёр уюЁ ётхЁїє + DrawBar(x,y+height,width,1,color1); //яюыюёр уюЁ ёэшчє + DrawBar(x,y,1,height,color1); //яюыюёр тхЁЄ ёыхтр + DrawBar(x+width,y,1,height+1,color1); //яюыюёр тхЁЄ ёяЁртр +} + +void DrawFlatButton(dword x,y,width,height,id,color,text) +{ + DrawRegion(x,y,width,height,0x94AECE); + DrawBar(x+1,y+1,width-1,1,0xFFFFFF); //яюыюёр уюЁ схыр  + DrawBar(x+1,y+height-1,width-2,1,0xC7C7C7); //Єхэ№ тхЁЄ + DrawBar(x+1,y+1,1,height-1,0xFFFFFF); //яюыюёр тхЁЄ схыр  + DrawBar(x+width-1,y+2,1,height-2,0xC7C7C7); //Єхэ№ тхЁЄ + DrawBar(x+2,y+2,width-3,height-3,color); //чрыштър + IF (id<>0) DefineButton(x,y,width,height,id+BT_HIDE,0xEFEBEF); //юяЁхфхы хь ъэюяъє + WriteText(-strlen(text)*6+width/2+x+1,height/2-3+y,0x80,0,text,strlen(text)); +} + + +void PutImage(dword buf,w,h,x,y) +{ + int i,r,g,b; + EDI=buf; + EAX = 7; + EBX = buf; + ECX = w<<16+h; + EDX = x<<16+y+skin_width; + $int 0x40 +} + + +void copystr(dword s,d) +{ + $mov esi,s + $mov edi,d + $cld +l1: + $lodsb + $stosb + $test al,al + $jnz l1 +} + + +int pos,razr,backup,j=0,chislo; +char buffer[11]=""; +inline fastcall dword IntToStr(dword ESI) +{ + chislo=ESI; + ECX=12; + $push edi + $mov edi,#buffer + $xor al,al + $cld + $rep $stosb + pos=razr=backup=j=0; + if (chislo<0) + { + buffer[pos]='-'; + chislo=-1*chislo; + pos++; + } + backup=chislo; + do + { + backup=backup/10; + razr++; + } + while (backup!=0); + razr--; + FOR (j=razr+pos;j>pos-1;j--) + { + backup=chislo/10; + backup=backup*10; + buffer[j]=chislo-backup+48; + chislo=chislo/10; + } + //return #buffer; + $pop edi; + EAX = #buffer; +} + + +inline fastcall dword MoveSize(dword EBX,ECX,EDX,ESI) +{ + EAX = 67; + $int 0x40 +} + + +f70 CopyFile_f; +BDVK CopyFile_atr; +inline fastcall dword CopyFile(dword EBX,ECX) +{ + dword s, d, bufer=0; + s = EBX; + d = ECX; + + CopyFile_f.func = 5; + CopyFile_f.param1 = 0; + CopyFile_f.param2 = 0; + CopyFile_f.param3 = 0; + CopyFile_f.param4 = #CopyFile_atr; + CopyFile_f.rezerv = 0; + CopyFile_f.name = s; + $mov eax, 70 + $mov ebx, #CopyFile_f + $int 0x40 + + if (EAX == 0) + { + bufer = malloc(CopyFile_atr.sizelo); + CopyFile_f.func = 0; + CopyFile_f.param1 = 0; + CopyFile_f.param2 = 0; + CopyFile_f.param3 = CopyFile_atr.sizelo; + CopyFile_f.param4 = bufer; + CopyFile_f.rezerv = 0; + CopyFile_f.name = s; + $mov eax, 70 + $mov ebx, #CopyFile_f + $int 0x40 + + IF (EAX == 0) + { + CopyFile_f.func = 2; + CopyFile_f.param1 = 0; + CopyFile_f.param2 = 0; + CopyFile_f.param3 = CopyFile_atr.sizelo; + CopyFile_f.param4 = bufer; + CopyFile_f.rezerv = 0; + CopyFile_f.name = d; + $mov eax, 70 + $mov ebx, #CopyFile_f + $int 0x40 + } + } + +} diff --git a/programs/develop/box_lib/C--/lib/load_bmp.h-- b/programs/develop/box_lib/C--/lib/load_bmp.h-- new file mode 100644 index 0000000000..3df7e80d8e --- /dev/null +++ b/programs/develop/box_lib/C--/lib/load_bmp.h-- @@ -0,0 +1,67 @@ +//Load BMP by Veliant + +struct readimage{ + dword func, param1, param2, size, buffer; + byte z; + dword name; +}; + +void Put_Image(dword x,y,w,h,name) +{ + int i, j, size, off, off2; + byte r, g, b; + readimage image; + dword buf; + size=w*h*3+100; + buf=malloc(size); + image.func = 0; + image.param1 = 0; + image.param2 = 0; + image.size = size; + image.buffer = buf; + image.z = 0; + image.name = #path; + EAX = 70; + EBX = #image; + $int 0x40; + + for(i=0;i96!m8_Nvj`v2w2P%}GH#DuBQ|%| zheF3~q1Usq4Sd+xi%c?NP0|;U7D1W>))efRgV})(OIjVrrC1TctcKlv&rQ>Y{tG+d zoO{0C&*%H&{P^Z{;*b3J;}gv`gwWJ3g!<|bIwe**sI2BU9+DFQBJ|Ksku-EKd4m}T z;>tGy&G*}uyhb+7q%T%Y6CtXJ#%|+`10Z7W;gFuU-7V^?HjcE5#u+Dv>MUr>$~g2T zgspnr6QDs+Uo^MlIJu@G<|GJ$8`616z>0y(6d$qX9s`$LH?f?~%loj~z|TOCEWv5u zC$oGVG+3scCF*}hwI_58{4HjV@MX}TC%q~OK{wq$1!)MKa=IW1of7psA!*jNo2Mq% zFb`R@pzONY=}s5qEh=#Yc#@k`*>WmXodOe_I;me|_h6rc88`Q6YO<-hO-&*;6Jlje zXqrs1Tfk1=mO4>U1C!I7ocTSdD3%2*0S(j?JH0Ry**E}O&J|PhR6?k~q%I?N$+A+s zK8ihjkUM&11%y11J$kx>Ui&;OW%Q$f!Q z5LEvSxe~wH;5zUC?z;@U3fSXQ$ALi*>gO!iH3qFDw53+92m`v&d#tX_1ar3;> zE0W+Bg?fI#{C-$xL^UUPC?}>T=CzGr28v@x`$RzKQ|M9X6VR(I92$)F_D4n$s?K`P zhA-AgpGCBhFhZY)&yNg7hI_*yga*{`z*%n88#>>2p;q2O9#9dAoQrb1ZFY@f2R(8Q zq1gt=?AB2jmb|m4`TS)V=GtLvmb{bm(RYl@?bDEd66SAq(Swusqp$leiSO;x#EHe| zUT<6RX+Y12#fJgf>M+{N-NoOV=d*gw%r=c&9BCRF>~G?!z_&5dPr&v6pl!e!4?sT* zo!8O$<%qTFJGZ8-ZwW@e!FKq%H@gMw7;?a2J#anQ5Fl(0{*U#N%{6ffB)w#JP4EDE zNpMZR&G8$6PvLTlE$V2oYrELjAU`_D5ehTa3x#9WcfeUb;w8jn7%U~>6;b~o0L33z zH&7R|#KykcfVcsWuJVhoe#2elxQSey5r?9}ry$5Ekpd+u6 zhRw25?*R&BSlv-n;LXdDmq1K2F-t^C K|9<5K&He{>L4&aX literal 0 HcmV?d00001 diff --git a/programs/develop/box_lib/C--/trunk/compile.bat b/programs/develop/box_lib/C--/trunk/compile.bat new file mode 100644 index 0000000000..8bf61605e2 --- /dev/null +++ b/programs/develop/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/box_lib/C--/trunk/use_library.h-- b/programs/develop/box_lib/C--/trunk/use_library.h-- new file mode 100644 index 0000000000..979668626a --- /dev/null +++ b/programs/develop/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/box_lib/trunk/box_lib.asm b/programs/develop/box_lib/trunk/box_lib.asm new file mode 100644 index 0000000000..278f9b96a7 --- /dev/null +++ b/programs/develop/box_lib/trunk/box_lib.asm @@ -0,0 +1,551 @@ +;Libray from Editbox +; SEE YOU File FAQ.txt and HISTORY. Good Like! +;;;;;;;;;;;;;;;;;; + +format MS COFF + +public EXPORTS + +section '.flat' code readable align 16 +include 'macros.inc' +include 'editbox.mac' ;макрос который должен облегчить жизнь :) специально для editbox + +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] ;старое положение курсора +.draw: + pusha + mov eax,9 + push procinfo + pop ebx + or ecx,-1 + mcall +;--- рисуем рамку --- + 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: + popa + ret 4 + +;========================================================== +;=== обработка клавиатуры ================================= +;========================================================== +edit_box_key: +pusha + 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 +;--- нажата другая клавиша --- +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_figures_only +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;проверка на shift был ли нажат +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +are_key_shift_press +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; проверяем, находится ли курсор в конце + дальнейшая обработка +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +are_key_cur_end +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработка клавиш insert,delete.backspase,home,end,left,right +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_work_key + +;========================================================== +;=== обработка мыши ======================================= +;========================================================== +;save for stdcall ebx,esi,edi,ebp +edit_box_mouse: + pop eax ;opint to back + pop edx ;scr_w + pop ecx ;ebp ;scr_h + push eax + +; pop eax +; pop edx ;scr_w +; pop ecx ;scr_h +; push eax ;pointer to back +pusha + mov ebp,ecx + + 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,0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функция обработки мышки получение координат и проверка их + выделения +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_work_mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Общие функции обработки +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_general_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с key +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_mouse_func ;scr_w +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;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 ; высота + +;---------------------------------------------------- +;CheckBox +;---------------------------------------------------- +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 ;выйти из процедуры +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработчик 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 ;выйти + +;-------------------------------------------------- +;radiobutton Group +;-------------------------------------------------- +option_box_draw_box: +option_group equ [edi] +op_left equ [edi+4] ;координата начала рисования по х +op_top equ [edi+6] ;координата начала рисования по у +op_text_margin equ [edi+8] ;=4 расстояние от прямоугольника чек бокса до надписи +op_size equ [edi+12] ;12 размер квадрата чек бокса +op_color equ [edi+16] +op_border_color equ [edi+20] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно +op_text_color equ [edi+24];[edi+4] ;цвет текста +op_text_ptr equ [edi+28] ;указатель на начало текстовой строки +op_text_length equ [edi+32] +op_flags equ [edi+36] ;флаги + + pusha ;сохраним все регистры + + movzx ebx,word op_left + shl ebx,16 + add ebx,dword op_size + movzx ecx,word op_top + shl ecx,16 + add ecx,dword op_size + mov edx,dword op_border_color + mov eax,13 + mcall ;рисуем рамку + + mov edx,dword op_color + add ebx,1 shl 16 - 2 + add ecx,1 shl 16 - 2 + mcall ;закрашиваем внутренности чекбокса + +; mov eax,dword option_group +; mov dword eax,[eax] +; cmp eax,edi +; jne @f +; call option_box_draw_op ;нарисовать включенный чек бокс + + +;---------------------------- +;расчет куда будет произведен вывод текста +;---------------------------- +@@: movzx ebx,word op_left ;загрузить значение х для чек бокса + add ebx,dword op_size + add ebx,dword op_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov bx,word op_top ;загрузим значение по y + add ebx,op_size + mov ecx,dword op_text_color ;загрузим цвет надписи + flags + sub ebx,7 ;добавим значение длины стороны -9+2 + + mov edx,dword op_text_ptr ;укажем адрес от куда нужно выводить строку + mov esi,dword op_text_length + ;внесем в eax значение вывода надписи на канву + mov eax,4 + mcall ;Вывод +popa ;восстановить значения регистров из стека +ret ;выйдем из процедуры + +option_box_clear_op: ;очистка чек бокса + mov edx,dword op_color ;цвет внутри чек бокса + jmp @f ;безусловный прыжок на нижнюю метку @@ + + +option_box_draw_op: ;нарисовать включенный чек бокс + mov edx,dword op_border_color ;загрузить цвет +@@: + movzx ebx,word op_left ;загрузить координату по х + mov eax,dword op_size + push ax + shr eax,2 + add ebx,eax ;добавить (сторона прямоугольника/3) + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + pop bx + shr bx,1 ;загрузить (сторона прямоугольника/2) + mov bp,bx ;сохраним регистр bx в регистре указателя базы + + movzx ecx,word op_top ;загрузить координату по у + mov eax,dword op_size + shr eax,2 + add ecx,eax ;добавить (сторона прямоугольника/4) + shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov cx,bp ;загрузим значения регистра указателя базы в cx + mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс + mcall ;вывод +ret ;выйти из процедуры +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработчик mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +option_box_mouse_op: ;обработка мыши +pusha + mov eax,37 ;будем что то делать если у нас что - нить нажато + mov ebx,2 ;внести в регистр значение 2 + mcall ;проверка не нажал ли пользователь кнопку мышки + test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем + jnz @f ;перейти на нижнюю метку @@ + + jmp option_box_mouse_end + ;если ничего не произошло, то восстановим значения регистров из стека + ;выход +@@: + mov esi,dword op_text_length ;загрузить кол-во символов в текстовой строке + ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea + ;lea esi,[eax*2+eax] + ;shl eax,1 + imul esi,6 ; или можно и так умножить на 6 + xor ebx,ebx + add esi,dword op_text_margin ;добавить 3 - расстояние от чек бокса до надписи + + mov eax,37 ;получим координаты мышки + inc ebx ;добавить 1 + mcall ;получить координаты курсора относительно окна + + movzx ebx,word op_top ;загрузить в bx значение координаты у + cmp ax,bx ;сравнить с с координатой курсора + jl option_box_mouse_end ;SF <> OF если меньше + add ebx,dword op_size ;добавить размер + cmp ax,bx ;сравнить + jg option_box_mouse_end ;ZF = 0 и SF = OF если больше + + shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений + movzx ebx,word op_left ;произведем аналогичное сравнение + cmp ax,bx ;сравнить регистры + jl option_box_mouse_end ;если меньше + add ebx,dword op_size ;добавить длину стороны прямоугольника + add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу + cmp ax,bx ;стравнить регистры + jg option_box_mouse_end ;если больше + mov eax,dword option_group + mov [eax],edi + +option_box_mouse_end: +popa ;восстановить регистры из стека +ret ;выйти + +option_box_draw: + pusha + + mov eax,dword [esp+36] +@@: mov edi,dword [eax] + test edi,edi + je option_check + call option_box_draw_box + add eax,4 + jmp @b + +option_check: + mov eax,dword [esp+36] +@@: mov edi,dword [eax] + test edi,edi + je @f + + mov ebx,dword [edi] + mov ebx,dword [ebx] + cmp edi,ebx + jne .clear_op + + pusha + call option_box_draw_op + popa + add eax,4 + jmp @b + +.clear_op: + pusha + call option_box_clear_op + popa + add eax,4 + jmp @b + + +@@: popa + ret 4 + ; exit вообще :) + + +option_box_mouse: + pusha + + mov eax,dword [esp+36] +@@: mov edi,dword [eax] + test edi,edi + je option_check + call option_box_mouse_op + add eax,4 + jmp @b + + +align 16 +EXPORTS: + + dd sz_edit_box, edit_box + dd sz_edit_box_key, edit_box_key + dd sz_edit_box_mouse, edit_box_mouse + dd szVersion_ed, 0x00000001 + dd sz_check_box_draw, check_box_draw + dd sz_check_box_mouse, check_box_mouse + dd szVersion_ch, 0x00000001 + dd sz_option_box_draw, option_box_draw + dd sz_option_box_mouse, option_box_mouse + dd szVersion_op, 0x00000001 + dd 0,0 + +sz_edit_box db 'edit_box',0 +sz_edit_box_key db 'edit_box_key',0 +sz_edit_box_mouse db 'edit_box_mouse',0 +szVersion_ed db 'version_ed',0 +sz_check_box_draw db 'check_box_draw',0 +sz_check_box_mouse db 'check_box_mouse',0 +szVersion_ch db 'version_ch',0 +sz_option_box_draw db 'option_box_draw',0 +sz_option_box_mouse db 'option_box_mouse',0 +szVersion_op db 'version_op',0 + +;;;;;;;;;;; +;;Data +;;;;;;;;;;; +align 16 +mouse_flag dd 0x0 +procinfo process_information \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/box_lib.obj b/programs/develop/box_lib/trunk/box_lib.obj new file mode 100644 index 0000000000000000000000000000000000000000..f7b1b343dd9f3e551e5ad7496ca3df099c3ad823 GIT binary patch literal 1978 zcmV;r2SxZxP(w>>5dZ*z00000Yyc()6Lqnw4Jk#wy5sYQ&1mrbBN#H{_DrcCIN27_ z0^ObU+D$p@{K>+Ps-X%uilalE*PqZEN7Xv4;v*-C_oQUL|HR3$9SB}Nv`=1)td0m= zHFQ`-nz8>Y_Y*36zJJpL(l+g}H(BrQ6HjdEc*u7T^XtHU1nE4Xzo#qt>IG$t@3y@E z181_}w%tPj#t=v;AL`f+2c*?=?o7Nd0N$Y7V~9H_O!(dyflPlZ*_{+cSOX12Ij1C(6Gh>v=9o4#V){Yoiu z$LqzzxIgCf)e{H+fLtY}GD}C3EUzapcr|_qA^0Fzc&^vG~fpdU){{LNA$Ph_b;) zGJg2Uki;3?Mn4G7rpq{#^sK~rsF_E3)BrwyS_|HjlN}KVxt1ZXqDgEI%bv@3*pZbg zV>pbT9|GK^73c#DrpEUy=aAo#@yC?vB!VFvUQ!49JKUm>c5+RbfNpE(H-XVg;-24!##zGPG;~ztD!cKQGbWtQ>fchzM z?1||knVY}m>2bJ3oC9?*xnYOwl$ve!m;SVDE|Ph?@mV;)0xeg*Tbl6_bu1zcT{DkK zSkXi5YZ0e5?olcaE_Vlx%g5ALD|P~+>vWHj8*S#kf%o9SG+mCsEEGG8>h4E9eg~+d zO-9$kHG($E~T1azEA`+Y%nR<0y(r2$iL< zq7)s)XygOa1@ZPQhnj#xqI3^o;9PmYq&CRSyJZQfbIYfg(1YLr`tG5>kCZy01JSib z$J+Yk=WcP>fzK3t{Tu#;!=Mob!?xDr#2=7_&D4hNj}Y6bgT` zwY|TZMU@I*mrxzaYi)oz$Rn&Y?K_q)A9k?4JrIMX@Zn*#i-9OqH|CKNb)~4fJb|FL z4%RO({(B)hqs?wua z0`P99Id)6JNj_$PwVSBhmSE7*PMc6s9u>gXQy`YeRBYwgqqkQOQr+#+@W{c=rpI2{ z1*T~j_R>wcyv|DpgH&ZwhyU=xB|aGyIPXzn;uV*iV5Z{1YK+JN z)1WJAQ_~Y&Ie}+1ya}IyS!+SVp)U+2ePagumuc?RsnoU`)^!NctTDeCJ4yFq$Zca| zUtQY!s1XR?8h!zTXZTA3)m~Z5n#o-(a!?Cqta6K$iEG_T0HF-0Q1!SlLCRUyynX%h zA*`uWaLbR+Dk0)iFRSXxI)LiYSF4f6LPlz(!`5^`bp8nPfi=W~v2=s#0BNsmnt&~N zx_rT6;e~>gH{YMnCwYoK__Po#ug-9+#Xf{kmfvGuFyl7{U-F!GQJynmK-*hf_k6~1 zulYIWLd$T6fu1&NiDp!0pbjaK$c6ucf1SZHLU?E$4b@eg{p>uTt-h*iq6Zov+h#)) z(NV%XYs^fk^O`Xa$mEle@!r9Hmj+KW0_8>oO1Xcbg + cmp ebx,eax ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит + ja edit_box_mouse.m1_shem ;если было движение <- то нужно закрасить область + je edit_box_mouse.mwigvag ;если изменения не было, то ничего не делать + mov ebp,ed_color ;тут нужно очистить область c ed_pos ed_shift_pos_old +;входные параметры ebp=color ebx=ed_shift_pos + call edit_box_key.sh_cl_ + jmp edit_box_mouse.mwigvag +edit_box_mouse.msmaller: + cmp ebx,eax + jb edit_box_mouse.m1_shem + mov ebp,ed_color +;входные параметры ebp=color ebx=ed_shift_pos + call edit_box_key.sh_cl_ + jmp edit_box_mouse.mwigvag +;alike = +edit_box_mouse.m1_shem: + mov ebp,shift_color +;входные параметры ebp=color ebx=ed_shift_pos + mov ebx,ecx + call edit_box_key.sh_cl_ + jmp edit_box_mouse.mwigvag +edit_box_mouse.mwigvag: + and word ed_flags,ed_shift_mcl + jmp edit_box.draw_cursor_text +; popa +; ret +edit_box_mouse.mleft: + mov eax,ed_pos + cmp eax,0 + jbe edit_box_mouse.mwigvag + dec eax + call edit_box.check_offset + push eax + mov ebx,ed_shift_pos + mov ebp,shift_color + call edit_box_key.sh_cl_ + pop eax + jmp edit_box_mouse.mdraw +edit_box_mouse.mright: + mov eax,ed_pos + mov ebx,ed_size + cmp eax,ebx + jae edit_box_mouse.mwigvag + inc eax + call edit_box.check_offset + mov ebx,ed_shift_pos + mov ebp,shift_color + push eax + call edit_box_key.sh_cl_ + pop eax + jmp edit_box_mouse.mdraw +} + +macro use_work_mouse +; pop edx ;scr_h +; pop ebp ;scr_w +;---------------------------------------------------------- +;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? +;---------------------------------------------------------- +{ + test word ed_flags,ed_mouse_on + jne edit_box_mouse.mouse_wigwag +;---------------------------------------------------------- +;--- проверяем, попадает ли курсор в edit box ------------- +;---------------------------------------------------------- + mov ebx,[procinfo.box.top] + add ebx,ed_top + add ebx,dword [esp+24] ;ecx scr_h + cmp ax,bx + jl edit_box_mouse._blur;.mouse_end_no_focus + + add ebx,ed_height + cmp ax,bx + jg edit_box_mouse._blur;.mouse_end_no_focus + + shr eax,16 + + mov ebx,[procinfo.box.left] + add ebx,ed_left + add ebx,dword [esp+20] ;edx scr_w + + cmp ax,bx + jl edit_box_mouse._blur;.mouse_end_no_focus + + add ebx,ed_width + cmp ax,bx + jg edit_box_mouse._blur;.mouse_end_no_focus +;--- изменяем позицию курсора --- + push eax + mov ebp,ed_color + call edit_box.clear_cursor + pop eax +edit_box_mouse._mvpos: + mov ebx,dword [procinfo.box.left] + xor edx,edx + sub eax,ed_left + sub eax,ebx +; + add ebx,dword [esp+20] ; scr_w + sub eax,2 +; + mov ebx,6 + div bx + add eax,ed_offset + cmp eax,ed_size + jna edit_box_mouse._mshift + mov eax,ed_size +edit_box_mouse._mshift: +;;;;;;; +;;Секция обработки shift и выделения по shift +;;;;;;; + test word ed_flags,ed_shift_bac + je @f + mov ebp,dword ed_color + mov ebx,dword ed_shift_pos + push eax + call edit_box_key.sh_cl_ + and word ed_flags,ed_shift_bac_cl + pop eax +@@: + test word ed_flags,ed_mouse_on + jne @f + + mov dword ed_shift_pos,eax + or word ed_flags,ed_mouse_on + mov dword ed_pos,eax + mov dword [mouse_flag],edi ;установим идентификатор + bts word ed_flags,1 ;установка фокуса + jmp edit_box_mouse.m_sh +@@: + cmp eax,dword ed_shift_pos ;если позиции не изменились + je edit_box.editbox_exit + mov ed_pos,eax + mov ebp,dword shift_color + mov ebx,dword ed_shift_pos + call edit_box_key.sh_cl_ + or word ed_flags,ed_mous_adn_b ;установим бит что мы выделили +shift_on + +edit_box_mouse.m_sh: call edit_box.draw_text + call edit_box.draw_cursor +;---------------------------------------------------------- +;--- процедура установки фокуса --------------------------- +;---------------------------------------------------------- + jmp edit_box_mouse.drc +edit_box_mouse._blur: + test word ed_flags,ed_always_focus + jne edit_box.editbox_exit + btr word ed_flags,1 ; если не в фокусе, выходим + jnc edit_box.editbox_exit + + mov ebp,ed_color + call edit_box.clear_cursor +edit_box_mouse.drc: call edit_box.draw_border + jmp edit_box.editbox_exit +} + + +; Макрос выхода +macro edit_ex +{ +popa +ret +} +macro debug +{ + ;----------- отладка + pushad +; mov dword [ed_buffer.2],0 +; mov eax,edi + mov eax,dword [ed_buffer.2] + mov edi,ed_buffer.3 + call .str + ;рисование фона + mov eax,13 + mov ebx,178*65536+70 + mov ecx,28*65536+10 + xor edx,edx + int 0x40 + ;вывод значения на экран + mov eax,4 + mov ebx,180*65536+30 + mov ecx,0x10DDBBCC + mov edx,ed_buffer.3 + mov esi,8 + int 0x40 + popad + ;----------- отладка +} +macro debug_func +{ +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + ;dec edi ;смещение необходимое для записи с конца строки + call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает + ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + + ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться +} + +;;;;;;;;;;;;;;; +;For LibGui +;;;;;;;;;;;;;;; +macro srt_ed_libgui +{ +ed_width equ [EditBox.ed_width] ;ширина компонента +ed_left equ [EditBox.ed_left] ;положение по оси х +ed_top equ [EditBox.ed_top] ;положение по оси у +ed_color equ [EditBox.ed_color] ;цвет фона компонента +shift_color equ [EditBox.shift_color] ;=0x6a9480 +ed_focus_border_color equ [EditBox.ed_focus_border_color] ;цвет рамки компонента +ed_blur_border_color equ [EditBox.ed_blur_border_color] ;цвет не активного компонента +ed_text_color equ [EditBox.ed_text_color] ;цвет текста +ed_max equ [EditBox.ed_max] ;кол-во символов которые можно максимально ввести +ed_text equ [EditBox.ed_text] ;указатель на буфер +ed_flags equ [EditBox.ed_flags] ;флаги +ed_size equ [EditBox.ed_size] ;кол-во символов +ed_pos equ [EditBox.ed_poz] ;позиция курсора +ed_offset equ [EditBox.ed_offset] ;смещение +cl_curs_x equ [EditBox.cl_curs_x] ;предыдущее координата курсора по х +cl_curs_y equ [EditBox.cl_curs_y] ;предыдущее координата курсора по у +ed_shift_pos equ [EditBox.ed_shift_pos] ;положение курсора +ed_shift_pos_old equ [EditBox.ed_shift_pos_old] ;старое положение курсора +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=24 ; высота +} + +ed_struc_size=72 +struc edit_box width,left,top,color,shift_color,focus_border_color,\ + blur_border_color,text_color,max,text,flags,size,pos +{ +.width dd width +.left dd left +.top dd top +.color dd color +.shift_color dd shift_color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.flags dd flags+0 +.size dd size+0 +.pos dd pos+0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +.shift_old dd 0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота + +} diff --git a/programs/develop/box_lib/trunk/editbox_ex.asm b/programs/develop/box_lib/trunk/editbox_ex.asm new file mode 100644 index 0000000000..53e2145d4f --- /dev/null +++ b/programs/develop/box_lib/trunk/editbox_ex.asm @@ -0,0 +1,249 @@ +;заголовок приложения +use32 ; транслятор, использующий 32 разрядных команды + org 0x0 ; базовый адрес кода, всегда 0x0 + db 'MENUET01' ; идентификатор исполняемого файла (8 байт) + dd 0x1 ; версия формата заголовка исполняемого файла + dd start ; адрес, на который система передаёт управление + ; после загрузки приложения в память + dd i_end ; размер приложения + dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd 0x0 ; указатель на строку с параметрами. + dd way_of_ini +include 'macros.inc' +include 'editbox_ex.mac' +start: +;Get way for ini file. + mov edi,way_of_ini + mov ecx,1024 + xor eax,eax + cld + repne scasb + test ecx,ecx + jz @f + + mov esi,1024 + sub esi,ecx + mov ecx,esi + std + mov al,'/' + repne scasb + test ecx,ecx + jz next_way + add edi,2 +@@: + mov esi,ini_file + cld + +@@: lodsb + test al,al + jz @f + stosb + jmp @b + +@@: xor eax,eax + stosb + +; load DLL + mov ecx,way_of_ini + mov eax, 68 + mov ebx, 19 + mcall + test eax, eax + jz next_way + jmp import_init_ +next_way: + mov ecx,ini_file + mov eax, 68 + mov ebx, 19 + mcall + test eax, eax + jz exit + + + +import_init_: +; initialize import + mov edx, eax + mov esi,myimport +import_loop: + lodsd + test eax, eax + jz import_done + push edx +import_find: + mov ebx, [edx] + test ebx, ebx + jz exit;import_not_found + push eax +@@: + mov cl, [eax] + cmp cl, [ebx] + jnz import_find_next + test cl, cl + jz import_found + inc eax + inc ebx + jmp @b +import_find_next: + pop eax + add edx, 8 + jmp import_find +import_found: + pop eax + mov eax, [edx+4] + mov [esi-4], eax + pop edx + jmp import_loop +import_done: + + mcall 40,0x27 ;установить маску для ожидаемых событий +red_win: + call draw_window ;первоначально необходимо нарисовать окно +align 4 +still: ;основной обработчик + mcall 10 ;Ожидать события + dec eax + jz red_win + dec eax + jz key + dec eax + jz button + + push dword edit1 + push 22 + push 5 + call [edit_box_mouse] + + push dword edit2 + push 22 + push 5 + call [edit_box_mouse] + + push dword check1 + call [check_box_mouse] + + push dword check2 + call [check_box_mouse] + + push dword Option_boxs + call [option_box_mouse] + + push dword Option_boxs2 + call [option_box_mouse] + + jmp still ;если ничего из перечисленного то снова в цикл +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +button: + mcall 17 ;получить идентификатор нажатой клавиши + test ah,ah ;если в ah 0, то перейти на обработчик событий still + jz still +exit: mcall -1 +key: + mcall 2 ;загрузим значение 2 в регистор eax и получим код нажатой клавиши + + push dword edit1 + call [edit_box_key] + + push dword edit2 + call [edit_box_key] + + jmp still + +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +align 4 +draw_window: ;рисование окна приложения + mcall 12,1 + mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed + + push dword edit1 + call [edit_box_draw] + + push dword edit2 + call [edit_box_draw] + + push dword check1 + call [check_box_draw] + + push dword check2 + call [check_box_draw] + + push dword Option_boxs + call [option_box_draw] + + push dword Option_boxs2 + call [option_box_draw] + + mcall 12,2 + ret +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +;DATA данные +ini_file db '/sys/lib/box_lib.obj',0 +myimport: + +edit_box_draw dd aEdit_box_draw +edit_box_key dd aEdit_box_key +edit_box_mouse dd aEdit_box_mouse +version_ed dd aVersion_ed + +check_box_draw dd aCheck_box_draw +check_box_mouse dd aCheck_box_mouse +version_ch dd aVersion_ch + +option_box_draw dd aOption_box_draw +option_box_mouse dd aOption_box_mouse +version_op dd aVersion_op + + dd 0 + dd 0 + +aEdit_box_draw db 'edit_box',0 +aEdit_box_key db 'edit_box_key',0 +aEdit_box_mouse db 'edit_box_mouse',0 +aVersion_ed db 'version_ed',0 + +aCheck_box_draw db 'check_box_draw',0 +aCheck_box_mouse db 'check_box_mouse',0 +aVersion_ch db 'version_ch',0 + +aOption_box_draw db 'option_box_draw',0 +aOption_box_mouse db 'option_box_mouse',0 +aVersion_op db 'version_op',0 + + + + +check1 check_box 10,45,6,12,0x80AABBCC,0,0,check_text,14,ch_flag_en +check2 check_box 10,60,6,12,0x80AABBCC,0,0,check_text2,15 + +edit1 edit_box 350,3,5,0xffffff,0x6f9480,0,0xAABBCC,0,308,hed,ed_focus,hed_end-hed-1,hed_end-hed-1 +edit2 edit_box 350,3,25,0xffffff,0x6a9480,0,0,0,99,ed_buffer,ed_figure_only + +op1 option_box option_group1,10,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 +op2 option_box option_group1,10,105,6,12,0xFFFFFF,0,0,op_text.2,op_text.e2-op_text.2 +op3 option_box option_group1,10,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 +op11 option_box option_group2,120,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1 +op12 option_box option_group2,120,105,6,12,0xffffff,0,0,op_text.2,op_text.e2-op_text.2 +op13 option_box option_group2,120,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3 + +option_group1 dd op1 ;указатели, они отображаются по умолчанию, когда выводится +option_group2 dd op12 ;приложение +Option_boxs dd op1,op2,op3,0 +Option_boxs2 dd op11,op12,op13,0 +hed db 'BOXs load from lib date 27.09.2007',0 +hed_end: +rb 256 +check_text db 'First checkbox' +check_text2 db 'Second checkbox' +op_text: ; Сопровождающий текст для чек боксов +.1 db 'Option_Box #1' +.e1: +.2 db 'Option_Box #2' +.e2: +.3 db 'Option_Box #3' +.e3: +ed_buffer rb 100 +way_of_ini rb 1024 +i_end: +rb 1024 +mem: \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/editbox_ex.kex b/programs/develop/box_lib/trunk/editbox_ex.kex new file mode 100644 index 0000000000000000000000000000000000000000..1fa2f6afed76e8ee5945ce50c1c09707d27ee764 GIT binary patch literal 623 zcmV-#0+9VnP(w@T1poj600001Mv*2LLXK;4&&M{gp_J5q)76xN-|)1reUN4_wO*D^ z~F^Hov#*OC`{0`{acofow{uwqc9;ssWJ@Vuk(0Z2rX{}z93#Bv>=qR(F{QR^u#TJ zsZnJD2LqXjgs0qLc0f9lTPe%XGXZ%VSw-~J!Kn1vwk@~BDUyEXU|KE4GUgMZbG>T- zd-Ex>r)(?7ICH2G@A*mK)Yq~uvw-Dw^MfEfU4)9Wevn$%fq!uX=PC7tVRx#{SxI1H z-JVDv<%ul$Qt%qsX?7DTLK_D*RSA%#8I7~2tBmtclZ^5fV<3P;^Gi;$d!%|Aa9U5I zU^-NRiz@fu(ePbCFc(~(@C1IA%q`O>Q1)Y~@qA$06n*ZK*e{$s&H$RCo_u!;_j;g- z@EQs83U{*<#hx~aQOSERWO9dCHa}7O))Jxz(2sXo5F8AJwDjGPZ literal 0 HcmV?d00001 diff --git a/programs/develop/box_lib/trunk/editbox_ex.mac b/programs/develop/box_lib/trunk/editbox_ex.mac new file mode 100644 index 0000000000..e9200b74bc --- /dev/null +++ b/programs/develop/box_lib/trunk/editbox_ex.mac @@ -0,0 +1,77 @@ +ed_struc_size=72 +struc edit_box width,left,top,color,shift_color,focus_border_color,\ + blur_border_color,text_color,max,text,flags,size,pos +{ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота + +.width dd width +.left dd left +.top dd top +.color dd color +.shift_color dd shift_color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.flags dd flags+0 +.size dd size+0 +.pos dd pos+0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +.shift_old dd 0 +} +struc check_box left,top,ch_text_margin,ch_size,color,border_color,text_color,text,ch_text_length,flags +{ ;структура параметров для чек бокса +ch_flag_en=10b +.left: dw left ;+0 ;положение по х +.top: dw top ;положение по у +.ch_text_margin: dd ch_text_margin ;расстояние от прямоугольника чек бокса до надписи +.ch_size: dd ch_size ;размер квадрата чек бокса, для примера 12 +.color: dd color ;цвет внутри чекбокса +.border_color: dd border_color ;цвет рамки +.text_color: dd text_color ;цвет надписи +.text: dd text ;адрес в коде программы где расположен текст +.ch_text_length: dd ch_text_length ;длинна строки с символами +.flags: dd flags+0 ; флаги +} +struc option_box point_gr,left,top,op_text_margin,op_size,color,border_color,text_color,text,op_text_length,flags +{ ;структура параметров для чек бокса +op_flag_en=10b +.option_group: dd point_gr +.left: dw left ;+0 ;положение по х +.top: dw top ;положение по у +.ch_text_margin: dd op_text_margin ;расстояние от прямоугольника чек бокса до надписи +.ch_size: dd op_size ;размер квадрата чек бокса, для примера 12 +.color: dd color ;цвет внутри чекбокса +.border_color: dd border_color ;цвет рамки +.text_color: dd text_color ;цвет надписи +.text: dd text ;адрес в коде программы где расположен текст +.ch_text_length: dd op_text_length ;длинна строки с символами +.flags: dd flags+0 ; флаги +} diff --git a/programs/develop/box_lib/trunk/macros.inc b/programs/develop/box_lib/trunk/macros.inc new file mode 100644 index 0000000000..e5de532755 --- /dev/null +++ b/programs/develop/box_lib/trunk/macros.inc @@ -0,0 +1,502 @@ +@^ fix macro comment { +^@ fix } + + +macro m2m dest,src { + push src + pop dest +} + + +macro iglobal { + IGlobals equ IGlobals, + macro __IGlobalBlock { } + +macro uglobal { + UGlobals equ UGlobals, + macro __UGlobalBlock { } + +endg fix } ; Use endg for ending iglobal and uglobal blocks. + + +macro IncludeIGlobals{ + macro IGlobals dummy,[n] \{ __IGlobalBlock + purge __IGlobalBlock \} + match I, IGlobals \{ I \} } + +macro IncludeUGlobals{ + macro UGlobals dummy,[n] \{ + \common + \local begin, size + begin = $ + virtual at $ + \forward + __UGlobalBlock + purge __UGlobalBlock + \common + size = $ - begin + end virtual + rb size + \} + match U, UGlobals \{ U \} } + +uglobal +endg + +iglobal +endg + + +; new application structure +macro meos_app_start + { + use32 + org 0x0 + + db 'MENUET01' + dd 0x01 + dd __start + dd __end + dd __memory + dd __stack + + if used __params & ~defined __params + dd __params + else + dd 0x0 + end if + + dd 0x0 + } +MEOS_APP_START fix meos_app_start + +macro code + { + __start: + } +CODE fix code + +macro data + { + __data: + IncludeIGlobals + } +DATA fix data + +macro udata + { + if used __params & ~defined __params + __params: + db 0 + __end: + rb 255 + else + __end: + end if + __udata: + IncludeUGlobals + } +UDATA fix udata + +macro meos_app_end + { + align 32 + rb 2048 + __stack: + __memory: + } +MEOS_APP_END fix meos_app_end + + +; macro for defining multiline text data +struc mstr [sstring] + { + forward + local ssize + virtual at 0 + db sstring + ssize = $ + end virtual + dd ssize + db sstring + common + dd -1 + } + +; macro for defining multiline text data +struc mls [sstring] + { + forward + local ssize + virtual at 0 + db sstring ; mod + ssize = $ + end virtual + db ssize + db sstring + common + db -1 ; mod + } + + + +; strings +macro sz name,[data] { ; from MFAR [mike.dld] + common + if used name + name db data + .size = $-name + end if +} + +macro lsz name,[lng,data] { ; from MFAR [mike.dld] + common + if used name + label name + forward + if lang eq lng + db data + end if + common + .size = $-name + end if +} + +macro szc name,elsz,[data] { ; from MFAR [mike.dld] + common + local s,m + m = 0 + if used name + label name + forward + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + common + .size = $-name + .maxl = m + end if +} + +macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld] + common + local s,m,c + m = 0 + c = 0 + if used name + label name + forward + if lang eq lng + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + c = c+1 + end if + common + .size = $-name + .maxl = m + .count = c + end if +} + + +; easy system call macro +macro mpack dest, hsrc, lsrc +{ + if (hsrc eqtype 0) & (lsrc eqtype 0) + mov dest, (hsrc) shl 16 + lsrc + else + if (hsrc eqtype 0) & (~lsrc eqtype 0) + mov dest, (hsrc) shl 16 + add dest, lsrc + else + mov dest, hsrc + shl dest, 16 + add dest, lsrc + end if + end if +} + +macro __mov reg,a,b { ; mike.dld + if (~a eq)&(~b eq) + mpack reg,a,b + else if (~a eq)&(b eq) + mov reg,a + end if +} + + +include 'config.inc' +;__CPU_type equ p5 +SYSENTER_VAR equ 0 + +macro mcall a,b,c,d,e,f,i { ; mike.dld, updated by Ghost for Fast System Calls + local ..ret_point + __mov eax,a + __mov ebx,b + __mov ecx,c + __mov edx,d + __mov esi,e + __mov edi,f + __mov ebp,i + + if __CPU_type eq p5 + int 0x40 + else + if __CPU_type eq p6 + push ebp + mov ebp, esp + push ..ret_point ; it may be 2 or 5 byte + sysenter + ..ret_point: + pop edx + pop ecx + + else + if __CPU_type eq k6 + push ecx + syscall + pop ecx + else + display 'ERROR : unknown CPU type' + int 0x40 + end if + end if + end if +} + + +; ------------------------- +macro header a,[b] { + common + use32 + org 0 + db 'MENUET',a + forward + if b eq + dd 0 + else + dd b + end if } +macro section name { align 16 + label name } +macro func name { + if ~used name + display 'FUNC NOT USED: ',`name,13,10 + else + align 4 + name: + ;diff16 `name,0,name +;pushad +;pushfd +;dps `name +;newline +;mcall 5,1 +;popfd +;popad +} +macro endf { end if } + +macro diff16 title,l1,l2 + { + local s,d + s = l2-l1 + display title,': 0x' + repeat 8 + d = '0' + s shr ((8-%) shl 2) and $0F + if d > '9' + d = d + 'A'-'9'-1 + end if + display d + end repeat + display 13,10 + } + +macro diff10 title,l1,l2 + { + local s,d,z,m + s = l2-l1 + z = 0 + m = 1000000000 + display title,': ' + repeat 10 + d = '0' + s / m + s = s - (s/m)*m + m = m / 10 + if d <> '0' + z = 1 + end if + if z <> 0 + display d + end if + end repeat + display 13,10 + } + +; optimize the code for size +__regs fix + +macro add arg1,arg2 + { + if (arg2 eqtype 0) + if (arg2) = 1 + inc arg1 + else + add arg1,arg2 + end if + else + add arg1,arg2 + end if + } + +macro sub arg1,arg2 + { + if (arg2 eqtype 0) + if (arg2) = 1 + dec arg1 + else + sub arg1,arg2 + end if + else + sub arg1,arg2 + end if + } + +macro mov arg1,arg2 + { + if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0')) + if (arg2) = 0 + xor arg1,arg1 + else if (arg2) = 1 + xor arg1,arg1 + inc arg1 + else if (arg2) = -1 + or arg1,-1 + else if (arg2) > -128 & (arg2) < 128 + push arg2 + pop arg1 + else + mov arg1,arg2 + end if + else + mov arg1,arg2 + end if + } + + +macro RGB [a] { + common + match (r=,g=,b),a \{ + \dd ((r) shl 16) or ((g) shl 8) or (b) + \} +} + + +struc POINT _t,_dx,_dy { + .x _t _dx + .y _t _dy +} + +; structure definition helper +include 'struct.inc' + +struct RECT + left dd ? + top dd ? + right dd ? + bottom dd ? +ends + +struct BOX + left dd ? + top dd ? + width dd ? + height dd ? +ends + +; structures used in MeOS +struct process_information + cpu_usage dd ? ; +0 + window_stack_position dw ? ; +4 + window_stack_value dw ? ; +6 + dw ? ; +8 + process_name rb 12 ; +10 + memory_start dd ? ; +22 + used_memory dd ? ; +26 + PID dd ? ; +30 + box BOX ; +34 + slot_state dw ? ; +50 + dw ? ; +52 + client_box BOX ; +54 + wnd_state db ? ; +70 + rb (1024-71) +ends + +struct system_colors + frame dd ? + grab dd ? + grab_button dd ? + grab_button_text dd ? + grab_text dd ? + work dd ? + work_button dd ? + work_button_text dd ? + work_text dd ? + work_graph dd ? +ends + +struct FILEDATE + Second db ? + Minute db ? + Hour db ? + db ? + Day db ? + Month db ? + Year dw ? +ends + +struct FILEINFO + Attributes dd ? + IsUnicode db ? + db 3 dup(?) + DateCreate FILEDATE + DateAccess FILEDATE + DateModify FILEDATE + Size dq ? +ends + +; constants + +; events +EV_IDLE = 0 +EV_TIMER = 0 +EV_REDRAW = 1 +EV_KEY = 2 +EV_BUTTON = 3 +EV_EXIT = 4 +EV_BACKGROUND = 5 +EV_MOUSE = 6 +EV_IPC = 7 +EV_STACK = 8 + +; event mask bits for function 40 +EVM_REDRAW = 1b +EVM_KEY = 10b +EVM_BUTTON = 100b +EVM_EXIT = 1000b +EVM_BACKGROUND = 10000b +EVM_MOUSE = 100000b +EVM_IPC = 1000000b +EVM_STACK = 10000000b \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/proc32.inc b/programs/develop/box_lib/trunk/proc32.inc new file mode 100644 index 0000000000..aa3ffc9702 --- /dev/null +++ b/programs/develop/box_lib/trunk/proc32.inc @@ -0,0 +1,270 @@ + +; Macroinstructions for defining and calling procedures + +macro stdcall proc,[arg] ; directly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call proc } + +macro invoke proc,[arg] ; indirectly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call [proc] } + +macro ccall proc,[arg] ; directly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call proc + if size@ccall + add esp,size@ccall + end if } + +macro cinvoke proc,[arg] ; indirectly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call [proc] + if size@ccall + add esp,size@ccall + end if } + +macro proc [args] ; define procedure + { common + match name params, args> + \{ define@proc name, \{ prologue name,flag,parmbytes,localbytes,reglist \} + macro locals + \{ virtual at ebp-localbytes+current + macro label def \\{ match . type,def> \\\{ deflocal@proc .,label, + \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \} + macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2 + end if \} } + +macro defargs@proc [arg] + { common + if ~ arg eq + forward + local ..arg,current@arg + match argname:type, arg + \{ current@arg equ argname + label ..arg type + argname equ ..arg + if dqword eq type + dd ?,?,?,? + else if tbyte eq type + dd ?,?,? + else if qword eq type | pword eq type + dd ?,? + else + dd ? + end if \} + match =current@arg,current@arg + \{ current@arg equ arg + arg equ ..arg + ..arg dd ? \} + common + args@proc equ current@arg + forward + restore current@arg + common + end if } + +macro deflocal@proc name,def,[val] + { common + match vars, all@vars \{ all@vars equ all@vars, \} + all@vars equ all@vars name + forward + local ..var,..tmp + match =label,def \{ ..tmp equ \} + match tmp,..tmp \{ ..var def val \} + match ,..tmp \{ label ..var val \} + match =?, val \{ ..tmp equ \} + match any =dup (=?), val \{ ..tmp equ \} + match tmp : value, ..tmp : val + \{ tmp: end virtual + initlocal@proc ..var,def value + virtual at tmp\} + common + match first rest, ..var, \{ name equ first \} } + +macro initlocal@proc name,def + { virtual at name + def + size@initlocal = $ - name + end virtual + position@initlocal = 0 + while size@initlocal > position@initlocal + virtual at name + def + if size@initlocal - position@initlocal < 2 + current@initlocal = 1 + load byte@initlocal byte from name+position@initlocal + else if size@initlocal - position@initlocal < 4 + current@initlocal = 2 + load word@initlocal word from name+position@initlocal + else + current@initlocal = 4 + load dword@initlocal dword from name+position@initlocal + end if + end virtual + if current@initlocal = 1 + mov byte [name+position@initlocal],byte@initlocal + else if current@initlocal = 2 + mov word [name+position@initlocal],word@initlocal + else + mov dword [name+position@initlocal],dword@initlocal + end if + position@initlocal = position@initlocal + current@initlocal + end while } + +macro endp + { purge ret,locals,endl + finish@proc + purge finish@proc + restore regs@proc + match all,args@proc \{ restore all \} + restore args@proc + match all,all@vars \{ restore all \} } + +macro local [var] + { common + locals + forward done@local equ + match varname[count]:vartype, var + \{ match =BYTE, vartype \\{ varname rb count + restore done@local \\} + match =WORD, vartype \\{ varname rw count + restore done@local \\} + match =DWORD, vartype \\{ varname rd count + restore done@local \\} + match =PWORD, vartype \\{ varname rp count + restore done@local \\} + match =QWORD, vartype \\{ varname rq count + restore done@local \\} + match =TBYTE, vartype \\{ varname rt count + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + rq count+count + restore done@local \\} + match , done@local \\{ virtual + varname vartype + end virtual + rb count*sizeof.\#vartype + restore done@local \\} \} + match :varname:vartype, done@local:var + \{ match =BYTE, vartype \\{ varname db ? + restore done@local \\} + match =WORD, vartype \\{ varname dw ? + restore done@local \\} + match =DWORD, vartype \\{ varname dd ? + restore done@local \\} + match =PWORD, vartype \\{ varname dp ? + restore done@local \\} + match =QWORD, vartype \\{ varname dq ? + restore done@local \\} + match =TBYTE, vartype \\{ varname dt ? + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + dq ?,? + restore done@local \\} + match , done@local \\{ varname vartype + restore done@local \\} \} + match ,done@local + \{ var + restore done@local \} + common + endl } diff --git a/programs/develop/box_lib/trunk/readme.txt b/programs/develop/box_lib/trunk/readme.txt new file mode 100644 index 0000000000..c418269c74 --- /dev/null +++ b/programs/develop/box_lib/trunk/readme.txt @@ -0,0 +1,13 @@ + ╥хяыют └ыхъёхщ, ╫хы сшэёъ. +╧ЁшьхЁ яЁюёЄюую шёяы№чютрэш  editbox т сшсышюЄхъх, +EditBox яхЁхяшёрэ фы  ЁрсюЄ√ т сшсышюЄхъх. +─рЄр 25.06.2008 +ёфхырэр яюффхЁцър чряєёър рёёхьсыхЁэюую яЁшьхЁр яЁш Ёрёяюыюцхэшш Єхъє∙хщ сшсышюЄхъш яю 2-ь ьхёЄрь +1. /sys/lib/box_lib.obj ш ъюуфр сшсышюЄхър эрїюфшЄ№ё  т яряъх ё яЁюуЁрььющ. + +─рЄр 21.09.2007 +╤фхырэ єяюЁ эр яюффЁхцъє ╤ ш яхЁхфрўш ярЁрьхЄЁют т ёЄхъх stdcall. +═р фрээ√щ ьюьхэЄ, эюёшЄ ¤ъёяхЁхьхэЄры№э√щ, ЄхёЄют√щ їрЁръЄхЁ. +┴шсышюЄхъє box_lib.obj эєцэю яюьхёЄшЄ№ т яряъє ё т√яюыэ ■∙хщё  яЁюуЁрььющ editbox_ex, шыш яю рфЁхёє /sys/lib/? эю Єюуфр эєцэю яюфьхэшЄ№ яєЄ№ т Їрщых ini_file эр яєЄ№ ъ сшсышюЄхъх +. ╧ЁшьхЁ ёрь т√ўшёы хЄ яєЄ№ ъ сшсышюЄхъх, эх чртшёшью юЄ ётюхую ьхёЄюЁрёяюыюцхэш  +24.09.2007 - ёфхыры яюффЁхцъє checkbox. ─юсртшы ю°шсъш, яЁюуЁрььр уы■ўшЄ юўхэ№ ёхЁ№хчэю :( \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/run.bat b/programs/develop/box_lib/trunk/run.bat new file mode 100644 index 0000000000..6340cc7cb6 --- /dev/null +++ b/programs/develop/box_lib/trunk/run.bat @@ -0,0 +1,4 @@ +..\FASM\fasm.exe box_lib.asm +..\FASM\fasm.exe editbox_ex.asm editbox_ex.kex +REM ..\FASM\kpack.exe editbox_ex +..\emul\klbrinwin.exe editbox_ex.kex \ No newline at end of file diff --git a/programs/develop/box_lib/trunk/struct.inc b/programs/develop/box_lib/trunk/struct.inc new file mode 100644 index 0000000000..947a84e89a --- /dev/null +++ b/programs/develop/box_lib/trunk/struct.inc @@ -0,0 +1,180 @@ + +; Macroinstructions for defining data structures + +macro struct name + { fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common fields@struct equ fields@struct,.,db, \} + struc dw [val] \{ \common fields@struct equ fields@struct,.,dw, \} + struc du [val] \{ \common fields@struct equ fields@struct,.,du, \} + struc dd [val] \{ \common fields@struct equ fields@struct,.,dd, \} + struc dp [val] \{ \common fields@struct equ fields@struct,.,dp, \} + struc dq [val] \{ \common fields@struct equ fields@struct,.,dq, \} + struc dt [val] \{ \common fields@struct equ fields@struct,.,dt, \} + struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \} + struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \} + struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \} + struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \} + struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \} + struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \} + macro db [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,db, \} + macro dw [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dw, \} + macro du [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,du, \} + macro dd [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dd, \} + macro dp [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dp, \} + macro dq [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dq, \} + macro dt [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dt, \} + macro rb count \{ \local anonymous + fields@struct equ fields@struct,anonymous,db,count dup (?) \} + macro rw count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dw,count dup (?) \} + macro rd count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dd,count dup (?) \} + macro rp count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dp,count dup (?) \} + macro rq count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dq,count dup (?) \} + macro rt count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dt,count dup (?) \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} + virtual at 0 } + +macro ends + { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt + restruc rb,rw,rd,rp,rq,rt + purge db,dw,du,dd,dp,dq,dt + purge rb,rw,rd,rp,rq,rt + purge union,struct + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + fields@\\#name equ fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + if $ + display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah + err + end if + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label . + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common \\\} \\} \} } + +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,name,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + virtual at 0 + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ + rb sizeof.#parent#field - $ + end if + else if sizeof.#type > $ + rb sizeof.#type - $ + end if + common + sizeof.#name = $ + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + rb sizeof.#type + end if + local value + common + sizeof.#name = $ + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} }