match CIC6105.c

This commit is contained in:
Anghelo Carvajal 2025-08-20 16:14:27 -04:00
parent 18a8a1bea7
commit 2685495648
6 changed files with 110 additions and 9 deletions

View File

@ -3,6 +3,8 @@
#include "ultra64.h"
#include "versions.h"
// IPL3 puts values in those addresses as part of the anti-piracy checks
#define CIC_ADDRESS_1 0x002FB1F4
#define CIC_ADDRESS_2 0x002FE1C0
@ -15,6 +17,10 @@ void CIC6105_AddRomInfoFaultPage(void);
void CIC6105_Destroy(void);
void CIC6105_Init(void);
#if MM_VERSION <= N64_JP_1_1
void func_80081980_unknown(void);
#endif
extern s32 gCICAddr1Val;
extern s32 gCICAddr2Val;

View File

@ -80,6 +80,7 @@
#define M_AUDTASK 2
#define M_VIDTASK 3
#define M_NJPEGTASK 4
#define M_CICTASK 4
#define M_HVQTASK 6
#define M_HVQMTASK 7

View File

@ -2,23 +2,61 @@
#include "build.h"
#include "fault.h"
#include "macros.h"
#include "regs.h"
#include "scheduler.h"
#pragma increment_block_number "n64-us:200"
s32 gCICAddr1Val;
s32 gCICAddr2Val;
FaultClient sRomInfoFaultClient;
#if MM_VERSION <= N64_JP_1_1
s32 gCICValue1;
s32 gCICValue2;
s32 func_80081A54_unknown(void);
#endif
void CIC6105_Noop1(void) {
#if MM_VERSION < N64_US
SREG(20) = 1;
#endif
}
void CIC6105_Noop2(void) {
#if MM_VERSION < N64_US
SREG(20) = 0;
#endif
}
void CIC6105_PrintRomInfo(void) {
#if MM_VERSION >= N64_US
FaultDrawer_DrawText(80, 200, "SP_STATUS %08x", IO_READ(SP_STATUS_REG));
FaultDrawer_DrawText(40, 184, "ROM_F [Creator:%s]", gBuildCreator);
FaultDrawer_DrawText(56, 192, "[Date:%s]", gBuildDate);
#else
u32 status = IO_READ(SP_STATUS_REG);
FaultDrawer_SetCursor(0x30, 0xC8);
if (status & SP_STATUS_SIG7) {
FaultDrawer_Printf("OCARINA %08x %08x", gCICValue1, gCICValue2);
} else {
FaultDrawer_Printf("LEGEND %08x %08x", gCICValue1, gCICValue2);
}
FaultDrawer_SetCursor(0x28, 0xB8);
FaultDrawer_Printf("ROM_F");
FaultDrawer_Printf(" [Creator:%s]", gBuildCreator);
FaultDrawer_SetCursor(0x38, 0xC0);
FaultDrawer_Printf("[Date:%s]", gBuildDate);
FaultDrawer_SetCursor(0x60, 0x20);
FaultDrawer_Printf("I LOVE YOU %08x", func_80081A54_unknown());
{
// TODO: where to put this?
static const char unused[] = "flag:%08x data:%08x\n";
}
#endif
}
void CIC6105_AddRomInfoFaultPage(void) {
@ -29,6 +67,60 @@ void CIC6105_Destroy(void) {
Fault_RemoveClient(&sRomInfoFaultClient);
}
extern Scheduler B_801F85E0_unknown;
extern OSMesgQueue B_801F86F8_unknown;
#if MM_VERSION <= N64_JP_1_1
extern u64 cic6105TextStart[];
void func_80081980_unknown(void) {
// TODO: do something with the hardcoded sizes
static OSTask D_80097AA0_unknown = {
M_CICTASK, // type
0, // flags
rspbootTextStart, // ucode_boot
0x000003E8, // ucode_boot_size
cic6105TextStart, // ucode
0x00000020, // ucode_size
(u64*)gBuildCreator, // ucode_data
0x00000008, // ucode_data_size
NULL, // dram_stack
0x00000000, // dram_stack_size
NULL, // output_buff
NULL, // output_buff_size
NULL, // data_ptr
0x00000000, // data_size
NULL, // yield_data_ptr
0x00000000, // yield_data_size
};
OSScTask task;
OSMesgQueue queue;
OSMesg msg[1];
osCreateMesgQueue(&queue, msg, ARRAY_COUNT(msg));
task.next = NULL;
task.flags = OS_SC_NEEDS_RSP;
task.msgQ = &queue;
task.msg = (OSMesg)0;
task.framebuffer = NULL;
task.list = D_80097AA0_unknown;
osSendMesg(&B_801F86F8_unknown, &task, OS_MESG_BLOCK);
Sched_SendNotifyMsg(&B_801F85E0_unknown);
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
gCICValue1 = IO_READ(SP_DMEM_START + 0xFF4);
gCICValue2 = IO_READ(SP_DMEM_START + 0xFFC);
func_80081A54_unknown();
}
s32 func_80081A54_unknown(void) {
return 0;
}
#endif
void CIC6105_Init(void) {
gCICAddr1Val = IO_READ(CIC_ADDRESS_1);
gCICAddr2Val = IO_READ(CIC_ADDRESS_2);

View File

@ -25,7 +25,7 @@ extern u64 njpgdspMainDataStart[];
* Configures and schedules a JPEG decoder task and waits for it to finish.
*/
void Jpeg_ScheduleDecoderTask(JpegContext* jpegCtx) {
static OSTask_t sJpegTask = {
static OSTask sJpegTask = {
M_NJPEGTASK, // type
0, // flags
NULL, // ucode_boot
@ -54,18 +54,18 @@ void Jpeg_ScheduleDecoderTask(JpegContext* jpegCtx) {
workBuf->taskData.qTableUPtr = &workBuf->qTableU;
workBuf->taskData.qTableVPtr = &workBuf->qTableV;
sJpegTask.flags = 0;
sJpegTask.ucode_boot = SysUcode_GetUCodeBoot();
sJpegTask.ucode_boot_size = SysUcode_GetUCodeBootSize();
sJpegTask.yield_data_ptr = (u64*)&workBuf->yieldData;
sJpegTask.data_ptr = (u64*)&workBuf->taskData;
sJpegTask.t.flags = 0;
sJpegTask.t.ucode_boot = SysUcode_GetUCodeBoot();
sJpegTask.t.ucode_boot_size = SysUcode_GetUCodeBootSize();
sJpegTask.t.yield_data_ptr = (u64*)&workBuf->yieldData;
sJpegTask.t.data_ptr = (u64*)&workBuf->taskData;
jpegCtx->scTask.next = NULL;
jpegCtx->scTask.flags = OS_SC_NEEDS_RSP;
jpegCtx->scTask.msgQ = &jpegCtx->mq;
jpegCtx->scTask.msg = NULL;
jpegCtx->scTask.framebuffer = NULL;
jpegCtx->scTask.list.t = sJpegTask;
jpegCtx->scTask.list = sJpegTask;
osSendMesg(&gScheduler.cmdQueue, (OSMesg*)&jpegCtx->scTask, OS_MESG_BLOCK);
Sched_SendNotifyMsg(&gScheduler); // osScKickEntryMsg

View File

@ -385,7 +385,9 @@ sYaz0CurSize = 0x8009D968; // size:0x4
sYaz0MaxPtr = 0x8009D96C; // size:0x4
gCICAddr1Val = 0x8009D970; // size:0x4
gCICAddr2Val = 0x8009D974; // size:0x4
sRomInfoFaultClient = 0x8009D978; // size:0x18
sRomInfoFaultClient = 0x8009D978; // size:0x10
gCICValue1 = 0x8009D988; // size:0x4
gCICValue2 = 0x8009D98C; // size:0x4
sFaultInstance = 0x8009D990; // size:0x4
sFaultTimeTotal = 0x8009D994; // type:f32 size:0x4
sFaultCustomOptions = 0x8009D998; // size:0x4

View File

@ -110,7 +110,7 @@ sYaz0MaxPtr = 0x8009BE1C; // size:0x4
gYaz0DecompressDstEnd = 0x8009BE20; // size:0x4
gCICAddr1Val = 0x8009BE30; // size:0x4
gCICAddr2Val = 0x8009BE34; // size:0x4
sRomInfoFaultClient = 0x8009BE38; // size:0x18
sRomInfoFaultClient = 0x8009BE38; // size:0x10
sFaultInstance = 0x8009BE50; // size:0x4
sFaultTimeTotal = 0x8009BE54; // size:0x4
sFaultCustomOptions = 0x8009BE58; // size:0x4