ISO loading, menus, LEDs
[picodrive.git] / Pico / cd / LC89510.c
index 96d0966..91b4444 100644 (file)
@@ -1,13 +1,11 @@
-#if 0\r
-#include <stdio.h>\r
-#include <windows.h>\r
-#include "misc.h"\r
-#include "lc89510.h"\r
-#include "cd_aspi.h"\r
-#include "Star_68k.h"\r
-#include "mem_S68k.h"\r
-#include "pcm.h"\r
-#endif\r
+/***********************************************************\r
+ *                                                         *\r
+ * This source is taken from the Gens project              *\r
+ * Written by Stéphane Dallongeville                       *\r
+ * Copyright (c) 2002 by Stéphane Dallongeville            *\r
+ * Modified/adapted for Picodrive by notaz, 2007           *\r
+ *                                                         *\r
+ ***********************************************************/\r
 \r
 #include "../PicoInt.h"\r
 \r
@@ -18,7 +16,7 @@
 #define CDC_DMA_SPEED 256\r
 \r
 int CDC_Decode_Reg_Read;\r
-static int Status_CDC;         // internal status\r
+static int Status_CDC;         // internal status (TODO: 2 context?)\r
 \r
 \r
 static void CDD_Reset(void)\r
@@ -73,129 +71,90 @@ void LC89510_Reset(void)
        Pico_mcd->cdc.Stop_Watch = 0;\r
 }\r
 \r
-#if 0 // TODO\r
-void Update_CDC_TRansfer(void)\r
-{\r
-       unsigned int i, dep, lenght, add_dest;\r
-       unsigned char *dest;\r
-\r
-       if ((Status_CDC & 0x08) == 0) return;\r
-\r
-       switch(Pico_mcd->s68k_regs[4] & 7)\r
-       {\r
-               case 0x0200:                            // MAIN CPU\r
-               case 0x0300:                            // SUB CPU\r
-                       Pico_mcd->s68k_regs[4] |= 0x40; // Data ready in host port\r
-                       return;\r
-\r
-               case 0x0400:            // PCM RAM\r
-                       dest = (unsigned char *) Ram_PCM;\r
-                       dep = ((Pico_mcd->cdc.DMA_Adr & 0x03FF) << 2) + PCM_Chip.Bank;\r
-                       add_dest = 2;\r
-                       break;\r
-\r
-               case 0x0500:            // PRG RAM\r
-                       dest = (unsigned char *) Ram_Prg;\r
-                       dep = (Pico_mcd->cdc.DMA_Adr & 0xFFFF) << 3;\r
-                       add_dest = 2;\r
-//                     cdprintf("DMA transfer PRG RAM : adr = %.8X  ", dep);\r
-                       break;\r
 \r
-               case 0x0700:            // WORD RAM\r
-                       if (Ram_Word_State >= 2)\r
-                       {\r
-                               dest = (unsigned char *) Ram_Word_1M;\r
-                               add_dest = 2;\r
-                               if (Ram_Word_State & 1) dep = ((Pico_mcd->cdc.DMA_Adr & 0x3FFF) << 3);\r
-                               else dep = ((Pico_mcd->cdc.DMA_Adr & 0x3FFF) << 3) + 0x20000;\r
-                       }\r
-                       else\r
-                       {\r
-                               dest = (unsigned char *) Ram_Word_2M;\r
-                               dep = ((Pico_mcd->cdc.DMA_Adr & 0x7FFF) << 3);\r
-                               add_dest = 2;\r
-                       }\r
-                       break;\r
-\r
-               default:\r
-                       return;\r
-       }\r
+void Update_CDC_TRansfer(int which)\r
+{\r
+       unsigned int dep, length, len;\r
+       unsigned short *dest;\r
+       unsigned char  *src;\r
 \r
        if (Pico_mcd->cdc.DBC.N <= (CDC_DMA_SPEED * 2))\r
        {\r
-               lenght = (Pico_mcd->cdc.DBC.N + 1) >> 1;\r
-               Status_CDC &= ~0x08;                            // Last transfer\r
-               Pico_mcd->s68k_regs[4] |=  0x80;                // End data transfer\r
-               Pico_mcd->s68k_regs[4] &= ~0x40;                // no more data ready\r
-               Pico_mcd->cdc.IFSTAT |= 0x08;                   // No more data transfer in progress\r
+               length = (Pico_mcd->cdc.DBC.N + 1) >> 1;\r
+               Status_CDC &= ~0x08;                    // Last transfer\r
+               Pico_mcd->s68k_regs[4] |=  0x80;        // End data transfer\r
+               Pico_mcd->s68k_regs[4] &= ~0x40;        // no more data ready\r
+               Pico_mcd->cdc.IFSTAT |= 0x08;           // No more data transfer in progress\r
 \r
-               if (Pico_mcd->cdc.IFCTRL & 0x40)                // DTEIEN = Data Trasnfer End Interrupt Enable ?\r
+               if (Pico_mcd->cdc.IFCTRL & 0x40)        // DTEIEN = Data Trasnfer End Interrupt Enable ?\r
                {\r
                        Pico_mcd->cdc.IFSTAT &= ~0x40;\r
 \r
-                       if (Int_Mask_S68K & 0x20) sub68k_interrupt(5, -1);\r
-\r
-                       cdprintf("CDC - DTE interrupt\n");\r
+                       if (Pico_mcd->s68k_regs[0x33] & (1<<5))\r
+                       {\r
+                               dprintf("cdc DTE irq 5");\r
+                               SekInterruptS68k(5);\r
+                       }\r
                }\r
        }\r
-       else lenght = CDC_DMA_SPEED;\r
+       else length = CDC_DMA_SPEED;\r
+\r
 \r
-//     cdprintf("DMA lenght = %.4X\n", lenght);\r
+       // TODO: dst bounds checking? DAC.N alignment?\r
+       src = Pico_mcd->cdc.Buffer + Pico_mcd->cdc.DAC.N;\r
 \r
 \r
-       if ((Pico_mcd->s68k_regs[4] & 7) == 4)          // PCM DMA\r
+       if (which == 7) // WORD RAM\r
        {\r
-       __asm\r
+               if (Pico_mcd->s68k_regs[3] & 4)\r
                {\r
-                       mov ecx, lenght\r
-                       mov edi, dest\r
-                       lea esi, Pico_mcd->cdc.Buffer\r
-                       add edi, dep\r
-                       add esi, Pico_mcd->cdc.DAC.N\r
-                       mov ebx, add_dest\r
-\r
-               Loop_DMA_PCM:\r
-                       mov ax, [esi]\r
-                       add esi, 2\r
-                       mov [edi], ax\r
-                       add edi, ebx\r
-                       dec ecx\r
-                       jnz Loop_DMA_PCM\r
+                       dep = ((Pico_mcd->cdc.DMA_Adr & 0x3FFF) << 3);\r
+                       cdprintf("CD DMA # %04x -> word_ram1M # %06x, len=%i",\r
+                                       Pico_mcd->cdc.DAC.N, dep, length);\r
+\r
+                       dep = ((Pico_mcd->cdc.DMA_Adr & 0x3FFF) << 4);\r
+                       if (!(Pico_mcd->s68k_regs[3]&1)) dep += 2;\r
+                       dest = (unsigned short *) (Pico_mcd->word_ram + dep);\r
+\r
+                       for (len = length; len > 0; len--, src+=2, dest+=2)\r
+                               *dest = (src[0]<<8) | src[1];\r
                }\r
+               else\r
+               {\r
+                       dep = ((Pico_mcd->cdc.DMA_Adr & 0x7FFF) << 3);\r
+                       cdprintf("CD DMA # %04x -> word_ram2M # %06x, len=%i",\r
+                                       Pico_mcd->cdc.DAC.N, dep, length);\r
+                       dest = (unsigned short *) (Pico_mcd->word_ram + dep);\r
 \r
-               lenght <<= 1;\r
-               Pico_mcd->cdc.DMA_Adr += lenght >> 2;\r
+                       for (len = length; len > 0; len--, src+=2, dest++)\r
+                               *dest = (src[0]<<8) | src[1];\r
+               }\r
        }\r
-       else                                                                    // OTHER DMA\r
+       else if (which == 4) // PCM RAM\r
        {\r
-               __asm\r
-               {\r
-                       mov ecx, lenght\r
-                       mov edi, dest\r
-                       lea esi, Pico_mcd->cdc.Buffer\r
-                       add edi, dep\r
-                       add esi, Pico_mcd->cdc.DAC.N\r
-                       mov ebx, add_dest\r
-\r
-               Loop_DMA:\r
-                       mov ax, [esi]\r
-                       add esi, 2\r
-                       rol ax, 8\r
-                       mov [edi], ax\r
-                       add edi, ebx\r
-                       dec ecx\r
-                       jnz Loop_DMA\r
-               }\r
+#if 0\r
+                       dest = (unsigned char *) Ram_PCM;\r
+                       dep = ((Pico_mcd->cdc.DMA_Adr & 0x03FF) << 2) + PCM_Chip.Bank;\r
+#else\r
+                       cdprintf("TODO: PCM Dma");\r
+#endif\r
+       }\r
+       else if (which == 5) // PRG RAM\r
+       {\r
+               dep = (Pico_mcd->cdc.DMA_Adr & 0xFFFF) << 3;\r
+               dest = (unsigned short *) (Pico_mcd->prg_ram + dep);\r
+               cdprintf("CD DMA # %04x -> prg_ram # %06x, len=%i",\r
+                               Pico_mcd->cdc.DAC.N, dep, length);\r
 \r
-               lenght <<= 1;\r
-               Pico_mcd->cdc.DMA_Adr += lenght >> 3;\r
+               for (len = length; len > 0; len--, src+=2, dest++)\r
+                       *dest = (src[0]<<8) | src[1];\r
        }\r
 \r
-       Pico_mcd->cdc.DAC.N = (Pico_mcd->cdc.DAC.N + lenght) & 0xFFFF;\r
-       if (Status_CDC & 0x08) Pico_mcd->cdc.DBC.N -= lenght;\r
+       length <<= 1;\r
+       Pico_mcd->cdc.DAC.N = (Pico_mcd->cdc.DAC.N + length) & 0xFFFF;\r
+       if (Status_CDC & 0x08) Pico_mcd->cdc.DBC.N -= length;\r
        else Pico_mcd->cdc.DBC.N = 0;\r
 }\r
-#endif\r
 \r
 \r
 unsigned short Read_CDC_Host(int is_sub)\r
@@ -592,7 +551,7 @@ void CDD_Import_Command(void)
                                        Get_Current_Track_CDD_c22();\r
                                        break;\r
 \r
-                               case 0x3:       // get total lenght (MSF format)\r
+                               case 0x3:       // get total length (MSF format)\r
                                        Pico_mcd->cdd.Status = (Pico_mcd->cdd.Status & 0xFF00) | 3;\r
                                        Get_Total_Lenght_CDD_c23();\r
                                        break;\r