DOSBox-X
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
src/hardware/snd_pc98/cbus/board14.c
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