{ 
	Driver->Timer->TMR_0_ISR - 1024hz Timer Driver.
	
	@author(Kieron Morris <kjm@kieronmorris.me>)
}
unit TMR_0_ISR;

interface

uses
    util,
    console,
    isr_types,
    isrmanager,
    IDT;

procedure register();
procedure hook(hook_method : uint32);
procedure unhook(hook_method : uint32);

implementation

var
    Hooks : Array[1..MAX_HOOKS] of pp_hook_method;
    Registered : boolean = false;

procedure Main; //IRQ0, 1024.19hz aprox
var
    i : integer;

begin
    CLI;
    for i:=0 to MAX_HOOKS-1 do begin
        if uint32(Hooks[i]) <> 0 then begin 
            Hooks[i](nil);
        end;
    end;
end;

procedure register();
begin
    if not registered then begin
        asm
            mov ax, 1193
            out $40, al
            mov al, ah
            out $40, al
        end;
        memset(uint32(@Hooks[0]), 0, sizeof(pp_hook_method)*MAX_HOOKS);
        isrmanager.registerISR(32, @Main);
        Registered:= true;
    end;
    //IDT.set_gate(32, uint32(@Main), $08, ISR_RING_0);
end;

procedure hook(hook_method : uint32);
var
    i : uint32;

begin
    register();
    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.
