DOSBox-X
|
00001 #include "np2glue.h" 00002 //#include "compiler.h" 00003 //#include "joymng.h" 00004 //#include "soundmng.h" 00005 //#include "pccore.h" 00006 //#include "iocore.h" 00007 //#include "cbuscore.h" 00008 //#include "board14.h" 00009 #include "board26k.h" 00010 #include "board86.h" 00011 //#include "boardx2.h" 00012 //#include "board118.h" 00013 //#include "boardspb.h" 00014 #if defined(SUPPORT_PX) 00015 //#include "boardpx.h" 00016 #endif // defined(SUPPORT_PX) 00017 //#include "amd98.h" 00018 //#include "pcm86io.h" 00019 //#include "cs4231io.h" 00020 #include "sound.h" 00021 #include "fmboard.h" 00022 //#include "beep.h" 00023 #include "keydisp.h" 00024 //#include "keystat.h" 00025 00026 00027 UINT32 usesound; 00028 OPN_T opn; 00029 AMD98 amd98; 00030 MUSICGEN musicgen; 00031 00032 _TMS3631 tms3631; 00033 _FMTIMER fmtimer; 00034 _OPNGEN opngen; 00035 OPNCH opnch[OPNCH_MAX]; 00036 _PSGGEN __psg[3]; 00037 _RHYTHM rhythm; 00038 _ADPCM adpcm; 00039 _PCM86 pcm86; 00040 // _CS4231 cs4231; 00041 00042 #if defined(SUPPORT_PX) 00043 OPN_T opn2; 00044 OPN_T opn3; 00045 _RHYTHM rhythm2; 00046 _RHYTHM rhythm3; 00047 _ADPCM adpcm2; 00048 _ADPCM adpcm3; 00049 #endif // defined(SUPPORT_PX) 00050 00051 00052 static void (*extfn)(REG8 enable); 00053 00054 00055 // ---- 00056 00057 static REG8 rapids = 0; 00058 00059 REG8 fmboard_getjoy(PSGGEN psg) { 00060 00061 REG8 ret; 00062 00063 rapids ^= 0xf0; // ver0.28 00064 ret = 0xff; 00065 if (!(psg->reg.io2 & 0x40)) { 00066 ret &= (joymng_getstat() | (rapids & 0x30)); 00067 if (np2cfg.KEY_MODE == 1) { 00068 ret &= keystat_getjoy(); 00069 } 00070 } 00071 else { 00072 if (np2cfg.KEY_MODE == 2) { 00073 ret &= keystat_getjoy(); 00074 } 00075 } 00076 if (np2cfg.BTN_RAPID) { 00077 ret |= rapids; 00078 } 00079 00080 // rapidと非rapidを合成 // ver0.28 00081 ret &= ((ret >> 2) | (~0x30)); 00082 00083 if (np2cfg.BTN_MODE) { 00084 UINT8 bit1 = (ret & 0x20) >> 1; // ver0.28 00085 UINT8 bit2 = (ret & 0x10) << 1; 00086 ret = (ret & (~0x30)) | bit1 | bit2; 00087 } 00088 00089 // intr 反映して終わり // ver0.28 00090 ret &= 0x3f; 00091 ret |= fmtimer.intr; 00092 return(ret); 00093 } 00094 00095 00096 // ---- 00097 00098 void fmboard_extreg(void (*ext)(REG8 enable)) { 00099 00100 extfn = ext; 00101 } 00102 00103 void fmboard_extenable(REG8 enable) { 00104 00105 if (extfn) { 00106 (*extfn)(enable); 00107 } 00108 } 00109 00110 00111 00112 // ---- 00113 00114 static void setfmregs(UINT8 *reg) { 00115 00116 FillMemory(reg + 0x30, 0x60, 0xff); 00117 FillMemory(reg + 0x90, 0x20, 0x00); 00118 FillMemory(reg + 0xb0, 0x04, 0x00); 00119 FillMemory(reg + 0xb4, 0x04, 0xc0); 00120 } 00121 00122 void fmboard_reset(const NP2CFG *pConfig, UINT32 type) { 00123 00124 UINT8 cross; 00125 00126 soundrom_reset(); 00127 // beep_reset(); // ver0.27a 00128 cross = np2cfg.snd_x; // ver0.30 00129 00130 extfn = NULL; 00131 ZeroMemory(&opn, sizeof(opn)); 00132 setfmregs(opn.reg + 0x000); 00133 setfmregs(opn.reg + 0x100); 00134 setfmregs(opn.reg + 0x200); 00135 setfmregs(opn.reg + 0x300); 00136 opn.reg[0xff] = 0x01; 00137 opn.channels = 3; 00138 opn.adpcmmask = (UINT8)~(0x1c); 00139 00140 #if defined(SUPPORT_PX) 00141 ZeroMemory(&opn2, sizeof(opn2)); 00142 setfmregs(opn2.reg + 0x000); 00143 setfmregs(opn2.reg + 0x100); 00144 setfmregs(opn2.reg + 0x200); 00145 setfmregs(opn2.reg + 0x300); 00146 opn2.reg[0xff] = 0x01; 00147 opn2.channels = 3; 00148 opn2.adpcmmask = (UINT8)~(0x1c); 00149 00150 ZeroMemory(&opn3, sizeof(opn3)); 00151 setfmregs(opn3.reg + 0x000); 00152 setfmregs(opn3.reg + 0x100); 00153 setfmregs(opn3.reg + 0x200); 00154 setfmregs(opn3.reg + 0x300); 00155 opn3.reg[0xff] = 0x01; 00156 opn3.channels = 3; 00157 opn3.adpcmmask = (UINT8)~(0x1c); 00158 #endif // defined(SUPPORT_PX) 00159 00160 ZeroMemory(&musicgen, sizeof(musicgen)); 00161 ZeroMemory(&amd98, sizeof(amd98)); 00162 00163 tms3631_reset(&tms3631); 00164 opngen_reset(); 00165 psggen_reset(&psg1); 00166 psggen_reset(&psg2); 00167 psggen_reset(&psg3); 00168 rhythm_reset(&rhythm); 00169 #if defined(SUPPORT_PX) 00170 rhythm_reset(&rhythm2); 00171 rhythm_reset(&rhythm3); 00172 #endif // defined(SUPPORT_PX) 00173 adpcm_reset(&adpcm); 00174 #if defined(SUPPORT_PX) 00175 adpcm_reset(&adpcm2); 00176 adpcm_reset(&adpcm3); 00177 #endif // defined(SUPPORT_PX) 00178 pcm86_reset(); 00179 // cs4231_reset(); 00180 00181 switch(type) { 00182 case 0x01: 00183 // board14_reset(pConfig); 00184 break; 00185 00186 case 0x02: 00187 board26k_reset(pConfig); 00188 break; 00189 00190 case 0x04: 00191 board86_reset(pConfig); 00192 break; 00193 00194 case 0x06: 00195 // boardx2_reset(pConfig); 00196 break; 00197 00198 case 0x08: 00199 // board118_reset(pConfig); 00200 break; 00201 00202 case 0x14: 00203 board86_reset(pConfig); 00204 break; 00205 00206 case 0x20: 00207 // boardspb_reset(pConfig); 00208 cross ^= pConfig->spb_x; 00209 break; 00210 00211 case 0x40: 00212 // boardspr_reset(pConfig); 00213 cross ^= pConfig->spb_x; 00214 break; 00215 00216 case 0x80: 00217 // amd98_reset(pConfig); 00218 break; 00219 00220 #if defined(SUPPORT_PX) 00221 case 0x30: 00222 // boardpx1_reset(pConfig); 00223 break; 00224 00225 case 0x50: 00226 // boardpx2_reset(pConfig); 00227 break; 00228 #endif // defined(SUPPORT_PX) 00229 00230 default: 00231 type = 0; 00232 break; 00233 } 00234 usesound = type; 00235 // soundmng_setreverse(cross); 00236 keydisp_setfmboard(type); 00237 opngen_setVR(pConfig->spb_vrc, pConfig->spb_vrl); 00238 } 00239 00240 /* added by DOSBox-X */ 00241 void fmboard_on_reset() { 00242 fmboard_reset(&np2cfg, usesound); 00243 } 00244 00245 void fmboard_bind(void) { 00246 00247 switch(usesound) { 00248 case 0x01: 00249 // board14_bind(); 00250 break; 00251 00252 case 0x02: 00253 board26k_bind(); 00254 break; 00255 00256 case 0x04: 00257 board86_bind(); 00258 break; 00259 00260 case 0x06: 00261 // boardx2_bind(); 00262 break; 00263 00264 case 0x08: 00265 // board118_bind(); 00266 break; 00267 00268 case 0x14: 00269 board86c_bind(); 00270 break; 00271 00272 case 0x20: 00273 // boardspb_bind(); 00274 break; 00275 00276 case 0x40: 00277 // boardspr_bind(); 00278 break; 00279 00280 case 0x80: 00281 // amd98_bind(); 00282 break; 00283 00284 #if defined(SUPPORT_PX) 00285 case 0x30: 00286 // boardpx1_bind(); 00287 break; 00288 00289 case 0x50: 00290 // boardpx2_bind(); 00291 break; 00292 #endif // defined(SUPPORT_PX) 00293 } 00294 // sound_streamregist(&beep, (SOUNDCB)beep_getpcm); 00295 } 00296 00297 00298 // ---- 00299 00300 void fmboard_fmrestore(REG8 chbase, UINT bank) { 00301 00302 REG8 i; 00303 const UINT8 *reg; 00304 00305 reg = opn.reg + (bank * 0x100); 00306 for (i=0x30; i<0xa0; i++) { 00307 opngen_setreg(chbase, i, reg[i]); 00308 } 00309 for (i=0xb7; i>=0xa0; i--) { 00310 opngen_setreg(chbase, i, reg[i]); 00311 } 00312 for (i=0; i<3; i++) { 00313 opngen_keyon(chbase + i, opngen.keyreg[chbase + i]); 00314 } 00315 } 00316 00317 void fmboard_rhyrestore(RHYTHM rhy, UINT bank) { 00318 00319 const UINT8 *reg; 00320 00321 reg = opn.reg + (bank * 0x100); 00322 rhythm_setreg(rhy, 0x11, reg[0x11]); 00323 rhythm_setreg(rhy, 0x18, reg[0x18]); 00324 rhythm_setreg(rhy, 0x19, reg[0x19]); 00325 rhythm_setreg(rhy, 0x1a, reg[0x1a]); 00326 rhythm_setreg(rhy, 0x1b, reg[0x1b]); 00327 rhythm_setreg(rhy, 0x1c, reg[0x1c]); 00328 rhythm_setreg(rhy, 0x1d, reg[0x1d]); 00329 } 00330 00331 00332 #if defined(SUPPORT_PX) 00333 void fmboard_fmrestore2(OPN_T* pOpn, REG8 chbase, UINT bank) { 00334 00335 REG8 i; 00336 const UINT8 *reg; 00337 00338 reg = pOpn->reg + (bank * 0x100); 00339 for (i=0x30; i<0xa0; i++) { 00340 opngen_setreg(chbase, i, reg[i]); 00341 } 00342 for (i=0xb7; i>=0xa0; i--) { 00343 opngen_setreg(chbase, i, reg[i]); 00344 } 00345 for (i=0; i<3; i++) { 00346 opngen_keyon(chbase + i, opngen.keyreg[chbase + i]); 00347 } 00348 } 00349 00350 void fmboard_rhyrestore2(OPN_T* pOpn, RHYTHM rhy, UINT bank) { 00351 00352 const UINT8 *reg; 00353 00354 reg = pOpn->reg + (bank * 0x100); 00355 rhythm_setreg(rhy, 0x11, reg[0x11]); 00356 rhythm_setreg(rhy, 0x18, reg[0x18]); 00357 rhythm_setreg(rhy, 0x19, reg[0x19]); 00358 rhythm_setreg(rhy, 0x1a, reg[0x1a]); 00359 rhythm_setreg(rhy, 0x1b, reg[0x1b]); 00360 rhythm_setreg(rhy, 0x1c, reg[0x1c]); 00361 rhythm_setreg(rhy, 0x1d, reg[0x1d]); 00362 } 00363 #endif // defined(SUPPORT_PX) 00364