buffering, PCM DMA, memcpy12bswap
[picodrive.git] / Pico / cd / LC89510.c
index 1f00607..0934456 100644 (file)
@@ -70,7 +70,7 @@ void LC89510_Reset(void)
 \r
 void Update_CDC_TRansfer(int which)\r
 {\r
-       unsigned int DMA_Adr, dep, length, len;\r
+       unsigned int DMA_Adr, dep, length;\r
        unsigned short *dest;\r
        unsigned char  *src;\r
 \r
@@ -96,7 +96,7 @@ void Update_CDC_TRansfer(int which)
        else length = CDC_DMA_SPEED;\r
 \r
 \r
-       // TODO: dst bounds checking? DAC.N alignment?\r
+       // TODO: dst bounds checking?\r
        src = Pico_mcd->cdc.Buffer + Pico_mcd->cdc.DAC.N;\r
        DMA_Adr = (Pico_mcd->s68k_regs[0xA]<<8) | Pico_mcd->s68k_regs[0xB];\r
 \r
@@ -112,13 +112,11 @@ void Update_CDC_TRansfer(int which)
 \r
                        dest = (unsigned short *) (Pico_mcd->word_ram1M[bank] + dep);\r
 \r
-                       // TODO: bswapcpy\r
-                       for (len = length; len > 0; len--, src+=2, dest++)\r
-                               *dest = (src[0]<<8) | src[1];\r
+                       memcpy16bswap(dest, src, length);\r
 \r
                        { // debug\r
                                unsigned char *b1 = Pico_mcd->word_ram1M[bank] + dep;\r
-                               unsigned char *b2 = (unsigned char *)dest - 8;\r
+                               unsigned char *b2 = (unsigned char *)(dest+length) - 8;\r
                                dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x",\r
                                        b1[0], b1[1], b1[4], b1[5], b2[0], b2[1], b2[4], b2[5]);\r
                        }\r
@@ -130,25 +128,26 @@ void Update_CDC_TRansfer(int which)
                                        Pico_mcd->cdc.DAC.N, dep, length);\r
                        dest = (unsigned short *) (Pico_mcd->word_ram2M + dep);\r
 \r
-                       for (len = length; len > 0; len--, src+=2, dest++)\r
-                               *dest = (src[0]<<8) | src[1];\r
+                       memcpy16bswap(dest, src, length);\r
 \r
                        { // debug\r
                                unsigned char *b1 = Pico_mcd->word_ram2M + dep;\r
-                               unsigned char *b2 = (unsigned char *)dest - 4;\r
+                               unsigned char *b2 = (unsigned char *)(dest+length) - 4;\r
                                dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x",\r
                                        b1[0], b1[1], b1[2], b1[3], b2[0], b2[1], b2[2], b2[3]);\r
                        }\r
                }\r
        }\r
-       else if (which == 4) // PCM RAM\r
+       else if (which == 4) // PCM RAM (check: popful Mail)\r
        {\r
-#if 0\r
-                       dest = (unsigned char *) Ram_PCM;\r
-                       dep = ((DMA_Adr & 0x03FF) << 2) + PCM_Chip.Bank;\r
-#else\r
-                       dprintf("FIXME: CD DMA # %04x -> PCM", Pico_mcd->cdc.DAC.N);\r
-#endif\r
+               dep = (DMA_Adr & 0x03FF) << 2;\r
+               dprintf("CD DMA # %04x -> PCM[%i] # %04x, len=%i",\r
+                       Pico_mcd->cdc.DAC.N, Pico_mcd->pcm.bank, dep, length);\r
+               dest = (unsigned short *) (Pico_mcd->pcm_ram_b[Pico_mcd->pcm.bank] + dep);\r
+\r
+               if (Pico_mcd->cdc.DAC.N & 1) /* unaligned src? */\r
+                       memcpy(dest, src, length*2);\r
+               else    memcpy16(dest, (unsigned short *) src, length);\r
        }\r
        else if (which == 5) // PRG RAM\r
        {\r
@@ -157,12 +156,11 @@ void Update_CDC_TRansfer(int which)
                cdprintf("CD DMA # %04x -> prg_ram # %06x, len=%i",\r
                                Pico_mcd->cdc.DAC.N, dep, length);\r
 \r
-               for (len = length; len > 0; len--, src+=2, dest++)\r
-                       *dest = (src[0]<<8) | src[1];\r
+               memcpy16bswap(dest, src, length);\r
 \r
                { // debug\r
                        unsigned char *b1 = Pico_mcd->prg_ram + dep;\r
-                       unsigned char *b2 = (unsigned char *)dest - 4;\r
+                       unsigned char *b2 = (unsigned char *)(dest+length) - 4;\r
                        dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x",\r
                                b1[0], b1[1], b1[2], b1[3], b2[0], b2[1], b2[2], b2[3]);\r
                }\r