mirror of
https://github.com/n64decomp/sm64
synced 2026-04-25 08:33:43 +00:00
95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
#include "libultra_internal.h"
|
|
#include "hardware.h"
|
|
|
|
#ifdef VERSION_SH
|
|
extern s32 D_SH_80000300; // Potentially a TV type
|
|
#endif
|
|
|
|
#ifndef VERSION_JP
|
|
extern u32 osTvType;
|
|
#endif
|
|
|
|
OSViContext sViContexts[2] = { 0 };
|
|
OSViContext *__osViCurr = &sViContexts[0];
|
|
OSViContext *__osViNext = &sViContexts[1];
|
|
#ifdef VERSION_EU
|
|
u32 osViClock = 0x02E6D354; // used for audio frequency calculations
|
|
u32 sTvType = TV_TYPE_PAL;
|
|
#elif !defined(VERSION_SH)
|
|
u32 sTvType = TV_TYPE_NTSC;
|
|
u32 osViClock = 0x02E6D354;
|
|
#endif
|
|
|
|
extern OSViMode D_80334990;
|
|
extern OSViMode D_803349E0;
|
|
#if defined(VERSION_EU) || defined(VERSION_SH)
|
|
extern OSViMode D_80302FD0;
|
|
#endif
|
|
|
|
void __osViInit(void) {
|
|
//#ifdef VERSION_JP
|
|
#ifdef VERSION_US
|
|
sTvType = osTvType;
|
|
#endif
|
|
bzero(sViContexts, sizeof(sViContexts));
|
|
__osViCurr = &sViContexts[0];
|
|
__osViNext = &sViContexts[1];
|
|
__osViNext->retraceCount = 1;
|
|
__osViCurr->retraceCount = 1;
|
|
|
|
#if defined(VERSION_EU)
|
|
|
|
if (osTvType == TV_TYPE_PAL) {
|
|
__osViNext->modep = &D_80334990;
|
|
osViClock = 0x02F5B2D2;
|
|
} else if (osTvType == TV_TYPE_MPAL) {
|
|
__osViNext->modep = &D_803349E0;
|
|
osViClock = 0x02E6025C;
|
|
} else {
|
|
__osViNext->modep = &D_80302FD0;
|
|
osViClock = 0x02E6D354;
|
|
}
|
|
|
|
#elif defined(VERSION_SH)
|
|
|
|
__osViNext->buffer = (void *) 0x80000000;
|
|
__osViCurr->buffer = (void *) 0x80000000;
|
|
if (osTvType == TV_TYPE_PAL) {
|
|
__osViNext->modep = &D_80334990;
|
|
} else if (osTvType == TV_TYPE_MPAL) {
|
|
__osViNext->modep = &D_803349E0;
|
|
} else {
|
|
__osViNext->modep = &D_80302FD0;
|
|
}
|
|
|
|
#else
|
|
|
|
#ifdef VERSION_JP
|
|
if (sTvType != TV_TYPE_PAL)
|
|
#else
|
|
if (sTvType == TV_TYPE_NTSC)
|
|
#endif
|
|
{
|
|
__osViNext->modep = &D_80334990;
|
|
osViClock = 0x02E6D354;
|
|
} else {
|
|
__osViNext->modep = &D_803349E0;
|
|
#if defined(VERSION_JP)
|
|
osViClock = 0x02F5B2D2;
|
|
#elif defined(VERSION_US)
|
|
osViClock = 0x02E6025C;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
__osViNext->unk00 = 0x20;
|
|
__osViNext->features = __osViNext->modep->comRegs.ctrl;
|
|
#ifndef VERSION_JP
|
|
while (HW_REG(VI_CURRENT_REG, u32) > 0xa) {
|
|
;
|
|
}
|
|
HW_REG(VI_STATUS_REG, u32) = 0;
|
|
#endif
|
|
__osViSwapContext();
|
|
}
|