/*
 * wnix, a Unix-like operating system for WebAssembly applications.
 * Copyright (C) 2025  Xavier Del Campo Romero
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef DRV_PS1_IRQ_H
#define DRV_PS1_IRQ_H

#include <stdint.h>

union drv_ps1_statmask
{
    struct
    {
        uint32_t vblank :1, gpu :1, cdrom :1, dma :1, tmr0 :1, tmr1 :1, tmr2 :1,
            controller :1, sio :1, spu :1, lightpen :1, :21;
    } bits;

    uint32_t mask;
};

#define I_BASE(x) (0x1f801070 + (x))
#define I_STAT ((volatile union drv_ps1_statmask *)I_BASE(0))
#define I_MASK ((volatile union drv_ps1_statmask *)I_BASE(4))

enum drv_ps1_irq
{
    IRQ_VBLANK,
    IRQ_GPU,
    IRQ_CDROM,
    IRQ_DMA,
    IRQ_TMR0,
    IRQ_TMR1,
    IRQ_TMR2,
    IRQ_JOYPAD_MEMCARD,
    IRQ_SIO,
    IRQ_SPU,
    IRQ_JOYPAD_IO
};

struct drv_ps1_irq_src
{
    int mask;
    int (*fn)(void);
    struct drv_ps1_irq_src *next;
};

int drv_ps1_irq_init(void);
int drv_ps1_irq_set(struct drv_ps1_irq_src *src);

#endif
