Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/lib/src/__osViSwapContext.c
7857 views
1
#include "libultra_internal.h"
2
#include "hardware.h"
3
4
extern OSViContext *__osViNext;
5
extern OSViContext *__osViCurr;
6
7
void __osViSwapContext() {
8
register OSViMode *s0;
9
register OSViContext *s1;
10
u32 origin;
11
u32 hStart;
12
u32 sp34;
13
u32 field;
14
register u32 s2;
15
field = 0;
16
s1 = __osViNext;
17
s0 = s1->modep;
18
field = HW_REG(VI_V_CURRENT_LINE_REG, u32) & 1;
19
s2 = osVirtualToPhysical(s1->buffer);
20
origin = (s0->fldRegs[field].origin) + s2;
21
if (s1->unk00 & 2) {
22
s1->unk20 |= s0->comRegs.xScale & ~0xfff;
23
} else {
24
s1->unk20 = s0->comRegs.xScale;
25
}
26
if (s1->unk00 & 4) {
27
sp34 = (u32)(s0->fldRegs[field].yScale & 0xfff);
28
s1->unk2c = s1->unk24 * sp34;
29
s1->unk2c |= s0->fldRegs[field].yScale & ~0xfff;
30
} else {
31
s1->unk2c = s0->fldRegs[field].yScale;
32
}
33
hStart = s0->comRegs.hStart;
34
if (s1->unk00 & 0x20) {
35
hStart = 0;
36
}
37
if (s1->unk00 & 0x40) {
38
s1->unk2c = 0;
39
origin = osVirtualToPhysical(s1->buffer);
40
}
41
if (s1->unk00 & 0x80) {
42
s1->unk2c = (s1->unk28 << 0x10) & 0x3ff0000;
43
origin = osVirtualToPhysical(s1->buffer);
44
}
45
HW_REG(VI_ORIGIN_REG, u32) = origin;
46
HW_REG(VI_WIDTH_REG, u32) = s0->comRegs.width;
47
HW_REG(VI_BURST_REG, u32) = s0->comRegs.burst;
48
HW_REG(VI_V_SYNC_REG, u32) = s0->comRegs.vSync;
49
HW_REG(VI_H_SYNC_REG, u32) = s0->comRegs.hSync;
50
HW_REG(VI_LEAP_REG, u32) = s0->comRegs.leap;
51
HW_REG(VI_H_START_REG, u32) = hStart;
52
HW_REG(VI_V_START_REG, u32) = s0->fldRegs[field].vStart;
53
HW_REG(VI_V_BURST_REG, u32) = s0->fldRegs[field].vBurst;
54
HW_REG(VI_INTR_REG, u32) = s0->fldRegs[field].vIntr;
55
HW_REG(VI_X_SCALE_REG, u32) = s1->unk20;
56
HW_REG(VI_Y_SCALE_REG, u32) = s1->unk2c;
57
HW_REG(VI_CONTROL_REG, u32) = s1->features;
58
__osViNext = __osViCurr;
59
__osViCurr = s1;
60
*__osViNext = *__osViCurr;
61
}
62
63