/kernel/trunk/core/sys32.inc |
---|
325,7 → 325,7 |
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: |
push ds es |
344,15 → 344,57 |
mov ds, ax |
mov es, ax |
call fdc_irq |
call ready_for_next_irq |
pop es ds |
popad |
iret |
mov [check_idle_semaphore],5 |
mov al, 0x20 |
out 0x20, al |
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: |
pushad |
push ds es |
773,7 → 815,7 |
pusha ; remove all port reservations |
mov [deleted_process],esi |
mov edx,esi |
shl edx, 5 ;imul edx,0x20 |
add edx,0x3000 |
829,7 → 871,13 |
; movzx ecx,word [dlxe] |
; movzx edx,word [dlye] |
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 esi, esi |
call redrawscreen |
838,20 → 886,45 |
mov [0xfff5],byte 0 ; draw mouse |
mov [application_table_status],0 |
mov esi,process_terminated |
call sys_msg_board_str |
ret |
;* 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 |
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 |
;draw_present db 0 |
;* end code - fix error redraw for terminate (2) - Mario79 |
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 |
boot_sched_1 db 'Building gdt tss pointer',0 |
boot_sched_2 db 'Building IDT table',0 |
/kernel/trunk/detect/commouse.inc |
---|
7,8 → 7,27 |
; Àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
; Àäàïòàöèÿ è äîðàáîòêà Mario79 |
Detect_COM_Mouse: |
pusha |
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: |
pusha |
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ |
MouseSearch: |
; Óñòàíàâëèâàåì ñêîðîñòü |
70,46 → 89,19 |
; Ââåñòè äàííûå |
mov DX,[COMPortBaseAddr] |
in AL,DX |
; Óñòðîéñòâî ÿâëÿåòñÿ ìûøüþ? |
cmp AL,'M' |
je EndDetect |
NoMouse: |
inc [COMPortNum] |
cmp [COMPortNum],1 |
ja EndDetect |
sub [COMPortBaseAddr],100h |
jmp MouseSearch |
ret |
iglobal |
COMPortBaseAddr dw 3F8h |
COMPortNum dw 0 |
;COMPortNum dw 0 |
endg |
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 - COM2 mouse',0 |
endg |
EndDetect: |
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 |
end_detecting_mouse: |
/kernel/trunk/detect/ps2mouse.inc |
---|
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 |
/kernel/trunk/gui/button.inc |
---|
532,7 → 532,6 |
call checkidle |
call check_mouse_data |
call [draw_pointer] |
pushad |
553,7 → 552,6 |
afterbuttonid: |
pusha |
mov eax,[buttonid] |
; mouse x >= button x ? |
movzx ebx,word [eax+0] |
shl ebx,5 |
600,5 → 598,5 |
pop ebx |
popa |
ret |
;..................................... end 2/2 : modified by vhanla ................................ |
/kernel/trunk/gui/skincode.inc |
---|
170,28 → 170,76 |
mov edi, eax |
mov esi, 0x90000 |
call bmp2raw |
mov eax, [0x90000+bmp_header.height] |
mov [_skinh], eax |
popad |
ret |
; mov eax, [0x90000+bmp_header.height] |
; imul eax, [0x90000+bmp_header.width] |
; imul eax, 3 |
; add eax, raw_data ; now eax points to the last line of image |
load_default_skin_1: |
pushad |
mov eax, _fileleft_1 |
call load_bmp_file |
mov eax, [0x90000+bmp_header.width] |
mov [_skinleftw], eax |
mov [_skinleft_1], 0 |
mov edi, raw_data+1000h |
mov [_refleft_1], edi |
mov esi, 0x90000 |
call bmp2raw |
mov eax, [_bmp_bpl] |
imul eax, [0x90000+bmp_header.height] |
push eax |
; mov ecx, [eax] |
; mov [_coloroutborder], ecx |
; mov [_colorborder], ecx |
; sub eax, 2*3 |
; mov ecx, [eax] |
; mov [_colorframe], ecx |
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 [_skinh], eax |
popad |
ret |
drawwindow_IV: |
pusha |
241,7 → 289,15 |
mov ecx,[_skinleftw] |
shl ecx,16 |
add ecx,[_skinh] |
cmp [aw_yes],1 |
; cmp [esp+32+4+2], word 1 |
jne @f |
mov ebx,[_refleft] |
jmp no_aw_3 |
@@: |
mov ebx,[_refleft_1] |
no_aw_3: |
call sys_putimage |
mov esi,[esp] |
256,7 → 312,14 |
inc eax |
cmp [aw_yes],1 |
; cmp [esp+32+4+2], word 1 |
jne @f |
mov ebx,[_refbase] |
jmp no_aw_2 |
@@: |
mov ebx,[_refbase_1] |
no_aw_2: |
mov ecx,[_skinbasew] |
shl ecx,16 |
add ecx,[_skinh] |
281,7 → 344,14 |
sub edx,[_skinoperw] |
inc edx |
shl edx,16 |
cmp [aw_yes],1 |
; cmp [esp+32+4+2], word 1 |
jne @f |
mov ebx,[_refoper] |
jmp no_aw_1 |
@@: |
mov ebx,[_refoper_1] |
no_aw_1: |
mov ecx,[_skinoperw] |
shl ecx,16 |
add ecx,[_skinh] |
383,6 → 453,7 |
add esp,4 |
popa |
ret |
/kernel/trunk/gui/skindata.inc |
---|
32,6 → 32,9 |
_fileleft db 'LEFT.BMP ' |
_filebase db 'BASE.BMP ' |
_fileoper db 'OPER.BMP ' |
_fileleft_1 db 'LEFT_1.BMP ' |
_filebase_1 db 'BASE_1.BMP ' |
_fileoper_1 db 'OPER_1.BMP ' |
endg |
uglobal |
39,6 → 42,10 |
_refbase dd 0 |
_refleft 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 |
/kernel/trunk/gui/window.inc |
---|
401,7 → 401,6 |
mov ecx,10 ; wait 1/10 second |
wmrl3: |
call check_mouse_data |
call [draw_pointer] |
mov eax,1 |
call delay_hs |
722,7 → 721,6 |
; esi = abs mem position in stack 0xC400+ |
pushad |
push esi |
movzx eax, word [esi] ; ax <- process no |
movzx eax, word [0xC000+eax*2] ; ax <- position in window stack |
749,7 → 747,22 |
mov [0xC000+eax*2], bx ; this is the last (and the upper) |
;* start code - get active process (4) - Mario79 |
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 |
; update on screen -window stack |
763,10 → 776,8 |
mov [ebx*2 + 0xC400], si |
jmp waloop2 |
wacont2: |
mov [0xf400], byte 0 ; empty keyboard buffer |
mov [0xf500], byte 0 ; empty button buffer |
popad |
ret |
902,8 → 913,8 |
.waitflagdown: |
dec ecx |
jz .nowait |
mov eax, 2 |
call delay_hs |
; mov eax, 2 |
; call delay_hs |
cmp [edi+31], byte 0 ; wait flag to drop |
jnz .waitflagdown |
.nowait: |
950,8 → 961,8 |
call waredraw |
;* start code - get active process (2) - Mario79 |
mov eax,[0xff01] |
mov [active_process],eax |
; mov eax,[0xff01] |
; mov [active_process],eax |
;* end code - get active process (2) - Mario79 |
mov [0xff01],dword 0 ; activated |
1163,7 → 1174,6 |
mov [0xfff4],byte 0 |
call check_mouse_data |
call [draw_pointer] |
pushad |
1460,7 → 1470,6 |
mov ecx,100 ; wait to avoid mouse residuals |
waitre2: |
call check_mouse_data |
mov [0xfff5],byte 1 |
call checkidle |
cmp [edi+31],byte 0 |
/kernel/trunk/hid/m_com1.inc |
---|
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 |
/kernel/trunk/hid/m_com2.inc |
---|
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 |
/kernel/trunk/hid/m_ps2.inc |
---|
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 |
/kernel/trunk/hid/mousedrv.inc |
---|
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 |
/kernel/trunk/kernel.asm |
---|
86,7 → 86,7 |
putpixel dd __sys_putpixel |
; } mike.dld |
version db 'Kolibri OS version 0.5.2.1 ',13,10,13,10,0 |
version db 'Kolibri OS version 0.5.2.9 ',13,10,13,10,0 |
;dd endofcode-0x10000 |
;db 'Boot02' |
582,6 → 582,12 |
; mov cr4,eax |
; fail_fpu: |
;The CPU to this moment should be already in PM, |
;and bit MP of the register cr0 should be installed in 1. |
finit ;reset of the FPU (finit, instead of fninit) |
fsetpm ;enable PM of the FPU |
finit ;reset the registers, contents which are still equal RM |
;Now FPU too in PM |
; DETECT DEVICES |
mov esi,boot_devices |
599,9 → 605,6 |
mov al,0x2e ; msb |
out 0x40,al |
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
;include 'detect/commouse.inc' |
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
; SET MOUSE |
mov esi,boot_setmouse |
710,6 → 713,7 |
; LOAD DEFAULT SKIN |
call load_default_skin |
call load_default_skin_1 |
; MTRR'S |
748,11 → 752,12 |
call kb_write |
; wait until 8042 is ready |
mov ecx,0 |
@@: |
in al,64h |
and al,00000010b |
loopnz @b |
; xor ecx,ecx |
; @@: |
; in al,64h |
; and al,00000010b |
; loopnz @b |
call Wait8042BufferEmpty |
; mov al, 0xED ; svetodiody - only for testing! |
; call kb_write |
807,30 → 812,29 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; ; |
; MAIN OS LOOP ; |
; MAIN OS LOOP START ; |
; ; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
align 32 |
osloop: |
call check_mouse_data |
call [draw_pointer] |
call checkbuttons |
call main_loop_sys_getkey |
call checkwindows |
call check_window_move_request |
call checkmisc |
call checkEgaCga |
call stack_handler |
call checkidle |
call check_fdd_motor_status |
jmp osloop |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; ; |
; MAIN OS LOOP END ; |
; ; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
checkidle: |
pushad |
1039,14 → 1043,14 |
cnvl: |
pushad |
mov ecx,[0xfb0a] |
cmp ecx,[novesachecksum] |
jne novesal |
popad |
ret |
; mov ecx,[0xfb0a] |
; cmp ecx,[novesachecksum] |
; jne novesal |
; popad |
; ret |
novesal: |
mov [novesachecksum],ecx |
; mov [novesachecksum],ecx |
mov ecx,0 |
movzx eax,word [0xfb0c] |
cmp eax,100 |
2043,6 → 2047,7 |
detect_devices: |
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
include 'detect/commouse.inc' |
include 'detect/ps2mouse.inc' |
;include 'detect/dev_fd.inc' |
;include 'detect/dev_hdcd.inc' |
;include 'detect/sear_par.inc' |
2120,8 → 2125,10 |
; i.e. if window is not already active |
;* start code - get active process (1) - Mario79 |
cli |
mov [window_minimize],2 |
mov [active_process],edi |
; mov [active_process],edi |
sti |
;* end code - get active process (1) - Mario79 |
mov [0xff01],edi ; activate |
2146,7 → 2153,6 |
;!!!!!!!!!!!!!!!!!!!!!!!! |
include 'blkdev/rdsave.inc' |
;!!!!!!!!!!!!!!!!!!!!!!!! |
;* start code - get active process (2) - Mario79 |
cmp eax,7 |
jnz nogetactiveprocess |
mov eax,[active_process] |
2244,7 → 2250,6 |
mov [esp+36],dword 0 |
ret |
no_mouse_centered: |
;* end code - get active process (2) - Mario79 |
cmp eax,16 |
jnz no_get_free_space |
mov eax,[MEM_FreeSpace] |
2266,7 → 2271,7 |
iglobal |
version_inf: |
db 0,5,2,1 ; version 0.5.2.1 |
db 0,5,2,9 ; version 0.5.2.9 |
db UID_KOLIBRI |
db 'Kolibri',0 |
version_end: |
2789,29 → 2794,52 |
cmp edi,0 ; type I - original style |
jne nosyswI |
inc [mouse_pause] |
call sys_set_window |
call drawwindow_I |
dec [mouse_pause] |
ret |
nosyswI: |
cmp edi,1 ; type II - only reserve area, no draw |
jne nosyswII |
inc [mouse_pause] |
call sys_set_window |
call sys_window_mouse |
dec [mouse_pause] |
ret |
nosyswII: |
cmp edi,2 ; type III - new style |
jne nosyswIII |
inc [mouse_pause] |
call sys_set_window |
call drawwindow_III |
dec [mouse_pause] |
ret |
nosyswIII: |
cmp edi,3 ; type IV - skinned window |
jne nosyswIV |
cli |
mov edi,[0x3010] |
sub edi,0x3000 |
shr edi,5 |
cmp edi,[active_process] |
jne @f |
mov [aw_yes],1 |
jmp aw_yes_end |
@@: |
mov [aw_yes],0 |
aw_yes_end: |
sti |
inc [mouse_pause] |
call sys_set_window |
call drawwindow_IV |
dec [mouse_pause] |
mov [aw_yes],0 |
ret |
nosyswIV: |
3258,708 → 3286,6 |
ret |
; 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 |
check_mouse_data: |
pushad |
cmp [0xF604],byte 1 |
jne no_ps2_mouse |
mov [mousecount],dword 0x2e0000+12*4096 |
mov [mousedata],dword 0x2e0000+12*4096+0x10 |
jmp uusicheckmouse |
no_ps2_mouse: |
cmp [0xF604],byte 2 |
jne no_com1_mouse |
mov [mousecount],dword 0x2e0000+4*4096 |
mov [mousedata],dword 0x2e0000+4*4096+0x10 |
jmp uusicheckmouse |
no_com1_mouse: |
mov [mousecount],dword 0x2e0000+3*4096 |
mov [mousedata],dword 0x2e0000+3*4096+0x10 |
uusicheckmouse: |
mov ebx,[mousecount] ; anything at buffer for mouse |
cmp dword [ebx], 0 ; !!! |
jz checkmouseret |
; first byte of comX or ps2 ? |
cmp [0xF604],byte 1 |
je ps2mousefirst |
; ****************************************** |
; *********** COMX mouse driver ************ |
; ****************************************** |
com1mousefirst: |
mov edi,[mousedata] |
mov dl,byte [edi] ; first com1 ? |
test dl,64 |
jz @f |
mov [0xfb00],byte 0 ; zero mouse block count |
@@: |
xor ebx,ebx |
mov bl,[0xfb00] |
inc bl |
mov [0xfb00],bl |
mov eax,0xfb00 |
add eax,ebx |
mov edi,[mousedata] |
mov dl,byte [edi] |
mov [eax],byte dl |
cmp bl,3 ; three ? |
jnz decm |
; buttons |
;* change right and left button by places - start code - Mario79 |
mov al,[0xfb01] |
mov ah,al |
shr al,3 |
and al,2 |
shr ah,5 |
and ah,1 |
add al,ah |
;* change right and left button by places - end code - Mario79 |
mov [0xfb40],al |
; com1 mouse |
; x |
mov dl,[0xfb01] ; x high bits |
movzx eax,dl |
and al,3 |
shl al,6 |
mov dl,byte[0xfb02] ; x low bits |
add al,dl |
mov [0xfb21],byte al |
movzx ebx,word[0xfb0a] |
mov al,byte [0xfb01] ; + or - ? |
test al,2 |
jz x_add |
x_sub: ; x- |
sub bx,255 |
sub bx,255 |
x_add: ; x+ |
movzx eax,byte [0xfb21] |
add bx,ax |
add bx,ax |
push ebx |
mov [0xfb00],byte 0 |
; y |
my_event: |
mov dl,[0xfb01] ; y high bits |
movzx eax,dl |
and al,12 |
shl al,4 |
mov dl,byte[0xfb03] ; y low bits |
add al,dl |
mov [0xfb22],byte al |
movzx ebx,word[0xfb0c] |
mov al,byte [0xfb01] ; + or - ? |
test al,8 |
je y_add |
y_sub: ; y- |
sub bx,255 |
sub bx,255 |
y_add: ; y+ |
movzx eax,byte [0xfb22] |
add bx,ax |
add bx,ax |
push ebx |
mov [0xfb00],byte 0 |
jmp mdraw |
; end of com1 mouse |
; ****************************************** |
; ******** PS2 MOUSE DRIVER ************** |
; ****************************************** |
ps2mousefirst: |
movzx edx,byte [0x2E0000+4096*12+0x10] ; first ps2 ? |
cmp edx,40 |
jne @f |
mov [0xfb00],byte 0 ; zero mouse block count |
@@: |
movzx ebx,byte [0xfb00] |
add ebx,1 |
mov [0xfb00],bl |
mov eax,0xfb00 |
add eax,ebx |
mov dl,byte [0x2E0000+4096*12+0x10] |
mov [eax],byte dl |
cmp bl,3 ; full packet of three bytes ? |
jnz decm |
mov [0xfb00],byte 0 ; zero mouse block count |
; buttons |
movzx eax,byte [0xfb01] |
and eax,3 |
mov [0xfb40],al |
; x |
movzx eax,word [0xfb0a] |
movzx edx,byte [0xfb02] |
cmp edx,128 |
jb ps2xp |
shl edx,1 |
add eax,edx |
cmp eax,512 |
jge ps2xsok |
xor eax, eax |
jmp ps2xready |
ps2xsok: |
sub eax,512 |
jmp ps2xready |
ps2xp: |
shl edx,1 |
add eax,edx |
jmp ps2xready |
ps2xready: |
push eax |
; y |
movzx eax,word [0xfb0c] |
movzx edx,byte [0xfb03] |
cmp edx,128 |
jb ps2yp |
add eax,512 |
shl edx,1 |
sub eax,edx |
jmp ps2yready |
ps2yp: |
shl edx,1 |
cmp edx,eax |
jb ps201 |
mov edx,eax |
ps201: |
sub eax,edx |
jmp ps2yready |
ps2yready: |
push eax |
;jmp mdraw |
; end of ps2 mouse |
; **************************** |
; ***** CHECK FOR LIMITS ***** |
; **************************** |
mdraw: |
cmp [0xfb44],byte 0 |
jne mousedraw4 |
cmp [0xfb40],byte 0 |
je mousedraw4 |
mov [0xfff5],byte 1 |
mousedraw4: |
pop ebx |
pop eax |
mov [mouse_active],1 |
; mov dx,0 ; smaller than zero |
xor dx,dx |
cmp bx,dx |
jge mnb11 |
; mov bx,0 |
xor bx,bx |
mnb11: |
mov [0xfb0c],word bx |
; mov dx,0 |
xor dx,dx |
cmp ax,dx |
jge mnb22 |
; mov ax,0 |
xor ax,ax |
mnb22: |
mov [0xfb0a],word ax |
mov edx,[0xfe04] ; bigger than maximum |
cmp ebx,edx |
jb mnb1 |
mov bx,[0xfe04] |
mnb1: |
mov [0xfb0c],word bx |
mov edx,[0xfe00] |
cmp eax,edx |
jb mnb2 |
mov ax,[0xfe00] |
mnb2: |
mov [0xfb0a],word ax |
; **** NEXT DATA BYTE FROM MOUSE BUFFER **** |
decm: |
mov edi,[mousecount] ; decrease counter |
dec dword [edi] |
mov esi,[mousedata] |
mov edi,esi |
inc esi |
; mov ecx,250 |
mov ecx,[mousecount] |
mov ecx,[ecx] |
cld |
rep movsb |
jmp uusicheckmouse |
checkmouseret: |
cmp [0xfb44],byte 0 |
jne cmret |
cmp [0xfb40],byte 0 |
je cmret |
mov [0xfff4],byte 0 |
mov [0xfff5],byte 0 |
cmret: |
popad |
ret |
draw_mouse_under: |
; return old picture |
; cli |
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 |
; sti |
ret |
save_draw_mouse: |
; save & draw |
; cli |
mov [0xfb4a],ax |
mov [0xfb4c],bx |
push eax |
push ebx |
mov ecx,0 |
mov edx,0 |
;cli ; !!!**** |
drm: |
push eax |
push ebx |
push ecx |
push edx |
; helloworld |
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 |
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 |
mov ecx, [0xfb10] |
mov edi, 1 |
call [putpixel] |
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 ; !!!**** |
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: |
pushad |
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 |
no_mouse_disable: |
popad |
ret |
__sys_draw_pointer: |
cli |
pushad |
cmp dword [0xf204],dword 0 ; mouse visible ? |
je chms00 |
dec dword [0xf204] |
cmp [0xf204],dword 0 |
jnz nodmu2 |
movzx ebx,word [0xfb0c] |
movzx eax,word [0xfb0a] |
call save_draw_mouse |
popad |
sti |
ret |
nodmu2: |
popad |
sti |
ret |
chms00: |
; popad |
; pushad |
; cmp [0xf204],dword 0 |
; jne nodmp |
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 |
redrawmouse_1: |
call save_draw_mouse |
nodmp: |
popad |
sti |
ret |
calculatebackground: ; background |
; all black |
4451,15 → 3777,17 |
drawbackground: |
inc [mouse_pause] |
cmp [0xfe0c],word 0x12 |
jne dbrv12 |
cmp [display_data-12],dword 1 |
jne bgrstr12 |
call vga_drawbackground_tiled |
dec [mouse_pause] |
ret |
bgrstr12: |
call vga_drawbackground_stretch |
dec [mouse_pause] |
ret |
dbrv12: |
4468,25 → 3796,27 |
cmp [0xfe0c],word 0x13 |
je dbrv20 |
call vesa12_drawbackground |
dec [mouse_pause] |
ret |
dbrv20: |
cmp [display_data-12],dword 1 |
jne bgrstr |
call vesa20_drawbackground_tiled |
dec [mouse_pause] |
ret |
bgrstr: |
call vesa20_drawbackground_stretch |
dec [mouse_pause] |
ret |
sys_putimage: |
cmp [0xfe0c],word 0x12 |
jne spiv20 |
call vga_putimage |
ret |
spiv20: |
cmp [0xfe0c],word 0100000000000000b |
jge piv20 |
cmp [0xfe0c],word 0x13 |
4506,23 → 3836,23 |
; edi color |
__sys_drawbar: |
inc [mouse_pause] |
cmp [0xfe0c],word 0x12 |
jne sdbv20 |
call vga_drawbar |
dec [mouse_pause] |
ret |
sdbv20: |
cmp [0xfe0c],word 0100000000000000b |
jge dbv20 |
cmp [0xfe0c],word 0x13 |
je dbv20 |
call vesa12_drawbar |
dec [mouse_pause] |
ret |
dbv20: |
call vesa20_drawbar |
dec [mouse_pause] |
ret |
4641,26 → 3971,24 |
mov [0xf200],dword mousepointer |
cli |
mov bl,0xa8 ; enable mouse cmd |
call kb_cmd |
call kb_read ; read status |
; 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 |
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 |
5121,8 → 4449,9 |
mov edx,[0x3010] |
add eax,[edx-twdw] |
add ebx,[edx-twdw+4] |
xor edi,edi ; no force |
call [disable_mouse] |
; xor edi,edi ; no force |
mov edi,1 |
; call [disable_mouse] |
jmp [putpixel] |
align 4 |
5557,6 → 4886,13 |
;* start code - get process (3) - Mario79 |
active_process dd 0 |
active_process_flag db 0 |
aw_yes db 0 |
deleted_process dd 0 |
mouse_pause dd 0 |
ps2_mouse_detected db 0 |
com1_mouse_detected db 0 |
com2_mouse_detected db 0 |
;* end code - get active process (3) - Mario79 |
wraw_bacground_select db 0 |
5574,6 → 4910,7 |
keyboard dd 0x1 |
sound_dma dd 0x1 |
syslang dd 0x1 |
active_proc_stack_coun dd 0xa400-4 |
endg |
IncludeIGlobals |
/kernel/trunk/kernel32.inc |
---|
96,6 → 96,7 |
; Character devices |
include "hid/keyboard.inc" |
include "hid/mousedrv.inc" |
; setting date,time,clock and alarm-clock |
/kernel/trunk/memmap.inc |
---|
54,11 → 54,15 |
; 6000 -> 68FF free |
; 6900 -> 6EFF saved picture under mouse pointer |
; |
; 6F00 -> 7FFF free |
; 6F00 -> 6FFF free |
; |
; 7000 -> 7FFF used CD driver |
; |
; 8000 -> A3FF used FLOPPY driver |
; |
; A400 -> B0FF free |
; A400 -> A7FF used active process stack |
; |
; A800 -> B0FF free |
; B100 -> B2FF IDT |
/kernel/trunk/scin_v2.7z |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/kernel/trunk/video/vesa20.inc |
---|
325,6 → 325,7 |
call dword [0xe020] ; call the real put_pixel function |
.exit: |
popad |
ret |
align 4 |
376,7 → 377,7 |
align 4 |
__sys_draw_line: |
inc [mouse_pause] |
call [disable_mouse] |
; draw a line |
512,6 → 513,7 |
.exit: |
add esp, 6*4 |
popa |
dec [mouse_pause] |
ret |
587,6 → 589,7 |
; edx ye |
; edi color |
vesa20_drawbar: |
pushad |
call [disable_mouse] |
616,6 → 619,7 |
popad |
xor eax, eax |
inc eax |
ret |
@@: |
cmp ebx, [drbar.bar_sx] |
632,6 → 636,7 |
popad |
xor eax, eax |
inc eax |
ret |
@@: |
cmp ebx, [drbar.bar_sy] |
775,6 → 780,7 |
add esp, drbar.stack_data |
popad |
xor eax, eax |
ret |
/kernel/trunk/video/vga.inc |
---|
57,7 → 57,8 |
vga_putimage: |
; pushad |
call [disable_mouse] |
push ebp ; |
push esi ; |
push edi ; |
226,6 → 227,9 |
pop esi |
pop ebp |
; call [draw_pointer] |
; call [disable_mouse] |
; popad |
ret |
251,7 → 255,7 |
and ecx,0x07 ; bit no. (modulo 8) |
setvgapixel: |
cli |
; edi = address, eax = 24bit colour, ecx = bit no. (modulo 8) |
push eax |
300,11 → 304,13 |
mov al,[edi] ; dummy read |
mov [edi],dl |
sti |
ret |
vga_drawbar: |
; pushad |
call [disable_mouse] |
sub edx,ebx ; edx:=Yend-Ystart=H |
sub ecx,eax ; ecx:=Xend-Xstat=B |
492,12 → 498,12 |
;pop edx |
;pop ecx |
; popad |
ret |
vga_drawbackground_tiled: |
call [disable_mouse] |
push ebp |
push eax |
push ebx |
639,8 → 645,8 |
vga_drawbackground_stretch: |
call [disable_mouse] |
push ebp |
push eax |
push ebx |