diff --git a/Asuro.iso b/Asuro.iso index f35b1ded..8ecfd58a 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index 881b9c1b..7aac7a25 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index 881b9c1b..7aac7a25 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/isr.ppu b/lib/isr.ppu index 9b42b9d8..77834535 100644 Binary files a/lib/isr.ppu and b/lib/isr.ppu differ diff --git a/lib/isr0.ppu b/lib/isr0.ppu index e4a07e3d..3e777693 100644 Binary files a/lib/isr0.ppu and b/lib/isr0.ppu differ diff --git a/lib/libpkernel.a b/lib/libpkernel.a index 1c5a54f9..9632e6ad 100644 Binary files a/lib/libpkernel.a and b/lib/libpkernel.a differ diff --git a/src/drivers/isr0.pas b/src/drivers/isr0.pas index 66eb3ec5..bde37ab3 100644 --- a/src/drivers/isr0.pas +++ b/src/drivers/isr0.pas @@ -18,12 +18,23 @@ uses IDT; procedure register(); +procedure hook(hook_method : uint32); +procedure unhook(hook_method : uint32); implementation +var + Hooks : Array[1..MAX_HOOKS] of pp_hook_method; + procedure Main(); interrupt; +var + i : integer; + begin CLI; + for i:=0 to MAX_HOOKS-1 do begin + if uint32(Hooks[i]) <> 0 then Hooks[i](nil); + end; console.writestringln('Divide by Zero Exception.'); util.halt_and_catch_fire; end; @@ -33,4 +44,27 @@ begin IDT.set_gate(0, uint32(@Main), $08, ISR_RING_0); end; +procedure hook(hook_method : uint32); +var + i : uint32; + +begin + 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 Hooks[i]:= pp_hook_method(hook_method); + end; +end; + +procedure unhook(hook_method : uint32); +var + i : uint32; +begin + for i:=0 to MAX_HOOKS-1 do begin + If uint32(Hooks[i]) = hook_method then Hooks[i]:= nil; + exit; + end; +end; + end. \ No newline at end of file diff --git a/src/drivers/isr32.pas b/src/drivers/isr32.pas index 4955e63e..a724555a 100644 --- a/src/drivers/isr32.pas +++ b/src/drivers/isr32.pas @@ -14,13 +14,14 @@ interface uses util, console, + isr_types, IDT; -type - pp_void = procedure(); +//type +// pp_void = procedure(); -var - procedure_ptr : pp_void = nil; +//var +// procedure_ptr : pp_void = nil; procedure register(); @@ -28,21 +29,21 @@ implementation procedure Main; interrupt; //IRQ0, called every 55ms begin - if(procedure_ptr <> nil) then begin - procedure_ptr(); - end; + //if(procedure_ptr <> nil) then begin + //procedure_ptr(); + //end; outb($20, $20); end; procedure register(); begin asm - mov al, $36 - out $46, al - mov ax, 1165 - out $40, al - mov al, ah - out $40, al + mov al, $36 + out $46, al + mov ax, 1165 + out $40, al + mov al, ah + out $40, al end; IDT.set_gate(32, uint32(@Main), $08, ISR_RING_0); end; diff --git a/src/drivers/isr33.pas b/src/drivers/isr33.pas index 28825574..9d8e6e62 100644 --- a/src/drivers/isr33.pas +++ b/src/drivers/isr33.pas @@ -14,6 +14,7 @@ interface uses util, console, + isr_types, IDT; type diff --git a/src/drivers/isr40.pas b/src/drivers/isr40.pas index b0364d83..89bc63fb 100644 --- a/src/drivers/isr40.pas +++ b/src/drivers/isr40.pas @@ -14,13 +14,11 @@ interface uses util, console, + isr_types, IDT; -type - pp_void = procedure(); - -var - procedure_ptr : pp_void = nil; +//var + //procedure_ptr : pp_void = nil; procedure register(); @@ -29,9 +27,9 @@ implementation procedure Main; interrupt; //IRQ0, called 1024 times a second. begin console.writestringln('helo3'); - if(procedure_ptr <> nil) then begin - procedure_ptr(); - end; + //if(procedure_ptr <> nil) then begin + // procedure_ptr(); + //end; outb($A0, $20); outb($20, $20); end; diff --git a/src/drivers/isr_types.pas b/src/drivers/isr_types.pas index ca6e782c..f87ea073 100644 --- a/src/drivers/isr_types.pas +++ b/src/drivers/isr_types.pas @@ -11,12 +11,18 @@ unit isr_types; interface +const + MAX_HOOKS = 16; + type ISR_REGS = record ip, cs, flags, sp, ss : uint16; end; PISR_REGS = ^ISR_REGS; + pp_hook_method = procedure(data : void); + pp_void = pp_hook_method; + implementation end. \ No newline at end of file