Skip to content

Commit 5034077

Browse files
committed
WIP RDRAM initialization patch
1 parent 817ef45 commit 5034077

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

Source/3rdParty/mupen64plus-core/src/device/rcp/ri/ri_controller.c

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ void init_ri(struct ri_controller* ri, struct rdram* rdram)
3333
void poweron_ri(struct ri_controller* ri)
3434
{
3535
memset(ri->regs, 0, RI_REGS_COUNT*sizeof(uint32_t));
36+
//ri->regs[RI_SELECT_REG] = 1;
3637
}
3738

3839

Source/3rdParty/mupen64plus-core/src/device/rcp/ri/ri_controller.h

+12
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ static osal_inline uint32_t ri_reg(uint32_t address)
5454
return (address & 0xffff) >> 2;
5555
}
5656

57+
static osal_inline uint32_t rdram_address_to_ri_address(uint32_t address)
58+
{
59+
/* https://n64brew.dev/wiki/RDRAM_Interface#Memory_addressing */
60+
return (((address >> 20) == 0x03f)
61+
? (((address & 0x3FF))) | /* Adr[10:0] */
62+
(((address >> 10) & 0x1FF) << 11) | /* Adr[19:11] */
63+
(((address >> 10) & 0x1FF) << 20) /* Adr[28:20] */
64+
: (((address & 0x7FF))) | /* Adr[10:0] */
65+
(((address >> 11) & 0x1FF) << 11) | /* Adr[19:11] */
66+
(((address >> 20) & 0x3F) << 20)); /* Adr[28:20] */
67+
}
68+
5769
static osal_inline uint16_t ri_address_to_id_field(uint32_t address)
5870
{
5971
/* XXX: pure guessing, need harware test */

Source/3rdParty/mupen64plus-core/src/device/rdram/rdram.c

+33-16
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <string.h>
3232

3333
#define RDRAM_BCAST_ADDRESS_MASK UINT32_C(0x00080000)
34-
34+
#define RDRAM_MODE_CE_MASK UINT32_C(0x80000000)
3535

3636
/* XXX: deduce # of RDRAM modules from it's total size
3737
* Assume only 2Mo RDRAM modules.
@@ -59,19 +59,29 @@ static osal_inline uint16_t idfield_value(uint32_t device_id)
5959
{
6060
return ((((device_id >> 26) & 0x3f) << 0)
6161
| (((device_id >> 23) & 0x01) << 6)
62-
| (((device_id >> 16) & 0xff) << 7)
62+
| (((device_id >> 15) & 0xff) << 7)
6363
| (((device_id >> 7) & 0x01) << 15));
6464
}
6565

66+
static osal_inline uint16_t ri_address_to_idfield(uint32_t address)
67+
{
68+
const uint32_t swapfield = 0; // TODO
69+
70+
return (uint16_t)((((swapfield & ((address >> 11) & 0xFF)) | ((~swapfield & (address >> 20 & 0xFF))))) | /* AdrS[28:20] */
71+
(((address >> 29) & 0x3F) << 9)); /* AdrS[35:29] */
72+
}
73+
74+
#include <stdio.h>
6675
static size_t get_module(const struct rdram* rdram, uint32_t address)
6776
{
6877
size_t module;
6978
size_t modules = get_modules_count(rdram);
70-
uint16_t id_field = ri_address_to_id_field(address);
71-
79+
uint16_t id_field = ri_address_to_idfield(rdram_address_to_ri_address(address));
7280

7381
for (module = 0; module < modules; ++module) {
74-
if (id_field == idfield_value(rdram->regs[module][RDRAM_DEVICE_ID_REG])) {
82+
//printf("id_field = 0x%08X, idfield_value = 0x%08X\n", id_field >> 1 & 0x3F, (((idfield_value(rdram->regs[module][RDRAM_DEVICE_ID_REG]) >> 1)) & 0x3F));
83+
// TODO: move shift to elsewhere
84+
if (((id_field >> 1) & 0x3F) == (((idfield_value(rdram->regs[module][RDRAM_DEVICE_ID_REG]) >> 1 & 0x3F)))) {
7585
return module;
7686
}
7787
}
@@ -155,7 +165,7 @@ void poweron_rdram(struct rdram* rdram)
155165
}
156166
}
157167

158-
168+
#include <stdio.h>
159169
void read_rdram_regs(void* opaque, uint32_t address, uint32_t* value)
160170
{
161171
struct rdram* rdram = (struct rdram*)opaque;
@@ -191,7 +201,7 @@ void write_rdram_regs(void* opaque, uint32_t address, uint32_t value, uint32_t m
191201
/* HACK: Detect when current Control calibration is about to start,
192202
* so we can set corrupted rdram_dram handler
193203
*/
194-
if (address & RDRAM_BCAST_ADDRESS_MASK && reg == RDRAM_DELAY_REG) {
204+
/*if (address & RDRAM_BCAST_ADDRESS_MASK && reg == RDRAM_DELAY_REG) {
195205
map_corrupt_rdram(rdram, 1);
196206
}
197207
@@ -200,15 +210,7 @@ void write_rdram_regs(void* opaque, uint32_t address, uint32_t value, uint32_t m
200210
* and let dynarec have it's fast_memory enabled.
201211
*/
202212
if (address & RDRAM_BCAST_ADDRESS_MASK && reg == RDRAM_MODE_REG) {
203-
map_corrupt_rdram(rdram, 0);
204-
205-
/* HACK: In the IPL3 procedure, at this point,
206-
* the amount of detected memory can be found in s4 */
207-
size_t ipl3_rdram_size = r4300_regs(rdram->r4300)[20] & UINT32_C(0x0fffffff);
208-
if (ipl3_rdram_size != rdram->dram_size) {
209-
DebugMessage(M64MSG_WARNING, "IPL3 detected %u MB of RDRAM != %u MB",
210-
(uint32_t) ipl3_rdram_size / (1024*1024), (uint32_t) rdram->dram_size / (1024*1024));
211-
}
213+
// map_corrupt_rdram(rdram, 0);
212214
}
213215

214216

@@ -230,6 +232,21 @@ void read_rdram_dram(void* opaque, uint32_t address, uint32_t* value)
230232
{
231233
struct rdram* rdram = (struct rdram*)opaque;
232234
uint32_t addr = rdram_dram_address(address);
235+
size_t module = get_module(rdram, address);
236+
237+
if (module == RDRAM_MAX_MODULES_COUNT)
238+
{
239+
*value = 0;
240+
return;
241+
}
242+
243+
/* corrupt read value if CC value is not calibrated */
244+
uint32_t mode = rdram->regs[module][RDRAM_MODE_REG] ^ UINT32_C(0xc0c0c0c0);
245+
if ((mode & RDRAM_MODE_CE_MASK) && (cc_value(mode) == 0))
246+
{
247+
*value = 0;
248+
return;
249+
}
233250

234251
if (address < rdram->dram_size)
235252
{

Source/3rdParty/mupen64plus-core/src/main/savestates.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ static int savestates_load_m64p(struct device* dev, char *filepath)
932932
*/
933933
for (i = 0; i < RDRAM_MAX_MODULES_COUNT; ++i) {
934934
memcpy(dev->rdram.regs[i], dev->rdram.regs[0], RDRAM_REGS_COUNT*sizeof(dev->rdram.regs[0][0]));
935-
dev->rdram.regs[i][RDRAM_DEVICE_ID_REG] = ri_address_to_id_field(i * 0x200000) << 2;
935+
//dev->rdram.regs[i][RDRAM_DEVICE_ID_REG] = ri_address_to_id_field(i * 0x200000) << 2;
936936
}
937937

938938
/* dd state */
@@ -1286,7 +1286,7 @@ static int savestates_load_pj64(struct device* dev,
12861286
*/
12871287
for (i = 0; i < (SaveRDRAMSize / 0x200000); ++i) {
12881288
memcpy(dev->rdram.regs[i], dev->rdram.regs[0], RDRAM_REGS_COUNT*sizeof(dev->rdram.regs[0][0]));
1289-
dev->rdram.regs[i][RDRAM_DEVICE_ID_REG] = ri_address_to_id_field(i * 0x200000) << 2;
1289+
//dev->rdram.regs[i][RDRAM_DEVICE_ID_REG] = ri_address_to_id_field(i * 0x200000) << 2;
12901290
}
12911291

12921292
/* dd state */

0 commit comments

Comments
 (0)