From d72feff042cf36b30dc70e8212194b7a32602eac Mon Sep 17 00:00:00 2001 From: mat1854 Date: Thu, 18 Aug 2016 02:32:55 +0000 Subject: [PATCH] added codename, extended features, merged older version of CPUID. git-svn-id: svn://kolibrios.org@6484 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/system/cpuid/trunk/CPUID | Bin 0 -> 146705 bytes programs/system/cpuid/trunk/CPUID.ASM | 26 +- programs/system/cpuid/trunk/FASM.EXE | Bin 0 -> 102400 bytes programs/system/cpuid/trunk/HISTORY.TXT | 31 ++ programs/system/cpuid/trunk/config.inc | 5 + programs/system/cpuid/trunk/gif2img.inc | 301 +++++++++++ programs/system/cpuid/trunk/knopka2.bmp | Bin 0 -> 6774 bytes programs/system/cpuid/trunk/knopka2.gif | Bin 0 -> 1373 bytes programs/system/cpuid/trunk/lang.inc | 1 + programs/system/cpuid/trunk/load_lib.mac | 617 +++++++++++++++++++++++ programs/system/cpuid/trunk/logos.inc | 14 +- programs/system/cpuid/trunk/macros.inc | 532 +++++++++++++++++++ programs/system/cpuid/trunk/struct.inc | 184 +++++++ 13 files changed, 1697 insertions(+), 14 deletions(-) create mode 100644 programs/system/cpuid/trunk/CPUID create mode 100644 programs/system/cpuid/trunk/FASM.EXE create mode 100644 programs/system/cpuid/trunk/config.inc create mode 100644 programs/system/cpuid/trunk/gif2img.inc create mode 100644 programs/system/cpuid/trunk/knopka2.bmp create mode 100644 programs/system/cpuid/trunk/knopka2.gif create mode 100644 programs/system/cpuid/trunk/lang.inc create mode 100644 programs/system/cpuid/trunk/load_lib.mac create mode 100644 programs/system/cpuid/trunk/macros.inc create mode 100644 programs/system/cpuid/trunk/struct.inc diff --git a/programs/system/cpuid/trunk/CPUID b/programs/system/cpuid/trunk/CPUID new file mode 100644 index 0000000000000000000000000000000000000000..c70adac1297d5ee11908a0df3f22a4b66c1efb96 GIT binary patch literal 146705 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�OI7IG2bNG(E`%Z&>;Pwv2Ba1`7D=gKA_Uhr?~ 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%0Dr)TjxVxyt%` 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%0DSMJuIg=oU%oi93<(Vi97sFWWJh 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 CTilNT literal 0 HcmV?d00001 diff --git a/programs/system/cpuid/trunk/HISTORY.TXT b/programs/system/cpuid/trunk/HISTORY.TXT index 92f2bf9fbe..0864144670 100644 --- a/programs/system/cpuid/trunk/HISTORY.TXT +++ b/programs/system/cpuid/trunk/HISTORY.TXT @@ -37,6 +37,37 @@ ; improve support of Vortex86 ;****************************************************************************** ;HISTORY: +;2.5: CPUID 15/08/2016 (not finished) +;Authors: +; Manasi Thakkar aka mat1854 +;Features: +; (+) added saving of features from fork version 2.26pre in log +; (+) fixed redraw bug, which appears if user execute save dialog +; Known issues: Sempron marked as AthlonXP +; second window doesn't closed when you close main window +; incorrect cache detection for several models of newest Intel CPU, because they designed for another cache detection approach +;----------------------------------------------------------------------------- +;2.4: CPUID 09/08/2016 +;Authors: +; Artem Azhbakov aka marting422 +; Nikita Moiseev aka Powerdogesss +; Manasi Thakkar aka mat1854 +; Sergey Kuzmin aka Wildwest +;Features: +; (+) added detection of Intel Arrandale +; (+) save log in text file; +; (+) use Extended models to turn off multiplier detection for CPU's, which aren't supported; +; (+) show multiplier numbers, if we detect something and show n/a, if we don't; +; (+) merging of different versions from GSOC students; +; (+) added detection of codenames for new Intel CPUs: IvyBridge, SandyBridge-E, Gulftown, Westmere-EX, Clarksfield, Bloomfield,Nehalem-EX, Yorkfield, Dunnington, Clovertown, Merom Conroe, Cedar Mill, Nocona Irwindale, NoconaIrwindale, Dothan, Cedarview, Lincroft and Pineview. +; (+) added detection of AMD k-10 series: AMD Athlon 7750 Black Edition, Opteron 2300-series, Opteron 8300-series, Phenom X4, Phenom X3, Athlon X2, Sempron, Opteron (Shanghai) 2387, Opteron (Magny-Cours), Opteron (Shanghai) 8300 series, Turion II. +; (+) fixed duplication in txt file +; (+) save Codename in text file; +; (+) fixed abstact examples in visualisation block for RSA encoding performance test +;Known issues: Sempron marked as AthlonXP +; second window doesn't closed when you close main window +; incorrect cache detection for several models of newest Intel CPU, because they designed for another cache detection approach +;----------------------------------------------------------------------------- ;2.3: CPUID 12/10/2014 (not finished) ;Authors: Sergey Kuzmin aka Wildwest ; Pavel Rymovskiy aka Heavyiron diff --git a/programs/system/cpuid/trunk/config.inc b/programs/system/cpuid/trunk/config.inc new file mode 100644 index 0000000000..541f904386 --- /dev/null +++ b/programs/system/cpuid/trunk/config.inc @@ -0,0 +1,5 @@ + + + __CPU_type fix p5 + + diff --git a/programs/system/cpuid/trunk/gif2img.inc b/programs/system/cpuid/trunk/gif2img.inc new file mode 100644 index 0000000000..4413ae4e2b --- /dev/null +++ b/programs/system/cpuid/trunk/gif2img.inc @@ -0,0 +1,301 @@ +COLOR_ORDER equ MENUETOS +gif_hash_offset = gif_hash_area + +macro gif2img gifsrc,imgsrc +{ +local hasharea, ReadGIF, nextblock,_null +local globalColor, img_count, cur_info, img_start +local codesize, compsize, bit_count, CC, EOI, Palette +local block_ofs, table_ptr, gifmacend +local no_gc, block_skip, no_comm, noextblock, uselocal +local setPal, filltable, reinit, cycle, zadd, noinc +local notintable, er, zend, nxt, continue, ex, Gif_skipmap +local Gif_get_sym, shift, nextbl, noblock, loop1, exx +local Gif_output, next, loop2 + +_null fix 0x1000 ; 0x1000 + +if ~gifsrc eq esi + mov esi,gifsrc +end if +if ~imgsrc eq edi + mov edi,imgsrc +end if + + if defined gif_hash_offset + mov eax,gif_hash_offset + else + mov eax,hasharea + end if + + call ReadGIF + jmp gifmacend + + if defined gif_hash_offset + else + hasharea: + times 4096 dd 0 ;4096 + end if + +ReadGIF: + push esi edi + mov [table_ptr],eax + mov [cur_info],edi + xor eax,eax + mov [globalColor],eax + mov [img_count],eax + inc eax + cmp dword[esi],'GIF8' + jne er ; signature + mov ecx,[esi+0xa] + inc eax + add esi,0xd + mov edi,esi + bt ecx,7 + jnc nextblock + mov [globalColor],esi + call Gif_skipmap +nextblock: + cmp byte[edi],0x21 + jne noextblock + inc edi + cmp byte[edi],0xf9 ; Graphic Control Ext + jne no_gc + add edi,7 + jmp nextblock +no_gc: + cmp byte[edi],0xfe ; Comment Ext + jne no_comm + inc edi +block_skip: + movzx eax,byte[edi] + lea edi,[edi+eax+1] + cmp byte[edi],0 + jnz block_skip + inc edi + jmp nextblock +no_comm: + cmp byte[edi],0xff ; Application Ext + jne nextblock + add edi,13 + jmp block_skip +noextblock: + cmp byte[edi],0x2c ; image beginning + jne er + inc [img_count] + inc edi + mov esi,[cur_info] + xchg esi,edi +; movsd +; movsd + + mov bp,word[esi+4] + movzx ebx,bp + mov [edi],ebx + + mov bp,word[esi+6] + movzx ebx,bp + mov [edi+4],ebx + + add edi,8 + add esi,8 + + push edi + movzx ecx,word[esi] + inc esi + bt ecx,7 + jc uselocal + push [globalColor] + mov edi,esi + jmp setPal +uselocal: + call Gif_skipmap + push esi +setPal: + movzx ecx,byte[edi] + inc ecx + mov [codesize],ecx + dec ecx + pop [Palette] + lea esi,[edi+1] + mov edi,[table_ptr] + xor eax,eax + cld + lodsb ; eax - block_count + add eax,esi + mov [block_ofs],eax + mov [bit_count],8 + mov eax,1 + shl eax,cl + mov [CC],eax + inc eax + mov [EOI],eax + lea ecx,[eax-1] + mov eax, _null shl 16 +filltable: + stosd + inc eax + loop filltable + pop edi + mov [img_start],edi +reinit: + mov edx,[EOI] + inc edx + push [codesize] + pop [compsize] + call Gif_get_sym + cmp eax,[CC] + je reinit + call Gif_output +cycle: + movzx ebx,ax + call Gif_get_sym + cmp eax,edx + jae notintable + cmp eax,[CC] + je reinit + cmp eax,[EOI] + je zend + call Gif_output +zadd: + push eax + mov eax,[table_ptr] + mov [eax+edx*4],ebx + pop eax + cmp edx,0xFFF + jae cycle + inc edx + bsr ebx,edx + cmp ebx,[compsize] + jne noinc + inc [compsize] +noinc: + jmp cycle +notintable: + push eax + mov eax,ebx + call Gif_output + push ebx + movzx eax,bx + call Gif_output + pop ebx eax + jmp zadd +er: + pop edi + jmp ex +zend: +; mov eax,[.cur_info] ; skip offset to next frame +; mov [eax],edi + mov [cur_info],edi + add esi,2 + xchg esi,edi +nxt: + cmp byte[edi],0 + jnz continue + inc edi + jmp nxt +continue: +; cmp byte[edi],0x3b ;read next frame +; jne nextblock + xor eax,eax + stosd + mov ecx,[img_count] +ex: + pop edi esi + ret + +Gif_skipmap: +; in: ecx - image descriptor, esi - pointer to colormap +; out: edi - pointer to area after colormap + + and ecx,111b + inc ecx ; color map size + mov ebx,1 + shl ebx,cl + lea ebx,[ebx*2+ebx] + lea edi,[esi+ebx] + ret + +Gif_get_sym: + mov ecx,[compsize] + push ecx + xor eax,eax +shift: + ror byte[esi],1 + rcr eax,1 + dec [bit_count] + jnz loop1 + inc esi + cmp esi,[block_ofs] + jb noblock + push eax + xor eax,eax + lodsb + test eax,eax + jnz nextbl + mov eax,[EOI] + sub esi,2 + add esp,8 + jmp exx +nextbl: + add eax,esi + mov [block_ofs],eax + pop eax +noblock: + mov [bit_count],8 +loop1: + loop shift + pop ecx + rol eax,cl +exx: + xor ecx,ecx + ret + +Gif_output: + push esi eax edx + mov edx,[table_ptr] +next: + push word[edx+eax*4] + mov ax,word[edx+eax*4+2] + inc ecx + cmp ax,_null + jnz next + shl ebx,16 + mov bx,[esp] +loop2: + pop ax + + lea esi,[eax+eax*2] + add esi,[Palette] + + if COLOR_ORDER eq MENUETOS + mov esi,[esi] + bswap esi + shr esi,8 + mov [edi],esi + add edi,3 + else + movsw + movsb + end if + + loop loop2 + pop edx eax esi + ret + + globalColor dd 1 + img_count dd 1 + cur_info dd 1 ; image table pointer + img_start dd 1 + codesize dd 1 + compsize dd 1 + bit_count dd 1 + CC dd 1 + EOI dd 1 + Palette dd 1 + block_ofs dd 1 + table_ptr dd 1 + +gifmacend: +} + diff --git a/programs/system/cpuid/trunk/knopka2.bmp b/programs/system/cpuid/trunk/knopka2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1baa1c39908d51a57f4bb63f6bdc965b1ef49027 GIT binary patch literal 6774 zcmd^DeN2^A7=JF`DM&&Af?!rIuq;2ZLL1YlM&YP%Wre!57)zoyQroZu3h1K9mt-58 zeXqi;jrFluWvzdzIa;f9mTB22YGj%SO7Fe)d+zhzbI(2Z(k}eb1fJdd-sk+z?|II7 zfA4e7`@VNY!RA!*ST>HC_!i@vg0I7KB+9k>0V%WGR*=vB((`SO^KCSNKkhb%b*MGS zxqAemfR57$n80!vr{;RUz&hF)AcAG+a%NJAA{x2hSZE#UFr@L*WfF>Fm(T7<*9S$G z`yZu_rb}0WQDc*>>3X-Yzvms1#;Z$D+vF`4b$e-#v<}qy=`#FkPUzL46m+*b;Cq|) zZVfQ>R2Lfa?7mgj(S4AH>!rWD(%lvwIK`KWX>B&mO`(J-6zGf0V^w@oDRC4L#>e6%1Vm-PH6G}$^y>1~Chs-(F;reVz4r6^dYiWKMh(?mHO$Ed zni5Gd5&Q{r(9hMr{C%}FJ5h_#TorCOLJ?5+70m#RCTNi0lBojwjzA1)P%_m2amTs# zB$Zls=B3j1eEOuE{-~qjX6mmeXCbG%W`=!wiJmdKO6Xh@{qQsuUTY7glC-U6y$(zy9i8GTsB z&SeSYZnb+;;~6=;%|}*IBRL%4O|JWjZ-7PbfVA@LI*L;D}KvtWRVm2`O`MQSIh#@KKJ zN7dY6ldEs%=9)!zbH+4o1{$O{=AfEFmZtdKkNC(^tx@4VMCVJ?NcDors8QgsE~lDj z>yYlF-XxI>kd;h3?xbIz^-H1nXLr$Ok24W60sMOhO^xEc_Lmx)f4qj9*npum2%_2( zD|ye8%}X|;{JFvNBScI_6o2N$^!7u%et)l{O*b)yNeaQ>3%Jg6bHtv4<)iN}z*Q6+ zt2u`HUM|rg-N&W~!+CDW<2^#}QvOm8hk0H@U7+{*d$@gDmS5DZSq$R*LFj#k(mY!X zLtcxGqOYIy3sD2X5fj84Vg5GVZHF5j67^FxCB+&&i~!dMIZKfes@jMGu&V}FI= zQYa+Q!980HWIXBABVh~k7p61Zxxp{?%?BA=Fw+Kqt0nAEv!?Sh#Lcp3J{_#|;~T?q zu>ZdMUMZoz@L+{9M5RC!>@pH1WOY=j@T`DGD(w0g6w3#dVu<2u4YLM%S(gJ_m$_Sl zJfvRD|J_hSAy+=`#NR(fd+sF^h#KPpcVyQ?VUB8^eYJDE&vo4$Lyb{^!LO`Ua{D=f z%>M_GNrXNYp1*VpC2+ubk-Syg?~MnyEq67CNu>Vliw!?_4zEBg6V%@FE2unobn=HX zn-Dpp)#cO2cyZwkCiK7~RoA0f?0OOJoAP<;l~0!@#7R#8+R6H9B88tWXdEt2_DM6I zUyH|Zkp>&0E%$J6U4S01OqXJrJSBr?@!skT{m(kHUTn46<3(>(J7bW4T!gq<9N(2C v9P70Ii&Dihf-Zeux_3v6ixV5eByq8anElOs$$*UvfOv^HJGcToETS|6&`%;~M&dzza^FHtAdCr81kB%HQ zvkv-07yP#nfB+ak02B;>K`;b{!3Y=y3t$l}fn~4)R>1){1V`W)oPbmC03N{;cm^-v z6#_s&2n2y42n3DZ21QT;Wl#Z)4uF6Ngunmazu{F2{|PXNvuo_XL zYC$ckCAF+p)T%mAhw4Zjs}psq9@L|HQqSr|y=njrsDU)F2GP*nEDBoWc7!~d``_mO z=RVqU?<6Gv{0T$5ue$#Pq$+gv9N7OxSxQrC--3!S7i~GdB9=XA?PJxsv4`4|=Y9LZ zyIa3lmGj8z^gA7mgI>xkTw6Qw7+>}>wE_cW0 zoBHMsgk!%#W7D`TlUif1Uhnizj2U)vUMPq|MM8Xd>eHJCtw_#}*O>!_1|_6e#>#^KN)d&a(vG4ys2qZvV89k4>w(i&r8fHkM&EaJPzqaFO)2OKOCIZ zyXI;-BwULBaj85h^H|&Ek2Yu3RxNw-htnzJOS5nH>}tGuGNp7)vUzxBEGO-rnqjd+ z&z|km(YFRJPMc4=8uQyHr)@5-YpY27Sz9l)hj&({gO-y3V%5%hek%EbOQp%uhkbmG2uvt(126kR4?M zZk>z8yG9+Uil-c#6MLm{RKtUd_to9**Z?P1Zkp34R{u@e;`D~{@{Sw%>&xnIUOVHS zX^rnLT^ui}8q#F%E2tUV +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of the nor the +; names of its contributors may be used to endorse or promote products +; derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka ''AS IS'' AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;***************************************************************************** +; This macros based on source code: +; - Alexey Teplov / Алексей Теплов +; Mario79, Mario - Marat Zakiyanov / Марат Закиянов +; Diamondz - Evgeny Grechnikov / Евгений Гречников +;------------------------ +; DESCRIPTION +; Macro load_library +; Logick of work. +; A first time we must to check system path, where I belive find a system library. System path is "/sys/lib/". +; If I cannot found my library, i must to check second way. Second way is current dirrectory. +; If we cannot load library, we must show the error message: +; "I'm sorry,the programm cannot found system library box_lib.obj." +; "The find was make on 2 ways: /sys/lib/ and current dirrectory." +; +; +;--------------------------------------------------------------------- +; Macro sys_load_library +; A first time we must to check own path in current dirrectory the program, where I belive find a system library. +; If I cannot found my library, i must to check second way. Second way is system path a "/sys/lib/". +; If we cannot load library, we must show the error message: +; "I'm sorry,the programm cannot found system library box_lib.obj." +; "The find was make on 2 ways: /sys/lib/ and current dirrectory." +; +;--------------------------------------------------------------------- +; How can I use it? +;--------------------------------------------------------------------- +;-Example using single load library +;-universal load library/librarys +;load_library library_name__, cur_dir_path__, library_path__, system_path__, \ +;err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__ +;-if return code =-1 then exit, else normally work +; cmp eax,-1 +; jz exit +;- Well, if you get +; +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +;DATA данные +;Всегда соблюдать последовательность в имени. +;system_path__ db '/sys/lib/' +;library_name__ db 'box_lib.obj',0 +; Если есть желание разъединить, то нужно использовать следующию конструкцию +;system_path__ db '/sys/lib/box_lib.obj',0 +;... любая последовательность других команд и определений. +;library_name__ db 'box_lib.obj',0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;err_message_found_lib__ db 'Sorry I cannot found library box_lib.obj',0 +;head_f_i__: +;head_f_l__ db 'System error',0 +;err_message_import__ db 'Error on load import library 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 + +;--------------------------------------------------------------------- +macro @use_library +{ +local lp1 +local lp2 +local lp3 +local lp4 +local lp5 +local lp6 +local file_name + +library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init' + +align 4 +arrea_xx dd 0 +file_name db '/rd/1/@notify',0 + +align 4 +run_notify_struct: + .Function dd 7 + .Position dd 0 + .Flags dd ? + .Count dd 0 + .Buffer dd 0 + db 0 + .FileName dd file_name +;--------------------------------------------------------------------- + +@library_name equ dword [esp+16] +@cur_dir_path equ dword [esp+12] +@library_path equ dword [esp+8] +@point_dir_name equ dword [esp+4] + +align 4 +@copy_path: + mov esi,@cur_dir_path + mov edi,@library_path + xor eax,eax + cld +align 4 +.lp1: + lodsb + stosb + test eax,eax + jnz .lp1 + mov esi,edi + dec esi ;переход на символ конца строки @cur_dir_path + std +align 4 +.lp2: + lodsb + cmp al,'/' + jnz .lp2 + mov edi,esi + add edi,2 + cld + mov esi,@point_dir_name + test esi,esi + jz .str_lp4 + + ;проверка относительных путей c двумя точками '../' + cmp word[esi],'..' + jne .lp3 + dec edi ;для перехода на '/' +.lp6: + add esi,3 ;пропускаем одно поднятие '../' +.lp5: + dec edi ;идем по папкам + cmp byte[edi],'/' + jnz .lp5 + cmp word[esi],'..' + je .lp6 + inc edi ;для перехода на '/' + + ;копирование относительного пути +align 4 +.lp3: + lodsb + stosb + test eax,eax + jnz .lp3 + dec edi +.str_lp4: + mov esi,@library_name +align 4 +.lp4: + lodsb + stosb + test eax,eax + jnz .lp4 +;--------------------------------------------------------------------- + ret +} + + + +macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load +{ +@use_library +library_fun_memory_alloc equ mem_alloc +library_fun_memory_free equ mem_free +library_fun_memory_realloc equ mem_realloc +library_fun_dll_load equ dll_load +} + + +macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__ +{ +local end_steep +local exit +;--------------------------------------------------------------------- +; loading Box_Lib library + + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz end_steep + +if point_dir_name__ eq + copy_path library_name__, cur_dir_path__, library_path__,0x0 +else + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library +end if + + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz end_steep + show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window + jmp exit + + +align 4 +end_steep: + + import_boxlib myimport, err_message_import__, head_f_i__ ;import +exit: + test eax,eax + jz @f + + notify_window_run [arrea_xx] ; создаем окно @notify + or eax,-1 +@@: + +;--------------------------------------------------------------------- +} + + +macro load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__ +{ +local end_steep +local exit +;--------------------------------------------------------------------- +; loading Box_Lib library + +if point_dir_name__ eq + copy_path library_name__, cur_dir_path__, library_path__,0x0 +else + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library +end if + + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz end_steep + + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz end_steep + + show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window + jmp exit + +align 4 +end_steep: + + import_boxlib myimport, err_message_import__, head_f_i__ ;import +exit: + test eax,eax + jz @f + + notify_window_run [arrea_xx] ; создаем окно @notify + or eax,-1 +@@: + +;--------------------------------------------------------------------- +} +macro sys_load_libraries _start,_end +{ +local exit_lp2 +local lp2 +local lp +local end_steep +local next +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +library_name__ equ [ebp] +cur_dir_path__ equ [ebp+4] +library_path__ equ [ebp+8] +system_path__ equ [ebp+12] +err_message_found_lib__ equ [ebp+16] +head_f_l__ equ [ebp+20] +my_import equ [ebp+24] +err_message_import__ equ [ebp+28] +head_f_i__ equ [ebp+32] +point_dir_name__ equ [ebp+36] +adr_load_lib equ dword [ebp+40] +status_lib equ dword [ebp+44] + + mov ebp,_start + mov ecx,((_end-_start)/ll_struc_size) + +align 4 +lp: push ecx + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz end_steep + + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library + + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz end_steep + + or status_lib,0x1 ; status of code - enable error - not found library + + show_error_window err_message_found_lib__, head_f_l__, ;show error message /create window + jmp next + +align 4 +end_steep: + mov adr_load_lib,eax ;save adr lib in memory + import_boxlib my_import, err_message_import__, head_f_i__ ;import + + test eax,eax + jz next + + or status_lib,0x2 ; status of code - enable error - import error + +next: + pop ecx + add ebp,ll_struc_size + dec ecx + jnz lp + +;---------------------------------- + mov ebp,_start + mov ecx,((_end-_start)/ll_struc_size) + +align 4 +lp2: + mov eax,status_lib + test eax,eax + jz @f + + notify_window_run [arrea_xx] ; создаем окно @notify + or eax,-1 + jmp exit_lp2 + +@@: + add ebp,ll_struc_size + dec ecx + jnz lp2 +exit_lp2: +} + +macro load_libraries _start,_end +{ +local lp2 +local exit_lp2 +local lp +local end_steep +local next +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +library_name__ equ [ebp] +cur_dir_path__ equ [ebp+4] +library_path__ equ [ebp+8] +system_path__ equ [ebp+12] +err_message_found_lib__ equ [ebp+16] +head_f_l__ equ [ebp+20] +my_import equ [ebp+24] +err_message_import__ equ [ebp+28] +head_f_i__ equ [ebp+32] +point_dir_name__ equ [ebp+36] +adr_load_lib equ dword [ebp+40] +status_lib equ dword [ebp+44] + + mov ebp,_start + mov ecx,((_end-_start)/ll_struc_size) + +align 4 +lp: push ecx + + copy_path library_name__, cur_dir_path__, library_path__,point_dir_name__ ;the macros making way /current pach a program/+ name system library + + mcall 68,19,library_path__ ; load of alternative + test eax,eax + jnz end_steep + + mcall 68,19,system_path__ ; load of sys directory + test eax,eax + jnz end_steep + + or status_lib,0x1 ; status of code - enable error - not found library + + show_error_window err_message_found_lib__, head_f_l__ ;show error message /create window + jmp next + +align 4 +end_steep: + mov adr_load_lib,eax ;save adr lib in memory + + import_boxlib my_import, err_message_import__, head_f_i__ ;import + + test eax,eax + jz next + + or status_lib,0x2 ; status of code - enable error - import error + +next: + pop ecx + add ebp,ll_struc_size + dec ecx + jnz lp + +;----------------------------------------------- + mov ebp,_start + mov ecx,((_end-_start)/ll_struc_size) + +align 4 +lp2: + mov eax,status_lib + test eax,eax + jz @f + + notify_window_run [arrea_xx] ; создаем окно @notify + or eax,-1 + jmp exit_lp2 + +@@: + add ebp,ll_struc_size + dec ecx + jnz lp2 +exit_lp2: + +} + + +macro copy_path lib_name,dir_path,lib_path,point_dir_name +{ +pushad ;save all registers + push dword lib_name + push dword dir_path + push dword lib_path + push dword point_dir_name + call @copy_path + + add esp,16 + ;notify_window_run lib_path ;unblok for test load path +popad ;restore all registers +} + +; готовим текст для показа через @notify: +; 1) выделяем память в [arrea_xx] +; 2) копируем err_message и head в [arrea_xx] +macro show_error_window err_message, head +{ +local lp0 +local lp1 + +pushad + mcall 68,11 + mcall 68,12,4096 + push eax + pop dword [arrea_xx] + + mov edi,eax + mov esi,dword head + cld +align 4 +lp0: + movsb + cmp byte[esi],0 + jne lp0 + mov word[edi],'. ' + add edi,2 + mov esi,dword err_message +align 4 +lp1: + movsb + cmp byte[esi],0 + jne lp1 + mov byte[edi],0 +popad + or eax,-1 ;увы +} + +; включаем показ сообщения через @notify: +macro notify_window_run message +{ +push eax ebx + mov eax,message ;параметры для командной строки + mov [run_notify_struct.Flags], eax + mov eax,70 ;run @notify + mov ebx,run_notify_struct + int 0x40 +pop ebx eax +} + + +;входные параметры: +;eax - адрес библиотеки в памяти +;myimport - импортируемые функции +macro import_boxlib myimport, err_message_import__, head_f_i__ +{ +local import_loop +local import_find +local lp +local import_find_next +local import_found +local import_done +local exit +local e.exit +local import_not_found +; initialize import + + mov edx, eax + mov esi,myimport +import_loop: + lodsd ;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции + test eax, eax + jz import_done ;если указатель на имя функции = 0 (в пользовательской программе) + push edx ;сохраняем начало библиотечных указателей на функции +import_find: + mov ebx, [ds:edx] + test ebx, ebx + jz import_not_found ;если указатель на имя функции = 0 (в библиотеке) + push eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе) +lp: + mov cl, [ds:eax] + cmp cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе + jnz import_find_next ;если названия не совпали + test cl, cl + jz import_found ;если названия совпали, и уже конец строки (cl=0) + inc eax + inc ebx + jmp lp +import_find_next: + pop eax + add edx, 8 ;8 = 4 байта указатель на название и 4 байта указатель на функцию + jmp import_find +import_found: + pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек + mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке) + mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd + pop edx ;устанавливаем edx на начало библиотечных функций +;--- проверяем совпадает ли имя экспортированной функции с 'lib_init' +if library_fun_memory_alloc eq 0 +else + cmp dword[ebx],'lib_' + jne import_loop + cmp dword[ebx+4],'init' + jne import_loop +;--- если имя функции совпало с 'lib_init' попадаем сюда + ;подключение функций для работы с памятью + ;push eax + ;call dll.Init + pushad + mov esi,eax + mov eax,library_fun_memory_alloc + mov ebx,library_fun_memory_free + mov ecx,library_fun_memory_realloc + mov edx,library_fun_dll_load + call dword esi + popad +end if + jmp import_loop +import_not_found: + add esp,4 + show_error_window err_message_import__, head_f_i__ ;show error message /create window + jmp e.exit +import_done: + xor eax,eax ;=0 все загрузилось удачно +e.exit: +;--------------------------------------------------------------------- +} +ll_struc_size = 48;($-library_name__) ; constant size of struct +struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, my_import, err_message_import__, head_f_i__,point_dir_name; struct for loading libraries +{ +.library_name__ dd library_name__ ; имя загружаемой библиотеки +.cur_dir_path__ dd cur_dir_path__ ; указатель на буфер в котором содержиться путь от куда была запущена программа + +.library_path__ dd library_path__ ; указатель на буфер в котором будет софоримирован путь к библиотеки, если нужно вычислить путь до либы с места запуска программы, обычно нужно, в случаях, если либа расположена в той же папке +.complete_path dd system_path__ ; путь который четко содержит путь + +.err_message_found_lib__ dd err_message_found_lib__ +.head_f_l__ dd head_f_l__ +.my_import dd my_import +.err_message_import__ dd err_message_import__ +.head_f_i__ dd head_f_i__ +if point_dir_name eq +.point_dir_name__ dd 0x0 +else +.point_dir_name__ dd point_dir_name ; имя вложенной дирректории в кторой храняться подгружаемые модули. +end if +.adr_load_lib dd 0x0 +.status_lib dd 0x0 ;status of load library +; +} diff --git a/programs/system/cpuid/trunk/logos.inc b/programs/system/cpuid/trunk/logos.inc index 4bee3a65dd..72946bfd06 100644 --- a/programs/system/cpuid/trunk/logos.inc +++ b/programs/system/cpuid/trunk/logos.inc @@ -1,24 +1,26 @@ amd: -file 'amd.gif' ;include gif file +file 'amd.gif' ;include gif file cyrix: file 'cyrix.gif' ;include gif file idt: -file 'idt.gif' ;include gif file +file 'idt.gif' ;include gif file intel: file 'intel.gif' ;include gif file transmeta: -file 'transmet.gif' ;include gif file +file 'transmet.gif' ;include gif file via: -file 'via.gif' ;include gif file +file 'via.gif' ;include gif file vortex: -file 'vortex.gif' ;include gif file +file 'vortex.gif' ;include gif file knopka: -file 'knopka.gif' ;include gif file +file 'knopka.gif' ;include gif file +knopka2: +file 'knopka2.gif' ;gif button Save in file \ No newline at end of file diff --git a/programs/system/cpuid/trunk/macros.inc b/programs/system/cpuid/trunk/macros.inc new file mode 100644 index 0000000000..9a42c0d50d --- /dev/null +++ b/programs/system/cpuid/trunk/macros.inc @@ -0,0 +1,532 @@ + + + @^ fix macro comment { + ^@ fix } + + ; ------------------------- + macro library [lname,fname] + { + forward + dd __#lname#_library_table__,__#lname#_library_name__ + common + dd 0 + forward + align 4 + __#lname#_library_name__ db fname,0 + } + + macro import lname,[name,sname] + { + common + align 4 + __#lname#_library_table__: + forward + if used name + name dd __#name#_import_name__ + end if + common + dd 0 + forward + if used name + align 4 + __#name#_import_name__ db sname,0 + end if + } + + macro export [name,sname] + { + forward + dd __#name#_export_name__,name + common + dd 0 + forward + align 4 + __#name#_export_name__ db sname,0 + } + ; ------------------------- + + 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 szZ name,[data] { ; same as sz, but with 0 at the end of line (ASCIIZ string) [dunkaist] + common + if used name + name db data,0 + .size = $-name-1 + end if + } + sz0 fix szZ + + 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 { ; mike.dld + __mov eax,a + __mov ebx,b + __mov ecx,c + __mov edx,d + __mov esi,e + __mov edi,f + + int 0x40 + } + + + ; ------------------------- + 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 KolibriOS + 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 + + diff --git a/programs/system/cpuid/trunk/struct.inc b/programs/system/cpuid/trunk/struct.inc new file mode 100644 index 0000000000..5b60756e32 --- /dev/null +++ b/programs/system/cpuid/trunk/struct.inc @@ -0,0 +1,184 @@ + + + + ; 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 \} } + +