mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-06 15:48:05 -04:00
buffering, PCM DMA, memcpy12bswap
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@66 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
83bd0b76ab
commit
0a051f558c
15 changed files with 395 additions and 70 deletions
|
@ -70,7 +70,7 @@ void LC89510_Reset(void)
|
|||
|
||||
void Update_CDC_TRansfer(int which)
|
||||
{
|
||||
unsigned int DMA_Adr, dep, length, len;
|
||||
unsigned int DMA_Adr, dep, length;
|
||||
unsigned short *dest;
|
||||
unsigned char *src;
|
||||
|
||||
|
@ -96,7 +96,7 @@ void Update_CDC_TRansfer(int which)
|
|||
else length = CDC_DMA_SPEED;
|
||||
|
||||
|
||||
// TODO: dst bounds checking? DAC.N alignment?
|
||||
// TODO: dst bounds checking?
|
||||
src = Pico_mcd->cdc.Buffer + Pico_mcd->cdc.DAC.N;
|
||||
DMA_Adr = (Pico_mcd->s68k_regs[0xA]<<8) | Pico_mcd->s68k_regs[0xB];
|
||||
|
||||
|
@ -112,13 +112,11 @@ void Update_CDC_TRansfer(int which)
|
|||
|
||||
dest = (unsigned short *) (Pico_mcd->word_ram1M[bank] + dep);
|
||||
|
||||
// TODO: bswapcpy
|
||||
for (len = length; len > 0; len--, src+=2, dest++)
|
||||
*dest = (src[0]<<8) | src[1];
|
||||
memcpy16bswap(dest, src, length);
|
||||
|
||||
{ // debug
|
||||
unsigned char *b1 = Pico_mcd->word_ram1M[bank] + dep;
|
||||
unsigned char *b2 = (unsigned char *)dest - 8;
|
||||
unsigned char *b2 = (unsigned char *)(dest+length) - 8;
|
||||
dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x",
|
||||
b1[0], b1[1], b1[4], b1[5], b2[0], b2[1], b2[4], b2[5]);
|
||||
}
|
||||
|
@ -130,25 +128,26 @@ void Update_CDC_TRansfer(int which)
|
|||
Pico_mcd->cdc.DAC.N, dep, length);
|
||||
dest = (unsigned short *) (Pico_mcd->word_ram2M + dep);
|
||||
|
||||
for (len = length; len > 0; len--, src+=2, dest++)
|
||||
*dest = (src[0]<<8) | src[1];
|
||||
memcpy16bswap(dest, src, length);
|
||||
|
||||
{ // debug
|
||||
unsigned char *b1 = Pico_mcd->word_ram2M + dep;
|
||||
unsigned char *b2 = (unsigned char *)dest - 4;
|
||||
unsigned char *b2 = (unsigned char *)(dest+length) - 4;
|
||||
dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x",
|
||||
b1[0], b1[1], b1[2], b1[3], b2[0], b2[1], b2[2], b2[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (which == 4) // PCM RAM
|
||||
else if (which == 4) // PCM RAM (check: popful Mail)
|
||||
{
|
||||
#if 0
|
||||
dest = (unsigned char *) Ram_PCM;
|
||||
dep = ((DMA_Adr & 0x03FF) << 2) + PCM_Chip.Bank;
|
||||
#else
|
||||
dprintf("FIXME: CD DMA # %04x -> PCM", Pico_mcd->cdc.DAC.N);
|
||||
#endif
|
||||
dep = (DMA_Adr & 0x03FF) << 2;
|
||||
dprintf("CD DMA # %04x -> PCM[%i] # %04x, len=%i",
|
||||
Pico_mcd->cdc.DAC.N, Pico_mcd->pcm.bank, dep, length);
|
||||
dest = (unsigned short *) (Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank] + dep);
|
||||
|
||||
if (Pico_mcd->cdc.DAC.N & 1) /* unaligned src? */
|
||||
memcpy(dest, src, length*2);
|
||||
else memcpy16(dest, (unsigned short *) src, length);
|
||||
}
|
||||
else if (which == 5) // PRG RAM
|
||||
{
|
||||
|
@ -157,12 +156,11 @@ void Update_CDC_TRansfer(int which)
|
|||
cdprintf("CD DMA # %04x -> prg_ram # %06x, len=%i",
|
||||
Pico_mcd->cdc.DAC.N, dep, length);
|
||||
|
||||
for (len = length; len > 0; len--, src+=2, dest++)
|
||||
*dest = (src[0]<<8) | src[1];
|
||||
memcpy16bswap(dest, src, length);
|
||||
|
||||
{ // debug
|
||||
unsigned char *b1 = Pico_mcd->prg_ram + dep;
|
||||
unsigned char *b2 = (unsigned char *)dest - 4;
|
||||
unsigned char *b2 = (unsigned char *)(dest+length) - 4;
|
||||
dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x",
|
||||
b1[0], b1[1], b1[2], b1[3], b2[0], b2[1], b2[2], b2[3]);
|
||||
}
|
||||
|
|
|
@ -421,6 +421,7 @@ u16 PicoReadM68k16(u32 a)
|
|||
a = (a&2) | (cell_map(a >> 2) << 2); // cell arranged
|
||||
else a &= 0x1fffe;
|
||||
d = *(u16 *)(Pico_mcd->word_ram1M[bank]+a);
|
||||
//d = 0xaaaa;
|
||||
} else {
|
||||
// allow access in any mode, like Gens does
|
||||
d = *(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe));
|
||||
|
@ -929,6 +930,63 @@ u32 PicoReadS68k32(u32 a)
|
|||
}
|
||||
|
||||
|
||||
/* check: jaguar xj 220 (draws entire world using decode) */
|
||||
static void decode_write8(u32 a, u8 d, int r3)
|
||||
{
|
||||
u8 *pd = Pico_mcd->word_ram1M[!(r3 & 1)] + (((a>>1)^1)&0x1ffff);
|
||||
u8 oldmask = (a&1) ? 0xf0 : 0x0f;
|
||||
|
||||
//if ((a & 0x3ffff) < 0x28000) return;
|
||||
//return;
|
||||
|
||||
r3 &= 0x18;
|
||||
d &= 0x0f;
|
||||
if (!(a&1)) d <<= 4;
|
||||
|
||||
//dprintf("FIXME: decode, r3 = %02x", r3);
|
||||
|
||||
if (r3 == 8) {
|
||||
if ((!(*pd & (~oldmask))) && d) goto do_it;
|
||||
} else if (r3 > 8) {
|
||||
if (d) goto do_it;
|
||||
} else {
|
||||
goto do_it;
|
||||
}
|
||||
|
||||
return;
|
||||
do_it:
|
||||
*pd = d | (*pd & oldmask);
|
||||
}
|
||||
|
||||
|
||||
static void decode_write16(u32 a, u16 d, int r3)
|
||||
{
|
||||
u8 *pd = Pico_mcd->word_ram1M[!(r3 & 1)] + (((a>>1)^1)&0x1ffff);
|
||||
|
||||
//if ((a & 0x3ffff) < 0x28000) return;
|
||||
|
||||
r3 &= 0x18;
|
||||
d &= 0x0f0f;
|
||||
d |= d >> 4;
|
||||
|
||||
if (r3 == 8) {
|
||||
u8 dold = *pd;
|
||||
if (!(dold & 0xf0)) dold |= d & 0xf0;
|
||||
if (!(dold & 0x0f)) dold |= d & 0x0f;
|
||||
*pd = dold;
|
||||
} else if (r3 > 8) {
|
||||
u8 dold = *pd;
|
||||
if (!(d & 0xf0)) d |= dold & 0xf0;
|
||||
if (!(d & 0x0f)) d |= dold & 0x0f;
|
||||
*pd = d;
|
||||
} else {
|
||||
*pd = d;
|
||||
}
|
||||
|
||||
//dprintf("FIXME: decode");
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
|
||||
void PicoWriteS68k8(u32 a,u8 d)
|
||||
|
@ -958,13 +1016,10 @@ void PicoWriteS68k8(u32 a,u8 d)
|
|||
|
||||
// word RAM (2M area)
|
||||
if ((a&0xfc0000)==0x080000) { // 080000-0bffff
|
||||
int r3 = Pico_mcd->s68k_regs[3];
|
||||
wrdprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPcS68k);
|
||||
if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?
|
||||
int bank = !(Pico_mcd->s68k_regs[3]&1);
|
||||
if (a&1) d &= 0x0f;
|
||||
else d >>= 4;
|
||||
Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff]=d;
|
||||
dprintf("FIXME: decode");
|
||||
if (r3 & 4) { // 1M decode mode?
|
||||
decode_write8(a, d, r3);
|
||||
} else {
|
||||
// allow access in any mode, like Gens does
|
||||
*(u8 *)(Pico_mcd->word_ram2M+((a^1)&0x3ffff))=d;
|
||||
|
@ -1039,12 +1094,10 @@ void PicoWriteS68k16(u32 a,u16 d)
|
|||
|
||||
// word RAM (2M area)
|
||||
if ((a&0xfc0000)==0x080000) { // 080000-0bffff
|
||||
int r3 = Pico_mcd->s68k_regs[3];
|
||||
wrdprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPcS68k);
|
||||
if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?
|
||||
int bank = !(Pico_mcd->s68k_regs[3]&1);
|
||||
d &= ~0xf0; d |= d >> 8;
|
||||
Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff] = d;
|
||||
dprintf("FIXME: decode");
|
||||
if (r3 & 4) { // 1M decode mode?
|
||||
decode_write16(a, d, r3);
|
||||
} else {
|
||||
// allow access in any mode, like Gens does
|
||||
*(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe))=d;
|
||||
|
@ -1121,14 +1174,11 @@ void PicoWriteS68k32(u32 a,u32 d)
|
|||
|
||||
// word RAM (2M area)
|
||||
if ((a&0xfc0000)==0x080000) { // 080000-0bffff
|
||||
int r3 = Pico_mcd->s68k_regs[3];
|
||||
wrdprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPcS68k);
|
||||
if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?
|
||||
int bank = !(Pico_mcd->s68k_regs[3]&1);
|
||||
a >>= 1;
|
||||
d &= 0x0f0f0f0f; d |= d >> 4;
|
||||
Pico_mcd->word_ram1M[bank][((a+0)^1)&0x1ffff] = d >> 16;
|
||||
Pico_mcd->word_ram1M[bank][((a+1)^1)&0x1ffff] = d;
|
||||
dprintf("FIXME: decode");
|
||||
if (r3 & 4) { // 1M decode mode?
|
||||
decode_write16(a , d >> 16, r3);
|
||||
decode_write16(a+2, d , r3);
|
||||
} else {
|
||||
// allow access in any mode, like Gens does
|
||||
u16 *pm=(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe));
|
||||
|
|
|
@ -141,24 +141,17 @@ void Unload_ISO(void)
|
|||
}
|
||||
|
||||
|
||||
void PicoCDBufferRead(void *dest, int lba);
|
||||
|
||||
|
||||
int FILE_Read_One_LBA_CDC(void)
|
||||
{
|
||||
int where_read = 0;
|
||||
// static char cp_buf[2560];
|
||||
|
||||
if (Pico_mcd->s68k_regs[0x36] & 1) // DATA
|
||||
{
|
||||
if (Pico_mcd->TOC.Tracks[0].F == NULL) return -1;
|
||||
|
||||
if (Pico_mcd->scd.Cur_LBA < 0)
|
||||
where_read = 0;
|
||||
else if (Pico_mcd->scd.Cur_LBA >= Pico_mcd->TOC.Tracks[0].Length)
|
||||
where_read = Pico_mcd->TOC.Tracks[0].Length - 1;
|
||||
else where_read = Pico_mcd->scd.Cur_LBA;
|
||||
|
||||
if (Pico_mcd->TOC.Tracks[0].ftype == TYPE_ISO) where_read <<= 11;
|
||||
else where_read = (where_read * 2352 + 16);
|
||||
|
||||
// moved below..
|
||||
//fseek(Pico_mcd->TOC.Tracks[0].F, where_read, SEEK_SET);
|
||||
//fread(cp_buf, 1, 2048, Pico_mcd->TOC.Tracks[0].F);
|
||||
|
@ -169,7 +162,7 @@ int FILE_Read_One_LBA_CDC(void)
|
|||
{
|
||||
// int rate, channel;
|
||||
|
||||
if (Pico_mcd->TOC.Tracks[Pico_mcd->scd.Cur_Track - 1].ftype == TYPE_MP3)
|
||||
// if (Pico_mcd->TOC.Tracks[Pico_mcd->scd.Cur_Track - 1].ftype == TYPE_MP3)
|
||||
{
|
||||
// TODO
|
||||
// MP3_Update(cp_buf, &rate, &channel, 0);
|
||||
|
@ -189,8 +182,16 @@ int FILE_Read_One_LBA_CDC(void)
|
|||
{
|
||||
if (Pico_mcd->cdc.CTRL.B.B0 & 0x04) // WRRQ : this bit enable write to buffer
|
||||
{
|
||||
int where_read = 0;
|
||||
|
||||
// CAUTION : lookahead bit not implemented
|
||||
|
||||
if (Pico_mcd->scd.Cur_LBA < 0)
|
||||
where_read = 0;
|
||||
else if (Pico_mcd->scd.Cur_LBA >= Pico_mcd->TOC.Tracks[0].Length)
|
||||
where_read = Pico_mcd->TOC.Tracks[0].Length - 1;
|
||||
else where_read = Pico_mcd->scd.Cur_LBA;
|
||||
|
||||
Pico_mcd->scd.Cur_LBA++;
|
||||
|
||||
Pico_mcd->cdc.WA.N = (Pico_mcd->cdc.WA.N + 2352) & 0x7FFF; // add one sector to WA
|
||||
|
@ -199,8 +200,9 @@ int FILE_Read_One_LBA_CDC(void)
|
|||
*(unsigned int *)(Pico_mcd->cdc.Buffer + Pico_mcd->cdc.PT.N) = Pico_mcd->cdc.HEAD.N;
|
||||
//memcpy(&Pico_mcd->cdc.Buffer[Pico_mcd->cdc.PT.N + 4], cp_buf, 2048);
|
||||
|
||||
pm_seek(Pico_mcd->TOC.Tracks[0].F, where_read, SEEK_SET);
|
||||
pm_read(Pico_mcd->cdc.Buffer + Pico_mcd->cdc.PT.N + 4, 2048, Pico_mcd->TOC.Tracks[0].F);
|
||||
//pm_seek(Pico_mcd->TOC.Tracks[0].F, where_read, SEEK_SET);
|
||||
//pm_read(Pico_mcd->cdc.Buffer + Pico_mcd->cdc.PT.N + 4, 2048, Pico_mcd->TOC.Tracks[0].F);
|
||||
PicoCDBufferRead(Pico_mcd->cdc.Buffer + Pico_mcd->cdc.PT.N + 4, where_read);
|
||||
|
||||
#ifdef DEBUG_CD
|
||||
cdprintf("Read -> WA = %d Buffer[%d] =", Pico_mcd->cdc.WA.N, Pico_mcd->cdc.PT.N & 0x3FFF);
|
||||
|
|
|
@ -210,7 +210,7 @@ void gfx_cd_reset(void)
|
|||
|
||||
typedef unsigned short u16;
|
||||
|
||||
// check: Heart of the alien
|
||||
// check: Heart of the alien, jaguar xj 220
|
||||
void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc)
|
||||
{
|
||||
unsigned char *base;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue