| version 1.1.1.1, 2003/10/16 17:58:01 | version 1.8, 2004/06/02 11:02:53 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
| #include        "memory.h" | #include        "cpucore.h" | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 | #include        "iocore.h" | #include        "iocore.h" | 
 | #include        "cs4231io.h" | #include        "cs4231io.h" | 
| Line 7 | Line 7 | 
 | #include        "fmboard.h" | #include        "fmboard.h" | 
 |  |  | 
 |  |  | 
| static void IOOUTCALL csctrl_oc24(UINT port, BYTE dat) { | static const UINT8 cs4231dma[] = {0xff,0x00,0x01,0x03,0xff,0xff,0xff,0xff}; | 
|  | static const UINT8 cs4231irq[] = {0xff,0x03,0x06,0x0a,0x0c,0xff,0xff,0xff}; | 
|  |  | 
|  |  | 
|  | static void IOOUTCALL csctrl_oc24(UINT port, REG8 dat) { | 
 |  |  | 
 | cs4231.portctrl = dat; | cs4231.portctrl = dat; | 
 | (void)port; | (void)port; | 
 | } | } | 
 |  |  | 
| static void IOOUTCALL csctrl_oc2b(UINT port, BYTE dat) { | static void IOOUTCALL csctrl_oc2b(UINT port, REG8 dat) { | 
 |  |  | 
 | if ((cs4231.portctrl & 0x2f) == 0x20) { | if ((cs4231.portctrl & 0x2f) == 0x20) { | 
 | cs4231.port &= 0xff00; | cs4231.port &= 0xff00; | 
| Line 22  static void IOOUTCALL csctrl_oc2b(UINT p | Line 26  static void IOOUTCALL csctrl_oc2b(UINT p | 
 | (void)port; | (void)port; | 
 | } | } | 
 |  |  | 
| static void IOOUTCALL csctrl_oc2d(UINT port, BYTE dat) { | static void IOOUTCALL csctrl_oc2d(UINT port, REG8 dat) { | 
 |  |  | 
 | if ((cs4231.portctrl & 0x2f) == 0x20) { | if ((cs4231.portctrl & 0x2f) == 0x20) { | 
 | cs4231.port &= 0x00ff; | cs4231.port &= 0x00ff; | 
| Line 31  static void IOOUTCALL csctrl_oc2d(UINT p | Line 35  static void IOOUTCALL csctrl_oc2d(UINT p | 
 | (void)port; | (void)port; | 
 | } | } | 
 |  |  | 
| static BYTE IOINPCALL csctrl_ic24(UINT port) { | static REG8 IOINPCALL csctrl_ic24(UINT port) { | 
 |  |  | 
 | (void)port; | (void)port; | 
 | return(0x80 | cs4231.portctrl); | return(0x80 | cs4231.portctrl); | 
 | } | } | 
 |  |  | 
| static BYTE IOINPCALL csctrl_ic2b(UINT port) { | static REG8 IOINPCALL csctrl_ic2b(UINT port) { | 
 |  |  | 
 | switch(cs4231.portctrl & 0x0f) { | switch(cs4231.portctrl & 0x0f) { | 
 | case 0x00: | case 0x00: | 
| Line 53  static BYTE IOINPCALL csctrl_ic2b(UINT p | Line 57  static BYTE IOINPCALL csctrl_ic2b(UINT p | 
 | return(0xff); | return(0xff); | 
 | } | } | 
 |  |  | 
| static BYTE IOINPCALL csctrl_ic2d(UINT port) { | static REG8 IOINPCALL csctrl_ic2d(UINT port) { | 
 |  |  | 
 | switch(cs4231.portctrl & 0x0f) { | switch(cs4231.portctrl & 0x0f) { | 
 | case 0x00: | case 0x00: | 
| Line 74  static BYTE IOINPCALL csctrl_ic2d(UINT p | Line 78  static BYTE IOINPCALL csctrl_ic2d(UINT p | 
 |  |  | 
 | void cs4231io_reset(void) { | void cs4231io_reset(void) { | 
 |  |  | 
| cs4231.enable = 0; | cs4231.enable = 1; | 
| cs4231.port = 0xffff; | cs4231.port = 0xf40; | 
|  | cs4231.adrs = 0x22; | 
|  | cs4231.dmairq = cs4231irq[(cs4231.adrs >> 3) & 7]; | 
|  | cs4231.dmach = cs4231dma[cs4231.adrs & 7]; | 
|  | if (cs4231.dmach != 0xff) { | 
|  | dmac_attach(DMADEV_CS4231, cs4231.dmach); | 
|  | } | 
|  | TRACEOUT(("CS4231 - IRQ = %d", cs4231.dmairq)); | 
|  | TRACEOUT(("CS4231 - DMA channel = %d", cs4231.dmach)); | 
 | } | } | 
 |  |  | 
 | void cs4231io_bind(void) { | void cs4231io_bind(void) { | 
 |  |  | 
 | cs4231.enable = 1; |  | 
 | cs4231.port = 0xf40; |  | 
 | cs4231.adrs = 0x21; |  | 
 | cs4231.dmach = 0; |  | 
 | cs4231.dmairq = 0x0c; |  | 
 | cs4231.step = 22050; |  | 
 | sound_streamregist(&cs4231, (SOUNDCB)cs4231_getpcm); | sound_streamregist(&cs4231, (SOUNDCB)cs4231_getpcm); | 
 |  |  | 
 | iocore_attachout(0xc24, csctrl_oc24); | iocore_attachout(0xc24, csctrl_oc24); | 
 | iocore_attachout(0xc2b, csctrl_oc2b); | iocore_attachout(0xc2b, csctrl_oc2b); | 
 | iocore_attachout(0xc2d, csctrl_oc2d); | iocore_attachout(0xc2d, csctrl_oc2d); | 
| Line 96  void cs4231io_bind(void) { | Line 101  void cs4231io_bind(void) { | 
 | iocore_attachinp(0xc2d, csctrl_ic2d); | iocore_attachinp(0xc2d, csctrl_ic2d); | 
 | } | } | 
 |  |  | 
| void IOOUTCALL cs4231io_w8(UINT port, BYTE value) { | void IOOUTCALL cs4231io_w8(UINT port, REG8 value) { | 
 |  |  | 
 | switch(port & 0x0f) { | switch(port & 0x0f) { | 
 | case 0: | case 0: | 
 | #if 0 |  | 
 | cs4231.adrs = value; | cs4231.adrs = value; | 
| cs4231.dmairq = dmairq[(value >> 3) & 3]; | cs4231.dmairq = cs4231irq[(value >> 3) & 7]; | 
| cs4231.dmach = dmach[value & 7]; | cs4231.dmach = cs4231dma[value & 7]; | 
|  | dmac_detach(DMADEV_CS4231); | 
|  | if (cs4231.dmach != 0xff) { | 
|  | dmac_attach(DMADEV_CS4231, cs4231.dmach); | 
|  | #if 0 | 
|  | if (cs4231.sdc_enable) { | 
|  | dmac.dmach[cs4231.dmach].ready = 1; | 
|  | dmac_check(); | 
|  | } | 
 | #endif | #endif | 
 |  | } | 
 | break; | break; | 
 |  |  | 
 | case 4: | case 4: | 
| Line 118  void IOOUTCALL cs4231io_w8(UINT port, BY | Line 131  void IOOUTCALL cs4231io_w8(UINT port, BY | 
 | case 6: | case 6: | 
 | cs4231.intflag = 0; | cs4231.intflag = 0; | 
 | break; | break; | 
 |  |  | 
 |  | case 7: | 
 |  | cs4231_datasend(value); | 
 |  | break; | 
 | } | } | 
 | } | } | 
 |  |  | 
| BYTE IOINPCALL cs4231io_r8(UINT port) { | REG8 IOINPCALL cs4231io_r8(UINT port) { | 
 |  |  | 
 | switch(port & 0x0f) { | switch(port & 0x0f) { | 
 | case 0: | case 0: |