diff --git a/kernel/trunk/core/dll.inc b/kernel/trunk/core/dll.inc index 482aeca720..41524809b7 100644 --- a/kernel/trunk/core/dll.inc +++ b/kernel/trunk/core/dll.inc @@ -9,7 +9,7 @@ $Revision$ DRV_COMPAT equ 5 ;minimal required drivers version -DRV_CURRENT equ 5 ;current drivers model version +DRV_CURRENT equ 6 ;current drivers model version DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT PID_KERNEL equ 1 ;os_idle thread @@ -17,6 +17,9 @@ PID_KERNEL equ 1 ;os_idle thread align 4 proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword + pushfd + cli + push ebx mov ebx, [irq] ;irq num @@ -27,51 +30,26 @@ proc attach_int_handler stdcall, irq:dword, handler:dword, access_rights:dword mov eax, [handler] test eax, eax jz .err - cmp [irq_owner + 4 * ebx], 0 - je @f - mov ecx, [irq_rights + 4 * ebx] ; Rights : 0 - full access, 1 - read only, 2 - forbidden - test ecx, ecx - jnz .err - -@@: mov [irq_tab+ebx*4], eax - - mov eax, [access_rights] - mov [irq_rights + 4 * ebx], eax - - mov [irq_owner + 4 * ebx], PID_KERNEL ; all handlers belong to a kernel - stdcall enable_irq, [irq] pop ebx mov eax, 1 + popfd ret .err: pop ebx xor eax, eax + popfd ret endp -uglobal - - irq_rights rd 16 - -endg - proc get_int_handler stdcall, irq:dword mov eax, [irq] - cmp [irq_rights + 4 * eax], dword 1 - ja .err - mov eax, [irq_tab + 4 * eax] ret - - .err: - xor eax, eax - ret - endp align 4 @@ -200,10 +178,10 @@ align 16 .exit: - cmp dword [esp + 32], 8 + cmp dword [esp + 32], 8 mov al, 0x20 jb @f - out 0xa0, al + out 0xa0, al @@: out 0x20, al diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index 619aa3c530..24e562d29d 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -675,25 +675,6 @@ term9: and [bgrlock], 0 @@: - pusha ; remove all irq reservations - mov eax,esi - shl eax, 5 - mov eax,[eax+CURRENT_TASK+TASKDATA.pid] - mov edi,irq_owner - xor ebx, ebx - xor edx, edx - newirqfree: - cmp [edi + 4 * ebx], eax - jne nofreeirq - mov [edi + 4 * ebx], edx ; remove irq reservation - mov [irq_tab + 4 * ebx], edx ; remove irq handler - mov [irq_rights + 4 * ebx], edx ; set access rights to full access - nofreeirq: - inc ebx - cmp ebx, 16 - jb newirqfree - popa - pusha ; remove all port reservations mov edx,esi shl edx, 5 diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index c7bea7beac..43bf669a32 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -161,11 +161,11 @@ iglobal dd syscall_drawline ; 38-DrawLine dd sys_getbackground ; 39-GetBackgroundSize,ReadBgrData,. dd set_app_param ; 40-WantEvents - dd syscall_getirqowner ; 41-GetIrqOwner - dd get_irq_data ; 42-ReadIrqData + dd undefined_syscall ; 41- deprecated GetIrqOwner + dd undefined_syscall ; 42- deprecated ReadIrqData dd sys_outport ; 43-SendDeviceData - dd sys_programirq ; 44-ProgramIrqs - dd reserve_free_irq ; 45-ReserveIrq and FreeIrq + dd undefined_syscall ; 44- deprecated ProgramIrqs + dd undefined_syscall ; 45- deprecated ReserveIrq and FreeIrq dd syscall_reserveportarea ; 46-ReservePortArea and FreePortArea dd display_number ; 47-WriteNum dd syscall_display_settings ; 48-SetRedrawType and SetButtonType diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc index a80a99f266..ffacd2e53b 100644 --- a/kernel/trunk/data32.inc +++ b/kernel/trunk/data32.inc @@ -267,9 +267,6 @@ align 16 cur_saved_data rb 4096 fpu_data: rb 512 -; device irq owners -irq_owner rd 16 ; process id - ; on irq read ports irq00read rd 16 diff --git a/kernel/trunk/drivers/sound.asm b/kernel/trunk/drivers/sound.asm index 0fc57564fb..08cdc688ec 100644 --- a/kernel/trunk/drivers/sound.asm +++ b/kernel/trunk/drivers/sound.asm @@ -363,16 +363,7 @@ proc START stdcall, state:dword call SysMsgBoardStr end if - mov eax, VALID_IRQ mov ebx, [ctrl.int_line] - mov esi, msgInvIRQ - bt eax, ebx - jnc .fail_msg - mov eax, ATTCH_IRQ - mov esi, msgAttchIRQ - bt eax, ebx - jnc .fail_msg - stdcall AttachIntHandler, ebx, ac97_irq, dword 0 .reg: stdcall RegService, sz_sound_srv, service_proc @@ -496,6 +487,27 @@ proc ac97_irq call SysMsgBoardStr end if + mov edx, CTRL_STAT + call [ctrl.ctrl_read32] + + cmp eax, 0xffffffff + je .exit + + test eax, 0x40 + jnz .do_intr + + test eax, eax + jz .exit + + mov edx, CTRL_STAT + call [ctrl.ctrl_write32] +.exit: + xor eax, eax + ret + +.do_intr: + push eax + mov edx, PCM_OUT_CR_REG mov al, 0x10; 0x10 call [ctrl.ctrl_write8] @@ -528,18 +540,22 @@ proc ac97_irq and eax, 31 mov ebx, dword [buff_list+eax*4] - cmp [ctrl.user_callback], 0 - je @f - - stdcall [ctrl.user_callback], ebx -@@: - ret + cmp [ctrl.user_callback], 0 + je .done + stdcall [ctrl.user_callback], ebx +.done: + pop eax + and eax, 0x40 + mov edx, CTRL_STAT + call [ctrl.ctrl_write32] + or eax, 1 + ret .skip: mov edx, PCM_OUT_CR_REG mov ax, 0x11 ;0x1D call [ctrl.ctrl_write8] - ret + jmp .done endp align 4 @@ -792,6 +808,8 @@ end if and eax, 0xFF mov [ctrl.cfg_reg], eax + mov [ctrl.user_callback], 0 + call [ctrl.ctrl_setup] xor eax, eax inc eax diff --git a/kernel/trunk/fs/iso9660.inc b/kernel/trunk/fs/iso9660.inc index e63a3fc650..e232296470 100644 --- a/kernel/trunk/fs/iso9660.inc +++ b/kernel/trunk/fs/iso9660.inc @@ -69,9 +69,11 @@ free_cd_channel: jne .IDE_Channel_2 .IDE_Channel_1: mov [IDE_Channel_1],0 + sti ret .IDE_Channel_2: mov [IDE_Channel_2],0 + sti ret uglobal diff --git a/kernel/trunk/gui/event.inc b/kernel/trunk/gui/event.inc index e27bec54a0..8a46d81c2c 100644 --- a/kernel/trunk/gui/event.inc +++ b/kernel/trunk/gui/event.inc @@ -435,10 +435,8 @@ get_event_for_app: ;; used from f10,f11,f23 jz .no_events ; исчерпали все биты маски, но ничего не нашли ??? btr ecx,eax ; сбрасываем проверяемый бит маски ; переходим на обработчик этого (eax) бита - cmp eax,16 - jae .IRQ ; eax=[16..31]=retvals, events irq0..irq15 cmp eax,9 - jae .loop ; eax=[9..15], ignored + jae .loop ; eax=[9..31], ignored cmp eax,3 je .loop ; eax=3, ignored ja .FlagAutoReset ; eax=[4..8], retvals=eax+1 @@ -451,16 +449,7 @@ get_event_for_app: ;; used from f10,f11,f23 .no_events: xor eax,eax ret -.IRQ: -;TODO: сделать так же, как и для FlagAutoReset (BgrRedraw,Mouse,IPC,Stack,Debug) - mov edx,[irq_owner+eax*4-64] ; eax==16+irq - cmp edx,[edi+TASKDATA.pid] - jne .loop - mov edx,eax - shl edx,12 - cmp dword[IRQ_SAVE+edx-0x10000],0 ; edx==(16+irq)*0x1000 - je .loop ; empty ??? - ret ; retval = eax + .FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9 cmp eax,5 ; Mouse 5+1=6 jne @f diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 845e3da7cf..1adfe3c1de 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1021,7 +1021,6 @@ end if jmp osloop -; jmp $ ; wait here for timer to take control ; Fly :) @@ -1056,8 +1055,8 @@ boot_log: align 32 osloop: call [draw_pointer] - call window_check_events - call mouse_check_events + call window_check_events + call mouse_check_events call checkmisc call checkVga_N13 call stack_handler @@ -1121,58 +1120,31 @@ include "kernel32.inc" reserve_irqs_ports: - push eax - xor eax,eax - inc eax - mov byte [irq_owner+4*0],al ;1 ; timer - ;mov [irq_owner+4*1], 1 ; keyboard - mov byte [irq_owner+4*6],al ;1 ; floppy diskette - mov byte [irq_owner+4*13],al ;1 ; math co-pros - mov byte [irq_owner+4*14],al ;1 ; ide I - mov byte [irq_owner+4*15],al ;1 ; ide II - pop eax ; RESERVE PORTS - push 4 - pop dword [RESERVED_PORTS] ;,edi + mov eax, RESERVED_PORTS + mov ecx, 1 - push 1 - pop dword [RESERVED_PORTS+16+0] ;,dword 1 - and dword [RESERVED_PORTS+16+4],0 ;,dword 0x0 - mov dword [RESERVED_PORTS+16+8],0x2d ;,dword 0x2d + mov [eax], dword 4 - push 1 - pop dword [RESERVED_PORTS+32+0] ;,dword 1 - push 0x30 - pop dword [RESERVED_PORTS+32+4] ;,dword 0x30 - push 0x4d - pop dword [RESERVED_PORTS+32+8] ;,dword 0x4d + mov [eax+16], ecx + mov [eax+16+4], dword 0 + mov [eax+16+4], dword 0x2D - push 1 - pop dword [RESERVED_PORTS+48+0] ;,dword 1 - push 0x50 - pop dword [RESERVED_PORTS+48+4] ;,dword 0x50 - mov dword [RESERVED_PORTS+48+8],0xdf ;,dword 0xdf + mov [eax+32], ecx + mov [eax+32+4], dword 0x30 + mov [eax+32+8], dword 0x4D - push 1 - pop dword [RESERVED_PORTS+64+0] ;,dword 1 + mov [eax+48], ecx + mov [eax+48+4], dword 0x50 + mov [eax+28+8], dword 0xDF - mov dword [RESERVED_PORTS+64+4],0xe5 ;,dword 0xe5 - mov dword [RESERVED_PORTS+64+8],0xff ;,dword 0xff + mov [eax+64], ecx + mov [eax+64+4], dword 0xE5 + mov [eax+64+8], dword 0xFF ret -setirqreadports: - - mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte - and dword [irq12read+4],0 ; end of port list -; mov [irq12read+4],dword 0 ; end of port list - ;mov [irq04read+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte - ;mov [irq04read+4],dword 0 ; end of port list - ;mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte - ;mov [irq03read+4],dword 0 ; end of port list - - ret iglobal process_number dd 0x1 @@ -1254,7 +1226,7 @@ sys_outport: mov [esp+32],eax ret - + .sopl4: mov dx,cx ; read @@ -1563,13 +1535,13 @@ cd_base db 0 endg nsyse4: - + sub ebx,2 ; SYSTEM LANGUAGE jnz nsyse5 mov [syslang],ecx ret nsyse5: - + sub ebx,2 ; HD BASE jnz nsyse7 @@ -1776,7 +1748,7 @@ ngsyse12: mov [esp+32],dword 1 ret - + get_timer_ticks: mov eax,[timer_ticks] ret @@ -2950,7 +2922,7 @@ sheduler: dd sys_sheduler.03 dd sys_sheduler.04 endg -sys_sheduler: +sys_sheduler: ;rewritten by 29.12.2009 jmp dword [sheduler+ebx*4] ;.shed_counter: @@ -2963,7 +2935,7 @@ sys_sheduler: ;.perf_control: inc ebx ;before ebx=2, ebx=3 cmp ebx,ecx ;if ecx=3, ebx=3 - jz cache_disable + jz cache_disable dec ebx ;ebx=2 cmp ebx,ecx ; @@ -2979,7 +2951,7 @@ sys_sheduler: ret -.03: +.03: ;.rdmsr_instr: ;now counter in ecx ;(edx:eax) esi:edi => edx:esi @@ -3480,103 +3452,6 @@ memmove: ; memory move in bytes align 4 - -sys_programirq: - - mov eax, [TASK_BASE] - add ebx, [eax + TASKDATA.mem_start] - - cmp ecx, 16 - jae .not_owner - mov edi, [eax + TASKDATA.pid] - cmp edi, [irq_owner + 4 * ecx] - je .spril1 -.not_owner: - xor ecx, ecx - inc ecx - jmp .end - .spril1: - - shl ecx, 6 - mov esi, ebx - lea edi, [irq00read + ecx] - push 16 - pop ecx - - cld - rep movsd - .end: - mov [esp+32], ecx - ret - - -align 4 - -get_irq_data: - movzx esi, bh ; save number of subfunction, if bh = 1, return data size, otherwise, read data - xor bh, bh - cmp ebx, 16 - jae .not_owner - mov edx, [4 * ebx + irq_owner] ; check for irq owner - - mov eax,[TASK_BASE] - - cmp edx,[eax+TASKDATA.pid] - je gidril1 -.not_owner: - xor edx, edx - dec edx - jmp gid1 - - gidril1: - - shl ebx, 12 - lea eax, [ebx + IRQ_SAVE] ; calculate address of the beginning of buffer + 0x0 - data size - mov edx, [eax] ; + 0x4 - data offset - dec esi - jz gid1 - test edx, edx ; check if buffer is empty - jz gid1 - - mov ebx, [eax + 0x4] - mov edi, ecx - - mov ecx, 4000 ; buffer size, used frequently - - cmp ebx, ecx ; check for the end of buffer, if end of buffer, begin cycle again - jb @f - - xor ebx, ebx - - @@: - - lea esi, [ebx + edx] ; calculate data size and offset - cld - cmp esi, ecx ; if greater than the buffer size, begin cycle again - jbe @f - - sub ecx, ebx - sub edx, ecx - - lea esi, [eax + ebx + 0x10] - rep movsb - - xor ebx, ebx - @@: - lea esi, [eax + ebx + 0x10] - mov ecx, edx - add ebx, edx - - rep movsb - mov edx, [eax] - mov [eax], ecx ; set data size to zero - mov [eax + 0x4], ebx ; set data offset - - gid1: - mov [esp+32], edx ; eax - ret - - set_io_access_rights: push edi eax mov edi, tss._io_map_0 @@ -3588,13 +3463,13 @@ set_io_access_rights: ; shl ebx,cl test ebp,ebp ; cmp ebp,0 ; enable access - ebp = 0 - jnz siar1 + jnz .siar1 ; not ebx ; and [edi],byte bl btr [edi], eax pop eax edi ret -siar1: +.siar1: bts [edi], eax ; or [edi],byte bl ; disable access - ebp = 1 pop eax edi @@ -3605,7 +3480,7 @@ siar1: ; * ecx = number start arrea of ports ; * edx = number end arrea of ports (include last number of port) ;Return value: -; * eax = 0 - succesful +; * eax = 0 - succesful ; * eax = 1 - error ; * The system has reserve this ports: ; 0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (include last number of port). @@ -3749,66 +3624,7 @@ no_mask_io: ret -reserve_free_irq: - - xor esi, esi - inc esi - cmp ecx, 16 - jae ril1 - - push ecx - lea ecx, [irq_owner + 4 * ecx] - mov edx, [ecx] - mov eax, [TASK_BASE] - mov edi, [eax + TASKDATA.pid] - pop eax - dec ebx - jnz reserve_irq - - cmp edx, edi - jne ril1 - dec esi - mov [ecx], esi - - jmp ril1 - - reserve_irq: - - cmp dword [ecx], 0 - jne ril1 - - mov ebx, [f_irqs + 4 * eax] - - stdcall attach_int_handler, eax, ebx, dword 0 - - mov [ecx], edi - - dec esi - ril1: - mov [esp+32], esi ; return in eax - ret - -iglobal -f_irqs: - dd 0x0 - dd 0x0 - dd p_irq2 - dd p_irq3 - dd p_irq4 - dd p_irq5 - dd p_irq6 - dd p_irq7 - dd p_irq8 - dd p_irq9 - dd p_irq10 - dd p_irq11 - dd 0x0 - dd 0x0 - dd 0x0 - dd 0x0 - -endg - +align 4 drawbackground: inc [mouse_pause] cmp [SCR_MODE],word 0x12 @@ -4820,27 +4636,27 @@ syscall_getarea: dec ebx ; eax - x, ebx - y mov edx,ecx - + shr ecx,16 and edx,0xffff mov esi,ecx ; ecx - size x, edx - size y - + mov ebp,edx dec ebp lea ebp,[ebp*3] - + imul ebp,esi - + mov esi,ecx dec esi lea esi,[esi*3] - + add ebp,esi add ebp,edi add ebx,edx - + .start_y: push ecx edx .start_x: @@ -4848,7 +4664,7 @@ syscall_getarea: add eax,ecx call dword [GETPIXEL] ; eax - x, ebx - y - + mov [ebp],cx shr ecx,16 mov [ebp+2],cl @@ -4894,26 +4710,9 @@ syscall_drawline: ; DrawLine mov ecx, edx jmp [draw_line] -align 4 -syscall_getirqowner: ; GetIrqOwner - - cmp ebx,16 - jae .err - - cmp [irq_rights + 4 * ebx], dword 2 - je .err - - mov eax,[4 * ebx + irq_owner] - mov [esp+32],eax - - ret -.err: - or dword [esp+32], -1 - ret align 4 - syscall_reserveportarea: ; ReservePortArea and FreePortArea call r_f_port_area @@ -4921,7 +4720,6 @@ syscall_reserveportarea: ; ReservePortArea and FreePortArea ret align 4 - syscall_threads: ; CreateThreads ; eax=1 create thread ; diff --git a/kernel/trunk/video/blitter.inc b/kernel/trunk/video/blitter.inc index 388bcd5b3d..9fed049aa4 100644 --- a/kernel/trunk/video/blitter.inc +++ b/kernel/trunk/video/blitter.inc @@ -70,7 +70,6 @@ block_clip: mov ebp, ecx mov ecx, [ecx] mov edx, [edx] - mov eax, ebx call __L1OutCode mov esi, eax