summaryrefslogtreecommitdiff
path: root/include/irqmgr.h
blob: ea0442284e9ae0bbb3cfe90867efe33bb8105f10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef IRQMGR_H
#define IRQMGR_H

#include "ultra64.h"

#define IRQ_RETRACE_MSG 666
#define IRQ_PRENMI_MSG 669
#define IRQ_PRENMI450_MSG 671
#define IRQ_PRENMI480_MSG 672
#define IRQ_PRENMI500_MSG 673

typedef struct {
    /* 0x00 */ s16 type;
    /* 0x02 */ s8 data[30];
} IrqmgrMsg; //size = 0x20


typedef struct IrqmgrClient {
    /* 0x0 */ struct IrqmgrClient* next;
    /* 0x4 */ OSMesgQueue* msgQueue;
} IrqmgrClient; // size = 0x8

typedef struct {
    /* 0x000 */ IrqmgrMsg msgRetrace;
    /* 0x020 */ IrqmgrMsg msgPreNMI;
    /* 0x040 */ IrqmgrMsg msgDelayPreNMI;
    /* 0x060 */ OSMesgQueue _msgQueue;
    /* 0x078 */ OSMesg msgBuf[8];
    /* 0x098 */ OSThread thread;
    /* 0x248 */ IrqmgrClient* clients;
    /* 0x24C */ u8 prenmi;
    /* 0x250 */ OSTime prenmiTime;
    /* 0x258 */ OSTimer timer;
    /* 0x278 */ OSTime retraceTime;
} Irqmgr; // size = 0x280

void irqmgr_AddClient(IrqmgrClient* client, OSMesgQueue* msgQueue);
void irqmgr_RemoveClient(IrqmgrClient* client);
void irqmgr_SendMesgToClients(IrqmgrMsg* msg);
void irqmgr_JamMesgForClient(IrqmgrMsg* msg);
void irqmgr_HandlePreNMI(void);
void IrqMgr_CheckStacks(void);
void irqmgr_HandlePreNMI450(void);
void irqmgr_HandlePreNMI480(void);
void irqmgr_HandlePreNMI500(void);
void IrqMgr_HandleRetrace(void);
void irqmgr_Main(void* arg);
void CreateIRQManager(void* stack, OSPri priority, u8 retracecount);

extern vs32 ResetStatus;
extern volatile OSTime ResetTime;
extern volatile OSTime RetraceTime;
extern u32 RetraceCount;

#endif