DOSBox-X
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
src/hardware/snd_pc98/cbus/board118.c
00001 #include        "compiler.h"
00002 #include        "pccore.h"
00003 #include        "iocore.h"
00004 #include        "cbuscore.h"
00005 #include        "board118.h"
00006 #include        "cs4231io.h"
00007 #include        "sound.h"
00008 #include        "fmboard.h"
00009 #include        "s98.h"
00010 
00011 
00012 static void IOOUTCALL ymf_o188(UINT port, REG8 dat) {
00013 
00014         opn.addr = dat;
00015         opn.data = dat;
00016         (void)port;
00017 }
00018 
00019 static void IOOUTCALL ymf_o18a(UINT port, REG8 dat) {
00020 
00021         UINT    addr;
00022 
00023         opn.data = dat;
00024         addr = opn.addr;
00025         if (addr >= 0x100) {
00026                 return;
00027         }
00028         S98_put(NORMAL2608, addr, dat);
00029         if (addr < 0x10) {
00030                 if (addr != 0x0e) {
00031                         psggen_setreg(&psg1, addr, dat);
00032                 }
00033         }
00034         else {
00035                 if (addr < 0x20) {
00036                         rhythm_setreg(&rhythm, addr, dat);
00037                 }
00038                 else if (addr < 0x30) {
00039                         if (addr == 0x28) {
00040                                 if ((dat & 0x0f) < 3) {
00041                                         opngen_keyon(dat & 0x0f, dat);
00042                                 }
00043                                 else if (((dat & 0x0f) != 3) &&
00044                                                 ((dat & 0x0f) < 7)) {
00045                                         opngen_keyon((dat & 0x07) - 1, dat);
00046                                 }
00047                         }
00048                         else {
00049                                 fmtimer_setreg(addr, dat);
00050                         }
00051                 }
00052                 else if (addr < 0xc0) {
00053                         opngen_setreg(0, addr, dat);
00054                 }
00055                 opn.reg[addr] = dat;
00056         }
00057         (void)port;
00058 }
00059 
00060 static void IOOUTCALL ymf_o18c(UINT port, REG8 dat) {
00061 
00062         if (opn.extend) {
00063                 opn.addr = dat + 0x100;
00064                 opn.data = dat;
00065         }
00066         (void)port;
00067 }
00068 
00069 static void IOOUTCALL ymf_o18e(UINT port, REG8 dat) {
00070 
00071         UINT    addr;
00072 
00073         if (!opn.extend) {
00074                 return;
00075         }
00076         opn.data = dat;
00077         addr = opn.addr - 0x100;
00078         if (addr >= 0x100) {
00079                 return;
00080         }
00081         S98_put(EXTEND2608, addr, dat);
00082         opn.reg[addr + 0x100] = dat;
00083         if (addr >= 0x30) {
00084                 opngen_setreg(3, addr, dat);
00085         }
00086         else {
00087                 if (addr == 0x10) {
00088                         if (!(dat & 0x80)) {
00089                                 opn.adpcmmask = ~(dat & 0x1c);
00090                         }
00091                 }
00092         }
00093         (void)port;
00094 }
00095 
00096 static REG8 IOINPCALL ymf_i188(UINT port) {
00097 
00098         (void)port;
00099         return(fmtimer.status);
00100 }
00101 
00102 static REG8 IOINPCALL ymf_i18a(UINT port) {
00103 
00104         UINT    addr;
00105 
00106         addr = opn.addr;
00107         if (addr == 0x0e) {
00108                 return(fmboard_getjoy(&psg1));
00109         }
00110         else if (addr < 0x10) {
00111                 return(psggen_getreg(&psg1, addr));
00112         }
00113         else if (addr == 0xff) {
00114                 return(1);
00115         }
00116         else {
00117                 (void)port;
00118                 return(opn.data);
00119         }
00120 }
00121 
00122 static REG8 IOINPCALL ymf_i18c(UINT port) {
00123 
00124         if (opn.extend) {
00125                 return(fmtimer.status & 3);
00126         }
00127         (void)port;
00128         return(0xff);
00129 }
00130 
00131 static void extendchannel(REG8 enable) {
00132 
00133         opn.extend = enable;
00134         if (enable) {
00135                 opn.channels = 6;
00136                 opngen_setcfg(6, OPN_STEREO | 0x007);
00137         }
00138         else {
00139                 opn.channels = 3;
00140                 opngen_setcfg(3, OPN_MONORAL | 0x007);
00141                 rhythm_setreg(&rhythm, 0x10, 0xff);
00142         }
00143 }
00144 
00145 static void IOOUTCALL ymf_oa460(UINT port, REG8 dat) {
00146 
00147         cs4231.extfunc = dat;
00148         extendchannel((REG8)(dat & 1));
00149         (void)port;
00150 }
00151 
00152 static REG8 IOINPCALL ymf_ia460(UINT port) {
00153 
00154         (void)port;
00155         return(0x80 | (cs4231.extfunc & 1));
00156 }
00157 
00158 
00159 // ----
00160 
00161 static const IOOUT ymf_o[4] = {
00162                         ymf_o188,       ymf_o18a,       ymf_o18c,       ymf_o18e};
00163 
00164 static const IOINP ymf_i[4] = {
00165                         ymf_i188,       ymf_i18a,       ymf_i18c,       NULL};
00166 
00167 
00168 void board118_reset(const NP2CFG *pConfig) {
00169 
00170         fmtimer_reset(0xc0);
00171         opngen_setcfg(3, OPN_STEREO | 0x038);
00172         cs4231io_reset();
00173         soundrom_load(0xcc000, OEMTEXT("118"));
00174         fmboard_extreg(extendchannel);
00175 
00176         (void)pConfig;
00177 }
00178 
00179 void board118_bind(void) {
00180 
00181         fmboard_fmrestore(0, 0);
00182         fmboard_fmrestore(3, 1);
00183         psggen_restore(&psg1);
00184         fmboard_rhyrestore(&rhythm, 0);
00185         sound_streamregist(&opngen, (SOUNDCB)opngen_getpcm);
00186         sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm);
00187         rhythm_bind(&rhythm);
00188         cs4231io_bind();
00189         cbuscore_attachsndex(0x188, ymf_o, ymf_i);
00190         iocore_attachout(0xa460, ymf_oa460);
00191         iocore_attachinp(0xa460, ymf_ia460);
00192 }
00193