DOSBox-X
|
00001 #include "compiler.h" 00002 #include "pccore.h" 00003 #include "iocore.h" 00004 #include "cbuscore.h" 00005 #include "board14.h" 00006 #include "sound.h" 00007 #include "fmboard.h" 00008 00009 00010 // どうも 8253C-2は 4MHz/16らすい? 00011 // とりあえず 1996800/8を入力してみる... (ver0.71) 00012 00013 00014 // ---- 8253C-2 00015 00016 UINT board14_pitcount(void) { 00017 00018 SINT32 clk; 00019 00020 clk = nevent_getremain(NEVENT_MUSICGEN); 00021 if (clk >= 0) { 00022 clk /= pccore.multiple; 00023 clk /= 8; 00024 if (!(pccore.cpumode & CPUMODE_8MHZ)) { 00025 clk = clk * 13 / 16; 00026 } 00027 return(clk); 00028 } 00029 return(0); 00030 } 00031 00032 00033 // ---- intr 00034 00035 static void setmusicgenevent(UINT32 cnt, BOOL absolute) { 00036 00037 if (cnt > 4) { // 根拠なし 00038 cnt *= pccore.multiple; 00039 } 00040 else { 00041 cnt = pccore.multiple << 16; 00042 } 00043 if (!(pccore.cpumode & CPUMODE_8MHZ)) { 00044 cnt = cnt * 16 / 13; // cnt * 2457600 / 1996800 00045 } 00046 cnt *= 8; 00047 nevent_set(NEVENT_MUSICGEN, cnt, musicgenint, absolute); 00048 } 00049 00050 void musicgenint(NEVENTITEM item) { 00051 00052 PITCH pitch; 00053 00054 if (item->flag & NEVENT_SETEVENT) { 00055 pitch = pit.ch + 3; 00056 if ((pitch->ctrl & 0x0c) == 0x04) { 00057 // レートジェネレータ 00058 setmusicgenevent(pitch->value, NEVENT_RELATIVE); 00059 } 00060 } 00061 pic_setirq(0x0c); 00062 (void)item; 00063 } 00064 00065 00066 // ---- I/O 00067 00068 static void IOOUTCALL musicgen_o088(UINT port, REG8 dat) { 00069 00070 musicgen.porta = dat; 00071 (void)port; 00072 } 00073 00074 static void IOOUTCALL musicgen_o08a(UINT port, REG8 dat) { 00075 00076 musicgen.portb = dat; 00077 (void)port; 00078 } 00079 00080 static void IOOUTCALL musicgen_o08c(UINT port, REG8 dat) { 00081 00082 if (dat & 0x80) { 00083 if (!(musicgen.portc & 0x80)) { 00084 musicgen.sync = 1; 00085 musicgen.ch = 0; 00086 } 00087 else if (musicgen.sync) { 00088 musicgen.sync = 0; 00089 sound_sync(); 00090 musicgen.key[musicgen.ch] = dat; 00091 tms3631_setkey(&tms3631, (REG8)musicgen.ch, dat); 00092 } 00093 else if ((!(dat & 0x40)) && (musicgen.portc & 0x40)) { 00094 musicgen.sync = 1; 00095 musicgen.ch = (musicgen.ch + 1) & 7; 00096 } 00097 } 00098 musicgen.portc = dat; 00099 (void)port; 00100 } 00101 00102 static void IOOUTCALL musicgen_o188(UINT port, REG8 dat) { 00103 00104 sound_sync(); 00105 musicgen.mask = dat; 00106 tms3631_setenable(&tms3631, dat); 00107 (void)port; 00108 } 00109 00110 static void IOOUTCALL musicgen_o18c(UINT port, REG8 dat) { 00111 00112 PITCH pitch; 00113 00114 pitch = pit.ch + 3; 00115 if (!pit_setcount(pitch, dat)) { 00116 setmusicgenevent(pitch->value, NEVENT_ABSOLUTE); 00117 } 00118 (void)port; 00119 } 00120 00121 static void IOOUTCALL musicgen_o18e(UINT port, REG8 dat) { 00122 00123 pit_setflag(pit.ch + 3, dat); 00124 (void)port; 00125 } 00126 00127 static REG8 IOINPCALL musicgen_i088(UINT port) { 00128 00129 (void)port; 00130 return(musicgen.porta); 00131 } 00132 00133 static REG8 IOINPCALL musicgen_i08a(UINT port) { 00134 00135 (void)port; 00136 return(musicgen.portb); 00137 } 00138 00139 static REG8 IOINPCALL musicgen_i08c(UINT port) { 00140 00141 (void)port; 00142 return(musicgen.portc); 00143 } 00144 00145 static REG8 IOINPCALL musicgen_i08e(UINT port) { 00146 00147 (void)port; 00148 return(0x08); 00149 } 00150 00151 static REG8 IOINPCALL musicgen_i188(UINT port) { 00152 00153 (void)port; 00154 return(musicgen.mask); 00155 } 00156 00157 static REG8 IOINPCALL musicgen_i18c(UINT port) { 00158 00159 (void)port; 00160 return(pit_getstat(pit.ch + 3)); 00161 } 00162 00163 static REG8 IOINPCALL musicgen_i18e(UINT port) { 00164 00165 (void)port; 00166 #if 1 00167 return(0x80); // INT-5 00168 #else 00169 return(0x40); // INT-5 00170 #endif 00171 } 00172 00173 00174 // ---- 00175 00176 static const IOOUT musicgen_o0[4] = { 00177 musicgen_o088, musicgen_o08a, musicgen_o08c, NULL}; 00178 00179 static const IOOUT musicgen_o1[4] = { 00180 musicgen_o188, musicgen_o188, musicgen_o18c, musicgen_o18e}; 00181 00182 static const IOINP musicgen_i0[4] = { 00183 musicgen_i088, musicgen_i08a, musicgen_i08c, musicgen_i08e}; 00184 00185 static const IOINP musicgen_i1[4] = { 00186 musicgen_i188, musicgen_i188, musicgen_i18c, musicgen_i18e}; 00187 00188 00189 void board14_reset(const NP2CFG *pConfig) { 00190 00191 ZeroMemory(&musicgen, sizeof(musicgen)); 00192 soundrom_load(0xcc000, OEMTEXT("14")); 00193 00194 (void)pConfig; 00195 } 00196 00197 void board14_bind(void) { 00198 00199 sound_streamregist(&tms3631, (SOUNDCB)tms3631_getpcm); 00200 cbuscore_attachsndex(0x088, musicgen_o0, musicgen_i0); 00201 cbuscore_attachsndex(0x188, musicgen_o1, musicgen_i1); 00202 } 00203 00204 void board14_allkeymake(void) { 00205 00206 REG8 i; 00207 00208 for (i=0; i<8; i++) { 00209 tms3631_setkey(&tms3631, i, musicgen.key[i]); 00210 } 00211 } 00212