diff --git a/kernel/trunk/boot/bootcode.inc b/kernel/trunk/boot/bootcode.inc index 4fc1a20d11..b2965c304b 100644 --- a/kernel/trunk/boot/bootcode.inc +++ b/kernel/trunk/boot/bootcode.inc @@ -116,6 +116,16 @@ start_of_code: @@: ; \end{diamond}[02.12.2005] + cmp cx,'HA' ; яю ЁхушёЄЁрь юяЁхфхы хЄё  чруЁєчър ё тшэЄр + jnz no_hd_load + cmp dx,'RD' + jnz no_hd_load + mov word [bx_from_load], bx ; {SPraid}[13.03.2007] + jmp load_next +no_hd_load: + mov word [bx_from_load], 'r1' ; if work with floppy +load_next: + ; set up stack mov ax, 3000h mov ss, ax diff --git a/kernel/trunk/build.bat b/kernel/trunk/build.bat index 1effb6ee53..b7d4159d3a 100644 --- a/kernel/trunk/build.bat +++ b/kernel/trunk/build.bat @@ -2,7 +2,7 @@ set languages=en ru ge et set drivers=sound sis infinity ati2d vmode ps2mouse -set targets=all kernel drivers skins clean +set targets=all kernel drivers skins lib clean call :Check_Target %1 for %%a in (all kernel) do if %%a==%target% call :Check_Lang %2 @@ -60,6 +60,7 @@ goto :eof call :Target_kernel call :Target_drivers call :Target_skins + call :Target_lib goto :eof @@ -87,6 +88,15 @@ goto :eof cd .. goto :eof +:Target_lib + echo *** building libs ... + + if not exist bin\lib mkdir bin\lib + cd lib + fasm -m 65536 inifiles.asm ..\bin\lib\inifiles.obj + if not %errorlevel%==0 goto :Error_FasmFailed + cd .. +goto :eof :Target_clean echo *** cleaning ... diff --git a/kernel/trunk/core/conf_lib.inc b/kernel/trunk/core/conf_lib.inc new file mode 100644 index 0000000000..43e8533d81 --- /dev/null +++ b/kernel/trunk/core/conf_lib.inc @@ -0,0 +1,20 @@ +;------------------------------------------------------------------------- +; +; Файл конфигурации +; +; +; SPraid +; +;------------------------------------------------------------------------- + +conf_file_loaded: db 0 ; флаг загрузки конфига + +; загрузка ини файла в библиотеку +proc load_conf_file + pushad + invoke ini.load,.fname + mov [conf_file_loaded],byte 1 + popad + ret + .fname db '%sys%/sys.conf',0 +endp \ No newline at end of file diff --git a/kernel/trunk/core/dll.inc b/kernel/trunk/core/dll.inc index f1f8783d2c..8cf3a0d0fc 100644 --- a/kernel/trunk/core/dll.inc +++ b/kernel/trunk/core/dll.inc @@ -700,8 +700,8 @@ proc load_driver stdcall, driver_name:dword endl lea edx, [file_name] - mov dword [edx], '/rd/' - mov dword [edx+4], '1/dr' + mov dword [edx], '%sys' + mov dword [edx+4], '%/dr' mov dword [edx+8], 'iver' mov word [edx+12], 's/' mov esi, [driver_name] diff --git a/kernel/trunk/core/ext_lib.inc b/kernel/trunk/core/ext_lib.inc new file mode 100644 index 0000000000..4b732502c0 --- /dev/null +++ b/kernel/trunk/core/ext_lib.inc @@ -0,0 +1,326 @@ +;============================================================================ +; +; ╟руЁєчър тэх°эшї ЇєэъЎшщ  фЁр +; +; +; +; +; +; +;============================================================================ +macro library [name,fname] +{ + forward + dd __#name#_library_table__,__#name#_library_name__ + common + dd 0 + forward + align 4 + __#name#_library_name__ db fname,0 +} + +macro import lname,[name,sname] +{ + common + align 4 + __#lname#_library_table__: + forward + name dd __#name#_import_name__ + common + dd 0 + forward + align 4 + __#name#_import_name__ db sname,0 +} + +macro export [name,sname] +{ + forward + dd __#name#_export_name__,name + common + dd 0 + forward + align 4 + __#name#_export_name__ db sname,0 +} + + + +align 4 ; чруЁєчър сшсышюЄхъш ё єёыютшхь, ўЄю сєфшЄ шёяюы№ч√трЄ№ё  шч  фЁр +proc load_k_library stdcall, file_name:dword + locals + coff dd ? + sym dd ? + strings dd ? + img_size dd ? + img_base dd ? + exports dd ? + endl + + cli + + stdcall load_file, [file_name] + test eax, eax + jz .fail + + mov [coff], eax + movzx ecx, [eax+CFH.nSections] + xor ebx, ebx + + lea edx, [eax+20] +@@: + add ebx, [edx+CFS.SizeOfRawData] + add ebx, 15 + and ebx, not 15 + add edx, COFF_SECTION_SIZE + dec ecx + jnz @B + mov [img_size], ebx + + stdcall kernel_alloc, [img_size] + + test eax, eax + jz .fail + mov [img_base], eax + + mov edx, [coff] + movzx ebx, [edx+CFH.nSections] + mov edi, [img_base] + lea eax, [edx+20] +@@: + mov [eax+CFS.VirtualAddress], edi + mov esi, [eax+CFS.PtrRawData] + test esi, esi + jnz .copy + add edi, [eax+CFS.SizeOfRawData] + jmp .next +.copy: + add esi, edx + mov ecx, [eax+CFS.SizeOfRawData] + cld + rep movsb +.next: + add edi, 15 + and edi, not 15 + add eax, COFF_SECTION_SIZE + dec ebx + jnz @B + + mov ebx, [edx+CFH.pSymTable] + add ebx, edx + mov [sym], ebx + mov ecx, [edx+CFH.nSymbols] + add ecx,ecx + lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE + add ecx, [sym] + mov [strings], ecx + + lea eax, [edx+20] + + stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ + [strings], dword 0 + test eax, eax + jnz @F + +@@: + mov edx, [coff] + movzx ebx, [edx+CFH.nSections] + mov edi, 0 + lea eax, [edx+20] +@@: + add [eax+CFS.VirtualAddress], edi ;patch user space offset + add eax, COFF_SECTION_SIZE + dec ebx + jnz @B + + add edx, 20 + stdcall fix_coff_relocs, [coff], edx, [sym] + + mov ebx, [coff] + stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS + mov [exports], eax + + stdcall kernel_free, [coff] + + mov eax, [exports] + ret +.fail: + xor eax, eax + ret +endp + + +proc dll.Load, import_table:dword + mov esi,[import_table] + .next_lib: mov edx,[esi] + or edx,edx + jz .exit + push esi + + mov edi,s_libname + + mov esi,sys_path + @@: lodsb + stosb + or al,al + jnz @b + dec edi + mov [edi], dword '/lib' + mov [edi+4],byte '/' + add edi,5 + pop esi + push esi + mov esi,[esi+4] + @@: lodsb + stosb + or al,al + jnz @b + + pushad + stdcall load_k_library,s_libname + mov [esp+28],eax + popad + or eax,eax + jz .fail + stdcall dll.Link,eax,edx + stdcall dll.Init,[eax+4] + pop esi + add esi,8 + jmp .next_lib + .exit: xor eax,eax + ret + .fail: add esp,4 + xor eax,eax + inc eax + ret +endp + +proc dll.Link, exp:dword,imp:dword + push eax + mov esi,[imp] + test esi,esi + jz .done + .next: lodsd + test eax,eax + jz .done + stdcall dll.GetProcAddress,[exp],eax + or eax,eax + jz @f + mov [esi-4],eax + jmp .next + @@: mov dword[esp],0 + .done: pop eax + ret +endp + +proc dll.Init, dllentry:dword + pushad + mov eax,mem.Alloc + mov ebx,mem.Free + mov ecx,mem.ReAlloc + mov edx,dll.Load + stdcall [dllentry] + popad + ret +endp + +proc dll.GetProcAddress, exp:dword,sz_name:dword + mov edx,[exp] + .next: test edx,edx + jz .end + stdcall strcmp,[edx],[sz_name] + test eax,eax + jz .ok + add edx,8 + jmp .next + .ok: mov eax,[edx+4] + .end: ret +endp + +;----------------------------------------------------------------------------- +proc mem.Alloc size ;///////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx +; mov eax,[size] +; lea ecx,[eax+4+4095] +; and ecx,not 4095 +; stdcall kernel_alloc, ecx +; add ecx,-4 +; mov [eax],ecx +; add eax,4 + + stdcall kernel_alloc, [size] + + pop ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.ReAlloc mptr,size;/////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + push ebx ecx esi edi eax + mov eax,[mptr] + mov ebx,[size] + or eax,eax + jz @f + lea ecx,[ebx+4+4095] + and ecx,not 4095 + add ecx,-4 + cmp ecx,[eax-4] + je .exit + @@: mov eax,ebx + call mem.Alloc + xchg eax,[esp] + or eax,eax + jz .exit + mov esi,eax + xchg eax,[esp] + mov edi,eax + mov ecx,[esi-4] + cmp ecx,[edi-4] + jbe @f + mov ecx,[edi-4] + @@: add ecx,3 + shr ecx,2 + cld + rep movsd + xchg eax,[esp] + call mem.Free + .exit: + pop eax edi esi ecx ebx + ret +endp + +;----------------------------------------------------------------------------- +proc mem.Free mptr ;////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; mov eax,[mptr] +; or eax,eax +; jz @f +; push ebx ecx +; lea ecx,[eax-4] +; stdcall kernel_free, ecx +; pop ecx ebx +; @@: ret + stdcall kernel_free, [mptr] + ret +endp + +proc strcmp, str1:dword,str2:dword + push esi edi + mov esi,[str1] + mov edi,[str2] + xor eax,eax + @@: lodsb + scasb + jne .fail + or al,al + jnz @b + jmp .ok + .fail: or eax,-1 + .ok: pop edi esi + ret +endp + + +s_libname db 64 dup (0) diff --git a/kernel/trunk/data16.inc b/kernel/trunk/data16.inc index fc58716b8d..af978b3167 100644 --- a/kernel/trunk/data16.inc +++ b/kernel/trunk/data16.inc @@ -5,6 +5,10 @@ flm db 0 preboot_lfb db 0 preboot_bootlog db 0 +bx_from_load: dw 0 ; ёЄЁєъЄєЁр фы  їЁрэхэш  ярЁрьхЄЁют- юЄъєфр ур°Ёєчшышё№, схЁхЄё  эшцх шч bx ; {SPraid}[13.03.2007] + ; a,b,c,d - тшэўхёЄхЁ√, r - Ёрь фшёъ + ; # фшёър... ёшьтюы, р эх срщЄ. '1', р эх 1 + align 4 old_ints_h: dw 0x400 diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc index 6266f19427..5fe9fdc99d 100644 --- a/kernel/trunk/data32.inc +++ b/kernel/trunk/data32.inc @@ -82,13 +82,21 @@ szSTART db 'START',0 szEXPORTS db 'EXPORTS',0 szIMPORTS db 'IMPORTS',0 -firstapp db '/rd/1/LAUNCHER',0 -char db 'FONTS/CHAR.MT',0 -char2 db 'FONTS/CHAR2.MT',0 +firstapp db '%sys%/LAUNCHER',0 + char dd 0,0,0 + dd 2560 + dd FONT_I + db '%sys%/FONTS/CHAR.MT',0 + char2 dd 0,0,0 + dd 2560 + dd FONT_II + db '%sys%/FONTS/CHAR2.MT',0 + + bootpath db '/KOLIBRI ' bootpath2 db 0 vmode db 'drivers/VMODE.MDR',0 -vrr_m db '/rd/1/VRR_M',0 +vrr_m db '%sys%/VRR_M',0 kernel_file db 'KERNEL MNT' @@ -105,6 +113,16 @@ drawbar dd __sys_drawbar.forced putpixel dd __sys_putpixel ; } mike.dld +; SPraid.simba { 6.05.2007 +; ъюэёЄрэЄ√ фы  юсЁр∙хэш  ъ шэш Їрщыє фы  юяЁхфхыхэш  єёЄЁющёЄт +; + +ini_dev_sect: db 'dev',0 ; ёхъЎш  юс єёЄЁющёЄтрї +ini_com1_mouse_detect: db 'com1_mouse',0 +ini_com2_mouse_detect: db 'com2_mouse',0 + +dev_dev_val: db '2',0 ; фрыхх хёыш 2 - Єю фхЄхъЄшЁютрЄ№ +; } SPraid.simba align 4 keyboard dd 1 diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index e14823b447..f8eace7e8a 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -6,6 +6,9 @@ $Revision$ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +image_of_eax EQU esp+44 ;36 +image_of_ebx EQU esp+32 ;24 + ; System function 70 - files with long names (LFN) ; diamond, 2006 @@ -79,6 +82,12 @@ virtual_root_query: dd 0 endg +end_of_file_system_lfn: + pop edx + stdcall kernel_free, edx + ret + + file_system_lfn: ; in: eax->fileinfo block ; operation codes: @@ -93,6 +102,53 @@ file_system_lfn: ; 8 : delete file ; 9 : create directory + ; чрьхэр рфЁхёр тючтЁрЄр + push eax + stdcall kernel_alloc, 200 + mov edx,eax + pop eax + push edx + push end_of_file_system_lfn + mov ebx,edx + + mov ecx, [eax] + mov [ebx],ecx + + add ebx,4 + mov ecx, [eax+4] + mov [ebx],ecx + + add ebx,4 + mov ecx, [eax+8] + mov [ebx],ecx + + add ebx,4 + mov ecx, [eax+12] + mov [ebx],ecx + + add ebx,4 + mov ecx, [eax+16] + mov [ebx],ecx + + add ebx,4 + push edx ; !!!!!!!!!!!!!!!!!!! + ; eax - yэрўрыю ёЄрЁюую яръхЄр + ; edx - эрўрыю эютюую яръхЄр + ; ebx - ъєфр ыюцшЄ№ ёЄЁюъє + add eax,20 + mov cl, [eax] + test cl,cl + jnz @f + mov eax,[eax+1] +@@: + stdcall full_file_name,eax,ebx + pop eax + + + + + + ; add eax, std_application_base_address ; parse file name xchg ebx, eax @@ -115,13 +171,13 @@ file_system_lfn: ; add ebx, new_app_base .l1: call fs_execute ; ebp, ebx, edx - mov [esp+36], eax + mov [image_of_eax], eax ret @@: cmp al, '/' jz @f .notfound: - mov dword [esp+36], 5 ; file not found + mov dword [image_of_eax], 5 ; file not found ret @@: cmp byte [esi], 0 @@ -223,15 +279,15 @@ file_system_lfn: js @f mov al, ERROR_END_OF_FILE @@: - mov [esp+36], eax - mov [esp+24], ebx + mov [image_of_eax], eax + mov [image_of_ebx], ebx ret ; directory / .rootdir: cmp dword [ebx], 1 ; read folder? jz .readroot .access_denied: - mov dword [esp+36], 10 ; access denied + mov dword [image_of_eax], 10 ; access denied ret .readroot: @@ -299,8 +355,8 @@ file_system_lfn: js @f mov al, ERROR_END_OF_FILE @@: - mov [esp+36], eax - mov [esp+24], ebx + mov [image_of_eax], eax + mov [image_of_ebx], ebx ret .found1: @@ -338,7 +394,7 @@ file_system_lfn: ; in: ecx = partition number ; esi -> relative (for device) name ; ebx -> fileinfo -; out: [esp+36]=image of eax, [esp+24]=image of ebx +; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx fs_OnRamdisk: cmp ecx, 1 @@ -351,11 +407,11 @@ fs_OnRamdisk: ; add edx, std_application_base_address add ebx, 4 call dword [fs_RamdiskServices + eax*4] - mov [esp+36], eax - mov [esp+24], ebx + mov [image_of_eax], eax + mov [image_of_ebx], ebx ret .not_impl: - mov dword [esp+36], 2 ; not implemented + mov dword [image_of_eax], 2 ; not implemented ret fs_NotImplemented: @@ -389,8 +445,8 @@ fs_OnFloppy: add ebx, 4 call dword [fs_FloppyServices + eax*4] and [flp_status], 0 - mov [esp+36], eax - mov [esp+24], ebx + mov [image_of_eax], eax + mov [image_of_ebx], ebx ret fs_FloppyServices: @@ -440,7 +496,7 @@ fs_OnHd: .nf: call free_hd_channel and [hd1_status], 0 - mov dword [esp+36], 5 ; not found + mov dword [image_of_eax], 5 ; not found ret @@: mov [fat32part], ecx @@ -457,13 +513,13 @@ fs_OnHd: call dword [fs_HdServices + eax*4] call free_hd_channel and [hd1_status], 0 - mov [esp+36], eax - mov [esp+24], ebx + mov [image_of_eax], eax + mov [image_of_ebx], ebx ret .not_impl: call free_hd_channel and [hd1_status], 0 - mov dword [esp+36], 2 ; not implemented + mov dword [image_of_eax], 2 ; not implemented ret fs_HdServices: @@ -520,7 +576,7 @@ fs_OnCd: .nf: call free_cd_channel and [cd_status], 0 - mov dword [esp+36], 5 ; not found + mov dword [image_of_eax], 5 ; not found ret @@: mov ecx, [ebx+12] @@ -533,13 +589,13 @@ fs_OnCd: call dword [fs_CdServices + eax*4] call free_cd_channel and [cd_status], 0 - mov [esp+36], eax - mov [esp+24], ebx + mov [image_of_eax], eax + mov [image_of_ebx], ebx ret .not_impl: call free_cd_channel and [cd_status], 0 - mov dword [esp+36], 2 ; not implemented + mov dword [image_of_eax], 2 ; not implemented ret fs_CdServices: diff --git a/kernel/trunk/fs/parse_fn.inc b/kernel/trunk/fs/parse_fn.inc new file mode 100644 index 0000000000..7f6ac411e8 --- /dev/null +++ b/kernel/trunk/fs/parse_fn.inc @@ -0,0 +1,183 @@ +;------------------------------------------------------------------------- +; +; Замена имен файлов +; +; +; SPraid +; +;------------------------------------------------------------------------- + +; перебирает по файлу варианты замен +proc full_file_name stdcall,sourc,dest +locals + param rb 60 + val rb 60 + tmpsrc rb 60 ; временное хранение преобразования +endl + pushad + + + mov esi,[sourc] + mov edi,ebp + add edi,tmpsrc-ebp +@@: + lodsb + stosb + or al,al + jnz @b + + mov al,[conf_file_loaded] ; требуется при обращении к первому файлу (конфигу) + or al,al + jnz @use_replace + + jmp full_file_name_exit + + +;-------------------------------- + @use_replace: + + xor eax,eax +.loop: + push eax + mov ebx,ebp + add ebx,param-ebp + mov ecx,ebp + add ecx,val-ebp + invoke ini.get_par,sect, ebx, ecx, eax + + mov bl,[param] + or bl,bl + jz .done + + mov eax,ebp + add eax,tmpsrc-ebp + mov ebx,ebp + add ebx,param-ebp + mov ecx,ebp + add ecx,val-ebp + mov edx,[dest] + + stdcall full_file_name_parse, eax,edx,ebx,ecx + + mov esi,[dest] + mov edi,ebp + add edi,tmpsrc-ebp +@@: + lodsb + stosb + or al,al + jnz @b + + pop eax + inc eax + jmp .loop + +.done: + pop eax +full_file_name_exit: + + mov eax,ebp + add eax,tmpsrc-ebp + stdcall full_file_name_parse , eax , [dest], sysdir_ , sys_path + popad + ret +endp + +sect: db 'path',0 + +; +; Преобразовать имя в полное. Если в начале стоит +; sourc - ссылка на строку... +; dest - ссылка на буфер куда результат ложить +; def - строка шаблон для поиска +; dval - к чему приравнивать шаблон +proc full_file_name_parse stdcall,sourc,dest,def,dval + ; для одного + pushad + + mov eax,[sourc] + mov ebx,[def] +@@: + mov dl,[ebx] + mov cl,[eax] + cmp cl,0 + je @@bad_s + cmp dl,0 + je @@good + + or cl,0x20 + or dl,0x20 + cmp cl,dl + jne @@bad + + inc eax + inc ebx + jmp @b + +@@bad_s: + cmp dl,0 + je @@good + +@@bad: + mov edi,[dest] + mov esi,[sourc] +@@: + lodsb + stosb + or al,al + jnz @b + jmp @@ret_ok + +@@good: + push eax + mov edi,[dest] + mov esi,[dval] +@@: + lodsb + stosb + or al,al + jnz @b + +@@goodl: + pop esi + dec edi +@@: + lodsb + stosb + or al,al + jnz @b + +@@ret_ok: + popad + ret + +endp + + sys_dir_mess: db 'System dir is ' + sys_path: db '/HD0/1/KOLIBRI',0,0 + sysdir_ db '%sys%',0 + +; берет параметры bx_from_load и исчит файл конфигурации +Parser_params: + pushad + mov ax,[BOOT_VAR+bx_from_load] + cmp al,'r' ; рам диск + jnz @f + mov [sys_path],dword '/RD/' + mov [sys_path+4],byte ah + mov [sys_path+5],word 0 ;0x002F + jmp .done +@@: + sub al,49 + mov [sys_path],dword '/HDa' + mov [sys_path+3],byte al + mov [sys_path+4],byte '/' + mov [sys_path+5],byte ah + mov [sys_path+6],dword '/KOL' + mov [sys_path+10],dword 'IBRI' + mov [sys_path+14],word 0 ;0x002F + +.done: + popad + ret + \ No newline at end of file diff --git a/kernel/trunk/gui/skincode.inc b/kernel/trunk/gui/skincode.inc index 517afe1530..6fe694ba42 100644 --- a/kernel/trunk/gui/skincode.inc +++ b/kernel/trunk/gui/skincode.inc @@ -16,9 +16,25 @@ load_skin_file: mov ebx,1 or ecx,-1 mov esi,12 - call fileread + pushad + push eax + mov [skin_to_load.adr],edx + + mov [skin_to_load.stradr],_skin_file_default + mov eax,skin_to_load + call file_system_lfn + pop eax + popad ret +skin_to_load: + dd 0,0,0 + dd 64*1024 + .adr dd 0 + db 0 + .stradr dd 0 + + struct SKIN_HEADER .ident dd ? .version dd ? diff --git a/kernel/trunk/gui/skindata.inc b/kernel/trunk/gui/skindata.inc index 96e6d8bb0f..852ac65d17 100644 --- a/kernel/trunk/gui/skindata.inc +++ b/kernel/trunk/gui/skindata.inc @@ -11,7 +11,7 @@ $Revision$ ; iglobal - _skin_file_default db 'DEFAULT SKN',0 + _skin_file_default db '%sys%/DEFAULT.SKN',0 endg struct SKIN_DATA diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 2be74435f4..c1bc98bf07 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -536,20 +536,40 @@ include 'boot/rdload.inc' include 'vmodeld.inc' ;!!!!!!!!!!!!!!!!!!!!!!! + call Parser_params + + mov ax,[BOOT_VAR+bx_from_load] + cmp ax,'r1' ; хёыш ёЁрь фшёъ - Єю эх уЁєчшЄ№ сшсышюЄхъш + je no_lib_load +; LOADING LIBRARES + stdcall dll.Load,@IMPORT ; SPraid - чруЁєчър ЇєэъЎшюэрыр (яюър ўЄю шэш Їрщы) + call load_conf_file ; prepare configuration file +no_lib_load: + ; LOAD FONTS I and II - mov esi,char - xor ebx,ebx - mov ecx,2560 - mov edx,FONT_I - call fs_RamdiskRead +; mov esi,char +; xor ebx,ebx +; mov ecx,2560 +; mov edx,FONT_I +; call fs_RamdiskRead - mov esi,char2 - xor ebx,ebx - mov ecx,2560;26000 - mov edx,FONT_II - call fs_RamdiskRead +; mov esi,char2 +; xor ebx,ebx +; mov ecx,2560;26000 +; mov edx,FONT_II +; call fs_RamdiskRead + pushad + push eax + mov eax,char + call file_system_lfn + mov eax,char2 + call file_system_lfn + pop eax + popad + + mov esi,boot_fonts call boot_log @@ -745,22 +765,58 @@ include 'vmodeld.inc' cmp byte [BOOT_VAR+0x9030],1 jne no_load_vrr_m - mov ebp, vrr_m +; mov ebp, vrr_m +; xor ebx, ebx +; xor edx, edx +; call fs_execute +; cmp eax,2 ; if vrr_m app found (PID=2) +; je first_app_found + + + stdcall kernel_alloc, 0x100 + push eax + mov ebx,eax + stdcall full_file_name,vrr_m,eax + mov ebp, eax + xor ebx, ebx xor edx, edx call fs_execute + pop ebx + push eax + stdcall kernel_free, ebx + pop eax cmp eax,2 ; if vrr_m app found (PID=2) je first_app_found no_load_vrr_m: - mov ebp, firstapp +; mov ebp, firstapp +; xor ebx, ebx +; xor edx, edx +; call fs_execute +; cmp eax,2 ; continue if a process has been loaded +; je first_app_found +; mov eax, 0xDEADBEEF ; otherwise halt +; hlt + + stdcall kernel_alloc, 0x100 + push eax + mov ebx,eax + stdcall full_file_name,firstapp,eax + mov ebp, eax xor ebx, ebx xor edx, edx call fs_execute + pop ebx + push eax + stdcall kernel_free, ebx + pop eax cmp eax,2 ; continue if a process has been loaded je first_app_found mov eax, 0xDEADBEEF ; otherwise halt hlt + + first_app_found: cli @@ -3372,7 +3428,7 @@ checkpixel: ret iglobal - cpustring db '/RD/1/CPU',0 + cpustring db '%sys%/CPU',0 endg uglobal diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index b3c497a304..8966dcaac1 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -244,3 +244,15 @@ include "hid/mousedrv.inc" include "hid/set_dtc.inc" ;% -include + +;parser file names +include "fs/parse_fn.inc" + +; work with conf lib +include "core/conf_lib.inc" + +; load external lib +include "core/ext_lib.inc" + +; list of external functions +include "lib_func.inc" \ No newline at end of file diff --git a/kernel/trunk/lib/inifiles.asm b/kernel/trunk/lib/inifiles.asm new file mode 100644 index 0000000000..fd999ec331 --- /dev/null +++ b/kernel/trunk/lib/inifiles.asm @@ -0,0 +1,372 @@ +;----------------------------------------------------------------------------- +; Copyright (c) 2007, SPraid +;----------------------------------------------------------------------------- +format MS COFF + +public EXPORTS + +include '../proc32.inc' +include 'proc.inc' + +purge section +section '.flat' code readable align 16 + +mem.alloc dd ? +mem.free dd ? +mem.realloc dd ? +dll.load dd ? + +block_count: dd 0 +sect_num: dd 0 +data_adr: dd 0 +data_adr_last dd 0 + +filei_len EQU 0x4000 +filei dd ?;0x4000 ; ссылки на данные - типа там храниться будит... вначале там - скока нада выделить +sec_i_len EQU 0x4000 +sec_i dd ?;0x4000 +dat_i_len EQU 0x4000 +dat_i dd ?;0x4000 + + +;----------------------------------------------------------------------------- +proc lib_init ;////////// Инцилизация библиотеки (автоматический вызов)/////// +;----------------------------------------------------------------------------- + mov [mem.alloc],eax + mov [mem.free],ebx + mov [mem.realloc],ecx + mov [dll.load],edx + xor eax,eax + inc eax + ret +endp + + +; структура блока + block_adr EQU 0 + block_name EQU block_adr + 4 + block_i_count EQU block_name + 30 + block_len EQU block_i_count + 4 +; структура данных + data_name EQU 0 + data_prev EQU data_name+200 + data_next EQU data_prev+4 + data_len EQU data_next+4 + + + + +; взять следущий пару занчения ключа +proc ini.get_par stdcall, sect:dword, param:dword, val:dword, num:dword + + pushad + mov edx,[block_count] + mov edi,[sect] + mov esi,[sec_i] + add esi,block_name +@@: call strcmp + cmp eax,-1 + jne .sec_found + dec edx + or edx,edx + jz .sec_not_found + add esi,block_len + jmp @b + .sec_found: + + mov eax,esi + sub eax,block_name + add eax, block_i_count + mov eax,[eax] + ; eax - count + mov ebx,[num] ; test max count + ; ebx - num + cmp eax,ebx + jle .param_not_found + + sub esi,4 + mov esi,[esi] + ; esi - first adr + mov eax,ebx ; eax - num +@@: + or eax,eax + je .param_found + dec eax + add esi,data_next + mov esi,[esi] + jmp @b + + .param_found: + mov ebx,esi + mov eax,[param] + mov cl,'=' + call copy_s + add ebx,eax + add ebx,1 + mov eax,[val] + mov cl,0 + call copy_s + jmp .ok + + .param_not_found: + .sec_not_found: +; set_default_.... 0 + mov eax,[param] + mov [eax],byte 0 + mov eax,[val] + mov [eax],byte 0 + .ok: + popad + ret + + +endp +;------------------------------------------------------ +proc ini.get_str stdcall, sect:dword, param:dword, buff:dword, default:dword + ; sect - секция + ; param - параметр + ; buff - буфер + ; default - если отсутствует + pushad + mov edx,[block_count] + mov edi,[sect] + mov esi,[sec_i] + add esi,block_name +@@: call strcmp + cmp eax,-1 + jne .sec_found + dec edx + or edx,edx + jz .sec_not_found + add esi,block_len + jmp @b + .sec_found: + + mov eax,esi + sub eax,block_name + add eax, block_i_count + mov eax,[eax] + ; eax - count + sub esi,4 + mov esi,[esi] + ; esi - first adr + mov edi,[param] + push eax + +@@: + mov cl,'=' + mov eax,text + mov ebx,esi + call copy_s + mov edx,eax + push esi + mov esi,text + call strcmp + pop esi + cmp eax,-1 + jne .param_found + pop eax + dec eax + or eax,eax + jz .sec_not_found + push eax + add esi,data_next + mov esi,[esi] + jmp @b + .param_found: + mov ebx,esi + add ebx,edx + add ebx,1 + pop eax + mov eax,[buff] + mov cl,0 + call copy_s + jmp .ok + .param_not_found: + .sec_not_found: +; set_default_text + mov eax,[buff] + mov ebx,[default] + mov cl,0 + call copy_s + .ok: + popad + ret +endp +;-------------------------------------------------------------------------------- + + + + + + + + + + + + + + +;----------------------------------------------------------------------------- +proc ini.load stdcall filename ;/(загрузка ини файла)///////////////////////// +locals + reads: dd 0,0,0 + fsize dd 0 + addr dd filei + nulls db 0 + fname dd 0 +endl + mov [reads],dword 0 + mov [reads+4],dword 0 + mov [reads+8],dword 0 + mov [nulls],byte 0 + + stdcall get_filesize, [filename] + mov [fsize],eax + + inc eax + + mov ebx,eax + + invoke mem.alloc,eax + mov [filei],eax + + mov [addr],eax + + add eax,ebx + mov [eax], byte 0 ;null string + + invoke mem.alloc,sec_i_len + mov [sec_i],eax + + invoke mem.alloc,dat_i_len + mov [dat_i],eax + mov [data_adr],eax + + mov eax,[filename] + mov [fname],eax + + mov eax,70 + mov ebx , reads-ebp + add ebx,ebp + int 0x40 + + stdcall readlnf + + xor eax,eax + ret + + +endp + + +proc readlnf + pushad + mov [.pos],dword 0 +.char: + mov eax,[.pos] + inc eax + mov [.pos],eax + + sub eax,1 + add eax,[filei] + mov al,[eax] ; символ от позиции + ; тип по первому символу + cmp al,' ' + je .char + cmp al,9 + je .char + cmp al,13 + je .char + cmp al,10 + je .char + cmp al,'[' + je .sect + cmp al,0 + je .exit +;------------------------------------------------------------------------------------------ + ; чтение параметров + mov eax,[data_adr] + mov ebx,[.pos] + add ebx,[filei] + dec ebx + mov cl,0xD + call copy_s + xchg ebx,eax + mov eax,[.pos] + add eax,ebx + mov [.pos],eax + + + mov ebx,[data_adr] + mov ecx,[data_adr_last] + mov [ebx+data_prev],ecx + ;add ebx,data_next + mov [ecx],ebx + add ebx,data_next + mov [data_adr_last],ebx + + add ebx,data_len-data_next + mov [data_adr],ebx + mov eax,[sect_num] + imul eax,eax,block_len + add eax,[sec_i] + add eax, block_i_count + mov ebx,[eax] + inc ebx + mov [eax],ebx + jmp .test_next +;----------------------------------------------------------------------------------------------------------------- +.sect: ; чтение секции + mov eax,[block_count] + imul eax,eax,block_len + ; копируем имя (до ]) + add eax,[sec_i] + add eax,block_name ; кужа ложить имя + mov ebx,[.pos] + add ebx,[filei] ; откуда + mov cl,']' + call copy_s ; ложим + + + mov ebx,[.pos] + add ebx,eax + ;sub ebx,filei + add ebx,1 + mov [.pos],ebx + + mov eax,[block_count] ; прибавить количество блоков + mov [sect_num],eax + mov ebx,eax + imul eax,eax,block_len ; это будит адрес пердыдущего для первого элемента + add eax,[sec_i] + mov [data_adr_last],eax + inc ebx + mov [block_count],ebx + + +.test_next: + cmp [.pos] ,dword 97 + jb .char + +.exit: + + popad + ret + + .pos dd 0 + +endp + + + text db 255 dup(?) + +align 16 +EXPORTS: + +export \ + lib_init ,'lib_init',\ + ini.load ,'ini.load',\ + ini.get_str,'ini.get_str',\ + ini.get_par,'ini.get_par' \ No newline at end of file diff --git a/kernel/trunk/lib/proc.inc b/kernel/trunk/lib/proc.inc new file mode 100644 index 0000000000..f67887c576 --- /dev/null +++ b/kernel/trunk/lib/proc.inc @@ -0,0 +1,100 @@ +macro export [name,sname] +{ + forward + dd __#name#_export_name__,name + common + dd 0 + forward + align 4 + __#name#_export_name__ db sname,0 +} + +copy_s: + ; eax - куда + ; ebx - откуда + ; cl - до чего + ; выход - eax - сколько скопировано + pushad + push eax +@@: + mov ch,[ebx] + cmp ch,cl + je @f + mov [eax],ch + inc ebx + inc eax + jmp @b +@@: + mov [eax], byte 0 + pop ebx + sub eax,ebx + mov [esp+0x1c],eax + popad + ret + +strcmp: + ; esi - строка 1 + ; edi - строка 2 + ; выход - eax=-1 - неравно + xor eax,eax + pushad + @@: lodsb + scasb + jne .fail + or al,al + jnz @b + jmp .ok + .fail: or eax,-1 + mov [esp+0x1c],eax + .ok: popad + ret + + + +proc get_filesize stdcall, file_name:dword + locals + cmd dd ? + offset dd ? + dd ? + count dd ? + buff dd ? + db ? + name dd ? + + info dd ? + flags dd ? + cr_time dd ? + cr_date dd ? + acc_time dd ? + acc_date dd ? + mod_time dd ? + mod_date dd ? + file_size dd ? + + file dd ? + file2 dd ? + + + endl + + xor eax, eax + mov ebx, [file_name] + mov ecx,info-ebp + add ecx,ebp + + mov [cmd], 5 + mov [offset], eax + mov [offset+4], eax + mov [count], eax + mov [buff], ecx + mov byte [buff+4], al + mov [name], ebx + + mov eax, 70 + lea ebx, [cmd] + int 0x40 + + mov eax,[file_size] + + ret +endp \ No newline at end of file diff --git a/kernel/trunk/lib_func.inc b/kernel/trunk/lib_func.inc new file mode 100644 index 0000000000..b0e2a61b76 --- /dev/null +++ b/kernel/trunk/lib_func.inc @@ -0,0 +1,21 @@ +;============================================================================ +; +; ╟руЁєчър ёё√ыъш эр тэх°эшх ЇєэъЎшш +; +; +; +; +; +; +;============================================================================ + + +@IMPORT: + +library \ + libini,'inifiles.obj' + +import libini, \ + ini.load,'ini.load',\ + ini.get_str,'ini.get_str',\ + ini.get_par,'ini.get_par' \ No newline at end of file diff --git a/kernel/trunk/sys.conf b/kernel/trunk/sys.conf new file mode 100644 index 0000000000..e15fa2e643 --- /dev/null +++ b/kernel/trunk/sys.conf @@ -0,0 +1,2 @@ +[path] +/rd/1=%sys%