Com mouse cod moved to driver.

Begin of reorganization interrupts handlers Part 1.
Some dead code deleted.

git-svn-id: svn://kolibrios.org@769 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Rus 2008-03-13 20:23:15 +00:00
parent 88d5b111cd
commit 07985443ea
11 changed files with 711 additions and 730 deletions

View File

@ -1,7 +1,7 @@
@echo off @echo off
set languages=en ru ge et set languages=en ru ge et
set drivers=sound sis infinity ensoniq ps2mouse uart ati2d vmode set drivers=sound sis infinity ensoniq ps2mouse com_mouse uart ati2d vmode
set targets=all kernel drivers skins clean set targets=all kernel drivers skins clean
call :Check_Target %1 call :Check_Target %1

View File

@ -16,20 +16,29 @@ DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
align 4 align 4
proc attach_int_handler stdcall, irq:dword, handler:dword proc attach_int_handler stdcall, irq:dword, handler:dword
mov ebx, [irq] ;irq num mov ebx, [irq] ;irq num
test ebx, ebx test ebx, ebx
jz .err jz .err
cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's cmp ebx, 15 ; hidnplayr says: we only have 16 IRQ's
ja .err ja .err
mov eax, [handler] mov eax, [handler]
test eax, eax test eax, eax
jz .err jz .err
mov [irq_tab+ebx*4], eax cmp [irq_owner + 4 * ebx], 0
stdcall enable_irq, [irq] jne .err
ret mov [irq_tab+ebx*4], eax
;push eax
;mov eax, [TASK_BASE]
;mov eax, [eax + TASKDATA.pid]
mov [irq_owner + 4 * ebx], 1
;pop eax
stdcall enable_irq, [irq]
ret
.err: .err:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
@ -59,89 +68,75 @@ align 16
irq_serv: irq_serv:
.irq_1: .irq_1:
push eax push 1
mov eax, 1
jmp .main jmp .main
align 4 align 4
.irq_2: .irq_2:
push eax push 2
mov eax, 2
jmp .main jmp .main
align 4 align 4
.irq_3: .irq_3:
push eax push 3
mov eax, 3
jmp .main jmp .main
align 4 align 4
.irq_4: .irq_4:
push eax push 4
mov eax, 4
jmp .main jmp .main
align 4 align 4
.irq_5: .irq_5:
push eax push 5
mov eax, 5
jmp .main jmp .main
align 4 align 4
.irq_6: .irq_6:
push eax push 6
mov eax, 6
jmp .main jmp .main
align 4 align 4
.irq_7: .irq_7:
push eax push 7
mov eax, 7
jmp .main jmp .main
align 4 align 4
.irq_8: .irq_8:
push eax push 8
mov eax, 8
jmp .main jmp .main
align 4 align 4
.irq_9: .irq_9:
push eax push 9
mov eax, 9
jmp .main jmp .main
align 4 align 4
.irq_10: .irq_10:
push eax push 10
mov eax, 10
jmp .main jmp .main
align 4 align 4
.irq_11: .irq_11:
push eax push 11
mov eax, 11
jmp .main jmp .main
align 4 align 4
.irq_12: .irq_12:
push eax push 12
mov eax, 12
jmp .main jmp .main
align 4 align 4
.irq_13: .irq_13:
push eax push 13
mov eax, 13
jmp .main jmp .main
align 4 align 4
.irq_14: .irq_14:
push eax push 14
mov eax, 14
jmp .main jmp .main
align 4 align 4
.irq_15: .irq_15:
push eax push 15
mov eax, 15
jmp .main jmp .main
align 16 align 16
.main: .main:
save_ring3_context save_ring3_context
mov eax, [esp + 32]
mov bx, app_data ;os_data mov bx, app_data ;os_data
mov ds, bx mov ds, bx
mov es, bx mov es, bx
cmp [v86_irqhooks+eax*8], 0 cmp [v86_irqhooks+eax*8], 0
jnz v86_irq jnz v86_irq
mov ebx, [irq_tab+eax*4] mov ebx, [irq_tab+eax*4]
test ebx, ebx test ebx, ebx
@ -151,16 +146,17 @@ align 16
mov [check_idle_semaphore],5 mov [check_idle_semaphore],5
.exit: .exit:
restore_ring3_context
cmp eax, 8 cmp dword [esp + 32], 8
mov al, 0x20 mov al, 0x20
jb @f jb @f
out 0xa0, al out 0xa0, al
@@: @@:
out 0x20, al out 0x20, al
pop eax restore_ring3_context
add esp, 4
iret iret
align 4 align 4
@ -183,7 +179,7 @@ endp
align 4 align 4
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
push ebx push ebx
xor eax, eax xor eax, eax
xor ebx, ebx xor ebx, ebx
mov ah, byte [bus] mov ah, byte [bus]
@ -191,13 +187,13 @@ proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
mov bh, byte [devfn] mov bh, byte [devfn]
mov bl, byte [reg] mov bl, byte [reg]
call pci_read_reg call pci_read_reg
pop ebx pop ebx
ret ret
endp endp
align 4 align 4
proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword
push ebx push ebx
xor eax, eax xor eax, eax
xor ebx, ebx xor ebx, ebx
mov ah, byte [bus] mov ah, byte [bus]
@ -205,13 +201,13 @@ proc pci_read16 stdcall, bus:dword, devfn:dword, reg:dword
mov bh, byte [devfn] mov bh, byte [devfn]
mov bl, byte [reg] mov bl, byte [reg]
call pci_read_reg call pci_read_reg
pop ebx pop ebx
ret ret
endp endp
align 4 align 4
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
push ebx push ebx
xor eax, eax xor eax, eax
xor ebx, ebx xor ebx, ebx
mov ah, byte [bus] mov ah, byte [bus]
@ -219,13 +215,13 @@ proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
mov bh, byte [devfn] mov bh, byte [devfn]
mov bl, byte [reg] mov bl, byte [reg]
call pci_read_reg call pci_read_reg
pop ebx pop ebx
ret ret
endp endp
align 4 align 4
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
push ebx push ebx
xor eax, eax xor eax, eax
xor ebx, ebx xor ebx, ebx
mov ah, byte [bus] mov ah, byte [bus]
@ -234,13 +230,13 @@ proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
mov bl, byte [reg] mov bl, byte [reg]
mov ecx, [val] mov ecx, [val]
call pci_write_reg call pci_write_reg
pop ebx pop ebx
ret ret
endp endp
align 4 align 4
proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
push ebx push ebx
xor eax, eax xor eax, eax
xor ebx, ebx xor ebx, ebx
mov ah, byte [bus] mov ah, byte [bus]
@ -249,13 +245,13 @@ proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
mov bl, byte [reg] mov bl, byte [reg]
mov ecx, [val] mov ecx, [val]
call pci_write_reg call pci_write_reg
pop ebx pop ebx
ret ret
endp endp
align 4 align 4
proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
push ebx push ebx
xor eax, eax xor eax, eax
xor ebx, ebx xor ebx, ebx
mov ah, byte [bus] mov ah, byte [bus]
@ -264,7 +260,7 @@ proc pci_write32 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
mov bl, byte [reg] mov bl, byte [reg]
mov ecx, [val] mov ecx, [val]
call pci_write_reg call pci_write_reg
pop ebx pop ebx
ret ret
endp endp
@ -363,30 +359,30 @@ endp
align 4 align 4
proc reg_service stdcall, name:dword, handler:dword proc reg_service stdcall, name:dword, handler:dword
xor eax, eax xor eax, eax
cmp [name], eax cmp [name], eax
je .fail je .fail
cmp [handler], eax cmp [handler], eax
je .fail je .fail
push ebx push ebx
mov eax, SRV_SIZE mov eax, SRV_SIZE
call malloc ;call alloc_service call malloc ;call alloc_service
pop ebx pop ebx
test eax, eax test eax, eax
jz .fail jz .fail
push ebx push ebx
push esi push esi
push edi push edi
mov edi, eax mov edi, eax
mov esi, [name] mov esi, [name]
mov ecx, 16/4 mov ecx, 16/4
rep movsd rep movsd
pop edi pop edi
pop esi pop esi
mov [eax+SRV.magic], ' SRV' mov [eax+SRV.magic], ' SRV'
mov [eax+SRV.size], SRV_SIZE mov [eax+SRV.size], SRV_SIZE
@ -398,13 +394,13 @@ proc reg_service stdcall, name:dword, handler:dword
mov [ebx+SRV.fd], eax mov [ebx+SRV.fd], eax
mov [edx+SRV.bk], eax mov [edx+SRV.bk], eax
mov ecx, [handler] mov ecx, [handler]
mov [eax+SRV.srv_proc], ecx mov [eax+SRV.srv_proc], ecx
pop ebx pop ebx
ret ret
.fail: .fail:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
@ -1051,12 +1047,12 @@ proc stop_all_services
cmp [edx+SRV.size], SRV_SIZE cmp [edx+SRV.size], SRV_SIZE
jne .next jne .next
mov ebx, [edx+SRV.entry] mov ebx, [edx+SRV.entry]
mov edx, [edx+SRV.fd] mov edx, [edx+SRV.fd]
test ebx, ebx test ebx, ebx
jz .next jz .next
push edx push edx
stdcall ebx, dword -1 stdcall ebx, dword -1
pop edx pop edx
jmp .next jmp .next

View File

@ -18,6 +18,8 @@ iglobal
szAttachIntHandler db 'AttachIntHandler',0 szAttachIntHandler db 'AttachIntHandler',0
szFpuSave db 'FpuSave',0 szFpuSave db 'FpuSave',0
szFpuRestore db 'FpuRestore',0 szFpuRestore db 'FpuRestore',0
szReservePortArea db 'ReservePortArea',0
szBoot_Log db 'Boot_Log',0
szPciApi db 'PciApi', 0 szPciApi db 'PciApi', 0
szPciRead32 db 'PciRead32', 0 szPciRead32 db 'PciRead32', 0
@ -33,7 +35,7 @@ iglobal
szGetPgAddr db 'GetPgAddr',0 szGetPgAddr db 'GetPgAddr',0
szMapPage db 'MapPage',0 szMapPage db 'MapPage',0
szMapSpace db 'MapSpace',0 szMapSpace db 'MapSpace',0
szMapIoMem db 'MapIoMem',0 szMapIoMem db 'MapIoMem',0
szCommitPages db 'CommitPages',0 szCommitPages db 'CommitPages',0
szReleasePages db 'ReleasePages',0 szReleasePages db 'ReleasePages',0
@ -88,6 +90,8 @@ kernel_export:
dd szAttachIntHandler, attach_int_handler dd szAttachIntHandler, attach_int_handler
dd szFpuSave , fpu_save dd szFpuSave , fpu_save
dd szFpuRestore , fpu_restore dd szFpuRestore , fpu_restore
dd szReservePortArea , r_f_port_area
dd szBoot_Log , boot_log
dd szPciApi , pci_api dd szPciApi , pci_api
dd szPciRead32 , pci_read32 dd szPciRead32 , pci_read32
@ -102,7 +106,7 @@ kernel_export:
dd szFreePage , free_page dd szFreePage , free_page
dd szMapPage , map_page ;stdcall dd szMapPage , map_page ;stdcall
dd szMapSpace , map_space dd szMapSpace , map_space
dd szMapIoMem , map_io_mem ;stdcall dd szMapIoMem , map_io_mem ;stdcall
dd szGetPgAddr , get_pg_addr dd szGetPgAddr , get_pg_addr
dd szCommitPages , commit_pages ;not implemented dd szCommitPages , commit_pages ;not implemented
dd szReleasePages , release_pages dd szReleasePages , release_pages

View File

@ -183,20 +183,12 @@ macro irqh [num]
{ {
forward forward
p_irq#num : p_irq#num :
save_ring3_context
mov edi, num mov edi, num
jmp irq_c jmp irqhandler
} }
irqh 2,5,7,8,9,10,11 irqh 2,3,4,5,7,8,9,10,11
irq_c:
mov ax, app_data ;os_data
mov ds, ax
mov es, ax
call irqhandler
restore_ring3_context
iret
p_irq6: p_irq6:
save_ring3_context save_ring3_context
@ -208,41 +200,6 @@ p_irq6:
restore_ring3_context restore_ring3_context
iret iret
p_irq3:
save_ring3_context
mov ax, app_data ;os_data
mov ds, ax
mov es, ax
cmp [com2_mouse_detected],0
je old_irq3_handler
mov esi, com2_mouse
mov dx, 2F8h ;[COMPortBaseAddr]
call check_mouse_data_com
jmp p_irq3_1
old_irq3_handler:
mov edi,3
call irqhandler
p_irq3_1:
restore_ring3_context
iret
p_irq4:
save_ring3_context
mov ax, app_data ;os_data
mov ds, ax
mov es, ax
cmp [com1_mouse_detected],0
je old_irq4_handler
mov esi, com1_mouse
mov dx, 3F8h ;[COMPortBaseAddr]
call check_mouse_data_com
jmp p_irq4_1
old_irq4_handler:
mov edi,4
call irqhandler
p_irq4_1:
restore_ring3_context
iret
p_irq14: p_irq14:
save_ring3_context save_ring3_context
@ -303,7 +260,6 @@ irqhandler:
cmp [v86_irqhooks+edi*8], 0 cmp [v86_irqhooks+edi*8], 0
jnz v86_irq2 jnz v86_irq2
push edi
mov esi,edi ; 1 mov esi,edi ; 1
shl esi,6 ; 1 shl esi,6 ; 1
@ -312,8 +268,6 @@ irqhandler:
add edi,IRQ_SAVE add edi,IRQ_SAVE
mov ecx,16 mov ecx,16
mov [check_idle_semaphore],5
irqnewread: irqnewread:
dec ecx dec ecx
js irqover js irqover
@ -368,15 +322,6 @@ irqhandler:
irqfull: irqfull:
irqover: irqover:
mov al,0x20 ; ready for next irq
out 0x20,al
pop ebx
cmp ebx,7
jbe noa0
out 0xa0,al
noa0:
ret ret

View File

@ -68,7 +68,7 @@ keymap_alt:
boot_failed db 'Failed to start first app',0 boot_failed db 'Failed to start first app',0
boot_mtrr db 'Setting MTRR',0 boot_mtrr db 'Setting MTRR',0
if preboot_blogesc if preboot_blogesc
boot_tasking db 'All set - press ESC to start',0 boot_tasking db 'All set - press ESC to start',0
end if end if
new_process_loading db 'K : New Process - loading',13,10,0 new_process_loading db 'K : New Process - loading',13,10,0
@ -88,6 +88,7 @@ AMD_str db "AuthenticAMD",0
;szInfinity db 'INFINITY',0 ;szInfinity db 'INFINITY',0
szHwMouse db 'ATI2D',0 szHwMouse db 'ATI2D',0
szPS2MDriver db 'PS2MOUSE',0 szPS2MDriver db 'PS2MOUSE',0
szCOM_MDriver db 'COM_MOUSE',0
szUSB db 'USB',0 szUSB db 'USB',0
szSTART db 'START',0 szSTART db 'START',0
@ -385,8 +386,7 @@ hd_entries rd 1 ;unused ? 0xfe10
mouse_active rd 1 mouse_active rd 1
mouse_pause rd 1 mouse_pause rd 1
MouseTickCounter rd 1 MouseTickCounter rd 1
com1_mouse_detected rb 1
com2_mouse_detected rb 1
;* end code - Mario79 ;* end code - Mario79
img_background rd 1 img_background rd 1

View File

@ -1,135 +0,0 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
;**************************************************
;* ÏÎÈÑÊ ÌÛØÈ ÏÎ ÏÎÑËÅÄÎÂÀÒÅËÜÍÛÌ ÏÎÐÒÀÌ *
;* Ïðîöåäóðà ïîäãîòàâëèâàåò ãëîáàëüíûå ïåðåìåííûå *
;* COMPortNum è COMPortBaseAddr äëÿ ïîäïðîãðàììû *
;* óñòàíîâêè îáðàáîò÷èêà ïðåðûâàíèÿ *
;**************************************************
; Àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷.
; Àäàïòàöèÿ è äîðàáîòêà Mario79
Detect_COM_Mouse:
pusha
call MSMouseSearch
cmp AL,'M'
jne @f
mov [com1_mouse_detected],1
mov [irq_owner+4*4], 1 ; IRQ4 owner is System
mov eax, [RESERVED_PORTS]
inc eax
mov [RESERVED_PORTS], eax
shl eax, 4
mov [RESERVED_PORTS+eax+0], dword 1
mov [RESERVED_PORTS+eax+4], dword 0x3F8
mov [RESERVED_PORTS+eax+8], dword 0x3FF
mov esi,boot_setmouse_type+22
call boot_log
@@:
sub [COMPortBaseAddr],100h
call MSMouseSearch
cmp AL,'M'
jne @f
mov [com2_mouse_detected],1
mov [irq_owner+3*4], 1 ; IRQ3 owner is System
mov eax, [RESERVED_PORTS]
inc eax
mov [RESERVED_PORTS], eax
shl eax, 4
mov [RESERVED_PORTS+eax+0], dword 1
mov [RESERVED_PORTS+eax+4], dword 0x2F8
mov [RESERVED_PORTS+eax+8], dword 0x2FF
mov esi,boot_setmouse_type+44
call boot_log
@@:
popa
jmp end_detecting_mouse
MSMouseSearch:
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ
MouseSearch:
; Óñòàíàâëèâàåì ñêîðîñòü
; ïðèåìà/ïåðåäà÷è 1200 áîä
mov DX,[COMPortBaseAddr]
add DX,3
in AL,DX
or AL,80h ;óñòàíîâèòü áèò DLAB
out DX,AL
mov DX,[COMPortBaseAddr]
mov AL,60h ;1200 áîä
out DX,AL
inc DX
mov AL,0
out DX,AL
; Óñòàíîâèòü äëèíó ñëîâà 7 áèò, 1 ñòîïîâûé áèò,
; ÷åòíîñòü íå êîíòðîëèðîâàòü
mov DX,[COMPortBaseAddr]
add DX,3
mov AL,00000010b
out DX,AL
; Çàïðåòèòü âñå ïðåðûâàíè
mov DX,[COMPortBaseAddr]
inc DX
mov AL,0
out DX,AL
; Ïðîâåðèòü, ÷òî óñòðîéñòâî ïîäêëþ÷åíî è ÿâëÿåòñ
; ìûøüþ òèïà MSMouse
; Îòêëþ÷èòü ïèòàíèå ìûøè è ïðåðûâàíè
mov DX,[COMPortBaseAddr]
add EDX,4 ;ðåãèñòð óïðàâëåíèÿ ìîäåìîì
mov AL,0 ;ñáðîñèòü DTR, RTS è OUT2
out DX,AL
; Îæèäàòü 5 "òèêîâ" (0,2 ñ)
mov ecx, 0xFFFF
loop $
; Âêëþ÷èòü ïèòàíèå ìûøè
mov al, 1
out dx, al
mov ecx, 0xFFFF
loop $
; Î÷èñòèòü ðåãèñòð äàííûõ
sub edx, 4
in AL,DX
add edx, 4
mov AL,11b ;óñòàíîâèòü DTR è RTS
out DX,AL
mov ecx, 0x1FFFF
; Öèêë îïðîñà ïîðòà
WaitData:
; Îæèäàòü åùå 10 "òèêîâ"
dec ecx
cmp ecx,0
je NoMouse
; Ïðîâåðèòü íàëè÷èå èäåíòèôèêàöèîííîãî áàéòà
mov DX,[COMPortBaseAddr]
add DX,5
in AL,DX
test AL,1 ;Äàííûå ãîòîâû?
jz WaitData
; Ââåñòè äàííûå
mov DX,[COMPortBaseAddr]
in AL,DX
NoMouse:
ret
iglobal
COMPortBaseAddr dw 3F8h
;COMPortNum dw 0
endg
iglobal
boot_setmouse_type db 'Detected - PS2 mouse',0
db 'Detected - COM1 mouse',0
db 'Detected - COM2 mouse',0
endg
end_detecting_mouse:

View File

@ -0,0 +1,375 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;driver sceletone
format MS COFF
API_VERSION equ 5 ;debug
include 'proc32.inc'
include 'imports.inc'
OS_BASE equ 0x80000000;
new_app_base equ 0x0
PROC_BASE equ OS_BASE+0x0080000
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
public START
public version
DEBUG equ 0
DRV_ENTRY equ 1
DRV_EXIT equ -1
STRIDE equ 4 ;size of row in devices table
SRV_GETVERSION equ 0
section '.flat' code readable align 16
proc START stdcall, state:dword
cmp [state], 1
jne .exit
.entry:
;Detect_COM_Mouse:
if DEBUG
mov esi, msgInit
call Boot_Log
end if
mov bx, 0x3f8
call MSMouseSearch
cmp AL,'M'
jne @f
;mov [com1_mouse_detected],1
;mov [irq_owner+4*4], 1 ; IRQ4 owner is System
mov dx, bx
inc dx ; 0x3f8 + 1
mov al, 1
out dx, al
stdcall AttachIntHandler, 4, irq4_handler
if DEBUG
cmp eax, 0
jne .label1
mov esi, msg_error_attach_int_handler
call Boot_Log
end if
.label1:
mov eax, 0
mov ebx, 0x3F8
mov ecx, 0x3FF
call ReservePortArea
if DEBUG
cmp eax, 1
jne .go
mov esi, msg_error_reserve_ports
call Boot_Log
.go:
mov esi,boot_setmouse_type
call Boot_Log
end if
@@:
mov bx, 0x2f8
call MSMouseSearch
cmp AL,'M'
jne .resume
;mov [com2_mouse_detected],1
;mov [irq_owner+3*4], 1 ; IRQ3 owner is System
stdcall AttachIntHandler, 3, irq3_handler
mov eax, 0
mov ebx, 0x2F8
mov ecx, 0x3F8
call ReservePortArea
if DEBUG
cmp eax, 1
jne @f
mov esi, msg_error_reserve_ports
call Boot_Log
@@:
mov esi,boot_setmouse_type + 22
call Boot_Log
end if
.resume:
stdcall RegService, my_service, service_proc
if DEBUG
cmp eax, 0
jne @f
mov esi, msg_exit
call Boot_Log
end if
@@:
ret
.fail:
.exit:
if DEBUG
mov esi, msg_exit
call Boot_Log
end if
xor eax, eax
ret
endp
handle equ IOCTL.handle
io_code equ IOCTL.io_code
input equ IOCTL.input
inp_size equ IOCTL.inp_size
output equ IOCTL.output
out_size equ IOCTL.out_size
align 4
proc service_proc stdcall, ioctl:dword
mov ebx, [ioctl]
mov eax, [ebx+io_code]
cmp eax, SRV_GETVERSION
jne @F
mov eax, [ebx+output]
cmp [ebx+out_size], 4
jne .fail
mov [eax], dword API_VERSION
xor eax, eax
ret
@@:
.fail:
or eax, -1
ret
endp
align 4
MSMouseSearch:
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ
MouseSearch:
; Óñòàíàâëèâàåì ñêîðîñòü
; ïðèåìà/ïåðåäà÷è 1200 áîä
; in bx COM Port Base Address
mov DX, bx
add DX,3
in AL,DX
or AL,80h ;óñòàíîâèòü áèò DLAB
out DX,AL
mov DX, bx
mov AL,60h ;1200 áîä
out DX,AL
inc DX
mov AL,0
out DX,AL
; Óñòàíîâèòü äëèíó ñëîâà 7 áèò, 1 ñòîïîâûé áèò,
; ÷åòíîñòü íå êîíòðîëèðîâàòü
mov DX, bx
add DX,3
mov AL,00000010b
out DX,AL
; Çàïðåòèòü âñå ïðåðûâàíè
mov dx, bx
inc dx
mov AL,0
out DX,AL
; Ïðîâåðèòü, ÷òî óñòðîéñòâî ïîäêëþ÷åíî è ÿâëÿåòñ
; ìûøüþ òèïà MSMouse
; Îòêëþ÷èòü ïèòàíèå ìûøè è ïðåðûâàíè
mov DX, bx
add EDX,4 ;ðåãèñòð óïðàâëåíèÿ ìîäåìîì
mov AL,0 ;ñáðîñèòü DTR, RTS è OUT2
out DX,AL
; Îæèäàòü 5 "òèêîâ" (0,2 ñ)
mov ecx, 0xFFFF
loop $
; Âêëþ÷èòü ïèòàíèå ìûøè
mov al, 1
out dx, al
mov ecx, 0xFFFF
loop $
; Î÷èñòèòü ðåãèñòð äàííûõ
mov dx, bx
in AL,DX
add edx, 4
mov AL, 1011b ;óñòàíîâèòü DTR è RTS è OUT2
out DX,AL
mov ecx, 0x1FFFF
; Öèêë îïðîñà ïîðòà
WaitData:
; Îæèäàòü åùå 10 "òèêîâ"
dec ecx
cmp ecx,0
je NoMouse
; Ïðîâåðèòü íàëè÷èå èäåíòèôèêàöèîííîãî áàéòà
mov DX, bx
add DX,5
in AL,DX
test AL,1 ;Äàííûå ãîòîâû?
jz WaitData
; Ââåñòè äàííûå
mov DX, bx
in AL,DX
NoMouse:
ret
align 4
irq3_handler:
mov dx, 0x2f8
mov esi, com2_mouse
jmp irq_handler
align 4
irq4_handler:
mov dx, 0x3f8
mov esi, com1_mouse
irq_handler:
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
add edx, 5 ; xFDh
in al, dx
test al, 1 ; Äàííûå ãîòîâû?
jz .Error
; Ââåñòè äàííûå
sub edx, 5
in al, dx
; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò
and al, 01111111b
; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà
cmp [esi+COM_MOUSE_DATA.MouseByteNumber], 2
ja .Error
jz .ThirdByte
jp .SecondByte
; Ñîõðàíèòü ïåðâûé áàéò äàííûõ
.FirstByte:
test al, 1000000b ; Ïåðâûé áàéò ïîñûëêè?
jz .Error
mov [esi+COM_MOUSE_DATA.FirstByte], al
inc [esi+COM_MOUSE_DATA.MouseByteNumber]
jmp .EndMouseInterrupt
; Ñîõðàíèòü âòîðîé áàéò äàííûõ
.SecondByte:
test al, 1000000b
jnz .Error
mov [esi+COM_MOUSE_DATA.SecondByte], al
inc [esi+COM_MOUSE_DATA.MouseByteNumber]
jmp .EndMouseInterrupt
; Ñîõðàíèòü òðåòèé áàéò äàííûõ
.ThirdByte:
test al, 1000000b
jnz .Error
mov [esi+COM_MOUSE_DATA.ThirdByte], al
mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0
; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ).
; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè
mov al, [esi+COM_MOUSE_DATA.FirstByte]
mov ah, al
shr al, 3
and al, 2
shr ah, 5
and ah, 1
add al, ah
movzx eax, al
mov [BTN_DOWN], eax
; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X
mov al, [esi+COM_MOUSE_DATA.FirstByte]
shl al, 6
or al, [esi+COM_MOUSE_DATA.SecondByte]
cbw
movzx eax, ax
mov [MOUSE_X], eax
; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y
mov al, [esi+COM_MOUSE_DATA.FirstByte]
and al, 00001100b
shl al, 4
or al, [esi+COM_MOUSE_DATA.ThirdByte]
cbw
movzx eax, ax
neg eax
mov [MOUSE_Y], eax
stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0
jmp .EndMouseInterrupt
.Error:
; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò
; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ
mov [esi+COM_MOUSE_DATA.MouseByteNumber],0
.EndMouseInterrupt:
ret
;all initialized data place here
align 4
struc COM_MOUSE_DATA {
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà
.MouseByteNumber db ?
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ
.FirstByte db ?
.SecondByte db ?
.ThirdByte db ?
;.timer_ticks_com dd ?
}
virtual at 0
COM_MOUSE_DATA COM_MOUSE_DATA
end virtual
com1_mouse COM_MOUSE_DATA
com2_mouse COM_MOUSE_DATA
MOUSE_X dd 0
MOUSE_Y dd 0
BTN_DOWN dd 0
COMPortBaseAddr dw 3F8h
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
my_service db 'MY_SERVICE',0 ;max 16 chars include zero
if DEBUG
msgInit db 'Preved bugoga!',13,10,0
boot_setmouse_type db 'Detected - COM1 mouse',13,10,0
db 'Detected - COM2 mouse',13,10,0
msg_error_reserve_ports db 'Error reserving ports!',13,10,0
msg_error_attach_int_handler db 'Error attach interrupt handler!',13,10,0
msg_exit db 'Exit!',13,10,0
end if
section '.data' data readable writable align 16
;all uninitialized data place here

View File

@ -21,6 +21,8 @@ kernel_export \
AttachIntHandler,\ AttachIntHandler,\
FpuSave,\ FpuSave,\
FpuRestore,\ FpuRestore,\
ReservePortArea,\
Boot_Log,\
\ \
PciApi,\ PciApi,\
PciRead32,\ PciRead32,\
@ -35,7 +37,7 @@ kernel_export \
FreePage,\ FreePage,\
MapPage,\ MapPage,\
MapSpace,\ MapSpace,\
MapIoMem,\ MapIoMem,\
GetPgAddr,\ GetPgAddr,\
CommitPages,\ CommitPages,\
ReleasePages,\ ReleasePages,\

View File

@ -1,143 +0,0 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
struc COM_MOUSE_DATA {
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà
.MouseByteNumber db ?
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ
.FirstByte db ?
.SecondByte db ?
.ThirdByte db ?
.timer_ticks_com dd ?
}
virtual at 0
COM_MOUSE_DATA COM_MOUSE_DATA
end virtual
uglobal
com1_mouse COM_MOUSE_DATA
com2_mouse COM_MOUSE_DATA
endg
;***************************************
;* ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ *
;***************************************
check_mouse_data_com:
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
add edx, 5 ; xFDh
in al, dx
test al, 1 ; Äàííûå ãîòîâû?
jz .Error
; Ââåñòè äàííûå
sub edx, 5
in al, dx
; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò
and al, 01111111b
; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà
cmp [esi+COM_MOUSE_DATA.MouseByteNumber], 2
ja .Error
jz .ThirdByte
jp .SecondByte
; Ñîõðàíèòü ïåðâûé áàéò äàííûõ
.FirstByte:
test al, 1000000b ; Ïåðâûé áàéò ïîñûëêè?
jz .Error
mov [esi+COM_MOUSE_DATA.FirstByte], al
inc [esi+COM_MOUSE_DATA.MouseByteNumber]
jmp .EndMouseInterrupt
; Ñîõðàíèòü âòîðîé áàéò äàííûõ
.SecondByte:
test al, 1000000b
jnz .Error
mov [esi+COM_MOUSE_DATA.SecondByte], al
inc [esi+COM_MOUSE_DATA.MouseByteNumber]
jmp .EndMouseInterrupt
; Ñîõðàíèòü òðåòèé áàéò äàííûõ
.ThirdByte:
test al, 1000000b
jnz .Error
mov [esi+COM_MOUSE_DATA.ThirdByte], al
mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0
; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ).
; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè
mov al, [esi+COM_MOUSE_DATA.FirstByte]
mov ah, al
shr al, 3
and al, 2
shr ah, 5
and ah, 1
add al, ah
mov [BTN_DOWN], al
mov [mouse_active], 1
; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X
mov al, [esi+COM_MOUSE_DATA.FirstByte]
shl al, 6
or al, [esi+COM_MOUSE_DATA.SecondByte]
call mouse_acceleration_com
; mouse acceleration
mov ecx, [timer_ticks]
sub ecx, [esi+COM_MOUSE_DATA.timer_ticks_com]
cmp ecx, [mouse_delay]
ja @f
imul ax, [mouse_speed_factor]
@@:
add ax, [MOUSE_X]
; Êóðñîð íå äîëæåí âûõîäèòü çà ëåâóþ èëè ïðàâóþ ãðàíèöó ýêðàíà
js .x1
cmp ax, [Screen_Max_X]
jb .x2
; Óñòàíîâèòü êîîðäèíàòó X ïî ïðàâîé ãðàíèöå
mov ax, [Screen_Max_X]
jmp .x2
.x1:
; Óñòàíîâèòü êîîðäèíàòó X ïî ëåâîé ãðàíèöå
xor eax, eax
.x2:
mov [MOUSE_X], ax
; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y
mov al, [esi+COM_MOUSE_DATA.FirstByte]
and al, 00001100b
shl al, 4
or al, [esi+COM_MOUSE_DATA.ThirdByte]
call mouse_acceleration_com
add ax, [MOUSE_Y]
; Êóðñîð íå äîëæåí âûõîäèòü çà âåðõíþþ èëè íèæíþþ ãðàíèöó ýêðàíà
js .y1
cmp ax, [Screen_Max_Y]
jb .y2
; Óñòàíîâèòü êîîðäèíàòó Y ïî íèæíåé ãðàíèöå
mov ax, [Screen_Max_Y]
jmp .y2
.y1:
; Óñòàíîâèòü êîîðäèíàòó Y ïî âåðõíåé ãðàíèöå
xor eax, eax
.y2:
mov [MOUSE_Y], ax
mov eax, [timer_ticks]
mov [esi+COM_MOUSE_DATA.timer_ticks_com], eax
jmp .EndMouseInterrupt
.Error:
; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò
; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ
mov [esi+COM_MOUSE_DATA.MouseByteNumber],0
.EndMouseInterrupt:
jmp ready_for_next_irq
mouse_acceleration_com:
cbw
mov ecx, [timer_ticks]
sub ecx, [esi+COM_MOUSE_DATA.timer_ticks_com]
cmp ecx, [mouse_delay]
ja @f
imul ax, [mouse_speed_factor]
@@:
ret

View File

@ -27,12 +27,12 @@ uglobal
endg endg
iglobal iglobal
mouse_delay dd 10 mouse_delay dd 10
mouse_speed_factor: dd 3 mouse_speed_factor: dd 3
mouse_timer_ticks dd 0 mouse_timer_ticks dd 0
endg endg
include 'm_com.inc' ;include 'm_com.inc'
;test_mario79: ;test_mario79:
@ -49,165 +49,165 @@ include 'm_com.inc'
;process_test_m79 db 'K : Process - test Mario79 error 00000000',13,10,0 ;process_test_m79 db 'K : Process - test Mario79 error 00000000',13,10,0
draw_mouse_under: draw_mouse_under:
; return old picture ; return old picture
cmp [set_hw_cursor], 0 cmp [set_hw_cursor], 0
jz @F jz @F
pushad pushad
movzx eax,word [X_UNDER] movzx eax,word [X_UNDER]
movzx ebx,word [Y_UNDER] movzx ebx,word [Y_UNDER]
stdcall [hw_restore], eax, ebx stdcall [hw_restore], eax, ebx
popad popad
ret ret
@@: @@:
pushad pushad
xor ecx,ecx xor ecx,ecx
xor edx,edx xor edx,edx
align 4 align 4
mres: mres:
movzx eax,word [X_UNDER] movzx eax,word [X_UNDER]
movzx ebx,word [Y_UNDER] movzx ebx,word [Y_UNDER]
add eax,ecx add eax,ecx
add ebx,edx add ebx,edx
push ecx push ecx
push edx push edx
push eax push eax
push ebx push ebx
mov eax,edx mov eax,edx
shl eax,6 shl eax,6
shl ecx,2 shl ecx,2
add eax,ecx add eax,ecx
add eax,mouseunder add eax,mouseunder
mov ecx,[eax] mov ecx,[eax]
pop ebx pop ebx
pop eax pop eax
mov edi, 1 ;force mov edi, 1 ;force
call [putpixel] call [putpixel]
pop edx pop edx
pop ecx pop ecx
inc ecx inc ecx
cmp ecx, 16 cmp ecx, 16
jnz mres jnz mres
xor ecx, ecx xor ecx, ecx
inc edx inc edx
cmp edx, 24 cmp edx, 24
jnz mres jnz mres
popad popad
ret ret
save_draw_mouse: save_draw_mouse:
cmp [set_hw_cursor], 0 cmp [set_hw_cursor], 0
je .no_hw_cursor je .no_hw_cursor
pushad pushad
mov [X_UNDER],ax mov [X_UNDER],ax
mov [Y_UNDER],bx mov [Y_UNDER],bx
movzx eax,word [MOUSE_Y] movzx eax,word [MOUSE_Y]
movzx ebx,word [MOUSE_X] movzx ebx,word [MOUSE_X]
push eax push eax
push ebx push ebx
mov ecx, [Screen_Max_X] mov ecx, [Screen_Max_X]
inc ecx inc ecx
mul ecx mul ecx
movzx edx, byte [display_data+ebx+eax] movzx edx, byte [display_data+ebx+eax]
shl edx, 8 shl edx, 8
mov ecx, [edx+SLOT_BASE+APPDATA.cursor] mov ecx, [edx+SLOT_BASE+APPDATA.cursor]
cmp ecx, [current_cursor] cmp ecx, [current_cursor]
je .draw je .draw
cmp [ecx+CURSOR.magic], 'CURS' cmp [ecx+CURSOR.magic], 'CURS'
jne .fail jne .fail
push ecx push ecx
call [select_hw_cursor] call [select_hw_cursor]
mov [current_cursor], ecx mov [current_cursor], ecx
; cmp [ecx+CURSOR.size], CURSOR_SIZE ; cmp [ecx+CURSOR.size], CURSOR_SIZE
; jne .fail ; jne .fail
.draw: .draw:
stdcall [set_hw_cursor], ecx stdcall [set_hw_cursor], ecx
popad popad
ret ret
.fail: .fail:
mov ecx, [def_cursor] mov ecx, [def_cursor]
mov [edx+SLOT_BASE+APPDATA.cursor], ecx mov [edx+SLOT_BASE+APPDATA.cursor], ecx
stdcall [set_hw_cursor], ecx stdcall [set_hw_cursor], ecx
popad popad
ret ret
.no_hw_cursor: .no_hw_cursor:
pushad pushad
; save & draw ; save & draw
mov [X_UNDER],ax mov [X_UNDER],ax
mov [Y_UNDER],bx mov [Y_UNDER],bx
push eax push eax
push ebx push ebx
mov ecx,0 mov ecx,0
mov edx,0 mov edx,0
align 4 align 4
drm: drm:
push eax push eax
push ebx push ebx
push ecx push ecx
push edx push edx
; helloworld ; helloworld
push ecx push ecx
add eax,ecx ; save picture under mouse add eax,ecx ; save picture under mouse
add ebx,edx add ebx,edx
push ecx push ecx
call getpixel call getpixel
mov [COLOR_TEMP],ecx mov [COLOR_TEMP],ecx
pop ecx pop ecx
mov eax,edx mov eax,edx
shl eax,6 shl eax,6
shl ecx,2 shl ecx,2
add eax,ecx add eax,ecx
add eax,mouseunder add eax,mouseunder
mov ebx,[COLOR_TEMP] mov ebx,[COLOR_TEMP]
mov [eax],ebx mov [eax],ebx
pop ecx pop ecx
mov edi,edx ; y cycle mov edi,edx ; y cycle
shl edi,4 ; *16 bytes per row shl edi,4 ; *16 bytes per row
add edi,ecx ; x cycle add edi,ecx ; x cycle
mov esi, edi mov esi, edi
add edi, esi add edi, esi
add edi, esi ; *3 add edi, esi ; *3
add edi,[MOUSE_PICTURE] ; we have our str address add edi,[MOUSE_PICTURE] ; we have our str address
mov esi, edi mov esi, edi
add esi, 16*24*3 add esi, 16*24*3
push ecx push ecx
mov ecx, [COLOR_TEMP] mov ecx, [COLOR_TEMP]
call combine_colors call combine_colors
mov [MOUSE_COLOR_MEM], ecx mov [MOUSE_COLOR_MEM], ecx
pop ecx pop ecx
pop edx pop edx
pop ecx pop ecx
pop ebx pop ebx
pop eax pop eax
add eax,ecx ; we have x coord+cycle add eax,ecx ; we have x coord+cycle
add ebx,edx ; and y coord+cycle add ebx,edx ; and y coord+cycle
push ecx push ecx
mov ecx, [MOUSE_COLOR_MEM] mov ecx, [MOUSE_COLOR_MEM]
mov edi, 1 mov edi, 1
call [putpixel] call [putpixel]
pop ecx pop ecx
mov ebx,[esp+0] ; pure y coord again mov ebx,[esp+0] ; pure y coord again
mov eax,[esp+4] ; and x mov eax,[esp+4] ; and x
inc ecx ; +1 cycle inc ecx ; +1 cycle
cmp ecx,16 ; if more than 16 cmp ecx,16 ; if more than 16
jnz drm jnz drm
xor ecx, ecx xor ecx, ecx
inc edx inc edx
cmp edx,24 cmp edx,24
jnz drm jnz drm
add esp,8 add esp,8
popad popad
ret ret
combine_colors: combine_colors:
@ -223,7 +223,7 @@ combine_colors:
push edx push edx
push ecx push ecx
xor ecx, ecx xor ecx, ecx
; byte 2 ; byte 2
mov eax, 0xff mov eax, 0xff
sub al, [esi+0] sub al, [esi+0]
mov ebx, [esp] mov ebx, [esp]
@ -240,7 +240,7 @@ combine_colors:
shr eax, 8 shr eax, 8
add ecx, eax add ecx, eax
shl ecx, 8 shl ecx, 8
; byte 1 ; byte 1
mov eax, 0xff mov eax, 0xff
sub al, [esi+1] sub al, [esi+1]
mov ebx, [esp] mov ebx, [esp]
@ -257,7 +257,7 @@ combine_colors:
shr eax, 8 shr eax, 8
add ecx, eax add ecx, eax
shl ecx, 8 shl ecx, 8
; byte 2 ; byte 2
mov eax, 0xff mov eax, 0xff
sub al, [esi+2] sub al, [esi+2]
mov ebx, [esp] mov ebx, [esp]
@ -321,7 +321,7 @@ yes_mouse_disable:
add edx,window_data add edx,window_data
movzx eax, word [MOUSE_X] movzx eax, word [MOUSE_X]
movzx ebx, word [MOUSE_Y] movzx ebx, word [MOUSE_Y]
mov ecx,[edx+0] ; mouse inside the area ? mov ecx,[edx+0] ; mouse inside the area ?
add eax,10 add eax,10
cmp eax,ecx cmp eax,ecx
jb no_mouse_disable jb no_mouse_disable
@ -350,53 +350,53 @@ no_mouse_disable:
ret ret
__sys_draw_pointer: __sys_draw_pointer:
cmp [mouse_pause],0 cmp [mouse_pause],0
je @f je @f
ret ret
@@: @@:
push eax push eax
mov eax,[timer_ticks] mov eax,[timer_ticks]
sub eax,[MouseTickCounter] sub eax,[MouseTickCounter]
cmp eax,1 cmp eax,1
ja @f ja @f
pop eax pop eax
ret ret
@@: @@:
mov eax,[timer_ticks] mov eax,[timer_ticks]
mov [MouseTickCounter],eax mov [MouseTickCounter],eax
pop eax pop eax
pushad pushad
cmp dword [MOUSE_VISIBLE],dword 0 ; mouse visible ? cmp dword [MOUSE_VISIBLE],dword 0 ; mouse visible ?
je chms00 je chms00
mov [MOUSE_VISIBLE], dword 0 mov [MOUSE_VISIBLE], dword 0
movzx ebx,word [MOUSE_Y] movzx ebx,word [MOUSE_Y]
movzx eax,word [MOUSE_X] movzx eax,word [MOUSE_X]
pushfd pushfd
cli cli
call save_draw_mouse call save_draw_mouse
popfd popfd
nodmu2: nodmu2:
popad popad
ret ret
chms00: chms00:
movzx ecx,word [X_UNDER] movzx ecx,word [X_UNDER]
movzx edx,word [Y_UNDER] movzx edx,word [Y_UNDER]
movzx ebx,word [MOUSE_Y] movzx ebx,word [MOUSE_Y]
movzx eax,word [MOUSE_X] movzx eax,word [MOUSE_X]
cmp eax,ecx cmp eax,ecx
jne redrawmouse jne redrawmouse
cmp ebx,edx cmp ebx,edx
jne redrawmouse jne redrawmouse
jmp nodmp jmp nodmp
redrawmouse: redrawmouse:
pushfd pushfd
cli cli
call draw_mouse_under call draw_mouse_under
call save_draw_mouse call save_draw_mouse
popfd popfd
nodmp: nodmp:
popad popad
ret ret
proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
@ -405,35 +405,35 @@ proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScro
mov eax,[XMoving] mov eax,[XMoving]
call mouse_acceleration call mouse_acceleration
add ax,[MOUSE_X] ;[XCoordinate] add ax,[MOUSE_X] ;[XCoordinate]
cmp ax,0 cmp ax,0
jge @@M1 jge @@M1
mov eax,0 mov eax,0
jmp @@M2 jmp @@M2
@@M1: @@M1:
cmp ax,[Screen_Max_X] ;ScreenLength cmp ax,[Screen_Max_X] ;ScreenLength
jl @@M2 jl @@M2
mov ax,[Screen_Max_X] ;ScreenLength-1 mov ax,[Screen_Max_X] ;ScreenLength-1
@@M2: @@M2:
mov [MOUSE_X],ax ;[XCoordinate] mov [MOUSE_X],ax ;[XCoordinate]
mov eax,[YMoving] mov eax,[YMoving]
neg eax neg eax
call mouse_acceleration call mouse_acceleration
add ax,[MOUSE_Y] ;[YCoordinate] add ax,[MOUSE_Y] ;[YCoordinate]
cmp ax,0 cmp ax,0
jge @@M3 jge @@M3
mov ax,0 mov ax,0
jmp @@M4 jmp @@M4
@@M3: @@M3:
cmp ax,[Screen_Max_Y] ;ScreenHeigth cmp ax,[Screen_Max_Y] ;ScreenHeigth
jl @@M4 jl @@M4
mov ax,[Screen_Max_Y] ;ScreenHeigth-1 mov ax,[Screen_Max_Y] ;ScreenHeigth-1
@@M4: @@M4:
mov [MOUSE_Y],ax ;[YCoordinate] mov [MOUSE_Y],ax ;[YCoordinate]
mov eax,[VScroll] mov eax,[VScroll]
add [MOUSE_SCROLL_V],ax add [MOUSE_SCROLL_V],ax
@ -448,15 +448,15 @@ proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScro
endp endp
mouse_acceleration: mouse_acceleration:
push eax push eax
mov eax,[timer_ticks] mov eax,[timer_ticks]
sub eax,[mouse_timer_ticks] sub eax,[mouse_timer_ticks]
cmp eax,[mouse_delay] cmp eax,[mouse_delay]
pop eax pop eax
ja @f ja @f
;push edx ;push edx
imul eax,[mouse_speed_factor] imul eax,[mouse_speed_factor]
;pop edx ;pop edx
@@: @@:
ret ret

View File

@ -58,7 +58,7 @@ include 'macros.inc'
$Revision$ $Revision$
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices USE_COM_IRQ equ 1 ;make irq 3 and irq 4 available for PCI devices
include "proc32.inc" include "proc32.inc"
include "kglobals.inc" include "kglobals.inc"
@ -638,8 +638,9 @@ no_lib_load:
mov [pci_access_enabled],1 mov [pci_access_enabled],1
call detect_devices ;call detect_devices
stdcall load_driver, szPS2MDriver stdcall load_driver, szPS2MDriver
stdcall load_driver, szCOM_MDriver
; SET MOUSE ; SET MOUSE
@ -671,7 +672,7 @@ no_lib_load:
mov esi,boot_setrports mov esi,boot_setrports
call boot_log call boot_log
call setirqreadports ;call setirqreadports
; SET UP OS TASK ; SET UP OS TASK
@ -854,11 +855,11 @@ first_app_found:
; START MULTITASKING ; START MULTITASKING
if preboot_blogesc if preboot_blogesc
mov esi, boot_tasking mov esi, boot_tasking
call boot_log call boot_log
.bll1: in al, 0x60 ; wait for ESC key press .bll1: in al, 0x60 ; wait for ESC key press
cmp al, 129 cmp al, 129
jne .bll1 jne .bll1
end if end if
; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled ; mov [ENABLE_TASKSWITCH],byte 1 ; multitasking enabled
@ -1029,7 +1030,7 @@ reserve_irqs_ports:
pushad pushad
mov [irq_owner+4*0], 1 ; timer mov [irq_owner+4*0], 1 ; timer
mov [irq_owner+4*1], 1 ; keyboard ;mov [irq_owner+4*1], 1 ; keyboard
mov [irq_owner+4*5], 1 ; sound blaster mov [irq_owner+4*5], 1 ; sound blaster
mov [irq_owner+4*6], 1 ; floppy diskette mov [irq_owner+4*6], 1 ; floppy diskette
mov [irq_owner+4*13], 1 ; math co-pros mov [irq_owner+4*13], 1 ; math co-pros
@ -1068,20 +1069,14 @@ reserve_irqs_ports:
popad popad
ret ret
iglobal
mouseirqtable db 12 ; ps2
db 4 ; com1
db 3 ; com2
endg
setirqreadports: setirqreadports:
mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte mov [irq12read+0],dword 0x60 + 0x01000000 ; read port 0x60 , byte
mov [irq12read+4],dword 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+0],dword 0x3f8 + 0x01000000 ; read port 0x3f8 , byte
mov [irq04read+4],dword 0 ; end of port list ;mov [irq04read+4],dword 0 ; end of port list
mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte ;mov [irq03read+0],dword 0x2f8 + 0x01000000 ; read port 0x2f8 , byte
mov [irq03read+4],dword 0 ; end of port list ;mov [irq03read+4],dword 0 ; end of port list
ret ret
@ -1998,7 +1993,7 @@ sys_midi:
detect_devices: detect_devices:
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
include 'detect/commouse.inc' ;include 'detect/commouse.inc'
;include 'detect/ps2mouse.inc' ;include 'detect/ps2mouse.inc'
;include 'detect/dev_fd.inc' ;include 'detect/dev_fd.inc'
;include 'detect/dev_hdcd.inc' ;include 'detect/dev_hdcd.inc'
@ -4187,10 +4182,12 @@ reserve_free_irq:
cmp ecx, 16 cmp ecx, 16
jae ril1 jae ril1
push ecx
lea ecx, [irq_owner + 4 * ecx] lea ecx, [irq_owner + 4 * ecx]
mov edx, [ecx] mov edx, [ecx]
mov eax, [TASK_BASE] mov eax, [TASK_BASE]
mov edi, [eax + TASKDATA.pid] mov edi, [eax + TASKDATA.pid]
pop eax
dec ebx dec ebx
jnz reserve_irq jnz reserve_irq
@ -4206,12 +4203,38 @@ reserve_free_irq:
cmp dword [ecx], 0 cmp dword [ecx], 0
jne ril1 jne ril1
mov ebx, [f_irqs + 4 * eax]
stdcall attach_int_handler, eax, ebx
mov [ecx], edi mov [ecx], edi
dec esi dec esi
ril1: ril1:
mov [esp+32], esi ; return in eax mov [esp+32], esi ; return in eax
ret 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 p_irq14
dd p_irq15
endg
drawbackground: drawbackground:
inc [mouse_pause] inc [mouse_pause]
cmp [SCR_MODE],word 0x12 cmp [SCR_MODE],word 0x12
@ -4494,92 +4517,6 @@ setmouse: ; set mousepicture -pointer
mov [MOUSE_PICTURE],dword mousepointer mov [MOUSE_PICTURE],dword mousepointer
cli cli
; mov bl,0xa8 ; enable mouse cmd
; call kb_cmd
; call kb_read ; read status
; mov bl,0x20 ; get command byte
; call kb_cmd
; call kb_read
; or al,3 ; enable interrupt
; mov bl,0x60 ; write command
; push eax
; call kb_cmd
; pop eax
; call kb_write
; mov bl,0xd4 ; for mouse
; call kb_cmd
; mov al,0xf4 ; enable mouse device
; call kb_write
; call kb_read ; read status return
; com1 mouse enable
mov bx,0x3f8 ; combase
mov dx,bx
add dx,3
mov al,0x80
out dx,al
mov dx,bx
add dx,1
mov al,0
out dx,al
mov dx,bx
add dx,0
mov al,0x30*2 ; 0x30 / 4
out dx,al
mov dx,bx
add dx,3
mov al,2 ; 3
out dx,al
mov dx,bx
add dx,4
mov al,0xb
out dx,al
mov dx,bx
add dx,1
mov al,1
out dx,al
; com2 mouse enable
mov bx,0x2f8 ; combase
mov dx,bx
add dx,3
mov al,0x80
out dx,al
mov dx,bx
add dx,1
mov al,0
out dx,al
mov dx,bx
add dx,0
mov al,0x30*2
out dx,al
mov dx,bx
add dx,3
mov al,2
out dx,al
mov dx,bx
add dx,4
mov al,0xb
out dx,al
mov dx,bx
add dx,1
mov al,1
out dx,al
ret ret