DOSBox-X
|
00001 #include "compiler.h" 00002 #include "cpucore.h" 00003 #include "pccore.h" 00004 #include "iocore.h" 00005 #include "cs4231io.h" 00006 #include "sound.h" 00007 #include "fmboard.h" 00008 00009 00010 static const UINT8 cs4231dma[] = {0xff,0x00,0x01,0x03,0xff,0xff,0xff,0xff}; 00011 static const UINT8 cs4231irq[] = {0xff,0x03,0x06,0x0a,0x0c,0xff,0xff,0xff}; 00012 00013 00014 static void IOOUTCALL csctrl_oc24(UINT port, REG8 dat) { 00015 00016 cs4231.portctrl = dat; 00017 (void)port; 00018 } 00019 00020 static void IOOUTCALL csctrl_oc2b(UINT port, REG8 dat) { 00021 00022 UINT num; 00023 00024 if ((cs4231.portctrl & 0x28) == 0x20) { 00025 num = cs4231.portctrl & 7; 00026 if ((num == 0) || (num == 5)) { 00027 cs4231.port[num] &= 0xff00; 00028 cs4231.port[num] |= dat; 00029 } 00030 } 00031 (void)port; 00032 } 00033 00034 static void IOOUTCALL csctrl_oc2d(UINT port, REG8 dat) { 00035 00036 UINT num; 00037 00038 if ((cs4231.portctrl & 0x2f) == 0x20) { 00039 num = cs4231.portctrl & 7; 00040 if ((num == 0) || (num == 5)) { 00041 cs4231.port[num] &= 0x00ff; 00042 cs4231.port[num] |= (dat << 8); 00043 } 00044 } 00045 (void)port; 00046 } 00047 00048 static REG8 IOINPCALL csctrl_ic24(UINT port) { 00049 00050 (void)port; 00051 return(0x80 | cs4231.portctrl); 00052 } 00053 00054 static REG8 IOINPCALL csctrl_ic2b(UINT port) { 00055 00056 UINT num; 00057 00058 (void)port; 00059 num = cs4231.portctrl & 0x07; 00060 return((REG8)(cs4231.port[num] & 0xff)); 00061 } 00062 00063 static REG8 IOINPCALL csctrl_ic2d(UINT port) { 00064 00065 UINT num; 00066 00067 (void)port; 00068 num = cs4231.portctrl & 0x07; 00069 return((REG8)(cs4231.port[num] >> 8)); 00070 } 00071 00072 00073 // ---- 00074 00075 void cs4231io_reset(void) { 00076 00077 cs4231.enable = 1; 00078 cs4231.adrs = 0x22; 00079 cs4231.dmairq = cs4231irq[(cs4231.adrs >> 3) & 7]; 00080 cs4231.dmach = cs4231dma[cs4231.adrs & 7]; 00081 if (cs4231.dmach != 0xff) { 00082 dmac_attach(DMADEV_CS4231, cs4231.dmach); 00083 } 00084 cs4231.port[0] = 0x0f40; 00085 cs4231.port[1] = 0xa460; 00086 cs4231.port[2] = 0x0f48; 00087 cs4231.port[4] = 0x0188; 00088 cs4231.port[5] = 0x0f4a; 00089 00090 TRACEOUT(("CS4231 - IRQ = %d", cs4231.dmairq)); 00091 TRACEOUT(("CS4231 - DMA channel = %d", cs4231.dmach)); 00092 } 00093 00094 void cs4231io_bind(void) { 00095 00096 sound_streamregist(&cs4231, (SOUNDCB)cs4231_getpcm); 00097 iocore_attachout(0xc24, csctrl_oc24); 00098 iocore_attachout(0xc2b, csctrl_oc2b); 00099 iocore_attachout(0xc2d, csctrl_oc2d); 00100 iocore_attachinp(0xc24, csctrl_ic24); 00101 iocore_attachinp(0xc2b, csctrl_ic2b); 00102 iocore_attachinp(0xc2d, csctrl_ic2d); 00103 } 00104 00105 void IOOUTCALL cs4231io0_w8(UINT port, REG8 value) { 00106 00107 switch(port - cs4231.port[0]) { 00108 case 0x00: 00109 cs4231.adrs = value; 00110 cs4231.dmairq = cs4231irq[(value >> 3) & 7]; 00111 cs4231.dmach = cs4231dma[value & 7]; 00112 dmac_detach(DMADEV_CS4231); 00113 if (cs4231.dmach != 0xff) { 00114 dmac_attach(DMADEV_CS4231, cs4231.dmach); 00115 #if 0 00116 if (cs4231.sdc_enable) { 00117 dmac.dmach[cs4231.dmach].ready = 1; 00118 dmac_check(); 00119 } 00120 #endif 00121 } 00122 break; 00123 00124 case 0x04: 00125 cs4231.index = value; 00126 break; 00127 00128 case 0x05: 00129 cs4231_control(cs4231.index & 0x1f, value); 00130 break; 00131 00132 case 0x06: 00133 cs4231.intflag = 0; 00134 break; 00135 00136 case 0x07: 00137 cs4231_datasend(value); 00138 break; 00139 } 00140 } 00141 00142 REG8 IOINPCALL cs4231io0_r8(UINT port) { 00143 00144 switch(port - cs4231.port[0]) { 00145 case 0x00: 00146 return(cs4231.adrs); 00147 00148 case 0x03: 00149 return(0x04); 00150 00151 case 0x04: 00152 return(cs4231.index & 0x7f); 00153 00154 case 0x05: 00155 return(*(((UINT8 *)(&cs4231.reg)) + (cs4231.index & 0x1f))); 00156 00157 case 0x06: 00158 return(cs4231.intflag); 00159 00160 } 00161 return(0); 00162 } 00163 00164 void IOOUTCALL cs4231io5_w8(UINT port, REG8 value) { 00165 00166 switch(port - cs4231.port[5]) { 00167 case 0x00: 00168 cs4231.extindex = value; 00169 break; 00170 } 00171 } 00172 00173 REG8 IOINPCALL cs4231io5_r8(UINT port) { 00174 00175 switch(port - cs4231.port[5]) { 00176 case 0x00: 00177 return(cs4231.extindex); 00178 00179 case 0x01: 00180 if (cs4231.extindex == 1) { 00181 return(0); // means opna int5 00182 } 00183 break; 00184 } 00185 return(0xff); 00186 } 00187