1) Parallel processing of mouses: PS2, COM1, COM2

2) Detection PS2 mouse.
3) Switching FPU in PM with reset.
4) Click on the application button - works only if during release of a up-button mouse the cursor is on the button application. Realization Victor Alberto Gil Hanla (vhanla). Version 1.1
5) Return of focus (activated window) on previous application at completion of the active application
6) Change skin of header of windows type 4, at loss and return of focus (activated window).

git-svn-id: svn://kolibrios.org@33 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Marat Zakiyanov (Mario79) 2006-01-06 11:46:26 +00:00
parent 435676e6a4
commit 333b0bbae6
17 changed files with 1264 additions and 894 deletions

View File

@ -325,7 +325,7 @@ macro irqh [num]
jmp irq_c jmp irq_c
} }
irqh 2,3,4,5,7,8,9,10,11,12,14,15 irqh 2,5,7,8,9,10,11,14,15
irq_c: irq_c:
push ds es push ds es
@ -344,15 +344,57 @@ p_irq6:
mov ds, ax mov ds, ax
mov es, ax mov es, ax
call fdc_irq call fdc_irq
call ready_for_next_irq
mov [check_idle_semaphore],5
mov al, 0x20
out 0x20, al
pop es ds pop es ds
popad popad
iret iret
p_irq3:
pushad
push ds es
mov ax, os_data
mov ds, ax
mov es, ax
call check_mouse_data_com2
pop es ds
popad
iret
p_irq4:
pushad
push ds es
mov ax, os_data
mov ds, ax
mov es, ax
call check_mouse_data_com1
pop es ds
popad
iret
p_irq12:
pushad
push ds es
mov ax, os_data
mov ds, ax
mov es, ax
call check_mouse_data_ps2
pop es ds
popad
iret
ready_for_next_irq:
mov [check_idle_semaphore],5
mov al, 0x20
out 0x20, al
ret
ready_for_next_irq_1:
mov [check_idle_semaphore],5
mov al, 0x20
out 0xa0,al
out 0x20, al
ret
irqD: irqD:
pushad pushad
push ds es push ds es
@ -773,7 +815,7 @@ terminate: ; terminate application
pusha ; remove all port reservations pusha ; remove all port reservations
mov [deleted_process],esi
mov edx,esi mov edx,esi
shl edx, 5 ;imul edx,0x20 shl edx, 5 ;imul edx,0x20
add edx,0x3000 add edx,0x3000
@ -829,7 +871,13 @@ terminate: ; terminate application
; movzx ecx,word [dlxe] ; movzx ecx,word [dlxe]
; movzx edx,word [dlye] ; movzx edx,word [dlye]
call calculatescreen call calculatescreen
cli
mov eax,[deleted_process]
cmp eax,[active_process]
jne no_activate_process
call read_active_process_stack
no_activate_process:
sti
xor eax, eax xor eax, eax
xor esi, esi xor esi, esi
call redrawscreen call redrawscreen
@ -838,19 +886,44 @@ terminate: ; terminate application
mov [0xfff5],byte 0 ; draw mouse mov [0xfff5],byte 0 ; draw mouse
mov [application_table_status],0 mov [application_table_status],0
mov esi,process_terminated mov esi,process_terminated
call sys_msg_board_str call sys_msg_board_str
;* start code - fix error redraw for terminate (2) - Mario79
; cmp [draw_present],1
; je no_draw_background_temp
; mov [0xfff0],byte 1
;no_draw_background_temp:
; mov [draw_present],0
ret ret
;draw_present db 0
;* end code - fix error redraw for terminate (2) - Mario79 save_active_process_stack:
cmp [active_proc_stack_coun],0xa400+0x400-4
jne @f
mov [active_proc_stack_coun],0xa400-4
@@:
push eax
push ebx
mov eax,[active_process]
shl eax,5
add eax,0x3000
mov [eax-twdw+31],byte 1
add [active_proc_stack_coun],4
mov eax,[active_process]
mov ebx,[active_proc_stack_coun]
mov [ebx],eax
pop ebx
pop eax
ret
read_active_process_stack:
cmp [active_proc_stack_coun],0xa400-4
jne @f
mov [active_proc_stack_coun],0xa400+0x400-4
@@:
push eax
push ebx
mov ebx,[active_proc_stack_coun]
mov eax,[ebx]
mov [0xff01],eax ; activate
sub [active_proc_stack_coun],4
mov [active_process_flag],1
pop ebx
pop eax
ret
iglobal iglobal
boot_sched_1 db 'Building gdt tss pointer',0 boot_sched_1 db 'Building gdt tss pointer',0

View File

@ -7,9 +7,28 @@
; Автор исходного текста Кулаков Владимир Геннадьевич. ; Автор исходного текста Кулаков Владимир Геннадьевич.
; Адаптация и доработка Mario79 ; Адаптация и доработка Mario79
MSMouseSearch: Detect_COM_Mouse:
pusha pusha
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ call MSMouseSearch
cmp AL,'M'
jne @f
mov [com1_mouse_detected],1
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 esi,boot_setmouse_type+44
call boot_log
@@:
popa
jmp end_detecting_mouse
MSMouseSearch:
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ
MouseSearch: MouseSearch:
; Устанавливаем скорость ; Устанавливаем скорость
; приема/передачи 1200 бод ; приема/передачи 1200 бод
@ -48,7 +67,7 @@ dT_1:
dec ecx dec ecx
cmp ecx,0 cmp ecx,0
jne dT_1 jne dT_1
mov ecx,0xffff mov ecx,0xffff
; Включить питание мыши ; Включить питание мыши
mov AL,11b ;установить DTR и RTS mov AL,11b ;установить DTR и RTS
out DX,AL out DX,AL
@ -70,46 +89,19 @@ WaitData:
; Ввести данные ; Ввести данные
mov DX,[COMPortBaseAddr] mov DX,[COMPortBaseAddr]
in AL,DX in AL,DX
; Óñòðîéñòâî ÿâëÿåòñÿ ìûøüþ?
cmp AL,'M'
je EndDetect
NoMouse: NoMouse:
inc [COMPortNum] ret
cmp [COMPortNum],1
ja EndDetect
sub [COMPortBaseAddr],100h
jmp MouseSearch
iglobal iglobal
COMPortBaseAddr dw 3F8h COMPortBaseAddr dw 3F8h
COMPortNum dw 0 ;COMPortNum dw 0
endg endg
iglobal iglobal
boot_setmouse_type db 'No COM mouse, set PS2',0 boot_setmouse_type db 'Detected - PS2 mouse',0
db 'Detected - COM1 mouse',0 db 'Detected - COM1 mouse',0
db 'Detected - COM2 mouse',0 db 'Detected - COM2 mouse',0
endg endg
EndDetect: end_detecting_mouse:
cmp [COMPortNum],0 ;íîìåð ïîðòà ìåíüøå 0?
jl ComMouseNotFound ;ìûøü íå íàéäåíà
cmp [COMPortNum],1 ;íîìåð ïîðòà áîëüøå 1?
ja ComMouseNotFound ;ìûøü íå íàéäåíà
mov ax,[COMPortNum]
add al,2
jmp set_detecting_mouse
ComMouseNotFound:
mov al,1
set_detecting_mouse:
mov [0xF604],al
dec al
movzx eax,al
imul eax,22
mov esi,boot_setmouse_type
add esi,eax
call boot_log
popa

View File

@ -0,0 +1,65 @@
MouseSearch_PS2:
pusha
mov bl,0xa8 ; enable mouse cmd
call kb_cmd
cmp ah,1
je @@DataInputError
mov bl,0xd4 ; for mouse
call kb_cmd
cmp ah,1
je @@DataInputError
mov al,0xeb ;
call kb_write
cmp ah,1
je @@DataInputError
call kb_read ; Acknowledge
call kb_read
mov [ps2_mouse_detected],0
test al,8
jz @f
mov [ps2_mouse_detected],1
@@:
call kb_read ;
call kb_read ;
mov bl,0x20 ; get command byte
call kb_cmd
cmp ah,1
je @@DataInputError
call kb_read
cmp ah,1
je @@DataInputError
or al,3 ; enable interrupt
mov bl,0x60 ; write command
push eax
call kb_cmd
pop eax
call kb_write
cmp ah,1
je @@DataInputError
mov bl,0xd4 ; for mouse
call kb_cmd
cmp ah,1
je @@DataInputError
mov al,0xf4 ; enable mouse device
call kb_write
cmp ah,1
je @@DataInputError
call kb_read ; read status return
cmp ah,1
je @@DataInputError
cmp AL,0FAh
jnz @@DataInputError ;íåò ïîäòâåðæäåíèÿ
@@DataInputError:
cmp [ps2_mouse_detected],0
je @f
mov esi,boot_setmouse_type
call boot_log
@@:
popa

View File

@ -532,7 +532,6 @@ checkbuttons:
call checkidle call checkidle
call check_mouse_data
call [draw_pointer] call [draw_pointer]
pushad pushad
@ -552,53 +551,52 @@ checkbuttons:
buttonid dd 0x0 ;here a will backup the eax value buttonid dd 0x0 ;here a will backup the eax value
afterbuttonid: afterbuttonid:
pusha pusha
mov eax,[buttonid] ; mouse x >= button x ?
; mouse x >= button x ? movzx ebx,word [eax+0]
movzx ebx,word [eax+0] shl ebx,5
shl ebx,5 add ebx,window_data
add ebx,window_data movzx ecx,word [ebx+0] ; window x start
movzx ecx,word [ebx+0] ; window x start movzx edx,word [eax+4] ; button x start
movzx edx,word [eax+4] ; button x start add edx,ecx
add edx,ecx mov cx,[0xfb0a]
mov cx,[0xfb0a] cmp edx,ecx
cmp edx,ecx jg no_on_button ;if we release the pointer out of the button area
jg no_on_button ;if we release the pointer out of the button area
movzx ebx,word [eax+6] ; button x size movzx ebx,word [eax+6] ; button x size
add edx,ebx add edx,ebx
cmp ecx,edx cmp ecx,edx
jg no_on_button jg no_on_button
; mouse y >= button y ? ; mouse y >= button y ?
movzx ebx,word [eax+0] movzx ebx,word [eax+0]
shl ebx,5 shl ebx,5
add ebx,window_data add ebx,window_data
movzx ecx,word [ebx+4] ; window y start movzx ecx,word [ebx+4] ; window y start
movzx edx,word [eax+8] ; button y start movzx edx,word [eax+8] ; button y start
add edx,ecx add edx,ecx
mov cx,[0xfb0c] mov cx,[0xfb0c]
cmp edx,ecx cmp edx,ecx
jg no_on_button jg no_on_button
movzx ebx,word [eax+10] ; button y size movzx ebx,word [eax+10] ; button y size
add edx,ebx add edx,ebx
cmp ecx,edx cmp ecx,edx
jg no_on_button jg no_on_button
popa popa
mov [0xf500],byte 1 ; no of buttons in buffer mov [0xf500],byte 1 ; no of buttons in buffer
pop ebx pop ebx
mov [0xf501],ebx ; lets put the button id in buffer mov [0xf501],ebx ; lets put the button id in buffer
push ebx push ebx
pusha pusha
jmp yes_on_button jmp yes_on_button
no_on_button: no_on_button:
mov [0xf500],byte 0 ; no of buttons in buffer mov [0xf500],byte 0 ; no of buttons in buffer
yes_on_button: yes_on_button:
mov [0xfb44],byte 0 ; mouse down -> do not draw mov [0xfb44],byte 0 ; mouse down -> do not draw
popa popa
pop ebx pop ebx
popa popa
ret ret
;..................................... end 2/2 : modified by vhanla ................................
;..................................... end 2/2 : modified by vhanla ................................

View File

@ -170,28 +170,76 @@ load_default_skin:
mov edi, eax mov edi, eax
mov esi, 0x90000 mov esi, 0x90000
call bmp2raw call bmp2raw
mov eax, [0x90000+bmp_header.height]
mov [_skinh], eax
popad
ret
; mov eax, [0x90000+bmp_header.height] load_default_skin_1:
; imul eax, [0x90000+bmp_header.width] pushad
; imul eax, 3 mov eax, _fileleft_1
; add eax, raw_data ; now eax points to the last line of image call load_bmp_file
mov eax, [0x90000+bmp_header.width]
; mov ecx, [eax] mov [_skinleftw], eax
; mov [_coloroutborder], ecx mov [_skinleft_1], 0
; mov [_colorborder], ecx mov edi, raw_data+1000h
; sub eax, 2*3 mov [_refleft_1], edi
; mov ecx, [eax] mov esi, 0x90000
; mov [_colorframe], ecx call bmp2raw
mov eax, [_bmp_bpl]
imul eax, [0x90000+bmp_header.height]
push eax
mov eax, _filebase_1
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinbasew], eax
mov eax, [_skinleftw]
mov [_skinbase], eax
pop eax
add eax, [_refleft_1]
; align to 32-byte boundary
test eax, 11111b
jz @f
shr eax, 5
inc eax
shl eax, 5
@@:
; save base address
mov [_refbase_1], eax
; convert
mov edi, eax
mov esi, 0x90000
call bmp2raw
mov eax, [_bmp_bpl]
imul eax, [0x90000+bmp_header.height]
push eax
mov eax, _fileoper_1
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinoperw], eax
neg eax
mov [_skinoper], eax
pop eax
add eax, [_refbase_1]
; align to 32-byte boundary
test eax, 11111b
jz @f
shr eax, 5
inc eax
shl eax, 5
@@:
mov [_refoper_1], eax
mov edi, eax
mov esi, 0x90000
call bmp2raw
mov eax, [0x90000+bmp_header.height] mov eax, [0x90000+bmp_header.height]
mov [_skinh], eax mov [_skinh], eax
popad popad
ret ret
drawwindow_IV: drawwindow_IV:
pusha pusha
@ -241,7 +289,15 @@ drawwindow_IV:
mov ecx,[_skinleftw] mov ecx,[_skinleftw]
shl ecx,16 shl ecx,16
add ecx,[_skinh] add ecx,[_skinh]
cmp [aw_yes],1
; cmp [esp+32+4+2], word 1
jne @f
mov ebx,[_refleft] mov ebx,[_refleft]
jmp no_aw_3
@@:
mov ebx,[_refleft_1]
no_aw_3:
call sys_putimage call sys_putimage
mov esi,[esp] mov esi,[esp]
@ -256,7 +312,14 @@ drawwindow_IV:
inc eax inc eax
cmp [aw_yes],1
; cmp [esp+32+4+2], word 1
jne @f
mov ebx,[_refbase] mov ebx,[_refbase]
jmp no_aw_2
@@:
mov ebx,[_refbase_1]
no_aw_2:
mov ecx,[_skinbasew] mov ecx,[_skinbasew]
shl ecx,16 shl ecx,16
add ecx,[_skinh] add ecx,[_skinh]
@ -281,7 +344,14 @@ drawwindow_IV:
sub edx,[_skinoperw] sub edx,[_skinoperw]
inc edx inc edx
shl edx,16 shl edx,16
cmp [aw_yes],1
; cmp [esp+32+4+2], word 1
jne @f
mov ebx,[_refoper] mov ebx,[_refoper]
jmp no_aw_1
@@:
mov ebx,[_refoper_1]
no_aw_1:
mov ecx,[_skinoperw] mov ecx,[_skinoperw]
shl ecx,16 shl ecx,16
add ecx,[_skinh] add ecx,[_skinh]
@ -383,6 +453,7 @@ drawwindow_IV:
add esp,4 add esp,4
popa popa
ret ret

View File

@ -32,6 +32,9 @@ iglobal
_fileleft db 'LEFT.BMP ' _fileleft db 'LEFT.BMP '
_filebase db 'BASE.BMP ' _filebase db 'BASE.BMP '
_fileoper db 'OPER.BMP ' _fileoper db 'OPER.BMP '
_fileleft_1 db 'LEFT_1.BMP '
_filebase_1 db 'BASE_1.BMP '
_fileoper_1 db 'OPER_1.BMP '
endg endg
uglobal uglobal
@ -39,6 +42,10 @@ uglobal
_refbase dd 0 _refbase dd 0
_refleft dd 0 _refleft dd 0
_skinleft dd 0 _skinleft dd 0
_skinwinw dd 0 ; _skinwinw dd 0
_refoper_1 dd 0
_refbase_1 dd 0
_refleft_1 dd 0
_skinleft_1 dd 0
endg endg

View File

@ -401,7 +401,6 @@ check_window_move_request:
mov ecx,10 ; wait 1/10 second mov ecx,10 ; wait 1/10 second
wmrl3: wmrl3:
call check_mouse_data
call [draw_pointer] call [draw_pointer]
mov eax,1 mov eax,1
call delay_hs call delay_hs
@ -722,8 +721,7 @@ windowactivate:
; esi = abs mem position in stack 0xC400+ ; esi = abs mem position in stack 0xC400+
pushad pushad
push esi
push esi
movzx eax, word [esi] ; ax <- process no movzx eax, word [esi] ; ax <- process no
movzx eax, word [0xC000+eax*2] ; ax <- position in window stack movzx eax, word [0xC000+eax*2] ; ax <- position in window stack
@ -749,7 +747,22 @@ windowactivate:
mov [0xC000+eax*2], bx ; this is the last (and the upper) mov [0xC000+eax*2], bx ; this is the last (and the upper)
;* start code - get active process (4) - Mario79 ;* start code - get active process (4) - Mario79
mov [active_process],eax cli
cmp [active_process_flag],1
jne @f
mov [active_process_flag],0
jmp end_save_active_process
@@:
call save_active_process_stack
end_save_active_process:
mov [active_process],eax
push eax
mov eax,[active_process]
shl eax,5
add eax,0x3000
mov [eax-twdw+31],byte 1
pop eax
sti
;* end code - get active process (4) - Mario79 ;* end code - get active process (4) - Mario79
; update on screen -window stack ; update on screen -window stack
@ -763,10 +776,8 @@ windowactivate:
mov [ebx*2 + 0xC400], si mov [ebx*2 + 0xC400], si
jmp waloop2 jmp waloop2
wacont2: wacont2:
mov [0xf400], byte 0 ; empty keyboard buffer mov [0xf400], byte 0 ; empty keyboard buffer
mov [0xf500], byte 0 ; empty button buffer mov [0xf500], byte 0 ; empty button buffer
popad popad
ret ret
@ -902,8 +913,8 @@ waredraw: ; if redraw necessary at activate
.waitflagdown: .waitflagdown:
dec ecx dec ecx
jz .nowait jz .nowait
mov eax, 2 ; mov eax, 2
call delay_hs ; call delay_hs
cmp [edi+31], byte 0 ; wait flag to drop cmp [edi+31], byte 0 ; wait flag to drop
jnz .waitflagdown jnz .waitflagdown
.nowait: .nowait:
@ -950,8 +961,8 @@ checkwindows:
call waredraw call waredraw
;* start code - get active process (2) - Mario79 ;* start code - get active process (2) - Mario79
mov eax,[0xff01] ; mov eax,[0xff01]
mov [active_process],eax ; mov [active_process],eax
;* end code - get active process (2) - Mario79 ;* end code - get active process (2) - Mario79
mov [0xff01],dword 0 ; activated mov [0xff01],dword 0 ; activated
@ -1163,7 +1174,6 @@ checkwindows:
mov [0xfff4],byte 0 mov [0xfff4],byte 0
call check_mouse_data
call [draw_pointer] call [draw_pointer]
pushad pushad
@ -1460,7 +1470,6 @@ checkwindows:
mov ecx,100 ; wait to avoid mouse residuals mov ecx,100 ; wait to avoid mouse residuals
waitre2: waitre2:
call check_mouse_data
mov [0xfff5],byte 1 mov [0xfff5],byte 1
call checkidle call checkidle
cmp [edi+31],byte 0 cmp [edi+31],byte 0

118
kernel/trunk/hid/m_com1.inc Normal file
View File

@ -0,0 +1,118 @@
; Номер принимаемого от мыши байта
MouseByteNumber DB 0
; Трехбайтовая структура данных, передаваемая мышью
FirstByte DB 0
SecondByte DB 0
ThirdByte DB 0
;***************************************
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
;***************************************
check_mouse_data_com1:
cmp [com1_mouse_detected],0
je @@EndMouseInterrupt
; Проверить наличие данных
mov DX,3F8h ;[COMPortBaseAddr]
add DX,5 ;xFDh
in AL,DX
test AL,1 ;Данные готовы?
jz @@Error
; Ввести данные
mov DX,3F8h ;[COMPortBaseAddr] ;xF8h
in AL,DX
; Сбросить старший незначащий бит
and AL,01111111b
; Определить порядковый номер принимаемого байта
cmp [MouseByteNumber],0
je @@FirstByte
cmp [MouseByteNumber],1
je @@SecondByte
cmp [MouseByteNumber],2
je @@ThirdByte
jmp @@Error
; Сохранить первый байт данных
@@FirstByte:
test AL,1000000b ;Первый байт посылки?
jz @@Error
mov [FirstByte],AL
inc [MouseByteNumber] ;увеличить счетчик
jmp @@EndMouseInterrupt
; Сохранить второй байт данных
@@SecondByte:
test AL,1000000b
jnz @@Error
mov [SecondByte],AL
inc [MouseByteNumber] ;увеличить счетчик
jmp @@EndMouseInterrupt
; Сохранить третий байт данных
@@ThirdByte:
test AL,1000000b
jnz @@Error
mov [ThirdByte],AL ;увеличить счетчик
mov [MouseByteNumber],0
; (Пакет данных от мыши принят полностью).
; Записать новое значение состояния кнопок мыши
mov al,[FirstByte] ;[0xfb01]
mov ah,al
shr al,3
and al,2
shr ah,5
and ah,1
add al,ah
mov [0xfb40],al
mov [mouse_active],1
; Прибавить перемещение по X к координате X
mov AL,[FirstByte]
shl AL,6
or AL,[SecondByte]
cbw
shl ax,1
add AX,[0xFB0A] ;[XCoordinate]
; Курсор не должен выходить за левую или
; правую границу экрана
js @@X1
cmp AX,[0xFE00] ;ScreenLength
jb @@X2
; Установить координату X по правой границе
mov AX,[0xFE00] ;ScreenLength-1
dec ax
jmp @@X2
@@X1:
; Установить координату X по левой границе
xor AX,AX
@@X2:
mov [0xFB0A],AX ;[XCoordinate]
; Прибавить перемещение по Y к координате Y
mov AL,[FirstByte]
and AL,00001100b
shl AL,4
or AL,[ThirdByte]
cbw
shl ax,1
add AX,[0xFB0C] ;[YCoordinate]
; Курсор не должен выходить за верхнюю или
; нижнюю границу экрана
js @@Y1
cmp AX,[0xFE04] ;ScreenHeigth
jb @@Y2
; Установить координату X по нижней границе
mov AX,[0xFE04] ;ScreenHeigth-1
dec ax
jmp @@Y2
@@Y1:
; Установить координату X по верхней границе
xor AX,AX
@@Y2:
mov [0xFB0C],AX ;[YCoordinate]
jmp @@EndMouseInterrupt
@@Error:
; Произошел сбой в порядке передачи информации от
; мыши, обнулить счетчик байтов пакета данных
mov [MouseByteNumber],0
@@EndMouseInterrupt:
call ready_for_next_irq
ret

118
kernel/trunk/hid/m_com2.inc Normal file
View File

@ -0,0 +1,118 @@
; Номер принимаемого от мыши байта
MouseByteNumber_1 DB 0
; Трехбайтовая структура данных, передаваемая мышью
FirstByte_1 DB 0
SecondByte_1 DB 0
ThirdByte_1 DB 0
;***************************************
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
;***************************************
check_mouse_data_com2:
cmp [com2_mouse_detected],0
je @@EndMouseInterrupt_1
; Проверить наличие данных
mov DX,2F8h ;[COMPortBaseAddr]
add DX,5 ;xFDh
in AL,DX
test AL,1 ;Данные готовы?
jz @@Error_1
; Ввести данные
mov DX,2F8h ;[COMPortBaseAddr] ;xF8h
in AL,DX
; Сбросить старший незначащий бит
and AL,01111111b
; Определить порядковый номер принимаемого байта
cmp [MouseByteNumber_1],0
je @@FirstByte_1
cmp [MouseByteNumber_1],1
je @@SecondByte_1
cmp [MouseByteNumber_1],2
je @@ThirdByte_1
jmp @@Error_1
; Сохранить первый байт данных
@@FirstByte_1:
test AL,1000000b ;Первый байт посылки?
jz @@Error_1
mov [FirstByte_1],AL
inc [MouseByteNumber_1] ;увеличить счетчик
jmp @@EndMouseInterrupt_1
; Сохранить второй байт данных
@@SecondByte_1:
test AL,1000000b
jnz @@Error_1
mov [SecondByte_1],AL
inc [MouseByteNumber_1] ;увеличить счетчик
jmp @@EndMouseInterrupt_1
; Сохранить третий байт данных
@@ThirdByte_1:
test AL,1000000b
jnz @@Error_1
mov [ThirdByte_1],AL ;увеличить счетчик
mov [MouseByteNumber_1],0
; (Пакет данных от мыши принят полностью).
; Записать новое значение состояния кнопок мыши
mov al,[FirstByte_1] ;[0xfb01]
mov ah,al
shr al,3
and al,2
shr ah,5
and ah,1
add al,ah
mov [0xfb40],al
mov [mouse_active],1
; Прибавить перемещение по X к координате X
mov AL,[FirstByte_1]
shl AL,6
or AL,[SecondByte_1]
cbw
shl ax,1
add AX,[0xFB0A] ;[XCoordinate]
; Курсор не должен выходить за левую или
; правую границу экрана
js @@X1_1
cmp AX,[0xFE00] ;ScreenLength
jb @@X2_1
; Установить координату X по правой границе
mov AX,[0xFE00] ;ScreenLength-1
dec ax
jmp @@X2_1
@@X1_1:
; Установить координату X по левой границе
xor AX,AX
@@X2_1:
mov [0xFB0A],AX ;[XCoordinate]
; Прибавить перемещение по Y к координате Y
mov AL,[FirstByte_1]
and AL,00001100b
shl AL,4
or AL,[ThirdByte_1]
cbw
shl ax,1
add AX,[0xFB0C] ;[YCoordinate]
; Курсор не должен выходить за верхнюю или
; нижнюю границу экрана
js @@Y1_1
cmp AX,[0xFE04] ;ScreenHeigth
jb @@Y2_1
; Установить координату X по нижней границе
mov AX,[0xFE04] ;ScreenHeigth-1
dec ax
jmp @@Y2_1
@@Y1_1:
; Установить координату X по верхней границе
xor AX,AX
@@Y2_1:
mov [0xFB0C],AX ;[YCoordinate]
jmp @@EndMouseInterrupt_1
@@Error_1:
; Произошел сбой в порядке передачи информации от
; мыши, обнулить счетчик байтов пакета данных
mov [MouseByteNumber_1],0
@@EndMouseInterrupt_1:
call ready_for_next_irq
ret

157
kernel/trunk/hid/m_ps2.inc Normal file
View File

@ -0,0 +1,157 @@
; Номер принимаемого от мыши байта
MouseByteNumber_2 DB 0
; Трехбайтовая структура данных, передаваемая мышью
FirstByte_2 DB 0
SecondByte_2 DB 0
ThirdByte_2 DB 0
;**************************************
;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ PS/2 *
;**************************************
check_mouse_data_ps2:
cmp [ps2_mouse_detected],0
je @@EndMouseInterrupt_2
call Wait8042BufferEmpty ;очистка буфера
in AL,0x60 ;получить скэн-код
; Выбирать порядковый номер принимаемого байта
cmp [MouseByteNumber_2],0
je @@SaveFirstByte
cmp [MouseByteNumber_2],1
je @@SaveSecondByte
cmp [MouseByteNumber_2],2
je @@SaveThirdByte
jmp @@Error_2
; Записать первый байт посылки
@@SaveFirstByte:
test AL,1000b ;первый байт посылки?
jz @@Error_2 ;сбой синхронизации
mov [FirstByte_2],AL
inc [MouseByteNumber_2]
jmp @@EndMouseInterrupt_2
; Записать второй байт посылки
@@SaveSecondByte:
mov [SecondByte_2],AL
inc [MouseByteNumber_2]
jmp @@EndMouseInterrupt_2
; Записать третий байт посылки
@@SaveThirdByte:
mov [ThirdByte_2],AL
mov [MouseByteNumber_2],0
; (пакет данных от мыши принят полностью)
; Записать новое значение байта состояния кнопок
mov al,[FirstByte_2] ;[0xfb01]
and eax,3
mov [0xfb40],al
mov [mouse_active],1
; Вычислить новую X-координату курсора
; Занести в AX перемещение по X
mov AH,0 ;дублируем знак во все разряды AH
mov AL,[FirstByte_2]
test AL,10000b
jz @@M0
mov AH,0FFh
; Занести в AL младший байт
@@M0:
mov AL,[SecondByte_2]
shl ax,1
; Вычислить новое значение координаты
; курсора по X
add AX,[0xFB0A] ;[XCoordinate]
cmp AX,0
jge @@M1
mov AX,0
jmp @@M2
@@M1:
cmp AX,[0xFE00] ;ScreenLength
jl @@M2
mov AX,[0xFE00] ;ScreenLength-1
dec ax
@@M2:
mov [0xFB0A],AX ;[XCoordinate]
; Вычисляем новую Y-координату курсора
; Занести в AX перемещение по Y
mov AH,0 ;дублируем знак во все разряды AH
mov AL,[FirstByte_2]
test AL,100000b
jz @@M3
mov AH,0FFh
; Занести в AL младший байт
@@M3:
mov AL,[ThirdByte_2]
shl ax,1
; Вычислить новое значение координаты курсора
; по Y (Y-координата мыши PS/2 направлена
; противоположно экранной)
neg AX
add AX,[0xFB0C] ;[YCoordinate]
cmp AX,0
jge @@M4
mov AX,0
jmp @@M5
@@M4:
cmp AX,[0xFE04] ;ScreenHeigth
jl @@M5
mov AX,[0xFE04] ;ScreenHeigth-1
dec ax
@@M5:
mov [0xFB0C],AX ;[YCoordinate]
; Показать курсор в новой позиции
jmp @@EndMouseInterrupt_2
; Обнаружен сбой в порядке передачи информации от мыши
@@Error_2:
mov [MouseByteNumber_2],0
; Нормальное завершение прерывания
@@EndMouseInterrupt_2:
call ready_for_next_irq_1
ret
;***********************************************
;* ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042 *
;* При выходе из процедуры: *
;* флаг ZF установлен - нормальное завершение, *
;* флаг ZF сброшен - ошибка тайм-аута. *
;***********************************************
Wait8042BufferEmpty:
; push CX
; mov CX,0FFFFh ;задать число циклов ожидания
;@@kb:
; in AL,64h ;получить статус
; test AL,10b ;буфер i8042 свободен?
; loopnz @@kb ;если нет, то цикл
; pop CX
push ecx
xor ecx,ecx
@@:
in al,64h
test al,00000010b
loopnz @b
pop ecx
;Если при выходе из подпрограммы сброшен
;флаг ZF - ошибка
ret ;возврат в подпрограмму
;***************************************
;* ОЖИДАНИЕ ПОСТУПЛЕНИЯ ДАННЫХ ОТ МЫШИ *
;***************************************
WaitMouseData:
; push CX
; mov CX,0FFFFh ;задать число циклов ожидания
;@@mouse:
; in AL,64h ;опросить регистр статуса
; test AL,100000b ;данные поступили?
; loopz @@mouse ;если нет, то цикл
; pop CX
push ecx
mov ECX,0FFFFh
@@:
in al,64h
test al,100000b
loopz @b
pop ecx
;Если при выходе из подпрограммы установлен
;флаг ZF - ошибка
ret

View File

@ -0,0 +1,408 @@
; check mouse
;
;
; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y
; FB10 -> FB17 mouse color mem
; FB21 x move
; FB22 y move
; FB30 color temp
; FB28 high bits temp
; FB4A -> FB4D FB4A-B x-under - FB4C-D y-under
; FC00 -> FCFE com1/ps2 buffer
; FCFF com1/ps2 buffer count starting from FC00
uglobal
mousecount dd 0x0
mousedata dd 0x0
endg
include 'm_ps2.inc'
include 'm_com1.inc'
include 'm_com2.inc'
;test_mario79:
; push esi
; push eax
; mov [write_error_to],process_test_m79+43
; movzx eax,al ;[DevErrorCode]
; call writehex
; mov esi,process_test_m79
; call sys_msg_board_str
; pop eax
; pop esi
; ret
;process_test_m79 db 'K : Process - test Mario79 error 00000000',13,10,0
draw_mouse_under:
; return old picture
pushad
xor ecx,ecx
xor edx,edx
;cli ; !!!****
align 4
mres:
movzx eax,word [0xfb4a]
movzx ebx,word [0xfb4c]
add eax,ecx
add ebx,edx
push ecx
push edx
push eax
push ebx
mov eax,edx
shl eax,6
shl ecx,2
add eax,ecx
add eax,mouseunder
mov ecx,[eax]
pop ebx
pop eax
;;;push edi
mov edi, 1 ;force
call [putpixel]
;;;pop edi
pop edx
pop ecx
inc ecx
cmp ecx, 16
jnz mres
xor ecx, ecx
inc edx
cmp edx, 24
jnz mres
;sti ; !!!****
popad
ret
save_draw_mouse:
pushad
; save & draw
mov [0xfb4a],ax
mov [0xfb4c],bx
push eax
push ebx
mov ecx,0
mov edx,0
;cli ; !!!****
align 4
drm:
push eax
push ebx
push ecx
push edx
; helloworld
push ecx
; push eax ebx ecx
add eax,ecx ; save picture under mouse
add ebx,edx
push ecx
call getpixel
mov [0xfb30],ecx
pop ecx
mov eax,edx
shl eax,6
shl ecx,2
add eax,ecx
add eax,mouseunder
mov ebx,[0xfb30]
mov [eax],ebx
; pop ecx ebx eax
pop ecx
mov edi,edx ; y cycle
shl edi,4 ; *16 bytes per row
add edi,ecx ; x cycle
mov esi, edi
add edi, esi
add edi, esi ; *3
add edi,[0xf200] ; we have our str address
mov esi, edi
add esi, 16*24*3
push ecx
mov ecx, [0xfb30]
call combine_colors
mov [0xfb10], ecx
pop ecx
pop edx
pop ecx
pop ebx
pop eax
add eax,ecx ; we have x coord+cycle
add ebx,edx ; and y coord+cycle
; push ecx edi
push ecx
mov ecx, [0xfb10]
mov edi, 1
call [putpixel]
pop ecx
; pop edi ecx
; mnext:
mov ebx,[esp+0] ; pure y coord again
mov eax,[esp+4] ; and x
inc ecx ; +1 cycle
cmp ecx,16 ; if more than 16
jnz drm
xor ecx, ecx
inc edx
cmp edx,24
jnz drm
pop ebx
pop eax
;sti ; !!!****
popad
ret
combine_colors:
; in
; ecx - color ( 00 RR GG BB )
; edi - ref to new color byte
; esi - ref to alpha byte
;
; out
; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) )
push eax
push ebx
push edx
push ecx
xor ecx, ecx
; byte 2
mov eax, 0xff
sub al, [esi+0]
mov ebx, [esp]
shr ebx, 16
and ebx, 0xff
mul ebx
shr eax, 8
add ecx, eax
; xor eax, eax
; xor ebx, ebx
; mov al, [edi+0]
; mov bl, [esi+0]
movzx eax, byte [edi+0]
movzx ebx, byte [esi+0]
mul ebx
shr eax, 8
add ecx, eax
shl ecx, 8
; byte 1
mov eax, 0xff
sub al, [esi+1]
mov ebx, [esp]
shr ebx, 8
and ebx, 0xff
mul ebx
shr eax, 8
add ecx, eax
; xor eax, eax
; xor ebx, ebx
; mov al, [edi+1]
; mov bl, [esi+1]
movzx eax, byte [edi+1]
movzx ebx, byte [esi+1]
mul ebx
shr eax, 8
add ecx, eax
shl ecx, 8
; byte 2
mov eax, 0xff
sub al, [esi+2]
mov ebx, [esp]
and ebx, 0xff
mul ebx
shr eax, 8
add ecx, eax
; xor eax, eax
; xor ebx, ebx
; mov al, [edi+2]
; mov bl, [esi+2]
movzx eax, byte [edi+2]
movzx ebx, byte [esi+2]
mul ebx
shr eax, 8
add ecx, eax
pop eax
pop edx
pop ebx
pop eax
ret
__sys_disable_mouse:
cli
pushad
cmp dword [0xf204],dword 0
jne no_mouse_disable
cmp [0x3000],dword 1
je disable_m
mov edx,[0x3000]
shl edx,5
add edx,window_data
movzx eax, word [0xfb0a]
movzx ebx, word [0xfb0c]
mov ecx,[0xfe00]
inc ecx
imul ecx,ebx
add ecx,eax
add ecx, display_data
movzx eax, byte [edx+twdw+0xe]
movzx ebx, byte [ecx]
cmp eax,ebx
je yes_mouse_disable
movzx ebx, byte [ecx+16]
cmp eax,ebx
je yes_mouse_disable
; mov ebx,[0xfe00]
; inc ebx
; imul ebx,10
; add ecx,ebx
; movzx ebx, byte [ecx]
; cmp eax,ebx
; je yes_mouse_disable
mov ebx,[0xfe00]
inc ebx
imul ebx,10
add ecx,ebx
movzx ebx, byte [ecx]
cmp eax,ebx
je yes_mouse_disable
movzx ebx, byte [ecx+16]
cmp eax,ebx
je yes_mouse_disable
jmp no_mouse_disable
yes_mouse_disable:
mov edx,[0x3000]
shl edx,5
add edx,window_data
movzx eax, word [0xfb0a]
movzx ebx, word [0xfb0c]
mov ecx,[edx+0] ; mouse inside the area ?
add eax,14
cmp eax,ecx
jb no_mouse_disable
sub eax,14
add ecx,[edx+8]
cmp eax,ecx
jg no_mouse_disable
mov ecx,[edx+4]
add ebx,20
cmp ebx,ecx
jb no_mouse_disable
sub ebx,20
add ecx,[edx+12]
cmp ebx,ecx
jg no_mouse_disable
disable_m:
cmp dword [0xf204],dword 0
jne @f
call draw_mouse_under
; @@:
mov [0xf204],dword 1
; inc dword [0xf204]
@@:
no_mouse_disable:
popad
sti
ret
__sys_draw_pointer:
cli
pushad
m_pause_1:
cmp [mouse_pause],0
je @f
; call change_task
; jmp m_pause_1
jmp nodmp
@@:
; cli
cmp dword [0xf204],dword 0 ; mouse visible ?
je chms00
mov [0xf204], dword 0
movzx ebx,word [0xfb0c]
movzx eax,word [0xfb0a]
call save_draw_mouse
nodmu2:
popad
sti
ret
chms00:
movzx ecx,word [0xfb4a]
movzx edx,word [0xfb4c]
movzx ebx,word [0xfb0c]
movzx eax,word [0xfb0a]
cmp eax,ecx
jne redrawmouse
cmp ebx,edx
jne redrawmouse
jmp nodmp
redrawmouse:
call draw_mouse_under
call save_draw_mouse
nodmp:
popad
sti
ret

File diff suppressed because it is too large Load Diff

View File

@ -96,6 +96,7 @@ include "blkdev/cdrom.inc"
; Character devices ; Character devices
include "hid/keyboard.inc" include "hid/keyboard.inc"
include "hid/mousedrv.inc"
; setting date,time,clock and alarm-clock ; setting date,time,clock and alarm-clock

View File

@ -54,11 +54,15 @@
; 6000 -> 68FF free ; 6000 -> 68FF free
; 6900 -> 6EFF saved picture under mouse pointer ; 6900 -> 6EFF saved picture under mouse pointer
; ;
; 6F00 -> 7FFF free ; 6F00 -> 6FFF free
;
; 7000 -> 7FFF used CD driver
; ;
; 8000 -> A3FF used FLOPPY driver ; 8000 -> A3FF used FLOPPY driver
; ;
; A400 -> B0FF free ; A400 -> A7FF used active process stack
;
; A800 -> B0FF free
; B100 -> B2FF IDT ; B100 -> B2FF IDT

BIN
kernel/trunk/scin_v2.7z Normal file

Binary file not shown.

View File

@ -325,6 +325,7 @@ __sys_putpixel:
call dword [0xe020] ; call the real put_pixel function call dword [0xe020] ; call the real put_pixel function
.exit: .exit:
popad popad
ret ret
align 4 align 4
@ -376,7 +377,7 @@ ret
align 4 align 4
__sys_draw_line: __sys_draw_line:
inc [mouse_pause]
call [disable_mouse] call [disable_mouse]
; draw a line ; draw a line
@ -512,6 +513,7 @@ align 4
.exit: .exit:
add esp, 6*4 add esp, 6*4
popa popa
dec [mouse_pause]
ret ret
@ -587,6 +589,7 @@ align 4
; edx ye ; edx ye
; edi color ; edi color
vesa20_drawbar: vesa20_drawbar:
pushad pushad
call [disable_mouse] call [disable_mouse]
@ -616,6 +619,7 @@ vesa20_drawbar:
popad popad
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
@@: @@:
cmp ebx, [drbar.bar_sx] cmp ebx, [drbar.bar_sx]
@ -632,6 +636,7 @@ vesa20_drawbar:
popad popad
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
@@: @@:
cmp ebx, [drbar.bar_sy] cmp ebx, [drbar.bar_sy]
@ -775,6 +780,7 @@ draw_bar_end_32:
add esp, drbar.stack_data add esp, drbar.stack_data
popad popad
xor eax, eax xor eax, eax
ret ret

View File

@ -57,7 +57,8 @@ paletteVGA:
vga_putimage: vga_putimage:
; pushad
call [disable_mouse]
push ebp ; push ebp ;
push esi ; push esi ;
push edi ; push edi ;
@ -226,6 +227,9 @@ pimvga:
pop esi pop esi
pop ebp pop ebp
; call [draw_pointer]
; call [disable_mouse]
; popad
ret ret
@ -251,7 +255,7 @@ VGA_putpixel:
and ecx,0x07 ; bit no. (modulo 8) and ecx,0x07 ; bit no. (modulo 8)
setvgapixel: setvgapixel:
cli
; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8) ; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8)
push eax push eax
@ -300,11 +304,13 @@ p13cont:
mov al,[edi] ; dummy read mov al,[edi] ; dummy read
mov [edi],dl mov [edi],dl
sti
ret ret
vga_drawbar: vga_drawbar:
; pushad
call [disable_mouse]
sub edx,ebx ; edx:=Yend-Ystart=H sub edx,ebx ; edx:=Yend-Ystart=H
sub ecx,eax ; ecx:=Xend-Xstat=B sub ecx,eax ; ecx:=Xend-Xstat=B
@ -492,12 +498,12 @@ vga_drawbar:
;pop edx ;pop edx
;pop ecx ;pop ecx
; popad
ret ret
vga_drawbackground_tiled: vga_drawbackground_tiled:
call [disable_mouse]
push ebp push ebp
push eax push eax
push ebx push ebx
@ -639,7 +645,7 @@ vga_drawbackground_tiled:
vga_drawbackground_stretch: vga_drawbackground_stretch:
call [disable_mouse]
push ebp push ebp
push eax push eax