From 990e3f745c61326af1f6739ea0b3f736003c61b8 Mon Sep 17 00:00:00 2001 From: "Evgeny Grechnikov (Diamond)" Date: Fri, 8 Sep 2006 13:29:22 +0000 Subject: [PATCH] Kernel: updated to Kolibri 0.6.0.0 distr Programs from K0600 distr: CDP, KEYASCII git-svn-id: svn://kolibrios.org@147 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/newproce.inc | 955 ++++--------------- kernel/trunk/core/sys32.inc | 20 - kernel/trunk/core/syscall.inc | 2 +- kernel/trunk/docs/sysfuncr.txt | 55 +- kernel/trunk/docs/sysfuncs.txt | 55 +- kernel/trunk/fs/fs.inc | 94 +- kernel/trunk/kernel.asm | 52 +- programs/develop/keyascii/trunk/keyascii.asm | 2 +- programs/media/cdp/trunk/cdp.asm | 10 +- 9 files changed, 210 insertions(+), 1035 deletions(-) diff --git a/kernel/trunk/core/newproce.inc b/kernel/trunk/core/newproce.inc index 70ed4b0e19..1c8e715bd0 100644 --- a/kernel/trunk/core/newproce.inc +++ b/kernel/trunk/core/newproce.inc @@ -55,567 +55,7 @@ safe_sti: jne @f sti @@:ret - -new_start_application_floppy: -;input: -; eax - pointer to filename -; ebx - parameters to pass -; edx - flags -;result: -; eax - pid of new process -; or 0 if call fails. - mov [appl_path],edi - pushad - mov esi,new_process_loading - call sys_msg_board_str ;write to debug board - -;wait application_table_status mutex -.table_status: - cli - cmp [application_table_status],0 - jz .stf - sti - call change_task - jmp .table_status -.stf: - call set_application_table_status -;we can change system tables now - push edi - push ebx - push eax - call find_new_process_place ;find empty process slot - sti - test eax,eax - mov ecx, -0x20 ; too many processes - jz .failed - - mov edi,eax - shl edi,8 - add edi,0x80000 - mov ecx,256/4 - xor eax,eax - cld - rep stosd ;clean extended information about process - -;set new process name - mov [appl_path_size],eax - pop eax - push eax -.find_last_byte: - cmp byte [eax],0 - jz .find_last_byte_end - inc eax - inc [appl_path_size] - jmp .find_last_byte -.find_last_byte_end: - add [appl_path_size],24 - sub eax,11 ;last 11 bytes = application name -; mov eax,[esp] ;eax - pointer to file name - mov ebx,[new_process_place] - shl ebx,8 - add ebx,0x80000 + APPDATA.app_name - mov ecx,11 - call memmove - -;read header of file - mov eax,[esp] - mov ebx,1 ;index of first block - mov ecx,2 ;number of blocks - mov edx,0x90000 ;temp area - mov esi,12 ;file name length - mov edi,[esp+8] -; cli - call floppy_fileread ;read file from FD -; sti - mov ecx, eax - neg ecx - jnz .cleanfailed -;check MENUET signature - mov ecx, -0x1F ; not Menuet/Kolibri executable - cmp [0x90000],dword 'MENU' - jnz .cleanfailed - cmp [0x90004],word 'ET' - jnz .cleanfailed - - call get_app_params ;parse header fields - jc .cleanfailed - - mov eax,[new_process_place] - inc ecx ; -0x1E = no memory - call create_app_cr3_table ;create page directory for new process - test eax,eax - jz .cleanfailed_mem - - call MEM_Get_Linear_Address ;calculate linear address of it - - mov ebx,std_application_base_address - mov ecx,[app_mem] - add ecx,4095 - shr ecx,12 - mov edx,eax - call mem_alloc_specified_region ;allocate memory for application - test eax,eax - mov ecx, -0x1E - jz .cleanfailed_mem1 - - mov eax,[edx+(std_application_base_address shr 20)] - and eax,not (4096-1) ;eax - physical address of first (for application memory) page table - call MEM_Get_Linear_Address - mov edx,eax - -;read file - mov ebx,1 - mov esi,12 ;length of file name -.loop1: -;edx = linear address of current page table entry -;ebx = index of current block in file - push edx - mov eax,[edx] - and eax,not (4096-1) - call MEM_Get_Linear_Address - mov edx,eax ;read file block to current page - mov eax,[esp+4] ;restore pointer to file name - mov ecx,8 ;number of blocks read - mov ebp,edx ;save buffer address for .endofimage - push ebx - mov edi,[esp+16] -; cli - call floppy_fileread -;ebx=file size -; sti - pop ecx - add ecx,8 - test eax,eax - jnz .endloop1 ;check io errors - mov eax,[app_i_end] - add eax,511 - shr eax,9 - cmp ecx,eax - jg .endofimage ;we have loaded whole program - add ebx,511 - shr ebx,9 - cmp ecx,ebx - jg .endloop1 ;if end of file? - mov ebx,ecx - pop edx - add edx,4 - jmp .loop1 - -.endofimage: ;set to zero memory at end of page - mov ecx,[app_i_end] - and ecx,4096-1 - jz .endloop1 - lea edi,[ebp+ecx] - neg ecx - add ecx,4096 - xor eax,eax - cld - rep stosb -.endloop1: - add esp,8+4 ;pop linear address of page table entry and pointer to file name - call new_start_application_fl.add_app_parameters - mov [esp+28],eax - popad - ret - -.cleanfailed_mem1: -;there is mem for directory entry, but there is no mem for pages -;so free directory entry - mov eax,[new_process_place] - shl eax,8 - mov eax,[0x80000+eax+APPDATA.dir_table] - call MEM_Free_Page -.cleanfailed_mem: -;there is no mem for directory entry, display message. - mov esi,start_not_enough_memory - call sys_msg_board_str -.cleanfailed: ;clean process name - push ecx ; save error code -;can't read file, clean process name. -;this avoid problems with panel application. - mov edi,[new_process_place] - shl edi,8 - add edi,0x80000 + APPDATA.app_name - mov ecx,11 - mov eax,' ' - cld - rep stosb - pop eax -.failed: -;no more slots - add esp,8+4 - mov [application_table_status],0 - mov [esp+1Ch], eax - popad - sti - ret - -;----------------------------------------------------------------------------- -new_start_application_fl: -;input: -; eax - pointer to filename -; ebx - parameters to pass -; edx - flags -;result: -; eax - pid of new process -; or 0 if call fails. - mov [appl_path],edi - mov [appl_path_size],36 - pushad - mov esi,new_process_loading - call sys_msg_board_str ;write to debug board - -;wait application_table_status mutex -.table_status: - cli - cmp [application_table_status],0 - jz .stf - sti - call change_task - jmp .table_status -.stf: - call set_application_table_status -;we can change system tables now - push ebx - push eax - call find_new_process_place ;find empty process slot - call safe_sti - test eax,eax - mov ecx, -0x20 ; too many processes - jz .failed - - mov edi,eax - shl edi,8 - add edi,0x80000 - mov ecx,256/4 - xor eax,eax - cld - rep stosd ;clean extended information about process - -;set new process name - mov eax,[esp] ;eax - pointer to file name - mov ebx,[new_process_place] - shl ebx,8 - add ebx,0x80000 + APPDATA.app_name - mov ecx,11 - call memmove - -;read header of file - mov ebx,1 ;index of first block - mov ecx,2 ;number of blocks - mov edx,0x90000 ;temp area - mov esi,12 ;file name length - cli - call fileread ;read file from RD - call safe_sti - mov ecx, eax - neg ecx - jnz .cleanfailed -;check MENUET signature - mov ecx, -0x1F ; not Menuet/Kolibri executable - cmp [0x90000],dword 'MENU' - jnz .cleanfailed - cmp [0x90004],word 'ET' - jnz .cleanfailed - - call get_app_params ;parse header fields - jc .cleanfailed - - mov eax,[new_process_place] - inc ecx ; -0x1E = no memory - call create_app_cr3_table ;create page directory for new process - test eax,eax - jz .cleanfailed_mem - - call MEM_Get_Linear_Address ;calculate linear address of it - - mov ebx,std_application_base_address - mov ecx,[app_mem] - add ecx,4095 - shr ecx,12 - mov edx,eax - call mem_alloc_specified_region ;allocate memory for application - test eax,eax - mov ecx, -0x1E - jz .cleanfailed_mem1 - - mov eax,[edx+(std_application_base_address shr 20)] - and eax,not (4096-1) ;eax - physical address of first (for application memory) page table - call MEM_Get_Linear_Address - mov edx,eax - -;read file - mov ebx,1 - mov esi,12 ;length of file name -.loop1: -;edx = linear address of current page table entry -;ebx = index of current block in file - push edx - mov eax,[edx] - and eax,not (4096-1) - call MEM_Get_Linear_Address - mov edx,eax ;read file block to current page - mov eax,[esp+4] ;restore pointer to file name - mov ecx,8 ;number of blocks read - mov ebp,edx ;save buffer address for .endofimage - push ebx - cli - call fileread -;ebx=file size - call safe_sti - pop ecx - add ecx,8 - test eax,eax - jnz .endloop1 ;check io errors - mov eax,[app_i_end] - add eax,511 - shr eax,9 - cmp ecx,eax - jg .endofimage ;we have loaded whole program - add ebx,511 - shr ebx,9 - cmp ecx,ebx - jg .endloop1 ;if end of file? - mov ebx,ecx - pop edx - add edx,4 - jmp .loop1 - -.endofimage: ;set to zero memory at end of page - mov ecx,[app_i_end] - and ecx,4096-1 - jz .endloop1 - lea edi,[ebp+ecx] - neg ecx - add ecx,4096 - xor eax,eax - cld - rep stosb -.endloop1: - add esp,8 ;pop linear address of page table entry and pointer to file name - call .add_app_parameters - mov [esp+28],eax - popad - ret - -.cleanfailed_mem1: -;there is mem for directory entry, but there is no mem for pages -;so free directory entry - mov eax,[new_process_place] - shl eax,8 - mov eax,[0x80000+eax+APPDATA.dir_table] - call MEM_Free_Page -.cleanfailed_mem: -;there is no mem for directory entry, display message. - mov esi,start_not_enough_memory - call sys_msg_board_str -.cleanfailed: ;clean process name - push ecx ; save error code -;can't read file, clean process name. -;this avoid problems with panel application. - mov edi,[new_process_place] - shl edi,8 - add edi,0x80000+APPDATA.app_name - mov ecx,11 - mov eax,' ' - cld - rep stosb - pop eax -.failed: -;no more slots - add esp,8 - mov [application_table_status],0 - mov [esp+1Ch], eax - popad - call safe_sti - ret -.add_app_parameters: -;input: -; [esp] - pointer to parameters -; [esp+4]-[esp+36] pushad registers. -;result -; eax - pid of new process -; or zero if failed - cli - mov ebx,[new_process_place] - cmp ebx,[0x3004] - jle .noinc - inc dword [0x3004] ;update number of processes -.noinc: - -; mov ebx,[new_process_place] -;set 0x8c field of extended information about process -;(size of application memory) - shl ebx,8 - mov eax,[app_mem] - mov [second_base_address+0x80000+APPDATA.mem_size+ebx],eax -;set 0x10 field of information about process -;(application base address) -; mov ebx,[new_process_place] -; shl ebx,5 - shr ebx,3 - mov dword [second_base_address+0x3000+ebx+TASKDATA.mem_start],std_application_base_address - -;add command line parameters -.add_command_line: - mov edx,[app_i_param] - test edx,edx - jz .no_command_line ;application don't need parameters - mov eax,[esp+4] - test eax,eax - jz .no_command_line ;no parameters specified -;calculate parameter length - mov esi,eax - xor ecx,ecx - inc ecx ; include terminating null -.command_line_len: - cmp byte [esi],0 - jz .command_line_len_end - inc esi - inc ecx - cmp ecx,256 - jl .command_line_len - -.command_line_len_end: -;ecx - parameter length -;edx - address of parameters in new process address space - mov ebx,eax ;ebx - address of parameters in our address space - mov eax,[new_process_place] - call write_process_memory ;copy parameters to new process address space - -.no_command_line: -;****************************************************************** - mov edx,[app_i_icon] - test edx,edx - jz .no_command_line_1 ;application don't need path of file - mov ebx,[appl_path] - mov ecx,[appl_path_size] - mov eax,[new_process_place] - call write_process_memory ;copy path of file to new process address space -.no_command_line_1: -;****************************************************************** - mov ebx,[new_process_place] - mov eax,ebx - shl ebx,5 - add ebx,0x3000 ;ebx - pointer to information about process - mov [ebx+TASKDATA.wnd_number],al ;set window number on screen = process slot - - mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) - - inc dword [process_number] - mov eax,[process_number] - mov [ebx+TASKDATA.pid],eax ;set PID - - mov ecx,ebx - add ecx,draw_data-0x3000 ;ecx - pointer to draw data -;set draw data to full screen - mov [ecx+RECT.left],dword 0 - mov [ecx+RECT.top],dword 0 - mov eax,[0xfe00] - mov [ecx+RECT.right],eax - mov eax,[0xfe04] - mov [ecx+RECT.bottom],eax -;set window state to 'normal' (non-minimized/maximized/rolled-up) state - mov [ecx+WDATA.fl_wstate],WSTATE_NORMAL -;set cr3 register in TSS of application - mov ecx,[new_process_place] - shl ecx,8 - mov eax,[0x80000+APPDATA.dir_table+ecx] - add eax,8+16 ;add flags - mov [l.cr3],eax - - mov eax,[app_start] - mov [l.eip],eax ;set eip in TSS - mov eax,[app_esp] - mov [l.esp],eax ;set stack in TSS - -;gdt - ;mov ebx,[new_process_place] - ;shl ebx,3 - mov ax,app_code ;ax - selector of code segment - ;add ax,bx - mov [l.cs],ax - mov ax,app_data - ;add ax,bx ;ax - selector of data segment - mov [l.ss],ax - mov [l.ds],ax - mov [l.es],ax - mov [l.fs],ax - mov ax,graph_data ;ax - selector of graphic segment - mov [l.gs],ax - mov [l.io],word 128 - mov [l.eflags],dword 0x11202 - mov [l.ss0],os_data - mov ebx,[new_process_place] - shl ebx,12 - add ebx,sysint_stack_data+4096 - mov [l.esp0],ebx - -;copy tss to it place - mov eax,tss_sceleton - mov ebx,[new_process_place] - imul ebx,tss_step - add ebx,tss_data ;ebx - address of application TSS - mov ecx,120 - call memmove - -;Add IO access table - bit array of permitted ports - or eax,-1 - mov edi,[new_process_place] - imul edi,tss_step - add edi,tss_data+128 - mov ecx,2048 - cld - rep stosd ;full access to 2048*8=16384 ports - - mov ecx,ebx ;ecx - address of application TSS - mov edi,[new_process_place] - shl edi,3 -;set TSS descriptor - mov [edi+gdts+tss0+0],word tss_step ;limit (size) - mov [edi+gdts+tss0+2],cx ;part of offset - mov eax,ecx - shr eax,16 - mov [edi+gdts+tss0+4],al ;part of offset - mov [edi+gdts+tss0+7],ah ;part of offset - mov [edi+gdts+tss0+5],word 01010000b*256+11101001b ;system flags - - -;flush keyboard and buttons queue - mov [0xf400],byte 0 - mov [0xf500],byte 0 - - mov edi,[new_process_place] - shl edi,5 - add edi,window_data - mov ebx,[new_process_place] - movzx esi,word [0xC000+ebx*2] - lea esi,[0xC400+esi*2] - call windowactivate ;gui initialization - - mov ebx,[new_process_place] - shl ebx,5 -; set if debuggee - test byte [esp+28], 1 - jz .no_debug - mov [0x3000+ebx+TASKDATA.state], 1 ; set process state - suspended - mov eax, [0x3000] - mov [0x80000+ebx*8+APPDATA.debugger_slot], eax ;set debugger PID - current - jmp .debug -.no_debug: - mov [0x3000+ebx+TASKDATA.state], 0 ; set process state - running -.debug: - - mov esi,new_process_running - call sys_msg_board_str ;output information about succefull startup - -; add esp,4 ;pop pointer to parameters -; popad - mov eax,[process_number] ;set result - mov [application_table_status],0 ;unlock application_table_status mutex - call safe_sti - ret 4 ;----------------------------------------------------------------------------- new_sys_threads: ;eax=1 - create thread @@ -676,7 +116,7 @@ new_sys_threads: ; call addreference_app_cr3_table push 0 ;no parameters - call new_start_application_fl.add_app_parameters ;start thread + call fs_execute.add_app_parameters ;start thread mov [esp+28],eax popad ret @@ -1222,209 +662,6 @@ trans_address: add eax,std_application_base_address ret ;----------------------------------------------------------------------------- -new_start_application_hd: -;eax - file name (kernel address) -;ebx - file name length -;ecx - work area (kernel address) -;edx - flags -;ebp - parameters - mov [appl_path],edi - pushad - - mov esi,new_process_loading - call sys_msg_board_str ;write message to message board - -;lock application_table_status mutex -.table_status: - cli - cmp [application_table_status],0 - jz .stf - sti - call change_task - jmp .table_status -.stf: - call set_application_table_status - - push ebp - push ebx - push eax - push ecx - call find_new_process_place ;find new process slot - sti - test eax,eax - mov ecx, -0x20 ; too many processes - jz .failed - -;write application name - xor eax,eax - mov [appl_path_size],eax - mov eax,[esp+4] -.find_last_byte: - cmp byte [eax],0 - jz .find_last_byte_end - inc eax - inc [appl_path_size] - jmp .find_last_byte -.find_last_byte_end: - add [appl_path_size],24 - lea esi,[eax-11] ;last 11 bytes = application name - mov edi,[new_process_place] - shl edi,8 - add edi,0x80000+APPDATA.app_name - mov ecx,11 - cld - rep movsb ;copy name to extended information about process - -;read header - mov eax,[esp+4] ;file name - mov esi,[esp] ;work area - mov ecx,1 ;read from first block - mov edx,1 ;read 1 block - call read_hd_file - mov ecx, eax - neg ecx - jnz .cleanfailed - - pop esi - push esi -;check menuet signature - mov ecx, -0x1F ; not Menuet/Kolibri executable - cmp [esi+1024+0],dword 'MENU' ;read_hd_file function write file to +1024 offset - jnz .cleanfailed - cmp [esi+1024+4],word 'ET' - jnz .cleanfailed - add esi,1024 - mov edi,0x90000 - mov ecx,512/4 - cld - rep movsd ;copy first block to 0x90000 address for get_app_params function - call get_app_params - mov ecx, -0x1F ; not Menuet/Kolibri executable - jc .cleanfailed - - mov eax,[new_process_place] - inc ecx ; -0x1E = no memory - call create_app_cr3_table ;create page directory - test eax,eax - jz .cleanfailed_mem - - call MEM_Get_Linear_Address - - mov ebx,std_application_base_address - mov ecx,[app_mem] - add ecx,4096-1 - shr ecx,12 - mov edx,eax ;edx - linear address of page directory - call mem_alloc_specified_region ;allocate memory for application - mov ecx, -0x1E ; no memory - test eax,eax - jz .cleanfailed_mem1 - - add edx,(std_application_base_address shr 20) - mov eax,[edx] - and eax,not (4096-1) - call MEM_Get_Linear_Address - push edx ;save pointer to first page table - mov edx,eax -;read file - mov ecx,1 - xor ebp,ebp -.loop1: -;[esp] - pointer to current page directory entry -;edx - pointer to current page table -;ebp - offset in page -;ecx - current cluster - push edx - mov eax,[esp+12] ;file name - mov ebx,[esp+16] ;file name length - mov esi,[esp+8] ;work area - mov edx,1 ;number of blocks to read - push ecx - push ebp - cli - call read_hd_file - sti - pop ebp - test eax,eax - jnz .endloop1 ;check io errors - - mov esi,[esp+8+4] ;work area - add esi,1024 - mov eax,[esp+4] ;current page table - mov eax,[eax] - and eax,not (4096-1) - call MEM_Get_Linear_Address;calculate linear page address - lea edi,[eax+ebp] ;add page offset - mov ecx,512/4 - cld - rep movsd ;copy data - - pop ecx - inc ecx ;next block - mov eax,[app_i_end] ;todo: precalculate ([app_i_end]+4095)/4096 - add eax,512-1 - shr eax,9 ;calculate application image size - cmp ecx,eax - jg .endloop11 - pop edx - add ebp,512 ;new offset - test ebp,4096 - jz .loop1 - xor ebp,ebp - add edx,4 ;go to next page - test edx,(4096-1) - jnz .loop1 - add dword [esp],4 ;go to next directory entry - mov eax,[esp] - mov eax,[eax] - and eax,not (4096-1) - call MEM_Get_Linear_Address - mov edx,eax - jmp .loop1 -.endloop1: - add esp,4 ;pop ecx -.endloop11: - add esp,4+4 ;pop edx, pop edx - -;add_app_parameters - add esp,12 ;now pointer to parameters is on the top of the stack - call new_start_application_fl.add_app_parameters ;start process - mov [esp+28],eax - popad - ret - -.cleanfailed_mem1: -;there is mem for directory entry, but there is no mem for pages -;so free directory entry - mov eax,[new_process_place] - shl eax,8 - mov eax,[0x80000+eax+APPDATA.dir_table] - call MEM_Free_Page -.cleanfailed_mem: -;there is no mem for directory entry, display message. - mov esi,start_not_enough_memory - call sys_msg_board_str -.cleanfailed: ;clean process name - push ecx -;can't read file, clean process name. -;this avoid problems with panel application. - mov edi,[new_process_place] - shl edi,8 - add edi,0x80000+APPDATA.app_name - mov ecx,11 - mov eax,' ' - cld - rep stosb - pop eax -.failed: -;no more slots - add esp,16 - mov [esp+1Ch], eax - popad - mov [application_table_status],0 - sti - ret -end if ; \begin{diamond} include 'debug.inc' @@ -1608,7 +845,7 @@ fs_execute: pop edx cmp eax, 6 jnz .cleanfailed_mem2 - call new_start_application_fl.add_app_parameters + call .add_app_parameters mov [esp+28], eax popad ret @@ -1649,3 +886,191 @@ fs_execute: call safe_sti ret ; \end{diamond} +.add_app_parameters: +;input: +; [esp] - pointer to parameters +; [esp+4]-[esp+36] pushad registers. +;result +; eax - pid of new process +; or zero if failed + cli + mov ebx,[new_process_place] + cmp ebx,[0x3004] + jle .noinc + inc dword [0x3004] ;update number of processes +.noinc: + +; mov ebx,[new_process_place] +;set 0x8c field of extended information about process +;(size of application memory) + shl ebx,8 + mov eax,[app_mem] + mov [second_base_address+0x80000+APPDATA.mem_size+ebx],eax +;set 0x10 field of information about process +;(application base address) +; mov ebx,[new_process_place] +; shl ebx,5 + shr ebx,3 + mov dword [second_base_address+0x3000+ebx+TASKDATA.mem_start],std_application_base_address + +;add command line parameters +.add_command_line: + mov edx,[app_i_param] + test edx,edx + jz .no_command_line ;application don't need parameters + mov eax,[esp+4] + test eax,eax + jz .no_command_line ;no parameters specified +;calculate parameter length + mov esi,eax + xor ecx,ecx + inc ecx ; include terminating null +.command_line_len: + cmp byte [esi],0 + jz .command_line_len_end + inc esi + inc ecx + cmp ecx,256 + jl .command_line_len + +.command_line_len_end: +;ecx - parameter length +;edx - address of parameters in new process address space + mov ebx,eax ;ebx - address of parameters in our address space + mov eax,[new_process_place] + call write_process_memory ;copy parameters to new process address space + +.no_command_line: +;****************************************************************** + mov edx,[app_i_icon] + test edx,edx + jz .no_command_line_1 ;application don't need path of file + mov ebx,[appl_path] + mov ecx,[appl_path_size] + mov eax,[new_process_place] + call write_process_memory ;copy path of file to new process address space +.no_command_line_1: +;****************************************************************** + mov ebx,[new_process_place] + mov eax,ebx + shl ebx,5 + mov [ebx+window_data+WDATA.fl_wstate],WSTATE_NORMAL + mov [ebx+window_data+WDATA.fl_redraw],1 + add ebx,0x3000 ;ebx - pointer to information about process + mov [ebx+TASKDATA.wnd_number],al ;set window number on screen = process slot + + mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) + + inc dword [process_number] + mov eax,[process_number] + mov [ebx+TASKDATA.pid],eax ;set PID + + mov ecx,ebx + add ecx,draw_data-0x3000 ;ecx - pointer to draw data +;set draw data to full screen + mov [ecx+RECT.left],dword 0 + mov [ecx+RECT.top],dword 0 + mov eax,[0xfe00] + mov [ecx+RECT.right],eax + mov eax,[0xfe04] + mov [ecx+RECT.bottom],eax +;set cr3 register in TSS of application + mov ecx,[new_process_place] + shl ecx,8 + mov eax,[0x80000+APPDATA.dir_table+ecx] + add eax,8+16 ;add flags + mov [l.cr3],eax + + mov eax,[app_start] + mov [l.eip],eax ;set eip in TSS + mov eax,[app_esp] + mov [l.esp],eax ;set stack in TSS + +;gdt + ;mov ebx,[new_process_place] + ;shl ebx,3 + mov ax,app_code ;ax - selector of code segment + ;add ax,bx + mov [l.cs],ax + mov ax,app_data + ;add ax,bx ;ax - selector of data segment + mov [l.ss],ax + mov [l.ds],ax + mov [l.es],ax + mov [l.fs],ax + mov ax,graph_data ;ax - selector of graphic segment + mov [l.gs],ax + mov [l.io],word 128 + mov [l.eflags],dword 0x11202 + mov [l.ss0],os_data + mov ebx,[new_process_place] + shl ebx,12 + add ebx,sysint_stack_data+4096 + mov [l.esp0],ebx + +;copy tss to it place + mov eax,tss_sceleton + mov ebx,[new_process_place] + imul ebx,tss_step + add ebx,tss_data ;ebx - address of application TSS + mov ecx,120 + call memmove + +;Add IO access table - bit array of permitted ports + or eax,-1 + mov edi,[new_process_place] + imul edi,tss_step + add edi,tss_data+128 + mov ecx,2048 + cld + rep stosd ;full access to 2048*8=16384 ports + + mov ecx,ebx ;ecx - address of application TSS + mov edi,[new_process_place] + shl edi,3 +;set TSS descriptor + mov [edi+gdts+tss0+0],word tss_step ;limit (size) + mov [edi+gdts+tss0+2],cx ;part of offset + mov eax,ecx + shr eax,16 + mov [edi+gdts+tss0+4],al ;part of offset + mov [edi+gdts+tss0+7],ah ;part of offset + mov [edi+gdts+tss0+5],word 01010000b*256+11101001b ;system flags + + +;flush keyboard and buttons queue + mov [0xf400],byte 0 + mov [0xf500],byte 0 + + mov edi,[new_process_place] + shl edi,5 + add edi,window_data + mov ebx,[new_process_place] + movzx esi,word [0xC000+ebx*2] + lea esi,[0xC400+esi*2] + call windowactivate ;gui initialization + + mov ebx,[new_process_place] + shl ebx,5 +; set if debuggee + test byte [esp+28], 1 + jz .no_debug + mov [0x3000+ebx+TASKDATA.state], 1 ; set process state - suspended + mov eax, [0x3000] + mov [0x80000+ebx*8+APPDATA.debugger_slot], eax ;set debugger PID - current + jmp .debug +.no_debug: + mov [0x3000+ebx+TASKDATA.state], 0 ; set process state - running +.debug: + + mov esi,new_process_running + call sys_msg_board_str ;output information about succefull startup + +; add esp,4 ;pop pointer to parameters +; popad + mov eax,[process_number] ;set result + mov [application_table_status],0 ;unlock application_table_status mutex + call safe_sti + ret 4 + +end if diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index d0cb673fa5..55befcfc39 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -665,19 +665,6 @@ get_app_params: ret -start_application_fl: - jmp new_start_application_fl - -;************************************************************************ - -start_application_floppy: - jmp new_start_application_floppy - -;******************************************************************** - -start_application_hd: - jmp new_start_application_hd - uglobal new_process_place dd 0x0 app_start dd 0x0 @@ -691,13 +678,6 @@ uglobal appl_path_size dd 0x0 endg -;iglobal - ;hd_app_string db 'HDAPP ' - ;process_loading db 'K : Process - loading ',13,10,0 - ;process_running db 'K : Process - done',13,10,0 - ;first_gdt_search dd 0x2 -;endg - sys_threads: diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index 7e9a5381d9..13630d2279 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -87,7 +87,7 @@ iglobal dd sys_cachetodiskette ; 16-FlushFloppyCache dd sys_getbutton ; 17-GetButton dd sys_system ; 18-System Services - dd syscall_startapp ; 19-StartApp + dd undefined_syscall ; 19-reserved dd sys_midi ; 20-ResetMidi and OutputMidi dd sys_setup ; 21-SetMidiBase,SetKeymap,SetShiftKeymap,. dd sys_settime ; 22-setting date,time,clock and alarm-clock diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index ae1e23bef7..b97ccb56e8 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -1,4 +1,4 @@ -СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.5.8.1 +СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.6.0.0 Номер функции помещается в регистр eax. Вызов системной функции осуществляется командой "int 0x40". @@ -878,8 +878,8 @@ db a,b,c,d для версии a.b.c.d db UID_xxx: одно из UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 db 'name',0 - ASCIIZ-строка с именем -Для ядра Kolibri 0.5.8.1: -db 0,5,8,1 +Для ядра Kolibri 0.6.0.0: +db 0,6,0,0 db 2 db 'Kolibri',0 @@ -1005,23 +1005,6 @@ db 'Kolibri',0 и проверить, что устанавливаемое положение не выходит за пределы экрана. -====================================================================== -============ Функция 19 - запустить программу с рамдиска. ============ -====================================================================== -Параметры: - * eax = 19 - номер функции - * ebx = указатель на имя программы в формате, аналогичном функции 6 - * ecx = 0 или ecx = указатель на параметры командной строки -Возвращаемое значение: - * Если eax > 0, то eax содержит PID созданного процесса - * Если eax < 0, то -eax - код ошибки файловой системы -Замечания: - * Эта функция устарела; используйте подфункцию 7 функции 70. - * Командная строка должна заканчиваться символом с кодом 0 - (ASCIIZ-строка); учитываются либо все символы до завершающего нуля - включительно, либо первые 256 символов, в зависимости от того, - что меньше. - ====================================================================== ==================== Функция 20 - интерфейс MIDI. ==================== ====================================================================== @@ -2927,7 +2910,6 @@ dword- * подфункция 5 - переименование/перемещение файла/папки * подфункция 8 - LBA-чтение с устройства * подфункция 15 - получение информации о файловой системе - * подфункция 16 - запуск приложения ====================================================================== ========== Функция 58, подфункция 0 - прочитать файл/папку. ========== @@ -3186,37 +3168,6 @@ dword- подсистемы можно определить размер кластера (там он хранится в секторах) и общее число кластеров для жёстких дисков. -====================================================================== -========== Функция 58, подфункция 16 - запустить программу. ========== -====================================================================== -Параметры: - * eax = 58 - номер функции - * ebx = указатель на информационную структуру -Формат информационной структуры: - * +0: dword: 16 = номер подфункции - * +4: dword: поле флагов: - * бит 0: запустить процесс как отлаживаемый - * остальные биты зарезервированы и должны быть установлены в 0 - * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами - * +12 = +0xC: dword: игнорируется - * +16 = +0x10: dword: указатель на буфер для работы системы - (4096 байт) - * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в - общем описании -Возвращаемое значение: - * eax > 0 - программа загружена, eax содержит PID - * eax < 0 - произошла ошибка, -eax содержит - код ошибки файловой системы -Замечания: - * Эта функция устарела, используйте подфункцию 7 функции 70. - * Комадная строка должна заканчиваться символом с кодом 0 - (ASCIIZ-строка); учитываются либо все символы до завершающего нуля - включительно, либо первые 256 символов, в зависимости от того, - что меньше. - * Если процесс запускается как отлаживаемый, он создаётся - в замороженном состоянии; для запуска используйте - подфункцию 5 функции 69. - ====================================================================== === Функция 59 - получить информацию о последних системных вызовах. == ====================================================================== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 53683b6136..f426a73acd 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -1,4 +1,4 @@ -SYSTEM FUNCTIONS of OS Kolibri 0.5.8.1 +SYSTEM FUNCTIONS of OS Kolibri 0.6.0.0 Number of the function is located in the register eax. The call of the system function is executed by "int 0x40" command. @@ -874,8 +874,8 @@ Structure of the buffer: db a,b,c,d for version a.b.c.d db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2 db 'name',0 - ASCIIZ-string with the name -For Kolibri 0.5.8.1 kernel: -db 0,5,8,1 +For Kolibri 0.6.0.0 kernel: +db 0,6,0,0 db 2 db 'Kolibri',0 @@ -1000,24 +1000,6 @@ Remarks: and check that the value of position is inside the limits of the screen. -====================================================================== -============ Function 19 - start application from ramdisk. =========== -====================================================================== -Parameters: - * eax = 19 - function number - * ebx = pointer to the application name in format similar - to function 6 - * ecx = 0 or ecx = pointer to command line parameters -Returned value: - * If eax > 0, then eax contains PID of the created process - * If eax < 0, then -eax - file system error code -Remarks: - * This function is obsolete; use subfunction 7 of function 70. - * Command line must be terminated by the character with the code 0 - (ASCIIZ-string); function takes into account either all characters - up to terminating zero inclusively or first 256 character - regarding what is less. - ====================================================================== ==================== Function 20 - MIDI interface. =================== ====================================================================== @@ -2897,7 +2879,6 @@ Existing subfunctions: * subfunction 5 - rename/move file/folder * subfunction 8 - LBA-read from device * subfunction 15 - get file system information - * subfunction 16 - start application ====================================================================== =========== Function 58, subfunction 0 - read file/folder. =========== @@ -3155,36 +3136,6 @@ Remarks: it is stored in sectors) and total number of clusters for hard disks. -====================================================================== -========== Function 58, subfunction 16 - start application. ========== -====================================================================== -Parameters: - * eax = 58 - function number - * ebx = pointer to the information structure -Format of the information structure: - * +0: dword: 16 = subfunction number - * +4: dword: flags: - * bit 0: start the process as debugged - * other bits are reserved and must be cleared - * +8: dword: 0 or pointer to ASCIIZ-string with parameters - * +12 = +0xC: dword: ignored - * +16 = +0x10: dword: pointer to buffer for system operations - (4096 bytes) - * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are - given in the general description -Returned value: - * eax > 0 - the program is loaded, eax contains PID - * eax < 0 - an error has occured, -eax contains - file system error code -Remarks: - * This function is obsolete, use subfunction 7 of function 70. - * Command line must be terminated by character with code 0 - (ASCIIZ-string); function takes into account either all characters - up to terminating null inclusively or the first 256 charachters - depending on what is less. - * If the process is started as debugged, it is created in - the suspended state; to run use subfunction 5 of function 69. - ====================================================================== =============== Function 59 - trace last system calls. =============== ====================================================================== diff --git a/kernel/trunk/fs/fs.inc b/kernel/trunk/fs/fs.inc index b160f34eb2..449c385833 100644 --- a/kernel/trunk/fs/fs.inc +++ b/kernel/trunk/fs/fs.inc @@ -42,7 +42,6 @@ file_system: ; eax = 5 ; rename file/directory ; eax = 8 ; lba read ; eax = 15 ; get_disk_info -; eax = 16 ; start application ; ; OUT: ; @@ -89,8 +88,6 @@ file_system: cmp dword [eax+0],15 ; GET_DISK_INFO je fs_info - cmp dword [eax+0],16 ; RUN - dont care about read&write blocks - je fs_read cmp dword [eax+0],5 ; RENAME - dont care about read&write blocks je fs_read cmp dword [eax+0],4 ; MAKEDIR - dont care about read&write blocks @@ -149,11 +146,7 @@ endg ; (execute operation returns eax=-10) cmp dword [eax], 0 jz .read_root - mov ecx, 10 - cmp dword [eax], 16 - jnz @f - neg ecx -@@: mov [esp+36], ecx + mov dword [esp+36], 10 ret .read_root: ; \end{diamond}[18.03.2006] @@ -291,25 +284,6 @@ endg fs_noramdisk_write: - cmp dword [esp+20],16 ; START APPLICATION - jne fs_noramdisk_start_application - - mov eax,[esp+4] ; fname - add eax,2*12+1 - - xor ebx,ebx ; parameters to pass - cmp dword [esp+12],ebx;0 - je no_fl_start_param - mov ebx, [esp+12] - add ebx, std_application_base_address - no_fl_start_param: - mov edx,[esp+16] ; flags - - call start_application_fl - - jmp file_system_startapp_return - - fs_noramdisk_start_application: ;there's new code - Mihasik cmp dword [esp+20],2 ;DELETE jne fs_noramdisk_delete mov eax,[esp+4] ; fname @@ -395,29 +369,6 @@ endg jmp file_system_return fs_noflpdisk_delete: - cmp dword [esp+20],16 ; START APPLICATION - jne fs_noflpdisk_start_application - - mov eax,[esp+4] ; fname - add eax,2*12+1 - - xor ebx,ebx ; parameters to pass - cmp dword [esp+12],ebx;0 - je no_flp_start_param - mov ebx,[0x3010] - mov ebx,[ebx+0x10] - add ebx,[esp+12] - - no_flp_start_param: - mov edx,[esp+16] ; flags - - call start_application_floppy - -file_system_startapp_return: - mov ebx, [esp+24+24] ; do not modify ebx in application - jmp file_system_return - - fs_noflpdisk_start_application: fs_noflpdisk: ;***************************************************************** @@ -511,10 +462,7 @@ choice_necessity_partition_1: fs_yesharddisk_all: mov eax,1 - cmp dword [esp+20], 16 - jnz @f - neg eax -@@: mov ebx, [esp+24+24] + mov ebx, [esp+24+24] cmp [hdpos],0 ; is hd base set? jz hd_err_return cmp [fat32part],0 ; is partition set? @@ -657,41 +605,11 @@ hd_err_return: fs_noharddisk_rename: - cmp dword [esp+20],16 ; START APPLICATION - jne fs_noharddisk_start_application - - mov eax,[esp+4] ; fname - add eax,12*2 - - mov ebx,[esp+0] ; length - sub ebx,eax - add ebx,12 - - mov ecx,[esp+4] ; work area - add ecx,512 - - xor ebp,ebp ; parameters to pass - cmp dword [esp+12],ebp;0 - je no_hd_start_param - mov ebp, [esp+12] - add ebp, std_application_base_address - no_hd_start_param: - mov edx,[esp+16] ; flags - - call start_application_hd - - jmp file_system_startapp_return - - fs_noharddisk_start_application: - fs_noharddisk: ; \begin{diamond}[18.03.2006] mov eax, 5 ; file not found ; р ьюцхЄ с√Є№, тючтЁр∙рЄ№ фЁєующ ъюф ю°шсъш? - cmp dword [esp+20], 16 - jnz @f - neg eax -@@: mov ebx, [esp+24+24] ; do not change ebx in application + mov ebx, [esp+24+24] ; do not change ebx in application ; \end{diamond}[18.03.2006] file_system_return: @@ -713,11 +631,7 @@ hd_err_return: jz .read add esp, 20 pop ecx - mov eax, 10 - cmp ecx, 16 - jnz @f - neg eax -@@: mov [esp+36], eax + mov dword [esp+36], 10 ret .read: ; \end{diamond}[18.03.2006] diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 89b16ede7c..5cc32ee5ff 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -76,7 +76,7 @@ drawbar dd __sys_drawbar.forced putpixel dd __sys_putpixel ; } mike.dld -version db 'Kolibri OS version 0.5.8.1 ',13,10,13,10,0 +version db 'Kolibri OS version 0.6.0.0 ',13,10,13,10,0 ;dd endofcode-0x10000 ;db 'Boot02' @@ -2235,7 +2235,7 @@ endg iglobal version_inf: - db 0,5,8,1 ; version 0.5.8.1 + db 0,6,0,0 ; version 0.6.0.0 db UID_KOLIBRI db 'Kolibri',0 version_end: @@ -2988,8 +2988,6 @@ sys_set_window: mov [edi+WDATA.cl_titlebar],edx mov [edi+WDATA.cl_frames],esi - call set_window_clientbox - ; check flag (?) cmp [edi+WDATA.fl_wdrawn],1 jz newd @@ -3007,6 +3005,7 @@ sys_set_window: mov word[edi+WDATA.box.left],ax mov word[edi+WDATA.box.top],bx + call set_window_clientbox call check_window_position @@ -4862,57 +4861,12 @@ syscall_getscreensize: ; GetScreenSize align 4 -syscall_startapp: ; StartApp - mov edi,[0x3010] - add edi, TASKDATA.mem_start - add eax,[edi] - test ebx,ebx - jz noapppar - add ebx,[edi] - noapppar: -; call start_application_fl - xor edx,edx ; compatibility - flags=0 - call new_start_application_fl - mov [esp+36],eax - ret - - -align 4 - syscall_cdaudio: ; CD call sys_cd_audio mov [esp+36],eax ret -; ReadHd and StartHdApp functions are obsolete. Use 58 or 70 functions instead. -;align 4 -; -;syscall_readhd: ; ReadHd -; -; mov edi,[0x3010] -; add edi,0x10 -; add esi,[edi] -; add eax,[edi] -; call read_hd_file -; mov [esp+36],eax -; mov [esp+24],ebx -; ret - -;align 4 -; -;syscall_starthdapp: ; StartHdApp -; -; mov edi,[0x3010] -; add edi,0x10 -; add eax,[edi] -; add ecx,[edi] -; xor ebp,ebp -; xor edx,edx ; compatibility - flags=0 -; call start_application_hd -; mov [esp+36],eax -; ret - align 4 syscall_delramdiskfile: ; DelRamdiskFile diff --git a/programs/develop/keyascii/trunk/keyascii.asm b/programs/develop/keyascii/trunk/keyascii.asm index af26335d16..dedaff03cf 100644 --- a/programs/develop/keyascii/trunk/keyascii.asm +++ b/programs/develop/keyascii/trunk/keyascii.asm @@ -89,7 +89,7 @@ draw_window: mov edx,labelt ; pointer to text beginning mov esi,labellen-labelt ; text length int 0x40 - not ecx + xor ecx,0xFFFFFF mov esi,4 add ebx,23 mov edx,tdec diff --git a/programs/media/cdp/trunk/cdp.asm b/programs/media/cdp/trunk/cdp.asm index 1071c3b680..5be7712e4a 100644 --- a/programs/media/cdp/trunk/cdp.asm +++ b/programs/media/cdp/trunk/cdp.asm @@ -4,8 +4,8 @@ ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -include "lang.inc" include "macros.inc" +include "lang.inc" FALSE equ 0 TRUE equ 1 @@ -758,7 +758,7 @@ draw_window: ; WINDOW LABEL mov eax,4 ; function 4 : write text to window mov ebx,8*65536+8 ; [x start] *65536 + [y start] - mov ecx,0xf000ffff ; color of text RRGGBB + mov ecx,0x1000ffff ; color of text RRGGBB mov edx,labelt ; pointer to text beginning mov esi,labellen-labelt ; text length int 0x40 @@ -805,7 +805,7 @@ draw_window: ; text mov eax,4 mov ebx,19*65536+142 - mov ecx,0xf00f73f5;ffff0f + mov ecx,0x100f73f5;ffff0f mov edx,but_mode_lab mov esi,1 int 0x40 @@ -995,7 +995,7 @@ draw_window: jne flag3 mov eax,4 mov ebx, 20 shl 16 +67 - mov ecx,0xf0ffff00 + mov ecx,0x10ffff00 mov edx,define_cdrom mov esi,define_cdrom_len-define_cdrom int 0x40 @@ -1004,7 +1004,7 @@ draw_window: jne flag4 mov eax,4 mov ebx, 47 shl 16 +67 - mov ecx,0xf0ffff00 + mov ecx,0x10ffff00 mov edx,no_cda mov esi,no_cda_len-no_cda int 0x40