DOSBox-X
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
src/hardware/snd_pc98/cbus/board26k.c
00001 #include    "np2glue.h"
00002 //#include      "compiler.h"
00003 //#include      "pccore.h"
00004 //#include      "iocore.h"
00005 //#include      "cbuscore.h"
00006 #include        "board26k.h"
00007 #include        "sound.h"
00008 #include        "fmboard.h"
00009 #include        "s98.h"
00010 
00011 
00012 static void IOOUTCALL opn_o188(UINT port, REG8 dat) {
00013 
00014         opn.addr = dat;
00015         opn.data = dat;
00016         (void)port;
00017 }
00018 
00019 static void IOOUTCALL opn_o18a(UINT port, REG8 dat) {
00020 
00021         UINT    addr;
00022 
00023         opn.data = dat;
00024         addr = opn.addr;
00025         S98_put(NORMAL2608, addr, dat);
00026         if (addr < 0x10) {
00027                 if (addr != 0x0e) {
00028                         psggen_setreg(&psg1, addr, dat);
00029                 }
00030         }
00031         else if (addr < 0x100) {
00032                 if (addr < 0x30) {
00033                         if (addr == 0x28) {
00034                                 if ((dat & 0x0f) < 3) {
00035                                         opngen_keyon(dat & 0x0f, dat);
00036                                 }
00037                         }
00038                         else {
00039                                 fmtimer_setreg(addr, dat);
00040                                 if (addr == 0x27) {
00041                                         opnch[2].extop = dat & 0xc0;
00042                                 }
00043                         }
00044                 }
00045                 else if (addr < 0xc0) {
00046                         opngen_setreg(0, addr, dat);
00047                 }
00048                 opn.reg[addr] = dat;
00049         }
00050         (void)port;
00051 }
00052 
00053 static REG8 IOINPCALL opn_i188(UINT port) {
00054 
00055         (void)port;
00056         return(fmtimer.status);
00057 }
00058 
00059 static REG8 IOINPCALL opn_i18a(UINT port) {
00060 
00061         UINT    addr;
00062 
00063         addr = opn.addr;
00064         if (addr == 0x0e) {
00065                 return(fmboard_getjoy(&psg1));
00066         }
00067         else if (addr < 0x10) {
00068                 return(psggen_getreg(&psg1, addr));
00069         }
00070         (void)port;
00071         return(opn.data);
00072 }
00073 
00074 
00075 // ----
00076 
00077 static const IOOUT opn_o[4] = {
00078                         opn_o188,       opn_o18a,       NULL,           NULL};
00079 
00080 static const IOINP opn_i[4] = {
00081                         opn_i188,       opn_i18a,       NULL,           NULL};
00082 
00083 
00084 void board26k_reset(const NP2CFG *pConfig) {
00085 
00086         opngen_setcfg(3, 0);
00087         fmtimer_reset(pConfig->snd26opt & 0xc0);
00088         soundrom_loadex(pConfig->snd26opt & 7, OEMTEXT("26"));
00089         opn.base = (pConfig->snd26opt & 0x10)?0x000:0x100;
00090 }
00091 
00092 void board26k_bind(void) {
00093 
00094         fmboard_fmrestore(0, 0);
00095         psggen_restore(&psg1);
00096 //      sound_streamregist(&opngen, (SOUNDCB)opngen_getpcm);
00097 //      sound_streamregist(&psg1, (SOUNDCB)psggen_getpcm);
00098         cbuscore_attachsndex(0x188 - opn.base, opn_o, opn_i);
00099 }
00100