flycast/core/hw/sh4/sh4_interrupts.h

102 lines
2.0 KiB
C

#pragma once
#include "sh4_if.h"
enum InterruptID
{
//internal interrupts
//IRL*
//sh4_IRL_0 -> these are not connected on the Dreamcast
//sh4_IRL_1
//sh4_IRL_2
//sh4_IRL_3
//sh4_IRL_4
//sh4_IRL_5
//sh4_IRL_6
//sh4_IRL_7
//sh4_IRL_8
sh4_IRL_9 = 0,
//sh4_IRL_10 -> these are not connected on the Dreamcast
sh4_IRL_11 = 1,
//sh4_IRL_12 -> these are not connected on the Dreamcast
sh4_IRL_13 = 2,
//sh4_IRL_14 -> these are not connected on the Dreamcast
//sh4_IRL_15 -> no interrupt (masked)
sh4_HUDI_HUDI = 3, // H-UDI underflow
sh4_GPIO_GPIOI = 4,
//DMAC
sh4_DMAC_DMTE0 = 5,
sh4_DMAC_DMTE1 = 6,
sh4_DMAC_DMTE2 = 7,
sh4_DMAC_DMTE3 = 8,
sh4_DMAC_DMAE = 9,
//TMU
sh4_TMU0_TUNI0 = 10, // TMU0 underflow
sh4_TMU1_TUNI1 = 11, // TMU1 underflow
sh4_TMU2_TUNI2 = 12, // TMU2 underflow
sh4_TMU2_TICPI2 = 13, // TMU Compare (not used in the Dreamcast)
//RTC
sh4_RTC_ATI = 14,
sh4_RTC_PRI = 15,
sh4_RTC_CUI = 16,
//SCI
sh4_SCI1_ERI = 17,
sh4_SCI1_RXI = 18,
sh4_SCI1_TXI = 19,
sh4_SCI1_TEI = 20,
//SCIF
sh4_SCIF_ERI = 21,
sh4_SCIF_RXI = 22,
sh4_SCIF_BRI = 23,
sh4_SCIF_TXI = 24,
//WDT
sh4_WDT_ITI = 25,
//REF
sh4_REF_RCMI = 26,
sh4_REF_ROVI = 27,
sh4_INT_ID_COUNT
};
void SetInterruptPend(InterruptID intr);
void ResetInterruptPend(InterruptID intr);
inline static void InterruptPend(InterruptID intr, bool v)
{
if (!v)
ResetInterruptPend(intr);
else
SetInterruptPend(intr);
}
void SetInterruptMask(InterruptID intr);
void ResetInterruptMask(InterruptID intr);
inline static void InterruptMask(InterruptID intr, bool v)
{
if (!v)
ResetInterruptMask(intr);
else
SetInterruptMask(intr);
}
int UpdateINTC();
void Do_Exception(u32 epc, Sh4ExceptionCode expEvn);
bool SRdecode();
void SIIDRebuild();
//Init/Res/Term
void interrupts_init();
void interrupts_reset();
void interrupts_term();
void interrupts_serialize(Serializer& ser);
void interrupts_deserialize(Deserializer& deser);