git-svn-id: https://spexeah.com:8443/svn/Asuro@504 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c

This commit is contained in:
kieron
2018-04-12 00:35:11 +00:00
parent c6ed6453e0
commit 3dc6a1d2b3
19 changed files with 55 additions and 10 deletions

View File

@ -12,6 +12,7 @@ unit mouse;
interface
uses
tracer,
console,
util,
isr44,
@ -44,6 +45,7 @@ var
r : pchar;
begin
push_trace('mouse.callback');
packet:= PMousePacket(kalloc(sizeof(TMousePacket)));
f:= (uint32(raw) AND $FF000000) SHR 24;
x:= (uint32(raw) AND $00FF0000) SHR 16;
@ -102,13 +104,16 @@ begin
kfree(void(packet));
//console.writestring('Mouse Packet: ');
//console.writehexln(DWORD(raw));
pop_trace;
end;
function load(ptr : void) : boolean;
begin
push_trace('mouse.load');
isr44.hook(uint32(@callback));
console.outputln('PS/2 MOUSE', 'LOADED.');
load:= true;
pop_trace;
end;
procedure init();
@ -116,6 +121,7 @@ var
devid : TDeviceIdentifier;
begin
push_trace('mouse.init');
console.outputln('PS/2 MOUSE', 'INIT BEGIN.');
devid.bus:= biUnknown;
devid.id0:= 0;
@ -126,6 +132,7 @@ begin
devid.ex:= nil;
drivermanagement.register_driver_ex('PS/2 Mouse', @devid, @load, true);
console.outputln('PS/2 MOUSE', 'INIT END.');
pop_trace;
end;
end.

View File

@ -49,6 +49,7 @@ procedure register();
begin
memset(uint32(@Hooks[0]), 0, sizeof(pp_hook_method)*MAX_HOOKS);
IDT.set_gate(33, uint32(@Main), $08, ISR_RING_0);
inb($60);
end;
procedure hook(hook_method : uint32);

View File

@ -12,6 +12,7 @@ unit isr44;
interface
uses
tracer,
util,
console,
isr_types,
@ -34,32 +35,38 @@ var
timeout : uint32;
begin
push_trace('isr44.mouse_wait');
timeout:= 100000;
if (w_type = 0) then begin
while (timeout > 0) do begin
if ((inb($64) AND $01) = $01) then exit;
if ((inb($64) AND $01) = $01) then break;
timeout:= timeout-1;
end;
end else begin
while (timeout > 0) do begin
if ((inb($64) AND 2) = 0) then exit;
if ((inb($64) AND 2) = 0) then break;
timeout := timeout - 1;
end;
end;
pop_trace;
end;
procedure mouse_write(value : uint8);
begin
push_trace('isr44.mouse_write');
mouse_wait(1);
outb($64, $D4);
mouse_wait(1);
outb($60, value);
pop_trace;
end;
function mouse_read : uint8;
begin
push_trace('isr44.mouse_read');
mouse_wait(0);
mouse_read:= inb($60);
pop_trace;
end;
procedure Main(); interrupt;
@ -68,31 +75,45 @@ var
b : byte;
begin
{push_trace('isr44.main');
b:= mouse_read;
push_trace('isr44.main1');
if Cycle = 0 then begin
push_trace('isr44.main2');
if (b AND $08) = $08 then begin
push_trace('isr44.main3');
Mouse_Byte[Cycle]:= b;
push_trace('isr44.main4');
inc(Cycle);
end;
end else begin
push_trace('isr44.main5');
Mouse_Byte[Cycle]:= b;
push_trace('isr44.main6');
inc(Cycle);
end;
push_trace('isr44.main7');
if Cycle > 2 then begin
Cycle:= 0;
push_trace('isr44.main8');
// console.writestring('Packet[0]: ');
// console.writeintln(Mouse_Byte[0]);
// console.writestring('Packet[1]: ');
// console.writeintln(Mouse_Byte[1]);
// console.writestring('Packet[2]: ');
// console.writeintln(Mouse_Byte[2]);
push_trace('isr44.main9');
Packet:= (Mouse_Byte[0] SHL 24) OR (Mouse_Byte[1] SHL 16) OR (Mouse_Byte[2] SHL 8) OR ($FF);
push_trace('isr44.main10');
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) <> 0 then Hooks[i](void(Packet));
end;
push_trace('isr44.main11');
end;
push_trace('isr44.main12');
outb($20, $20);
outb($A0, $20);
pop_trace;}
end;
procedure register();
@ -102,6 +123,7 @@ var
ak : uint8;
begin
push_trace('isr44.register');
memset(uint32(@Hooks[0]), 0, sizeof(pp_hook_method)*MAX_HOOKS);
mouse_wait(1);
outb($64, $A8);
@ -118,32 +140,44 @@ begin
mouse_write($F4);
mouse_read();
IDT.set_gate(44, uint32(@Main), $08, ISR_RING_0);
pop_trace;
end;
procedure hook(hook_method : uint32);
var
i : uint32;
cont : boolean;
begin
push_trace('isr44.hook');
cont:= true;
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) = hook_method then exit;
end;
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) = 0 then begin
Hooks[i]:= pp_hook_method(hook_method);
exit;
if uint32(Hooks[i]) = hook_method then begin
cont:= false;
break;
end;
end;
if cont then begin
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) = 0 then begin
Hooks[i]:= pp_hook_method(hook_method);
break;
end;
end;
end;
pop_trace;
end;
procedure unhook(hook_method : uint32);
var
i : uint32;
begin
push_trace('isr44.unhook');
for i:=0 to MAX_HOOKS-1 do begin
If uint32(Hooks[i]) = hook_method then Hooks[i]:= nil;
exit;
break;
end;
pop_trace;
end;
end.

View File

@ -40,7 +40,8 @@ uses
storagemanagement,
lists,
net,
fat32;
fat32,
isrmanager;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall;
@ -140,6 +141,7 @@ begin
{ Memory/CPU Init }
idt.init();
isr.init();
//isrmanager.init();
irq.init();
pmemorymanager.init();
vmemorymanager.init();
@ -194,6 +196,7 @@ begin
console.setdefaultattribute(console.combinecolors(Green, Black));
console.writestringln('Asuro Booted Correctly!');
console.setdefaultattribute(console.combinecolors(White, Black));
if INTE then console.writestringln('Interrupts are enabled.') else console.writestringln('Interrupts are disabled.');
console.writestringln('');
console.writestringln('Press any key to boot in to Asuro Terminal...');
tracer.pop_trace;