DOSBox-X
|
00001 #include "compiler.h" 00002 #include "pccore.h" 00003 #include "iocore.h" 00004 #include "cbuscore.h" 00005 #include "board118.h" 00006 #include "cs4231io.h" 00007 #include "sound.h" 00008 #include "fmboard.h" 00009 #include "s98.h" 00010 00011 00012 static void IOOUTCALL ymf_o188(UINT port, REG8 dat) { 00013 00014 opn.addr = dat; 00015 opn.data = dat; 00016 (void)port; 00017 } 00018 00019 static void IOOUTCALL ymf_o18a(UINT port, REG8 dat) { 00020 00021 UINT addr; 00022 00023 opn.data = dat; 00024 addr = opn.addr; 00025 if (addr >= 0x100) { 00026 return; 00027 } 00028 S98_put(NORMAL2608, addr, dat); 00029 if (addr < 0x10) { 00030 if (addr != 0x0e) { 00031 psggen_setreg(&psg1, addr, dat); 00032 } 00033 } 00034 else { 00035 if (addr < 0x20) { 00036 rhythm_setreg(&rhythm, addr, dat); 00037 } 00038 else if (addr < 0x30) { 00039 if (addr == 0x28) { 00040 if ((dat & 0x0f) < 3) { 00041 opngen_keyon(dat & 0x0f, dat); 00042 } 00043 else if (((dat & 0x0f) != 3) && 00044 ((dat & 0x0f) < 7)) { 00045 opngen_keyon((dat & 0x07) - 1, dat); 00046 } 00047 } 00048 else { 00049 fmtimer_setreg(addr, dat); 00050 } 00051 } 00052 else if (addr < 0xc0) { 00053 opngen_setreg(0, addr, dat); 00054 } 00055 opn.reg[addr] = dat; 00056 } 00057 (void)port; 00058 } 00059 00060 static void IOOUTCALL ymf_o18c(UINT port, REG8 dat) { 00061 00062 if (opn.extend) { 00063 opn.addr = dat + 0x100; 00064 opn.data = dat; 00065 } 00066 (void)port; 00067 } 00068 00069 static void IOOUTCALL ymf_o18e(UINT port, REG8 dat) { 00070 00071 UINT addr; 00072 00073 if (!opn.extend) { 00074 return; 00075 } 00076 opn.data = dat; 00077 addr = opn.addr - 0x100; 00078 if (addr >= 0x100) { 00079 return; 00080 } 00081 S98_put(EXTEND2608, addr, dat); 00082 opn.reg[addr + 0x100] = dat; 00083 if (addr >= 0x30) { 00084 opngen_setreg(3, addr, dat); 00085 } 00086 else { 00087 if (addr == 0x10) { 00088 if (!(dat & 0x80)) { 00089 opn.adpcmmask = ~(dat & 0x1c); 00090 } 00091 } 00092 } 00093 (void)port; 00094 } 00095 00096 static REG8 IOINPCALL ymf_i188(UINT port) { 00097 00098 (void)port; 00099 return(fmtimer.status); 00100 } 00101 00102 static REG8 IOINPCALL ymf_i18a(UINT port) { 00103 00104 UINT addr; 00105 00106 addr = opn.addr; 00107 if (addr == 0x0e) { 00108 return(fmboard_getjoy(&psg1)); 00109 } 00110 else if (addr < 0x10) { 00111 return(psggen_getreg(&psg1, addr)); 00112 } 00113 else if (addr == 0xff) { 00114 return(1); 00115 } 00116 else { 00117 (void)port; 00118 return(opn.data); 00119 } 00120 } 00121 00122 static REG8 IOINPCALL ymf_i18c(UINT port) { 00123 00124 if (opn.extend) { 00125 return(fmtimer.status & 3); 00126 } 00127 (void)port; 00128 return(0xff); 00129 } 00130 00131 static void extendchannel(REG8 enable) { 00132 00133 opn.extend = enable; 00134 if (enable) { 00135 opn.channels = 6; 00136 opngen_setcfg(6, OPN_STEREO | 0x007); 00137 } 00138 else { 00139 opn.channels = 3; 00140 opngen_setcfg(3, OPN_MONORAL | 0x007); 00141 rhythm_setreg(&rhythm, 0x10, 0xff); 00142 } 00143 } 00144 00145 static void IOOUTCALL ymf_oa460(UINT port, REG8 dat) { 00146 00147 cs4231.extfunc = dat; 00148 extendchannel((REG8)(dat & 1)); 00149 (void)port; 00150 } 00151 00152 static REG8 IOINPCALL ymf_ia460(UINT port) { 00153 00154 (void)port; 00155 return(0x80 | (cs4231.extfunc & 1)); 00156 } 00157 00158 00159 // ---- 00160 00161 static const IOOUT ymf_o[4] = { 00162 ymf_o188, ymf_o18a, ymf_o18c, ymf_o18e}; 00163 00164 static const IOINP ymf_i[4] = { 00165 ymf_i188, ymf_i18a, ymf_i18c, NULL}; 00166 00167 00168 void board118_reset(const NP2CFG *pConfig) { 00169 00170 fmtimer_reset(0xc0); 00171 opngen_setcfg(3, OPN_STEREO | 0x038); 00172 cs4231io_reset(); 00173 soundrom_load(0xcc000, OEMTEXT("118")); 00174 fmboard_extreg(extendchannel); 00175 00176 (void)pConfig; 00177 } 00178 00179 void board118_bind(void) { 00180 00181 fmboard_fmrestore(0, 0); 00182 fmboard_fmrestore(3, 1); 00183 psggen_restore(&psg1); 00184 fmboard_rhyrestore(&rhythm, 0); 00185 sound_streamregist(&opngen, (SOUNDCB)opngen_getpcm); 00186 sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm); 00187 rhythm_bind(&rhythm); 00188 cs4231io_bind(); 00189 cbuscore_attachsndex(0x188, ymf_o, ymf_i); 00190 iocore_attachout(0xa460, ymf_oa460); 00191 iocore_attachinp(0xa460, ymf_ia460); 00192 } 00193