X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=Pico%2Fcd%2FLC89510.c;h=e821c615962f04d0d612b9c26601bf8f8411a4b8;hb=7a1f6e45c9f6a11152f62303b0203475a9fd431a;hp=1f00607392d7dffd031c00a286422ecd8e247cf7;hpb=fa1e5e2948e9b06dec3353081081173f7ae4d742;p=picodrive.git diff --git a/Pico/cd/LC89510.c b/Pico/cd/LC89510.c index 1f00607..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]; @@ -112,13 +110,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 +126,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 +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]); }