@@ -31,8 +31,8 @@ namespace RSP_CP0
31
31
uint32_t status;
32
32
uint32_t semaphore;
33
33
34
- void performReadDma (uint32_t address );
35
- void performWriteDma (uint32_t address );
34
+ void performReadDma (uint32_t length, uint32_t count, uint32_t skip );
35
+ void performWriteDma (uint32_t length, uint32_t count, uint32_t skip );
36
36
}
37
37
38
38
void RSP_CP0::reset ()
@@ -79,30 +79,22 @@ void RSP_CP0::write(int index, uint32_t value)
79
79
{
80
80
case 0 : // SP_MEM_ADDR
81
81
// Set the RSP DMA address
82
- memAddr = value & 0x1FFF ;
82
+ memAddr = value & 0x1FF8 ;
83
83
return ;
84
84
85
85
case 1 : // SP_DRAM_ADDR
86
86
// Set the RDRAM DMA address
87
- dramAddr = value & 0xFFFFFF ;
87
+ dramAddr = value & 0xFFFFF8 ;
88
88
return ;
89
89
90
90
case 2 : // SP_RD_LEN
91
91
// Start a DMA transfer from RDRAM to RSP MEM
92
- performReadDma ((value & 0xFF8 ) + 1 );
93
-
94
- // Keep track of unimplemented bits that should do something
95
- if (uint32_t bits = (value & 0xFF8FF000 ))
96
- LOG_WARN (" Unimplemented RSP CP0 read length bits set: 0x%X\n " , bits);
92
+ performReadDma (value & 0xFF8 , (value >> 12 ) & 0xFF , (value >> 20 ) & 0xFF8 );
97
93
return ;
98
94
99
95
case 3 : // SP_WR_LEN
100
96
// Start a DMA transfer from RSP MEM to RDRAM
101
- performWriteDma ((value & 0xFF8 ) + 1 );
102
-
103
- // Keep track of unimplemented bits that should do something
104
- if (uint32_t bits = (value & 0xFF8FF000 ))
105
- LOG_WARN (" Unimplemented RSP CP0 write length bits set: 0x%X\n " , bits);
97
+ performWriteDma (value & 0xFF8 , (value >> 12 ) & 0xFF , (value >> 20 ) & 0xFF8 );
106
98
return ;
107
99
108
100
case 4 : // SP_STATUS
@@ -162,28 +154,42 @@ void RSP_CP0::triggerBreak()
162
154
status |= 0x3 ;
163
155
}
164
156
165
- void RSP_CP0::performReadDma (uint32_t size )
157
+ void RSP_CP0::performReadDma (uint32_t length, uint32_t count, uint32_t skip )
166
158
{
167
- LOG_INFO (" RSP DMA from RDRAM 0x%X to RSP MEM 0x%X with size 0x%X\n " , dramAddr, memAddr, size);
159
+ LOG_INFO (" RSP DMA from RDRAM 0x%X to RSP MEM 0x%X with length 0x%X, "
160
+ " count 0x%X, skip 0x%X\n " , dramAddr, memAddr, length, count, skip);
168
161
169
- // Copy data from memory to the RSP
170
- for (uint32_t i = 0 ; i < size; i += 8 )
162
+ // Copy rows of data from memory to the RSP
163
+ uint32_t dramBase = dramAddr, memBase = memAddr;
164
+ for (uint32_t c = 0 ; c <= count; c++)
171
165
{
172
- uint32_t dst = 0x84000000 + ((memAddr + i) & 0x1FFF );
173
- uint32_t src = 0x80000000 + dramAddr + i;
174
- Memory::write <uint64_t >(dst & ~7 , Memory::read <uint64_t >(src & ~7 ));
166
+ for (uint32_t l = 0 ; l <= length; l += 8 )
167
+ {
168
+ uint32_t dst = 0x84000000 + ((memBase + l) & 0x1FF8 );
169
+ uint32_t src = 0x80000000 + ((dramBase + l) & 0xFFFFF8 );
170
+ Memory::write <uint64_t >(dst, Memory::read <uint64_t >(src));
171
+ }
172
+ dramBase += length + skip + 8 ;
173
+ memBase += length + 8 ;
175
174
}
176
175
}
177
176
178
- void RSP_CP0::performWriteDma (uint32_t size )
177
+ void RSP_CP0::performWriteDma (uint32_t length, uint32_t count, uint32_t skip )
179
178
{
180
- LOG_INFO (" RSP DMA from RSP MEM 0x%X to RDRAM 0x%X with size 0x%X\n " , memAddr, dramAddr, size);
179
+ LOG_INFO (" RSP DMA from RSP MEM 0x%X to RDRAM 0x%X with length 0x%X, "
180
+ " count 0x%X, skip 0x%X\n " , memAddr, dramAddr, length, count, skip);
181
181
182
- // Copy data from the RSP to memory
183
- for (uint32_t i = 0 ; i < size; i += 8 )
182
+ // Copy rows of data from the RSP to memory
183
+ uint32_t dramBase = dramAddr, memBase = memAddr;
184
+ for (uint32_t c = 0 ; c <= count; c++)
184
185
{
185
- uint32_t dst = 0x80000000 + dramAddr + i;
186
- uint32_t src = 0x84000000 + ((memAddr + i) & 0x1FFF );
187
- Memory::write <uint64_t >(dst & ~7 , Memory::read <uint64_t >(src & ~7 ));
186
+ for (uint32_t l = 0 ; l <= length; l += 8 )
187
+ {
188
+ uint32_t dst = 0x80000000 + ((dramBase + l) & 0xFFFFF8 );
189
+ uint32_t src = 0x84000000 + ((memBase + l) & 0x1FF8 );
190
+ Memory::write <uint64_t >(dst, Memory::read <uint64_t >(src));
191
+ }
192
+ dramBase += length + skip + 8 ;
193
+ memBase += length + 8 ;
188
194
}
189
195
}
0 commit comments