(*
  $Id$
  ------------------------------------------------------------------------------
  Header file for libgba interrupt handling

  Copyright 2003-2006 by Dave Murphy.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Library General Public
  License as published by the Free Software Foundation; either
  version 2 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Library General Public License for more details.

  You should have received a copy of the GNU Library General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  USA.

  Please report all bugs and problems through the bug tracker at
  "http://sourceforge.net/tracker/?group_id=114505&atid=668551".


  ------------------------------------------------------------------------------


  Conversion by Legolas (http://itaprogaming.free.fr) for freepascal compiler
  (http://www.freepascal.org)

  Copyright (C) 2006  Francesco Lombardi
  Check http://sourceforge.net/projects/libndsfpc for updates

  ------------------------------------------------------------------------------

  $Log$


*)


{$ifdef GBA_INTERFACE}
type
//  IntFn = procedure;
  IntFn = procedure of object;
  TVoidFunctionPointer = procedure of object;

  IntTable = record
    handler: IntFn;
    mask: cuint32;
  end;
  PIntTable = ^IntTable;


const
  MAX_INTS = 15;
//  INT_VECTOR  : IntFn = pointer($03007ffc);   // BIOS Interrupt vector
var
  INT_VECTOR  : IntFn absolute $03007ffc;   // BIOS Interrupt vector

  REG_IME     : pu16 = pointer(REG_BASE + $208);  // Interrupt Master Enable
  REG_IE      : pu16 = pointer(REG_BASE + $200);  // Interrupt Enable
  REG_IF      : pu16 = pointer(REG_BASE + $202);  // Interrupt Request


type
  irqMASKS = integer;
  irqMASK  = irqMASKS;
const
  IRQ_VBLANK :  irqMASK = (1 shl  0);
  IRQ_HBLANK :  irqMASK = (1 shl  1);
  IRQ_VCOUNT :  irqMASK = (1 shl  2);
  IRQ_TIMER0 :  irqMASK = (1 shl  3);
  IRQ_TIMER1 :  irqMASK = (1 shl  4);
  IRQ_TIMER2 :  irqMASK = (1 shl  5);
  IRQ_TIMER3 :  irqMASK = (1 shl  6);
  IRQ_SERIAL :  irqMASK = (1 shl  7);
  IRQ_DMA0   :  irqMASK = (1 shl  8);
  IRQ_DMA1   :  irqMASK = (1 shl  9);
  IRQ_DMA2   :  irqMASK = (1 shl 10);
  IRQ_DMA3   :  irqMASK = (1 shl 11);
  IRQ_KEYPAD :  irqMASK = (1 shl 12);
  IRQ_GAMEPAK:  irqMASK = (1 shl 13);


var
//  IntrTable: array [0..MAX_INTS-1] of IntTable; cvar; // cvar used in order to gain access from assembly unit
  IntrTable: array [0..0] of IntTable; cvar; external;         

procedure irqInit(); cdecl; external;

procedure irqSet(mask: irqMASK; func: TVoidFunctionPointer); cdecl; external;
procedure irqSet(mask: irqMASK; func: pointer); cdecl; external;
procedure irqEnable(mask: cint); cdecl; external;
procedure irqDisable(mask: cint); cdecl; external;

procedure IntrMain(); cdecl; external;
{$endif GBA_INTERFACE}
