DOSBox-X
|
00001 #include "compiler.h" 00002 #include "pccore.h" 00003 #include "iocore.h" 00004 #include "cbuscore.h" 00005 #include "boardspb.h" 00006 #include "sound.h" 00007 #include "fmboard.h" 00008 #include "s98.h" 00009 00010 00011 static void IOOUTCALL spb_o188(UINT port, REG8 dat) { 00012 00013 opn.addr = dat; 00014 opn.data = dat; 00015 (void)port; 00016 } 00017 00018 static void IOOUTCALL spb_o18a(UINT port, REG8 dat) { 00019 00020 UINT addr; 00021 00022 opn.data = dat; 00023 addr = opn.addr; 00024 if (addr >= 0x100) { 00025 return; 00026 } 00027 S98_put(NORMAL2608, addr, dat); 00028 if (addr < 0x10) { 00029 if (addr != 0x0e) { 00030 psggen_setreg(&psg1, addr, dat); 00031 } 00032 } 00033 else { 00034 if (addr < 0x20) { 00035 rhythm_setreg(&rhythm, addr, dat); 00036 } 00037 else if (addr < 0x30) { 00038 if (addr == 0x28) { 00039 if ((dat & 0x0f) < 3) { 00040 opngen_keyon(dat & 0x0f, dat); 00041 } 00042 else if (((dat & 0x0f) != 3) && 00043 ((dat & 0x0f) < 7)) { 00044 opngen_keyon((dat & 0x0f) - 1, dat); 00045 } 00046 } 00047 else { 00048 fmtimer_setreg(addr, dat); 00049 if (addr == 0x27) { 00050 opnch[2].extop = dat & 0xc0; 00051 } 00052 } 00053 } 00054 else if (addr < 0xc0) { 00055 opngen_setreg(0, addr, dat); 00056 } 00057 opn.reg[addr] = dat; 00058 } 00059 (void)port; 00060 } 00061 00062 static void IOOUTCALL spb_o18c(UINT port, REG8 dat) { 00063 00064 opn.addr = dat + 0x100; 00065 opn.data = dat; 00066 (void)port; 00067 } 00068 00069 static void IOOUTCALL spb_o18e(UINT port, REG8 dat) { 00070 00071 UINT addr; 00072 00073 opn.data = dat; 00074 addr = opn.addr - 0x100; 00075 if (addr >= 0x100) { 00076 return; 00077 } 00078 S98_put(EXTEND2608, addr, dat); 00079 opn.reg[addr + 0x100] = dat; 00080 if (addr >= 0x30) { 00081 opngen_setreg(3, addr, dat); 00082 } 00083 else if (addr < 0x12) { 00084 adpcm_setreg(&adpcm, addr, dat); 00085 } 00086 (void)port; 00087 } 00088 00089 static REG8 IOINPCALL spb_i188(UINT port) { 00090 00091 (void)port; 00092 return((fmtimer.status & 3) | adpcm_status(&adpcm)); 00093 } 00094 00095 static REG8 IOINPCALL spb_i18a(UINT port) { 00096 00097 UINT addr; 00098 00099 addr = opn.addr; 00100 if (addr == 0x0e) { 00101 return(fmboard_getjoy(&psg1)); 00102 } 00103 else if (addr < 0x10) { 00104 return(psggen_getreg(&psg1, addr)); 00105 } 00106 else if (addr == 0xff) { 00107 return(1); 00108 } 00109 else { 00110 (void)port; 00111 return(opn.data); 00112 } 00113 } 00114 00115 static REG8 IOINPCALL spb_i18e(UINT port) { 00116 00117 UINT addr; 00118 00119 addr = opn.addr - 0x100; 00120 if (addr == 0x08) { 00121 return(adpcm_readsample(&adpcm)); 00122 } 00123 else if (addr == 0x0f) { 00124 return(opn.reg[addr + 0x100]); 00125 } 00126 else { 00127 (void)port; 00128 return(opn.data); 00129 } 00130 } 00131 00132 00133 // ---- spark board 00134 00135 static void IOOUTCALL spr_o588(UINT port, REG8 dat) { 00136 00137 opn.addr2 = dat; 00138 // opn.data2 = dat; 00139 (void)port; 00140 } 00141 00142 static void IOOUTCALL spr_o58a(UINT port, REG8 dat) { 00143 00144 UINT addr; 00145 00146 // opn.data2 = dat; 00147 addr = opn.addr2; 00148 if (addr >= 0x100) { 00149 return; 00150 } 00151 if (addr < 0x30) { 00152 if (addr == 0x28) { 00153 if ((dat & 0x0f) < 3) { 00154 opngen_keyon((dat & 0x0f) + 6, dat); 00155 } 00156 else if (((dat & 0x0f) != 3) && 00157 ((dat & 0x0f) < 7)) { 00158 opngen_keyon((dat & 0x0f) + 5, dat); 00159 } 00160 } 00161 else { 00162 if (addr == 0x27) { 00163 opnch[8].extop = dat & 0xc0; 00164 } 00165 } 00166 } 00167 else if (addr < 0xc0) { 00168 opngen_setreg(6, addr, dat); 00169 } 00170 opn.reg[addr + 0x200] = dat; 00171 (void)port; 00172 } 00173 00174 static void IOOUTCALL spr_o58c(UINT port, REG8 dat) { 00175 00176 opn.addr2 = dat + 0x100; 00177 // opn.data2 = dat; 00178 (void)port; 00179 } 00180 00181 static void IOOUTCALL spr_o58e(UINT port, REG8 dat) { 00182 00183 UINT addr; 00184 00185 // opn.data2 = dat; 00186 addr = opn.addr2 - 0x100; 00187 if (addr >= 0x100) { 00188 return; 00189 } 00190 opn.reg[addr + 0x300] = dat; 00191 if (addr >= 0x30) { 00192 opngen_setreg(9, addr, dat); 00193 } 00194 (void)port; 00195 } 00196 00197 static REG8 IOINPCALL spr_i588(UINT port) { 00198 00199 (void)port; 00200 return(fmtimer.status); 00201 } 00202 00203 static REG8 IOINPCALL spr_i58a(UINT port) { 00204 00205 UINT addr; 00206 00207 addr = opn.addr2; 00208 if ((addr >= 0x20) && (addr < 0xff)) { 00209 return(opn.reg[addr + 0x200]); 00210 } 00211 else if (addr == 0xff) { 00212 return(0); 00213 } 00214 else { 00215 (void)port; 00216 // return(opn.data2); 00217 return(0xff); 00218 } 00219 } 00220 00221 static REG8 IOINPCALL spr_i58c(UINT port) { 00222 00223 (void)port; 00224 return(fmtimer.status & 3); 00225 } 00226 00227 static REG8 IOINPCALL spr_i58e(UINT port) { 00228 00229 UINT addr; 00230 00231 addr = opn.addr2; 00232 if (addr < 0x100) { 00233 return(opn.reg[addr + 0x200]); 00234 } 00235 else { 00236 (void)port; 00237 // return(opn.data2); 00238 return(0xff); 00239 } 00240 } 00241 00242 00243 // ---- 00244 00245 static const IOOUT spb_o[4] = { 00246 spb_o188, spb_o18a, spb_o18c, spb_o18e}; 00247 00248 static const IOINP spb_i[4] = { 00249 spb_i188, spb_i18a, spb_i188, spb_i18e}; 00250 00251 00252 void boardspb_reset(const NP2CFG *pConfig) { 00253 00254 fmtimer_reset(pConfig->spbopt & 0xc0); 00255 opn.channels = 6; 00256 opngen_setcfg(6, OPN_STEREO | 0x03f); 00257 soundrom_loadex(pConfig->spbopt & 7, OEMTEXT("SPB")); 00258 opn.base = ((pConfig->spbopt & 0x10)?0x000:0x100); 00259 } 00260 00261 void boardspb_bind(void) { 00262 00263 fmboard_fmrestore(0, 0); 00264 fmboard_fmrestore(3, 1); 00265 psggen_restore(&psg1); 00266 fmboard_rhyrestore(&rhythm, 0); 00267 sound_streamregist(&opngen, (SOUNDCB)opngen_getpcmvr); 00268 sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm); 00269 rhythm_bind(&rhythm); 00270 sound_streamregist(&adpcm, (SOUNDCB)adpcm_getpcm); 00271 cbuscore_attachsndex(0x188 - opn.base, spb_o, spb_i); 00272 } 00273 00274 00275 // ---- 00276 00277 static const IOOUT spr_o[4] = { 00278 spr_o588, spr_o58a, spr_o58c, spr_o58e}; 00279 00280 static const IOINP spr_i[4] = { 00281 spr_i588, spr_i58a, spr_i58c, spr_i58e}; 00282 00283 00284 void boardspr_reset(const NP2CFG *pConfig) { 00285 00286 fmtimer_reset(pConfig->spbopt & 0xc0); 00287 opn.reg[0x2ff] = 0; 00288 opn.channels = 12; 00289 opngen_setcfg(12, OPN_STEREO | 0x03f); 00290 soundrom_loadex(pConfig->spbopt & 7, OEMTEXT("SPB")); 00291 opn.base = (pConfig->spbopt & 0x10)?0x000:0x100; 00292 } 00293 00294 void boardspr_bind(void) { 00295 00296 fmboard_fmrestore(0, 0); 00297 fmboard_fmrestore(3, 1); 00298 fmboard_fmrestore(6, 2); 00299 fmboard_fmrestore(9, 3); 00300 psggen_restore(&psg1); 00301 fmboard_rhyrestore(&rhythm, 0); 00302 sound_streamregist(&opngen, (SOUNDCB)opngen_getpcmvr); 00303 sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm); 00304 rhythm_bind(&rhythm); 00305 sound_streamregist(&adpcm, (SOUNDCB)adpcm_getpcm); 00306 cbuscore_attachsndex(0x188 - opn.base, spb_o, spb_i); 00307 cbuscore_attachsndex(0x588 - opn.base, spr_o, spr_i); 00308 } 00309