-#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
#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
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
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