diff --git a/io/iocore.c b/io/iocore.c index c09cbf1..08a0b2c 100644 --- a/io/iocore.c +++ b/io/iocore.c @@ -5,7 +5,6 @@ #include "pccore.h" #include "iocore.h" - IOCORE iocore; CGROM cgrom; CMT cmt; @@ -16,7 +15,6 @@ PCG pcg; PPI ppi; SIO sio; - SNDBOARD sndboard; SUBCPU subcpu; diff --git a/io/iocore.h b/io/iocore.h index 2b60697..42031e3 100644 --- a/io/iocore.h +++ b/io/iocore.h @@ -73,7 +73,6 @@ extern FDC fdc; extern PCG pcg; extern PPI ppi; extern SIO sio; -extern SNDBOARD sndboard; extern SUBCPU subcpu; diff --git a/io/sndboard.c b/io/sndboard.c index 14240d7..898a277 100644 --- a/io/sndboard.c +++ b/io/sndboard.c @@ -1,128 +1,146 @@ -#include "compiler.h" -#include "joymng.h" -#include "pccore.h" -#include "iocore.h" -#include "keystat.h" -#include "sound.h" -#include "sndctrl.h" -#include "x1f.h" +/** + * @file sndboard.h + * @brief Implementation of the sound boards + */ +#include "compiler.h" +#include "joymng.h" +#include "pccore.h" +#include "iocore.h" +#include "keystat.h" +#include "sound.h" +#include "sndctrl.h" + +static UINT8 s_rapids; #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) -void IOOUTCALL opm_o(UINT port, REG8 dat) { - - REG8 lsb; - REG8 reg; +void IOOUTCALL opm_o(UINT port, REG8 dat) +{ + REG8 lsb; lsb = (UINT8)port; - if (lsb == 0x00) { /* 0700 */ - sndboard.opmreg = (UINT8)dat; + if (lsb == 0x00) /* 0700 */ + { + g_opm.s.addr = (UINT8)dat; } - else if (lsb == 0x01) { /* 0701 */ - reg = sndboard.opmreg; - sndboard.opmdat[reg] = dat; - x1f_opm(reg, dat); -#if !defined(DISABLE_SOUND) - opmgen_setreg(&g_opmgen, reg, dat); -#endif + else if (lsb == 0x01) /* 0701 */ + { + opm_writeRegister(&g_opm, g_opm.s.addr, dat); } - else if ((lsb & (~3)) == 0x04) { /* 0704-0707 */ + else if ((lsb & (~3)) == 0x04) /* 0704-0707 */ + { ctc_o(port, dat); } } -REG8 IOINPCALL opm_i(UINT port) { - - REG8 lsb; +REG8 IOINPCALL opm_i(UINT port) +{ + REG8 lsb; lsb = (UINT8)port; - if ((lsb & (~1)) == 0x00) { /* 0700/0701 */ - return(0x00); /* ゼリアード */ + if ((lsb & (~1)) == 0x00) /* 0700/0701 */ + { + return 0x00; /* ゼリアード */ } - else if ((lsb & (~3)) == 0x04) { /* 0704-0707 */ - return(ctc_i(port)); + else if ((lsb & (~3)) == 0x04) /* 0704-0707 */ + { + return ctc_i(port); } - else { - return(0xff); + else + { + return 0xff; } } #endif -void IOOUTCALL sndboard_psgreg(UINT port, REG8 dat) { - - sndboard.psgreg = dat; +void IOOUTCALL sndboard_psgreg(UINT port, REG8 dat) +{ + g_psg.s.addr = dat; (void)port; } -void IOOUTCALL sndboard_psgdat(UINT port, REG8 dat) { - - REG8 reg; - - reg = sndboard.psgreg; - if (reg < 0x0e) { - sndboard.psgdat[reg] = dat; - x1f_psg(reg, dat); -#if !defined(DISABLE_SOUND) - psggen_setreg(&psggen, reg, dat); -#endif - } +void IOOUTCALL sndboard_psgdat(UINT port, REG8 dat) +{ + psg_writeRegister(&g_psg, g_psg.s.addr, dat); (void)port; } -REG8 IOINPCALL sndboard_psgsta(UINT port) { +REG8 IOINPCALL sndboard_psgsta(UINT port) +{ + REG8 nAddress; + REG8 ret; - REG8 ret; - - if (sndboard.psgreg < 0x0e) { - return(sndboard.psgdat[sndboard.psgreg]); + nAddress = g_psg.s.addr; + if (nAddress < 0x0e) + { + return psg_readRegister(&g_psg, nAddress); } - else if (sndboard.psgreg < 0x10) { + else if (nAddress < 0x10) + { ret = 0xff; - if (sndboard.psgreg == (xmilcfg.KEY_MODE + 0x0d)) { + if (nAddress == (xmilcfg.KEY_MODE + 0x0d)) + { ret &= keystat_getjoy(); } - if (sndboard.psgreg == 0x0e) { + if (nAddress == 0x0e) + { ret &= joymng_getstat(); } - if (xmilcfg.BTN_RAPID) { - sndboard.rapids ^= 0x60; - ret |= sndboard.rapids; + if (xmilcfg.BTN_RAPID) + { + s_rapids ^= 0x60; + ret |= s_rapids; } - if (xmilcfg.BTN_MODE) { + if (xmilcfg.BTN_MODE) + { ret = (ret & (~0x60)) | ((ret & 0x40) >> 1) | ((ret & 0x20) << 1); } - return(ret); + return ret; } - else { + else + { (void)port; - return(0xff); + return 0xff; } } - -/* reset */ - -#if !defined(DISABLE_SOUND) -void sndboard_update(void) { - - UINT i; - - for (i=0; i<14; i++) { - psggen_setreg(&psggen, (REG8)i, sndboard.psgdat[i]); - } +void sndboard_initialize(void) +{ #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - for (i=0x20; i<0x100; i++) { - opmgen_setreg(&g_opmgen, (REG8)i, sndboard.opmdat[i]); - } + opm_construct(&g_opm); #endif -} -#endif - -void sndboard_reset(void) { - - ZeroMemory(&sndboard, sizeof(sndboard)); - sndboard.psgdat[0x07] = 0x3f; - sndctrl_reset(); + psg_construct(&g_psg); } +void sndboard_deinitialize(void) +{ +#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) + opm_destruct(&g_opm); +#endif + psg_destruct(&g_psg); +} + +/** + * reset + */ +void sndboard_reset(void) +{ +#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) + UINT8 cCaps; + + cCaps = (pccore.SOUND_SW) ? (OPM_HAS_OPM | OPM_X1F) : 0; + opm_reset(&g_opm, cCaps); + opm_bind(&g_opm); +#endif + psg_reset(&g_psg, PSG_HAS_PSG | PSG_X1F); + psg_bind(&g_psg); +} + +void sndboard_update(void) +{ +#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) + opm_restore(&g_opm); +#endif + psg_restore(&g_psg); +} diff --git a/io/sndboard.h b/io/sndboard.h index f68c12e..e6dc0d5 100644 --- a/io/sndboard.h +++ b/io/sndboard.h @@ -1,28 +1,13 @@ +/** + * @file sndboard.h + * @brief Interface of the sound boards + */ -typedef struct { - UINT8 psgreg; -#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - UINT8 opmreg; -#else - UINT8 _protected_opmreg; -#endif - UINT8 rapids; - UINT8 padding; - UINT8 psgdat[0x10]; -#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - UINT8 opmdat[0x100]; -#endif -} SNDBOARD; - +#pragma once #ifdef __cplusplus -extern "C" { -#endif - -#if !defined(DISABLE_SOUND) -void sndboard_update(void); -#else -#define sndboard_update() +extern "C" +{ #endif #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) @@ -34,7 +19,10 @@ void IOOUTCALL sndboard_psgreg(UINT port, REG8 dat); void IOOUTCALL sndboard_psgdat(UINT port, REG8 dat); REG8 IOINPCALL sndboard_psgsta(UINT port); +void sndboard_initialize(void); +void sndboard_deinitialize(void); void sndboard_reset(void); +void sndboard_update(void); #ifdef __cplusplus } diff --git a/pccore.c b/pccore.c index 6845737..2f28b14 100644 --- a/pccore.c +++ b/pccore.c @@ -69,10 +69,13 @@ void pccore_initialize(void) { crtc_initialize(); pcg_initialize(); ppi_initialize(); + + sndboard_initialize(); } void pccore_deinitialize(void) { + sndboard_deinitialize(); sndctrl_deinitialize(); fddfile_eject(0); diff --git a/sdl2/MacOSX/xmilsdl2.xcodeproj/project.pbxproj b/sdl2/MacOSX/xmilsdl2.xcodeproj/project.pbxproj index b72d1e2..b8f3eaf 100644 --- a/sdl2/MacOSX/xmilsdl2.xcodeproj/project.pbxproj +++ b/sdl2/MacOSX/xmilsdl2.xcodeproj/project.pbxproj @@ -127,6 +127,8 @@ BAABD7341BC3BA5E00522E67 /* z80dmap.c in Sources */ = {isa = PBXBuildFile; fileRef = BAABD69D1BC3BA5D00522E67 /* z80dmap.c */; }; BAABD7351BC3BA5E00522E67 /* z80mem.c in Sources */ = {isa = PBXBuildFile; fileRef = BAABD69F1BC3BA5D00522E67 /* z80mem.c */; }; BAABD73B1BC3BBE200522E67 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAABD73A1BC3BBE200522E67 /* SDL2.framework */; }; + BAD1A2CD1BE7569C00B23E7C /* opm.c in Sources */ = {isa = PBXBuildFile; fileRef = BAD1A2CB1BE7569C00B23E7C /* opm.c */; }; + BAD1A2D01BE756A400B23E7C /* psg.c in Sources */ = {isa = PBXBuildFile; fileRef = BAD1A2CE1BE756A400B23E7C /* psg.c */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -354,6 +356,10 @@ BAABD6A01BC3BA5D00522E67 /* z80mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = z80mem.h; sourceTree = ""; }; BAABD7391BC3BB2400522E67 /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; BAABD73A1BC3BBE200522E67 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SDL2.framework; sourceTree = ""; }; + BAD1A2CB1BE7569C00B23E7C /* opm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opm.c; sourceTree = ""; }; + BAD1A2CC1BE7569C00B23E7C /* opm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opm.h; sourceTree = ""; }; + BAD1A2CE1BE756A400B23E7C /* psg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = psg.c; sourceTree = ""; }; + BAD1A2CF1BE756A400B23E7C /* psg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = psg.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -694,9 +700,13 @@ BAABD6641BC3BA5D00522E67 /* sound */ = { isa = PBXGroup; children = ( + BAD1A2CB1BE7569C00B23E7C /* opm.c */, + BAD1A2CC1BE7569C00B23E7C /* opm.h */, BAABD6651BC3BA5D00522E67 /* opmgen.h */, BAABD6661BC3BA5D00522E67 /* opmgenc.c */, BAABD6671BC3BA5D00522E67 /* opmgeng.c */, + BAD1A2CE1BE756A400B23E7C /* psg.c */, + BAD1A2CF1BE756A400B23E7C /* psg.h */, BAABD6681BC3BA5D00522E67 /* psggen.h */, BAABD6691BC3BA5D00522E67 /* psggenc.c */, BAABD66A1BC3BA5D00522E67 /* psggeng.c */, @@ -924,9 +934,11 @@ BAABD7201BC3BA5D00522E67 /* makescrn.c in Sources */, BAABD7221BC3BA5E00522E67 /* maketxth.c in Sources */, BAABD6E51BC3BA5D00522E67 /* vramio.c in Sources */, + BAD1A2D01BE756A400B23E7C /* psg.c in Sources */, BAABD6D81BC3BA5D00522E67 /* crtc.c in Sources */, BAABD6DE1BC3BA5D00522E67 /* iocore.c in Sources */, BAABD7011BC3BA5D00522E67 /* scrnmng.c in Sources */, + BAD1A2CD1BE7569C00B23E7C /* opm.c in Sources */, BAABD6E81BC3BA5D00522E67 /* nevent.c in Sources */, BAABD6C61BC3BA5D00522E67 /* vramhdl.c in Sources */, BAABD6E21BC3BA5D00522E67 /* sio.c in Sources */, diff --git a/sdl2/iOS/xmil.xcodeproj/project.pbxproj b/sdl2/iOS/xmil.xcodeproj/project.pbxproj index dfdce64..f29cc19 100644 --- a/sdl2/iOS/xmil.xcodeproj/project.pbxproj +++ b/sdl2/iOS/xmil.xcodeproj/project.pbxproj @@ -121,6 +121,8 @@ BA6D169E193D5CC1006EC729 /* z80c_sb.c in Sources */ = {isa = PBXBuildFile; fileRef = BA6D160C193D5CC1006EC729 /* z80c_sb.c */; }; BA6D169F193D5CC1006EC729 /* z80dmap.c in Sources */ = {isa = PBXBuildFile; fileRef = BA6D160E193D5CC1006EC729 /* z80dmap.c */; }; BA6D16A0193D5CC1006EC729 /* z80mem.c in Sources */ = {isa = PBXBuildFile; fileRef = BA6D1610193D5CC1006EC729 /* z80mem.c */; }; + BAD1A2C71BE7565800B23E7C /* opm.c in Sources */ = {isa = PBXBuildFile; fileRef = BAD1A2C51BE7565800B23E7C /* opm.c */; }; + BAD1A2CA1BE7566400B23E7C /* psg.c in Sources */ = {isa = PBXBuildFile; fileRef = BAD1A2C81BE7566400B23E7C /* psg.c */; }; BAD9FBD9193F194700B3C0D5 /* Default-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = BAD9FBD7193F194700B3C0D5 /* Default-Landscape.png */; }; BAD9FBDA193F194700B3C0D5 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = BAD9FBD8193F194700B3C0D5 /* Icon-72.png */; }; FD779EDE0E26BA1200F39101 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD779EDD0E26BA1200F39101 /* CoreAudio.framework */; }; @@ -400,6 +402,10 @@ BA6D160F193D5CC1006EC729 /* z80dmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = z80dmap.h; sourceTree = ""; }; BA6D1610193D5CC1006EC729 /* z80mem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = z80mem.c; sourceTree = ""; }; BA6D1611193D5CC1006EC729 /* z80mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = z80mem.h; sourceTree = ""; }; + BAD1A2C51BE7565800B23E7C /* opm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opm.c; sourceTree = ""; }; + BAD1A2C61BE7565800B23E7C /* opm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opm.h; sourceTree = ""; }; + BAD1A2C81BE7566400B23E7C /* psg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = psg.c; sourceTree = ""; }; + BAD1A2C91BE7566400B23E7C /* psg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = psg.h; sourceTree = ""; }; BAD9FBD7193F194700B3C0D5 /* Default-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape.png"; sourceTree = ""; }; BAD9FBD8193F194700B3C0D5 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = ""; }; FD779EDD0E26BA1200F39101 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; @@ -806,9 +812,13 @@ BA6D15D6193D5CC1006EC729 /* sound */ = { isa = PBXGroup; children = ( + BAD1A2C51BE7565800B23E7C /* opm.c */, + BAD1A2C61BE7565800B23E7C /* opm.h */, BA6D15D7193D5CC1006EC729 /* opmgen.h */, BA6D15D8193D5CC1006EC729 /* opmgenc.c */, BA6D15D9193D5CC1006EC729 /* opmgeng.c */, + BAD1A2C81BE7566400B23E7C /* psg.c */, + BAD1A2C91BE7566400B23E7C /* psg.h */, BA6D15DA193D5CC1006EC729 /* psggen.h */, BA6D15DB193D5CC1006EC729 /* psggenc.c */, BA6D15DC193D5CC1006EC729 /* psggeng.c */, @@ -939,6 +949,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BAD1A2CA1BE7566400B23E7C /* psg.c in Sources */, BA6D1649193D5CC1006EC729 /* crtc.c in Sources */, BA6D1687193D5CC1006EC729 /* make24.c in Sources */, BA6D1685193D5CC1006EC729 /* timing.c in Sources */, @@ -972,6 +983,7 @@ BA6D1651193D5CC1006EC729 /* pcg.c in Sources */, BA6D161D193D5CC1006EC729 /* _memory.c in Sources */, BA6D1640193D5CC1006EC729 /* font.c in Sources */, + BAD1A2C71BE7565800B23E7C /* opm.c in Sources */, BA6D1656193D5CC1006EC729 /* vramio.c in Sources */, BA6D163A193D5CC1006EC729 /* fdd_2d.c in Sources */, BA6D163F193D5CC1006EC729 /* newdisk.c in Sources */, diff --git a/sdl2/win32/xmil.vcproj b/sdl2/win32/xmil.vcproj index 087d08d..04a5fbb 100644 --- a/sdl2/win32/xmil.vcproj +++ b/sdl2/win32/xmil.vcproj @@ -441,6 +441,10 @@ + + @@ -449,6 +453,10 @@ RelativePath="..\..\sound\opmgeng.c" > + + @@ -911,10 +919,18 @@ + + + + diff --git a/sound/opm.c b/sound/opm.c new file mode 100644 index 0000000..36eaf7e --- /dev/null +++ b/sound/opm.c @@ -0,0 +1,115 @@ +/** + * @file opm.c + * @brief Implementation of OPM + */ + +#include "compiler.h" +#include "opm.h" +#include "sound.h" +#include "x1f.h" + +static void writeRegister(POPM opm, REG8 nAddress, REG8 cData); + +/** + * Initialize instance + * @param[in] opm The instance + */ +void opm_construct(POPM opm) +{ + memset(opm, 0, sizeof(*opm)); +} + +/** + * Deinitialize instance + * @param[in] opm The instance + */ +void opm_destruct(POPM opm) +{ +} + +/** + * Reset + * @param[in] opm The instance + * @param[in] cCaps + */ +void opm_reset(POPM opm, REG8 cCaps) +{ + memset(&opm->s, 0, sizeof(opm->s)); + opm->s.cCaps = cCaps; + memset(&opm->s.reg[0x20], 0xff, 0xe0); + + opmgen_reset(&opm->opmgen); +} + +/** + * Restore + * @param[in] opm The instance + */ +void opm_restore(POPM opm) +{ + UINT i; + + // FM + for (i = 0; i < 0x100; i++) + { + if (i == 8) + { + continue; + } + writeRegister(opm, (REG8)i, opm->s.reg[i]); + } +} + +/** + * Bind + * @param[in] opm The instance + */ +void opm_bind(POPM opm) +{ + const UINT8 cCaps = opm->s.cCaps; + + opm_restore(opm); + + if (cCaps & OPM_HAS_OPM) + { + sound_streamregist(&opm->opmgen, (SOUNDCB)opmgen_getpcm); + } +} + +/** + * Writes register + * @param[in] opm The instance + * @param[in] nAddress The address + * @param[in] cData The data + */ +void opm_writeRegister(POPM opm, REG8 nAddress, REG8 cData) +{ + opm->s.reg[nAddress] = cData; + + if (opm->s.cCaps & OPM_X1F) + { + x1f_opm(nAddress, cData); + } + + writeRegister(opm, nAddress, cData); +} + +/** + * Writes register (Inner) + * @param[in] opm The instance + * @param[in] nAddress The address + * @param[in] cData The data + */ +static void writeRegister(POPM opm, REG8 nAddress, REG8 cData) +{ + const UINT8 cCaps = opm->s.cCaps; + + if (cCaps & OPM_HAS_OPM) + { + if ((nAddress < 0x20) && ((0x0b178102 & ((1 << nAddress))) == 0)) + { + return; + } + opmgen_setreg(&opm->opmgen, nAddress, cData); + } +} diff --git a/sound/opm.h b/sound/opm.h new file mode 100644 index 0000000..85c7868 --- /dev/null +++ b/sound/opm.h @@ -0,0 +1,57 @@ +/** + * @file opm.h + * @brief Interface of OPM + */ + +#pragma once + +#include "opmgen.h" + +/** + * Chips flags + */ +enum +{ + OPM_HAS_OPM = 0x01, /*!< Has OPM */ + OPM_X1F = 0x02, /*!< Supports S98 */ +}; + +/** + * @brief opm + */ +struct tagOpmState +{ + UINT8 addr; + UINT8 cCaps; + UINT8 reg[0x100]; +}; + +/** + * @brief opm + */ +struct tagOpm +{ + struct tagOpmState s; + INTPTR userdata; + _OPMGEN opmgen; +}; + +typedef struct tagOpm OPM; +typedef struct tagOpm* POPM; + +#ifdef __cplusplus +extern "C" +{ +#endif + +void opm_construct(POPM opm); +void opm_destruct(POPM opm); +void opm_reset(POPM opm, REG8 cCaps); +void opm_bind(POPM opm); +void opm_restore(POPM opm); + +void opm_writeRegister(POPM opm, REG8 nAddress, REG8 cData); + +#ifdef __cplusplus +} +#endif diff --git a/sound/opmgen.h b/sound/opmgen.h index 5f7b7f2..fe63ed3 100644 --- a/sound/opmgen.h +++ b/sound/opmgen.h @@ -1,3 +1,11 @@ +/** + * @file omngen.h + * @brief Interface of the OPM generator + */ + +#pragma once + +#include "sound.h" #define OPM_CLOCK 4000000L /* X1 & X68000 OPM 4MHz */ #define OPMCH_MAX 8 diff --git a/sound/opmgenc.c b/sound/opmgenc.c index 1f185d2..482580f 100644 --- a/sound/opmgenc.c +++ b/sound/opmgenc.c @@ -8,7 +8,6 @@ #ifndef PALMOS #include #endif -#include "sound.h" #include "opmgen.h" diff --git a/sound/opmgeng.c b/sound/opmgeng.c index 9193909..19c874f 100644 --- a/sound/opmgeng.c +++ b/sound/opmgeng.c @@ -4,7 +4,6 @@ */ #include "compiler.h" -#include "sound.h" #include "opmgen.h" extern OPMCFG opmcfg; diff --git a/sound/psg.c b/sound/psg.c new file mode 100644 index 0000000..b3578ea --- /dev/null +++ b/sound/psg.c @@ -0,0 +1,147 @@ +/** + * @file psg.c + * @brief Implementation of PSG + */ + +#include "compiler.h" +#include "psg.h" +#include "sound.h" +#include "x1f.h" + +static void writeRegister(PPSG psg, REG8 nAddress, REG8 cData); + +/** + * Initialize instance + * @param[in] psg The instance + */ +void psg_construct(PPSG psg) +{ + memset(psg, 0, sizeof(*psg)); +} + +/** + * Deinitialize instance + * @param[in] psg The instance + */ +void psg_destruct(PPSG psg) +{ +} + +/** + * Reset + * @param[in] psg The instance + * @param[in] cCaps + */ +void psg_reset(PPSG psg, REG8 cCaps) +{ + memset(&psg->s, 0, sizeof(psg->s)); + psg->s.cCaps = cCaps; + psg->s.reg[0x07] = 0xbf; + psg->s.reg[0x0e] = 0xff; + psg->s.reg[0x0f] = 0xff; + + psggen_reset(&psg->psg); +} + +/** + * Restore + * @param[in] psg The instance + */ +void psg_restore(PPSG psg) +{ + REG8 i; + + // PSG + for (i = 0; i < 14; i++) + { + writeRegister(psg, i, psg->s.reg[i]); + } +} + +/** + * Bind + * @param[in] psg The instance + */ +void psg_bind(PPSG psg) +{ + const UINT8 cCaps = psg->s.cCaps; + + psg_restore(psg); + + if (cCaps & PSG_HAS_PSG) + { + sound_streamregist(&psg->psg, (SOUNDCB)psggen_getpcm); + } +} + +/** + * Status + * @param[in] psg The instance + * @return Status + */ +REG8 psg_readStatus(PPSG psg) +{ + if (psg->s.cCaps & PSG_HAS_PSG) + { + return 0; + } + return 0xff; +} + +/** + * Writes register + * @param[in] psg The instance + * @param[in] nAddress The address + * @param[in] cData The data + */ +void psg_writeRegister(PPSG psg, REG8 nAddress, REG8 cData) +{ + if (nAddress >= 0x10) + { + return; + } + + psg->s.reg[nAddress] = cData; + if (psg->s.cCaps & PSG_X1F) + { + x1f_psg(nAddress, cData); + } + writeRegister(psg, nAddress, cData); +} + +/** + * Writes register (Inner) + * @param[in] psg The instance + * @param[in] nAddress The address + * @param[in] cData The data + */ +static void writeRegister(PPSG psg, REG8 nAddress, REG8 cData) +{ + const UINT8 cCaps = psg->s.cCaps; + + if (nAddress < 0x10) + { + if (cCaps & PSG_HAS_PSG) + { + psggen_setreg(&psg->psg, nAddress, cData); + } + } +} + +/** + * Reads register + * @param[in] psg The instance + * @param[in] nAddress The address + * @return data + */ +REG8 psg_readRegister(PPSG psg, REG8 nAddress) +{ + if (nAddress < 0x10) + { + if (psg->s.cCaps & PSG_HAS_PSG) + { + return psg->s.reg[nAddress]; + } + } + return 0xff; +} diff --git a/sound/psg.h b/sound/psg.h new file mode 100644 index 0000000..f8a5203 --- /dev/null +++ b/sound/psg.h @@ -0,0 +1,59 @@ +/** + * @file psg.h + * @brief Interface of PSG + */ + +#pragma once + +#include "psggen.h" + +/** + * Chips flags + */ +enum +{ + PSG_HAS_PSG = 0x01, /*!< Has PSG */ + PSG_X1F = 0x02, /*!< Supports S98 */ +}; + +/** + * @brief psg + */ +struct tagPsgState +{ + UINT8 addr; + UINT8 cCaps; + UINT8 reg[16]; +}; + +/** + * @brief psg + */ +struct tagPsg +{ + struct tagPsgState s; + INTPTR userdata; + _PSGGEN psg; +}; + +typedef struct tagPsg PSG; +typedef struct tagPsg* PPSG; + +#ifdef __cplusplus +extern "C" +{ +#endif + +void psg_construct(PPSG psg); +void psg_destruct(PPSG psg); +void psg_reset(PPSG psg, REG8 cCaps); +void psg_restore(PPSG psg); +void psg_bind(PPSG psg); + +REG8 psg_readStatus(PPSG psg); +REG8 psg_readRegister(PPSG psg, REG8 nAddress); +void psg_writeRegister(PPSG psg, REG8 nAddress, REG8 cData); + +#ifdef __cplusplus +} +#endif diff --git a/sound/psggen.h b/sound/psggen.h index 7825b9a..ae5e136 100644 --- a/sound/psggen.h +++ b/sound/psggen.h @@ -1,3 +1,11 @@ +/** + * @file psggen.h + * @brief Interface of the PSG generator + */ + +#pragma once + +#include "sound.h" enum { PSGFREQPADBIT = 12, @@ -78,4 +86,3 @@ void SOUNDCALL psggen_getpcm(PSGGEN psg, SINT32 *pcm, UINT count); #ifdef __cplusplus } #endif - diff --git a/sound/psggenc.c b/sound/psggenc.c index 7cecd5d..a471c4a 100644 --- a/sound/psggenc.c +++ b/sound/psggenc.c @@ -5,7 +5,6 @@ #include "compiler.h" #include -#include "sound.h" #include "psggen.h" PSGGENCFG psggencfg; diff --git a/sound/psggeng.c b/sound/psggeng.c index 312f4fc..8d4f757 100644 --- a/sound/psggeng.c +++ b/sound/psggeng.c @@ -4,7 +4,6 @@ */ #include "compiler.h" -#include "sound.h" #include "psggen.h" #include "parts.h" diff --git a/sound/sndctrl.c b/sound/sndctrl.c index e39d312..a2c8935 100644 --- a/sound/sndctrl.c +++ b/sound/sndctrl.c @@ -1,19 +1,22 @@ -#include "compiler.h" -#if !defined(DISABLE_SOUND) -#include "soundmng.h" -#include "pccore.h" -#include "sound.h" -#include "sndctrl.h" +/** + * @file sndctrl.c + * @brief Implementation of the sound + */ +#include "compiler.h" +#include "sndctrl.h" +#if !defined(DISABLE_SOUND) +#include "soundmng.h" +#include "pccore.h" +#include "sound.h" #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - _OPMGEN g_opmgen; + OPM g_opm; #endif - _PSGGEN psggen; - - -void sndctrl_initialize(void) { + PSG g_psg; +void sndctrl_initialize(void) +{ UINT rate; rate = xmilcfg.samplingrate; @@ -26,21 +29,13 @@ void sndctrl_initialize(void) { psggen_setvol(xmilcfg.vol_ssg); } -void sndctrl_deinitialize(void) { - +void sndctrl_deinitialize(void) +{ soundmng_stop(); sound_destroy(); } -void sndctrl_reset(void) { - -#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - opmgen_reset(&g_opmgen); - sound_streamregist(&g_opmgen, (SOUNDCB)opmgen_getpcm); -#endif - psggen_reset(&psggen); - sound_streamregist(&psggen, (SOUNDCB)psggen_getpcm); +void sndctrl_reset(void) +{ } - #endif - diff --git a/sound/sndctrl.h b/sound/sndctrl.h index 3a1e790..ad727f8 100644 --- a/sound/sndctrl.h +++ b/sound/sndctrl.h @@ -1,17 +1,24 @@ +/** + * @file sndctrl.h + * @brief Interface of the sound + */ -#include "opmgen.h" -#include "psggen.h" +#pragma once + +#include "opm.h" +#include "psg.h" #if !defined(DISABLE_SOUND) #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) -extern _OPMGEN g_opmgen; +extern OPM g_opm; #endif -extern _PSGGEN psggen; +extern PSG g_psg; void sndctrl_initialize(void); void sndctrl_deinitialize(void); diff --git a/sound/sound.h b/sound/sound.h index 86630d5..68f8149 100644 --- a/sound/sound.h +++ b/sound/sound.h @@ -1,3 +1,9 @@ +/** + * @file sound.h + * @brief Interface of the sound + */ + +#pragma once #ifndef SOUNDCALL #define SOUNDCALL diff --git a/sound/x1f.c b/sound/x1f.c index 1795b5c..5e8585e 100644 --- a/sound/x1f.c +++ b/sound/x1f.c @@ -61,9 +61,9 @@ BRESULT x1f_open(const OEMCHAR *filename) { return(FAILURE); } #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - CopyMemory(buf, sndboard.opmdat, 256); + memcpy(buf, g_opm.s.reg, 256); #else - ZeroMemory(buf, 256); + memset(buf, 0, 256); #endif CopyMemory(buf, "X1F", 4); file_write(fh, buf, 256); @@ -73,7 +73,7 @@ BRESULT x1f_open(const OEMCHAR *filename) { x1f.counter = 0; x1f.pos = 0; for (i=0; i<14; i++) { - x1f_psg((REG8)i, ((UINT8 *)&psggen.reg)[i]); + x1f_psg((REG8)i, g_psg.s.reg[i]); } return(SUCCESS); } diff --git a/statsave.c b/statsave.c index ea15250..3da0cc1 100644 --- a/statsave.c +++ b/statsave.c @@ -15,6 +15,7 @@ #include "palettes.h" #include "makescrn.h" #include "sound.h" +#include "sndctrl.h" #include "fddfile.h" #if defined(MACOS) diff --git a/statsave.tbl b/statsave.tbl index 00d0a4e..04c09e2 100644 --- a/statsave.tbl +++ b/statsave.tbl @@ -56,10 +56,13 @@ static const SFENTRY xmiltbl[] = { {"PCG", 0, STATFLAG_BIN, &pcg, sizeof(pcg)}, {"PPI", 0, STATFLAG_BIN, &ppi, sizeof(ppi)}, {"SIO", 0, STATFLAG_BIN, &sio, sizeof(sio)}, - {"SNDBOARD", 0, STATFLAG_BIN, &sndboard, sizeof(sndboard)}, {"SUBCPU", 0, STATFLAG_BIN, &subcpu.s, sizeof(subcpu.s)}, {"CALENDAR", 0, STATFLAG_BIN, &cal, sizeof(cal)}, {"NEVENT", 0, STATFLAG_EVT, &nevent, sizeof(nevent)}, {"DISK", 0, STATFLAG_DISK, NULL, 0}, +#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) + {"OPM", 0, STATFLAG_BIN, &g_opm.s, sizeof(g_opm.s)}, +#endif + {"PSG", 0, STATFLAG_BIN, &g_psg.s, sizeof(g_psg.s)}, {"TERMINATE", 0, STATFLAG_TERM, NULL, 0}}; diff --git a/win9x/ext/romeo/juliet.cpp b/win9x/ext/romeo/juliet.cpp deleted file mode 100644 index de0eb1c..0000000 --- a/win9x/ext/romeo/juliet.cpp +++ /dev/null @@ -1,604 +0,0 @@ -#include "compiler.h" - -#include "romeo.h" -#include "juliet.h" - - -enum { - ROMEO_AVAIL = 0x01, - ROMEO_YMF288 = 0x02, - ROMEO_YM2151 = 0x04 -}; - -typedef struct { - UINT8 op[8]; - UINT8 ttl[8*4]; -} YM2151FLAG; - -typedef struct { - UINT8 algo[8]; - UINT8 ttl[8*4]; - UINT8 psgmix; -} YMF288FLAG; - -typedef struct { - HMODULE mod; - - PCIFINDDEV finddev; - PCICFGREAD32 read32; - PCIMEMWR8 out8; - PCIMEMWR16 out16; - PCIMEMWR32 out32; - PCIMEMRD8 in8; - PCIMEMRD16 in16; - PCIMEMRD32 in32; - - ULONG addr; - ULONG irq; - ULONG avail; - ULONG snoopcount; - - YM2151FLAG ym2151; - YMF288FLAG ymf288; -} _ROMEO; - - -static const UINT8 opmask[] = {0x08,0x08,0x08,0x08,0x0c,0x0e,0x0e,0x0f}; - -typedef struct { -const char *symbol; - UINT addr; -} DLLPROCESS; - -static const char fnstr_finddev[] = FN_PCIFINDDEV; -static const char fnstr_read32[] = FN_PCICFGREAD32; -static const char fnstr_out8[] = FN_PCIMEMWR8; -static const char fnstr_out16[] = FN_PCIMEMWR16; -static const char fnstr_out32[] = FN_PCIMEMWR32; -static const char fnstr_inp8[] = FN_PCIMEMRD8; -static const char fnstr_inp16[] = FN_PCIMEMRD16; -static const char fnstr_inp32[] = FN_PCIMEMRD32; - -static const DLLPROCESS dllproc[] = { - {fnstr_finddev, offsetof(_ROMEO, finddev)}, - {fnstr_read32, offsetof(_ROMEO, read32)}, - {fnstr_out8, offsetof(_ROMEO, out8)}, - {fnstr_out16, offsetof(_ROMEO, out16)}, - {fnstr_out32, offsetof(_ROMEO, out32)}, - {fnstr_inp8, offsetof(_ROMEO, in8)}, - {fnstr_inp16, offsetof(_ROMEO, in16)}, - {fnstr_inp32, offsetof(_ROMEO, in32)}}; - - -static _ROMEO romeo; -static SINT8 YM2151vol = -12; - - -BOOL juliet_load(void) { - - int i; -const DLLPROCESS *dp; - BOOL r = SUCCESS; - - juliet_unload(); - - romeo.mod = LoadLibrary(OEMTEXT(PCIDEBUG_DLL)); - if (romeo.mod == NULL) { - return(FAILURE); - } - for (i=0, dp=dllproc; isymbol); - if (proc == NULL) { - r = FAILURE; - break; - } - *(DWORD *)(((UINT8 *)&romeo) + dp->addr) = (DWORD)proc; - } - if (r) { - juliet_unload(); - } - return(r); -} - -void juliet_unload(void) { - - if (romeo.mod) { - FreeLibrary(romeo.mod); - } - ZeroMemory(&romeo, sizeof(romeo)); - FillMemory(romeo.ym2151.ttl, 8*4, 0x7f); - FillMemory(romeo.ymf288.ttl, 8*4, 0x7f); - romeo.ymf288.psgmix = 0x3f; -} - - -// ---- - -// pciFindPciDevice使うと、OS起動後一発目に見つけられないことが多いので -// 自前で検索する(矢野さん方式) - -#define PCIBUSDEVFUNC(b, d, f) (((b) << 8) | ((d) << 3) | (f)) -#define DEVVEND(v, d) ((ULONG)((v) | ((d) << 16))) - -static ULONG searchRomeo(void) { - - UINT bus; - UINT dev; - UINT func; - ULONG addr; - ULONG dev_vend; - - for (bus=0; bus<0x100; bus++) { - for (dev=0; dev<0x20; dev++) { - for (func=0; func<0x08; func++) { - addr = PCIBUSDEVFUNC(bus, dev, func); - dev_vend = romeo.read32(addr, 0x0000); - if ((dev_vend == DEVVEND(ROMEO_VENDORID, ROMEO_DEVICEID)) || - (dev_vend == DEVVEND(ROMEO_VENDORID, ROMEO_DEVICEID2))) { - return(addr); - } - } - } - } - return((ULONG)-1); -} - -BRESULT juliet_prepare(void) { - - ULONG pciaddr; - - if (romeo.mod == NULL) { - return(FAILURE); - } - - pciaddr = searchRomeo(); - if (pciaddr != (ULONG)-1) { - romeo.addr = romeo.read32(pciaddr, ROMEO_BASEADDRESS1); - romeo.irq = romeo.read32(pciaddr, ROMEO_PCIINTERRUPT) & 0xff; - if (romeo.addr) { - romeo.avail = ROMEO_AVAIL | ROMEO_YMF288; - juliet_YM2151Reset(); - juliet_YMF288Reset(); - } - return(SUCCESS); - } - return(FAILURE); -} - - -// ---- YM2151部 - -static void YM2151W(UINT8 addr, UINT8 data) { - - // 書き込み直後だと、ROMEOチップでの遅延のため、まだ書き込みが起こっていない(=Busyが - // 立っていない)可能性がある。ので、Snoopカウンタで書き込み発生を見張る - while ( romeo.snoopcount==romeo.in32(romeo.addr + ROMEO_SNOOPCTRL) ) Sleep(0); - romeo.snoopcount = romeo.in32(romeo.addr + ROMEO_SNOOPCTRL); - - // カウンタ増えた時点ではまだBusyの可能性があるので、OPMのBusyも見張る - while ( romeo.in8(romeo.addr + ROMEO_YM2151DATA)&0x80 ) Sleep(0); - - romeo.out8(romeo.addr + ROMEO_YM2151ADDR, addr); - romeo.in8(romeo.addr + ROMEO_YM2151DATA); - romeo.out8(romeo.addr + ROMEO_YM2151DATA, data); -} - -static void YM2151setvolume(UINT8 ch, int vol) { - - UINT8 mask; - int ttl; - - ch &= 7; - mask = romeo.ym2151.op[ch]; - do { - if (mask & 1) { - ttl = romeo.ym2151.ttl[ch] & 0x7f; - ttl -= vol; - if (ttl < 0) { - ttl = 0; - } - else if (ttl > 0x7f) { - ttl = 0x7f; - } - YM2151W(ch + 0x60, (UINT8)ttl); - } - ch += 0x08; - mask >>= 1; - } while(mask); -} - - -// リセットと同時に、OPMチップの有無も確認 -void juliet_YM2151Reset(void) { - - BYTE flag; - - if (romeo.avail & ROMEO_AVAIL) { - juliet_YM2151Enable(FALSE); - romeo.out32(romeo.addr + ROMEO_YM2151CTRL, 0x00); - Sleep(10); // 44.1kHz x 192 clk = 4.35ms 以上ないと、DACのリセットかからない - flag = romeo.in8(romeo.addr + ROMEO_YM2151DATA) + 1; - romeo.out32(romeo.addr + ROMEO_YM2151CTRL, 0x80); - Sleep(10); // リセット解除後、一応安定するまでちょっと待つ - flag |= romeo.in8(romeo.addr + ROMEO_YM2151DATA); - if ( !flag ) { // flag!=0 だと OPM チップがない - romeo.avail |= ROMEO_YM2151; - // Busy検出用にSnoopカウンタを使う - romeo.out32(romeo.addr + ROMEO_SNOOPCTRL, (unsigned int)0x80000000); - romeo.snoopcount = 0xffffffff; - } - } -} - -BOOL juliet_YM2151IsEnable(void) { - - return((romeo.avail & ROMEO_YM2151) != 0); -} - -BOOL juliet_YM2151IsBusy(void) { - - BOOL ret; - - ret = FALSE; - if (romeo.avail & ROMEO_YM2151) { - if ((romeo.snoopcount == romeo.in32(romeo.addr + ROMEO_SNOOPCTRL)) || - (romeo.in8(romeo.addr + ROMEO_YM2151DATA) & 0x80)) { - ret = TRUE; - } - } - return(ret); -} - -void juliet_YM2151W(UINT8 addr, UINT8 data) { - - UINT ch; - int ttl; - UINT8 mask; - - if (romeo.avail & ROMEO_YM2151) { - if ((addr & 0xe0) == 0x60) { // ttl - romeo.ym2151.ttl[addr & 0x1f] = data; - if (romeo.ym2151.op[addr & 7] & (1 << ((addr >> 3) & 3))) { - ttl = (data & 0x7f) - YM2151vol; - if (ttl < 0) { - ttl = 0; - } - else if (ttl > 0x7f) { - ttl = 0x7f; - } - data = (UINT8)ttl; - } - } - else if ((addr & 0xf8) == 0x20) { // algorithm - ch = addr & 7; - mask = opmask[data & 7]; - if (romeo.ym2151.op[ch] != mask) { - romeo.ym2151.op[ch] = mask; - YM2151setvolume((UINT8)ch, YM2151vol); - } - } - YM2151W(addr, data); - } -} - -void juliet_YM2151Enable(BOOL enable) { - - UINT8 ch; - int vol; - - if (romeo.avail & ROMEO_YM2151) { - vol = (enable)?YM2151vol:-127; - for (ch=0; ch<8; ch++) { - YM2151setvolume(ch, vol); - } - } -} - - -// ---- YMF288部 - -static void YMF288W(UINT8 a1, UINT8 addr, UINT8 data) { - - while(romeo.in8(romeo.addr + ROMEO_YMF288ADDR1) & 0x80) { - Sleep(0); - } - romeo.out8(romeo.addr + (a1?ROMEO_YMF288ADDR2:ROMEO_YMF288ADDR1), addr); - while(romeo.in8(romeo.addr + ROMEO_YMF288ADDR1) & 0x80) { - Sleep(0); - } - romeo.out8(romeo.addr + (a1?ROMEO_YMF288DATA2:ROMEO_YMF288DATA1), data); -} - -static void YMF288setvolume(UINT ch, int vol) { - - UINT8 a1; - UINT8 mask; -const UINT8 *pttl; - int ttl; - - a1 = ch & 4; - mask = opmask[romeo.ymf288.algo[ch & 7] & 7]; - pttl = romeo.ymf288.ttl + ((ch & 4) << 2); - ch = 0x40 + (ch & 3); - do { - if (mask & 1) { - ttl = pttl[ch & 0x0f] & 0x7f; - ttl -= vol; - if (ttl < 0) { - ttl = 0; - } - else if (ttl > 0x7f) { - ttl = 0x7f; - } - YMF288W(a1, ch, (UINT8)ttl); - } - ch += 0x04; - mask >>= 1; - } while(mask); -} - - -void juliet_YMF288Reset(void) { - - if (romeo.avail & ROMEO_YMF288) { - juliet_YMF288Enable(FALSE); - romeo.out32(romeo.addr + ROMEO_YMF288CTRL, 0x00); - Sleep(150); - romeo.out32(romeo.addr + ROMEO_YMF288CTRL, 0x80); - Sleep(150); - } -} - -BOOL juliet_YMF288IsEnable(void) { - - return((romeo.avail & ROMEO_YMF288) != 0); -} - -BOOL juliet_YMF288IsBusy(void) { - - return((!(romeo.avail & ROMEO_YMF288)) || - ((romeo.in8(romeo.addr + ROMEO_YMF288ADDR1) & 0x80) != 0)); -} - -void juliet_YMF288A(UINT8 addr, UINT8 data) { - - if (romeo.avail & ROMEO_YMF288) { - if (addr == 0x07) { // psg mix - romeo.ymf288.psgmix = data; - } - else if ((addr & 0xf0) == 0x40) { // ttl - romeo.ymf288.ttl[addr & 0x0f] = data; - } - else if ((addr & 0xfc) == 0xb0) { // algorithm - romeo.ymf288.algo[addr & 3] = data; - } - YMF288W(0, addr, data); - } -} - -void juliet_YMF288B(UINT8 addr, UINT8 data) { - - if (romeo.avail & ROMEO_YMF288) { - if ((addr & 0xf0) == 0x40) { // ttl - romeo.ymf288.ttl[0x10 + (addr & 0x0f)] = data; - } - else if ((addr & 0xfc) == 0xb0) { // algorithm - romeo.ymf288.algo[4 + (addr & 3)] = data; - } - YMF288W(1, addr, data); - } -} - -void juliet_YMF288Enable(BOOL enable) { - - UINT8 ch; - int vol; - - if (romeo.avail & ROMEO_YMF288) { - YMF288W(0, 0x07, (enable)?romeo.ymf288.psgmix:0x3f); - vol = (enable)?0:-127; - for (ch=0; ch<3; ch++) { - YMF288setvolume(ch + 0, vol); - YMF288setvolume(ch + 4, vol); - } - } -} - - -#if 0 -// ---- delay... - -#define FM_BUFBIT 10 -#define FM_BUFFERS (1 << FM_BUFBIT) - -typedef struct { - DWORD clock; - DWORD data; -} FMRINGDATA; - -typedef struct { - DWORD base; - DWORD pos; - DWORD avail; - DWORD maxclock; - FMRINGDATA datas[FM_BUFFERS]; -} FMRING; - -static FMRING fmr; -#ifdef __cplusplus -extern "C" { -#endif - DWORD basedclk = 0; -#ifdef __cplusplus -} -#endif - -static void (*sendfmfn[3])(BYTE addr, BYTE data) = - {juliet_YM2151W, juliet_YMF288A, juliet_YMF288B}; - -LABEL static void fmr_release(void) { - - __asm { - dec fmr.avail - mov edx, fmr.pos - mov eax, fmr.datas.data[edx * 8] - inc edx - and edx, (FM_BUFFERS - 1); - mov fmr.pos, edx - push eax - shr eax, 8 - push eax - shr eax, 8 - call sendfmfn[eax*4] - add esp, 8 - ret - } -} - -LABEL static void fmr_send(DWORD clock, DWORD data) { - - __asm { - mov ecx, fmr.avail - cmp ecx, FM_BUFFERS - jne short fmdatasend - call fmr_release - dec ecx -fmdatasend: add ecx, fmr.pos - and ecx, (FM_BUFFERS - 1); - mov eax, fmr.base - add eax, [esp + 4] - mov fmr.datas.clock[ecx * 8], eax - mov eax, [esp + 8] - mov fmr.datas.data[ecx * 8], eax - inc fmr.avail - ret - } -} - -#define _CPUID __asm _emit 00fh __asm _emit 0a2h -#define _RDTSC __asm _emit 00fh __asm _emit 031h -#define RDTSC_SFT 6 - -LABEL void juliet2_reset(void) { - - __asm { - push ebx - push esi - push edi - mov ecx, (type fmr) / 4 - xor eax, eax - mov edi, offset fmr - rep stosd - - pushfd - pop edx - mov edi, edx - xor edx, 00200000h - push edx - popfd - pushfd - pop edx - cmp edi, edx - je short jul2reset_exit - inc eax - _CPUID - xor eax, eax - test edx, 10h - je short jul2reset_exit - - push 100 - mov edi, dword ptr Sleep - _CPUID - _RDTSC - mov esi, edx - xchg edi, eax - call eax - _CPUID - _RDTSC - sub eax, edi - sbb edx, esi - shrd eax, edx, RDTSC_SFT - mov fmr.maxclock, eax - -jul2reset_exit: xor eax, eax - mov basedclk, eax - pop edi - pop esi - pop ebx - ret - } -} - -LABEL void juliet2_sync(DWORD delaytick) { - - __asm { - _RDTSC - shrd eax, edx, RDTSC_SFT - mov fmr.base, eax - - mov eax, [esp+4] - mul basedclk - mov ecx, 100 - div ecx - add fmr.base, eax - ret - } -} - -LABEL void juliet2_exec(void) { - - __asm { - cmp fmr.avail, 0 - je jul2exe_exit -jul2exe: _RDTSC - shrd eax, edx, RDTSC_SFT - neg eax - mov edx, fmr.pos - add eax, fmr.datas[edx * 8].clock - cmp eax, fmr.maxclock - jb jul2exe_exit - call fmr_release - cmp fmr.avail, 0 - jne short jul2exe -jul2exe_exit: ret - } -} - -void juliet2_YM2151W(BYTE addr, BYTE data, DWORD clock) { - - if (romeo.avail & ROMEO_YM2151) { - if (basedclk) { - fmr_send(clock, (addr << 8) | data); - } - else { - juliet_YM2151W(addr, data); - } - } -} - -void juliet2_YMF288A(BYTE addr, BYTE data, DWORD clock) { - - if (romeo.avail & ROMEO_YMF288) { - if (basedclk) { - fmr_send(clock, 0x10000 | (addr << 8) | data); - } - else { - juliet_YMF288A(addr, data); - } - } -} - -void juliet2_YMF288B(BYTE addr, BYTE data, DWORD clock) { - - if (romeo.avail & ROMEO_YMF288) { - if (basedclk) { - fmr_send(clock, 0x20000 | (addr << 8) | data); - } - else { - juliet_YMF288B(addr, data); - } - } -} -#endif - diff --git a/win9x/ext/romeo/juliet.h b/win9x/ext/romeo/juliet.h deleted file mode 100644 index 9f836f5..0000000 --- a/win9x/ext/romeo/juliet.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifdef __cplusplus -extern "C" { -#endif - -BOOL juliet_load(void); -void juliet_unload(void); - -BRESULT juliet_prepare(void); - -void juliet_YM2151Reset(void); -BOOL juliet_YM2151IsEnable(void); -BOOL juliet_YM2151IsBusy(void); -void juliet_YM2151W(UINT8 addr, UINT8 data); -void juliet_YM2151Enable(BOOL enable); - -void juliet_YMF288Reset(void); -BOOL juliet_YMF288IsEnable(void); -BOOL juliet_YMF288IsBusy(void); -void juliet_YMF288A(UINT8 addr, UINT8 data); -void juliet_YMF288B(UINT8 addr, UINT8 data); -void juliet_YMF288Enable(BOOL enable); - - -void juliet2_reset(void); -void juliet2_sync(DWORD delayclock); -void juliet2_exec(void); -void juliet2_YM2151W(BYTE addr, BYTE data, DWORD clock); -void juliet2_YMF288A(BYTE addr, BYTE data, DWORD clock); -void juliet2_YMF288B(BYTE addr, BYTE data, DWORD clock); - -#ifdef __cplusplus -} -#endif diff --git a/win9x/ext/romeo/romeo.h b/win9x/ext/romeo/romeo.h deleted file mode 100644 index 0b306ce..0000000 --- a/win9x/ext/romeo/romeo.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef _ROMEO_ROMEO_H -#define _ROMEO_ROMEO_H - -#define ROMEO_VENDORID 0x6809 -#define ROMEO_DEVICEID 0x2151 -#define ROMEO_DEVICEID2 0x8121 /* for Developer version */ - -enum { - PCIERR_SUCCESS = 0x00, - PCIERR_INVALIDCLASS = 0x83, - PCIERR_DEVNOTFOUND = 0x86 -}; - -enum { - ROMEO_DEVICE_VENDOR = 0x00, - ROMEO_STATUS_COMMAND = 0x04, - ROMEO_CLASS_REVISON = 0x08, - ROMEO_HEADTYPE = 0x0c, - ROMEO_BASEADDRESS0 = 0x10, - ROMEO_BASEADDRESS1 = 0x14, - ROMEO_SUB_DEVICE_VENDOR = 0x2c, - ROMEO_PCIINTERRUPT = 0x3c -}; - -enum { - ROMEO_YM2151ADDR = 0x0000, - ROMEO_YM2151DATA = 0x0004, - ROMEO_SNOOPCTRL = 0x0010, - ROMEO_CMDQUEUE = 0x0018, - ROMEO_YM2151CTRL = 0x001c, - ROMEO_YMF288ADDR1 = 0x0100, - ROMEO_YMF288DATA1 = 0x0104, - ROMEO_YMF288ADDR2 = 0x0108, - ROMEO_YMF288DATA2 = 0x010c, - ROMEO_YMF288CTRL = 0x011c -}; - - -#define PCIDEBUG_DLL "pcidebug.dll" - -typedef ULONG (WINAPI *PCIFINDDEV)(ULONG ven, ULONG dev, ULONG index); -typedef ULONG (WINAPI *PCICFGREAD32)(ULONG pciaddr, ULONG regaddr); -typedef void (WINAPI *PCIMEMWR8)(ULONG addr, UCHAR param); -typedef void (WINAPI *PCIMEMWR16)(ULONG addr, USHORT param); -typedef void (WINAPI *PCIMEMWR32)(ULONG addr, ULONG param); -typedef UCHAR (WINAPI *PCIMEMRD8)(ULONG addr); -typedef USHORT (WINAPI *PCIMEMRD16)(ULONG addr); -typedef ULONG (WINAPI *PCIMEMRD32)(ULONG addr); - -#define FN_PCIFINDDEV "_pciFindPciDevice" -#define FN_PCICFGREAD32 "_pciConfigReadLong" -#define FN_PCIMEMWR8 "_MemWriteChar" -#define FN_PCIMEMWR16 "_MemWriteShort" -#define FN_PCIMEMWR32 "_MemWriteLong" -#define FN_PCIMEMRD8 "_MemReadChar" -#define FN_PCIMEMRD16 "_MemReadShort" -#define FN_PCIMEMRD32 "_MemReadLong" - -#endif /* _ROMEO_ROMEO_H */ diff --git a/win9x/ext/sndboard.cpp b/win9x/ext/sndboard.cpp deleted file mode 100644 index f969ef4..0000000 --- a/win9x/ext/sndboard.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include "compiler.h" -#include "joymng.h" -#include "pccore.h" -#include "iocore.h" -#include "keystat.h" -#include "sound.h" -#include "sndctrl.h" -#include "x1f.h" -#include "romeo\juliet.h" - -static BOOL romeo_exist; - -static const UINT8 psggen_deftbl[0x10] = - {0, 0, 0, 0, 0, 0, 0, 0xbf, 0, 0, 0, 0, 0, 0, 0xff, 0xff}; - -#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) -void IOOUTCALL opm_o(UINT port, REG8 dat) { - - REG8 lsb; - REG8 reg; - - lsb = (UINT8)port; - if (lsb == 0x00) { /* 0700 */ - sndboard.opmreg = (UINT8)dat; - } - else if (lsb == 0x01) { /* 0701 */ - reg = sndboard.opmreg; - sndboard.opmdat[reg] = dat; - x1f_opm(reg, dat); -#if !defined(DISABLE_SOUND) - if (romeo_exist) { - juliet_YM2151W(reg, dat); - } - else { - opmgen_setreg(&g_opmgen, reg, dat); - } -#endif - } - else if ((lsb & (~3)) == 0x04) { /* 0704-0707 */ - ctc_o(port, dat); - } -} - -REG8 IOINPCALL opm_i(UINT port) { - - REG8 lsb; - - lsb = (UINT8)port; - if ((lsb & (~1)) == 0x00) { /* 0700/0701 */ - return(0x00); /* ゼリアード */ - } - else if ((lsb & (~3)) == 0x04) { /* 0704-0707 */ - return(ctc_i(port)); - } - else { - return(0xff); - } -} -#endif - - -void IOOUTCALL sndboard_psgreg(UINT port, REG8 dat) { - - sndboard.psgreg = dat; - (void)port; -} - -void IOOUTCALL sndboard_psgdat(UINT port, REG8 dat) { - - REG8 reg; - - reg = sndboard.psgreg; - if (reg < 0x0e) { - sndboard.psgdat[reg] = dat; - x1f_psg(reg, dat); -#if !defined(DISABLE_SOUND) - if (romeo_exist) { - juliet_YMF288A(reg, dat); - } - else { - psggen_setreg(&psggen, reg, dat); - } -#endif - } - (void)port; -} - -REG8 IOINPCALL sndboard_psgsta(UINT port) { - - REG8 ret; - - if (sndboard.psgreg < 0x0e) { - return(sndboard.psgdat[sndboard.psgreg]); - } - else if (sndboard.psgreg < 0x10) { - ret = 0xff; - if (sndboard.psgreg == (xmilcfg.KEY_MODE + 0x0d)) { - ret &= keystat_getjoy(); - } - if (sndboard.psgreg == 0x0e) { - ret &= joymng_getstat(); - } - if (xmilcfg.BTN_RAPID) { - sndboard.rapids ^= 0x60; - ret |= sndboard.rapids; - } - if (xmilcfg.BTN_MODE) { - ret = (ret & (~0x60)) | ((ret & 0x40) >> 1) | ((ret & 0x20) << 1); - } - return(ret); - } - else { - (void)port; - return(0xff); - } -} - - -/* reset */ - -#if !defined(DISABLE_SOUND) -void sndboard_update(void) { - - UINT i; - - if (romeo_exist) { - for (i=0; i<14; i++) { - juliet_YMF288A((REG8)i, sndboard.psgdat[i]); - } -#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - for (i=0x20; i<0x100; i++) { - juliet_YM2151W((REG8)i, sndboard.opmdat[i]); - } -#endif - } - else { - for (i=0; i<14; i++) { - psggen_setreg(&psggen, (REG8)i, sndboard.psgdat[i]); - } -#if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM) - for (i=0x20; i<0x100; i++) { - opmgen_setreg(&g_opmgen, (REG8)i, sndboard.opmdat[i]); - } -#endif - } -} -#endif - -void sndboard_reset(void) { - - ZeroMemory(&sndboard, sizeof(sndboard)); - CopyMemory(sndboard.psgdat, psggen_deftbl, sizeof(psggen_deftbl)); - romeo_exist = juliet_YM2151IsEnable(); - if (romeo_exist) { - juliet_YM2151Reset(); - juliet_YMF288Reset(); - } - else { - sndctrl_reset(); - } -} - diff --git a/win9x/xmil.cpp b/win9x/xmil.cpp index 0841dbc..ad1bb70 100644 --- a/win9x/xmil.cpp +++ b/win9x/xmil.cpp @@ -13,7 +13,6 @@ #include "winkbd.h" #include "menu.h" #include "ini.h" -#include "ext\romeo\juliet.h" #include "dialog.h" #include "extclass.h" #include "misc\wndloc.h" @@ -898,9 +897,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, } } - juliet_load(); - juliet_prepare(); -// juliet2_reset(); if (soundmng_initialize() == SUCCESS) { #if !defined(DISABLE_SOUND) soundmng_pcmload(SOUND_PCMSEEK, OEMTEXT("fddseek.wav"), 0); @@ -1014,10 +1010,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, soundmng_deinitialize(); - juliet_YM2151Reset(); - juliet_YMF288Reset(); - juliet_unload(); - scrnmng_destroy(); if (sys_updates & (SYS_UPDATECFG | SYS_UPDATEOSCFG)) { diff --git a/win9x/xmil.dsp b/win9x/xmil.dsp index 21b1234..68d62d0 100644 --- a/win9x/xmil.dsp +++ b/win9x/xmil.dsp @@ -636,7 +636,7 @@ SOURCE=..\IO\SIO.C # End Source File # Begin Source File -SOURCE=.\ext\sndboard.cpp +SOURCE=..\IO\SNDBOARD.C # End Source File # Begin Source File @@ -712,6 +712,14 @@ SOURCE=..\VRAM\VRAM.C # PROP Default_Filter "" # Begin Source File +SOURCE=..\sound\opm.c +# End Source File +# Begin Source File + +SOURCE=..\sound\opm.h +# End Source File +# Begin Source File + SOURCE=..\sound\opmgen.h # End Source File # Begin Source File @@ -775,6 +783,14 @@ InputName=opmgeng # End Source File # Begin Source File +SOURCE=..\sound\psg.c +# End Source File +# Begin Source File + +SOURCE=..\sound\psg.h +# End Source File +# Begin Source File + SOURCE=..\sound\psggen.h # End Source File # Begin Source File @@ -888,22 +904,6 @@ SOURCE=.\DIALOG\EXTCLASS.CPP # Begin Group "ext" # PROP Default_Filter "" -# Begin Group "romeo" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\ext\romeo\juliet.cpp -# End Source File -# Begin Source File - -SOURCE=.\ext\romeo\juliet.h -# End Source File -# Begin Source File - -SOURCE=.\ext\romeo\romeo.h -# End Source File -# End Group # End Group # Begin Group "misc"