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