X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FLC89510.c;h=e821c615962f04d0d612b9c26601bf8f8411a4b8;hb=7a1f6e45c9f6a11152f62303b0203475a9fd431a;hp=2549fa8e93b80390de5c44a5c647aac68b14edac;hpb=1cd356a33daf2eec34e52c075b06d62866f5fb2f;p=picodrive.git diff --git a/Pico/cd/LC89510.c b/Pico/cd/LC89510.c index 2549fa8..e821c61 100644 --- a/Pico/cd/LC89510.c +++ b/Pico/cd/LC89510.c @@ -37,9 +37,7 @@ static void CDC_Reset(void) { // Reseting CDC - memset(Pico_mcd->cdc.Buffer, 0, (16 * 1024 * 2) + 2352); - - CDC_Update_Header(); + memset(Pico_mcd->cdc.Buffer, 0, sizeof(Pico_mcd->cdc.Buffer)); Pico_mcd->cdc.COMIN = 0; Pico_mcd->cdc.IFSTAT = 0xFF; @@ -70,7 +68,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 +94,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]; @@ -104,20 +102,19 @@ void Update_CDC_TRansfer(int which) { if (Pico_mcd->s68k_regs[3] & 4) { + // test: Final Fight + int bank = !(Pico_mcd->s68k_regs[3]&1); dep = ((DMA_Adr & 0x3FFF) << 3); cdprintf("CD DMA # %04x -> word_ram1M # %06x, len=%i", Pico_mcd->cdc.DAC.N, dep, length); - dep = ((DMA_Adr & 0x3FFF) << 4); - if (!(Pico_mcd->s68k_regs[3]&1)) dep += 2; - dest = (unsigned short *) (Pico_mcd->word_ram + dep); + dest = (unsigned short *) (Pico_mcd->word_ram1M[bank] + dep); - for (len = length; len > 0; len--, src+=2, dest+=2) - *dest = (src[0]<<8) | src[1]; + memcpy16bswap(dest, src, length); { // debug - unsigned char *b1 = Pico_mcd->word_ram + dep; - unsigned char *b2 = (unsigned char *)dest - 8; + unsigned char *b1 = Pico_mcd->word_ram1M[bank] + dep; + 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]); } @@ -127,27 +124,28 @@ void Update_CDC_TRansfer(int which) dep = ((DMA_Adr & 0x7FFF) << 3); cdprintf("CD DMA # %04x -> word_ram2M # %06x, len=%i", Pico_mcd->cdc.DAC.N, dep, length); - dest = (unsigned short *) (Pico_mcd->word_ram + dep); + 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_ram + dep; - unsigned char *b2 = (unsigned char *)dest - 4; + unsigned char *b1 = Pico_mcd->word_ram2M + dep; + 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 - cdprintf("CD DMA # %04x -> PCM TODO", 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 { @@ -156,12 +154,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]); } @@ -188,7 +185,7 @@ unsigned short Read_CDC_Host(int is_sub) if (!(Pico_mcd->scd.Status_CDC & 0x08)) { // Transfer data disabled - cdprintf("Read_CDC_Host: Transfer data disabled"); + cdprintf("Read_CDC_Host FIXME: Transfer data disabled"); return 0; } @@ -196,7 +193,7 @@ unsigned short Read_CDC_Host(int is_sub) (!is_sub && (Pico_mcd->s68k_regs[4] & 7) != 2)) { // Wrong setting - cdprintf("Read_CDC_Host: Wrong setting"); + cdprintf("Read_CDC_Host FIXME: Wrong setting"); return 0; }