93
« am: 27. October 2005, 16:39 »
hi,
klar, ist jedoch Delphi Code, sollte aber leicht zu verstehen sein, da viel Assembler drin vorkommt.
procedure InitMouse;
var InByte : Byte;
begin
kbCmd($A8);
kbRead;
kbCmd($20);
InByte := kbRead OR $3;
kbCmd($60);
If Inb($E9) = $E9 then kbWrite(InByte); // Für Bochs
kbCmd($D4);
kbWrite($F4);
kbRead;
end;
procedure kbWrite(Cmd: Byte);
asm
@Init:
pushad
mov dl,al
mov ecx,$ffff
@kw_loop1:
in al,$64
test al,$20
jz @kw_ok1
loop @kw_loop1
mov ah,1
jmp @kw_exit
@kw_ok1:
in al,$60
mov ecx,$ffff
@kw_loop:
in al,$64
test al,2
jz @kw_ok
loop @kw_loop
mov ah,1
jmp @kw_exit
@kw_ok:
mov al,dl
out $60,al
mov ecx,$ffff
@kw_loop3:
in al,$64
test al,2
jz @kw_ok3
loop @kw_loop3
mov ah,1
jmp @kw_exit
@kw_ok3:
mov ah,8
@kw_loop4:
mov ecx,$ffff
@kw_loop5:
in al,$64
test al,1
jnz @kw_ok4
loop @kw_loop5
dec ah
jnz @kw_loop4
@kw_ok4:
xor ah,ah
@kw_exit:
popad
end;
function kbRead: Byte;
asm
@Init:
push ecx
push edx
mov ecx,$ffff
@kr_loop:
in al,$64
test al,1
jnz @kr_ready
loop @kr_loop
mov ah,1
jmp @kr_exit
@kr_ready:
push ecx
mov ecx,32
@kr_delay:
loop @kr_delay
pop ecx
in al,$60
xor ah,ah
@kr_exit:
pop edx
pop ecx
end;
procedure kbCmd(Cmd: Byte);
asm
@Init:
mov ecx,$ffff
push eax
@c_wait:
in al,$64
test al,2
jz @c_send
loop @c_wait
jmp @c_error
@c_send:
pop eax
out $64,al
mov ecx,$ffff
@c_accept:
in al,$64
test al,2
jz @c_ok
loop @c_accept
@c_error:
mov ah,1
jmp @c_exit
@c_ok:
xor ah,ah
@c_exit:
end;
procedure IRQ12_ASM; assembler;
asm
pushad
call IRQ12
popad
iretd
end;
mfg,
stefan