sched.c OK (#248)

* sched

* Minor fixes

* Format headers in the ultra64 folder, bitshifts in defines

* Fix PI_STATUS_ERROR

* Update variables
This commit is contained in:
Tharo
2021-08-07 12:43:11 -04:00
committed by GitHub
parent 1836844ea8
commit 1c544d2351
26 changed files with 1129 additions and 429 deletions
-88
View File
@@ -1,88 +0,0 @@
#ifndef _ULTRA64_HARDWARE_H_
#define _ULTRA64_HARDWARE_H_
#define AI_DRAM_ADDR_REG 0x04500000
#define AI_LEN_REG 0x04500004
#define AI_CONTROL_REG 0x04500008
#define AI_STATUS_REG 0x0450000C
#define AI_STATUS_AI_FULL (1 << 31)
#define AI_STATUS_AI_BUSY (1 << 30)
#define AI_DACRATE_REG 0x04500010
#define AI_BITRATE_REG 0x04500014
#define VI_STATUS_REG 0x04400000
#define VI_CONTROL_REG 0x04400000
#define VI_ORIGIN_REG 0x04400004
#define VI_DRAM_ADDR_REG 0x04400004
#define VI_WIDTH_REG 0x04400008
#define VI_H_WIDTH_REG 0x04400008
#define VI_INTR_REG 0x0440000C
#define VI_V_INTER_REG 0x0440000C
#define VI_CURRENT_REG 0x04400010
#define VI_V_CURRENT_LINE_REG 0x04400010
#define VI_BURST_REG 0x04400014
#define VI_TIMING_REG 0x04400014
#define VI_V_SYNC_REG 0x04400018 //VI vertical sync
#define VI_H_SYNC_REG 0x0440001C //VI horizontal sync
#define VI_LEAP_REG 0x04400020 //VI horizontal sync leap
#define VI_H_SYNC_LEAP_REG 0x04400020
#define VI_H_START_REG 0x04400024 //VI horizontal video
#define VI_H_VIDEO_REG 0x04400024
#define VI_V_START_REG 0x04400028 //VI vertical video
#define VI_V_VIDEO_REG 0x04400028
#define VI_V_BURST_REG 0x0440002C //VI vertical burst
#define VI_X_SCALE_REG 0x04400030 //VI x-scale
#define VI_Y_SCALE_REG 0x04400034 //VI y-scale
#define SP_IMEM_START 0x04001000
#define SP_DMEM_START 0x04000000
#define SP_MEM_ADDR_REG 0x04040000
#define SP_DRAM_ADDR_REG 0x04040004
#define SP_RD_LEN_REG 0x04040008
#define SP_WR_LEN_REG 0x0404000C
#define SP_STATUS_REG 0x04040010
#define SP_PC_REG 0x04080000
#define PI_DRAM_ADDR_REG 0x04600000 //PI DRAM address
#define PI_CART_ADDR_REG 0x04600004 //PI pbus (cartridge) address
#define PI_RD_LEN_REG 0x04600008 //PI read length
#define PI_WR_LEN_REG 0x0460000C //PI write length
#define PI_STATUS_REG 0x04600010 //PI status
#define PI_BSD_DOM1_LAT_REG 0x04600014 //PI dom1 latency
#define PI_DOMAIN1_REG 0x04600014
#define PI_BSD_DOM1_PWD_REG 0x04600018 //PI dom1 pulse width
#define PI_BSD_DOM1_PGS_REG 0x0460001C //PI dom1 page size
#define PI_BSD_DOM1_RLS_REG 0x04600020 //PI dom1 release
#define PI_BSD_DOM2_LAT_REG 0x04600024 //PI dom2 latency
#define PI_DOMAIN2_REG 0x04600024
#define PI_BSD_DOM2_PWD_REG 0x04600028 //PI dom2 pulse width
#define PI_BSD_DOM2_PGS_REG 0x0460002C //PI dom2 page size
#define PI_BSD_DOM2_RLS_REG 0x04600030 //PI dom2 release
#define PI_STATUS_BUSY 0x1
#define PI_STATUS_IOBUSY 0x2
#define PI_STATUS_ERROR 0x3
#define PI_STATUS_RESET_CONTROLLER 0x1
#define PI_STATUS_CLEAR_INTR 0x2
#define SI_DRAM_ADDR_REG 0x04800000
#define SI_PIF_ADDR_RD64B_REG 0x04800004
#define SI_PIF_ADDR_WR64B_REG 0x04800010
#define SI_STATUS_REG 0x04800018
#define SI_STATUS_DMA_BUSY 0x1
#define SI_STATUS_IO_READ_BUSY 0x2
#define SI_STATUS_DMA_ERROR 0x8
#define SI_STATUS_INTERRUPT (1 << 12)
#define PIF_RAM_START 0x1FC007C0
#define MI_INIT_MODE_REG 0x04300000
#define MI_MODE_REG MI_INIT_MODE_REG
#define MI_VERSION_REG 0x04300004
#define MI_INTR_REG 0x04300008
#define MI_INTR_MASK_REG 0x0430000C
#endif
-49
View File
@@ -1,49 +0,0 @@
#ifndef _SCHED_H_
#define _SCHED_H_
#include "os.h"
#include "sptask.h"
typedef struct {
/* 0x0 */ short type;
/* 0x2 */ unsigned char misc[30];
} OSScMsg;
typedef struct OSScTask_s {
/* 0x0 */ struct OSScTask_s* next;
/* 0x4 */ u32 state;
/* 0x8 */ u32 flags;
/* 0xC */ void* framebuffer;
/* 0x10 */ OSTask list;
/* 0x50 */ OSMesgQueue* msgQ;
/* 0x54 */ OSMesg msg;
} OSScTask;
typedef struct OSScClient_s {
/* 0x0 */ struct OSScClient_s* next;
/* 0x4 */ OSMesgQueue* msgQ;
} OSScClient;
typedef struct {
/* 0x0 */ OSScMsg retraceMsg;
/* 0x20 */ OSScMsg prenmiMsg;
/* 0x40 */ OSMesgQueue interruptQ;
/* 0x58 */ OSMesg intBuf[8];
/* 0x78 */ OSMesgQueue cmdQ;
/* 0x90 */ OSMesg cmdMsgBuf[8];
/* 0xB0 */ OSThread thread;
/* 0x260 */ OSScClient* clientList;
/* 0x264 */ OSScTask* audioListHead;
/* 0x268 */ OSScTask* gfxListHead;
/* 0x26C */ OSScTask* audioListTail;
/* 0x270 */ OSScTask* gfxListTail;
/* 0x274 */ OSScTask* curRSPTask;
/* 0x278 */ OSScTask* curRDPTask;
/* 0x27C */ u32 frameCount;
/* 0x280 */ s32 doAudio;
} OSSched;
#endif
+22 -24
View File
@@ -482,7 +482,7 @@ float __ull_to_f(unsigned long long l);
// void osVoiceCheckWord(void);
// void osVoiceControlGain(void);
// void osVoiceStartReadData(void);
// void osViGetCurrentFramebuffer(void);
void* osViGetCurrentFramebuffer(void);
s32 __osSpSetPc(u32 data);
// void __osVoiceContWrite4(void);
void __osGetHWIntrRoutine(s32 idx, OSMesgQueue** outQueue, OSMesg* outMsg);
@@ -3220,30 +3220,28 @@ void Padmgr_GetInput(Input* input, s32 param_2);
void Padmgr_GetInput2(Input* input, s32 param_2);
void Padmgr_ThreadEntry(PadMgr* padmgr);
void Padmgr_Start(OSMesgQueue* siEventCallbackQueue, IrqMgr* irqmgr, OSId threadId, OSPri threadPri, void* stack);
// void func_80176280(void);
// void func_80176314(void);
void Sched_Nop80176364(SchedContext* sched);
void func_80176370(SchedContext* sched);
void func_80176394(SchedContext* sched);
void func_801764F0(SchedContext* sched);
void func_8017668C(SchedContext* sched, UNK_PTR puParm2);
// void func_801766F0(void);
// void func_80176748(void);
// void func_801767B8(void);
// void func_801768E0(void);
// void func_8017691C(void);
// void func_80176988(void);
void func_80176B34(SchedContext* sched);
void func_80176C24(SchedContext* sched);
void func_80176CF4(SchedContext* sched);
void func_80176F2C(SchedContext* sched);
void Sched_SwapFramebuffer(CfbInfo* cfbInfo);
void Sched_RetraceUpdateFramebuffer(SchedContext* sched, CfbInfo* cfbInfo);
void Sched_HandleReset(SchedContext* sched);
void Sched_HandleStop(SchedContext* sched);
void Sched_HandleAudioCancel(SchedContext* sched);
void Sched_HandleGfxCancel(SchedContext* sched);
void Sched_QueueTask(SchedContext* sched, OSScTask* task);
void Sched_Yield(SchedContext* sched);
s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s32 state);
void Sched_TaskUpdateFramebuffer(SchedContext* sched, OSScTask* task);
void Sched_NotifyDone(SchedContext* sched, OSScTask* task);
void Sched_RunTask(SchedContext* sched, OSScTask* spTask, OSScTask* dpTask);
void Sched_HandleEntry(SchedContext* sched);
void Sched_HandleRetrace(SchedContext* sched);
void Sched_HandleRSPDone(SchedContext* sched);
void Sched_HandleRDPDone(SchedContext* sched);
void Sched_SendEntryMsg(SchedContext* sched);
void func_8017703C(SchedContext* sched);
void func_80177060(SchedContext* sched);
void func_80177084(SchedContext* sched);
void Sched_ThreadEntry(SchedContext* sched);
// void func_80177280(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE1 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12);
// void Sched_Start(SchedContext* sched, void* stack, OSPri pri, UNK_TYPE4 param_4, UNK_TYPE4 param_5, IrqMgr* irqmgrStruct);
void Sched_SendAudioCancelMsg(SchedContext* sched);
void Sched_SendGfxCancelMsg(SchedContext* sched);
void Sched_FaultClient(void* param1, void* param2);
void Sched_ThreadEntry(void* arg);
void Sched_Init(SchedContext* sched, void* stack, OSPri pri, UNK_TYPE arg3, UNK_TYPE arg4, IrqMgr* irqMgr);
// void func_80177390(void);
void func_801773A0(void* arg0);
void func_801773C4(void* arg0);
+2 -100
View File
@@ -1,114 +1,16 @@
#ifndef _OS_H_
#define _OS_H_
#include "PR/ultratypes.h"
typedef s32 OSPri;
typedef s32 OSId;
#include "ultra64/thread.h"
#include "ultra64/message.h"
#define OS_READ 0
#define OS_WRITE 1
typedef union {
/* 0x0 */ struct {
/* 0x0 */ f32 f_odd;
/* 0x4 */ f32 f_even;
} f;
/* 0x0 */ f64 d;
} __OSfp;
typedef struct {
/* 0x0 */ u64 at;
/* 0x8 */ u64 v0;
/* 0x10 */ u64 v1;
/* 0x18 */ u64 a0;
/* 0x20 */ u64 a1;
/* 0x28 */ u64 a2;
/* 0x30 */ u64 a3;
/* 0x38 */ u64 t0;
/* 0x40 */ u64 t1;
/* 0x48 */ u64 t2;
/* 0x50 */ u64 t3;
/* 0x58 */ u64 t4;
/* 0x60 */ u64 t5;
/* 0x68 */ u64 t6;
/* 0x70 */ u64 t7;
/* 0x78 */ u64 s0;
/* 0x80 */ u64 s1;
/* 0x88 */ u64 s2;
/* 0x90 */ u64 s3;
/* 0x98 */ u64 s4;
/* 0xA0 */ u64 s5;
/* 0xA8 */ u64 s6;
/* 0xB0 */ u64 s7;
/* 0xB8 */ u64 t8;
/* 0xC0 */ u64 t9;
/* 0xC8 */ u64 gp;
/* 0xD0 */ u64 sp;
/* 0xD8 */ u64 s8;
/* 0xE0 */ u64 ra;
/* 0xE8 */ u64 lo;
/* 0xF0 */ u64 hi;
/* 0xF8 */ u32 sr;
/* 0xFC */ u32 pc;
/* 0x100 */ u32 cause;
/* 0x104 */ u32 badvaddr;
/* 0x108 */ u32 rcp;
/* 0x10C */ u32 fpcsr;
/* 0x110 */ __OSfp fp0;
/* 0x118 */ __OSfp fp2;
/* 0x120 */ __OSfp fp4;
/* 0x128 */ __OSfp fp6;
/* 0x130 */ __OSfp fp8;
/* 0x138 */ __OSfp fp10;
/* 0x140 */ __OSfp fp12;
/* 0x148 */ __OSfp fp14;
/* 0x150 */ __OSfp fp16;
/* 0x158 */ __OSfp fp18;
/* 0x160 */ __OSfp fp20;
/* 0x168 */ __OSfp fp22;
/* 0x170 */ __OSfp fp24;
/* 0x178 */ __OSfp fp26;
/* 0x180 */ __OSfp fp28;
/* 0x188 */ __OSfp fp30;
} __OSThreadContext;
typedef struct OSThread_s {
/* 0x0 */ struct OSThread_s* next;
/* 0x4 */ OSPri priority;
/* 0x8 */ struct OSThread_s** queue;
/* 0xC */ struct OSThread_s* tlnext;
/* 0x10 */ u16 state;
/* 0x12 */ u16 flags;
/* 0x14 */ OSId id;
/* 0x18 */ int fp;
/* 0x20 */ __OSThreadContext context;
} OSThread;
typedef u32 OSEvent;
typedef u32 OSIntMask;
typedef u32 OSPageMask;
#define OS_MESG_NOBLOCK 0
#define OS_MESG_BLOCK 1
typedef void* OSMesg;
typedef struct {
/* 0x00 */ OSThread* mtqueue;
/* 0x04 */ OSThread* fullqueue;
/* 0x08 */ s32 validCount;
/* 0x0C */ s32 first;
/* 0x10 */ s32 msgCount;
/* 0x14 */ OSMesg* msg;
} OSMesgQueue; // size = 0x20
typedef struct {
/* 0x00 */ u32 errStatus;
/* 0x04 */ void* dramAddr;
-1
View File
@@ -8,7 +8,6 @@
#include "os_internal.h"
#include "ultraerror.h"
#include "ultralog.h"
#include "sptask.h"
typedef struct {
/* 0x0 */ OSMesgQueue* messageQueue;
-35
View File
@@ -1,35 +0,0 @@
#ifndef _SPTASK_H_
#define _SPTASK_H_
#include "PR/ultratypes.h"
#define OS_YIELD_DATA_SIZE 0xC00
typedef struct {
/* 0x0 */ u32 type;
/* 0x4 */ u32 flags;
/* 0x8 */ u64* ucode_boot;
/* 0xC */ u32 ucode_boot_size;
/* 0x10 */ u64* ucode;
/* 0x14 */ u32 ucode_size;
/* 0x18 */ u64* ucode_data;
/* 0x1C */ u32 ucode_data_size;
/* 0x20 */ u64* dram_stack;
/* 0x24 */ u32 dram_stack_size;
/* 0x28 */ u64* output_buff;
/* 0x2C */ u64* output_buff_size;
/* 0x30 */ u64* data_ptr;
/* 0x34 */ u32 data_size;
/* 0x38 */ u64* yield_data_ptr;
/* 0x3C */ u32 yield_data_size;
} OSTask_t;
typedef union {
/* 0x0 */ OSTask_t t;
/* 0x0 */ long long force_structure_alignment;
} OSTask;
typedef u32 OSYieldResult;
#endif
+6
View File
@@ -6,4 +6,10 @@
#include "unk.h"
#include "ultra64/hardware.h"
#include "ultra64/message.h"
#include "ultra64/sptask.h"
#include "ultra64/thread.h"
#include "ultra64/rsp.h"
#endif
+106
View File
@@ -0,0 +1,106 @@
#ifndef _ULTRA64_HARDWARE_H_
#define _ULTRA64_HARDWARE_H_
#define HW_REG(reg, type) *(volatile type*)((reg) | 0xa0000000)
#define AI_DRAM_ADDR_REG 0x04500000
#define AI_LEN_REG 0x04500004
#define AI_CONTROL_REG 0x04500008
#define AI_STATUS_REG 0x0450000C
#define AI_DACRATE_REG 0x04500010
#define AI_BITRATE_REG 0x04500014
#define AI_STATUS_AI_BUSY (1 << 30)
#define AI_STATUS_AI_FULL (1 << 31)
#define VI_STATUS_REG 0x04400000
#define VI_CONTROL_REG 0x04400000
#define VI_ORIGIN_REG 0x04400004
#define VI_DRAM_ADDR_REG 0x04400004
#define VI_WIDTH_REG 0x04400008
#define VI_H_WIDTH_REG 0x04400008
#define VI_INTR_REG 0x0440000C
#define VI_V_INTER_REG 0x0440000C
#define VI_CURRENT_REG 0x04400010
#define VI_V_CURRENT_LINE_REG 0x04400010
#define VI_BURST_REG 0x04400014
#define VI_TIMING_REG 0x04400014
#define VI_V_SYNC_REG 0x04400018 //VI vertical sync
#define VI_H_SYNC_REG 0x0440001C //VI horizontal sync
#define VI_LEAP_REG 0x04400020 //VI horizontal sync leap
#define VI_H_SYNC_LEAP_REG 0x04400020
#define VI_H_START_REG 0x04400024 //VI horizontal video
#define VI_H_VIDEO_REG 0x04400024
#define VI_V_START_REG 0x04400028 //VI vertical video
#define VI_V_VIDEO_REG 0x04400028
#define VI_V_BURST_REG 0x0440002C //VI vertical burst
#define VI_X_SCALE_REG 0x04400030 //VI x-scale
#define VI_Y_SCALE_REG 0x04400034 //VI y-scale
#define SP_IMEM_START 0x04001000
#define SP_IMEM_SIZE 0x1000
#define SP_DMEM_START 0x04000000
#define SP_DMEM_SIZE 0x1000
#define SP_MEM_ADDR_REG 0x04040000
#define SP_DRAM_ADDR_REG 0x04040004
#define SP_RD_LEN_REG 0x04040008
#define SP_WR_LEN_REG 0x0404000C
#define SP_STATUS_REG 0x04040010
#define SP_DMA_FULL_REG 0x04040014
#define SP_DMA_BUSY_REG 0x04040018
#define SP_PC_REG 0x04080000
#define PI_DRAM_ADDR_REG 0x04600000 //PI DRAM address
#define PI_CART_ADDR_REG 0x04600004 //PI pbus (cartridge) address
#define PI_RD_LEN_REG 0x04600008 //PI read length
#define PI_WR_LEN_REG 0x0460000C //PI write length
#define PI_STATUS_REG 0x04600010 //PI status
#define PI_BSD_DOM1_LAT_REG 0x04600014 //PI dom1 latency
#define PI_DOMAIN1_REG 0x04600014
#define PI_BSD_DOM1_PWD_REG 0x04600018 //PI dom1 pulse width
#define PI_BSD_DOM1_PGS_REG 0x0460001C //PI dom1 page size
#define PI_BSD_DOM1_RLS_REG 0x04600020 //PI dom1 release
#define PI_BSD_DOM2_LAT_REG 0x04600024 //PI dom2 latency
#define PI_DOMAIN2_REG 0x04600024
#define PI_BSD_DOM2_PWD_REG 0x04600028 //PI dom2 pulse width
#define PI_BSD_DOM2_PGS_REG 0x0460002C //PI dom2 page size
#define PI_BSD_DOM2_RLS_REG 0x04600030 //PI dom2 release
#define PI_STATUS_BUSY (1 << 0)
#define PI_STATUS_IOBUSY (1 << 1)
#define PI_STATUS_ERROR (PI_STATUS_BUSY | PI_STATUS_IOBUSY)
#define PI_STATUS_RESET_CONTROLLER (1 << 0)
#define PI_STATUS_CLEAR_INTR (1 << 1)
#define SI_DRAM_ADDR_REG 0x04800000
#define SI_PIF_ADDR_RD64B_REG 0x04800004
#define SI_PIF_ADDR_WR64B_REG 0x04800010
#define SI_STATUS_REG 0x04800018
#define SI_STATUS_DMA_BUSY (1 << 0)
#define SI_STATUS_IO_READ_BUSY (1 << 1)
#define SI_STATUS_DMA_ERROR (1 << 3)
#define SI_STATUS_INTERRUPT (1 << 12)
#define PIF_RAM_START 0x1FC007C0
#define MI_INIT_MODE_REG 0x04300000
#define MI_MODE_REG MI_INIT_MODE_REG
#define MI_VERSION_REG 0x04300004
#define MI_INTR_REG 0x04300008
#define MI_INTR_MASK_REG 0x0430000C
/* Interrupt pending bits */
#define CAUSE_IP8 0x00008000 /* External level 8 pending - COMPARE */
#define CAUSE_IP7 0x00004000 /* External level 7 pending - INT4 */
#define CAUSE_IP6 0x00002000 /* External level 6 pending - INT3 */
#define CAUSE_IP5 0x00001000 /* External level 5 pending - INT2 */
#define CAUSE_IP4 0x00000800 /* External level 4 pending - INT1 */
#define CAUSE_IP3 0x00000400 /* External level 3 pending - INT0 */
#define CAUSE_SW2 0x00000200 /* Software level 2 pending */
#define CAUSE_SW1 0x00000100 /* Software level 1 pending */
#endif
+53
View File
@@ -0,0 +1,53 @@
#ifndef _ULTRA64_MESSAGE_H_
#define _ULTRA64_MESSAGE_H_
#include "ultra64/thread.h"
#define OS_NUM_EVENTS 15
#define OS_EVENT_SW1 0 /* CPU SW1 interrupt */
#define OS_EVENT_SW2 1 /* CPU SW2 interrupt */
#define OS_EVENT_CART 2 /* Cartridge interrupt: used by rmon */
#define OS_EVENT_COUNTER 3 /* Counter int: used by VI/Timer Mgr */
#define OS_EVENT_SP 4 /* SP task done interrupt */
#define OS_EVENT_SI 5 /* SI (controller) interrupt */
#define OS_EVENT_AI 6 /* AI interrupt */
#define OS_EVENT_VI 7 /* VI interrupt: used by VI/Timer Mgr */
#define OS_EVENT_PI 8 /* PI interrupt: used by PI Manager */
#define OS_EVENT_DP 9 /* DP full sync interrupt */
#define OS_EVENT_CPU_BREAK 10 /* CPU breakpoint: used by rmon */
#define OS_EVENT_SP_BREAK 11 /* SP breakpoint: used by rmon */
#define OS_EVENT_FAULT 12 /* CPU fault event: used by rmon */
#define OS_EVENT_THREADSTATUS 13 /* CPU thread status: used by rmon */
#define OS_EVENT_PRENMI 14 /* Pre NMI interrupt */
#define OS_EVENT_RDB_READ_DONE 15 /* RDB read ok event: used by rmon */
#define OS_EVENT_RDB_LOG_DONE 16 /* read of log data complete */
#define OS_EVENT_RDB_DATA_DONE 17 /* read of host io data complete */
#define OS_EVENT_RDB_REQ_RAMROM 18 /* host needs ramrom access */
#define OS_EVENT_RDB_FREE_RAMROM 19 /* host is done with ramrom access */
#define OS_EVENT_RDB_DBG_DONE 20
#define OS_EVENT_RDB_FLUSH_PROF 21
#define OS_EVENT_RDB_ACK_PROF 22
typedef void* OSMesg;
typedef u32 OSEvent;
#define OS_MESG_NOBLOCK 0
#define OS_MESG_BLOCK 1
typedef struct OSMesgQueue {
/* 0x00 */ OSThread* mtQueue;
/* 0x04 */ OSThread* fullQueue;
/* 0x08 */ s32 validCount;
/* 0x0C */ s32 first;
/* 0x10 */ s32 msgCount;
/* 0x14 */ OSMesg* msg;
} OSMesgQueue; // size = 0x18
#define MQ_COUNT(mq) ((mq)->validCount)
#define MQ_IS_EMPTY(mq) (MQ_COUNT(mq) == 0)
#define MQ_IS_FULL(mq) (MQ_COUNT(mq) >= (mq)->msgCount)
#endif
+47
View File
@@ -0,0 +1,47 @@
#ifndef _ULTRA64_RSP_H_
#define _ULTRA64_RSP_H_
/* SP Status Flags */
#define SP_STATUS_HALT (1 << 0)
#define SP_STATUS_BROKE (1 << 1)
#define SP_STATUS_DMA_BUSY (1 << 2)
#define SP_STATUS_DMA_FULL (1 << 3)
#define SP_STATUS_IO_FULL (1 << 4)
#define SP_STATUS_SSTEP (1 << 5)
#define SP_STATUS_INTR_BREAK (1 << 6)
#define SP_STATUS_YIELD (1 << 7) // SIG0
#define SP_STATUS_YIELDED (1 << 8) // SIG1
#define SP_STATUS_TASKDONE (1 << 9) // SIG2
#define SP_STATUS_SIG3 (1 << 10)
#define SP_STATUS_SIG4 (1 << 11)
#define SP_STATUS_SIG5 (1 << 12)
#define SP_STATUS_SIG6 (1 << 13)
#define SP_STATUS_SIG7 (1 << 14)
#define SP_CLR_HALT (1 << 0)
#define SP_SET_HALT (1 << 1)
#define SP_CLR_BROKE (1 << 2)
#define SP_CLR_INTR (1 << 3)
#define SP_SET_INTR (1 << 4)
#define SP_CLR_SSTEP (1 << 5)
#define SP_SET_SSTEP (1 << 6)
#define SP_CLR_INTR_BREAK (1 << 7)
#define SP_SET_INTR_BREAK (1 << 8)
#define SP_CLR_SIG0 (1 << 9)
#define SP_SET_SIG0 (1 << 10)
#define SP_CLR_SIG1 (1 << 11)
#define SP_SET_SIG1 (1 << 12)
#define SP_CLR_SIG2 (1 << 13)
#define SP_SET_SIG2 (1 << 14)
#define SP_CLR_SIG3 (1 << 15)
#define SP_SET_SIG3 (1 << 16)
#define SP_CLR_SIG4 (1 << 17)
#define SP_SET_SIG4 (1 << 18)
#define SP_CLR_SIG5 (1 << 19)
#define SP_SET_SIG5 (1 << 20)
#define SP_CLR_SIG6 (1 << 21)
#define SP_SET_SIG6 (1 << 22)
#define SP_CLR_SIG7 (1 << 23)
#define SP_SET_SIG7 (1 << 24)
#endif
+112
View File
@@ -0,0 +1,112 @@
#ifndef _SPTASK_H_
#define _SPTASK_H_
#include "PR/ultratypes.h"
/* Task Types */
#define M_NULTASK 0
#define M_GFXTASK 1
#define M_AUDTASK 2
#define M_VIDTASK 3
#define M_NJPEGTASK 4
#define M_HVQTASK 6
#define M_HVQMTASK 7
/* Task Flags */
#define M_TASK_FLAG0 (1 << 0)
#define M_TASK_FLAG1 (1 << 1)
/* Task Flag Fields */
#define OS_TASK_YIELDED (1 << 0)
#define OS_TASK_DP_WAIT (1 << 1)
#define OS_TASK_LOADABLE (1 << 2)
#define OS_TASK_SP_ONLY (1 << 3)
#define OS_TASK_USR0 (1 << 4)
#define OS_TASK_USR1 (1 << 5)
#define OS_TASK_USR2 (1 << 6)
#define OS_TASK_USR3 (1 << 7)
#define OS_YIELD_DATA_SIZE 0xC00
#define OS_YIELD_AUDIO_SIZE 0x400
/* SpStatus */
/* Write */
#define SPSTATUS_CLEAR_HALT (1 << 0)
#define SPSTATUS_SET_HALT (1 << 1)
#define SPSTATUS_CLEAR_BROKE (1 << 2)
#define SPSTATUS_CLEAR_INTR (1 << 3)
#define SPSTATUS_SET_INTR (1 << 4)
#define SPSTATUS_CLEAR_SSTEP (1 << 5)
#define SPSTATUS_SET_SSTEP (1 << 6)
#define SPSTATUS_CLEAR_INTR_ON_BREAK (1 << 7)
#define SPSTATUS_SET_INTR_ON_BREAK (1 << 8)
#define SPSTATUS_CLEAR_SIGNAL0 (1 << 9)
#define SPSTATUS_SET_SIGNAL0 (1 << 10)
#define SPSTATUS_CLEAR_SIGNAL1 (1 << 11)
#define SPSTATUS_SET_SIGNAL1 (1 << 12)
#define SPSTATUS_CLEAR_SIGNAL2 (1 << 13)
#define SPSTATUS_SET_SIGNAL2 (1 << 14)
#define SPSTATUS_CLEAR_SIGNAL3 (1 << 15)
#define SPSTATUS_SET_SIGNAL3 (1 << 16)
#define SPSTATUS_CLEAR_SIGNAL4 (1 << 17)
#define SPSTATUS_SET_SIGNAL4 (1 << 18)
#define SPSTATUS_CLEAR_SIGNAL5 (1 << 19)
#define SPSTATUS_SET_SIGNAL5 (1 << 20)
#define SPSTATUS_CLEAR_SIGNAL6 (1 << 21)
#define SPSTATUS_SET_SIGNAL6 (1 << 23)
#define SPSTATUS_CLEAR_SIGNAL7 (1 << 24)
#define SPSTATUS_SET_SIGNAL7 (1 << 25)
/* Read */
#define SPSTATUS_HALT (1 << 0)
#define SPSTATUS_BROKE (1 << 1)
#define SPSTATUS_DMA_BUSY (1 << 2)
#define SPSTATUS_DMA_FULL (1 << 3)
#define SPSTATUS_IO_FULL (1 << 4)
#define SPSTATUS_SINGLE_STEP (1 << 5)
#define SPSTATUS_INTERRUPT_ON_BREAK (1 << 6)
#define SPSTATUS_SIGNAL0_SET (1 << 7)
#define SPSTATUS_SIGNAL1_SET (1 << 8)
#define SPSTATUS_SIGNAL2_SET (1 << 9)
#define SPSTATUS_SIGNAL3_SET (1 << 10)
#define SPSTATUS_SIGNAL4_SET (1 << 11)
#define SPSTATUS_SIGNAL5_SET (1 << 12)
#define SPSTATUS_SIGNAL6_SET (1 << 13)
#define SPSTATUS_SIGNAL7_SET (1 << 14)
typedef struct {
/* 0x00 */ u32 type;
/* 0x04 */ u32 flags;
/* 0x08 */ u64* ucode_boot;
/* 0x0C */ u32 ucode_boot_size;
/* 0x10 */ u64* ucode;
/* 0x14 */ u32 ucode_size;
/* 0x18 */ u64* ucode_data;
/* 0x1C */ u32 ucode_data_size;
/* 0x20 */ u64* dram_stack;
/* 0x24 */ u32 dram_stack_size;
/* 0x28 */ u64* output_buff;
/* 0x2C */ u64* output_buff_size;
/* 0x30 */ u64* data_ptr;
/* 0x34 */ u32 data_size;
/* 0x38 */ u64* yield_data_ptr;
/* 0x3C */ u32 yield_data_size;
} OSTask_t; // size = 0x40
typedef union
{
OSTask_t t;
long long int force_structure_alignment;
} OSTask;
typedef u32 OSYieldResult;
#endif
+69
View File
@@ -0,0 +1,69 @@
#ifndef _ULTRA64_THREAD_H_
#define _ULTRA64_THREAD_H_
#include "PR/ultratypes.h"
#define OS_PRIORITY_IDLE 10
#define OS_PRIORITY_MAIN 10
#define OS_PRIORITY_GRAPH 11
#define OS_PRIORITY_AUDIOMGR 12
#define OS_PRIORITY_PADMGR 14
#define OS_PRIORITY_SCHED 15
#define OS_PRIORITY_DMAMGR 16
#define OS_PRIORITY_IRQMGR 17
#define OS_PRIORITY_PIMGR 150
#define OS_PRIORITY_FAULTCLIENT 126
#define OS_PRIORITY_FAULT 127
#define OS_PRIORITY_APPMAX 127
#define OS_PRIORITY_RMONSPIN 200
#define OS_PRIORITY_RMON 250
#define OS_PRIORITY_VIMGR 254
#define OS_PRIORITY_MAX 255
#define OS_STATE_STOPPED (1 << 0)
#define OS_STATE_RUNNABLE (1 << 1)
#define OS_STATE_RUNNING (1 << 2)
#define OS_STATE_WAITING (1 << 3)
typedef s32 OSPri;
typedef s32 OSId;
typedef union {
struct {
/* 0x00 */ f32 f_odd;
/* 0x04 */ f32 f_even;
} f;
} __OSfp; // size = 0x08
typedef struct {
/* 0x000 */ u64 at, v0, v1, a0, a1, a2, a3;
/* 0x038 */ u64 t0, t1, t2, t3, t4, t5, t6, t7;
/* 0x078 */ u64 s0, s1, s2, s3, s4, s5, s6, s7;
/* 0x0B8 */ u64 t8, t9, gp, sp, s8, ra;
/* 0x0E8 */ u64 lo, hi;
/* 0x0F8 */ u32 sr, pc, cause, badvaddr, rcp;
/* 0x10C */ u32 fpcsr;
/* 0x110 */ __OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14;
/* 0x150 */ __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30;
} __OSThreadContext; // size = 0x190
typedef struct {
/* 0x00 */ u32 flag;
/* 0x04 */ u32 count;
/* 0x08 */ u64 time;
} __OSThreadprofile; // size = 0x10
typedef struct OSThread {
/*0x00*/ struct OSThread* next;
/*0x04*/ OSPri priority;
/*0x08*/ struct OSThread** queue;
/*0x0C*/ struct OSThread* tlnext;
/*0x10*/ u16 state;
/*0x12*/ u16 flags;
/*0x14*/ OSId id;
/*0x18*/ s32 fp;
/*0x1C*/ __OSThreadprofile* thprof;
/*0x20*/ __OSThreadContext context;
} OSThread; // size = 0x1B0
#endif
+12 -18
View File
@@ -3455,28 +3455,22 @@ extern StackEntry audioStackEntry;
extern StackEntry padmgrStackEntry;
extern AudioMgr audioContext;
extern PadMgr D_801FB620;
// extern UNK_TYPE1 D_801FBAA0;
// extern UNK_TYPE1 D_801FBAB0;
// extern UNK_TYPE1 D_801FBAB4;
// extern UNK_TYPE1 D_801FBAB8;
// extern UNK_TYPE1 D_801FBABC;
// extern UNK_TYPE1 D_801FBAC0;
// extern UNK_TYPE1 D_801FBAC4;
// extern UNK_TYPE1 D_801FBAC8;
// extern UNK_TYPE1 D_801FBACC;
// extern UNK_TYPE1 D_801FBAD0;
// extern UNK_TYPE1 D_801FBAD4;
extern FaultClient sSchedFaultClient;
extern OSTime sRSPGFXStartTime;
extern OSTime sRSPAudioStartTime;
extern OSTime sRSPOtherStartTime;
extern OSTime sRDPStartTime;
extern u64* gAudioSPDataPtr;
extern u32 gAudioSPDataSize;
// extern UNK_TYPE1 D_801FBAE0;
// extern UNK_TYPE1 D_801FBAE8;
extern volatile OSTime D_801FBAF0;
extern volatile OSTime lastRenderFrameDuration;
// extern UNK_TYPE1 D_801FBB00;
// extern UNK_TYPE1 D_801FBB04;
// extern UNK_TYPE1 D_801FBB08;
// extern UNK_TYPE1 D_801FBB0C;
// extern UNK_TYPE1 D_801FBB10;
// extern UNK_TYPE1 D_801FBB14;
// extern UNK_TYPE1 D_801FBB20;
extern volatile OSTime gRSPAudioTotalTime;
extern volatile OSTime sRSPGFXTotalTime;
extern volatile OSTime sRSPOtherTotalTime;
// extern UNK_TYPE1 D_801FBB18;
extern volatile OSTime gRDPTotalTime;
// extern UNK_TYPE1 D_801FBB28;
extern OSViMode D_801FBB30;
extern u32* gFramebuffers[2];
+53 -19
View File
@@ -7,7 +7,6 @@
#include "PR/ultratypes.h"
#include "PR/gbi.h"
#include "PR/sched.h"
#include "io/controller.h"
#include "osint.h"
#include "viint.h"
@@ -46,6 +45,7 @@
#define Z_THREAD_ID_IDLE 1
#define Z_THREAD_ID_SLOWLY 2
#define Z_THREAD_ID_MAIN 3
#define Z_THREAD_ID_SCHED 5
#define Z_THREAD_ID_DMAMGR 18
#define Z_THREAD_ID_IRQMGR 19
@@ -267,6 +267,19 @@ typedef struct {
/* 0x20308 */ u16 tailMagic; // 5678
} GfxPool; // size = 0x20310
typedef struct {
/* 0x00 */ u16* fb1;
/* 0x04 */ u16* swapBuffer;
/* 0x08 */ OSViMode* viMode;
/* 0x0C */ u32 features;
/* 0x10 */ u8 unk_10;
/* 0x11 */ s8 updateRate;
/* 0x12 */ s8 updateRate2;
/* 0x13 */ u8 unk_13;
/* 0x14 */ f32 xScale;
/* 0x18 */ f32 yScale;
} CfbInfo; // size = 0x1C
typedef struct GraphicsContext {
/* 0x000 */ Gfx* polyOpaBuffer;
/* 0x004 */ Gfx* polyXluBuffer;
@@ -1234,6 +1247,11 @@ typedef struct IrqMgrClient_t {
/* 0x4 */ OSMesgQueue* queue;
} IrqMgrClient; // size = 0x8
typedef struct {
/* 0x0 */ s16 type;
/* 0x2 */ u8 misc[30];
} OSScMsg;
typedef struct {
/* 0x000 */ OSScMsg verticalRetraceMesg;
/* 0x020 */ OSScMsg prenmiMsg;
@@ -1281,25 +1299,41 @@ typedef struct {
#define OS_SC_RCP_MASK 0x0003
#define OS_SC_TYPE_MASK 0x0007
#define OS_SC_DP 0x0001
#define OS_SC_SP 0x0002
#define OS_SC_YIELD 0x0010
#define OS_SC_YIELDED 0x0020
typedef struct OSScTask {
/* 0x00 */ struct OSScTask* next;
/* 0x04 */ u32 state;
/* 0x08 */ u32 flags;
/* 0x0C */ CfbInfo* framebuffer;
/* 0x10 */ OSTask list;
/* 0x50 */ OSMesgQueue* msgQ;
/* 0x54 */ OSMesg msg;
} OSScTask; // size = 0x58
typedef struct {
/* 0x000 */ OSMesgQueue interruptQ;
/* 0x018 */ OSMesg intMsgBuf[64];
/* 0x118 */ OSMesgQueue cmdQ;
/* 0x130 */ OSMesg cmdMsgBuf[8];
/* 0x150 */ OSThread thread;
/* 0x300 */ UNK_TYPE4 unk300;
/* 0x304 */ UNK_TYPE4 unk304;
/* 0x308 */ UNK_TYPE4 unk308;
/* 0x30C */ UNK_TYPE4 unk30C;
/* 0x310 */ UNK_TYPE4 unk310;
/* 0x314 */ UNK_TYPE4 unk314;
/* 0x318 */ s32 unk318;
/* 0x31C */ UNK_TYPE1 pad31C[0x4];
/* 0x320 */ UNK_TYPE4 unk320;
/* 0x324 */ UNK_TYPE4 unk324;
/* 0x328 */ UNK_TYPE1 pad328[0x7];
/* 0x32F */ s8 unk32F;
/* 0x330 */ IrqMgrClient irqClient;
/* 0x0000 */ OSMesgQueue interruptQ;
/* 0x0018 */ OSMesg intBuf[64];
/* 0x0118 */ OSMesgQueue cmdQ;
/* 0x0130 */ OSMesg cmdMsgBuf[8];
/* 0x0150 */ OSThread thread;
/* 0x0300 */ OSScTask* audioListHead;
/* 0x0304 */ OSScTask* gfxListHead;
/* 0x0308 */ OSScTask* audioListTail;
/* 0x030C */ OSScTask* gfxListTail;
/* 0x0310 */ OSScTask* curRSPTask;
/* 0x0314 */ OSScTask* curRDPTask;
/* 0x0318 */ s32 retraceCount;
/* 0x0318 */ s32 doAudio;
/* 0x0320 */ CfbInfo* curBuf;
/* 0x0324 */ CfbInfo* pendingSwapBuf1;
/* 0x0328 */ CfbInfo* pendingSwapBuf2;
/* 0x032C */ char unk_32C[0x3];
/* 0x032F */ u8 shouldUpdateVi;
/* 0x0330 */ IrqMgrClient irqClient;
} SchedContext; // size = 0x338
typedef struct StackEntry_t {
-1
View File
@@ -634,7 +634,6 @@ beginseg
include "build/src/code/padmgr.o"
include "build/data/code/padmgr.data.o"
include "build/src/code/sched.o"
include "build/data/code/sched.bss.o"
include "build/src/code/speed_meter.o"
include "build/data/code/speed_meter.data.o"
include "build/data/code/speed_meter.bss.o"
+4 -1
View File
@@ -712,7 +712,10 @@ void Fault_ProcessClients(void) {
if (iter->callback) {
Fault_FillScreenBlack();
FaultDrawer_SetCharPad(-2, 0);
FaultDrawer_Printf("8CallBack (%d) %08x %08x %08x\n7", idx++, iter, iter->param0, iter->param1);
FaultDrawer_Printf("\x1A\x38"
"CallBack (%d) %08x %08x %08x\n"
"\x1A\x37",
idx++, iter, iter->param0, iter->param1);
FaultDrawer_SetCharPad(0, 0);
iter->callback(iter->param0, iter->param1);
Fault_WaitForInput();
+1 -1
View File
@@ -51,7 +51,7 @@ void AudioMgr_HandleRetrace(AudioMgr* audioMgr) {
osSyncPrintf("AUDIO SP TIMEOUT %08x %08x\n", audioMgr->rspTask, audioMgr->rspTask->task);
if (retryCount >= 0) {
retryCount--;
func_8017703C(audioMgr->sched);
Sched_SendAudioCancelMsg(audioMgr->sched);
} else {
osSyncPrintf("audioMgr.c:もうダメ!死ぬ!\n");
osDestroyThread(NULL);
+578 -23
View File
File diff suppressed because it is too large Load Diff
-1
View File
@@ -1,5 +1,4 @@
#include "global.h"
#include "PR/hardware.h"
s32 __osEPiRawWriteIo(OSPiHandle* handle, u32 devAddr, u32 data) {
s32 status;
+2 -2
View File
@@ -1,8 +1,8 @@
#include "global.h"
void osCreateMesgQueue(OSMesgQueue* mq, OSMesg* msq, s32 count) {
mq->mtqueue = (OSThread*)&__osThreadTail;
mq->fullqueue = (OSThread*)&__osThreadTail;
mq->mtQueue = (OSThread*)&__osThreadTail;
mq->fullQueue = (OSThread*)&__osThreadTail;
mq->validCount = 0;
mq->first = 0;
mq->msgCount = count;

Some files were not shown because too many files have changed in this diff Show More