From ecbdb9c8cc12d9d6b9edf4e570d0d5266417b3d1 Mon Sep 17 00:00:00 2001 From: aaron <aaron@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c> Date: Fri, 19 May 2017 21:38:13 +0000 Subject: [PATCH] git-svn-id: https://spexeah.com:8443/svn/Asuro@118 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- src/drivers/isr46.pas | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/drivers/isr46.pas diff --git a/src/drivers/isr46.pas b/src/drivers/isr46.pas new file mode 100644 index 00000000..e1653ced --- /dev/null +++ b/src/drivers/isr46.pas @@ -0,0 +1,73 @@ +{ ************************************************ + * Asuro + * Unit: Drivers/ISR46 + * Description: Primary ATA IRQ + ************************************************ + * Author: Aaron Hance + * Contributors: + ************************************************ } + +unit isr46; + +interface + +uses + util, + console, + isr_types, + 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](void($00000000))); + end; + console.writestringln('Disk Operation Complete'); +end; + +procedure register(); +begin + memset(uint32(@Hooks[0]), 0, sizeof(pp_hook_method)*MAX_HOOKS); + IDT.set_gate(18, 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 begin + Hooks[i]:= pp_hook_method(hook_method); + exit; + end; + 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