/*
** interrupt.h -- Amiga Linux interrupt handling structs and prototypes
**
** Copyright 1992 by Greg Harp
**
** This file is subject to the terms and conditions of the GNU General Public
** License.  See the file README.legal in the main directory of this archive
** for more details.
**
** Created 10/2/92 by Greg Harp
*/

#ifndef INTERRUPT_H
#define INTERRUPT_H

/*
** Definitions
*/

#define NUM_IRQS    7           /* there are 7 possible interrupt levels */

#define IRQ1_MASK   0x0007      /* INTREQR mask for IRQ 1 */
#define IRQ2_MASK   0x0008      /* INTREQR mask for IRQ 2 */
#define IRQ3_MASK   0x0070      /* INTREQR mask for IRQ 3 */
#define IRQ4_MASK   0x0780      /* INTREQR mask for IRQ 4 */
#define IRQ5_MASK   0x1800      /* INTREQR mask for IRQ 5 */
#define IRQ6_MASK   0x2000      /* INTREQR mask for IRQ 6 */
#define IRQ7_MASK   0x4000      /* INTREQR mask for IRQ 7 */

#define IF_INTEN    0x4000      /* master interrupt bit in INT* registers */
#define IF_EXTER    0x2000      /* external level 6 and CIA B interrupt */
#define IF_DSKSYN   0x1000      /* disk sync interrupt */
#define IF_RBF      0x0800	/* serial receive buffer full interrupt */
#define IF_AUD3     0x0400	/* audio channel 3 done interrupt */
#define IF_AUD2     0x0200	/* audio channel 2 done interrupt */
#define IF_AUD1     0x0100	/* audio channel 1 done interrupt */
#define IF_AUD0     0x0080	/* audio channel 0 done interrupt */
#define IF_BLIT     0x0040	/* blitter done interrupt */
#define IF_VERTB    0x0020	/* vertical blanking interrupt */
#define IF_COPER    0x0010      /* copper interrupt */
#define IF_PORTS    0x0008      /* external level 2 and CIA A interrupt */
#define IF_SOFT     0x0004      /* software initiated interrupt */
#define IF_DSKBLK   0x0002      /* diskblock DMA finished */
#define IF_TBE      0x0001      /* serial transmit buffer empty interrupt */

/*
** Structs
*/

struct ISR_mask                 /* interrupt bit mask */
    {
    short
        intreqr_mask;           /* mask for INTREQR */

    char
        ciaa_mask;              /* mask for CIAA ICR */

    char
        ciab_mask;              /* mask for CIAB ICR */

    short
        always;                 /* TRUE = always call this ISR */
    };

/* interrupt service routine function ptr type */
typedef int (*isrfunc) (struct ISR_mask *, ushort);

struct ISR_node                 /* ISR list members, one per function */
    {
    isrfunc isr;                /* interrupt service routine function ptr */

    signed char
        pri;                    /* ISR priority (127=high, -128=low, 0=def.) */

    struct ISR_mask
        mask;                   /* bit mask for desired interrupts */

    struct ISR_node
        *next;                  /* pointer to next ISR in list */
    };

 
/*
** Prototypes
*/

void
    set_PPL(int ppl);

int
    get_PPL(void);

void
    init_int_handler(void);

void
    illegal(void);

void
    dumpregs(void);

void
    install_inthandler(void);

void
    process_int(int irq, ushort sr);

int
    install_ISR(int irq, isrfunc isr, signed char pri, struct ISR_mask *mask);

int 
    get_ISR_pri(int irq, isrfunc isr, signed char *pri);

int 
    get_ISR_mask(int irq, isrfunc isr, struct ISR_mask *mask);

int 
    set_ISR_pri(int irq, isrfunc isr, signed char pri);

int 
    set_ISR_mask(int irq, isrfunc isr, struct ISR_mask *mask);

int
    remove_ISR(int irq, isrfunc isr);
 
#endif /* INTERRUPT_H */
