DOSBox-X
|
00001 #include "np2glue.h" 00002 //#include "compiler.h" 00003 //#include "pccore.h" 00004 //#include "iocore.h" 00005 //#include "cbuscore.h" 00006 #include "board86.h" 00007 #include "pcm86io.h" 00008 #include "sound.h" 00009 #include "fmboard.h" 00010 #include "s98.h" 00011 00012 00013 static void IOOUTCALL opna_o188(UINT port, REG8 dat) { 00014 00015 opn.addr = dat; 00016 opn.data = dat; 00017 (void)port; 00018 } 00019 00020 static void IOOUTCALL opna_o18a(UINT port, REG8 dat) { 00021 00022 UINT addr; 00023 00024 opn.data = dat; 00025 addr = opn.addr; 00026 if (addr >= 0x100) { 00027 return; 00028 } 00029 S98_put(NORMAL2608, addr, dat); 00030 if (addr < 0x10) { 00031 if (addr != 0x0e) { 00032 psggen_setreg(&psg1, addr, dat); 00033 } 00034 } 00035 else { 00036 if (addr < 0x20) { 00037 if (opn.extend) { 00038 rhythm_setreg(&rhythm, addr, dat); 00039 } 00040 } 00041 else if (addr < 0x30) { 00042 if (addr == 0x28) { 00043 if ((dat & 0x0f) < 3) { 00044 opngen_keyon(dat & 0x0f, dat); 00045 } 00046 else if (((dat & 0x0f) != 3) && 00047 ((dat & 0x0f) < 7)) { 00048 opngen_keyon((dat & 0x07) - 1, dat); 00049 } 00050 } 00051 else { 00052 fmtimer_setreg(addr, dat); 00053 if (addr == 0x27) { 00054 opnch[2].extop = dat & 0xc0; 00055 } 00056 } 00057 } 00058 else if (addr < 0xc0) { 00059 opngen_setreg(0, addr, dat); 00060 } 00061 opn.reg[addr] = dat; 00062 } 00063 (void)port; 00064 } 00065 00066 static void IOOUTCALL opna_o18c(UINT port, REG8 dat) { 00067 00068 if (opn.extend) { 00069 opn.addr = dat + 0x100; 00070 opn.data = dat; 00071 } 00072 (void)port; 00073 } 00074 00075 static void IOOUTCALL opna_o18e(UINT port, REG8 dat) { 00076 00077 UINT addr; 00078 00079 if (!opn.extend) { 00080 return; 00081 } 00082 opn.data = dat; 00083 addr = opn.addr - 0x100; 00084 if (addr >= 0x100) { 00085 return; 00086 } 00087 S98_put(EXTEND2608, addr, dat); 00088 opn.reg[addr + 0x100] = dat; 00089 if (addr >= 0x30) { 00090 opngen_setreg(3, addr, dat); 00091 } 00092 else { 00093 if (addr == 0x10) { 00094 if (!(dat & 0x80)) { 00095 opn.adpcmmask = ~(dat & 0x1c); 00096 } 00097 } 00098 } 00099 (void)port; 00100 } 00101 00102 static REG8 IOINPCALL opna_i188(UINT port) { 00103 00104 (void)port; 00105 return(fmtimer.status); 00106 } 00107 00108 static REG8 IOINPCALL opna_i18a(UINT port) { 00109 00110 UINT addr; 00111 00112 addr = opn.addr; 00113 if (addr == 0x0e) { 00114 return(fmboard_getjoy(&psg1)); 00115 } 00116 else if (addr < 0x10) { 00117 return(psggen_getreg(&psg1, addr)); 00118 } 00119 else if (addr == 0xff) { 00120 return(1); 00121 } 00122 (void)port; 00123 return(opn.data); 00124 } 00125 00126 static REG8 IOINPCALL opna_i18c(UINT port) { 00127 00128 if (opn.extend) { 00129 return((fmtimer.status & 3) | (opn.adpcmmask & 8)); 00130 } 00131 (void)port; 00132 return(0xff); 00133 } 00134 00135 static REG8 IOINPCALL opna_i18e(UINT port) { 00136 00137 if (opn.extend) { 00138 UINT addr = opn.addr - 0x100; 00139 if ((addr == 0x08) || (addr == 0x0f)) { 00140 return(opn.reg[addr + 0x100]); 00141 } 00142 return(opn.data); 00143 } 00144 (void)port; 00145 return(0xff); 00146 } 00147 00148 static void extendchannel(REG8 enable) { 00149 00150 opn.extend = enable; 00151 if (enable) { 00152 opn.channels = 6; 00153 opngen_setcfg(6, OPN_STEREO | 0x007); 00154 } 00155 else { 00156 opn.channels = 3; 00157 opngen_setcfg(3, OPN_MONORAL | 0x007); 00158 rhythm_setreg(&rhythm, 0x10, 0xff); 00159 } 00160 } 00161 00162 00163 // ---- 00164 00165 static const IOOUT opna_o[4] = { 00166 opna_o188, opna_o18a, opna_o18c, opna_o18e}; 00167 00168 static const IOINP opna_i[4] = { 00169 opna_i188, opna_i18a, opna_i18c, opna_i18e}; 00170 00171 00172 void board86_reset(const NP2CFG *pConfig) { 00173 00174 fmtimer_reset((pConfig->snd86opt & 0x10) | 00175 ((pConfig->snd86opt & 0x4) << 5) | 00176 ((pConfig->snd86opt & 0x8) << 3)); 00177 opngen_setcfg(3, OPN_STEREO | 0x038); 00178 if (pConfig->snd86opt & 2) { 00179 soundrom_load(0xcc000, OEMTEXT("86")); 00180 } 00181 opn.base = (pConfig->snd86opt & 0x01)?0x000:0x100; 00182 fmboard_extreg(extendchannel); 00183 } 00184 00185 void board86_bind(void) { 00186 00187 fmboard_fmrestore(0, 0); 00188 fmboard_fmrestore(3, 1); 00189 psggen_restore(&psg1); 00190 fmboard_rhyrestore(&rhythm, 0); 00191 // sound_streamregist(&opngen, (SOUNDCB)opngen_getpcm); 00192 // sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm); 00193 rhythm_bind(&rhythm); 00194 pcm86io_bind(); 00195 cbuscore_attachsndex(0x188 + opn.base, opna_o, opna_i); 00196 } 00197 00198 00199 // ---- + chibioto 00200 00201 static void IOOUTCALL opnac_o18e(UINT port, REG8 dat) { 00202 00203 UINT addr; 00204 00205 if (!opn.extend) { 00206 return; 00207 } 00208 opn.data = dat; 00209 addr = opn.addr - 0x100; 00210 if (addr >= 0x100) { 00211 return; 00212 } 00213 S98_put(EXTEND2608, addr, dat); 00214 opn.reg[addr + 0x100] = dat; 00215 if (addr >= 0x30) { 00216 opngen_setreg(3, addr, dat); 00217 } 00218 else { 00219 if (addr < 0x12) { 00220 adpcm_setreg(&adpcm, addr, dat); 00221 } 00222 } 00223 (void)port; 00224 } 00225 00226 static REG8 IOINPCALL opnac_i18c(UINT port) { 00227 00228 if (opn.extend) { 00229 return((fmtimer.status & 3) | adpcm_status(&adpcm)); 00230 // return((fmtimer.status & 3) | (opn.adpcmmask & 8)); 00231 } 00232 (void)port; 00233 return(0xff); 00234 } 00235 00236 static REG8 IOINPCALL opnac_i18e(UINT port) { 00237 00238 if (opn.extend) { 00239 UINT addr = opn.addr - 0x100; 00240 if (addr == 0x08) { 00241 return(adpcm_readsample(&adpcm)); 00242 } 00243 else if (addr == 0x0f) { 00244 return(opn.reg[addr + 0x100]); 00245 } 00246 return(opn.data); 00247 } 00248 (void)port; 00249 return(0xff); 00250 } 00251 00252 static const IOOUT opnac_o[4] = { 00253 opna_o188, opna_o18a, opna_o18c, opnac_o18e}; 00254 00255 static const IOINP opnac_i[4] = { 00256 opna_i188, opna_i18a, opnac_i18c, opnac_i18e}; 00257 00258 00259 void board86c_bind(void) { 00260 00261 fmboard_fmrestore(0, 0); 00262 fmboard_fmrestore(3, 1); 00263 psggen_restore(&psg1); 00264 fmboard_rhyrestore(&rhythm, 0); 00265 // sound_streamregist(&opngen, (SOUNDCB)opngen_getpcm); 00266 // sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm); 00267 rhythm_bind(&rhythm); 00268 // sound_streamregist(&adpcm, (SOUNDCB)adpcm_getpcm); 00269 pcm86io_bind(); 00270 cbuscore_attachsndex(0x188 + opn.base, opnac_o, opnac_i); 00271 } 00272