Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/lib/src/D_802F4380.c
7857 views
1
#include "libultra_internal.h"
2
#include "hardware.h"
3
#include "new_func.h"
4
#include "macros.h"
5
6
#if defined(VERSION_EU)
7
u32 D_802F4380() {
8
u32 sp3c;
9
u32 sp38;
10
u32 sp34;
11
__OSTranxInfo *sp30;
12
__OSBlockInfo *sp2c;
13
u32 sp28;
14
UNUSED __OSBlockInfo *sp24;
15
if (!EU_D_80302090) {
16
return 0;
17
}
18
sp30 = &__osDiskHandle->transferInfo;
19
sp2c = &sp30->block[sp30->blockNum];
20
sp38 = HW_REG(PI_STATUS_REG, u32);
21
if (sp38 & PI_STATUS_BUSY) {
22
HW_REG(PI_STATUS_REG, u32) = PI_STATUS_RESET_CONTROLLER | PI_STATUS_CLEAR_INTR;
23
WAIT_ON_IOBUSY(sp38);
24
sp3c = HW_REG(ASIC_STATUS, u32);
25
if (sp3c & MECHANIC_INTERRUPT) {
26
WAIT_ON_IOBUSY(sp38);
27
HW_REG(ASIC_BM_CTL, u32) = sp30->bmCtlShadow | MECHANIC_INTERRUPT_RESET;
28
}
29
sp30->errStatus = 75;
30
func_802F4A20();
31
return 1;
32
}
33
WAIT_ON_IOBUSY(sp38);
34
sp3c = HW_REG(ASIC_STATUS, u32);
35
if (sp3c & MECHANIC_INTERRUPT) {
36
WAIT_ON_IOBUSY(sp38);
37
HW_REG(ASIC_BM_CTL, u32) = sp30->bmCtlShadow | MECHANIC_INTERRUPT_RESET;
38
sp30->errStatus = 0;
39
return 0;
40
}
41
if (sp3c & BUFFER_MANAGER_ERROR) {
42
sp30->errStatus = 3;
43
func_802F4A20();
44
return 1;
45
}
46
if (sp30->cmdType == 1) {
47
if ((sp3c & DATA_REQUEST) == 0) {
48
if (sp30->sectorNum + 1 != sp30->transferMode * 85) {
49
sp30->errStatus = 6;
50
func_802F4A20();
51
return 1;
52
}
53
HW_REG(PI_STATUS_REG, u32) = PI_STATUS_CLEAR_INTR;
54
__OSGlobalIntMask |= 0x00100401;
55
sp30->errStatus = 0;
56
func_802F4B08();
57
return 1;
58
}
59
sp2c->dramAddr = (void *) ((u32) sp2c->dramAddr + sp2c->sectorSize);
60
sp30->sectorNum += 1;
61
osEPiRawStartDma(__osDiskHandle, 1, 0x05000400, sp2c->dramAddr, sp2c->sectorSize);
62
return 1;
63
}
64
if (sp30->cmdType == 0) {
65
if (sp30->transferMode == 3) {
66
if ((s32)(sp2c->C1ErrNum + 17) < sp30->sectorNum) {
67
sp30->errStatus = 0;
68
func_802F4A20();
69
return 1;
70
}
71
if ((sp3c & DATA_REQUEST) == 0) {
72
sp30->errStatus = 17;
73
func_802F4A20();
74
return 1;
75
}
76
} else {
77
sp2c->dramAddr = (void *) ((u32) sp2c->dramAddr + sp2c->sectorSize);
78
}
79
sp34 = HW_REG(ASIC_BM_STATUS, u32);
80
if (((C1_SINGLE & sp34) && (C1_DOUBLE & sp34)) || (sp34 & MICRO_STATUS))
81
{
82
if (sp2c->C1ErrNum > 3) {
83
if (sp30->transferMode != 3 || sp30->sectorNum > 0x52) {
84
sp30->errStatus = 17;
85
func_802F4A20();
86
return 1;
87
}
88
} else {
89
sp28 = sp2c->C1ErrNum;
90
sp2c->C1ErrSector[sp28] = sp30->sectorNum + 1;
91
}
92
sp2c->C1ErrNum += 1;
93
}
94
if (sp3c & C2_TRANSFER) {
95
if (sp30->sectorNum != 87) {
96
sp30->errStatus = 6;
97
func_802F4A20();
98
}
99
if (sp30->transferMode == 2 && sp30->blockNum == 0) {
100
sp30->blockNum = 1;
101
sp30->sectorNum = -1;
102
sp30->block[1].dramAddr =
103
(void *) ((u32) sp30->block[1].dramAddr - sp30->block[1].sectorSize);
104
} else {
105
HW_REG(PI_STATUS_REG, u32) = PI_STATUS_CLEAR_INTR;
106
__OSGlobalIntMask |= 0x00100401;
107
}
108
osEPiRawStartDma(__osDiskHandle, 0, 0x5000000, sp2c->C2Addr, sp2c->sectorSize * 4);
109
sp30->errStatus = 0;
110
return 1;
111
}
112
113
if (sp30->sectorNum == -1 && sp30->transferMode == 2 && sp30->blockNum == 1) {
114
sp24 = &sp30->block[0];
115
if (sp30->block[0].C1ErrNum == 0) {
116
if (((u32 *) sp30->block[0].C2Addr)[0] | ((u32 *) sp30->block[0].C2Addr)[1]
117
| ((u32 *) sp30->block[0].C2Addr)[2] | ((u32 *) sp30->block[0].C2Addr)[3]) {
118
sp30->errStatus = 6;
119
func_802F4A20();
120
return 1;
121
}
122
}
123
sp30->errStatus = 0;
124
func_802F4B08();
125
}
126
sp30->sectorNum += 1;
127
if (sp3c & DATA_REQUEST) {
128
if (sp30->sectorNum > 0x54) {
129
sp30->errStatus = 6;
130
func_802F4A20();
131
return 1;
132
}
133
osEPiRawStartDma(__osDiskHandle, 0, 0x05000400, sp2c->dramAddr, sp2c->sectorSize);
134
sp30->errStatus = 0;
135
return 1;
136
}
137
if (sp30->sectorNum <= 0x54) {
138
sp30->errStatus = 6;
139
func_802F4A20();
140
return 1;
141
}
142
return 1;
143
}
144
sp30->errStatus = 75;
145
func_802F4A20();
146
return 1;
147
}
148
#endif
149
150